diff --git a/README.md b/README.md index b2a4a3a8779..023202072e0 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ MinIO Operator brings native support for [MinIO](https://github.com/minio/minio) ## Operator Setup -MinIO Operator offers MinIO Tenant creation, management, upgrade, zone addition and more. Operator is meant to control and manage multiple MinIO Tenants. +MinIO Operator offers MinIO Tenant creation, management, upgrade, pool addition and more. Operator is meant to control and manage multiple MinIO Tenants. To get started, initialize the MinIO Operator deployment. This is a _one time_ process. diff --git a/docs/custom-name-templates.md b/docs/custom-name-templates.md index 3d2b3ccc7a5..670d70f58e2 100644 --- a/docs/custom-name-templates.md +++ b/docs/custom-name-templates.md @@ -4,7 +4,7 @@ This document explains how to control the names used for host discovery. This al ## Getting Started -If MinIO Tenant is named `tenant1`, then the four servers will be called `tenant1-zone-0-0`, `tenant1-zone-0-1`, `tenant1-zone-0-2`, and `tenant1-zone-0-3`. If all of your hosts are available at the domain `example.com` then you can use the `--hosts-template` flag in [MinIO Operator Deployment yaml](https://github.com/minio/operator/blob/master/minio-operator.yaml) to update discovery. This will generate the discovery string `tenant1-zone-0-{0...3}.example.com`. +If MinIO Tenant is named `tenant1`, then the four servers will be called `tenant1-pool-0-0`, `tenant1-pool-0-1`, `tenant1-pool-0-2`, and `tenant1-pool-0-3`. If all of your hosts are available at the domain `example.com` then you can use the `--hosts-template` flag in [MinIO Operator Deployment yaml](https://github.com/minio/operator/blob/master/minio-operator.yaml) to update discovery. This will generate the discovery string `tenant1-pool-0-{0...3}.example.com`. ```yaml containers: @@ -21,5 +21,5 @@ The following fields can be configured: | StatefulSet | The name of the tenant StatefulSet (e.g. `minio`). | | CIService | The name of the service provided in `spec.serviceName`. | | HLService | The name of the headless service that is generated (e.g. `minio-hl-service`) | -| Ellipsis | `{0...N-1}` the per-zone host numbers. | +| Ellipsis | `{0...N-1}` the per-pool host numbers. | | Domain | The cluster domain, either `cluster.local` or the contents of the `CLUSTER_DOMAIN` environment variable. | diff --git a/docs/expansion.md b/docs/expansion.md index 9fe483f0813..61e3f27cae7 100644 --- a/docs/expansion.md +++ b/docs/expansion.md @@ -2,7 +2,7 @@ This document explains how to expand an existing MinIO Tenant with Operator. This is only applicable to a Tenant (MinIO Deployment) created by MinIO Operator. -MinIO expansion is done in terms of MinIO zones, read more about the design in [MinIO Docs](https://github.com/minio/minio/blob/master/docs/distributed). +MinIO expansion is done in terms of MinIO pools, read more about the design in [MinIO Docs](https://github.com/minio/minio/blob/master/docs/distributed). ## Getting Started @@ -22,19 +22,19 @@ Remember to replace `TENANT_NAME` with tenant name where you want to add volumes ## Underlying Details in Tenant Expansion -### What are MinIO Zones +### What are MinIO pools -A MinIO zone is a self contained entity with same SLA's (read/write quorum) for each object. There are no limits on how many zones can be combined. After adding of a zone, MinIO simply uses the least used zone. All zones are for all purposes are invisible to an any application, and MinIO handles the zones internally. +A MinIO pool is a self contained entity with same SLA's (read/write quorum) for each object. There are no limits on how many pools can be combined. After adding of a pool, MinIO simply uses the least used pool. All pools are for all purposes are invisible to an any application, and MinIO handles the pools internally. -### Rules of Adding Zones +### Rules of Adding pools -There is only one requirement, i.e. based on initial zone's erasure set count (say `n`), new zones are expected to have a minimum of `n` drives to match the original Tenant SLA or it should be in multiples of `n`. For example if initial set count is 4, new zones should have at least 4 or multiple of 4 drives. +There is only one requirement, i.e. based on initial pool's erasure set count (say `n`), new pools are expected to have a minimum of `n` drives to match the original Tenant SLA or it should be in multiples of `n`. For example if initial set count is 4, new pools should have at least 4 or multiple of 4 drives. ### Effects on KES/TLS Enabled Instance If your MinIO Operator configuration has [KES](https://github.com/minio/operator/blob/master/docs/kes.md) or [Automatic TLS](https://github.com/minio/operator/blob/master/docs/tls.md#automatic-csr-generation) enabled, there are additional considerations: -- When new zones are added, Operator invalidates older self signed TLS certificates and the related secrets. Operator then creates new certificate signing requests (CSR). This is because there are new MinIO nodes that must be added in certificate DNS names. The administrator must approve these CSRs for MinIO server to be deployed again. Unless the CSR are approved, Operator will not create MinIO StatefulSet pods. +- When new pools are added, Operator invalidates older self signed TLS certificates and the related secrets. Operator then creates new certificate signing requests (CSR). This is because there are new MinIO nodes that must be added in certificate DNS names. The administrator must approve these CSRs for MinIO server to be deployed again. Unless the CSR are approved, Operator will not create MinIO StatefulSet pods. - If you're using your own certificates, as explained [here](https://github.com/minio/operator/blob/master/docs/tls.md#pass-certificate-secret-to-tenant), please ensure to use/update proper certificates that allow older and new MinIO nodes. diff --git a/docs/operator-fields.md b/docs/operator-fields.md index cf1135f456d..e380581412a 100644 --- a/docs/operator-fields.md +++ b/docs/operator-fields.md @@ -20,8 +20,8 @@ MinIO Operator creates native Kubernetes resources within the cluster. If the Te | scheduler | Set custom scheduler for pods created by MinIO Operator.| | spec.metadata | Define the object metadata to be passed to all the members pods of this Tenant. This allows adding annotations and labels. For example,you can add Prometheus annotations here. Internally `metadata` is a struct type as [explained here](https://godoc.org/k8s.io/apimachinery/pkg/apis/meta/v1#ObjectMeta).| | spec.image | Set the container registry and image tag for MinIO server to be used in the Tenant.| -| spec.zones | Set the number of servers per MinIO Zone. Add a new Zone field to expand the MinIO cluster. Read more on [MinIO zones here](https://github.com/minio/minio/blob/master/docs/distributed/DESIGN.md).| -| spec.volumesPerServer | Set the number of volume mounts per MinIO node. For example if you set `spec.zones[0].Servers = 4`, `spec.zones[1].Servers = 8` and `spec.volumesPerServer = 4`, then you'll have total 12 MinIO Pods, with 4 volume mounts on each Pod. Note that `volumesPerServer` is static per cluster, expanding a cluster will add new nodes. | +| spec.pools | Set the number of servers per MinIO Pool. Add a new Pool field to expand the MinIO cluster. Read more on [MinIO pools here](https://github.com/minio/minio/blob/master/docs/distributed/DESIGN.md).| +| spec.volumesPerServer | Set the number of volume mounts per MinIO node. For example if you set `spec.pools[0].Servers = 4`, `spec.pools[1].Servers = 8` and `spec.volumesPerServer = 4`, then you'll have total 12 MinIO Pods, with 4 volume mounts on each Pod. Note that `volumesPerServer` is static per cluster, expanding a cluster will add new nodes. | | spec.imagePullSecret | Defines the secret to be used for pull image from a private Docker image. | | spec.credsSecret | Use this secret to assign custom credentials (access key and secret key) to Tenant.| | spec.replicas | Define the number of nodes to be created for current Tenant cluster.| diff --git a/examples/patch.yaml b/examples/patch.yaml index ef2a7f1d517..9ab3bd271b5 100644 --- a/examples/patch.yaml +++ b/examples/patch.yaml @@ -3,10 +3,10 @@ kind: Tenant metadata: name: minio spec: - zones: + pools: - volumesPerServer: 4 - ## Number of MinIO servers/pods in zone 0. + ## Number of MinIO servers/pods in pool 0. servers: 4 - volumesPerServer: 4 - ## Number of MinIO servers/pods in zone 1. + ## Number of MinIO servers/pods in pool 1. servers: 4 diff --git a/examples/tenant-encryption.yaml b/examples/tenant-encryption.yaml index 43391a5b920..535383c6019 100644 --- a/examples/tenant-encryption.yaml +++ b/examples/tenant-encryption.yaml @@ -116,9 +116,9 @@ spec: credsSecret: name: minio-creds-secret - ## Specification for MinIO Zone(s) in this Tenant. - zones: - ## Servers specifies the number of MinIO Tenant Pods / Servers in this zone. + ## Specification for MinIO Pool(s) in this Tenant. + pools: + ## Servers specifies the number of MinIO Tenant Pods / Servers in this pool. ## For standalone mode, supply 1. For distributed mode, supply 4 or more. ## Note that the operator does not support upgrading from standalone to distributed mode. - servers: 4 @@ -127,7 +127,7 @@ spec: volumesPerServer: 4 ## This VolumeClaimTemplate is used across all the volumes provisioned for MinIO Tenant in this - ## Zone. + ## Pool. volumeClaimTemplate: metadata: name: data diff --git a/examples/tenant-pod-security-policy.yaml b/examples/tenant-pod-security-policy.yaml index 8fd5fa39436..82e870099b1 100644 --- a/examples/tenant-pod-security-policy.yaml +++ b/examples/tenant-pod-security-policy.yaml @@ -79,9 +79,9 @@ spec: image: minio/minio:RELEASE.2020-11-19T23-48-16Z ## Service account to be used for all the MinIO Pods serviceAccountName: minio-pods - zones: + pools: - volumesPerServer: 4 - ## Number of MinIO servers/pods in this zone. + ## Number of MinIO servers/pods in this pool. ## For standalone mode, supply 1. For distributed mode, supply 4 or more. ## Note that the operator does not support upgrading from standalone to distributed mode. servers: 4 diff --git a/examples/tenant-with-autocert-and-custom-certs-encryption-enabled.yaml b/examples/tenant-with-autocert-and-custom-certs-encryption-enabled.yaml index faee787ebaa..8f0851371ee 100644 --- a/examples/tenant-with-autocert-and-custom-certs-encryption-enabled.yaml +++ b/examples/tenant-with-autocert-and-custom-certs-encryption-enabled.yaml @@ -109,9 +109,9 @@ spec: credsSecret: name: minio-autocert-custom-cert-encryption-minio-creds-secret - ## Specification for MinIO Zone(s) in this Tenant. - zones: - ## Servers specifies the number of MinIO Tenant Pods / Servers in this zone. + ## Specification for MinIO Pool(s) in this Tenant. + pools: + ## Servers specifies the number of MinIO Tenant Pods / Servers in this pool. ## For standalone mode, supply 1. For distributed mode, supply 4 or more. ## Note that the operator does not support upgrading from standalone to distributed mode. - servers: 4 @@ -120,7 +120,7 @@ spec: volumesPerServer: 4 ## This VolumeClaimTemplate is used across all the volumes provisioned for MinIO Tenant in this - ## Zone. + ## Pool. volumeClaimTemplate: metadata: name: data diff --git a/examples/tenant-with-autocert-and-ldap.yaml b/examples/tenant-with-autocert-and-ldap.yaml index 3448cfb4b8d..c4b5b257db6 100644 --- a/examples/tenant-with-autocert-and-ldap.yaml +++ b/examples/tenant-with-autocert-and-ldap.yaml @@ -155,8 +155,8 @@ spec: credsSecret: name: minio-autocert-ldap-minio-creds-secret - ## Specification for MinIO Zone(s) in this Tenant. - zones: + ## Specification for MinIO Pool(s) in this Tenant. + pools: - servers: 4 volumesPerServer: 4 volumeClaimTemplate: diff --git a/examples/tenant-with-autocert-encryption-disabled.yaml b/examples/tenant-with-autocert-encryption-disabled.yaml index 922dbf41a26..0c912806637 100644 --- a/examples/tenant-with-autocert-encryption-disabled.yaml +++ b/examples/tenant-with-autocert-encryption-disabled.yaml @@ -55,8 +55,8 @@ spec: credsSecret: name: minio-autocert-no-encryption-minio-creds-secret - ## Specification for MinIO Zone(s) in this Tenant. - zones: + ## Specification for MinIO Pool(s) in this Tenant. + pools: - servers: 4 volumesPerServer: 4 volumeClaimTemplate: diff --git a/examples/tenant-with-autocert-encryption-enabled.yaml b/examples/tenant-with-autocert-encryption-enabled.yaml index 23a6670d666..f0007bef21e 100644 --- a/examples/tenant-with-autocert-encryption-enabled.yaml +++ b/examples/tenant-with-autocert-encryption-enabled.yaml @@ -98,8 +98,8 @@ spec: credsSecret: name: minio-autocert-encryption-minio-creds-secret - ## Specification for MinIO Zone(s) in this Tenant. - zones: + ## Specification for MinIO Pool(s) in this Tenant. + pools: - servers: 4 volumesPerServer: 4 volumeClaimTemplate: diff --git a/examples/tenant-with-custom-ca-certs.yaml b/examples/tenant-with-custom-ca-certs.yaml index 3d0ff29f7bd..eca99f00552 100644 --- a/examples/tenant-with-custom-ca-certs.yaml +++ b/examples/tenant-with-custom-ca-certs.yaml @@ -94,9 +94,9 @@ spec: credsSecret: name: minio-custom-cert-no-encryption-minio-creds-secret - ## Specification for MinIO Zone(s) in this Tenant. - zones: - ## Servers specifies the number of MinIO Tenant Pods / Servers in this zone. + ## Specification for MinIO Pool(s) in this Tenant. + pools: + ## Servers specifies the number of MinIO Tenant Pods / Servers in this pool. ## For standalone mode, supply 1. For distributed mode, supply 4 or more. ## Note that the operator does not support upgrading from standalone to distributed mode. - servers: 4 @@ -105,7 +105,7 @@ spec: volumesPerServer: 4 ## This VolumeClaimTemplate is used across all the volumes provisioned for MinIO Tenant in this - ## Zone. + ## Pool. volumeClaimTemplate: metadata: name: data diff --git a/examples/tenant-with-custom-cert-encryption-disabled.yaml b/examples/tenant-with-custom-cert-encryption-disabled.yaml index 69e93adfdbe..48fb080dd3e 100644 --- a/examples/tenant-with-custom-cert-encryption-disabled.yaml +++ b/examples/tenant-with-custom-cert-encryption-disabled.yaml @@ -86,9 +86,9 @@ spec: credsSecret: name: minio-custom-cert-no-encryption-minio-creds-secret - ## Specification for MinIO Zone(s) in this Tenant. - zones: - ## Servers specifies the number of MinIO Tenant Pods / Servers in this zone. + ## Specification for MinIO Pool(s) in this Tenant. + pools: + ## Servers specifies the number of MinIO Tenant Pods / Servers in this pool. ## For standalone mode, supply 1. For distributed mode, supply 4 or more. ## Note that the operator does not support upgrading from standalone to distributed mode. - servers: 4 @@ -97,7 +97,7 @@ spec: volumesPerServer: 4 ## This VolumeClaimTemplate is used across all the volumes provisioned for MinIO Tenant in this - ## Zone. + ## Pool. volumeClaimTemplate: metadata: name: data diff --git a/examples/tenant-with-custom-cert-encryption-enabled.yaml b/examples/tenant-with-custom-cert-encryption-enabled.yaml index 55b87130006..5e60731cca5 100644 --- a/examples/tenant-with-custom-cert-encryption-enabled.yaml +++ b/examples/tenant-with-custom-cert-encryption-enabled.yaml @@ -149,9 +149,9 @@ spec: credsSecret: name: minio-custom-cert-encryption-minio-creds-secret - ## Specification for MinIO Zone(s) in this Tenant. - zones: - ## Servers specifies the number of MinIO Tenant Pods / Servers in this zone. + ## Specification for MinIO Pool(s) in this Tenant. + pools: + ## Servers specifies the number of MinIO Tenant Pods / Servers in this pool. ## For standalone mode, supply 1. For distributed mode, supply 4 or more. ## Note that the operator does not support upgrading from standalone to distributed mode. - servers: 4 @@ -160,7 +160,7 @@ spec: volumesPerServer: 4 ## This VolumeClaimTemplate is used across all the volumes provisioned for MinIO Tenant in this - ## Zone. + ## Pool. volumeClaimTemplate: metadata: name: data diff --git a/examples/tenant.yaml b/examples/tenant.yaml index 324d91d03a6..2595036d3cd 100644 --- a/examples/tenant.yaml +++ b/examples/tenant.yaml @@ -55,9 +55,9 @@ spec: credsSecret: name: minio-creds-secret - ## Specification for MinIO Zone(s) in this Tenant. - zones: - ## Servers specifies the number of MinIO Tenant Pods / Servers in this zone. + ## Specification for MinIO Pool(s) in this Tenant. + pools: + ## Servers specifies the number of MinIO Tenant Pods / Servers in this pool. ## For standalone mode, supply 1. For distributed mode, supply 4 or more. ## Note that the operator does not support upgrading from standalone to distributed mode. - servers: 4 @@ -66,7 +66,7 @@ spec: volumesPerServer: 4 ## This VolumeClaimTemplate is used across all the volumes provisioned for MinIO Tenant in this - ## Zone. + ## Pool. volumeClaimTemplate: metadata: name: data diff --git a/kubectl-minio/README.md b/kubectl-minio/README.md index 24bee7d6e5a..25a35063dbe 100644 --- a/kubectl-minio/README.md +++ b/kubectl-minio/README.md @@ -53,7 +53,7 @@ Options: - `--kes-config=kes-secret` - `--output` -#### Add Tenant Zones +#### Add Tenant pools Command: `kubectl minio tenant expand --name TENANT_NAME --servers SERVERS --volumes TOTAL_VOLUMES --capacity TOTAL_RAW_CAPACITY [options]` @@ -66,11 +66,11 @@ Options: - `--namespace=minio` - `--output` -#### List Tenant Zones +#### List Tenant pools Command: `kubectl minio tenant info --name TENANT_NAME [options]` -List all existing MinIO Zones in the given MinIO Tenant. +List all existing MinIO pools in the given MinIO Tenant. example: `kubectl minio tenant info --name tenant1` diff --git a/kubectl-minio/cmd/resources/common.go b/kubectl-minio/cmd/resources/common.go index cfeb4fa7602..98fc6f5de62 100644 --- a/kubectl-minio/cmd/resources/common.go +++ b/kubectl-minio/cmd/resources/common.go @@ -32,9 +32,9 @@ func tenantStorage(q resource.Quantity) v1.ResourceList { return m } -// Zone returns a Zone object from given values -func Zone(servers, volumes int32, q resource.Quantity, sc string) miniov1.Zone { - return miniov1.Zone{ +// Pool returns a Pool object from given values +func Pool(servers, volumes int32, q resource.Quantity, sc string) miniov1.Pool { + return miniov1.Pool{ Servers: servers, VolumesPerServer: volumes, VolumeClaimTemplate: &v1.PersistentVolumeClaim{ diff --git a/kubectl-minio/cmd/resources/tenant.go b/kubectl-minio/cmd/resources/tenant.go index 4b0e7f74846..bfd4e0e3883 100644 --- a/kubectl-minio/cmd/resources/tenant.go +++ b/kubectl-minio/cmd/resources/tenant.go @@ -132,13 +132,14 @@ func tenantConsoleConfig(tenant, secret string) *miniov1.ConsoleConfiguration { return nil } -func externalCertSecret(secret string) *miniov1.LocalCertificateReference { +func externalCertSecret(secret string) []*miniov1.LocalCertificateReference { + certs := make([]*miniov1.LocalCertificateReference, 1) if secret != "" { - return &miniov1.LocalCertificateReference{ + certs[0] = &miniov1.LocalCertificateReference{ Name: secret, } } - return nil + return certs } func storageClass(sc string) *string { @@ -150,6 +151,7 @@ func storageClass(sc string) *string { // NewTenant will return a new Tenant for a MinIO Operator func NewTenant(opts *TenantOptions) (*miniov1.Tenant, error) { + autoCert := true volumesPerServer := helpers.VolumesPerServer(opts.Volumes, opts.Servers) capacityPerVolume, err := helpers.CapacityPerVolume(opts.Capacity, opts.Volumes) if err != nil { @@ -166,13 +168,12 @@ func NewTenant(opts *TenantOptions) (*miniov1.Tenant, error) { Namespace: opts.NS, }, Spec: miniov1.TenantSpec{ - Image: opts.Image, - ServiceName: helpers.ServiceName(opts.Name), + Image: opts.Image, CredsSecret: &v1.LocalObjectReference{ Name: opts.SecretName, }, - Zones: []miniov1.Zone{Zone(opts.Servers, volumesPerServer, *capacityPerVolume, opts.StorageClass)}, - RequestAutoCert: true, + Pools: []miniov1.Pool{Pool(opts.Servers, volumesPerServer, *capacityPerVolume, opts.StorageClass)}, + RequestAutoCert: &autoCert, CertConfig: &miniov1.CertificateConfig{ CommonName: "", OrganizationName: []string{}, diff --git a/kubectl-minio/cmd/tenant-create.go b/kubectl-minio/cmd/tenant-create.go index 0330bd54dc4..c60f24fa586 100644 --- a/kubectl-minio/cmd/tenant-create.go +++ b/kubectl-minio/cmd/tenant-create.go @@ -72,7 +72,7 @@ func newTenantCreateCmd(out io.Writer, errOut io.Writer) *cobra.Command { f.StringVar(&c.tenantOpts.Name, "name", "", "name of the MinIO tenant to create") f.Int32Var(&c.tenantOpts.Servers, "servers", 0, "total number of pods in MinIO tenant") f.Int32Var(&c.tenantOpts.Volumes, "volumes", 0, "total number of volumes in the MinIO tenant") - f.StringVar(&c.tenantOpts.Capacity, "capacity", "", "total raw capacity of MinIO tenant in this zone, e.g. 16Ti") + f.StringVar(&c.tenantOpts.Capacity, "capacity", "", "total raw capacity of MinIO tenant in this pool, e.g. 16Ti") f.StringVarP(&c.tenantOpts.NS, "namespace", "n", helpers.DefaultNamespace, "namespace scope for this request") f.StringVarP(&c.tenantOpts.StorageClass, "storage-class", "s", helpers.DefaultStorageclass, "storage class for this MinIO tenant") f.StringVar(&c.tenantOpts.KmsSecret, "kes-config", "", "name of secret with details for enabling encryption, refer example https://github.com/minio/operator/blob/master/examples/kes-secret.yaml") diff --git a/kubectl-minio/cmd/tenant-expand.go b/kubectl-minio/cmd/tenant-expand.go index 443a31ed716..2c313f58632 100644 --- a/kubectl-minio/cmd/tenant-expand.go +++ b/kubectl-minio/cmd/tenant-expand.go @@ -98,10 +98,10 @@ func (v *expandCmd) run() error { return err } - t.Spec.Zones = append(t.Spec.Zones, resources.Zone(v.tenantOpts.Servers, volumesPerServer, *capacityPerVolume, v.tenantOpts.StorageClass)) + t.Spec.Pools = append(t.Spec.Pools, resources.Pool(v.tenantOpts.Servers, volumesPerServer, *capacityPerVolume, v.tenantOpts.StorageClass)) if !v.output { - return addZoneToTenant(client, t) + return addPoolToTenant(client, t) } o, err := yaml.Marshal(t) @@ -112,7 +112,7 @@ func (v *expandCmd) run() error { return nil } -func addZoneToTenant(client *operatorv1.Clientset, t *miniov1.Tenant) error { +func addPoolToTenant(client *operatorv1.Clientset, t *miniov1.Tenant) error { data, err := json.Marshal(t) if err != nil { return err diff --git a/kubectl-minio/cmd/tenant-info.go b/kubectl-minio/cmd/tenant-info.go index 060fe8c08b4..e42f24ce59f 100644 --- a/kubectl-minio/cmd/tenant-info.go +++ b/kubectl-minio/cmd/tenant-info.go @@ -35,7 +35,7 @@ import ( const ( infoDesc = ` -'info' command lists zones from a MinIO tenant` +'info' command lists pools from a MinIO tenant` infoExample = ` kubectl minio tenant info --name tenant1 --namespace tenant1-ns` ) @@ -81,22 +81,22 @@ func (d *infoCmd) run() error { if err != nil { return err } - err = listZonesTenant(oclient, d) + err = listPoolsTenant(oclient, d) if err != nil { return err } return nil } -func listZonesTenant(client *operatorv1.Clientset, d *infoCmd) error { +func listPoolsTenant(client *operatorv1.Clientset, d *infoCmd) error { tenant, err := client.MinioV1().Tenants(d.ns).Get(context.Background(), d.name, metav1.GetOptions{}) if err != nil { return err } t := table.NewWriter() t.SetOutputMirror(os.Stdout) - t.AppendHeader(table.Row{"Zone", "Servers", "Volumes Per Server", "Capacity Per Volume", "Version"}) - for i, z := range tenant.Spec.Zones { + t.AppendHeader(table.Row{"Pool", "Servers", "Volumes Per Server", "Capacity Per Volume", "Version"}) + for i, z := range tenant.Spec.Pools { t.AppendRow(table.Row{i, z.Servers, z.VolumesPerServer, z.VolumeClaimTemplate.Spec.Resources.Requests.Storage().String()}) } t.AppendFooter(table.Row{"Version", tenant.Spec.Image}) diff --git a/kubectl-minio/go.mod b/kubectl-minio/go.mod index 26af77d9e34..71395e5af84 100644 --- a/kubectl-minio/go.mod +++ b/kubectl-minio/go.mod @@ -2,6 +2,8 @@ module github.com/minio/kubectl-minio go 1.13 +replace github.com/minio/operator => ../ + require ( github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 // indirect github.com/go-openapi/errors v0.19.6 // indirect @@ -12,8 +14,7 @@ require ( github.com/imdario/mergo v0.3.10 // indirect github.com/jedib0t/go-pretty v4.3.0+incompatible github.com/mattn/go-runewidth v0.0.9 // indirect - github.com/minio/minio v0.0.0-20200730061534-fe157166cae7 - github.com/minio/minio-go/v7 v7.0.2 // indirect + github.com/minio/minio v0.0.0-20200927172404-27d9bd04e544 github.com/minio/operator v0.3.23 github.com/mitchellh/mapstructure v1.3.3 // indirect github.com/montanaflynn/stats v0.6.3 // indirect @@ -23,9 +24,7 @@ require ( github.com/shirou/gopsutil v2.20.6+incompatible // indirect github.com/spf13/cobra v1.0.0 go.mongodb.org/mongo-driver v1.3.5 // indirect - golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de // indirect golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d // indirect - golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1 // indirect golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e // indirect google.golang.org/appengine v1.6.6 // indirect google.golang.org/protobuf v1.25.0 // indirect diff --git a/kubectl-minio/go.sum b/kubectl-minio/go.sum index d521e40433f..e57f4fc656d 100644 --- a/kubectl-minio/go.sum +++ b/kubectl-minio/go.sum @@ -50,6 +50,7 @@ github.com/Azure/azure-sdk-for-go v38.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9mo github.com/Azure/azure-sdk-for-go v42.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-service-bus-go v0.9.1/go.mod h1:yzBx6/BUGfjfeqbRZny9AQIbIe3AcV9WZbAdpkoXOa0= github.com/Azure/azure-storage-blob-go v0.8.0/go.mod h1:lPI3aLPpuLTeUwh1sViKXFxwl2B6teiRqI0deQUvsw0= +github.com/Azure/azure-storage-blob-go v0.10.0/go.mod h1:ep1edmW+kNQx4UfWM9heESNmQdijykocJ0YOxmMX8SE= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-autorest v12.0.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest v14.1.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= @@ -67,6 +68,8 @@ github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMl github.com/Azure/go-autorest/autorest/adal v0.8.3/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= github.com/Azure/go-autorest/autorest/adal v0.9.0 h1:SigMbuFNuKgc1xcGhaeapbh+8fgsu+GxgDRFyg7f5lM= github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= +github.com/Azure/go-autorest/autorest/adal v0.9.1 h1:xjPqigMQe2+0DAJ5A6MLUPp5D2r2Io8qHCuCMMI/yJU= +github.com/Azure/go-autorest/autorest/adal v0.9.1/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= @@ -134,6 +137,7 @@ github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY= github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= @@ -143,7 +147,9 @@ github.com/aws/aws-sdk-go v1.19.45/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpi github.com/aws/aws-sdk-go v1.20.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.20.21/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.25.11/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.26.3/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.27.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.29.11/go.mod h1:1KvfttTE3SPKMpo8g2c6jL3ZKfXtFvKscTgahTma5Xg= github.com/aws/aws-sdk-go v1.31.6/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= github.com/bcicen/jstream v0.0.0-20190220045926-16c1f8af81c2/go.mod h1:RDu/qcrnpEdJC/p8tx34+YBFqqX71lB7dOX9QE+ZC4M= @@ -176,6 +182,7 @@ github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/codegangsta/negroni v1.0.0/go.mod h1:v0y3T5G7Y1UlFfyxFn/QLRU4a2EuNau2iZY63YTKWo0= github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/coredns/coredns v1.4.0/go.mod h1:zASH/MVDgR6XZTbxvOnsZfffS+31vg6Ackf/wo1+AM0= @@ -184,6 +191,7 @@ github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-oidc v2.2.1+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= @@ -280,11 +288,14 @@ github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70t github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= +github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= +github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ= github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY= github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= +github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= github.com/go-openapi/errors v0.19.6 h1:xZMThgv5SQ7SMbWtKFkCf9bBdvR2iEyw9k3zGZONuys= github.com/go-openapi/errors v0.19.6/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= @@ -303,21 +314,30 @@ github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= +github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI= github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= +github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY= github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= +github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo= +github.com/go-openapi/runtime v0.19.19/go.mod h1:Lm9YGCeecBnUUkFTxPC4s1+lwrkJ0pthx8YvyjCfkgk= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= +github.com/go-openapi/spec v0.19.8 h1:qAdZLh1r6QF/hI/gTq+TJTvsQUodZsM7KLqkAJdiJNg= +github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= +github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= github.com/go-openapi/strfmt v0.19.3 h1:eRfyY5SkaNJCAwmmMcADjY31ow9+N7MCLW7oRkbsINA= github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= +github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= github.com/go-openapi/strfmt v0.19.5 h1:0utjKrw+BAh8s57XE9Xz8DUBsVvPmRUB6styvl9wWIM= github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= @@ -326,9 +346,14 @@ github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/ github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= +github.com/go-openapi/swag v0.19.9 h1:1IxuqvBUU3S2Bi4YC7tlP9SJF1gVpCvqN0T2Qof4azE= +github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= +github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= +github.com/go-openapi/validate v0.19.10/go.mod h1:RKEZTUWDkxKQxN2jDT7ZnZi2bhZlbNMAuKvKB+IaGx8= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= @@ -493,6 +518,7 @@ github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/ github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.5-0.20200711200521-98cb6bf42e08 h1:kPna6oIGlRXWmg/jkKfxbpvsl+0DHYnw1qQwN+6+gyA= github.com/gorilla/mux v1.7.5-0.20200711200521-98cb6bf42e08/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/rpc v1.2.0/go.mod h1:V4h9r+4sF5HnzqbwIez0fKSpANP0zlYd3qR7p36jkTQ= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= @@ -569,6 +595,7 @@ github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0 github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= github.com/jedib0t/go-pretty v4.3.0+incompatible h1:CGs8AVhEKg/n9YbUenWmNStRW2PHJzaeDodcfvRAbIo= github.com/jedib0t/go-pretty v4.3.0+incompatible/go.mod h1:XemHduiw8R651AF9Pt4FwCTKeG3oo7hrHJAoznj9nag= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a/go.mod h1:xRskid8CManxVta/ALEhJha/pweKBaVG6fWgc0yH25s= github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= @@ -632,6 +659,7 @@ github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.7.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= @@ -645,6 +673,8 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8= +github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= @@ -656,6 +686,8 @@ github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaa github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.7 h1:bQGKb3vps/j0E9GfJQ03JyhRuxsvdAanXlT9BTw3mdw= +github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= @@ -682,24 +714,34 @@ github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyex github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.8/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/minio/cli v1.22.0/go.mod h1:bYxnK0uS629N3Bq+AOZZ+6lwF77Sodk4+UL9vNuXhOY= +github.com/minio/console v0.4.5/go.mod h1:IlyOokzlrBuRg3f7Y5lYauJuCGqGHh6aQEifF973RSI= github.com/minio/highwayhash v1.0.0/go.mod h1:xQboMTeM9nY9v/LlAOxFctujiv5+Aq2hR5dxBpaMbdc= +github.com/minio/kes v0.11.0/go.mod h1:mTF1Bv8YVEtQqF/B7Felp4tLee44Pp+dgI0rhCvgNg8= +github.com/minio/mc v0.0.0-20201001165056-7f2df96e4821/go.mod h1:+OeGPfw7qpvO1x2Td65ejwAuFT0Cxzx0GFTJSDlPMZQ= github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw= github.com/minio/minio v0.0.0-20200723003940-b9be841fd222 h1:+XFGpEsqmA033nDX8LtjyPZy01Shivf6E2OL67WoGiE= github.com/minio/minio v0.0.0-20200723003940-b9be841fd222/go.mod h1:Eu2KC2p+vW03rnYY/6R/D+QduPB7/j4kBaVA/EDLjWM= github.com/minio/minio v0.0.0-20200730061534-fe157166cae7 h1:NVdRp9tM52rNhlYVJccJSfmS/pKaeUAIf/1ZIEoFZRk= github.com/minio/minio v0.0.0-20200730061534-fe157166cae7/go.mod h1:1RkMjE0Ujyv+Cb5vjNIrO85b3XFlfMMEFmma4hOEKDk= +github.com/minio/minio v0.0.0-20200927172404-27d9bd04e544 h1:G6M9uXdFShowoLG3rMkdCtHsx37ZYB1vc+7bu22r85I= +github.com/minio/minio v0.0.0-20200927172404-27d9bd04e544/go.mod h1:5uolst3SWpgvDNF+KJwfViU+j9WH7dB5i2YCi0nMNVo= github.com/minio/minio-go/v7 v7.0.1 h1:sL2y4uuNUEi7AjvWjoGyDFQKFX2zA0DU2tGM9m3s5f8= github.com/minio/minio-go/v7 v7.0.1/go.mod h1:dJ80Mv2HeGkYLH1sqS/ksz07ON6csH3S6JUMSQ2zAns= github.com/minio/minio-go/v7 v7.0.2 h1:P/7wFd4KrRBHVo7AKdcqO+9ReoS+XpMjfRFoE5quH0E= github.com/minio/minio-go/v7 v7.0.2/go.mod h1:dJ80Mv2HeGkYLH1sqS/ksz07ON6csH3S6JUMSQ2zAns= +github.com/minio/minio-go/v7 v7.0.5-0.20200811211821-14ed05478889/go.mod h1:CSt2ETZNs+bIIhWTse0mcZKZWMGrFU7Er7RR0TmkDYk= +github.com/minio/minio-go/v7 v7.0.6-0.20200923173112-bc846cb9b089 h1:9DDs/Gc3fNHOQxQmwIFWs7YDLMTBh59r2XQ6RqEUA1I= +github.com/minio/minio-go/v7 v7.0.6-0.20200923173112-bc846cb9b089/go.mod h1:CSt2ETZNs+bIIhWTse0mcZKZWMGrFU7Er7RR0TmkDYk= github.com/minio/operator v0.0.0-20200730044813-c2895a5065a1 h1:cTgvRgFBUVxbnxhQUioT2T7SH0M7AyvO7dDX32yKPGw= github.com/minio/operator v0.0.0-20200730044813-c2895a5065a1/go.mod h1:RLhFkLcL65qmrgUQJHrRwb1Lb4yHgD/DfjNENY2WNXg= github.com/minio/operator v0.3.23 h1:Fg+bRFY5mmEQuJYoauMy3TrJ6tNT7Ucz/apdfll1TGU= github.com/minio/operator v0.3.23/go.mod h1:6lavbNo2YuJWeQR5bZYsEWdbpRCO2KrTyfQ0PtC/AN4= github.com/minio/selfupdate v0.3.0/go.mod h1:b8ThJzzH7u2MkF6PcIra7KaXO9Khf6alWPvMSyTDCFM= +github.com/minio/selfupdate v0.3.1/go.mod h1:b8ThJzzH7u2MkF6PcIra7KaXO9Khf6alWPvMSyTDCFM= github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/minio/simdjson-go v0.1.5-0.20200303142138-b17fe061ea37/go.mod h1:oKURrZZEBtqObgJrSjN1Ln2n9MJj2icuBTkeJzZnvSI= +github.com/minio/simdjson-go v0.1.5/go.mod h1:oKURrZZEBtqObgJrSjN1Ln2n9MJj2icuBTkeJzZnvSI= github.com/minio/sio v0.2.0/go.mod h1:nKM5GIWSrqbOZp0uhyj6M1iA0X6xQzSGtYSaTKSCut0= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= @@ -716,10 +758,12 @@ github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:F github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.3.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.3.3 h1:SzB1nHZ2Xi+17FP0zVQBHIZqvwRN9408fJO8h+eeNA8= github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mmcloughlin/avo v0.0.0-20200523190732-4439b6b2c061/go.mod h1:wqKykBG2QzQDJEzvRkcS8x6MiSJkF52hXZsXcjaB3ls= +github.com/mmcloughlin/avo v0.0.0-20200803215136-443f81d77104/go.mod h1:wqKykBG2QzQDJEzvRkcS8x6MiSJkF52hXZsXcjaB3ls= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -757,6 +801,7 @@ github.com/nsqio/go-nsq v1.0.7/go.mod h1:XP5zaUs3pqf+Q71EqUJs3HYfBIqfK6G83WQMdNN github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olivere/elastic/v7 v7.0.12/go.mod h1:14rWX28Pnh3qCKYRVnSGXWLf9MbLonYS/4FDCY3LAPo= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -774,6 +819,7 @@ github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoT github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= @@ -792,11 +838,15 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.3.0/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/xattr v0.4.1/go.mod h1:W2cGD0TBEus7MkUgv0tNZ9JutLtVO3cXu+IBRuHqnFs= github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= @@ -829,6 +879,7 @@ github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -866,11 +917,13 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a h1:pa8hGb/2YqsZKovtsgrwcDH1RZhVbTKCjLp47XpqCDs= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs= +github.com/smartystreets/gunit v1.1.3/go.mod h1:EH5qMBab2UclzXUcpR8b93eHsIlp9u+pDQIRp5DZNzQ= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= github.com/sourcegraph/go-diff v0.5.3/go.mod h1:v9JDtjCE4HHHCZGId75rg8gkKKa98RVjBcBGsVmMmak= @@ -927,6 +980,7 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1 github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tommy-muehle/go-mnd v1.1.1/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= +github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+lC5RZ8IT9rBXDaEDnpnw/Cl+HFiw+v/7Q= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= @@ -934,6 +988,7 @@ github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4A github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= +github.com/unrolled/secure v1.0.7/go.mod h1:uGc1OcRF8gCVBA+ANksKmvM85Hka6SZtQIbrKc3sHS4= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= @@ -944,6 +999,7 @@ github.com/vdemeester/k8s-pkg-credentialprovider v1.17.4/go.mod h1:inCTmtUdr5KJb github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= github.com/willf/bitset v1.1.10/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= github.com/willf/bloom v2.0.3+incompatible/go.mod h1:MmAltL9pDMNTrvUkxdg0k0q5I0suxmuwp3KbyrZLOZ8= github.com/xanzy/go-gitlab v0.31.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= github.com/xanzy/go-gitlab v0.32.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= @@ -956,6 +1012,7 @@ github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1: github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= @@ -965,6 +1022,8 @@ go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qL go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.2 h1:jxcFYjlkl8xaERsgLo+RNquI0epW6zuy/ZRQs6jnrFA= go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= +go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= go.mongodb.org/mongo-driver v1.3.5 h1:S0ZOruh4YGHjD7JoN7mIsTrNjnQbOjrmgrx6l6pZN7I= go.mongodb.org/mongo-driver v1.3.5/go.mod h1:Ual6Gkco7ZGQw8wE1t4tLnvBsf6yVSM60qW6TgOeJ5c= go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= @@ -1006,6 +1065,7 @@ golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191117063200-497ca9f6d64f/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 h1:/Tl7pH94bvbAAHBdZJT947M/+gp0+CqQXDtMRC0fseo= golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -1016,6 +1076,8 @@ golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 h1:DZhuSZLsGlFL4CmhA8BcRA golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1087,9 +1149,13 @@ golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200904194848-62affa334b73 h1:MXfv8rhZWmFeqX3GNZRsd6vOLoaCHjYEX3qkRo3YBUA= +golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1115,6 +1181,7 @@ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180926160741-c2ed4eda69e7/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181021155630-eda9bb28ed51/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1166,6 +1233,8 @@ golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae h1:Ih9Yo4hSPImZOpfGuA4bR/ORK golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1 h1:sIky/MyNRSHTrdxfsiUSS4WIAMvInbeXljJz+jDjeYE= golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200915084602-288bc346aa39 h1:356XA7ITklAU2//sYkjFeco+dH1bCRD8XCJ9FIEsvo4= +golang.org/x/sys v0.0.0-20200915084602-288bc346aa39/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1258,10 +1327,13 @@ golang.org/x/tools v0.0.0-20200502202811-ed308ab3e770/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200724172932-b5fc9d354d99/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200814172026-c4923e618c08/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200929223013-bf155c11ec6f/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= @@ -1354,10 +1426,12 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/h2non/filetype.v1 v1.0.5/go.mod h1:M0yem4rwSX5lLVrkEuRRp2/NinFMD5vgJ4DlAhZcfNo= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -1373,6 +1447,7 @@ gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLv gopkg.in/ldap.v3 v3.0.3/go.mod h1:oxD7NyBuxchC+SgJDE1Q5Od05eGt29SDQVBmV+HYbzw= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/olivere/elastic.v5 v5.0.80/go.mod h1:uhHoB4o3bvX5sorxBU29rPcmBQdV2Qfg0FBrx5D6pV0= +gopkg.in/olivere/elastic.v5 v5.0.86/go.mod h1:M3WNlsF+WhYn7api4D87NIflwTV/c0iVs8cqfWhK+68= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= diff --git a/operator-kustomize/crds/minio.min.io_tenants.yaml b/operator-kustomize/crds/minio.min.io_tenants.yaml index b21e2a0af20..891e4895fec 100644 --- a/operator-kustomize/crds/minio.min.io_tenants.yaml +++ b/operator-kustomize/crds/minio.min.io_tenants.yaml @@ -1,20 +1,13 @@ --- -apiVersion: apiextensions.k8s.io/v1beta1 +apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.3.0 + controller-gen.kubebuilder.io/version: (devel) creationTimestamp: null name: tenants.minio.min.io spec: - additionalPrinterColumns: - - JSONPath: .status.currentState - name: State - type: string - - JSONPath: .metadata.creationTimestamp - name: Age - type: date group: minio.min.io names: kind: Tenant @@ -24,145 +17,207 @@ spec: - tenant singular: tenant scope: Namespaced - subresources: - status: {} - validation: - openAPIV3Schema: - description: Tenant is a specification for a MinIO resource - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - scheduler: - description: TenantScheduler is the spec for a Tenant scheduler - properties: - name: - description: SchedulerName defines the name of scheduler to be used to schedule Tenant pods - type: string - required: - - name - type: object - spec: - description: TenantSpec is the spec for a Tenant resource - properties: - certConfig: - description: CertConfig allows users to set entries like CommonName, Organization, etc for the certificate - properties: - commonName: - type: string - dnsNames: - items: - type: string - type: array - organizationName: - items: - type: string - type: array - type: object - console: - description: ConsoleConfiguration is for setting up minio/console for graphical user interface - properties: - annotations: - additionalProperties: + versions: + - additionalPrinterColumns: + - jsonPath: .status.currentState + name: State + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1 + schema: + openAPIV3Schema: + description: Tenant is a specification for a MinIO resource + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + scheduler: + description: TenantScheduler is the spec for a Tenant scheduler + properties: + name: + description: SchedulerName defines the name of scheduler to be used + to schedule Tenant pods + type: string + required: + - name + type: object + spec: + description: TenantSpec is the spec for a Tenant resource + properties: + certConfig: + description: CertConfig allows users to set entries like CommonName, + Organization, etc for the certificate + properties: + commonName: type: string - description: If provided, use these annotations for Console Object Meta annotations - type: object - consoleSecret: - description: This secret provides all environment variables for KES This is a mandatory field - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + dnsNames: + items: type: string - type: object - env: - description: If provided, use these environment variables for Console resource - items: - description: EnvVar represents an environment variable present in a Container. + type: array + organizationName: + items: + type: string + type: array + type: object + console: + description: ConsoleConfiguration is for setting up minio/console + for graphical user interface + properties: + annotations: + additionalProperties: + type: string + description: If provided, use these annotations for Console Object + Meta annotations + type: object + consoleSecret: + description: This secret provides all environment variables for + KES This is a mandatory field properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. - type: string - value: - description: 'Variable references $(VAR_NAME) are expanded using the previous defined environment variables in the container and any service environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to "".' + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' type: string - valueFrom: - description: Source for the environment variable's value. Cannot be used if value is not empty. - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap or its key must be defined - type: boolean - required: - - key - type: object - fieldRef: - description: 'Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.' - properties: - apiVersion: - description: Version of the schema the FieldPath is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select in the specified API version. - type: string - required: - - fieldPath - type: object - resourceFieldRef: - description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.' - properties: - containerName: - description: 'Container name: required for volumes, optional for env vars' - type: string - divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output format of the exposed resources, defaults to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to select' - type: string - required: - - resource - type: object - secretKeyRef: - description: Selects a key of a secret in the pod's namespace - properties: - key: - description: The key of the secret to select from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must be defined - type: boolean - required: - - key - type: object - type: object - required: - - name type: object - type: array - externalCaCertSecret: - description: ExternalCaCertSecret allows a user to provide additional CA certificates. This is used for Console to verify TLS connections with other applications. - items: - description: LocalCertificateReference defines the spec for a local certificate + env: + description: If provided, use these environment variables for + Console resource + items: + description: EnvVar represents an environment variable present + in a Container. + properties: + name: + description: Name of the environment variable. Must be a + C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) are expanded + using the previous defined environment variables in the + container and any service environment variables. If a + variable cannot be resolved, the reference in the input + string will be unchanged. The $(VAR_NAME) syntax can be + escaped with a double $$, ie: $$(VAR_NAME). Escaped references + will never be expanded, regardless of whether the variable + exists or not. Defaults to "".' + type: string + valueFrom: + description: Source for the environment variable's value. + Cannot be used if value is not empty. + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the ConfigMap or its + key must be defined + type: boolean + required: + - key + type: object + fieldRef: + description: 'Selects a field of the pod: supports metadata.name, + metadata.namespace, metadata.labels, metadata.annotations, + spec.nodeName, spec.serviceAccountName, status.hostIP, + status.podIP, status.podIPs.' + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the + specified API version. + type: string + required: + - fieldPath + type: object + resourceFieldRef: + description: 'Selects a resource of the container: only + resources limits and requests (limits.cpu, limits.memory, + limits.ephemeral-storage, requests.cpu, requests.memory + and requests.ephemeral-storage) are currently supported.' + properties: + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of the + exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + secretKeyRef: + description: Selects a key of a secret in the pod's + namespace + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + type: object + required: + - name + type: object + type: array + externalCaCertSecret: + description: ExternalCaCertSecret allows a user to provide additional + CA certificates. This is used for Console to verify TLS connections + with other applications. + items: + description: LocalCertificateReference defines the spec for + a local certificate + properties: + name: + type: string + type: + type: string + required: + - name + type: object + type: array + externalCertSecret: + description: ExternalCertSecret allows a user to provide an external + certificate and private key. This is used for enabling TLS on + Console and has priority over AutoCert. properties: name: type: string @@ -171,221 +226,186 @@ spec: required: - name type: object - type: array - externalCertSecret: - description: ExternalCertSecret allows a user to provide an external certificate and private key. This is used for enabling TLS on Console and has priority over AutoCert. - properties: - name: - type: string - type: - type: string - required: - - name - type: object - image: - description: Image defines the Tenant Console Docker image. - type: string - imagePullPolicy: - description: Image pull policy. One of Always, Never, IfNotPresent. This is applied to MinIO Console pods only. Refer Kubernetes documentation for details https://kubernetes.io/docs/concepts/containers/images#updating-images - type: string - labels: - additionalProperties: + image: + description: Image defines the Tenant Console Docker image. type: string - description: If provided, use these labels for Console Object Meta labels - type: object - nodeSelector: - additionalProperties: + imagePullPolicy: + description: Image pull policy. One of Always, Never, IfNotPresent. + This is applied to MinIO Console pods only. Refer Kubernetes + documentation for details https://kubernetes.io/docs/concepts/containers/images#updating-images type: string - description: If provided, use these nodeSelector for Console Object Meta nodeSelector - type: object - replicas: - description: Replicas defines number of pods for KES StatefulSet. - format: int32 - type: integer - resources: - description: If provided, use these requests and limit for cpu/memory resource allocation - properties: - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - type: object - serviceAccountName: - description: ServiceAccountName is the name of the ServiceAccount to use to run pods of all Console Pods created as a part of this Tenant. - type: string - required: - - consoleSecret - type: object - credsSecret: - description: If provided, use this secret as the credentials for Tenant resource Otherwise MinIO server creates dynamic credentials printed on MinIO server startup banner - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - type: object - env: - description: If provided, use these environment variables for Tenant resource - items: - description: EnvVar represents an environment variable present in a Container. - properties: - name: - description: Name of the environment variable. Must be a C_IDENTIFIER. - type: string - value: - description: 'Variable references $(VAR_NAME) are expanded using the previous defined environment variables in the container and any service environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to "".' - type: string - valueFrom: - description: Source for the environment variable's value. Cannot be used if value is not empty. + labels: + additionalProperties: + type: string + description: If provided, use these labels for Console Object + Meta labels + type: object + nodeSelector: + additionalProperties: + type: string + description: If provided, use these nodeSelector for Console Object + Meta nodeSelector + type: object + replicas: + description: Replicas defines number of pods for KES StatefulSet. + format: int32 + type: integer + resources: + description: If provided, use these requests and limit for cpu/memory + resource allocation properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap or its key must be defined - type: boolean - required: - - key - type: object - fieldRef: - description: 'Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.' - properties: - apiVersion: - description: Version of the schema the FieldPath is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select in the specified API version. - type: string - required: - - fieldPath - type: object - resourceFieldRef: - description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.' - properties: - containerName: - description: 'Container name: required for volumes, optional for env vars' - type: string - divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output format of the exposed resources, defaults to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to select' - type: string - required: - - resource + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Limits describes the maximum amount of compute + resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' type: object - secretKeyRef: - description: Selects a key of a secret in the pod's namespace - properties: - key: - description: The key of the secret to select from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must be defined - type: boolean - required: - - key + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Requests describes the minimum amount of compute + resources required. If Requests is omitted for a container, + it defaults to Limits if that is explicitly specified, otherwise + to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' type: object type: object - required: - - name - type: object - type: array - externalCaCertSecret: - description: ExternalCaCertSecret allows a user to provide additional CA certificates. This is used for MinIO to verify TLS connections with other applications. - items: - description: LocalCertificateReference defines the spec for a local certificate - properties: - name: - type: string - type: + serviceAccountName: + description: ServiceAccountName is the name of the ServiceAccount + to use to run pods of all Console Pods created as a part of + this Tenant. type: string required: - - name + - consoleSecret type: object - type: array - externalCertSecret: - description: ExternalCertSecret allows a user to provide one or more TLS certificates and private keys. This is used for enabling TLS with SNI support on MinIO server. - items: - description: LocalCertificateReference defines the spec for a local certificate + credsSecret: + description: If provided, use this secret as the credentials for Tenant + resource Otherwise MinIO server creates dynamic credentials printed + on MinIO server startup banner properties: name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' type: string - type: - type: string - required: - - name type: object - type: array - externalClientCertSecret: - description: ExternalClientCertSecret allows a user to specify custom CA client certificate, and private key. This is used for adding client certificates on MinIO Pods --> used for KES authentication. - properties: - name: - type: string - type: - type: string - required: - - name - type: object - image: - description: Image defines the Tenant Docker image. - type: string - imagePullPolicy: - description: Image pull policy. One of Always, Never, IfNotPresent. This is applied to MinIO pods only. Refer Kubernetes documentation for details https://kubernetes.io/docs/concepts/containers/images#updating-images - type: string - imagePullSecret: - description: ImagePullSecret defines the secret to be used for pull image from a private Docker image. - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - type: object - kes: - description: KES is for setting up minio/kes as MinIO KMS - properties: - annotations: - additionalProperties: - type: string - description: If provided, use these annotations for KES Object Meta annotations - type: object - clientCertSecret: - description: ClientCertSecret allows a user to specify a custom root certificate, client certificate and client private key. This is used for adding client certificates on KES --> used for KES authentication against Vault or other KMS that supports mTLS. + env: + description: If provided, use these environment variables for Tenant + resource + items: + description: EnvVar represents an environment variable present in + a Container. properties: name: + description: Name of the environment variable. Must be a C_IDENTIFIER. type: string - type: + value: + description: 'Variable references $(VAR_NAME) are expanded using + the previous defined environment variables in the container + and any service environment variables. If a variable cannot + be resolved, the reference in the input string will be unchanged. + The $(VAR_NAME) syntax can be escaped with a double $$, ie: + $$(VAR_NAME). Escaped references will never be expanded, regardless + of whether the variable exists or not. Defaults to "".' type: string + valueFrom: + description: Source for the environment variable's value. Cannot + be used if value is not empty. + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap or its key + must be defined + type: boolean + required: + - key + type: object + fieldRef: + description: 'Selects a field of the pod: supports metadata.name, + metadata.namespace, metadata.labels, metadata.annotations, + spec.nodeName, spec.serviceAccountName, status.hostIP, + status.podIP, status.podIPs.' + properties: + apiVersion: + description: Version of the schema the FieldPath is + written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the specified + API version. + type: string + required: + - fieldPath + type: object + resourceFieldRef: + description: 'Selects a resource of the container: only + resources limits and requests (limits.cpu, limits.memory, + limits.ephemeral-storage, requests.cpu, requests.memory + and requests.ephemeral-storage) are currently supported.' + properties: + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of the exposed + resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + secretKeyRef: + description: Selects a key of a secret in the pod's namespace + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + type: object required: - name type: object - externalCertSecret: - description: ExternalCertSecret allows a user to specify custom CA certificate, and private key for group replication SSL. + type: array + externalCaCertSecret: + description: ExternalCaCertSecret allows a user to provide additional + CA certificates. This is used for MinIO to verify TLS connections + with other applications. + items: + description: LocalCertificateReference defines the spec for a local + certificate properties: name: type: string @@ -394,724 +414,1252 @@ spec: required: - name type: object - image: - description: Image defines the Tenant KES Docker image. - type: string - imagePullPolicy: - description: Image pull policy. One of Always, Never, IfNotPresent. This is applied to KES pods only. Refer Kubernetes documentation for details https://kubernetes.io/docs/concepts/containers/images#updating-images - type: string - kesSecret: - description: This kesSecret serves as the configuration for KES This is a mandatory field + type: array + externalCertSecret: + description: ExternalCertSecret allows a user to provide one or more + TLS certificates and private keys. This is used for enabling TLS + with SNI support on MinIO server. + items: + description: LocalCertificateReference defines the spec for a local + certificate properties: name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' type: string + type: + type: string + required: + - name type: object - labels: - additionalProperties: + type: array + externalClientCertSecret: + description: ExternalClientCertSecret allows a user to specify custom + CA client certificate, and private key. This is used for adding + client certificates on MinIO Pods --> used for KES authentication. + properties: + name: type: string - description: If provided, use these labels for KES Object Meta labels - type: object - nodeSelector: - additionalProperties: + type: type: string - description: If provided, use these nodeSelector for KES Object Meta nodeSelector - type: object - replicas: - description: Replicas defines number of pods for KES StatefulSet. - format: int32 - type: integer - serviceAccountName: - description: ServiceAccountName is the name of the ServiceAccount to use to run pods of all KES Pods created as a part of this Tenant. - type: string - required: - - kesSecret - type: object - mountPath: - description: Mount path for MinIO volume (PV). Defaults to /export - type: string - podManagementPolicy: - description: Pod Management Policy for pod created by StatefulSet - type: string - priorityClassName: - description: PriorityClassName indicates the Pod priority and hence importance of a Pod relative to other Pods. This is applied to MinIO pods only. Refer Kubernetes documentation for details https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass - type: string - requestAutoCert: - description: 'RequestAutoCert allows user to enable Kubernetes based TLS cert generation and signing as explained here: https://kubernetes.io/docs/tasks/tls/managing-tls-in-a-cluster/' - type: boolean - s3: - description: S3 related features can be disabled or enabled such as `bucketDNS` etc. - properties: - bucketDNS: - description: BucketDNS if 'true' means Buckets can be accessed using `.minio.default.svc.cluster.local` - type: boolean - required: - - bucketDNS - type: object - securityContext: - description: Security Context allows user to set entries like runAsUser, privilege escalation etc. - properties: - fsGroup: - description: "A special supplemental group that applies to all containers in a pod. Some volume types allow the Kubelet to change the ownership of that volume to be owned by the pod: \n 1. The owning GID will be the FSGroup 2. The setgid bit is set (new files created in the volume will be owned by FSGroup) 3. The permission bits are OR'd with rw-rw---- \n If unset, the Kubelet will not modify the ownership and permissions of any volume." - format: int64 - type: integer - fsGroupChangePolicy: - description: 'fsGroupChangePolicy defines behavior of changing ownership and permission of the volume before being exposed inside Pod. This field will only apply to volume types which support fsGroup based ownership(and permissions). It will have no effect on ephemeral volume types such as: secret, configmaps and emptydir. Valid values are "OnRootMismatch" and "Always". If not specified defaults to "Always".' - type: string - runAsGroup: - description: The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. - format: int64 - type: integer - runAsNonRoot: - description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. - type: boolean - runAsUser: - description: The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. - format: int64 - type: integer - seLinuxOptions: - description: The SELinux context to be applied to all containers. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. - properties: - level: - description: Level is SELinux level label that applies to the container. - type: string - role: - description: Role is a SELinux role label that applies to the container. - type: string - type: - description: Type is a SELinux type label that applies to the container. - type: string - user: - description: User is a SELinux user label that applies to the container. + required: + - name + type: object + image: + description: Image defines the Tenant Docker image. + type: string + imagePullPolicy: + description: Image pull policy. One of Always, Never, IfNotPresent. + This is applied to MinIO pods only. Refer Kubernetes documentation + for details https://kubernetes.io/docs/concepts/containers/images#updating-images + type: string + imagePullSecret: + description: ImagePullSecret defines the secret to be used for pull + image from a private Docker image. + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + type: object + kes: + description: KES is for setting up minio/kes as MinIO KMS + properties: + annotations: + additionalProperties: type: string - type: object - supplementalGroups: - description: A list of groups applied to the first process run in each container, in addition to the container's primary GID. If unspecified, no groups will be added to any container. - items: - format: int64 - type: integer - type: array - sysctls: - description: Sysctls hold a list of namespaced sysctls used for the pod. Pods with unsupported sysctls (by the container runtime) might fail to launch. - items: - description: Sysctl defines a kernel parameter to be set + description: If provided, use these annotations for KES Object + Meta annotations + type: object + clientCertSecret: + description: ClientCertSecret allows a user to specify a custom + root certificate, client certificate and client private key. + This is used for adding client certificates on KES --> used + for KES authentication against Vault or other KMS that supports + mTLS. properties: name: - description: Name of a property to set type: string - value: - description: Value of a property to set + type: type: string required: - name - - value type: object - type: array - windowsOptions: - description: The Windows specific settings applied to all containers. If unspecified, the options within a container's SecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. - properties: - gmsaCredentialSpec: - description: GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name of the GMSA credential spec to use. + externalCertSecret: + description: ExternalCertSecret allows a user to specify custom + CA certificate, and private key for group replication SSL. + properties: + name: + type: string + type: + type: string + required: + - name + type: object + image: + description: Image defines the Tenant KES Docker image. + type: string + imagePullPolicy: + description: Image pull policy. One of Always, Never, IfNotPresent. + This is applied to KES pods only. Refer Kubernetes documentation + for details https://kubernetes.io/docs/concepts/containers/images#updating-images + type: string + kesSecret: + description: This kesSecret serves as the configuration for KES + This is a mandatory field + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + type: object + labels: + additionalProperties: type: string - runAsUserName: - description: The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + description: If provided, use these labels for KES Object Meta + labels + type: object + nodeSelector: + additionalProperties: type: string - type: object - type: object - serviceAccountName: - description: ServiceAccountName is the name of the ServiceAccount to use to run pods of all MinIO Pods created as a part of this Tenant. - type: string - subPath: - description: Subpath inside mount path. This is the directory where MinIO stores data. Default to "" (empty) - type: string - zones: - description: Definition for Cluster in given MinIO cluster - items: - description: Zone defines the spec for a MinIO Zone - properties: - affinity: - description: If specified, affinity will define the pod's scheduling constraints - properties: - nodeAffinity: - description: Describes node affinity scheduling rules for the pod. - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred. - items: - description: An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op). + description: If provided, use these nodeSelector for KES Object + Meta nodeSelector + type: object + replicas: + description: Replicas defines number of pods for KES StatefulSet. + format: int32 + type: integer + serviceAccountName: + description: ServiceAccountName is the name of the ServiceAccount + to use to run pods of all KES Pods created as a part of this + Tenant. + type: string + required: + - kesSecret + type: object + mountPath: + description: Mount path for MinIO volume (PV). Defaults to /export + type: string + podManagementPolicy: + description: Pod Management Policy for pod created by StatefulSet + type: string + pools: + description: Definition for Cluster in given MinIO cluster + items: + description: Pool defines the spec for a MinIO Pool + properties: + affinity: + description: If specified, affinity will define the pod's scheduling + constraints + properties: + nodeAffinity: + description: Describes node affinity scheduling rules for + the pod. + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods + to nodes that satisfy the affinity expressions specified + by this field, but it may choose a node that violates + one or more of the expressions. The node that is most + preferred is the one with the greatest sum of weights, + i.e. for each node that meets all of the scheduling + requirements (resource request, requiredDuringScheduling + affinity expressions, etc.), compute a sum by iterating + through the elements of this field and adding "weight" + to the sum if the node matches the corresponding matchExpressions; + the node(s) with the highest sum are the most preferred. + items: + description: An empty preferred scheduling term matches + all objects with implicit weight 0 (i.e. it's a + no-op). A null preferred scheduling term matches + no objects (i.e. is also a no-op). + properties: + preference: + description: A node selector term, associated + with the corresponding weight. + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + items: + description: A node selector requirement + is a selector that contains values, a + key, and an operator that relates the + key and values. + properties: + key: + description: The label key that the + selector applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + values: + description: An array of string values. + If the operator is In or NotIn, the + values array must be non-empty. If + the operator is Exists or DoesNotExist, + the values array must be empty. If + the operator is Gt or Lt, the values + array must have a single element, + which will be interpreted as an integer. + This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + description: A list of node selector requirements + by node's fields. + items: + description: A node selector requirement + is a selector that contains values, a + key, and an operator that relates the + key and values. + properties: + key: + description: The label key that the + selector applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + values: + description: An array of string values. + If the operator is In or NotIn, the + values array must be non-empty. If + the operator is Exists or DoesNotExist, + the values array must be empty. If + the operator is Gt or Lt, the values + array must have a single element, + which will be interpreted as an integer. + This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + weight: + description: Weight associated with matching the + corresponding nodeSelectorTerm, in the range + 1-100. + format: int32 + type: integer + required: + - preference + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified + by this field are not met at scheduling time, the + pod will not be scheduled onto the node. If the affinity + requirements specified by this field cease to be met + at some point during pod execution (e.g. due to an + update), the system may or may not try to eventually + evict the pod from its node. properties: - preference: - description: A node selector term, associated with the corresponding weight. - properties: - matchExpressions: - description: A list of node selector requirements by node's labels. - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - items: + nodeSelectorTerms: + description: Required. A list of node selector terms. + The terms are ORed. + items: + description: A null or empty node selector term + matches no objects. The requirements of them + are ANDed. The TopologySelectorTerm type implements + a subset of the NodeSelectorTerm. + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + items: + description: A node selector requirement + is a selector that contains values, a + key, and an operator that relates the + key and values. + properties: + key: + description: The label key that the + selector applies to. type: string - type: array - required: - - key - - operator - type: object - type: array - matchFields: - description: A list of node selector requirements by node's fields. - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - items: + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. type: string - type: array - required: - - key - - operator - type: object - type: array - type: object - weight: - description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100. - format: int32 - type: integer + values: + description: An array of string values. + If the operator is In or NotIn, the + values array must be non-empty. If + the operator is Exists or DoesNotExist, + the values array must be empty. If + the operator is Gt or Lt, the values + array must have a single element, + which will be interpreted as an integer. + This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + description: A list of node selector requirements + by node's fields. + items: + description: A node selector requirement + is a selector that contains values, a + key, and an operator that relates the + key and values. + properties: + key: + description: The label key that the + selector applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + values: + description: An array of string values. + If the operator is In or NotIn, the + values array must be non-empty. If + the operator is Exists or DoesNotExist, + the values array must be empty. If + the operator is Gt or Lt, the values + array must have a single element, + which will be interpreted as an integer. + This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + type: array required: - - preference - - weight + - nodeSelectorTerms type: object - type: array - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node. - properties: - nodeSelectorTerms: - description: Required. A list of node selector terms. The terms are ORed. - items: - description: A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm. - properties: - matchExpressions: - description: A list of node selector requirements by node's labels. - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + podAffinity: + description: Describes pod affinity scheduling rules (e.g. + co-locate this pod in the same node, pool, etc. as some + other pod(s)). + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods + to nodes that satisfy the affinity expressions specified + by this field, but it may choose a node that violates + one or more of the expressions. The node that is most + preferred is the one with the greatest sum of weights, + i.e. for each node that meets all of the scheduling + requirements (resource request, requiredDuringScheduling + affinity expressions, etc.), compute a sum by iterating + through the elements of this field and adding "weight" + to the sum if the node has pods which matches the + corresponding podAffinityTerm; the node(s) with the + highest sum are the most preferred. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred + node(s) + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated + with the corresponding weight. + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. items: - type: string + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object type: array - required: - - key - - operator - type: object - type: array - matchFields: - description: A list of node selector requirements by node's fields. - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - items: + matchLabels: + additionalProperties: type: string - type: array - required: - - key - - operator + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are ANDed. + type: object type: object - type: array - type: object - type: array - required: - - nodeSelectorTerms - type: object - type: object - podAffinity: - description: Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)). - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. - items: - description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated with the corresponding weight. - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + items: + type: string + type: array + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose value + of the label with key topologyKey matches + that of any node on which any of the selected + pods is running. Empty topologyKey is not + allowed. + type: string + required: + - topologyKey + type: object + weight: + description: weight associated with matching the + corresponding podAffinityTerm, in the range + 1-100. + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified + by this field are not met at scheduling time, the + pod will not be scheduled onto the node. If the affinity + requirements specified by this field cease to be met + at some point during pod execution (e.g. due to a + pod label update), the system may or may not try to + eventually evict the pod from its node. When there + are multiple elements, the lists of nodes corresponding + to each podAffinityTerm are intersected, i.e. all + terms must be satisfied. + items: + description: Defines a set of pods (namely those matching + the labelSelector relative to the given namespace(s)) + that this pod should be co-located (affinity) or + not co-located (anti-affinity) with, where co-located + is defined as running on a node whose value of the + label with key matches that of any + node on which a pod of the set of pods is running + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of + label selector requirements. The requirements + are ANDed. + items: + description: A label selector requirement + is a selector that contains values, a + key, and an operator that relates the + key and values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. This + array is replaced during a strategic + merge patch. + items: type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + type: array + required: + - key + - operator type: object - type: object - namespaces: - description: namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means "this pod's namespace" - items: - type: string - type: array - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator is + "In", and the values array contains only + "value". The requirements are ANDed. + type: object + type: object + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + items: type: string - required: - - topologyKey - type: object - weight: - description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. - format: int32 - type: integer - required: - - podAffinityTerm - - weight - type: object - type: array - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. - items: - description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: array + topologyKey: + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching the labelSelector in the specified + namespaces, where co-located is defined as running + on a node whose value of the label with key + topologyKey matches that of any node on which + any of the selected pods is running. Empty topologyKey + is not allowed. + type: string + required: + - topologyKey + type: object + type: array + type: object + podAntiAffinity: + description: Describes pod anti-affinity scheduling rules + (e.g. avoid putting this pod in the same node, pool, etc. + as some other pod(s)). + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods + to nodes that satisfy the anti-affinity expressions + specified by this field, but it may choose a node + that violates one or more of the expressions. The + node that is most preferred is the one with the greatest + sum of weights, i.e. for each node that meets all + of the scheduling requirements (resource request, + requiredDuringScheduling anti-affinity expressions, + etc.), compute a sum by iterating through the elements + of this field and adding "weight" to the sum if the + node has pods which matches the corresponding podAffinityTerm; + the node(s) with the highest sum are the most preferred. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred + node(s) + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated + with the corresponding weight. + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. items: - type: string + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object type: array - required: - - key - - operator + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are ANDed. + type: object type: object - type: array - matchLabels: - additionalProperties: + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + items: + type: string + type: array + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose value + of the label with key topologyKey matches + that of any node on which any of the selected + pods is running. Empty topologyKey is not + allowed. type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - namespaces: - description: namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means "this pod's namespace" - items: + required: + - topologyKey + type: object + weight: + description: weight associated with matching the + corresponding podAffinityTerm, in the range + 1-100. + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the anti-affinity requirements specified + by this field are not met at scheduling time, the + pod will not be scheduled onto the node. If the anti-affinity + requirements specified by this field cease to be met + at some point during pod execution (e.g. due to a + pod label update), the system may or may not try to + eventually evict the pod from its node. When there + are multiple elements, the lists of nodes corresponding + to each podAffinityTerm are intersected, i.e. all + terms must be satisfied. + items: + description: Defines a set of pods (namely those matching + the labelSelector relative to the given namespace(s)) + that this pod should be co-located (affinity) or + not co-located (anti-affinity) with, where co-located + is defined as running on a node whose value of the + label with key matches that of any + node on which a pod of the set of pods is running + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of + label selector requirements. The requirements + are ANDed. + items: + description: A label selector requirement + is a selector that contains values, a + key, and an operator that relates the + key and values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator is + "In", and the values array contains only + "value". The requirements are ANDed. + type: object + type: object + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + items: + type: string + type: array + topologyKey: + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching the labelSelector in the specified + namespaces, where co-located is defined as running + on a node whose value of the label with key + topologyKey matches that of any node on which + any of the selected pods is running. Empty topologyKey + is not allowed. type: string - type: array - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. + required: + - topologyKey + type: object + type: array + type: object + type: object + name: + description: Name of the pool + type: string + nodeSelector: + additionalProperties: + type: string + description: 'NodeSelector is a selector which must be true + for the pod to fit on a node. Selector which must match a + node''s labels for the pod to be scheduled on that node. More + info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' + type: object + resources: + description: If provided, use these requests and limit for cpu/memory + resource allocation + properties: + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Limits describes the maximum amount of compute + resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Requests describes the minimum amount of compute + resources required. If Requests is omitted for a container, + it defaults to Limits if that is explicitly specified, + otherwise to an implementation-defined value. More info: + https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + type: object + servers: + description: Number of Servers in the pool + format: int32 + type: integer + tolerations: + description: Tolerations allows users to set entries like effect, + key, operator, value. + items: + description: The pod this Toleration is attached to tolerates + any taint that matches the triple using + the matching operator . + properties: + effect: + description: Effect indicates the taint effect to match. + Empty means match all taint effects. When specified, + allowed values are NoSchedule, PreferNoSchedule and + NoExecute. + type: string + key: + description: Key is the taint key that the toleration + applies to. Empty means match all taint keys. If the + key is empty, operator must be Exists; this combination + means to match all values and all keys. + type: string + operator: + description: Operator represents a key's relationship + to the value. Valid operators are Exists and Equal. + Defaults to Equal. Exists is equivalent to wildcard + for value, so that a pod can tolerate all taints of + a particular category. + type: string + tolerationSeconds: + description: TolerationSeconds represents the period of + time the toleration (which must be of effect NoExecute, + otherwise this field is ignored) tolerates the taint. + By default, it is not set, which means tolerate the + taint forever (do not evict). Zero and negative values + will be treated as 0 (evict immediately) by the system. + format: int64 + type: integer + value: + description: Value is the taint value the toleration matches + to. If the operator is Exists, the value should be empty, + otherwise just a regular string. + type: string + type: object + type: array + volumeClaimTemplate: + description: VolumeClaimTemplate allows a user to specify how + volumes inside a Tenant + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of + this representation of an object. Servers should convert + recognized schemas to the latest internal value, and may + reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST + resource this object represents. Servers may infer this + from the endpoint the client submits requests to. Cannot + be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' + type: object + spec: + description: 'Spec defines the desired characteristics of + a volume requested by a pod author. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + properties: + accessModes: + description: 'AccessModes contains the desired access + modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' + items: + type: string + type: array + dataSource: + description: 'This field can be used to specify either: + * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot + - Beta) * An existing PVC (PersistentVolumeClaim) + * An existing custom resource/object that implements + data population (Alpha) In order to use VolumeSnapshot + object types, the appropriate feature gate must be + enabled (VolumeSnapshotDataSource or AnyVolumeDataSource) + If the provisioner or an external controller can support + the specified data source, it will create a new volume + based on the contents of the specified data source. + If the specified data source is not supported, the + volume will not be created and the failure will be + reported as an event. In the future, we plan to support + more data source types and the behavior of the provisioner + may change.' + properties: + apiGroup: + description: APIGroup is the group for the resource + being referenced. If APIGroup is not specified, + the specified Kind must be in the core API group. + For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being + referenced + type: string + name: + description: Name is the name of resource being + referenced type: string required: - - topologyKey + - kind + - name type: object - type: array - type: object - podAntiAffinity: - description: Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)). - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. - items: - description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) + resources: + description: 'Resources represents the minimum resources + the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources' properties: - podAffinityTerm: - description: Required. A pod affinity term, associated with the corresponding weight. - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - namespaces: - description: namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means "this pod's namespace" - items: - type: string - type: array - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - required: - - topologyKey + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Limits describes the maximum amount + of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Requests describes the minimum amount + of compute resources required. If Requests is + omitted for a container, it defaults to Limits + if that is explicitly specified, otherwise to + an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' type: object - weight: - description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. - format: int32 - type: integer - required: - - podAffinityTerm - - weight type: object - type: array - requiredDuringSchedulingIgnoredDuringExecution: - description: If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. - items: - description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running + selector: + description: A label query over volumes to consider + for binding. properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - namespaces: - description: namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means "this pod's namespace" + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are ANDed. items: - type: string + description: A label selector requirement is a + selector that contains values, a key, and an + operator that relates the key and values. + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: operator represents a key's relationship + to a set of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. If the + operator is Exists or DoesNotExist, the + values array must be empty. This array is + replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object type: array - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - required: - - topologyKey + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator is "In", + and the values array contains only "value". The + requirements are ANDed. + type: object type: object - type: array - type: object - type: object - name: - description: Name of the zone + storageClassName: + description: 'Name of the StorageClass required by the + claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' + type: string + volumeMode: + description: volumeMode defines what type of volume + is required by the claim. Value of Filesystem is implied + when not included in claim spec. + type: string + volumeName: + description: VolumeName is the binding reference to + the PersistentVolume backing this claim. + type: string + type: object + status: + description: 'Status represents the current information/status + of a persistent volume claim. Read-only. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + properties: + accessModes: + description: 'AccessModes contains the actual access + modes the volume backing the PVC has. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' + items: + type: string + type: array + capacity: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Represents the actual resources of the + underlying volume. + type: object + conditions: + description: Current Condition of persistent volume + claim. If underlying persistent volume is being resized + then the Condition will be set to 'ResizeStarted'. + items: + description: PersistentVolumeClaimCondition contails + details about state of pvc + properties: + lastProbeTime: + description: Last time we probed the condition. + format: date-time + type: string + lastTransitionTime: + description: Last time the condition transitioned + from one status to another. + format: date-time + type: string + message: + description: Human-readable message indicating + details about last transition. + type: string + reason: + description: Unique, this should be a short, machine + understandable string that gives the reason + for condition's last transition. If it reports + "ResizeStarted" that means the underlying persistent + volume is being resized. + type: string + status: + type: string + type: + description: PersistentVolumeClaimConditionType + is a valid value of PersistentVolumeClaimCondition.Type + type: string + required: + - status + - type + type: object + type: array + phase: + description: Phase represents the current phase of PersistentVolumeClaim. + type: string + type: object + type: object + volumesPerServer: + description: Number of persistent volumes that will be attached + per server + format: int32 + type: integer + required: + - servers + - volumeClaimTemplate + - volumesPerServer + type: object + type: array + priorityClassName: + description: PriorityClassName indicates the Pod priority and hence + importance of a Pod relative to other Pods. This is applied to MinIO + pods only. Refer Kubernetes documentation for details https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass + type: string + requestAutoCert: + description: 'RequestAutoCert allows user to enable Kubernetes based + TLS cert generation and signing as explained here: https://kubernetes.io/docs/tasks/tls/managing-tls-in-a-cluster/' + type: boolean + s3: + description: S3 related features can be disabled or enabled such as + `bucketDNS` etc. + properties: + bucketDNS: + description: BucketDNS if 'true' means Buckets can be accessed + using `.minio.default.svc.cluster.local` + type: boolean + required: + - bucketDNS + type: object + securityContext: + description: Security Context allows user to set entries like runAsUser, + privilege escalation etc. + properties: + fsGroup: + description: "A special supplemental group that applies to all + containers in a pod. Some volume types allow the Kubelet to + change the ownership of that volume to be owned by the pod: + \n 1. The owning GID will be the FSGroup 2. The setgid bit is + set (new files created in the volume will be owned by FSGroup) + 3. The permission bits are OR'd with rw-rw---- \n If unset, + the Kubelet will not modify the ownership and permissions of + any volume." + format: int64 + type: integer + fsGroupChangePolicy: + description: 'fsGroupChangePolicy defines behavior of changing + ownership and permission of the volume before being exposed + inside Pod. This field will only apply to volume types which + support fsGroup based ownership(and permissions). It will have + no effect on ephemeral volume types such as: secret, configmaps + and emptydir. Valid values are "OnRootMismatch" and "Always". + If not specified defaults to "Always".' type: string - nodeSelector: - additionalProperties: - type: string - description: 'NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node''s labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' - type: object - resources: - description: If provided, use these requests and limit for cpu/memory resource allocation + runAsGroup: + description: The GID to run the entrypoint of the container process. + Uses runtime default if unset. May also be set in SecurityContext. If + set in both SecurityContext and PodSecurityContext, the value + specified in SecurityContext takes precedence for that container. + format: int64 + type: integer + runAsNonRoot: + description: Indicates that the container must run as a non-root + user. If true, the Kubelet will validate the image at runtime + to ensure that it does not run as UID 0 (root) and fail to start + the container if it does. If unset or false, no such validation + will be performed. May also be set in SecurityContext. If set + in both SecurityContext and PodSecurityContext, the value specified + in SecurityContext takes precedence. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container process. + Defaults to user specified in image metadata if unspecified. + May also be set in SecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence for that container. + format: int64 + type: integer + seLinuxOptions: + description: The SELinux context to be applied to all containers. + If unspecified, the container runtime will allocate a random + SELinux context for each container. May also be set in SecurityContext. If + set in both SecurityContext and PodSecurityContext, the value + specified in SecurityContext takes precedence for that container. properties: - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object + level: + description: Level is SELinux level label that applies to + the container. + type: string + role: + description: Role is a SELinux role label that applies to + the container. + type: string + type: + description: Type is a SELinux type label that applies to + the container. + type: string + user: + description: User is a SELinux user label that applies to + the container. + type: string type: object - servers: - description: Number of Servers in the zone - format: int32 - type: integer - tolerations: - description: Tolerations allows users to set entries like effect, key, operator, value. + supplementalGroups: + description: A list of groups applied to the first process run + in each container, in addition to the container's primary GID. If + unspecified, no groups will be added to any container. items: - description: The pod this Toleration is attached to tolerates any taint that matches the triple using the matching operator . + format: int64 + type: integer + type: array + sysctls: + description: Sysctls hold a list of namespaced sysctls used for + the pod. Pods with unsupported sysctls (by the container runtime) + might fail to launch. + items: + description: Sysctl defines a kernel parameter to be set properties: - effect: - description: Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys. - type: string - operator: - description: Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category. + name: + description: Name of a property to set type: string - tolerationSeconds: - description: TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system. - format: int64 - type: integer value: - description: Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string. + description: Value of a property to set type: string + required: + - name + - value type: object type: array - volumeClaimTemplate: - description: VolumeClaimTemplate allows a user to specify how volumes inside a Tenant + windowsOptions: + description: The Windows specific settings applied to all containers. + If unspecified, the options within a container's SecurityContext + will be used. If set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission + webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec named by + the GMSACredentialSpecName field. type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the GMSA + credential spec to use. + type: string + runAsUserName: + description: The UserName in Windows to run the entrypoint + of the container process. Defaults to the user specified + in image metadata if unspecified. May also be set in PodSecurityContext. + If set in both SecurityContext and PodSecurityContext, the + value specified in SecurityContext takes precedence. type: string - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - type: object - spec: - description: 'Spec defines the desired characteristics of a volume requested by a pod author. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' - properties: - accessModes: - description: 'AccessModes contains the desired access modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' - items: - type: string - type: array - dataSource: - description: 'This field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot - Beta) * An existing PVC (PersistentVolumeClaim) * An existing custom resource/object that implements data population (Alpha) In order to use VolumeSnapshot object types, the appropriate feature gate must be enabled (VolumeSnapshotDataSource or AnyVolumeDataSource) If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source. If the specified data source is not supported, the volume will not be created and the failure will be reported as an event. In the future, we plan to support more data source types and the behavior of the provisioner may change.' - properties: - apiGroup: - description: APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - resources: - description: 'Resources represents the minimum resources the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources' - properties: - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - type: object - selector: - description: A label query over volumes to consider for binding. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - storageClassName: - description: 'Name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' - type: string - volumeMode: - description: volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec. - type: string - volumeName: - description: VolumeName is the binding reference to the PersistentVolume backing this claim. - type: string - type: object - status: - description: 'Status represents the current information/status of a persistent volume claim. Read-only. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' - properties: - accessModes: - description: 'AccessModes contains the actual access modes the volume backing the PVC has. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' - items: - type: string - type: array - capacity: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: Represents the actual resources of the underlying volume. - type: object - conditions: - description: Current Condition of persistent volume claim. If underlying persistent volume is being resized then the Condition will be set to 'ResizeStarted'. - items: - description: PersistentVolumeClaimCondition contails details about state of pvc - properties: - lastProbeTime: - description: Last time we probed the condition. - format: date-time - type: string - lastTransitionTime: - description: Last time the condition transitioned from one status to another. - format: date-time - type: string - message: - description: Human-readable message indicating details about last transition. - type: string - reason: - description: Unique, this should be a short, machine understandable string that gives the reason for condition's last transition. If it reports "ResizeStarted" that means the underlying persistent volume is being resized. - type: string - status: - type: string - type: - description: PersistentVolumeClaimConditionType is a valid value of PersistentVolumeClaimCondition.Type - type: string - required: - - status - - type - type: object - type: array - phase: - description: Phase represents the current phase of PersistentVolumeClaim. - type: string - type: object type: object - volumesPerServer: - description: Number of persistent volumes that will be attached per server - format: int32 - type: integer - required: - - servers - - volumeClaimTemplate - - volumesPerServer type: object - type: array - required: - - zones - type: object - status: - description: Status provides details of the state of the Tenant - properties: - availableReplicas: - format: int32 - type: integer - currentState: - type: string - required: - - availableReplicas - - currentState - type: object - required: - - spec - type: object - version: v1 - versions: - - name: v1 + serviceAccountName: + description: ServiceAccountName is the name of the ServiceAccount + to use to run pods of all MinIO Pods created as a part of this Tenant. + type: string + subPath: + description: Subpath inside mount path. This is the directory where + MinIO stores data. Default to "" (empty) + type: string + required: + - pools + type: object + status: + description: Status provides details of the state of the Tenant + properties: + availableReplicas: + format: int32 + type: integer + currentState: + type: string + required: + - availableReplicas + - currentState + type: object + required: + - spec + type: object served: true storage: true + subresources: + status: {} status: acceptedNames: kind: "" diff --git a/pkg/apis/minio.min.io/v1/constants.go b/pkg/apis/minio.min.io/v1/constants.go index f55a1b5de34..6472e8e672d 100644 --- a/pkg/apis/minio.min.io/v1/constants.go +++ b/pkg/apis/minio.min.io/v1/constants.go @@ -55,8 +55,8 @@ const OperatorLabel = "v1.min.io/version" // TenantLabel is applied to all components of a Tenant cluster const TenantLabel = "v1.min.io/tenant" -// ZoneLabel is applied to all components in a Zone of a Tenant cluster -const ZoneLabel = "v1.min.io/zone" +// PoolLabel is applied to all components in a Pool of a Tenant cluster +const PoolLabel = "v1.min.io/pool" // MinIOPort specifies the default Tenant port number. const MinIOPort = 9000 @@ -98,8 +98,8 @@ const DefaultServers = 1 // DefaultVolumesPerServer specifies the default number of volumes per MinIO Tenant const DefaultVolumesPerServer = 1 -// DefaultZoneName specifies the default zone name -const DefaultZoneName = "zone-0" +// DefaultPoolName specifies the default pool name +const DefaultPoolName = "pool-0" // Console Related Constants diff --git a/pkg/apis/minio.min.io/v1/helper.go b/pkg/apis/minio.min.io/v1/helper.go index 1e42b721afd..6fee37fca8c 100644 --- a/pkg/apis/minio.min.io/v1/helper.go +++ b/pkg/apis/minio.min.io/v1/helper.go @@ -157,15 +157,15 @@ func (t *Tenant) AutoCert() bool { return *t.Spec.RequestAutoCert } -// VolumePathForZone returns the paths for MinIO mounts based on -// total number of volumes on a given zone -func (t *Tenant) VolumePathForZone(zone *Zone) string { - if zone.VolumesPerServer == 1 { +// VolumePathForPool returns the paths for MinIO mounts based on +// total number of volumes on a given pool +func (t *Tenant) VolumePathForPool(pool *Pool) string { + if pool.VolumesPerServer == 1 { // Add an extra "/" to make sure relative paths are avoided. return path.Join("/", t.Spec.Mountpath, "/", t.Spec.Subpath) } // Add an extra "/" to make sure relative paths are avoided. - return path.Join("/", t.Spec.Mountpath+genEllipsis(0, int(zone.VolumesPerServer-1)), "/", t.Spec.Subpath) + return path.Join("/", t.Spec.Mountpath+genEllipsis(0, int(pool.VolumesPerServer-1)), "/", t.Spec.Subpath) } // KESReplicas returns the number of total KES replicas @@ -275,11 +275,11 @@ func (t *Tenant) EnsureDefaults() *Tenant { t.Spec.ImagePullPolicy = DefaultImagePullPolicy } - for zi, z := range t.Spec.Zones { + for zi, z := range t.Spec.Pools { if z.Name == "" { - z.Name = fmt.Sprintf("zone-%d", zi) + z.Name = fmt.Sprintf("pool-%d", zi) } - t.Spec.Zones[zi] = z + t.Spec.Pools[zi] = z } if t.Spec.Mountpath == "" { @@ -360,11 +360,11 @@ func (t *Tenant) MinIOEndpoints(hostsTemplate string) (endpoints []string) { // MinIOHosts returns the domain names in ellipses format created for current Tenant func (t *Tenant) MinIOHosts() (hosts []string) { // Create the ellipses style URL - for _, z := range t.Spec.Zones { + for _, z := range t.Spec.Pools { if z.Servers == 1 { - hosts = append(hosts, fmt.Sprintf("%s-%s.%s.%s.svc.%s", t.MinIOStatefulSetNameForZone(&z), "0", t.MinIOHLServiceName(), t.Namespace, ClusterDomain)) + hosts = append(hosts, fmt.Sprintf("%s-%s.%s.%s.svc.%s", t.MinIOStatefulSetNameForPool(&z), "0", t.MinIOHLServiceName(), t.Namespace, ClusterDomain)) } else { - hosts = append(hosts, fmt.Sprintf("%s-%s.%s.%s.svc.%s", t.MinIOStatefulSetNameForZone(&z), genEllipsis(0, int(z.Servers)-1), t.MinIOHLServiceName(), t.Namespace, ClusterDomain)) + hosts = append(hosts, fmt.Sprintf("%s-%s.%s.%s.svc.%s", t.MinIOStatefulSetNameForPool(&z), genEllipsis(0, int(z.Servers)-1), t.MinIOHLServiceName(), t.Namespace, ClusterDomain)) } } return hosts @@ -380,10 +380,10 @@ func (t *Tenant) TemplatedMinIOHosts(hostsTemplate string) (hosts []string) { } var max, index int32 // Create the ellipses style URL - for _, z := range t.Spec.Zones { + for _, z := range t.Spec.Pools { max = max + z.Servers data := hostsTemplateValues{ - StatefulSet: t.MinIOStatefulSetNameForZone(&z), + StatefulSet: t.MinIOStatefulSetNameForPool(&z), CIService: t.MinIOCIServiceName(), HLService: t.MinIOHLServiceName(), Ellipsis: genEllipsis(int(index), int(max)-1), @@ -419,7 +419,7 @@ func (t *Tenant) ConsoleServerHost() string { // MinIOHeadlessServiceHost returns headless service Host for current Tenant func (t *Tenant) MinIOHeadlessServiceHost() string { - if t.Spec.Zones[0].Servers == 1 { + if t.Spec.Pools[0].Servers == 1 { msg := "Please set the server count > 1" klog.V(2).Infof(msg) return "" @@ -657,27 +657,27 @@ func (t *Tenant) CreateConsoleUser(madmClnt *madmin.AdminClient, consoleSecret m return madmClnt.SetPolicy(context.Background(), ConsoleAdminPolicyName, string(consoleAccessKey), false) } -// Validate validate single zone as per MinIO deployment requirements -func (z *Zone) Validate(zi int) error { - // Make sure the replicas are not 0 on any zone +// Validate validate single pool as per MinIO deployment requirements +func (z *Pool) Validate(zi int) error { + // Make sure the replicas are not 0 on any pool if z.Servers <= 0 { - return fmt.Errorf("zone #%d cannot have 0 servers", zi) + return fmt.Errorf("pool #%d cannot have 0 servers", zi) } - // Make sure the zones don't have 0 volumes + // Make sure the pools don't have 0 volumes if z.VolumesPerServer <= 0 { - return fmt.Errorf("zone #%d cannot have 0 volumes per server", zi) + return fmt.Errorf("pool #%d cannot have 0 volumes per server", zi) } if z.Servers*z.VolumesPerServer < 4 { // Erasure coding has few requirements. switch z.Servers { case 1: - return fmt.Errorf("zone #%d setup must have a minimum of 4 volumes per server", zi) + return fmt.Errorf("pool #%d setup must have a minimum of 4 volumes per server", zi) case 2: - return fmt.Errorf("zone #%d setup must have a minimum of 2 volumes per server", zi) + return fmt.Errorf("pool #%d setup must have a minimum of 2 volumes per server", zi) case 3: - return fmt.Errorf("zone #%d setup must have a minimum of 2 volumes per server", zi) + return fmt.Errorf("pool #%d setup must have a minimum of 2 volumes per server", zi) } } @@ -711,17 +711,17 @@ func (z *Zone) Validate(zi int) error { // Validate returns an error if any configuration of the MinIO Tenant is invalid func (t *Tenant) Validate() error { - if t.Spec.Zones == nil { - return errors.New("zones must be configured") + if t.Spec.Pools == nil { + return errors.New("pools must be configured") } if t.Spec.CredsSecret == nil { return errors.New("please set credsSecret secret with credentials for Tenant") } - // Every zone must contain a Volume Claim Template - for zi, zone := range t.Spec.Zones { - if err := zone.Validate(zi); err != nil { + // Every pool must contain a Volume Claim Template + for zi, pool := range t.Spec.Pools { + if err := pool.Validate(zi); err != nil { return err } } diff --git a/pkg/apis/minio.min.io/v1/helper_test.go b/pkg/apis/minio.min.io/v1/helper_test.go index 6e34a91b49b..08e9f14024c 100644 --- a/pkg/apis/minio.min.io/v1/helper_test.go +++ b/pkg/apis/minio.min.io/v1/helper_test.go @@ -60,7 +60,7 @@ func TestTemplateVariables(t *testing.T) { mt := Tenant{ ObjectMeta: metav1.ObjectMeta{Name: "test"}, Spec: TenantSpec{ - Zones: []Zone{ + Pools: []Pool{ { Name: "single", Servers: int32(servers), @@ -78,7 +78,7 @@ func TestTemplateVariables(t *testing.T) { t.Run("StatefulSet", func(t *testing.T) { hosts := mt.TemplatedMinIOHosts("{{.StatefulSet}}") - assert.Contains(t, hosts, mt.MinIOStatefulSetNameForZone(&mt.Spec.Zones[0])) + assert.Contains(t, hosts, mt.MinIOStatefulSetNameForPool(&mt.Spec.Pools[0])) }) t.Run("CIService", func(t *testing.T) { diff --git a/pkg/apis/minio.min.io/v1/names.go b/pkg/apis/minio.min.io/v1/names.go index bfa04bee908..5a5c5f19aa1 100644 --- a/pkg/apis/minio.min.io/v1/names.go +++ b/pkg/apis/minio.min.io/v1/names.go @@ -41,8 +41,8 @@ const InitContainerImage = "busybox:1.32" // MinIO Related Names -// MinIOStatefulSetNameForZone returns the name for MinIO StatefulSet -func (t *Tenant) MinIOStatefulSetNameForZone(z *Zone) string { +// MinIOStatefulSetNameForPool returns the name for MinIO StatefulSet +func (t *Tenant) MinIOStatefulSetNameForPool(z *Pool) string { return fmt.Sprintf("%s-%s", t.Name, z.Name) } @@ -156,9 +156,9 @@ func (t *Tenant) ConsoleCIServiceName() string { return t.Name + ConsoleName } -// ZoneStatefulsetName returns the name of a statefulset for a given zone -func (t *Tenant) ZoneStatefulsetName(zone *Zone) string { - return fmt.Sprintf("%s-%s", t.Name, zone.Name) +// PoolStatefulsetName returns the name of a statefulset for a given pool +func (t *Tenant) PoolStatefulsetName(pool *Pool) string { + return fmt.Sprintf("%s-%s", t.Name, pool.Name) } // ConsoleVolMountName returns the name of Secret that has TLS related Info (Cert & Private Key) diff --git a/pkg/apis/minio.min.io/v1/types.go b/pkg/apis/minio.min.io/v1/types.go index 66add5e9ac3..497f7d73115 100644 --- a/pkg/apis/minio.min.io/v1/types.go +++ b/pkg/apis/minio.min.io/v1/types.go @@ -59,7 +59,7 @@ type S3Features struct { // TenantSpec is the spec for a Tenant resource type TenantSpec struct { // Definition for Cluster in given MinIO cluster - Zones []Zone `json:"zones"` + Pools []Pool `json:"pools"` // Image defines the Tenant Docker image. // +optional Image string `json:"image,omitempty"` @@ -147,12 +147,12 @@ type LocalCertificateReference struct { Type string `json:"type,omitempty"` } -// Zone defines the spec for a MinIO Zone -type Zone struct { - // Name of the zone +// Pool defines the spec for a MinIO Pool +type Pool struct { + // Name of the pool // +optional Name string `json:"name,omitempty"` - // Number of Servers in the zone + // Number of Servers in the pool Servers int32 `json:"servers"` // Number of persistent volumes that will be attached per server VolumesPerServer int32 `json:"volumesPerServer"` diff --git a/pkg/apis/minio.min.io/v1/zz_generated.deepcopy.go b/pkg/apis/minio.min.io/v1/zz_generated.deepcopy.go index 4ea7dfb989a..b8b034aa697 100644 --- a/pkg/apis/minio.min.io/v1/zz_generated.deepcopy.go +++ b/pkg/apis/minio.min.io/v1/zz_generated.deepcopy.go @@ -282,9 +282,9 @@ func (in *TenantScheduler) DeepCopy() *TenantScheduler { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *TenantSpec) DeepCopyInto(out *TenantSpec) { *out = *in - if in.Zones != nil { - in, out := &in.Zones, &out.Zones - *out = make([]Zone, len(*in)) + if in.Pools != nil { + in, out := &in.Pools, &out.Pools + *out = make([]Pool, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -389,7 +389,7 @@ func (in *TenantStatus) DeepCopy() *TenantStatus { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Zone) DeepCopyInto(out *Zone) { +func (in *Pool) DeepCopyInto(out *Pool) { *out = *in if in.VolumeClaimTemplate != nil { in, out := &in.VolumeClaimTemplate, &out.VolumeClaimTemplate @@ -419,12 +419,12 @@ func (in *Zone) DeepCopyInto(out *Zone) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Zone. -func (in *Zone) DeepCopy() *Zone { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Pool. +func (in *Pool) DeepCopy() *Pool { if in == nil { return nil } - out := new(Zone) + out := new(Pool) in.DeepCopyInto(out) return out } diff --git a/pkg/controller/cluster/main-controller.go b/pkg/controller/cluster/main-controller.go index 864f66bb874..5cfc6dbd44e 100644 --- a/pkg/controller/cluster/main-controller.go +++ b/pkg/controller/cluster/main-controller.go @@ -120,7 +120,7 @@ const ( StatusUpdatingAffinity = "Updating Pod Affinity" StatusNotOwned = "Statefulset not controlled by operator" StatusFailedAlreadyExists = "Another MinIO Tenant already exists in the namespace" - StatusInconsistentMinIOVersions = "Different versions across MinIO Zones" + StatusInconsistentMinIOVersions = "Different versions across MinIO Pools" ) // ErrMinIONotReady is the error returned when MinIO is not Ready @@ -923,7 +923,7 @@ func (c *Controller) syncHandler(key string) error { } } - // For each zone check it's stateful set + // For each pool check it's stateful set minioSecretName := tenant.Spec.CredsSecret.Name minioSecret, err := c.kubeClientSet.CoreV1().Secrets(tenant.Namespace).Get(ctx, minioSecretName, gOpts) if err != nil { @@ -936,9 +936,9 @@ func (c *Controller) syncHandler(key string) error { } var currentSetup int - for _, zone := range tenant.Spec.Zones { + for _, pool := range tenant.Spec.Pools { // Get the StatefulSet with the name specified in Tenant.spec - if _, serr := c.statefulSetLister.StatefulSets(tenant.Namespace).Get(tenant.ZoneStatefulsetName(&zone)); serr != nil { + if _, serr := c.statefulSetLister.StatefulSets(tenant.Namespace).Get(tenant.PoolStatefulsetName(&pool)); serr != nil { if k8serrors.IsNotFound(serr) { currentSetup++ continue @@ -947,27 +947,27 @@ func (c *Controller) syncHandler(key string) error { } } - // For each zone check if there is a stateful set + // For each pool check if there is a stateful set var totalReplicas int32 var images []string // Check if this is fresh setup not an expansion. - freshSetup := len(tenant.Spec.Zones) == currentSetup + freshSetup := len(tenant.Spec.Pools) == currentSetup - for _, zone := range tenant.Spec.Zones { + for _, pool := range tenant.Spec.Pools { // Get the StatefulSet with the name specified in Tenant.spec - ss, err := c.statefulSetLister.StatefulSets(tenant.Namespace).Get(tenant.ZoneStatefulsetName(&zone)) + ss, err := c.statefulSetLister.StatefulSets(tenant.Namespace).Get(tenant.PoolStatefulsetName(&pool)) if err != nil { if !k8serrors.IsNotFound(err) { return err } - klog.Infof("Deploying zone %s", zone.Name) + klog.Infof("Deploying pool %s", pool.Name) - // Check healthcheck for previous zone only if its not a fresh setup, - // if they are online before adding this zone. + // Check healthcheck for previous pool only if its not a fresh setup, + // if they are online before adding this pool. if !freshSetup && !tenant.MinIOHealthCheck() { - klog.Infof("Deploying zone failed %s", zone.Name) + klog.Infof("Deploying pool failed %s", pool.Name) return ErrMinIONotReady } @@ -1001,7 +1001,7 @@ func (c *Controller) syncHandler(key string) error { return err } - ss = statefulsets.NewForMinIOZone(tenant, secret, &zone, hlSvc.Name, c.hostsTemplate, c.operatorVersion) + ss = statefulsets.NewForMinIOPool(tenant, secret, &pool, hlSvc.Name, c.hostsTemplate, c.operatorVersion) ss, err = c.kubeClientSet.AppsV1().StatefulSets(tenant.Namespace).Create(ctx, ss, cOpts) if err != nil { return err @@ -1014,30 +1014,30 @@ func (c *Controller) syncHandler(key string) error { adminClnt.ServiceRestart(ctx) //nolint:errcheck } } else { - if zone.Servers != *ss.Spec.Replicas { - // warn the user that replica count of an existing zone can't be changed - if tenant, err = c.updateTenantStatus(ctx, tenant, fmt.Sprintf("Can't modify server count for zone %s", zone.Name), 0); err != nil { + if pool.Servers != *ss.Spec.Replicas { + // warn the user that replica count of an existing pool can't be changed + if tenant, err = c.updateTenantStatus(ctx, tenant, fmt.Sprintf("Can't modify server count for pool %s", pool.Name), 0); err != nil { return err } } - if zone.Resources.String() != ss.Spec.Template.Spec.Containers[0].Resources.String() { + if pool.Resources.String() != ss.Spec.Template.Spec.Containers[0].Resources.String() { if tenant, err = c.updateTenantStatus(ctx, tenant, StatusUpdatingResourceRequirements, ss.Status.Replicas); err != nil { return err } - klog.V(4).Infof("resource requirements updates for zone %s", zone.Name) - ss = statefulsets.NewForMinIOZone(tenant, secret, &zone, hlSvc.Name, c.hostsTemplate, c.operatorVersion) + klog.V(4).Infof("resource requirements updates for pool %s", pool.Name) + ss = statefulsets.NewForMinIOPool(tenant, secret, &pool, hlSvc.Name, c.hostsTemplate, c.operatorVersion) if ss, err = c.kubeClientSet.AppsV1().StatefulSets(tenant.Namespace).Update(ctx, ss, uOpts); err != nil { return err } } - if zone.Affinity.String() != ss.Spec.Template.Spec.Affinity.String() { + if pool.Affinity.String() != ss.Spec.Template.Spec.Affinity.String() { if tenant, err = c.updateTenantStatus(ctx, tenant, StatusUpdatingAffinity, ss.Status.Replicas); err != nil { return err } - klog.V(4).Infof("affinity update for zone %s", zone.Name) - ss = statefulsets.NewForMinIOZone(tenant, secret, &zone, hlSvc.Name, c.hostsTemplate, c.operatorVersion) + klog.V(4).Infof("affinity update for pool %s", pool.Name) + ss = statefulsets.NewForMinIOPool(tenant, secret, &pool, hlSvc.Name, c.hostsTemplate, c.operatorVersion) if ss, err = c.kubeClientSet.AppsV1().StatefulSets(tenant.Namespace).Update(ctx, ss, uOpts); err != nil { return err } @@ -1062,20 +1062,20 @@ func (c *Controller) syncHandler(key string) error { images = append(images, ss.Spec.Template.Spec.Containers[0].Image) } - // compare all the images across all zones, they should always be the same. + // compare all the images across all pools, they should always be the same. for _, image := range images { for i := 0; i < len(images); i++ { if image != images[i] { if _, err = c.updateTenantStatus(ctx, tenant, StatusInconsistentMinIOVersions, totalReplicas); err != nil { return err } - return fmt.Errorf("Zone %d is running incorrect image version, all zones are required to be on the same MinIO version. Attempting update of the inconsistent zone", + return fmt.Errorf("Pool %d is running incorrect image version, all pools are required to be on the same MinIO version. Attempting update of the inconsistent pool", i+1) } } } - // In loop above we compared all the versions in all zones. + // In loop above we compared all the versions in all pools. // So comparing tenant.Spec.Image (version to update to) against one value from images slice is fine. if tenant.Spec.Image != images[0] && tenant.Status.CurrentState != StatusUpdatingMinIOVersion { if !tenant.MinIOHealthCheck() { @@ -1148,9 +1148,9 @@ func (c *Controller) syncHandler(key string) error { // clean the local directory _ = c.removeArtifacts() - for _, zone := range tenant.Spec.Zones { + for _, pool := range tenant.Spec.Pools { // Now proceed to make the yaml changes for the tenant statefulset. - ss := statefulsets.NewForMinIOZone(tenant, secret, &zone, hlSvc.Name, c.hostsTemplate, c.operatorVersion) + ss := statefulsets.NewForMinIOPool(tenant, secret, &pool, hlSvc.Name, c.hostsTemplate, c.operatorVersion) if _, err = c.kubeClientSet.AppsV1().StatefulSets(tenant.Namespace).Update(ctx, ss, uOpts); err != nil { return err } diff --git a/pkg/resources/statefulsets/minio-statefulset.go b/pkg/resources/statefulsets/minio-statefulset.go index 35137f6241f..c41d685dcd0 100644 --- a/pkg/resources/statefulsets/minio-statefulset.go +++ b/pkg/resources/statefulsets/minio-statefulset.go @@ -138,7 +138,7 @@ func minioEnvironmentVars(t *miniov1.Tenant, wsSecret *v1.Secret, hostsTemplate // Returns the MinIO pods metadata set in configuration. // If a user specifies metadata in the spec we return that // metadata. -func minioPodMetadata(t *miniov1.Tenant, zone *miniov1.Zone, opVersion string) metav1.ObjectMeta { +func minioPodMetadata(t *miniov1.Tenant, pool *miniov1.Pool, opVersion string) metav1.ObjectMeta { meta := metav1.ObjectMeta{} // Copy Labels and Annotations from Tenant meta.Labels = t.ObjectMeta.Labels @@ -151,38 +151,38 @@ func minioPodMetadata(t *miniov1.Tenant, zone *miniov1.Zone, opVersion string) m for k, v := range t.MinIOPodLabels() { meta.Labels[k] = v } - // Add information labels, such as which zone we are building this pod about - meta.Labels[miniov1.ZoneLabel] = zone.Name + // Add information labels, such as which pool we are building this pod about + meta.Labels[miniov1.PoolLabel] = pool.Name meta.Labels[miniov1.OperatorLabel] = opVersion return meta } // ContainerMatchLabels Returns the labels that match the Pods in the statefulset -func ContainerMatchLabels(t *miniov1.Tenant, zone *miniov1.Zone) *metav1.LabelSelector { +func ContainerMatchLabels(t *miniov1.Tenant, pool *miniov1.Pool) *metav1.LabelSelector { labels := t.MinIOPodLabels() - // Add zone information so it's passed down to the underlying PVCs - labels[miniov1.ZoneLabel] = zone.Name + // Add pool information so it's passed down to the underlying PVCs + labels[miniov1.PoolLabel] = pool.Name return &metav1.LabelSelector{ MatchLabels: labels, } } // Builds the volume mounts for MinIO container. -func volumeMounts(t *miniov1.Tenant, zone *miniov1.Zone) (mounts []corev1.VolumeMount) { - // This is the case where user didn't provide a zone and we deploy a EmptyDir based +func volumeMounts(t *miniov1.Tenant, pool *miniov1.Pool) (mounts []corev1.VolumeMount) { + // This is the case where user didn't provide a pool and we deploy a EmptyDir based // single node single drive (FS) MinIO deployment name := miniov1.MinIOVolumeName - if zone.VolumeClaimTemplate != nil { - name = zone.VolumeClaimTemplate.Name + if pool.VolumeClaimTemplate != nil { + name = pool.VolumeClaimTemplate.Name } - if zone.VolumesPerServer == 1 { + if pool.VolumesPerServer == 1 { mounts = append(mounts, corev1.VolumeMount{ Name: name + strconv.Itoa(0), MountPath: t.Spec.Mountpath, }) } else { - for i := 0; i < int(zone.VolumesPerServer); i++ { + for i := 0; i < int(pool.VolumesPerServer); i++ { mounts = append(mounts, corev1.VolumeMount{ Name: name + strconv.Itoa(i), MountPath: t.Spec.Mountpath + strconv.Itoa(i), @@ -201,7 +201,7 @@ func volumeMounts(t *miniov1.Tenant, zone *miniov1.Zone) (mounts []corev1.Volume } // Builds the MinIO container for a Tenant. -func zoneMinioServerContainer(t *miniov1.Tenant, wsSecret *v1.Secret, zone *miniov1.Zone, hostsTemplate string, opVersion string) corev1.Container { +func poolMinioServerContainer(t *miniov1.Tenant, wsSecret *v1.Secret, pool *miniov1.Pool, hostsTemplate string, opVersion string) corev1.Container { args := []string{"server", "--certs-dir", miniov1.MinIOCertPath} return corev1.Container{ @@ -213,29 +213,29 @@ func zoneMinioServerContainer(t *miniov1.Tenant, wsSecret *v1.Secret, zone *mini }, }, ImagePullPolicy: t.Spec.ImagePullPolicy, - VolumeMounts: volumeMounts(t, zone), + VolumeMounts: volumeMounts(t, pool), Args: args, Env: minioEnvironmentVars(t, wsSecret, hostsTemplate, opVersion), - Resources: zone.Resources, + Resources: pool.Resources, } } // GetContainerArgs returns the arguments that the MinIO container receives func GetContainerArgs(t *miniov1.Tenant, hostsTemplate string) []string { var args []string - if len(t.Spec.Zones) == 1 && t.Spec.Zones[0].Servers == 1 { + if len(t.Spec.Pools) == 1 && t.Spec.Pools[0].Servers == 1 { // to run in standalone mode we must pass the path - args = append(args, t.VolumePathForZone(&t.Spec.Zones[0])) + args = append(args, t.VolumePathForPool(&t.Spec.Pools[0])) } else { for index, endpoint := range t.MinIOEndpoints(hostsTemplate) { - args = append(args, fmt.Sprintf("%s%s", endpoint, t.VolumePathForZone(&t.Spec.Zones[index]))) + args = append(args, fmt.Sprintf("%s%s", endpoint, t.VolumePathForPool(&t.Spec.Pools[index]))) } } return args } -// Builds the tolerations for a Zone. -func minioZoneTolerations(z *miniov1.Zone) []corev1.Toleration { +// Builds the tolerations for a Pool. +func minioPoolTolerations(z *miniov1.Pool) []corev1.Toleration { var tolerations []corev1.Toleration return append(tolerations, z.Tolerations...) } @@ -249,10 +249,10 @@ func minioSecurityContext(t *miniov1.Tenant) *corev1.PodSecurityContext { return &securityContext } -// NewForMinIOZone creates a new StatefulSet for the given Cluster. -func NewForMinIOZone(t *miniov1.Tenant, wsSecret *v1.Secret, zone *miniov1.Zone, serviceName string, hostsTemplate, operatorVersion string) *appsv1.StatefulSet { +// NewForMinIOPool creates a new StatefulSet for the given Cluster. +func NewForMinIOPool(t *miniov1.Tenant, wsSecret *v1.Secret, pool *miniov1.Pool, serviceName string, hostsTemplate, operatorVersion string) *appsv1.StatefulSet { var podVolumes []corev1.Volume - var replicas = zone.Servers + var replicas = pool.Servers var podVolumeSources []corev1.VolumeProjection var serverCertPaths = []corev1.KeyToPath{ @@ -469,7 +469,7 @@ func NewForMinIOZone(t *miniov1.Tenant, wsSecret *v1.Secret, zone *miniov1.Zone, ssMeta := metav1.ObjectMeta{ Namespace: t.Namespace, - Name: t.ZoneStatefulsetName(zone), + Name: t.PoolStatefulsetName(pool), OwnerReferences: []metav1.OwnerReference{ *metav1.NewControllerRef(t, schema.GroupVersionKind{ Group: miniov1.SchemeGroupVersion.Group, @@ -486,12 +486,12 @@ func NewForMinIOZone(t *miniov1.Tenant, wsSecret *v1.Secret, zone *miniov1.Zone, ssMeta.Labels = make(map[string]string) } - // Add information labels, such as which zone we are building this pod about + // Add information labels, such as which pool we are building this pod about ssMeta.Labels[miniov1.TenantLabel] = t.Name - ssMeta.Labels[miniov1.ZoneLabel] = zone.Name + ssMeta.Labels[miniov1.PoolLabel] = pool.Name ssMeta.Labels[miniov1.OperatorLabel] = operatorVersion - containers := []corev1.Container{zoneMinioServerContainer(t, wsSecret, zone, hostsTemplate, operatorVersion)} + containers := []corev1.Container{poolMinioServerContainer(t, wsSecret, pool, hostsTemplate, operatorVersion)} ss := &appsv1.StatefulSet{ ObjectMeta: ssMeta, Spec: appsv1.StatefulSetSpec{ @@ -499,19 +499,19 @@ func NewForMinIOZone(t *miniov1.Tenant, wsSecret *v1.Secret, zone *miniov1.Zone, Type: miniov1.DefaultUpdateStrategy, }, PodManagementPolicy: t.Spec.PodManagementPolicy, - Selector: ContainerMatchLabels(t, zone), + Selector: ContainerMatchLabels(t, pool), ServiceName: serviceName, Replicas: &replicas, Template: corev1.PodTemplateSpec{ - ObjectMeta: minioPodMetadata(t, zone, operatorVersion), + ObjectMeta: minioPodMetadata(t, pool, operatorVersion), Spec: corev1.PodSpec{ Containers: containers, Volumes: podVolumes, RestartPolicy: corev1.RestartPolicyAlways, - Affinity: zone.Affinity, - NodeSelector: zone.NodeSelector, + Affinity: pool.Affinity, + NodeSelector: pool.NodeSelector, SchedulerName: t.Scheduler.Name, - Tolerations: minioZoneTolerations(zone), + Tolerations: minioPoolTolerations(pool), SecurityContext: minioSecurityContext(t), ServiceAccountName: t.Spec.ServiceAccountName, PriorityClassName: t.Spec.PriorityClassName, @@ -525,10 +525,10 @@ func NewForMinIOZone(t *miniov1.Tenant, wsSecret *v1.Secret, zone *miniov1.Zone, ss.Spec.Template.Spec.ImagePullSecrets = []corev1.LocalObjectReference{t.Spec.ImagePullSecret} } - if zone.VolumeClaimTemplate != nil { - pvClaim := *zone.VolumeClaimTemplate + if pool.VolumeClaimTemplate != nil { + pvClaim := *pool.VolumeClaimTemplate name := pvClaim.Name - for i := 0; i < int(zone.VolumesPerServer); i++ { + for i := 0; i < int(pool.VolumesPerServer); i++ { pvClaim.Name = name + strconv.Itoa(i) ss.Spec.VolumeClaimTemplates = append(ss.Spec.VolumeClaimTemplates, pvClaim) } diff --git a/testing/four-zones.yaml b/testing/four-zones.yaml index c1d56389450..1861bb614a5 100644 --- a/testing/four-zones.yaml +++ b/testing/four-zones.yaml @@ -10,9 +10,9 @@ data: apiVersion: minio.min.io/v1 kind: Tenant metadata: - name: four-zones + name: four-pools spec: - zones: + pools: - servers: 4 volumesPerServer: 4 volumeClaimTemplate: diff --git a/testing/one-zone-multi-disk.yaml b/testing/one-zone-multi-disk.yaml index efbc24bc483..b8bbad95969 100644 --- a/testing/one-zone-multi-disk.yaml +++ b/testing/one-zone-multi-disk.yaml @@ -10,9 +10,9 @@ data: apiVersion: minio.min.io/v1 kind: Tenant metadata: - name: one-zone-multi-disk + name: one-pool-multi-disk spec: - zones: + pools: - servers: 1 volumesPerServer: 4 volumeClaimTemplate: diff --git a/testing/one-zone-multi-svc.yaml b/testing/one-zone-multi-svc.yaml index f4d96aecd38..2603ba750aa 100644 --- a/testing/one-zone-multi-svc.yaml +++ b/testing/one-zone-multi-svc.yaml @@ -10,9 +10,9 @@ data: apiVersion: minio.min.io/v1 kind: Tenant metadata: - name: one-zone-multi-svc + name: one-pool-multi-svc spec: - zones: + pools: - servers: 1 volumesPerServer: 4 volumeClaimTemplate: diff --git a/testing/one-zone-multi-svr.yaml b/testing/one-zone-multi-svr.yaml index 53be1402f76..540a3da0129 100644 --- a/testing/one-zone-multi-svr.yaml +++ b/testing/one-zone-multi-svr.yaml @@ -10,9 +10,9 @@ data: apiVersion: minio.min.io/v1 kind: Tenant metadata: - name: one-zone-multi-svr + name: one-pool-multi-svr spec: - zones: + pools: - servers: 2 volumesPerServer: 2 volumeClaimTemplate: diff --git a/testing/one-zone.yaml b/testing/one-zone.yaml index 694f3b902b6..a55717cc41b 100644 --- a/testing/one-zone.yaml +++ b/testing/one-zone.yaml @@ -10,9 +10,9 @@ data: apiVersion: minio.min.io/v1 kind: Tenant metadata: - name: one-zone + name: one-pool spec: - zones: + pools: - servers: 1 volumesPerServer: 1 volumeClaimTemplate: diff --git a/testing/patching/add-one-zone-step-1.yaml b/testing/patching/add-one-zone-step-1.yaml index 5589409e806..739f5663ab8 100644 --- a/testing/patching/add-one-zone-step-1.yaml +++ b/testing/patching/add-one-zone-step-1.yaml @@ -10,9 +10,9 @@ data: apiVersion: minio.min.io/v1 kind: Tenant metadata: - name: add-one-zone + name: add-one-pool spec: - zones: + pools: - servers: 1 volumesPerServer: 4 volumeClaimTemplate: diff --git a/testing/patching/add-one-zone-step-2.yaml b/testing/patching/add-one-zone-step-2.yaml index e1369986dd8..c9f78697e97 100644 --- a/testing/patching/add-one-zone-step-2.yaml +++ b/testing/patching/add-one-zone-step-2.yaml @@ -10,9 +10,9 @@ data: apiVersion: minio.min.io/v1 kind: Tenant metadata: - name: add-one-zone + name: add-one-pool spec: - zones: + pools: - servers: 1 volumesPerServer: 4 volumeClaimTemplate: diff --git a/testing/patching/upgrade-one-zone-step-1.yaml b/testing/patching/upgrade-one-zone-step-1.yaml index 3202831748d..64fb6e8d0cb 100644 --- a/testing/patching/upgrade-one-zone-step-1.yaml +++ b/testing/patching/upgrade-one-zone-step-1.yaml @@ -10,10 +10,10 @@ data: apiVersion: minio.min.io/v1 kind: Tenant metadata: - name: upgrade-one-zone + name: upgrade-one-pool spec: image: minio/minio:RELEASE.2020-11-19T23-48-16Z - zones: + pools: - servers: 1 volumesPerServer: 4 volumeClaimTemplate: diff --git a/testing/patching/upgrade-one-zone-step-2.yaml b/testing/patching/upgrade-one-zone-step-2.yaml index 3202831748d..64fb6e8d0cb 100644 --- a/testing/patching/upgrade-one-zone-step-2.yaml +++ b/testing/patching/upgrade-one-zone-step-2.yaml @@ -10,10 +10,10 @@ data: apiVersion: minio.min.io/v1 kind: Tenant metadata: - name: upgrade-one-zone + name: upgrade-one-pool spec: image: minio/minio:RELEASE.2020-11-19T23-48-16Z - zones: + pools: - servers: 1 volumesPerServer: 4 volumeClaimTemplate: diff --git a/testing/patching/upgrade-two-zones-step-1.yaml b/testing/patching/upgrade-two-zones-step-1.yaml index 0c71fe4e068..f8cb8bf7764 100644 --- a/testing/patching/upgrade-two-zones-step-1.yaml +++ b/testing/patching/upgrade-two-zones-step-1.yaml @@ -10,10 +10,10 @@ data: apiVersion: minio.min.io/v1 kind: Tenant metadata: - name: upgrade-two-zones + name: upgrade-two-pools spec: image: minio/minio:RELEASE.2020-11-19T23-48-16Z - zones: + pools: - servers: 4 volumesPerServer: 4 volumeClaimTemplate: diff --git a/testing/patching/upgrade-two-zones-step-2.yaml b/testing/patching/upgrade-two-zones-step-2.yaml index 0c71fe4e068..f8cb8bf7764 100644 --- a/testing/patching/upgrade-two-zones-step-2.yaml +++ b/testing/patching/upgrade-two-zones-step-2.yaml @@ -10,10 +10,10 @@ data: apiVersion: minio.min.io/v1 kind: Tenant metadata: - name: upgrade-two-zones + name: upgrade-two-pools spec: image: minio/minio:RELEASE.2020-11-19T23-48-16Z - zones: + pools: - servers: 4 volumesPerServer: 4 volumeClaimTemplate: diff --git a/testing/two-zones-diff-disks.yaml b/testing/two-zones-diff-disks.yaml index 3cd6c4404f6..eadcf580684 100644 --- a/testing/two-zones-diff-disks.yaml +++ b/testing/two-zones-diff-disks.yaml @@ -10,9 +10,9 @@ data: apiVersion: minio.min.io/v1 kind: Tenant metadata: - name: two-zones-diff-disks + name: two-pools-diff-disks spec: - zones: + pools: - servers: 4 volumesPerServer: 2 volumeClaimTemplate: diff --git a/testing/two-zones.yaml b/testing/two-zones.yaml index 38b102485a4..462fb784ccc 100644 --- a/testing/two-zones.yaml +++ b/testing/two-zones.yaml @@ -10,9 +10,9 @@ data: apiVersion: minio.min.io/v1 kind: Tenant metadata: - name: two-zones + name: two-pools spec: - zones: + pools: - servers: 1 volumesPerServer: 4 volumeClaimTemplate: diff --git a/testing/validations/no-zones.yaml b/testing/validations/no-zones.yaml index 6e0136c85a9..31d64f11d9f 100644 --- a/testing/validations/no-zones.yaml +++ b/testing/validations/no-zones.yaml @@ -1,4 +1,4 @@ apiVersion: minio.min.io/v1 kind: Tenant metadata: - name: no-zones + name: no-pools diff --git a/testing/validations/one-zone-no-creds-secret.yaml b/testing/validations/one-zone-no-creds-secret.yaml index 9dd2ab460fc..684351181f7 100644 --- a/testing/validations/one-zone-no-creds-secret.yaml +++ b/testing/validations/one-zone-no-creds-secret.yaml @@ -1,9 +1,9 @@ apiVersion: minio.min.io/v1 kind: Tenant metadata: - name: one-zone-no-creds-secret + name: one-pool-no-creds-secret spec: - zones: + pools: - servers: 1 volumesPerServer: 1 volumeClaimTemplate: diff --git a/testing/validations/one-zone-no-vct.yaml b/testing/validations/one-zone-no-vct.yaml index c15923eca8d..ecbb3f9400c 100644 --- a/testing/validations/one-zone-no-vct.yaml +++ b/testing/validations/one-zone-no-vct.yaml @@ -1,9 +1,9 @@ apiVersion: minio.min.io/v1 kind: Tenant metadata: - name: one-zone-no-vct + name: one-pool-no-vct spec: - zones: + pools: - servers: 1 volumesPerServer: 1 diff --git a/testing/validations/one-zone-vct-no-access-mode.yaml b/testing/validations/one-zone-vct-no-access-mode.yaml index 86963eb128e..5b5220df5be 100644 --- a/testing/validations/one-zone-vct-no-access-mode.yaml +++ b/testing/validations/one-zone-vct-no-access-mode.yaml @@ -1,9 +1,9 @@ apiVersion: minio.min.io/v1 kind: Tenant metadata: - name: one-zone-vct-no-access-mode + name: one-pool-vct-no-access-mode spec: - zones: + pools: - servers: 1 volumesPerServer: 1 volumeClaimTemplate: diff --git a/testing/validations/one-zone-vct-no-request.yaml b/testing/validations/one-zone-vct-no-request.yaml index 4de6d1b3f36..4d4f0b43b47 100644 --- a/testing/validations/one-zone-vct-no-request.yaml +++ b/testing/validations/one-zone-vct-no-request.yaml @@ -1,9 +1,9 @@ apiVersion: minio.min.io/v1 kind: Tenant metadata: - name: one-zone-vct-no-request + name: one-pool-vct-no-request spec: - zones: + pools: - servers: 1 volumesPerServer: 1 volumeClaimTemplate: diff --git a/testing/validations/one-zone-vct-request-no-resources.yaml b/testing/validations/one-zone-vct-request-no-resources.yaml index 9ce5c64cbe6..4b45b44e985 100644 --- a/testing/validations/one-zone-vct-request-no-resources.yaml +++ b/testing/validations/one-zone-vct-request-no-resources.yaml @@ -1,9 +1,9 @@ apiVersion: minio.min.io/v1 kind: Tenant metadata: - name: one-zone-vct-resources-no-storage + name: one-pool-vct-resources-no-storage spec: - zones: + pools: - servers: 1 volumesPerServer: 1 volumeClaimTemplate: diff --git a/testing/validations/one-zone-vct-resources-no-storage.yaml b/testing/validations/one-zone-vct-resources-no-storage.yaml index e69f7ef5088..971ed03abb6 100644 --- a/testing/validations/one-zone-vct-resources-no-storage.yaml +++ b/testing/validations/one-zone-vct-resources-no-storage.yaml @@ -1,9 +1,9 @@ apiVersion: minio.min.io/v1 kind: Tenant metadata: - name: one-zone-vct-resources-no-storage + name: one-pool-vct-resources-no-storage spec: - zones: + pools: - servers: 1 volumesPerServer: 1 volumeClaimTemplate: diff --git a/testing/validations/one-zone-vct-resources-volume-2.yaml b/testing/validations/one-zone-vct-resources-volume-2.yaml index 352b0067deb..4275971f540 100644 --- a/testing/validations/one-zone-vct-resources-volume-2.yaml +++ b/testing/validations/one-zone-vct-resources-volume-2.yaml @@ -1,9 +1,9 @@ apiVersion: minio.min.io/v1 kind: Tenant metadata: - name: one-zone-vct-resources-volume-2 + name: one-pool-vct-resources-volume-2 spec: - zones: + pools: - servers: 1 volumesPerServer: 2 volumeClaimTemplate: diff --git a/testing/validations/one-zone-zero-servers.yaml b/testing/validations/one-zone-zero-servers.yaml index dbcf910d4de..388cdb04f70 100644 --- a/testing/validations/one-zone-zero-servers.yaml +++ b/testing/validations/one-zone-zero-servers.yaml @@ -1,8 +1,8 @@ apiVersion: minio.min.io/v1 kind: Tenant metadata: - name: one-zone-zero-servers + name: one-pool-zero-servers spec: - zones: + pools: - servers: 0 diff --git a/testing/validations/one-zone-zero-volumes.yaml b/testing/validations/one-zone-zero-volumes.yaml index 516a236726a..d52ff9c2460 100644 --- a/testing/validations/one-zone-zero-volumes.yaml +++ b/testing/validations/one-zone-zero-volumes.yaml @@ -1,9 +1,9 @@ apiVersion: minio.min.io/v1 kind: Tenant metadata: - name: one-zone-zero-volumes + name: one-pool-zero-volumes spec: - zones: + pools: - servers: 1 volumesPerServer: 0 diff --git a/testing/validations/two-zones-two-volumes-total.yaml b/testing/validations/two-zones-two-volumes-total.yaml index db56611d9f0..5f66fb9bdb6 100644 --- a/testing/validations/two-zones-two-volumes-total.yaml +++ b/testing/validations/two-zones-two-volumes-total.yaml @@ -1,9 +1,9 @@ apiVersion: minio.min.io/v1 kind: Tenant metadata: - name: two-zones-two-volumes-total + name: two-pools-two-volumes-total spec: - zones: + pools: - servers: 1 volumesPerServer: 1 volumeClaimTemplate: