func()

in x-pack/filebeat/input/awss3/config.go [69:161]


func (c *config) Validate() error {
	configs := []bool{c.QueueURL != "", c.BucketARN != "", c.AccessPointARN != "", c.NonAWSBucketName != ""}
	enabled := []bool{}
	for i := range configs {
		if configs[i] {
			enabled = append(enabled, configs[i])
		}
	}
	if len(enabled) == 0 {
		return errors.New("neither queue_url, bucket_arn, access_point_arn, nor non_aws_bucket_name were provided")
	} else if len(enabled) > 1 {
		return fmt.Errorf("queue_url <%v>, bucket_arn <%v>, access_point_arn <%v>, non_aws_bucket_name <%v> "+
			"cannot be set at the same time", c.QueueURL, c.BucketARN, c.AccessPointARN, c.NonAWSBucketName)
	}

	if (c.BucketARN != "" || c.AccessPointARN != "" || c.NonAWSBucketName != "") && c.BucketListInterval <= 0 {
		return fmt.Errorf("bucket_list_interval <%v> must be greater than 0", c.BucketListInterval)
	}

	if (c.BucketARN != "" || c.AccessPointARN != "" || c.NonAWSBucketName != "") && c.NumberOfWorkers <= 0 {
		return fmt.Errorf("number_of_workers <%v> must be greater than 0", c.NumberOfWorkers)
	}

	if c.AccessPointARN != "" && !isValidAccessPointARN(c.AccessPointARN) {
		return fmt.Errorf("invalid format for access_point_arn <%v>", c.AccessPointARN)
	}

	if c.QueueURL != "" && (c.VisibilityTimeout <= 0 || c.VisibilityTimeout.Hours() > 12) {
		return fmt.Errorf("visibility_timeout <%v> must be greater than 0 and "+
			"less than or equal to 12h", c.VisibilityTimeout)
	}

	if c.QueueURL != "" && (c.SQSWaitTime <= 0 || c.SQSWaitTime.Seconds() > 20) {
		return fmt.Errorf("wait_time <%v> must be greater than 0 and "+
			"less than or equal to 20s", c.SQSWaitTime)
	}

	if c.QueueURL != "" && c.SQSGraceTime < 0 {
		return fmt.Errorf("shutdown_grace_time <%v> must not be negative", c.SQSGraceTime)
	}

	if c.QueueURL != "" && c.APITimeout < c.SQSWaitTime {
		return fmt.Errorf("api_timeout <%v> must be greater than the sqs.wait_time <%v",
			c.APITimeout, c.SQSWaitTime)
	}

	if c.AWSConfig.FIPSEnabled && c.NonAWSBucketName != "" {
		return errors.New("fips_enabled cannot be used with a non-AWS S3 bucket")
	}
	if c.PathStyle && c.NonAWSBucketName == "" && c.QueueURL == "" {
		return errors.New("path_style can only be used when polling non-AWS S3 services or SQS/SNS QueueURL")
	}
	if c.ProviderOverride != "" && c.NonAWSBucketName == "" {
		return errors.New("provider can only be overridden when polling non-AWS S3 services")
	}
	if c.AWSConfig.Endpoint != "" {
		// Make sure the given endpoint can be parsed
		_, err := url.Parse(c.AWSConfig.Endpoint)
		if err != nil {
			return fmt.Errorf("failed to parse endpoint: %w", err)
		}
	}
	if c.BackupConfig.NonAWSBackupToBucketName != "" && c.NonAWSBucketName == "" {
		return errors.New("backup to non-AWS bucket can only be used for non-AWS sources")
	}
	if c.BackupConfig.BackupToBucketArn != "" && c.BucketARN == "" && c.AccessPointARN == "" {
		return errors.New("backup to AWS bucket can only be used for AWS sources")
	}
	if c.BackupConfig.BackupToBucketArn != "" && c.BackupConfig.NonAWSBackupToBucketName != "" {
		return errors.New("backup_to_bucket_arn and non_aws_backup_to_bucket_name cannot be used together")
	}
	if c.BackupConfig.GetBucketName() != "" && c.QueueURL == "" {
		if (c.BackupConfig.BackupToBucketArn != "" &&
			(c.BackupConfig.BackupToBucketArn == c.BucketARN || c.BackupConfig.BackupToBucketArn == c.AccessPointARN)) ||
			(c.BackupConfig.NonAWSBackupToBucketName != "" && c.BackupConfig.NonAWSBackupToBucketName == c.NonAWSBucketName) {
			if c.BackupConfig.BackupToBucketPrefix == "" {
				return errors.New("backup_to_bucket_prefix is a required property when source and backup bucket are the same")
			}
			if c.BackupConfig.BackupToBucketPrefix == c.BucketListPrefix {
				return errors.New("backup_to_bucket_prefix cannot be the same as bucket_list_prefix, this will create an infinite loop")
			}
		}
	}

	if c.StartTimestamp != "" {
		_, err := time.Parse(time.RFC3339, c.StartTimestamp)
		if err != nil {
			return fmt.Errorf("invalid input for start_timestamp: %w", err)
		}
	}

	return nil
}