mirror of https://github.com/minio/minio.git
				
				
				
			
		
			
	
	
		
			184 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Go
		
	
	
	
		
		
			
		
	
	
			184 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Go
		
	
	
	
|  | // Copyright (c) 2015-2023 MinIO, Inc.
 | ||
|  | //
 | ||
|  | // This file is part of MinIO Object Storage stack
 | ||
|  | //
 | ||
|  | // This program is free software: you can redistribute it and/or modify
 | ||
|  | // it under the terms of the GNU Affero General Public License as published by
 | ||
|  | // the Free Software Foundation, either version 3 of the License, or
 | ||
|  | // (at your option) any later version.
 | ||
|  | //
 | ||
|  | // This program is distributed in the hope that it will be useful
 | ||
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | ||
|  | // GNU Affero General Public License for more details.
 | ||
|  | //
 | ||
|  | // You should have received a copy of the GNU Affero General Public License
 | ||
|  | // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||
|  | 
 | ||
|  | package cmd | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"time" | ||
|  | 
 | ||
|  | 	miniogo "github.com/minio/minio-go/v7" | ||
|  | 
 | ||
|  | 	"github.com/minio/minio/internal/auth" | ||
|  | ) | ||
|  | 
 | ||
|  | //go:generate msgp -file $GOFILE
 | ||
|  | 
 | ||
|  | // replicate:
 | ||
|  | //   # source of the objects to be replicated
 | ||
|  | //   source:
 | ||
|  | //     type: "minio"
 | ||
|  | //     bucket: "testbucket"
 | ||
|  | //     prefix: "spark/"
 | ||
|  | //
 | ||
|  | //   # optional flags based filtering criteria
 | ||
|  | //   # for source objects
 | ||
|  | //   flags:
 | ||
|  | //     filter:
 | ||
|  | //       newerThan: "7d"
 | ||
|  | //       olderThan: "7d"
 | ||
|  | //       createdAfter: "date"
 | ||
|  | //       createdBefore: "date"
 | ||
|  | //       tags:
 | ||
|  | //         - key: "name"
 | ||
|  | //           value: "value*"
 | ||
|  | //       metadata:
 | ||
|  | //         - key: "content-type"
 | ||
|  | //           value: "image/*"
 | ||
|  | //     notify:
 | ||
|  | //       endpoint: "https://splunk-hec.dev.com"
 | ||
|  | //       token: "Splunk ..." # e.g. "Bearer token"
 | ||
|  | //
 | ||
|  | //   # target where the objects must be replicated
 | ||
|  | //   target:
 | ||
|  | //     type: "minio"
 | ||
|  | //     bucket: "testbucket1"
 | ||
|  | //     endpoint: "https://play.min.io"
 | ||
|  | //     path: "on"
 | ||
|  | //     credentials:
 | ||
|  | //       accessKey: "minioadmin"
 | ||
|  | //       secretKey: "minioadmin"
 | ||
|  | //       sessionToken: ""
 | ||
|  | 
 | ||
|  | // BatchReplicateFilter holds all the filters currently supported for batch replication
 | ||
|  | type BatchReplicateFilter struct { | ||
|  | 	NewerThan     time.Duration `yaml:"newerThan,omitempty" json:"newerThan"` | ||
|  | 	OlderThan     time.Duration `yaml:"olderThan,omitempty" json:"olderThan"` | ||
|  | 	CreatedAfter  time.Time     `yaml:"createdAfter,omitempty" json:"createdAfter"` | ||
|  | 	CreatedBefore time.Time     `yaml:"createdBefore,omitempty" json:"createdBefore"` | ||
|  | 	Tags          []BatchJobKV  `yaml:"tags,omitempty" json:"tags"` | ||
|  | 	Metadata      []BatchJobKV  `yaml:"metadata,omitempty" json:"metadata"` | ||
|  | } | ||
|  | 
 | ||
|  | // BatchJobReplicateFlags various configurations for replication job definition currently includes
 | ||
|  | // - filter
 | ||
|  | // - notify
 | ||
|  | // - retry
 | ||
|  | type BatchJobReplicateFlags struct { | ||
|  | 	Filter BatchReplicateFilter `yaml:"filter" json:"filter"` | ||
|  | 	Notify BatchJobNotification `yaml:"notify" json:"notify"` | ||
|  | 	Retry  BatchJobRetry        `yaml:"retry" json:"retry"` | ||
|  | } | ||
|  | 
 | ||
|  | // BatchJobReplicateResourceType defines the type of batch jobs
 | ||
|  | type BatchJobReplicateResourceType string | ||
|  | 
 | ||
|  | // Validate validates if the replicate resource type is recognized and supported
 | ||
|  | func (t BatchJobReplicateResourceType) Validate() error { | ||
|  | 	switch t { | ||
|  | 	case BatchJobReplicateResourceMinIO: | ||
|  | 	case BatchJobReplicateResourceS3: | ||
|  | 	default: | ||
|  | 		return errInvalidArgument | ||
|  | 	} | ||
|  | 	return nil | ||
|  | } | ||
|  | 
 | ||
|  | func (t BatchJobReplicateResourceType) isMinio() bool { | ||
|  | 	return t == BatchJobReplicateResourceMinIO | ||
|  | } | ||
|  | 
 | ||
|  | // Different types of batch jobs..
 | ||
|  | const ( | ||
|  | 	BatchJobReplicateResourceMinIO BatchJobReplicateResourceType = "minio" | ||
|  | 	BatchJobReplicateResourceS3    BatchJobReplicateResourceType = "s3" | ||
|  | 
 | ||
|  | 	// add future targets
 | ||
|  | ) | ||
|  | 
 | ||
|  | // BatchJobReplicateCredentials access credentials for batch replication it may
 | ||
|  | // be either for target or source.
 | ||
|  | type BatchJobReplicateCredentials struct { | ||
|  | 	AccessKey    string `xml:"AccessKeyId" json:"accessKey,omitempty" yaml:"accessKey"` | ||
|  | 	SecretKey    string `xml:"SecretAccessKey" json:"secretKey,omitempty" yaml:"secretKey"` | ||
|  | 	SessionToken string `xml:"SessionToken" json:"sessionToken,omitempty" yaml:"sessionToken"` | ||
|  | } | ||
|  | 
 | ||
|  | // Empty indicates if credentials are not set
 | ||
|  | func (c BatchJobReplicateCredentials) Empty() bool { | ||
|  | 	return c.AccessKey == "" && c.SecretKey == "" && c.SessionToken == "" | ||
|  | } | ||
|  | 
 | ||
|  | // Validate validates if credentials are valid
 | ||
|  | func (c BatchJobReplicateCredentials) Validate() error { | ||
|  | 	if !auth.IsAccessKeyValid(c.AccessKey) || !auth.IsSecretKeyValid(c.SecretKey) { | ||
|  | 		return errInvalidArgument | ||
|  | 	} | ||
|  | 	return nil | ||
|  | } | ||
|  | 
 | ||
|  | // BatchJobReplicateTarget describes target element of the replication job that receives
 | ||
|  | // the filtered data from source
 | ||
|  | type BatchJobReplicateTarget struct { | ||
|  | 	Type     BatchJobReplicateResourceType `yaml:"type" json:"type"` | ||
|  | 	Bucket   string                        `yaml:"bucket" json:"bucket"` | ||
|  | 	Prefix   string                        `yaml:"prefix" json:"prefix"` | ||
|  | 	Endpoint string                        `yaml:"endpoint" json:"endpoint"` | ||
|  | 	Path     string                        `yaml:"path" json:"path"` | ||
|  | 	Creds    BatchJobReplicateCredentials  `yaml:"credentials" json:"credentials"` | ||
|  | } | ||
|  | 
 | ||
|  | // ValidPath returns true if path is valid
 | ||
|  | func (t BatchJobReplicateTarget) ValidPath() bool { | ||
|  | 	return t.Path == "on" || t.Path == "off" || t.Path == "auto" || t.Path == "" | ||
|  | } | ||
|  | 
 | ||
|  | // BatchJobReplicateSource describes source element of the replication job that is
 | ||
|  | // the source of the data for the target
 | ||
|  | type BatchJobReplicateSource struct { | ||
|  | 	Type     BatchJobReplicateResourceType `yaml:"type" json:"type"` | ||
|  | 	Bucket   string                        `yaml:"bucket" json:"bucket"` | ||
|  | 	Prefix   string                        `yaml:"prefix" json:"prefix"` | ||
|  | 	Endpoint string                        `yaml:"endpoint" json:"endpoint"` | ||
|  | 	Path     string                        `yaml:"path" json:"path"` | ||
|  | 	Creds    BatchJobReplicateCredentials  `yaml:"credentials" json:"credentials"` | ||
|  | } | ||
|  | 
 | ||
|  | // ValidPath returns true if path is valid
 | ||
|  | func (s BatchJobReplicateSource) ValidPath() bool { | ||
|  | 	switch s.Path { | ||
|  | 	case "on", "off", "auto", "": | ||
|  | 		return true | ||
|  | 	default: | ||
|  | 		return false | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | // BatchJobReplicateV1 v1 of batch job replication
 | ||
|  | type BatchJobReplicateV1 struct { | ||
|  | 	APIVersion string                  `yaml:"apiVersion" json:"apiVersion"` | ||
|  | 	Flags      BatchJobReplicateFlags  `yaml:"flags" json:"flags"` | ||
|  | 	Target     BatchJobReplicateTarget `yaml:"target" json:"target"` | ||
|  | 	Source     BatchJobReplicateSource `yaml:"source" json:"source"` | ||
|  | 
 | ||
|  | 	clnt *miniogo.Core `msg:"-"` | ||
|  | } | ||
|  | 
 | ||
|  | // RemoteToLocal returns true if source is remote and target is local
 | ||
|  | func (r BatchJobReplicateV1) RemoteToLocal() bool { | ||
|  | 	return !r.Source.Creds.Empty() | ||
|  | } |