From 23e0549628e3d78474d77cabc92001dd98be946e Mon Sep 17 00:00:00 2001 From: Andrew Pryde Date: Fri, 1 Jun 2018 17:27:04 +0100 Subject: [PATCH 01/15] Clean up API (WIP) --- cmd/mysql-agent/app/mysql_agent.go | 10 +- cmd/mysql-agent/app/options/options.go | 26 +- cmd/mysql-operator/app/mysql_operator.go | 14 +- .../custom-resource-definitions.yaml | 8 +- contrib/manifests/rbac.yaml | 8 +- docs/tutorial.md | 4 +- docs/user/backup.md | 19 +- docs/user/clusters.md | 16 +- docs/user/restore.md | 4 +- docs/user/router.md | 2 +- examples/backup/backup-schedule.yaml | 10 +- examples/backup/backup.yaml | 8 +- examples/cluster/cluster-with-3-replicas.yaml | 4 +- .../cluster/cluster-with-custom-config.yaml | 2 +- .../cluster/cluster-with-custom-secret.yaml | 2 +- .../cluster-with-custom-ssl-certs.yaml | 2 +- ...er-with-data-volume-and-backup-volume.yaml | 2 +- examples/cluster/cluster-with-volume.yaml | 2 +- examples/cluster/cluster.yaml | 2 +- examples/cluster/multi-master-cluster.yaml | 2 +- .../wordpress-router/wordpress-database.yaml | 2 +- .../demo/wordpress/wordpress-database.yaml | 2 +- examples/restore/restore.yaml | 2 +- mysql-operator/templates/01-resources.yaml | 8 +- pkg/apis/mysql/v1alpha1/backup.go | 160 ------- pkg/apis/mysql/v1alpha1/backupschedule.go | 102 ----- pkg/apis/mysql/v1alpha1/cluster.go | 231 ---------- pkg/apis/mysql/v1alpha1/cluster_test.go | 18 +- pkg/apis/mysql/v1alpha1/helpers.go | 124 ++++++ pkg/apis/mysql/v1alpha1/register.go | 32 +- pkg/apis/mysql/v1alpha1/restore.go | 124 ------ pkg/apis/mysql/v1alpha1/restore_test.go | 6 +- pkg/apis/mysql/v1alpha1/types.go | 412 ++++++++++++++++++ pkg/apis/mysql/v1alpha1/validate_backup.go | 12 +- .../v1alpha1/validate_backup_executor.go | 10 +- .../mysql/v1alpha1/validate_backup_storage.go | 10 +- ...backup_test.go => validate_backup_test.go} | 46 +- .../mysql/v1alpha1/validate_backupschedule.go | 2 +- ...est.go => validate_backupschedule_test.go} | 44 +- pkg/apis/mysql/v1alpha1/validate_cluster.go | 12 +- pkg/apis/mysql/v1alpha1/validate_restore.go | 2 +- .../mysql/v1alpha1/zz_generated.deepcopy.go | 334 +++++++------- pkg/backup/backup.go | 2 +- pkg/backup/executor/executor.go | 6 +- pkg/backup/executor/mysqldump/config.go | 2 +- pkg/backup/executor/mysqldump/provider.go | 2 +- pkg/backup/storage/s3/client_test.go | 4 +- pkg/backup/storage/s3/config.go | 2 +- pkg/backup/storage/s3/config_test.go | 8 +- pkg/backup/storage/s3/provider.go | 2 +- pkg/backup/storage/storage.go | 6 +- pkg/cluster/innodb/innodb.go | 2 +- pkg/cluster/instance.go | 2 +- pkg/constants/constants.go | 16 +- pkg/controllers/backup/agent_controller.go | 70 +-- pkg/controllers/backup/operator_controller.go | 48 +- pkg/controllers/backup/schedule/controller.go | 38 +- .../backup/schedule/controller_test.go | 114 ++--- pkg/controllers/cluster/cluster_control.go | 30 +- pkg/controllers/cluster/config_control.go | 2 +- pkg/controllers/cluster/controller.go | 88 ++-- pkg/controllers/cluster/controller_test.go | 132 +++--- .../cluster/labeler/cluster_labeler.go | 20 +- .../cluster/labeler/cluster_labeler_test.go | 72 +-- pkg/controllers/cluster/labeler/selectors.go | 24 +- .../cluster/labeler/selectors_test.go | 56 +-- pkg/controllers/cluster/pod_control.go | 2 +- pkg/controllers/cluster/secret_control.go | 6 +- pkg/controllers/cluster/service_control.go | 2 +- .../cluster/statefulset_control.go | 2 +- pkg/controllers/cluster/utils.go | 4 +- pkg/controllers/restore/agent_controller.go | 78 ++-- .../restore/operator_controller.go | 56 +-- .../versioned/typed/mysql/v1alpha1/backup.go | 153 +++++++ .../typed/mysql/v1alpha1/backupschedule.go | 153 +++++++ .../versioned/typed/mysql/v1alpha1/cluster.go | 153 +++++++ .../typed/mysql/v1alpha1/fake/fake_backup.go | 124 ++++++ .../v1alpha1/fake/fake_backupschedule.go | 124 ++++++ .../typed/mysql/v1alpha1/fake/fake_cluster.go | 124 ++++++ .../mysql/v1alpha1/fake/fake_mysql_client.go | 16 +- .../mysql/v1alpha1/fake/fake_mysqlbackup.go | 124 ------ .../v1alpha1/fake/fake_mysqlbackupschedule.go | 124 ------ .../mysql/v1alpha1/fake/fake_mysqlcluster.go | 124 ------ .../mysql/v1alpha1/fake/fake_mysqlrestore.go | 124 ------ .../typed/mysql/v1alpha1/fake/fake_restore.go | 124 ++++++ .../mysql/v1alpha1/generated_expansion.go | 8 +- .../typed/mysql/v1alpha1/mysql_client.go | 24 +- .../typed/mysql/v1alpha1/mysqlbackup.go | 153 ------- .../mysql/v1alpha1/mysqlbackupschedule.go | 153 ------- .../typed/mysql/v1alpha1/mysqlcluster.go | 153 ------- .../typed/mysql/v1alpha1/mysqlrestore.go | 153 ------- .../versioned/typed/mysql/v1alpha1/restore.go | 153 +++++++ .../informers/externalversions/generic.go | 16 +- .../{mysqlbackupschedule.go => backup.go} | 38 +- .../{mysqlrestore.go => backupschedule.go} | 38 +- .../v1alpha1/{mysqlcluster.go => cluster.go} | 38 +- .../mysql/v1alpha1/interface.go | 40 +- .../v1alpha1/{mysqlbackup.go => restore.go} | 38 +- .../listers/mysql/v1alpha1/backup.go | 92 ++++ .../listers/mysql/v1alpha1/backupschedule.go | 92 ++++ .../listers/mysql/v1alpha1/cluster.go | 92 ++++ .../mysql/v1alpha1/expansion_generated.go | 48 +- .../listers/mysql/v1alpha1/mysqlbackup.go | 92 ---- .../mysql/v1alpha1/mysqlbackupschedule.go | 92 ---- .../listers/mysql/v1alpha1/mysqlcluster.go | 92 ---- .../listers/mysql/v1alpha1/mysqlrestore.go | 92 ---- .../listers/mysql/v1alpha1/restore.go | 92 ++++ pkg/resources/secrets/secret.go | 8 +- pkg/resources/secrets/secret_test.go | 4 +- pkg/resources/services/service.go | 8 +- pkg/resources/statefulsets/statefulset.go | 22 +- .../statefulsets/statefulset_test.go | 28 +- pkg/util/mysqlsh/mysqlsh_test.go | 16 +- pkg/util/test/test_backup.go | 26 +- pkg/util/test/test_backupschedule.go | 28 +- test/e2e/backup_restore.go | 16 +- test/e2e/cluster_creation.go | 10 +- test/e2e/container_crash.go | 24 +- test/e2e/framework/backup.go | 76 ++-- test/e2e/framework/cluster.go | 76 ++-- test/e2e/framework/restore.go | 60 +-- test/e2e/pod_crash.go | 12 +- test/examples/examples_test.go | 36 +- 123 files changed, 3184 insertions(+), 3262 deletions(-) delete mode 100644 pkg/apis/mysql/v1alpha1/backup.go delete mode 100644 pkg/apis/mysql/v1alpha1/backupschedule.go delete mode 100644 pkg/apis/mysql/v1alpha1/cluster.go create mode 100644 pkg/apis/mysql/v1alpha1/helpers.go delete mode 100644 pkg/apis/mysql/v1alpha1/restore.go create mode 100644 pkg/apis/mysql/v1alpha1/types.go rename pkg/apis/mysql/v1alpha1/{backup_test.go => validate_backup_test.go} (81%) rename pkg/apis/mysql/v1alpha1/{backupschedule_test.go => validate_backupschedule_test.go} (81%) create mode 100644 pkg/generated/clientset/versioned/typed/mysql/v1alpha1/backup.go create mode 100644 pkg/generated/clientset/versioned/typed/mysql/v1alpha1/backupschedule.go create mode 100644 pkg/generated/clientset/versioned/typed/mysql/v1alpha1/cluster.go create mode 100644 pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_backup.go create mode 100644 pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_backupschedule.go create mode 100644 pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_cluster.go delete mode 100644 pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_mysqlbackup.go delete mode 100644 pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_mysqlbackupschedule.go delete mode 100644 pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_mysqlcluster.go delete mode 100644 pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_mysqlrestore.go create mode 100644 pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_restore.go delete mode 100644 pkg/generated/clientset/versioned/typed/mysql/v1alpha1/mysqlbackup.go delete mode 100644 pkg/generated/clientset/versioned/typed/mysql/v1alpha1/mysqlbackupschedule.go delete mode 100644 pkg/generated/clientset/versioned/typed/mysql/v1alpha1/mysqlcluster.go delete mode 100644 pkg/generated/clientset/versioned/typed/mysql/v1alpha1/mysqlrestore.go create mode 100644 pkg/generated/clientset/versioned/typed/mysql/v1alpha1/restore.go rename pkg/generated/informers/externalversions/mysql/v1alpha1/{mysqlbackupschedule.go => backup.go} (55%) rename pkg/generated/informers/externalversions/mysql/v1alpha1/{mysqlrestore.go => backupschedule.go} (58%) rename pkg/generated/informers/externalversions/mysql/v1alpha1/{mysqlcluster.go => cluster.go} (59%) rename pkg/generated/informers/externalversions/mysql/v1alpha1/{mysqlbackup.go => restore.go} (58%) create mode 100644 pkg/generated/listers/mysql/v1alpha1/backup.go create mode 100644 pkg/generated/listers/mysql/v1alpha1/backupschedule.go create mode 100644 pkg/generated/listers/mysql/v1alpha1/cluster.go delete mode 100644 pkg/generated/listers/mysql/v1alpha1/mysqlbackup.go delete mode 100644 pkg/generated/listers/mysql/v1alpha1/mysqlbackupschedule.go delete mode 100644 pkg/generated/listers/mysql/v1alpha1/mysqlcluster.go delete mode 100644 pkg/generated/listers/mysql/v1alpha1/mysqlrestore.go create mode 100644 pkg/generated/listers/mysql/v1alpha1/restore.go diff --git a/cmd/mysql-agent/app/mysql_agent.go b/cmd/mysql-agent/app/mysql_agent.go index dd6c25b31..216d4d309 100644 --- a/cmd/mysql-agent/app/mysql_agent.go +++ b/cmd/mysql-agent/app/mysql_agent.go @@ -117,8 +117,8 @@ func Run(opts *options.MySQLAgentOpts) error { backupController := backupcontroller.NewAgentController( kubeclient, mysqlopClient.MysqlV1alpha1(), - sharedInformerFactory.Mysql().V1alpha1().MySQLBackups(), - sharedInformerFactory.Mysql().V1alpha1().MySQLClusters(), + sharedInformerFactory.Mysql().V1alpha1().Backups(), + sharedInformerFactory.Mysql().V1alpha1().Clusters(), kubeInformerFactory.Core().V1().Pods(), opts.Hostname, ) @@ -131,9 +131,9 @@ func Run(opts *options.MySQLAgentOpts) error { restoreController := restorecontroller.NewAgentController( kubeclient, mysqlopClient.MysqlV1alpha1(), - sharedInformerFactory.Mysql().V1alpha1().MySQLRestores(), - sharedInformerFactory.Mysql().V1alpha1().MySQLClusters(), - sharedInformerFactory.Mysql().V1alpha1().MySQLBackups(), + sharedInformerFactory.Mysql().V1alpha1().Restores(), + sharedInformerFactory.Mysql().V1alpha1().Clusters(), + sharedInformerFactory.Mysql().V1alpha1().Backups(), kubeInformerFactory.Core().V1().Pods(), opts.Hostname, ) diff --git a/cmd/mysql-agent/app/options/options.go b/cmd/mysql-agent/app/options/options.go index 1716de0c1..f4c2341e1 100644 --- a/cmd/mysql-agent/app/options/options.go +++ b/cmd/mysql-agent/app/options/options.go @@ -43,11 +43,11 @@ type MySQLAgentOpts struct { Address string // Namespace is the namespace in which the backup controller (and is - // associated MySQLCluster) are running. + // associated Cluster) are running. Namespace string - // MySQLClusterName is the name of the MySQLCluster the backup controller + // ClusterName is the name of the Cluster the backup controller // is responsible for. - MySQLClusterName string + ClusterName string // Hostname of the pod the backup operator is running in. Hostname string @@ -66,12 +66,12 @@ func NewMySQLAgentOpts() *MySQLAgentOpts { namespace := os.Getenv("POD_NAMESPACE") clusterName := os.Getenv("MYSQL_CLUSTER_NAME") return &MySQLAgentOpts{ - HealthcheckPort: DefaultMySQLAgentHeathcheckPort, - Address: "0.0.0.0", - Namespace: namespace, - MySQLClusterName: clusterName, - Hostname: hostname, - MinResyncPeriod: metav1.Duration{Duration: 12 * time.Hour}, + HealthcheckPort: DefaultMySQLAgentHeathcheckPort, + Address: "0.0.0.0", + Namespace: namespace, + ClusterName: clusterName, + Hostname: hostname, + MinResyncPeriod: metav1.Duration{Duration: 12 * time.Hour}, } } @@ -81,7 +81,7 @@ func (s *MySQLAgentOpts) AddFlags(fs *pflag.FlagSet) *pflag.FlagSet { fs.StringVar(&s.Address, "address", s.Address, "The IP address to serve the mysql-agent's http service on (set to 0.0.0.0 for all interfaces).") fs.StringVar(&s.Namespace, "namespace", s.Namespace, "The namespace to run in. Must be the same namespace as the associated MySQL cluster.") - fs.StringVar(&s.MySQLClusterName, "mysql-cluster-name", s.MySQLClusterName, "The name of the MySQL cluster the mysql-agent is responsible for.") + fs.StringVar(&s.ClusterName, "cluster-name", s.ClusterName, "The name of the MySQL cluster the mysql-agent is responsible for.") fs.StringVar(&s.Hostname, "hostname", s.Hostname, "The hostname of the pod the mysql-agent is running in.") fs.DurationVar(&s.MinResyncPeriod.Duration, "min-resync-period", s.MinResyncPeriod.Duration, "The resync period in reflectors will be random between MinResyncPeriod and 2*MinResyncPeriod.") @@ -93,10 +93,10 @@ func (s *MySQLAgentOpts) Validate() error { if len(s.Namespace) == 0 { return fmt.Errorf("must set --namespace or $POD_NAMESPACE") } - if len(s.MySQLClusterName) == 0 { - return fmt.Errorf("must set --mysql-cluster-name or $MYSQL_CLUSTER_NAME") + if len(s.ClusterName) == 0 { + return fmt.Errorf("must set --cluster-name or $MYSQL_CLUSTER_NAME") } - if len(s.MySQLClusterName) == 0 { + if len(s.ClusterName) == 0 { return fmt.Errorf("failed to detect hostname. Set --hostname") } return nil diff --git a/cmd/mysql-operator/app/mysql_operator.go b/cmd/mysql-operator/app/mysql_operator.go index cd6825284..1423df055 100644 --- a/cmd/mysql-operator/app/mysql_operator.go +++ b/cmd/mysql-operator/app/mysql_operator.go @@ -83,7 +83,7 @@ func Run(s *options.MySQLOperatorServer) error { *s, mysqlopClient, kubeClient, - operatorInformerFactory.Mysql().V1alpha1().MySQLClusters(), + operatorInformerFactory.Mysql().V1alpha1().Clusters(), kubeInformerFactory.Apps().V1beta1().StatefulSets(), kubeInformerFactory.Core().V1().Pods(), kubeInformerFactory.Core().V1().Services(), @@ -99,8 +99,8 @@ func Run(s *options.MySQLOperatorServer) error { backupController := backupcontroller.NewOperatorController( kubeClient, mysqlopClient.MysqlV1alpha1(), - operatorInformerFactory.Mysql().V1alpha1().MySQLBackups(), - operatorInformerFactory.Mysql().V1alpha1().MySQLClusters(), + operatorInformerFactory.Mysql().V1alpha1().Backups(), + operatorInformerFactory.Mysql().V1alpha1().Clusters(), kubeInformerFactory.Core().V1().Pods(), ) wg.Add(1) @@ -112,9 +112,9 @@ func Run(s *options.MySQLOperatorServer) error { restoreController := restorecontroller.NewOperatorController( kubeClient, mysqlopClient.MysqlV1alpha1(), - operatorInformerFactory.Mysql().V1alpha1().MySQLRestores(), - operatorInformerFactory.Mysql().V1alpha1().MySQLClusters(), - operatorInformerFactory.Mysql().V1alpha1().MySQLBackups(), + operatorInformerFactory.Mysql().V1alpha1().Restores(), + operatorInformerFactory.Mysql().V1alpha1().Clusters(), + operatorInformerFactory.Mysql().V1alpha1().Backups(), kubeInformerFactory.Core().V1().Pods(), ) wg.Add(1) @@ -126,7 +126,7 @@ func Run(s *options.MySQLOperatorServer) error { backupScheduleController := backupschedule.NewController( mysqlopClient, kubeClient, - operatorInformerFactory.Mysql().V1alpha1().MySQLBackupSchedules(), + operatorInformerFactory.Mysql().V1alpha1().BackupSchedules(), 30*time.Second, s.Namespace, ) diff --git a/contrib/manifests/custom-resource-definitions.yaml b/contrib/manifests/custom-resource-definitions.yaml index 8324ae887..32f26aaf3 100644 --- a/contrib/manifests/custom-resource-definitions.yaml +++ b/contrib/manifests/custom-resource-definitions.yaml @@ -8,7 +8,7 @@ spec: version: v1alpha1 scope: Namespaced names: - kind: MySQLCluster + kind: Cluster singular: mysqlcluster plural: mysqlclusters --- @@ -21,7 +21,7 @@ spec: version: v1alpha1 scope: Namespaced names: - kind: MySQLBackup + kind: Backup singular: mysqlbackup plural: mysqlbackups --- @@ -34,7 +34,7 @@ spec: version: v1alpha1 scope: Namespaced names: - kind: MySQLRestore + kind: Restore singular: mysqlrestore plural: mysqlrestores --- @@ -47,6 +47,6 @@ spec: version: v1alpha1 scope: Namespaced names: - kind: MySQLBackupSchedule + kind: BackupSchedule singular: mysqlbackupschedule plural: mysqlbackupschedules diff --git a/contrib/manifests/rbac.yaml b/contrib/manifests/rbac.yaml index a00f491c9..7876dad51 100644 --- a/contrib/manifests/rbac.yaml +++ b/contrib/manifests/rbac.yaml @@ -59,10 +59,10 @@ rules: - apiGroups: - mysql.oracle.com resources: - - mysqlbackups - - mysqlbackupschedules - - mysqlclusters - - mysqlrestores + - backups + - backupschedules + - clusters + - restores verbs: - get - list diff --git a/docs/tutorial.md b/docs/tutorial.md index ca87eb596..c841bfa58 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -109,7 +109,7 @@ Now let's create a new MySQL cluster. Create a cluster.yaml file with the follow ```yaml apiVersion: mysql.oracle.com/v1 -kind: MySQLCluster +kind: Cluster metadata: name: myappdb ``` @@ -126,7 +126,7 @@ You should now have a cluster in the default namespace ``` $ kubectl get mysqlclusters NAME KIND -myappdb MySQLCluster.v1alpha1.mysql.oracle.com +myappdb Cluster.v1alpha1.mysql.oracle.com ``` To find out how to create larger clusters, and configure storage see [Clusters](user/clusters.md#clusters). diff --git a/docs/user/backup.md b/docs/user/backup.md index 464d534f8..64f4fe93c 100644 --- a/docs/user/backup.md +++ b/docs/user/backup.md @@ -3,7 +3,8 @@ ## Introduction The MySQL Operator allows for on-demand and scheduled backups to be created. -On-demand backups can be created by submitting a MySQLBackup custom resource. Scheduled backups can be created by submitting a MySQLBackupSchedule custom resource. +On-demand backups can be created by submitting a Backup custom resource. +Scheduled backups can be created by submitting a BackupSchedule custom resource. Whilst we plan to offer different options for backups, we currently only support the mysqldump tool, and storage in S3 compatible object storage providers. @@ -35,13 +36,13 @@ $ kubectl create secret generic s3-credentials --from-literal=accessKey=${S3_ACC ## On-demand backups -You can request a backup at any time by submitting a MySQLBackup custom resource to the +You can request a backup at any time by submitting a Backup custom resource to the operator. The secretRef is the name of a secret that contains your Object Storage credentials. Note: The databases field is mandatory. ```yaml apiVersion: mysql.oracle.com/v1alpa1 -kind: MySQLBackup +kind: Backup metadata: name: mysql-backup spec: @@ -139,15 +140,15 @@ Remember to also configure the S3 credentials secret as outlined above. ## Scheduled backups You can request a backup to be performed on a given schedule by submitting a -MySQLBackupSchedule custom resource to the operator. This will create -MySQLBackup resources based on the given cron format string. The secretRef is -the name of a secret that contains your Object Storage credentials. Note: The -databases field is mandatory. For example, the following will create a backup -of the employees database every 30 minutes: +BackupSchedule custom resource to the operator. This will create Backup +resources based on the given cron format string. The secretRef is the name of a +secret that contains your Object Storage credentials. Note: The databases field +is mandatory. For example, the following will create a backup of the employees +database every 30 minutes: ```yaml apiVersion: mysql.oracle.com/v1alpha1 -kind: MySQLBackupSchedule +kind: BackupSchedule metadata: name: mysql-backup-schedule spec: diff --git a/docs/user/clusters.md b/docs/user/clusters.md index 3a126f3fb..74fad74e8 100644 --- a/docs/user/clusters.md +++ b/docs/user/clusters.md @@ -8,7 +8,7 @@ The following example will create a MySQL Cluster with 3 replicas, one primary a ```yaml apiVersion: mysql.oracle.com/v1alpha1 -kind: MySQLCluster +kind: Cluster metadata: name: mysql-test-cluster spec: @@ -21,7 +21,7 @@ The following example will create a MySQL Cluster with 3 primary (read/write) re ```yaml apiVersion: mysql.oracle.com/v1alpha1 -kind: MySQLCluster +kind: Cluster metadata: name: mysql-multimaster-cluster spec: @@ -41,7 +41,7 @@ Create your cluster and reference it ```yaml apiVersion: mysql.oracle.com/v1alpha1 -kind: MySQLCluster +kind: Cluster metadata: name: example-mysql-cluster-custom-secret spec: @@ -73,7 +73,7 @@ spec: storageClassName: manual --- apiVersion: mysql.oracle.com/v1alpha1 -kind: MySQLCluster +kind: Cluster metadata: name: example-mysql-cluster-with-volume spec: @@ -130,7 +130,7 @@ spec: storageClassName: manual --- apiVersion: mysql.oracle.com/v1alpha1 -kind: MySQLCluster +kind: Cluster metadata: name: example-mysql-cluster-with-volume spec: @@ -180,7 +180,7 @@ Now we can reference our config map in our cluster spec definition. For example: ```yaml apiVersion: mysql.oracle.com/v1alpha1 -kind: MySQLCluster +kind: Cluster metadata: name: mysql-cluster-with-config replicas: 3 @@ -190,12 +190,12 @@ metadata: ### Create a cluster with custom server_id values -By default, the MySQL Operator starts a cluster with `--server_id` set to `1000` and increments it by one for each new cluster member. You can change this behavior by setting the `baseServerId` field on your MySQLCluster. `baseServerId` value can be set to anything in the range from `1` to `4294967286`. `0` is also accepted, but then the default value of `1000` will be used. +By default, the MySQL Operator starts a cluster with `--server_id` set to `1000` and increments it by one for each new cluster member. You can change this behavior by setting the `baseServerId` field on your Cluster. `baseServerId` value can be set to anything in the range from `1` to `4294967286`. `0` is also accepted, but then the default value of `1000` will be used. The following example will create a MySQL Cluster with following `server_id`'s: 42,43,44 ```yaml apiVersion: mysql.oracle.com/v1alpha1 -kind: MySQLCluster +kind: Cluster metadata: name: mysql-cluster-with-custom-serverid replicas: 3 diff --git a/docs/user/restore.md b/docs/user/restore.md index 185ffdcde..6f440040d 100644 --- a/docs/user/restore.md +++ b/docs/user/restore.md @@ -5,13 +5,13 @@ The MySQL Operator supports the notion of restoring a cluster from an existing b ## On-demand restores You can request a restore from a previous backup at any time by submitting a -MySQLRestore custom resource to the operator. The backupRef is the name of the +Restore custom resource to the operator. The backupRef is the name of the backup that you wish to restore, and the clusterRef is the name of the destination cluster of the restore operation. ```yaml apiVersion: mysql.oracle.com/v1alpha1 -kind: MySQLRestore +kind: Restore metadata: name: example-restore spec: diff --git a/docs/user/router.md b/docs/user/router.md index 573d8df46..d2d3fe1e8 100644 --- a/docs/user/router.md +++ b/docs/user/router.md @@ -18,7 +18,7 @@ We'll use WordPress as an example of how you might setup the MySQL Router for a ```yaml apiVersion: "mysql.oracle.com/v1alpa1" -kind: MySQLCluster +kind: Cluster metadata: name: mysql-wordpress spec: diff --git a/examples/backup/backup-schedule.yaml b/examples/backup/backup-schedule.yaml index 884a82e6d..dccda5c66 100644 --- a/examples/backup/backup-schedule.yaml +++ b/examples/backup/backup-schedule.yaml @@ -1,21 +1,21 @@ apiVersion: mysql.oracle.com/v1alpha1 -kind: MySQLBackupSchedule +kind: BackupSchedule metadata: name: mysql-backup-schedule spec: schedule: '30 * * * *' backupTemplate: executor: - provider: mysqldump + name: mysqldump databases: - test - storage: - provider: s3 + storageProvider: + name: s3 secretRef: name: s3-credentials config: endpoint: ocitenancy.compat.objectstorage.ociregion.oraclecloud.com region: ociregion bucket: mybucket - clusterRef: + cluster: name: mysql diff --git a/examples/backup/backup.yaml b/examples/backup/backup.yaml index 6d6e26faa..9e5ae43d7 100644 --- a/examples/backup/backup.yaml +++ b/examples/backup/backup.yaml @@ -1,14 +1,14 @@ apiVersion: mysql.oracle.com/v1alpha1 -kind: MySQLBackup +kind: Backup metadata: name: mysql-backup spec: executor: - provider: mysqldump + name: mysqldump databases: - test - storage: - provider: s3 + storageProvider: + name: s3 secretRef: name: s3-credentials config: diff --git a/examples/cluster/cluster-with-3-replicas.yaml b/examples/cluster/cluster-with-3-replicas.yaml index 5c6b17437..f11e0d667 100644 --- a/examples/cluster/cluster-with-3-replicas.yaml +++ b/examples/cluster/cluster-with-3-replicas.yaml @@ -1,5 +1,5 @@ -apiVersion: mysql.oracle.com/alpha1 -kind: MySQLCluster +apiVersion: mysql.oracle.com/v1alpha1 +kind: Cluster metadata: name: mysql spec: diff --git a/examples/cluster/cluster-with-custom-config.yaml b/examples/cluster/cluster-with-custom-config.yaml index f71b3ab71..e0b85f15a 100644 --- a/examples/cluster/cluster-with-custom-config.yaml +++ b/examples/cluster/cluster-with-custom-config.yaml @@ -1,5 +1,5 @@ apiVersion: mysql.oracle.com/alpha1 -kind: MySQLCluster +kind: Cluster metadata: name: mysql spec: diff --git a/examples/cluster/cluster-with-custom-secret.yaml b/examples/cluster/cluster-with-custom-secret.yaml index 3a99370f9..fef52d94f 100644 --- a/examples/cluster/cluster-with-custom-secret.yaml +++ b/examples/cluster/cluster-with-custom-secret.yaml @@ -1,5 +1,5 @@ apiVersion: mysql.oracle.com/v1alpha1 -kind: MySQLCluster +kind: Cluster metadata: name: mysql spec: diff --git a/examples/cluster/cluster-with-custom-ssl-certs.yaml b/examples/cluster/cluster-with-custom-ssl-certs.yaml index 5ebbe34de..7ea0327ea 100644 --- a/examples/cluster/cluster-with-custom-ssl-certs.yaml +++ b/examples/cluster/cluster-with-custom-ssl-certs.yaml @@ -1,5 +1,5 @@ apiVersion: mysql.oracle.com/v1alpha1 -kind: MySQLCluster +kind: Cluster metadata: name: mysql spec: diff --git a/examples/cluster/cluster-with-data-volume-and-backup-volume.yaml b/examples/cluster/cluster-with-data-volume-and-backup-volume.yaml index 545a0e3b7..e8375abeb 100644 --- a/examples/cluster/cluster-with-data-volume-and-backup-volume.yaml +++ b/examples/cluster/cluster-with-data-volume-and-backup-volume.yaml @@ -32,7 +32,7 @@ spec: storageClassName: manual --- apiVersion: mysql.oracle.com/v1alpha1 -kind: MySQLCluster +kind: Cluster metadata: name: mysql spec: diff --git a/examples/cluster/cluster-with-volume.yaml b/examples/cluster/cluster-with-volume.yaml index e34a30dac..4eaf38e13 100644 --- a/examples/cluster/cluster-with-volume.yaml +++ b/examples/cluster/cluster-with-volume.yaml @@ -16,7 +16,7 @@ spec: storageClassName: manual --- apiVersion: mysql.oracle.com/v1alpha1 -kind: MySQLCluster +kind: Cluster metadata: name: mysql spec: diff --git a/examples/cluster/cluster.yaml b/examples/cluster/cluster.yaml index bce0d5d99..1078634b4 100644 --- a/examples/cluster/cluster.yaml +++ b/examples/cluster/cluster.yaml @@ -1,4 +1,4 @@ apiVersion: mysql.oracle.com/v1alpha1 -kind: MySQLCluster +kind: Cluster metadata: name: mysql diff --git a/examples/cluster/multi-master-cluster.yaml b/examples/cluster/multi-master-cluster.yaml index f794ea2d8..0db4fda9f 100644 --- a/examples/cluster/multi-master-cluster.yaml +++ b/examples/cluster/multi-master-cluster.yaml @@ -1,5 +1,5 @@ apiVersion: mysql.oracle.com/v1alpha1 -kind: MySQLCluster +kind: Cluster metadata: name: mysql spec: diff --git a/examples/demo/wordpress-router/wordpress-database.yaml b/examples/demo/wordpress-router/wordpress-database.yaml index c9b49c222..16df5b027 100644 --- a/examples/demo/wordpress-router/wordpress-database.yaml +++ b/examples/demo/wordpress-router/wordpress-database.yaml @@ -16,7 +16,7 @@ data: password: bXktc3VwZXItc2VjcmV0LXBhc3M= --- apiVersion: mysql.oracle.com/v1alpha1 -kind: MySQLCluster +kind: Cluster metadata: name: mysql-wordpress spec: diff --git a/examples/demo/wordpress/wordpress-database.yaml b/examples/demo/wordpress/wordpress-database.yaml index b989887e1..ce1c5530b 100644 --- a/examples/demo/wordpress/wordpress-database.yaml +++ b/examples/demo/wordpress/wordpress-database.yaml @@ -16,7 +16,7 @@ spec: storageClassName: manual --- apiVersion: mysql.oracle.com/v1alpha1 -kind: MySQLCluster +kind: Cluster metadata: name: mysql-wordpress spec: diff --git a/examples/restore/restore.yaml b/examples/restore/restore.yaml index 924d3d3b8..c68c8f034 100644 --- a/examples/restore/restore.yaml +++ b/examples/restore/restore.yaml @@ -1,5 +1,5 @@ apiVersion: mysql.oracle.com/v1alpha1 -kind: MySQLRestore +kind: Restore metadata: name: mysql-restore spec: diff --git a/mysql-operator/templates/01-resources.yaml b/mysql-operator/templates/01-resources.yaml index 3d50bb6aa..04865bf35 100644 --- a/mysql-operator/templates/01-resources.yaml +++ b/mysql-operator/templates/01-resources.yaml @@ -12,7 +12,7 @@ spec: version: v1alpha1 scope: Namespaced names: - kind: MySQLCluster + kind: Cluster singular: mysqlcluster plural: mysqlclusters --- @@ -28,7 +28,7 @@ spec: version: v1alpha1 scope: Namespaced names: - kind: MySQLBackup + kind: Backup singular: mysqlbackup plural: mysqlbackups --- @@ -44,7 +44,7 @@ spec: version: v1alpha1 scope: Namespaced names: - kind: MySQLRestore + kind: Restore singular: mysqlrestore plural: mysqlrestores --- @@ -60,7 +60,7 @@ spec: version: v1alpha1 scope: Namespaced names: - kind: MySQLBackupSchedule + kind: BackupSchedule singular: mysqlbackupschedule plural: mysqlbackupschedules {{ end }} diff --git a/pkg/apis/mysql/v1alpha1/backup.go b/pkg/apis/mysql/v1alpha1/backup.go deleted file mode 100644 index cc1dd31da..000000000 --- a/pkg/apis/mysql/v1alpha1/backup.go +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright 2018 Oracle and/or its affiliates. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package v1alpha1 - -import ( - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - "github.com/oracle/mysql-operator/pkg/constants" - "github.com/oracle/mysql-operator/pkg/version" -) - -const ( - // BackupCRDResourceSingular defines the singular custom resource name for MySQL backups. - BackupCRDResourceSingular = "mysqlbackup" - - // BackupCRDResourcePlural defines the plural custom resource name for MySQL backups. - BackupCRDResourcePlural = "mysqlbackups" -) - -// BackupSpec defines the specification for a MySQL backup. This includes what should be backed up, -// what tool should perform the backup, and, where the backup should be stored. -type BackupSpec struct { - // Executor is the configuration of the tool that will produce the backup, and a definition of - // what databases and tables to backup. - Executor *Executor `json:"executor"` - - // Storage is the configuration of where and how backups should be stored. - Storage *Storage `json:"storage"` - - // ClusterRef is a reference to the MySQLCluster to which the MySQLBackup belongs. - ClusterRef *corev1.LocalObjectReference `json:"clusterRef"` - - // AgentScheduled is the agent hostname to run the backup on - AgentScheduled string `json:"agentscheduled"` -} - -// Executor represents the configuration of the tool performing the backup. This includes the tool -// to use, and, what database and tables should be backed up. -// The storage of the backup is configured in the relevant Storage configuration. -type Executor struct { - // The name of the tool performing the backup, e.g. mysqldump. - Provider string `json:"provider"` - // The databases to backup. - Databases []string `json:"databases"` -} - -// Storage defines the configuration for storing a MySQL backup to a storage service. -// The generation of the backup is configured in the Executor configuration. -type Storage struct { - // Provider denotes the type of storage provider that will store and retrieve the backups, - // e.g. s3, oci-s3-compat, aws-s3, gce-s3, etc. - Provider string `json:"provider"` - // SecretRef is a reference to the Kubernetes secret containing the configuration for uploading - // the backup to authenticated storage. - SecretRef *corev1.LocalObjectReference `json:"secretRef,omitempty"` - // Config is generic string based key-value map that defines non-secret configuration values for - // uploading the backup to storage w.r.t the configured storage provider. - Config map[string]string `json:"config,omitempty"` -} - -// BackupPhase represents the current life-cycle phase of a MySQLBackup. -type BackupPhase string - -const ( - // BackupPhaseUnknown means that the backup hasn't yet been processed. - BackupPhaseUnknown BackupPhase = "" - - // BackupPhaseNew means that the Backup hasn't yet been processed. - BackupPhaseNew BackupPhase = "New" - - // BackupPhaseScheduled means that the Backup has been scheduled on an - // appropriate replica. - BackupPhaseScheduled BackupPhase = "Scheduled" - - // BackupPhaseStarted means the backup is in progress. - BackupPhaseStarted BackupPhase = "Started" - - // BackupPhaseComplete means the backup has terminated successfully. - BackupPhaseComplete BackupPhase = "Complete" - - // BackupPhaseFailed means the backup has terminated with an error. - BackupPhaseFailed BackupPhase = "Failed" -) - -// BackupOutcome describes the location of a MySQL Backup -type BackupOutcome struct { - // Location is the Object Storage network location of the MySQLBackup. - Location string `json:"location"` -} - -// BackupStatus captures the current status of a MySQL backup. -type BackupStatus struct { - // Phase is the current life-cycle phase of the MySQLBackup. - Phase BackupPhase `json:"phase"` - - // Outcome holds the results of a successful backup. - Outcome BackupOutcome `json:"outcome"` - - // TimeStarted is the time at which the backup was started. - TimeStarted metav1.Time `json:"timeStarted"` - - // TimeCompleted is the time at which the backup completed. - TimeCompleted metav1.Time `json:"timeCompleted"` -} - -// +genclient -// +genclient:noStatus - -// MySQLBackup is a MySQL Operator resource that represents a backup of a MySQL -// cluster. -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -type MySQLBackup struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata"` - - Spec BackupSpec `json:"spec"` - Status BackupStatus `json:"status"` -} - -// MySQLBackupList is a list of MySQLBackups. -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -type MySQLBackupList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata"` - - Items []MySQLBackup `json:"items"` -} - -// EnsureDefaults can be invoked to ensure the default values are present. -func (b MySQLBackup) EnsureDefaults() *MySQLBackup { - buildVersion := version.GetBuildVersion() - if buildVersion != "" { - if b.Labels == nil { - b.Labels = make(map[string]string) - } - _, hasKey := b.Labels[constants.MySQLOperatorVersionLabel] - if !hasKey { - SetOperatorVersionLabel(b.Labels, buildVersion) - } - } - return &b -} - -// Validate checks if the resource spec is valid. -func (b MySQLBackup) Validate() error { - return validateBackup(&b).ToAggregate() -} diff --git a/pkg/apis/mysql/v1alpha1/backupschedule.go b/pkg/apis/mysql/v1alpha1/backupschedule.go deleted file mode 100644 index b0b1df406..000000000 --- a/pkg/apis/mysql/v1alpha1/backupschedule.go +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2018 Oracle and/or its affiliates. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package v1alpha1 - -import ( - "github.com/oracle/mysql-operator/pkg/constants" - "github.com/oracle/mysql-operator/pkg/version" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// BackupScheduleSpec defines the specification for a MySQL backup schedule. -type BackupScheduleSpec struct { - // Schedule specifies the cron string used for backup scheduling. - Schedule string `json:"schedule"` - - // BackupTemplate is the specification of the backup structure - // to get scheduled. - BackupTemplate BackupSpec `json:"backupTemplate"` -} - -// BackupSchedulePhase is a string representation of the lifecycle phase -// of a backup schedule. -type BackupSchedulePhase string - -const ( - // BackupSchedulePhaseNew means the backup schedule has been created but not - // yet processed by the backup schedule controller. - BackupSchedulePhaseNew BackupSchedulePhase = "New" - - // BackupSchedulePhaseEnabled means the backup schedule has been validated and - // will now be triggering backups according to the schedule spec. - BackupSchedulePhaseEnabled BackupSchedulePhase = "Enabled" - - // BackupSchedulePhaseFailedValidation means the backup schedule has failed - // the controller's validations and therefore will not trigger backups. - BackupSchedulePhaseFailedValidation BackupSchedulePhase = "FailedValidation" -) - -// ScheduleStatus captures the current state of a MySQL backup schedule. -type ScheduleStatus struct { - // Phase is the current phase of the MySQL backup schedule. - Phase BackupSchedulePhase `json:"phase"` - - // LastBackup is the last time a MySQLBackup was run for this - // backup schedule. - LastBackup metav1.Time `json:"lastBackup"` -} - -// +genclient -// +genclient:noStatus - -// MySQLBackupSchedule is a MySQL Operator resource that represents a backup -// schedule of a MySQL cluster. -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -type MySQLBackupSchedule struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata"` - - Spec BackupScheduleSpec `json:"spec"` - Status ScheduleStatus `json:"status,omitempty"` -} - -// MySQLBackupScheduleList is a list of MySQLBackupSchedules. -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -type MySQLBackupScheduleList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata"` - - Items []MySQLBackupSchedule `json:"items"` -} - -// EnsureDefaults can be invoked to ensure the default values are present. -func (b MySQLBackupSchedule) EnsureDefaults() *MySQLBackupSchedule { - buildVersion := version.GetBuildVersion() - if buildVersion != "" { - if b.Labels == nil { - b.Labels = make(map[string]string) - } - _, hasKey := b.Labels[constants.MySQLOperatorVersionLabel] - if !hasKey { - SetOperatorVersionLabel(b.Labels, buildVersion) - } - } - return &b -} - -// Validate checks if the resource spec is valid. -func (b MySQLBackupSchedule) Validate() error { - return validateBackupSchedule(&b).ToAggregate() -} diff --git a/pkg/apis/mysql/v1alpha1/cluster.go b/pkg/apis/mysql/v1alpha1/cluster.go deleted file mode 100644 index aab1c5033..000000000 --- a/pkg/apis/mysql/v1alpha1/cluster.go +++ /dev/null @@ -1,231 +0,0 @@ -// Copyright 2018 Oracle and/or its affiliates. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package v1alpha1 - -import ( - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime/schema" -) - -const ( - // The default MySQL version to use if not specified explicitly by user - defaultVersion = "8.0.11" - defaultReplicas = 1 - defaultBaseServerID = 1000 - // Max safe value for BaseServerID calculated as max MySQL server_id value - max Replication Group size - maxBaseServerID uint32 = 4294967295 - 9 -) - -// ClusterCRDResourcePlural defines the custom resource name for mysqlclusters -const ClusterCRDResourcePlural = "mysqlclusters" - -const ( - // MaxInnoDBClusterMembers is the maximum number of members supported by InnoDB - // group replication. - MaxInnoDBClusterMembers = 9 - - // MySQLClusterNameMaxLen is the maximum supported length of a - // MySQLCluster name. - // See: https://bugs.mysql.com/bug.php?id=90601 - MySQLClusterNameMaxLen = 28 -) - -// TODO (owain) we need to remove this because it's not reasonable for us to maintain a list -// of all the potential MySQL versions that can be used and in reality, it shouldn't matter -// too much. The burden of this is not worth the benfit to a user -var validVersions = []string{ - defaultVersion, -} - -// MySQLClusterSpec defines the attributes a user can specify when creating a cluster -type MySQLClusterSpec struct { - // Version defines the MySQL Docker image version. - Version string `json:"version"` - - // Replicas defines the number of running MySQL instances in a cluster - Replicas int32 `json:"replicas,omitempty"` - - // BaseServerID defines the base number used to create uniq server_id for MySQL instances in a cluster. - // The baseServerId value need to be in range from 1 to 4294967286 - // If ommited in the manifest file, or set to 0, defaultBaseServerID value will be used. - BaseServerID uint32 `json:"baseServerId,omitempty"` - - // MultiMaster defines the mode of the MySQL cluster. If set to true, - // all instances will be R/W. If false (the default), only a single instance - // will be R/W and the rest will be R/O. - MultiMaster bool `json:"multiMaster,omitempty"` - - // 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/ - // +optional - NodeSelector map[string]string `json:"nodeSelector,omitempty"` - - // If specified, affinity will define the pod's scheduling constraints - // +optional - Affinity *corev1.Affinity `json:"affinity,omitempty"` - - // VolumeClaimTemplate allows a user to specify how volumes inside a MySQL cluster - // +optional - VolumeClaimTemplate *corev1.PersistentVolumeClaim `json:"volumeClaimTemplate,omitempty"` - - // BackupVolumeClaimTemplate allows a user to specify a volume to temporarily store the - // data for a backup prior to it being shipped to object storage. - // +optional - BackupVolumeClaimTemplate *corev1.PersistentVolumeClaim `json:"backupVolumeClaimTemplate,omitempty"` - - // If defined, we use this secret for configuring the MYSQL_ROOT_PASSWORD - // If it is not set we generate a secret dynamically - // +optional - SecretRef *corev1.LocalObjectReference `json:"secretRef,omitempty"` - - // ConfigRef allows a user to specify a custom configuration file for MySQL. - // +optional - ConfigRef *corev1.LocalObjectReference `json:"configRef,omitempty"` - - // SSLSecretRef allows a user to specify custom CA certificate, server certificate - // and server key for group replication SSL - // +optional - SSLSecretRef *corev1.LocalObjectReference `json:"sslSecretRef,omitempty"` -} - -// MySQLClusterPhase describes the state of the cluster. -type MySQLClusterPhase string - -const ( - // MySQLClusterPending means the cluster has been accepted by the system, - // but one or more of the services or statefulsets has not been started. - // This includes time before being bound to a node, as well as time spent - // pulling images onto the host. - MySQLClusterPending MySQLClusterPhase = "Pending" - - // MySQLClusterRunning means the cluster has been created, all of it's - // required components are present, and there is at least one endpoint that - // mysql client can connect to. - MySQLClusterRunning MySQLClusterPhase = "Running" - - // MySQLClusterSucceeded means that all containers in the pod have - // voluntarily terminated with a container exit code of 0, and the system - // is not going to restart any of these containers. - MySQLClusterSucceeded MySQLClusterPhase = "Succeeded" - - // MySQLClusterFailed means that all containers in the pod have terminated, - // and at least one container has terminated in a failure (exited with a - // non-zero exit code or was stopped by the system). - MySQLClusterFailed MySQLClusterPhase = "Failed" - - // MySQLClusterUnknown means that for some reason the state of the cluster - // could not be obtained, typically due to an error in communicating with - // the host of the pod. - MySQLClusterUnknown MySQLClusterPhase = "" -) - -// MySQLClusterValidPhases denote the life-cycle states a cluster can be in. -var MySQLClusterValidPhases = []MySQLClusterPhase{ - MySQLClusterPending, - MySQLClusterRunning, - MySQLClusterSucceeded, - MySQLClusterFailed, - MySQLClusterUnknown} - -// MySQLClusterStatus defines the current status of a MySQL cluster -// propagating useful information back to the cluster admin -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -type MySQLClusterStatus struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata"` - Phase MySQLClusterPhase `json:"phase"` - Errors []string `json:"errors"` -} - -// +genclient -// +genclient:noStatus - -// MySQLCluster represents a cluster spec and associated metadata -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -type MySQLCluster struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata"` - Spec MySQLClusterSpec `json:"spec"` - Status MySQLClusterStatus `json:"status"` -} - -// MySQLClusterList is a placeholder type for a list of MySQL clusters -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -type MySQLClusterList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata"` - Items []MySQLCluster `json:"items"` -} - -// Validate returns an error if a cluster is invalid -func (c *MySQLCluster) Validate() error { - return validateCluster(c).ToAggregate() -} - -// EnsureDefaults will ensure that if a user omits and fields in the -// spec that are required, we set some sensible defaults. -// For example a user can choose to omit the version -// and number of replics -func (c *MySQLCluster) EnsureDefaults() *MySQLCluster { - if c.Spec.Replicas == 0 { - c.Spec.Replicas = defaultReplicas - } - - if c.Spec.BaseServerID == 0 { - c.Spec.BaseServerID = defaultBaseServerID - } - - if c.Spec.Version == "" { - c.Spec.Version = defaultVersion - } - - return c -} - -// RequiresConfigMount will return true if a user has specified a config map -// for configuring the cluster else false -func (c *MySQLCluster) RequiresConfigMount() bool { - return c.Spec.ConfigRef != nil -} - -// RequiresSecret returns true if a secret should be generated -// for a MySQL cluster else false -func (c *MySQLCluster) RequiresSecret() bool { - return c.Spec.SecretRef == nil -} - -// RequiresCustomSSLSetup returns true is the user has provided a secret -// that contains CA cert, server cert and server key for group replication -// SSL support -func (c *MySQLCluster) RequiresCustomSSLSetup() bool { - return c.Spec.SSLSecretRef != nil -} - -// GetObjectKind is required for codegen -func (c *MySQLCluster) GetObjectKind() schema.ObjectKind { - return &c.TypeMeta -} - -// GetObjectKind is required for codegen -func (c *MySQLClusterStatus) GetObjectKind() schema.ObjectKind { - return &c.TypeMeta -} - -// GetObjectKind is required for codegen -func (c *MySQLClusterList) GetObjectKind() schema.ObjectKind { - return &c.TypeMeta -} diff --git a/pkg/apis/mysql/v1alpha1/cluster_test.go b/pkg/apis/mysql/v1alpha1/cluster_test.go index 5ce02bfb3..a6833b3f3 100644 --- a/pkg/apis/mysql/v1alpha1/cluster_test.go +++ b/pkg/apis/mysql/v1alpha1/cluster_test.go @@ -39,7 +39,7 @@ func TestInvalidVersion(t *testing.T) { } func TestDefaultReplicas(t *testing.T) { - cluster := &MySQLCluster{} + cluster := &Cluster{} cluster.EnsureDefaults() if cluster.Spec.Replicas != defaultReplicas { @@ -48,7 +48,7 @@ func TestDefaultReplicas(t *testing.T) { } func TestDefaultBaseServerID(t *testing.T) { - cluster := &MySQLCluster{} + cluster := &Cluster{} cluster.EnsureDefaults() if cluster.Spec.BaseServerID != defaultBaseServerID { @@ -57,7 +57,7 @@ func TestDefaultBaseServerID(t *testing.T) { } func TestDefaultVersion(t *testing.T) { - cluster := &MySQLCluster{} + cluster := &Cluster{} cluster.EnsureDefaults() if cluster.Spec.Version != defaultVersion { @@ -66,15 +66,15 @@ func TestDefaultVersion(t *testing.T) { } func TestRequiresConfigMount(t *testing.T) { - cluster := &MySQLCluster{} + cluster := &Cluster{} cluster.EnsureDefaults() if cluster.RequiresConfigMount() { t.Errorf("Cluster without configRef should not require a config mount") } - cluster = &MySQLCluster{ - Spec: MySQLClusterSpec{ + cluster = &Cluster{ + Spec: ClusterSpec{ ConfigRef: &corev1.LocalObjectReference{ Name: "customconfig", }, @@ -87,13 +87,13 @@ func TestRequiresConfigMount(t *testing.T) { } func TestRequiresCustomSSLSetup(t *testing.T) { - cluster := &MySQLCluster{} + cluster := &Cluster{} cluster.EnsureDefaults() assert.False(t, cluster.RequiresCustomSSLSetup(), "Cluster without SSLSecretRef should not require custom SSL setup") - cluster = &MySQLCluster{ - Spec: MySQLClusterSpec{ + cluster = &Cluster{ + Spec: ClusterSpec{ SSLSecretRef: &corev1.LocalObjectReference{ Name: "custom-ssl-secret", }, diff --git a/pkg/apis/mysql/v1alpha1/helpers.go b/pkg/apis/mysql/v1alpha1/helpers.go new file mode 100644 index 000000000..764229488 --- /dev/null +++ b/pkg/apis/mysql/v1alpha1/helpers.go @@ -0,0 +1,124 @@ +// Copyright 2018 Oracle and/or its affiliates. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package v1alpha1 + +import ( + "github.com/oracle/mysql-operator/pkg/constants" + "github.com/oracle/mysql-operator/pkg/version" +) + +// EnsureDefaults will ensure that if a user omits and fields in the +// spec that are required, we set some sensible defaults. +// For example a user can choose to omit the version +// and number of replics +func (c *Cluster) EnsureDefaults() *Cluster { + if c.Spec.Replicas == 0 { + c.Spec.Replicas = defaultReplicas + } + + if c.Spec.BaseServerID == 0 { + c.Spec.BaseServerID = defaultBaseServerID + } + + if c.Spec.Version == "" { + c.Spec.Version = defaultVersion + } + + return c +} + +// Validate returns an error if a cluster is invalid +func (c *Cluster) Validate() error { + return validateCluster(c).ToAggregate() +} + +// RequiresConfigMount will return true if a user has specified a config map +// for configuring the cluster else false +func (c *Cluster) RequiresConfigMount() bool { + return c.Spec.ConfigRef != nil +} + +// RequiresSecret returns true if a secret should be generated +// for a MySQL cluster else false +func (c *Cluster) RequiresSecret() bool { + return c.Spec.SecretRef == nil +} + +// RequiresCustomSSLSetup returns true is the user has provided a secret +// that contains CA cert, server cert and server key for group replication +// SSL support +func (c *Cluster) RequiresCustomSSLSetup() bool { + return c.Spec.SSLSecretRef != nil +} + +// EnsureDefaults can be invoked to ensure the default values are present. +func (b Backup) EnsureDefaults() *Backup { + buildVersion := version.GetBuildVersion() + if buildVersion != "" { + if b.Labels == nil { + b.Labels = make(map[string]string) + } + _, hasKey := b.Labels[constants.MySQLOperatorVersionLabel] + if !hasKey { + SetOperatorVersionLabel(b.Labels, buildVersion) + } + } + return &b +} + +// Validate checks if the resource spec is valid. +func (b Backup) Validate() error { + return validateBackup(&b).ToAggregate() +} + +// EnsureDefaults can be invoked to ensure the default values are present. +func (b BackupSchedule) EnsureDefaults() *BackupSchedule { + buildVersion := version.GetBuildVersion() + if buildVersion != "" { + if b.Labels == nil { + b.Labels = make(map[string]string) + } + _, hasKey := b.Labels[constants.MySQLOperatorVersionLabel] + if !hasKey { + SetOperatorVersionLabel(b.Labels, buildVersion) + } + } + return &b +} + +// Validate checks if the resource spec is valid. +func (b BackupSchedule) Validate() error { + return validateBackupSchedule(&b).ToAggregate() +} + +// EnsureDefaults can be invoked to ensure the default values are present. +func (r Restore) EnsureDefaults() *Restore { + buildVersion := version.GetBuildVersion() + if buildVersion != "" { + if r.Labels == nil { + r.Labels = make(map[string]string) + } + _, hasKey := r.Labels[constants.MySQLOperatorVersionLabel] + if !hasKey { + SetOperatorVersionLabel(r.Labels, buildVersion) + } + } + return &r +} + +// Validate checks if the resource spec is valid. +func (r Restore) Validate() error { + return validateRestore(&r).ToAggregate() +} diff --git a/pkg/apis/mysql/v1alpha1/register.go b/pkg/apis/mysql/v1alpha1/register.go index 1bb3c9909..1b408ec1e 100644 --- a/pkg/apis/mysql/v1alpha1/register.go +++ b/pkg/apis/mysql/v1alpha1/register.go @@ -38,14 +38,14 @@ const GroupName = "mysql.oracle.com" var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1alpha1"} const ( - // MySQLClusterCRDResourceKind is the Kind of a MySQLCluster. - MySQLClusterCRDResourceKind = "MySQLCluster" - // MySQLBackupCRDResourceKind is the Kind of a MySQLBackup. - MySQLBackupCRDResourceKind = "MySQLBackup" - // MySQLRestoreCRDResourceKind is the Kind of a MySQLRestore. - MySQLRestoreCRDResourceKind = "MySQLRestore" - // MySQLBackupScheduleCRDResourceKind is the Kind of a MySQLBackupSchedule. - MySQLBackupScheduleCRDResourceKind = "MySQLBackupSchedule" + // ClusterCRDResourceKind is the Kind of a Cluster. + ClusterCRDResourceKind = "Cluster" + // BackupCRDResourceKind is the Kind of a Backup. + BackupCRDResourceKind = "Backup" + // RestoreCRDResourceKind is the Kind of a Restore. + RestoreCRDResourceKind = "Restore" + // BackupScheduleCRDResourceKind is the Kind of a BackupSchedule. + BackupScheduleCRDResourceKind = "BackupSchedule" ) // Resource gets a MySQL Operator GroupResource for a specified resource. @@ -57,14 +57,14 @@ func Resource(resource string) schema.GroupResource { // scheme. func addKnownTypes(s *runtime.Scheme) error { s.AddKnownTypes(SchemeGroupVersion, - &MySQLCluster{}, - &MySQLClusterList{}, - &MySQLBackup{}, - &MySQLBackupList{}, - &MySQLRestore{}, - &MySQLRestoreList{}, - &MySQLBackupSchedule{}, - &MySQLBackupScheduleList{}) + &Cluster{}, + &ClusterList{}, + &Backup{}, + &BackupList{}, + &Restore{}, + &RestoreList{}, + &BackupSchedule{}, + &BackupScheduleList{}) metav1.AddToGroupVersion(s, SchemeGroupVersion) return nil } diff --git a/pkg/apis/mysql/v1alpha1/restore.go b/pkg/apis/mysql/v1alpha1/restore.go deleted file mode 100644 index f0c851499..000000000 --- a/pkg/apis/mysql/v1alpha1/restore.go +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright 2018 Oracle and/or its affiliates. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package v1alpha1 - -import ( - "github.com/oracle/mysql-operator/pkg/constants" - "github.com/oracle/mysql-operator/pkg/version" - "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -const ( - // RestoreCRDResourceSingular defines the singular custom resource name for - // MySQLRestores. - RestoreCRDResourceSingular = "mysqlrestore" - - // RestoreCRDResourcePlural defines the plural custom resource name for - // MySQLRestores. - RestoreCRDResourcePlural = "mysqlrestores" -) - -// RestoreSpec defines the specification for a restore of a MySQL backup. -type RestoreSpec struct { - // ClusterRef is a refeference to the MySQLCluster to which the MySQLRestore - // belongs. - ClusterRef *v1.LocalObjectReference `json:"clusterRef"` - - // BackupRef is a reference to the MySQLBackup object to be restored. - BackupRef *v1.LocalObjectReference `json:"backupRef"` - - // AgentScheduled is the agent hostname to run the backup on - AgentScheduled string `json:"agentscheduled"` -} - -// RestorePhase represents the current life-cycle phase of a MySQLRestore. -type RestorePhase string - -const ( - // RestorePhaseUnknown means that the restore hasn't yet been processed. - RestorePhaseUnknown RestorePhase = "" - - // RestorePhaseNew means that the restore hasn't yet been processed. - RestorePhaseNew RestorePhase = "New" - - // RestorePhaseScheduled means that the restore has been scheduled on an - // appropriate replica. - RestorePhaseScheduled RestorePhase = "Scheduled" - - // RestorePhaseStarted means the restore is in progress. - RestorePhaseStarted RestorePhase = "Started" - - // RestorePhaseComplete means the restore has terminated successfully. - RestorePhaseComplete RestorePhase = "Complete" - - // RestorePhaseFailed means the Restore has terminated with an error. - RestorePhaseFailed RestorePhase = "Failed" -) - -// RestoreStatus captures the current status of a MySQL restore. -type RestoreStatus struct { - // Phase is the current life-cycle phase of the MySQLRestore. - Phase RestorePhase `json:"phase"` - - // TimeStarted is the time at which the restore was started. - TimeStarted metav1.Time `json:"timeStarted"` - - // TimeCompleted is the time at which the restore completed. - TimeCompleted metav1.Time `json:"timeCompleted"` -} - -// +genclient -// +genclient:noStatus - -// MySQLRestore is a MySQL Operator resource that represents the restoration of -// backup of a MySQL cluster. -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -type MySQLRestore struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata"` - - Spec RestoreSpec `json:"spec"` - Status RestoreStatus `json:"status"` -} - -// MySQLRestoreList is a list of MySQLRestores. -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -type MySQLRestoreList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata"` - - Items []MySQLRestore `json:"items"` -} - -// EnsureDefaults can be invoked to ensure the default values are present. -func (r MySQLRestore) EnsureDefaults() *MySQLRestore { - buildVersion := version.GetBuildVersion() - if buildVersion != "" { - if r.Labels == nil { - r.Labels = make(map[string]string) - } - _, hasKey := r.Labels[constants.MySQLOperatorVersionLabel] - if !hasKey { - SetOperatorVersionLabel(r.Labels, buildVersion) - } - } - return &r -} - -// Validate checks if the resource spec is valid. -func (r MySQLRestore) Validate() error { - return validateRestore(&r).ToAggregate() -} diff --git a/pkg/apis/mysql/v1alpha1/restore_test.go b/pkg/apis/mysql/v1alpha1/restore_test.go index f0badfd15..2a29cd263 100644 --- a/pkg/apis/mysql/v1alpha1/restore_test.go +++ b/pkg/apis/mysql/v1alpha1/restore_test.go @@ -25,7 +25,7 @@ import ( func TestRestoreEnsureDefaults(t *testing.T) { // test a version is set if one does not exist. bv1 := version.GetBuildVersion() - r := MySQLRestore{ + r := Restore{ Spec: RestoreSpec{ ClusterRef: &corev1.LocalObjectReference{ Name: "foo", @@ -41,7 +41,7 @@ func TestRestoreEnsureDefaults(t *testing.T) { } // test a version is not set if one already exists. bv2 := "test-existing-build-version" - r2 := MySQLRestore{} + r2 := Restore{} r2.Labels = make(map[string]string) SetOperatorVersionLabel(r2.Labels, bv2) dr2 := *r2.EnsureDefaults() @@ -52,7 +52,7 @@ func TestRestoreEnsureDefaults(t *testing.T) { func TestRestoreValidate(t *testing.T) { // Test a malformed restore returns errors. - r := MySQLRestore{ + r := Restore{ Spec: RestoreSpec{ ClusterRef: &corev1.LocalObjectReference{ Name: "foo", diff --git a/pkg/apis/mysql/v1alpha1/types.go b/pkg/apis/mysql/v1alpha1/types.go new file mode 100644 index 000000000..79b65465e --- /dev/null +++ b/pkg/apis/mysql/v1alpha1/types.go @@ -0,0 +1,412 @@ +// Copyright 2018 Oracle and/or its affiliates. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package v1alpha1 + +import ( + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +const ( + // The default MySQL version to use if not specified explicitly by user + defaultVersion = "8.0.11" + defaultReplicas = 1 + defaultBaseServerID = 1000 + // Max safe value for BaseServerID calculated as max MySQL server_id value - max Replication Group size + maxBaseServerID uint32 = 4294967295 - 9 +) + +const ( + // MaxInnoDBClusterMembers is the maximum number of members supported by InnoDB + // group replication. + MaxInnoDBClusterMembers = 9 + + // ClusterNameMaxLen is the maximum supported length of a + // Cluster name. + // See: https://bugs.mysql.com/bug.php?id=90601 + ClusterNameMaxLen = 28 +) + +// TODO (owain) we need to remove this because it's not reasonable for us to maintain a list +// of all the potential MySQL versions that can be used and in reality, it shouldn't matter +// too much. The burden of this is not worth the benfit to a user +var validVersions = []string{ + defaultVersion, +} + +// ClusterSpec defines the attributes a user can specify when creating a cluster +type ClusterSpec struct { + // Version defines the MySQL Docker image version. + Version string `json:"version"` + + // Replicas defines the number of running MySQL instances in a cluster + Replicas int32 `json:"replicas,omitempty"` + + // BaseServerID defines the base number used to create uniq server_id for MySQL instances in a cluster. + // The baseServerId value need to be in range from 1 to 4294967286 + // If ommited in the manifest file, or set to 0, defaultBaseServerID value will be used. + BaseServerID uint32 `json:"baseServerId,omitempty"` + + // MultiMaster defines the mode of the MySQL cluster. If set to true, + // all instances will be R/W. If false (the default), only a single instance + // will be R/W and the rest will be R/O. + MultiMaster bool `json:"multiMaster,omitempty"` + + // 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/ + // +optional + NodeSelector map[string]string `json:"nodeSelector,omitempty"` + + // If specified, affinity will define the pod's scheduling constraints + // +optional + Affinity *corev1.Affinity `json:"affinity,omitempty"` + + // VolumeClaimTemplate allows a user to specify how volumes inside a MySQL cluster + // +optional + VolumeClaimTemplate *corev1.PersistentVolumeClaim `json:"volumeClaimTemplate,omitempty"` + + // BackupVolumeClaimTemplate allows a user to specify a volume to temporarily store the + // data for a backup prior to it being shipped to object storage. + // +optional + BackupVolumeClaimTemplate *corev1.PersistentVolumeClaim `json:"backupVolumeClaimTemplate,omitempty"` + + // If defined, we use this secret for configuring the MYSQL_ROOT_PASSWORD + // If it is not set we generate a secret dynamically + // +optional + SecretRef *corev1.LocalObjectReference `json:"secretRef,omitempty"` + + // ConfigRef allows a user to specify a custom configuration file for MySQL. + // +optional + ConfigRef *corev1.LocalObjectReference `json:"configRef,omitempty"` + + // SSLSecretRef allows a user to specify custom CA certificate, server certificate + // and server key for group replication SSL + // +optional + SSLSecretRef *corev1.LocalObjectReference `json:"sslSecretRef,omitempty"` +} + +// ClusterPhase describes the state of the cluster. +type ClusterPhase string + +const ( + // ClusterPhasePending means the cluster has been accepted by the system, + // but one or more of the services or statefulsets has not been started. + // This includes time before being bound to a node, as well as time spent + // pulling images onto the host. + ClusterPhasePending ClusterPhase = "Pending" + + // ClusterPhaseRunning means the cluster has been created, all of it's + // required components are present, and there is at least one endpoint that + // mysql client can connect to. + ClusterPhaseRunning ClusterPhase = "Running" + + // ClusterPhaseSucceeded means that all containers in the pod have + // voluntarily terminated with a container exit code of 0, and the system + // is not going to restart any of these containers. + ClusterPhaseSucceeded ClusterPhase = "Succeeded" + + // ClusterPhaseFailed means that all containers in the pod have terminated, + // and at least one container has terminated in a failure (exited with a + // non-zero exit code or was stopped by the system). + ClusterPhaseFailed ClusterPhase = "Failed" + + // ClusterPhaseUnknown means that for some reason the state of the cluster + // could not be obtained, typically due to an error in communicating with + // the host of the pod. + ClusterPhaseUnknown ClusterPhase = "" +) + +// ValidClusterPhases denote the life-cycle states a cluster can be in. +var ValidClusterPhases = []ClusterPhase{ + ClusterPhasePending, + ClusterPhaseRunning, + ClusterPhaseSucceeded, + ClusterPhaseFailed, + ClusterPhaseUnknown, +} + +// ClusterStatus defines the current status of a MySQL cluster +// propagating useful information back to the cluster admin +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type ClusterStatus struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata"` + Phase ClusterPhase `json:"phase"` + Errors []string `json:"errors"` +} + +// +genclient +// +genclient:noStatus + +// Cluster represents a cluster spec and associated metadata +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type Cluster struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata"` + Spec ClusterSpec `json:"spec"` + Status ClusterStatus `json:"status"` +} + +// ClusterList is a placeholder type for a list of MySQL clusters +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type ClusterList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata"` + Items []Cluster `json:"items"` +} + +// BackupSpec defines the specification for a MySQL backup. This includes what should be backed up, +// what tool should perform the backup, and, where the backup should be stored. +type BackupSpec struct { + // Executor is the configuration of the tool that will produce the backup, and a definition of + // what databases and tables to backup. + Executor *BackupExecutor `json:"executor"` + + // StorageProvider is the configuration of where and how backups should be stored. + StorageProvider *BackupStorageProvider `json:"storageProvider"` + + // Cluster is a reference to the Cluster to which the Backup belongs. + Cluster *corev1.LocalObjectReference `json:"cluster"` + + // AgentScheduled is the agent hostname to run the backup on. + // TODO(apryde): ScheduledAgent (*corev1.LocalObjectReference)? + AgentScheduled string `json:"agentscheduled"` +} + +// BackupExecutor represents the configuration of the tool performing the backup. This includes the tool +// to use, and, what database and tables should be backed up. +// The storage of the backup is configured in the relevant Storage configuration. +type BackupExecutor struct { + // Name of the tool performing the backup, e.g. mysqldump. + Name string `json:"name"` + // Databases are the databases to backup. + Databases []string `json:"databases"` +} + +// BackupStorageProvider defines the configuration for storing a MySQL backup to a storage service. +// The generation of the backup is configured in the Executor configuration. +type BackupStorageProvider struct { + // Name denotes the type of storage provider that will store and retrieve the backups, + // e.g. s3, oci-s3-compat, aws-s3, gce-s3, etc. + Name string `json:"name"` + // SecretRef is a reference to the Kubernetes secret containing the configuration for uploading + // the backup to authenticated storage. + SecretRef *corev1.LocalObjectReference `json:"secretRef,omitempty"` + // Config is generic string based key-value map that defines non-secret configuration values for + // uploading the backup to storage w.r.t the configured storage provider. + Config map[string]string `json:"config,omitempty"` +} + +// BackupPhase represents the current life-cycle phase of a Backup. +type BackupPhase string + +const ( + // BackupPhaseUnknown means that the backup hasn't yet been processed. + BackupPhaseUnknown BackupPhase = "" + + // BackupPhaseNew means that the Backup hasn't yet been processed. + BackupPhaseNew BackupPhase = "New" + + // BackupPhaseScheduled means that the Backup has been scheduled on an + // appropriate replica. + BackupPhaseScheduled BackupPhase = "Scheduled" + + // BackupPhaseStarted means the backup is in progress. + BackupPhaseStarted BackupPhase = "Started" + + // BackupPhaseComplete means the backup has terminated successfully. + BackupPhaseComplete BackupPhase = "Complete" + + // BackupPhaseFailed means the backup has terminated with an error. + BackupPhaseFailed BackupPhase = "Failed" +) + +// BackupOutcome describes the location of a MySQL Backup +type BackupOutcome struct { + // Location is the Object Storage network location of the Backup. + Location string `json:"location"` +} + +// BackupStatus captures the current status of a MySQL backup. +type BackupStatus struct { + // Phase is the current life-cycle phase of the Backup. + Phase BackupPhase `json:"phase"` + + // Outcome holds the results of a successful backup. + Outcome BackupOutcome `json:"outcome"` + + // TimeStarted is the time at which the backup was started. + TimeStarted metav1.Time `json:"timeStarted"` + + // TimeCompleted is the time at which the backup completed. + TimeCompleted metav1.Time `json:"timeCompleted"` +} + +// +genclient +// +genclient:noStatus + +// Backup is a MySQL Operator resource that represents a backup of a MySQL +// cluster. +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type Backup struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata"` + + Spec BackupSpec `json:"spec"` + Status BackupStatus `json:"status"` +} + +// BackupList is a list of Backups. +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type BackupList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata"` + + Items []Backup `json:"items"` +} + +// BackupScheduleSpec defines the specification for a MySQL backup schedule. +type BackupScheduleSpec struct { + // Schedule specifies the cron string used for backup scheduling. + Schedule string `json:"schedule"` + + // BackupTemplate is the specification of the backup structure + // to get scheduled. + BackupTemplate BackupSpec `json:"backupTemplate"` +} + +// BackupSchedulePhase is a string representation of the lifecycle phase +// of a backup schedule. +type BackupSchedulePhase string + +const ( + // BackupSchedulePhaseNew means the backup schedule has been created but not + // yet processed by the backup schedule controller. + BackupSchedulePhaseNew BackupSchedulePhase = "New" + + // BackupSchedulePhaseEnabled means the backup schedule has been validated and + // will now be triggering backups according to the schedule spec. + BackupSchedulePhaseEnabled BackupSchedulePhase = "Enabled" + + // BackupSchedulePhaseFailedValidation means the backup schedule has failed + // the controller's validations and therefore will not trigger backups. + BackupSchedulePhaseFailedValidation BackupSchedulePhase = "FailedValidation" +) + +// ScheduleStatus captures the current state of a MySQL backup schedule. +type ScheduleStatus struct { + // Phase is the current phase of the MySQL backup schedule. + Phase BackupSchedulePhase `json:"phase"` + + // LastBackup is the last time a Backup was run for this + // backup schedule. + LastBackup metav1.Time `json:"lastBackup"` +} + +// +genclient +// +genclient:noStatus + +// BackupSchedule is a MySQL Operator resource that represents a backup +// schedule of a MySQL cluster. +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type BackupSchedule struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata"` + + Spec BackupScheduleSpec `json:"spec"` + Status ScheduleStatus `json:"status,omitempty"` +} + +// BackupScheduleList is a list of BackupSchedules. +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type BackupScheduleList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata"` + + Items []BackupSchedule `json:"items"` +} + +// RestoreSpec defines the specification for a restore of a MySQL backup. +type RestoreSpec struct { + // ClusterRef is a refeference to the Cluster to which the Restore + // belongs. + ClusterRef *corev1.LocalObjectReference `json:"clusterRef"` + + // BackupRef is a reference to the Backup object to be restored. + BackupRef *corev1.LocalObjectReference `json:"backupRef"` + + // AgentScheduled is the agent hostname to run the backup on + AgentScheduled string `json:"agentscheduled"` +} + +// RestorePhase represents the current life-cycle phase of a Restore. +type RestorePhase string + +const ( + // RestorePhaseUnknown means that the restore hasn't yet been processed. + RestorePhaseUnknown RestorePhase = "" + + // RestorePhaseNew means that the restore hasn't yet been processed. + RestorePhaseNew RestorePhase = "New" + + // RestorePhaseScheduled means that the restore has been scheduled on an + // appropriate replica. + RestorePhaseScheduled RestorePhase = "Scheduled" + + // RestorePhaseStarted means the restore is in progress. + RestorePhaseStarted RestorePhase = "Started" + + // RestorePhaseComplete means the restore has terminated successfully. + RestorePhaseComplete RestorePhase = "Complete" + + // RestorePhaseFailed means the Restore has terminated with an error. + RestorePhaseFailed RestorePhase = "Failed" +) + +// RestoreStatus captures the current status of a MySQL restore. +type RestoreStatus struct { + // Phase is the current life-cycle phase of the Restore. + Phase RestorePhase `json:"phase"` + + // TimeStarted is the time at which the restore was started. + TimeStarted metav1.Time `json:"timeStarted"` + + // TimeCompleted is the time at which the restore completed. + TimeCompleted metav1.Time `json:"timeCompleted"` +} + +// +genclient +// +genclient:noStatus + +// Restore is a MySQL Operator resource that represents the restoration of +// backup of a MySQL cluster. +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type Restore struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata"` + + Spec RestoreSpec `json:"spec"` + Status RestoreStatus `json:"status"` +} + +// RestoreList is a list of Restores. +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type RestoreList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata"` + + Items []Restore `json:"items"` +} diff --git a/pkg/apis/mysql/v1alpha1/validate_backup.go b/pkg/apis/mysql/v1alpha1/validate_backup.go index ca1147a2a..c5ffa8a37 100644 --- a/pkg/apis/mysql/v1alpha1/validate_backup.go +++ b/pkg/apis/mysql/v1alpha1/validate_backup.go @@ -22,7 +22,7 @@ import ( "github.com/oracle/mysql-operator/pkg/constants" ) -func validateBackup(backup *MySQLBackup) field.ErrorList { +func validateBackup(backup *Backup) field.ErrorList { allErrs := field.ErrorList{} allErrs = append(allErrs, validateBackupLabels(backup.Labels, field.NewPath("labels"))...) allErrs = append(allErrs, validateBackupSpec(backup.Spec, field.NewPath("spec"))...) @@ -48,14 +48,14 @@ func validateBackupSpec(spec BackupSpec, fldPath *field.Path) field.ErrorList { allErrs = append(allErrs, validateExecutor(spec.Executor, field.NewPath("executor"))...) } - if spec.Storage == nil { - allErrs = append(allErrs, field.Required(fldPath.Child("storage"), "missing storage")) + if spec.StorageProvider == nil { + allErrs = append(allErrs, field.Required(fldPath.Child("storageProvider"), "missing storage provider")) } else { - allErrs = append(allErrs, validateStorage(spec.Storage, field.NewPath("storage"))...) + allErrs = append(allErrs, validateStorage(spec.StorageProvider, field.NewPath("storageProvider"))...) } - if spec.ClusterRef == nil { - allErrs = append(allErrs, field.Required(fldPath.Child("clusterRef"), "missing cluster")) + if spec.Cluster == nil { + allErrs = append(allErrs, field.Required(fldPath.Child("cluster"), "missing cluster")) } return allErrs diff --git a/pkg/apis/mysql/v1alpha1/validate_backup_executor.go b/pkg/apis/mysql/v1alpha1/validate_backup_executor.go index a80af3a45..772c96a52 100644 --- a/pkg/apis/mysql/v1alpha1/validate_backup_executor.go +++ b/pkg/apis/mysql/v1alpha1/validate_backup_executor.go @@ -33,13 +33,13 @@ func isValidExecutorProvider(provider string) bool { return false } -func validateExecutor(executor *Executor, fldPath *field.Path) field.ErrorList { +func validateExecutor(executor *BackupExecutor, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} - if executor.Provider == "" { - allErrs = append(allErrs, field.Required(fldPath.Child("provider"), "")) - } else if !isValidExecutorProvider(executor.Provider) { - allErrs = append(allErrs, field.Invalid(fldPath.Child("provider"), executor, fmt.Sprintf("invalid provider name '%s'", executor.Provider))) + if executor.Name == "" { + allErrs = append(allErrs, field.Required(fldPath.Child("name"), "")) + } else if !isValidExecutorProvider(executor.Name) { + allErrs = append(allErrs, field.Invalid(fldPath.Child("name"), executor, fmt.Sprintf("invalid provider name %q", executor.Name))) } if executor.Databases == nil || len(executor.Databases) == 0 { diff --git a/pkg/apis/mysql/v1alpha1/validate_backup_storage.go b/pkg/apis/mysql/v1alpha1/validate_backup_storage.go index 44438d88b..93eaab11c 100644 --- a/pkg/apis/mysql/v1alpha1/validate_backup_storage.go +++ b/pkg/apis/mysql/v1alpha1/validate_backup_storage.go @@ -26,21 +26,21 @@ const ( ProviderS3 = "s3" ) -func validateStorage(storage *Storage, fldPath *field.Path) field.ErrorList { +func validateStorage(storage *BackupStorageProvider, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} - if storage.Provider == "" { - allErrs = append(allErrs, field.Required(fldPath.Child("provider"), "")) + if storage.Name == "" { + allErrs = append(allErrs, field.Required(fldPath.Child("name"), "")) } if storage.Config == nil { allErrs = append(allErrs, field.Required(fldPath.Child("config"), "")) } else { - switch strings.ToLower(storage.Provider) { + switch strings.ToLower(storage.Name) { case ProviderS3: allErrs = append(allErrs, validateS3StorageConfig(storage.Config, field.NewPath("config"))...) default: - allErrs = append(allErrs, field.Invalid(fldPath.Child("provider"), storage, fmt.Sprintf("invalid storage name '%s'. Permitted names: s3.", storage.Provider))) + allErrs = append(allErrs, field.Invalid(fldPath.Child("name"), storage, fmt.Sprintf("invalid storage name '%s'. Permitted names: s3.", storage.Name))) } } diff --git a/pkg/apis/mysql/v1alpha1/backup_test.go b/pkg/apis/mysql/v1alpha1/validate_backup_test.go similarity index 81% rename from pkg/apis/mysql/v1alpha1/backup_test.go rename to pkg/apis/mysql/v1alpha1/validate_backup_test.go index 1093f4001..64920ef19 100644 --- a/pkg/apis/mysql/v1alpha1/backup_test.go +++ b/pkg/apis/mysql/v1alpha1/validate_backup_test.go @@ -24,7 +24,7 @@ import ( ) func TestEmptyBackupIsInvalid(t *testing.T) { - backup := MySQLBackup{} + backup := Backup{} err := backup.Validate() if err == nil { t.Error("An empty backup should be invalid") @@ -32,14 +32,14 @@ func TestEmptyBackupIsInvalid(t *testing.T) { } func TestValidateValidBackup(t *testing.T) { - backup := MySQLBackup{ + backup := Backup{ Spec: BackupSpec{ - Executor: &Executor{ - Provider: "mysqldump", + Executor: &BackupExecutor{ + Name: "mysqldump", Databases: []string{"db1", "db2"}, }, - Storage: &Storage{ - Provider: "s3", + StorageProvider: &BackupStorageProvider{ + Name: "s3", SecretRef: &corev1.LocalObjectReference{ Name: "backup-storage-creds", }, @@ -49,7 +49,7 @@ func TestValidateValidBackup(t *testing.T) { "bucket": "bucket", }, }, - ClusterRef: &corev1.LocalObjectReference{ + Cluster: &corev1.LocalObjectReference{ Name: "test-cluster", }, }, @@ -64,7 +64,7 @@ func TestValidateValidBackup(t *testing.T) { func TestBackupEnsureDefaultVersionSet(t *testing.T) { expected := version.GetBuildVersion() - backup := &MySQLBackup{} + backup := &Backup{} backup = backup.EnsureDefaults() actual := GetOperatorVersionLabel(backup.Labels) @@ -75,7 +75,7 @@ func TestBackupEnsureDefaultVersionSet(t *testing.T) { func TestBackupEnsureDefaultVersionNotSetIfExists(t *testing.T) { version := "v1.0.0" - backup := &MySQLBackup{} + backup := &Backup{} backup.Labels = make(map[string]string) SetOperatorVersionLabel(backup.Labels, version) backup = backup.EnsureDefaults() @@ -88,14 +88,14 @@ func TestBackupEnsureDefaultVersionNotSetIfExists(t *testing.T) { } func TestValidateBackupMissingCluster(t *testing.T) { - backup := MySQLBackup{ + backup := Backup{ Spec: BackupSpec{ - Executor: &Executor{ - Provider: "mysqldump", + Executor: &BackupExecutor{ + Name: "mysqldump", Databases: []string{"db1", "db2"}, }, - Storage: &Storage{ - Provider: "s3", + StorageProvider: &BackupStorageProvider{ + Name: "s3", SecretRef: &corev1.LocalObjectReference{ Name: "backup-storage-creds", }, @@ -115,30 +115,28 @@ func TestValidateBackupMissingCluster(t *testing.T) { } func TestValidateBackupMissingSecretRef(t *testing.T) { - backup := MySQLBackup{ + backup := Backup{ Spec: BackupSpec{ - Executor: &Executor{ - Provider: "mysqldump", + Executor: &BackupExecutor{ + Name: "mysqldump", Databases: []string{"db1", "db2"}, }, - Storage: &Storage{ - Provider: "s3", + StorageProvider: &BackupStorageProvider{ + Name: "s3", Config: map[string]string{ "endpoint": "endpoint", "region": "region", "bucket": "bucket", }, }, - ClusterRef: &corev1.LocalObjectReference{ + Cluster: &corev1.LocalObjectReference{ Name: "test-cluster", }, }, } err := backup.Validate() - if !strings.Contains(err.Error(), "storage.secretRef: Required value") { - t.Errorf("Expected backup with missing SecretRef to show 'storage.secretRef: Required value' error. Error is: %s", err) + if !strings.Contains(err.Error(), "storageProvider.secretRef: Required value") { + t.Errorf("Expected backup with missing SecretRef to show 'storageProvider.secretRef: Required value' error. Error is: %s", err) } } - -// Error is: storage.secretRef: Required value diff --git a/pkg/apis/mysql/v1alpha1/validate_backupschedule.go b/pkg/apis/mysql/v1alpha1/validate_backupschedule.go index 594f83f5e..cfe6cc36b 100644 --- a/pkg/apis/mysql/v1alpha1/validate_backupschedule.go +++ b/pkg/apis/mysql/v1alpha1/validate_backupschedule.go @@ -18,7 +18,7 @@ import ( "k8s.io/apimachinery/pkg/util/validation/field" ) -func validateBackupSchedule(bs *MySQLBackupSchedule) field.ErrorList { +func validateBackupSchedule(bs *BackupSchedule) field.ErrorList { allErrs := field.ErrorList{} allErrs = append(allErrs, validateBackupScheduleSpec(bs.Spec, field.NewPath("spec"))...) return allErrs diff --git a/pkg/apis/mysql/v1alpha1/backupschedule_test.go b/pkg/apis/mysql/v1alpha1/validate_backupschedule_test.go similarity index 81% rename from pkg/apis/mysql/v1alpha1/backupschedule_test.go rename to pkg/apis/mysql/v1alpha1/validate_backupschedule_test.go index 152592276..606bef67f 100644 --- a/pkg/apis/mysql/v1alpha1/backupschedule_test.go +++ b/pkg/apis/mysql/v1alpha1/validate_backupschedule_test.go @@ -24,7 +24,7 @@ import ( ) func TestEmptyBackupScheduleIsInvalid(t *testing.T) { - bs := MySQLBackupSchedule{} + bs := BackupSchedule{} err := bs.Validate() if err == nil { t.Error("An empty backup schedule should be invalid") @@ -32,16 +32,16 @@ func TestEmptyBackupScheduleIsInvalid(t *testing.T) { } func TestValidateValidBackupSchedule(t *testing.T) { - bs := MySQLBackupSchedule{ + bs := BackupSchedule{ Spec: BackupScheduleSpec{ Schedule: "* * * * * *", BackupTemplate: BackupSpec{ - Executor: &Executor{ - Provider: "mysqldump", + Executor: &BackupExecutor{ + Name: "mysqldump", Databases: []string{"db1", "db2"}, }, - Storage: &Storage{ - Provider: "s3", + StorageProvider: &BackupStorageProvider{ + Name: "s3", SecretRef: &corev1.LocalObjectReference{ Name: "backup-storage-creds", }, @@ -51,7 +51,7 @@ func TestValidateValidBackupSchedule(t *testing.T) { "bucket": "bucket", }, }, - ClusterRef: &corev1.LocalObjectReference{ + Cluster: &corev1.LocalObjectReference{ Name: "test-cluster", }, }, @@ -67,7 +67,7 @@ func TestValidateValidBackupSchedule(t *testing.T) { func TestBackupScheduleEnsureDefaultVersionSet(t *testing.T) { expected := version.GetBuildVersion() - bs := &MySQLBackupSchedule{} + bs := &BackupSchedule{} bs = bs.EnsureDefaults() actual := GetOperatorVersionLabel(bs.Labels) @@ -78,7 +78,7 @@ func TestBackupScheduleEnsureDefaultVersionSet(t *testing.T) { func TestBackupScheduleEnsureDefaultVersionNotSetIfExists(t *testing.T) { version := "v1.0.0" - bs := &MySQLBackupSchedule{} + bs := &BackupSchedule{} bs.Labels = make(map[string]string) SetOperatorVersionLabel(bs.Labels, version) bs = bs.EnsureDefaults() @@ -91,16 +91,16 @@ func TestBackupScheduleEnsureDefaultVersionNotSetIfExists(t *testing.T) { } func TestValidateBackupScheduleMissingCluster(t *testing.T) { - bs := MySQLBackupSchedule{ + bs := BackupSchedule{ Spec: BackupScheduleSpec{ Schedule: "* * * * * *", BackupTemplate: BackupSpec{ - Executor: &Executor{ - Provider: "mysqldump", + Executor: &BackupExecutor{ + Name: "mysqldump", Databases: []string{"db1", "db2"}, }, - Storage: &Storage{ - Provider: "s3", + StorageProvider: &BackupStorageProvider{ + Name: "s3", SecretRef: &corev1.LocalObjectReference{ Name: "backup-storage-creds", }, @@ -122,23 +122,23 @@ func TestValidateBackupScheduleMissingCluster(t *testing.T) { } func TestValidateBackupScheduleMissingSecretRef(t *testing.T) { - bs := MySQLBackupSchedule{ + bs := BackupSchedule{ Spec: BackupScheduleSpec{ Schedule: "* * * * * *", BackupTemplate: BackupSpec{ - Executor: &Executor{ - Provider: "mysqldump", + Executor: &BackupExecutor{ + Name: "mysqldump", Databases: []string{"db1", "db2"}, }, - Storage: &Storage{ - Provider: "s3", + StorageProvider: &BackupStorageProvider{ + Name: "s3", Config: map[string]string{ "endpoint": "endpoint", "region": "region", "bucket": "bucket", }, }, - ClusterRef: &corev1.LocalObjectReference{ + Cluster: &corev1.LocalObjectReference{ Name: "test-cluster", }, AgentScheduled: "hostname-1", @@ -147,7 +147,7 @@ func TestValidateBackupScheduleMissingSecretRef(t *testing.T) { } err := bs.Validate() - if !strings.Contains(err.Error(), "storage.secretRef: Required value") { - t.Errorf("Expected backup schedule with missing SecretRef to show 'storage.secretRef: Required value' error. Error is: %s", err) + if !strings.Contains(err.Error(), "storageProvider.secretRef: Required value") { + t.Errorf("Expected backup schedule with missing SecretRef to show 'storageProvider.secretRef: Required value' error. Error is: %s", err) } } diff --git a/pkg/apis/mysql/v1alpha1/validate_cluster.go b/pkg/apis/mysql/v1alpha1/validate_cluster.go index 511d6ef00..55e31149d 100644 --- a/pkg/apis/mysql/v1alpha1/validate_cluster.go +++ b/pkg/apis/mysql/v1alpha1/validate_cluster.go @@ -22,7 +22,7 @@ import ( "k8s.io/apimachinery/pkg/util/validation/field" ) -func validateCluster(c *MySQLCluster) field.ErrorList { +func validateCluster(c *Cluster) field.ErrorList { allErrs := field.ErrorList{} allErrs = append(allErrs, validateClusterMetadata(c.ObjectMeta, field.NewPath("metadata"))...) allErrs = append(allErrs, validateClusterSpec(c.Spec, field.NewPath("spec"))...) @@ -41,7 +41,7 @@ func validateClusterMetadata(m metav1.ObjectMeta, fldPath *field.Path) field.Err func validateName(name string, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} - if len(name) > MySQLClusterNameMaxLen { + if len(name) > ClusterNameMaxLen { msg := fmt.Sprintf("longer than maximum supported length %d (see: https://bugs.mysql.com/bug.php?id=90601)", MaxInnoDBClusterMembers) allErrs = append(allErrs, field.Invalid(fldPath, name, msg)) } @@ -49,7 +49,7 @@ func validateName(name string, fldPath *field.Path) field.ErrorList { return allErrs } -func validateClusterSpec(s MySQLClusterSpec, fldPath *field.Path) field.ErrorList { +func validateClusterSpec(s ClusterSpec, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} allErrs = append(allErrs, validateVersion(s.Version, fldPath.Child("version"))...) @@ -59,7 +59,7 @@ func validateClusterSpec(s MySQLClusterSpec, fldPath *field.Path) field.ErrorLis return allErrs } -func validateClusterStatus(s MySQLClusterStatus, fldPath *field.Path) field.ErrorList { +func validateClusterStatus(s ClusterStatus, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} allErrs = append(allErrs, validatePhase(s.Phase, fldPath.Child("phase"))...) return allErrs @@ -83,9 +83,9 @@ func validateBaseServerID(baseServerID uint32, fldPath *field.Path) field.ErrorL return append(allErrs, field.Invalid(fldPath, strconv.FormatUint(uint64(baseServerID), 10), "invalid baseServerId specified")) } -func validatePhase(phase MySQLClusterPhase, fldPath *field.Path) field.ErrorList { +func validatePhase(phase ClusterPhase, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} - for _, validPhase := range MySQLClusterValidPhases { + for _, validPhase := range ValidClusterPhases { if phase == validPhase { return allErrs } diff --git a/pkg/apis/mysql/v1alpha1/validate_restore.go b/pkg/apis/mysql/v1alpha1/validate_restore.go index f72c029ea..0e2665a7a 100644 --- a/pkg/apis/mysql/v1alpha1/validate_restore.go +++ b/pkg/apis/mysql/v1alpha1/validate_restore.go @@ -22,7 +22,7 @@ import ( "github.com/oracle/mysql-operator/pkg/constants" ) -func validateRestore(restore *MySQLRestore) field.ErrorList { +func validateRestore(restore *Restore) field.ErrorList { allErrs := field.ErrorList{} allErrs = append(allErrs, validateRestoreSpec(restore.Spec, field.NewPath("spec"))...) diff --git a/pkg/apis/mysql/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/mysql/v1alpha1/zz_generated.deepcopy.go index 6f3ac7a3f..190548e90 100644 --- a/pkg/apis/mysql/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/mysql/v1alpha1/zz_generated.deepcopy.go @@ -24,123 +24,107 @@ import ( ) // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *BackupOutcome) DeepCopyInto(out *BackupOutcome) { +func (in *Backup) DeepCopyInto(out *Backup) { *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BackupOutcome. -func (in *BackupOutcome) DeepCopy() *BackupOutcome { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Backup. +func (in *Backup) DeepCopy() *Backup { if in == nil { return nil } - out := new(BackupOutcome) + out := new(Backup) in.DeepCopyInto(out) return out } +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Backup) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } else { + return nil + } +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *BackupScheduleSpec) DeepCopyInto(out *BackupScheduleSpec) { +func (in *BackupExecutor) DeepCopyInto(out *BackupExecutor) { *out = *in - in.BackupTemplate.DeepCopyInto(&out.BackupTemplate) + if in.Databases != nil { + in, out := &in.Databases, &out.Databases + *out = make([]string, len(*in)) + copy(*out, *in) + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BackupScheduleSpec. -func (in *BackupScheduleSpec) DeepCopy() *BackupScheduleSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BackupExecutor. +func (in *BackupExecutor) DeepCopy() *BackupExecutor { if in == nil { return nil } - out := new(BackupScheduleSpec) + out := new(BackupExecutor) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *BackupSpec) DeepCopyInto(out *BackupSpec) { +func (in *BackupList) DeepCopyInto(out *BackupList) { *out = *in - if in.Executor != nil { - in, out := &in.Executor, &out.Executor - if *in == nil { - *out = nil - } else { - *out = new(Executor) - (*in).DeepCopyInto(*out) - } - } - if in.Storage != nil { - in, out := &in.Storage, &out.Storage - if *in == nil { - *out = nil - } else { - *out = new(Storage) - (*in).DeepCopyInto(*out) - } - } - if in.ClusterRef != nil { - in, out := &in.ClusterRef, &out.ClusterRef - if *in == nil { - *out = nil - } else { - *out = new(v1.LocalObjectReference) - **out = **in + out.TypeMeta = in.TypeMeta + out.ListMeta = in.ListMeta + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Backup, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) } } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BackupSpec. -func (in *BackupSpec) DeepCopy() *BackupSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BackupList. +func (in *BackupList) DeepCopy() *BackupList { if in == nil { return nil } - out := new(BackupSpec) + out := new(BackupList) in.DeepCopyInto(out) return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *BackupStatus) DeepCopyInto(out *BackupStatus) { - *out = *in - out.Outcome = in.Outcome - in.TimeStarted.DeepCopyInto(&out.TimeStarted) - in.TimeCompleted.DeepCopyInto(&out.TimeCompleted) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BackupStatus. -func (in *BackupStatus) DeepCopy() *BackupStatus { - if in == nil { +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *BackupList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } else { return nil } - out := new(BackupStatus) - in.DeepCopyInto(out) - return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Executor) DeepCopyInto(out *Executor) { +func (in *BackupOutcome) DeepCopyInto(out *BackupOutcome) { *out = *in - if in.Databases != nil { - in, out := &in.Databases, &out.Databases - *out = make([]string, len(*in)) - copy(*out, *in) - } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Executor. -func (in *Executor) DeepCopy() *Executor { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BackupOutcome. +func (in *BackupOutcome) DeepCopy() *BackupOutcome { if in == nil { return nil } - out := new(Executor) + out := new(BackupOutcome) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *MySQLBackup) DeepCopyInto(out *MySQLBackup) { +func (in *BackupSchedule) DeepCopyInto(out *BackupSchedule) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) @@ -149,18 +133,18 @@ func (in *MySQLBackup) DeepCopyInto(out *MySQLBackup) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MySQLBackup. -func (in *MySQLBackup) DeepCopy() *MySQLBackup { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BackupSchedule. +func (in *BackupSchedule) DeepCopy() *BackupSchedule { if in == nil { return nil } - out := new(MySQLBackup) + out := new(BackupSchedule) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *MySQLBackup) DeepCopyObject() runtime.Object { +func (in *BackupSchedule) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } else { @@ -169,13 +153,13 @@ func (in *MySQLBackup) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *MySQLBackupList) DeepCopyInto(out *MySQLBackupList) { +func (in *BackupScheduleList) DeepCopyInto(out *BackupScheduleList) { *out = *in out.TypeMeta = in.TypeMeta out.ListMeta = in.ListMeta if in.Items != nil { in, out := &in.Items, &out.Items - *out = make([]MySQLBackup, len(*in)) + *out = make([]BackupSchedule, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -183,18 +167,18 @@ func (in *MySQLBackupList) DeepCopyInto(out *MySQLBackupList) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MySQLBackupList. -func (in *MySQLBackupList) DeepCopy() *MySQLBackupList { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BackupScheduleList. +func (in *BackupScheduleList) DeepCopy() *BackupScheduleList { if in == nil { return nil } - out := new(MySQLBackupList) + out := new(BackupScheduleList) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *MySQLBackupList) DeepCopyObject() runtime.Object { +func (in *BackupScheduleList) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } else { @@ -203,70 +187,118 @@ func (in *MySQLBackupList) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *MySQLBackupSchedule) DeepCopyInto(out *MySQLBackupSchedule) { +func (in *BackupScheduleSpec) DeepCopyInto(out *BackupScheduleSpec) { *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) + in.BackupTemplate.DeepCopyInto(&out.BackupTemplate) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MySQLBackupSchedule. -func (in *MySQLBackupSchedule) DeepCopy() *MySQLBackupSchedule { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BackupScheduleSpec. +func (in *BackupScheduleSpec) DeepCopy() *BackupScheduleSpec { if in == nil { return nil } - out := new(MySQLBackupSchedule) + out := new(BackupScheduleSpec) in.DeepCopyInto(out) return out } -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *MySQLBackupSchedule) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } else { +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BackupSpec) DeepCopyInto(out *BackupSpec) { + *out = *in + if in.Executor != nil { + in, out := &in.Executor, &out.Executor + if *in == nil { + *out = nil + } else { + *out = new(BackupExecutor) + (*in).DeepCopyInto(*out) + } + } + if in.StorageProvider != nil { + in, out := &in.StorageProvider, &out.StorageProvider + if *in == nil { + *out = nil + } else { + *out = new(BackupStorageProvider) + (*in).DeepCopyInto(*out) + } + } + if in.Cluster != nil { + in, out := &in.Cluster, &out.Cluster + if *in == nil { + *out = nil + } else { + *out = new(v1.LocalObjectReference) + **out = **in + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BackupSpec. +func (in *BackupSpec) DeepCopy() *BackupSpec { + if in == nil { return nil } + out := new(BackupSpec) + in.DeepCopyInto(out) + return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *MySQLBackupScheduleList) DeepCopyInto(out *MySQLBackupScheduleList) { +func (in *BackupStatus) DeepCopyInto(out *BackupStatus) { *out = *in - out.TypeMeta = in.TypeMeta - out.ListMeta = in.ListMeta - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]MySQLBackupSchedule, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } + out.Outcome = in.Outcome + in.TimeStarted.DeepCopyInto(&out.TimeStarted) + in.TimeCompleted.DeepCopyInto(&out.TimeCompleted) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MySQLBackupScheduleList. -func (in *MySQLBackupScheduleList) DeepCopy() *MySQLBackupScheduleList { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BackupStatus. +func (in *BackupStatus) DeepCopy() *BackupStatus { if in == nil { return nil } - out := new(MySQLBackupScheduleList) + out := new(BackupStatus) in.DeepCopyInto(out) return out } -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *MySQLBackupScheduleList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } else { +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BackupStorageProvider) DeepCopyInto(out *BackupStorageProvider) { + *out = *in + if in.SecretRef != nil { + in, out := &in.SecretRef, &out.SecretRef + if *in == nil { + *out = nil + } else { + *out = new(v1.LocalObjectReference) + **out = **in + } + } + if in.Config != nil { + in, out := &in.Config, &out.Config + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BackupStorageProvider. +func (in *BackupStorageProvider) DeepCopy() *BackupStorageProvider { + if in == nil { return nil } + out := new(BackupStorageProvider) + in.DeepCopyInto(out) + return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *MySQLCluster) DeepCopyInto(out *MySQLCluster) { +func (in *Cluster) DeepCopyInto(out *Cluster) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) @@ -275,18 +307,18 @@ func (in *MySQLCluster) DeepCopyInto(out *MySQLCluster) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MySQLCluster. -func (in *MySQLCluster) DeepCopy() *MySQLCluster { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Cluster. +func (in *Cluster) DeepCopy() *Cluster { if in == nil { return nil } - out := new(MySQLCluster) + out := new(Cluster) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *MySQLCluster) DeepCopyObject() runtime.Object { +func (in *Cluster) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } else { @@ -295,13 +327,13 @@ func (in *MySQLCluster) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *MySQLClusterList) DeepCopyInto(out *MySQLClusterList) { +func (in *ClusterList) DeepCopyInto(out *ClusterList) { *out = *in out.TypeMeta = in.TypeMeta out.ListMeta = in.ListMeta if in.Items != nil { in, out := &in.Items, &out.Items - *out = make([]MySQLCluster, len(*in)) + *out = make([]Cluster, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -309,18 +341,18 @@ func (in *MySQLClusterList) DeepCopyInto(out *MySQLClusterList) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MySQLClusterList. -func (in *MySQLClusterList) DeepCopy() *MySQLClusterList { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterList. +func (in *ClusterList) DeepCopy() *ClusterList { if in == nil { return nil } - out := new(MySQLClusterList) + out := new(ClusterList) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *MySQLClusterList) DeepCopyObject() runtime.Object { +func (in *ClusterList) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } else { @@ -329,7 +361,7 @@ func (in *MySQLClusterList) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *MySQLClusterSpec) DeepCopyInto(out *MySQLClusterSpec) { +func (in *ClusterSpec) DeepCopyInto(out *ClusterSpec) { *out = *in if in.NodeSelector != nil { in, out := &in.NodeSelector, &out.NodeSelector @@ -395,18 +427,18 @@ func (in *MySQLClusterSpec) DeepCopyInto(out *MySQLClusterSpec) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MySQLClusterSpec. -func (in *MySQLClusterSpec) DeepCopy() *MySQLClusterSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterSpec. +func (in *ClusterSpec) DeepCopy() *ClusterSpec { if in == nil { return nil } - out := new(MySQLClusterSpec) + out := new(ClusterSpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *MySQLClusterStatus) DeepCopyInto(out *MySQLClusterStatus) { +func (in *ClusterStatus) DeepCopyInto(out *ClusterStatus) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) @@ -418,18 +450,18 @@ func (in *MySQLClusterStatus) DeepCopyInto(out *MySQLClusterStatus) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MySQLClusterStatus. -func (in *MySQLClusterStatus) DeepCopy() *MySQLClusterStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterStatus. +func (in *ClusterStatus) DeepCopy() *ClusterStatus { if in == nil { return nil } - out := new(MySQLClusterStatus) + out := new(ClusterStatus) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *MySQLClusterStatus) DeepCopyObject() runtime.Object { +func (in *ClusterStatus) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } else { @@ -438,7 +470,7 @@ func (in *MySQLClusterStatus) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *MySQLRestore) DeepCopyInto(out *MySQLRestore) { +func (in *Restore) DeepCopyInto(out *Restore) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) @@ -447,18 +479,18 @@ func (in *MySQLRestore) DeepCopyInto(out *MySQLRestore) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MySQLRestore. -func (in *MySQLRestore) DeepCopy() *MySQLRestore { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Restore. +func (in *Restore) DeepCopy() *Restore { if in == nil { return nil } - out := new(MySQLRestore) + out := new(Restore) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *MySQLRestore) DeepCopyObject() runtime.Object { +func (in *Restore) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } else { @@ -467,13 +499,13 @@ func (in *MySQLRestore) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *MySQLRestoreList) DeepCopyInto(out *MySQLRestoreList) { +func (in *RestoreList) DeepCopyInto(out *RestoreList) { *out = *in out.TypeMeta = in.TypeMeta out.ListMeta = in.ListMeta if in.Items != nil { in, out := &in.Items, &out.Items - *out = make([]MySQLRestore, len(*in)) + *out = make([]Restore, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -481,18 +513,18 @@ func (in *MySQLRestoreList) DeepCopyInto(out *MySQLRestoreList) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MySQLRestoreList. -func (in *MySQLRestoreList) DeepCopy() *MySQLRestoreList { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RestoreList. +func (in *RestoreList) DeepCopy() *RestoreList { if in == nil { return nil } - out := new(MySQLRestoreList) + out := new(RestoreList) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *MySQLRestoreList) DeepCopyObject() runtime.Object { +func (in *RestoreList) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } else { @@ -568,35 +600,3 @@ func (in *ScheduleStatus) DeepCopy() *ScheduleStatus { in.DeepCopyInto(out) return out } - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Storage) DeepCopyInto(out *Storage) { - *out = *in - if in.SecretRef != nil { - in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(v1.LocalObjectReference) - **out = **in - } - } - if in.Config != nil { - in, out := &in.Config, &out.Config - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Storage. -func (in *Storage) DeepCopy() *Storage { - if in == nil { - return nil - } - out := new(Storage) - in.DeepCopyInto(out) - return out -} diff --git a/pkg/backup/backup.go b/pkg/backup/backup.go index 63e02f23f..22a38213a 100644 --- a/pkg/backup/backup.go +++ b/pkg/backup/backup.go @@ -42,7 +42,7 @@ type runner struct { // NewConfiguredRunner creates a runner configured with the Backup/Restore target executor and // storage configurations. -func NewConfiguredRunner(execConfig *v1alpha1.Executor, execCreds map[string]string, storeConfig *v1alpha1.Storage, storeCreds map[string]string) (Runner, error) { +func NewConfiguredRunner(execConfig *v1alpha1.BackupExecutor, execCreds map[string]string, storeConfig *v1alpha1.BackupStorageProvider, storeCreds map[string]string) (Runner, error) { exec, err := executor.New(execConfig, execCreds) if err != nil { return nil, err diff --git a/pkg/backup/executor/executor.go b/pkg/backup/executor/executor.go index 3c8d72e93..4e28ba056 100644 --- a/pkg/backup/executor/executor.go +++ b/pkg/backup/executor/executor.go @@ -43,12 +43,12 @@ type Interface interface { } // New builds a new backup executor. -func New(executor *v1alpha1.Executor, creds map[string]string) (Interface, error) { - switch strings.ToLower(executor.Provider) { +func New(executor *v1alpha1.BackupExecutor, creds map[string]string) (Interface, error) { + switch strings.ToLower(executor.Name) { case MySQLDumpProvider: return mysqldump.NewExecutor(executor, creds) default: - return nil, fmt.Errorf("unknown backup executor provider %q", executor.Provider) + return nil, fmt.Errorf("unknown backup executor provider %q", executor.Name) } } diff --git a/pkg/backup/executor/mysqldump/config.go b/pkg/backup/executor/mysqldump/config.go index 9229fea3d..0c916c7f9 100644 --- a/pkg/backup/executor/mysqldump/config.go +++ b/pkg/backup/executor/mysqldump/config.go @@ -29,7 +29,7 @@ type Config struct { } // NewConfig creates an mysqldump configuration based on the input parameters. -func NewConfig(executor *v1alpha1.Executor, creds map[string]string) *Config { +func NewConfig(executor *v1alpha1.BackupExecutor, creds map[string]string) *Config { return &Config{ databases: executor.Databases, username: creds["username"], diff --git a/pkg/backup/executor/mysqldump/provider.go b/pkg/backup/executor/mysqldump/provider.go index f96529178..42e926ede 100644 --- a/pkg/backup/executor/mysqldump/provider.go +++ b/pkg/backup/executor/mysqldump/provider.go @@ -43,7 +43,7 @@ type Executor struct { // NewExecutor creates a provider capable of creating and restoring backups with the mysqldump // tool. -func NewExecutor(executor *v1alpha1.Executor, creds map[string]string) (*Executor, error) { +func NewExecutor(executor *v1alpha1.BackupExecutor, creds map[string]string) (*Executor, error) { cfg := NewConfig(executor, creds) err := cfg.Validate() if err != nil { diff --git a/pkg/backup/storage/s3/client_test.go b/pkg/backup/storage/s3/client_test.go index cbabc0c40..b1a3f0615 100644 --- a/pkg/backup/storage/s3/client_test.go +++ b/pkg/backup/storage/s3/client_test.go @@ -21,8 +21,8 @@ import ( ) func TestClientWithInvalidData(t *testing.T) { - storage := &v1alpha1.Storage{ - Provider: "s3", + storage := &v1alpha1.BackupStorageProvider{ + Name: "s3", Config: map[string]string{ "region": "region", "bucket": "bucket", diff --git a/pkg/backup/storage/s3/config.go b/pkg/backup/storage/s3/config.go index 14825e2d5..ac45e0f80 100644 --- a/pkg/backup/storage/s3/config.go +++ b/pkg/backup/storage/s3/config.go @@ -30,7 +30,7 @@ type Config struct { } // NewConfig creates an S3 configuration based on the input parameters. -func NewConfig(storage *v1alpha1.Storage, creds map[string]string) *Config { +func NewConfig(storage *v1alpha1.BackupStorageProvider, creds map[string]string) *Config { return &Config{ endpoint: storage.Config["endpoint"], region: storage.Config["region"], diff --git a/pkg/backup/storage/s3/config_test.go b/pkg/backup/storage/s3/config_test.go index 4f9557dd3..14fde81b9 100644 --- a/pkg/backup/storage/s3/config_test.go +++ b/pkg/backup/storage/s3/config_test.go @@ -21,8 +21,8 @@ import ( ) func TestConfigFromSecretDataWithValidData(t *testing.T) { - storage := &v1alpha1.Storage{ - Provider: "s3", + storage := &v1alpha1.BackupStorageProvider{ + Name: "s3", Config: map[string]string{ "endpoint": "endpoint", "region": "region", @@ -44,8 +44,8 @@ func TestConfigFromSecretDataWithValidData(t *testing.T) { } func TestConfigFromSecretDataWithInValidData(t *testing.T) { - storage := &v1alpha1.Storage{ - Provider: "s3", + storage := &v1alpha1.BackupStorageProvider{ + Name: "s3", Config: map[string]string{ "endpoint": "endpoint", "region": "region", diff --git a/pkg/backup/storage/s3/provider.go b/pkg/backup/storage/s3/provider.go index 16d903917..4cc012254 100644 --- a/pkg/backup/storage/s3/provider.go +++ b/pkg/backup/storage/s3/provider.go @@ -33,7 +33,7 @@ type Provider struct { // NewStorage creates a provider capable of storing and retreiving objects against the specified // 's3' storage configuration and credentials. -func NewStorage(config *v1alpha1.Storage, creds map[string]string) (*Provider, error) { +func NewStorage(config *v1alpha1.BackupStorageProvider, creds map[string]string) (*Provider, error) { cfg := NewConfig(config, creds) if err := cfg.Validate(); err != nil { return nil, err diff --git a/pkg/backup/storage/storage.go b/pkg/backup/storage/storage.go index 5bbfff9a4..cec6f02db 100644 --- a/pkg/backup/storage/storage.go +++ b/pkg/backup/storage/storage.go @@ -39,11 +39,11 @@ type Interface interface { // NewStorageProvider accepts a secret map and uses its contents to determine the // desired object storage provider implementation. -func NewStorageProvider(config *v1alpha1.Storage, creds map[string]string) (Interface, error) { - switch strings.ToLower(config.Provider) { +func NewStorageProvider(config *v1alpha1.BackupStorageProvider, creds map[string]string) (Interface, error) { + switch strings.ToLower(config.Name) { case ProviderS3: return s3.NewStorage(config, creds) default: - return nil, fmt.Errorf("unknown backup storage provider %q", config.Provider) + return nil, fmt.Errorf("unknown backup storage provider %q", config.Name) } } diff --git a/pkg/cluster/innodb/innodb.go b/pkg/cluster/innodb/innodb.go index 3d7228124..ea900104d 100644 --- a/pkg/cluster/innodb/innodb.go +++ b/pkg/cluster/innodb/innodb.go @@ -21,7 +21,7 @@ import ( // DefaultClusterName is the default name assigned to InnoDB clusters created by // the MySQL operator. -const DefaultClusterName = "MySQLCluster" +const DefaultClusterName = "Cluster" // MySQLDBPort is port on which MySQL listens for client connections. const MySQLDBPort = 3306 diff --git a/pkg/cluster/instance.go b/pkg/cluster/instance.go index 8951b746f..f3c23b446 100644 --- a/pkg/cluster/instance.go +++ b/pkg/cluster/instance.go @@ -31,7 +31,7 @@ import ( type Instance struct { // Namespace is the Kubernetes Namespace in which the instance is running. Namespace string - // ClusterName is the name of the MySQLCluster to which the instance + // ClusterName is the name of the Cluster to which the instance // belongs. ClusterName string // ParentName is the name of the StatefulSet to which the instance belongs. diff --git a/pkg/constants/constants.go b/pkg/constants/constants.go index f9c2dfbbe..fb8b68afa 100644 --- a/pkg/constants/constants.go +++ b/pkg/constants/constants.go @@ -14,18 +14,18 @@ package constants -// MySQLClusterLabel is applied to all components of a MySQL cluster -const MySQLClusterLabel = "v1alpha1.mysql.oracle.com/cluster" +// ClusterLabel is applied to all components of a MySQL cluster +const ClusterLabel = "v1alpha1.mysql.oracle.com/cluster" // MySQLOperatorVersionLabel denotes the version of the MySQLOperator and // MySQLOperatorAgent running in the cluster. const MySQLOperatorVersionLabel = "v1alpha1.mysql.oracle.com/version" -// LabelMySQLClusterRole specifies the role of a Pod within a MySQLCluster. -const LabelMySQLClusterRole = "v1alpha1.mysql.oracle.com/role" +// LabelClusterRole specifies the role of a Pod within a Cluster. +const LabelClusterRole = "v1alpha1.mysql.oracle.com/role" -// MySQLClusterRolePrimary denotes a primary InnoDB cluster member. -const MySQLClusterRolePrimary = "primary" +// ClusterRolePrimary denotes a primary InnoDB cluster member. +const ClusterRolePrimary = "primary" -// MySQLClusterRoleSecondary denotes a secondary InnoDB cluster member. -const MySQLClusterRoleSecondary = "secondary" +// ClusterRoleSecondary denotes a secondary InnoDB cluster member. +const ClusterRoleSecondary = "secondary" diff --git a/pkg/controllers/backup/agent_controller.go b/pkg/controllers/backup/agent_controller.go index 876d8e5b6..aa4c7ff35 100644 --- a/pkg/controllers/backup/agent_controller.go +++ b/pkg/controllers/backup/agent_controller.go @@ -50,14 +50,14 @@ import ( const agentControllerAgentName = "agent-backup-controller" -// AgentController handles the excution of MySQLBackups on a specific +// AgentController handles the excution of Backups on a specific // mysql-agent. It is run in each mysql-agent. type AgentController struct { // podName is the name of the pod the controller is running in. podName string kubeClient kubernetes.Interface - client clientset.MySQLBackupsGetter + client clientset.BackupsGetter syncHandler func(key string) error // podLister is able to list/get Pods from a shared informer's store. @@ -66,17 +66,17 @@ type AgentController struct { // least once. podListerSynced cache.InformerSynced - // clusterLister is able to list/get MySQLClusters from a shared informer's + // clusterLister is able to list/get Clusters from a shared informer's // store. - clusterLister listersv1alpha1.MySQLClusterLister - // clusterListerSynced returns true if the MySQLCluster shared informer has + clusterLister listersv1alpha1.ClusterLister + // clusterListerSynced returns true if the Cluster shared informer has // synced at least once. clusterListerSynced cache.InformerSynced - // backupLister is able to list/get MySQLBackups from a shared informer's + // backupLister is able to list/get Backups from a shared informer's // store. - backupLister listersv1alpha1.MySQLBackupLister - // backupListerSynced returns true if the MySQLBackup shared informer has + backupLister listersv1alpha1.BackupLister + // backupListerSynced returns true if the Backup shared informer has // synced at least once. backupListerSynced cache.InformerSynced @@ -89,9 +89,9 @@ type AgentController struct { // NewAgentController constructs a new AgentController. func NewAgentController( kubeClient kubernetes.Interface, - client clientset.MySQLBackupsGetter, - backupInformer informersv1alpha1.MySQLBackupInformer, - clusterInformer informersv1alpha1.MySQLClusterInformer, + client clientset.BackupsGetter, + backupInformer informersv1alpha1.BackupInformer, + clusterInformer informersv1alpha1.ClusterInformer, podInformer corev1informers.PodInformer, podName string, ) *AgentController { @@ -121,7 +121,7 @@ func NewAgentController( backupInformer.Informer().AddEventHandler( cache.ResourceEventHandlerFuncs{ UpdateFunc: func(oldObj, newObj interface{}) { - new := newObj.(*v1alpha1.MySQLBackup) + new := newObj.(*v1alpha1.Backup) if new.Status.Phase == v1alpha1.BackupPhaseScheduled && new.Spec.AgentScheduled == c.podName { key, err := cache.MetaNamespaceKeyFunc(new) if err != nil { @@ -129,10 +129,10 @@ func NewAgentController( return } c.queue.Add(key) - glog.V(2).Infof("MySQLBackup %q queued", kubeutil.NamespaceAndName(new)) + glog.V(2).Infof("Backup %q queued", kubeutil.NamespaceAndName(new)) return } - glog.V(2).Infof("MySQLBackup %q is not Scheduled, skipping (phase=%q)", + glog.V(2).Infof("Backup %q is not Scheduled, skipping (phase=%q)", kubeutil.NamespaceAndName(new), new.Status.Phase) }, @@ -228,9 +228,9 @@ func (controller *AgentController) processBackup(key string) error { } // Get resource from store. - backup, err := controller.backupLister.MySQLBackups(ns).Get(name) + backup, err := controller.backupLister.Backups(ns).Get(name) if err != nil { - return errors.Wrap(err, "error getting MySQLBackup") + return errors.Wrap(err, "error getting Backup") } // Don't modify items in the cache. @@ -247,37 +247,37 @@ func (controller *AgentController) processBackup(key string) error { validationErrs := field.ErrorList{} fldPath := field.NewPath("spec") - // Check the referenced MySQLCluster exists. - _, err := controller.clusterLister.MySQLClusters(ns).Get(backup.Spec.ClusterRef.Name) + // Check the referenced Cluster exists. + _, err := controller.clusterLister.Clusters(ns).Get(backup.Spec.Cluster.Name) if err != nil { if !apierrors.IsNotFound(err) { return err } validationErrs = append(validationErrs, - field.NotFound(fldPath.Child("clusterRef").Child("name"), backup.Spec.ClusterRef.Name)) + field.NotFound(fldPath.Child("clusterRef").Child("name"), backup.Spec.Cluster.Name)) } - creds, err = controller.kubeClient.CoreV1().Secrets(ns).Get(backup.Spec.Storage.SecretRef.Name, metav1.GetOptions{}) + creds, err = controller.kubeClient.CoreV1().Secrets(ns).Get(backup.Spec.StorageProvider.SecretRef.Name, metav1.GetOptions{}) if err != nil { if !apierrors.IsNotFound(err) { return errors.Wrap(err, "getting backup credentials secret") } validationErrs = append(validationErrs, - field.NotFound(fldPath.Child("storage").Child("secretRef").Child("name"), backup.Spec.Storage.SecretRef.Name)) + field.NotFound(fldPath.Child("storage").Child("secretRef").Child("name"), backup.Spec.StorageProvider.SecretRef.Name)) } if len(validationErrs) > 0 { validationErr = validationErrs.ToAggregate() } } - // If the MySQLBackup is not valid emit an event to that effect and mark + // If the Backup is not valid emit an event to that effect and mark // it as failed. // TODO(apryde): Maybe we should add an UpdateFunc to the backupInformer // and support users fixing validation errors via updates (rather than // recreation). if validationErr != nil { backup.Status.Phase = v1alpha1.BackupPhaseFailed - backup, err = controller.client.MySQLBackups(ns).Update(backup) + backup, err = controller.client.Backups(ns).Update(backup) if err != nil { return errors.Wrapf(err, "failed to update (phase=%q)", v1alpha1.BackupPhaseFailed) } @@ -294,14 +294,14 @@ func (controller *AgentController) processBackup(key string) error { return nil } -func (controller *AgentController) performBackup(backup *v1alpha1.MySQLBackup, creds *corev1.Secret) error { +func (controller *AgentController) performBackup(backup *v1alpha1.Backup, creds *corev1.Secret) error { // Update backup phase to started. started := time.Now() backup.Status.Phase = v1alpha1.BackupPhaseStarted backup.Status.TimeStarted = metav1.Time{Time: started} - backup, err := controller.client.MySQLBackups(backup.Namespace).Update(backup) + backup, err := controller.client.Backups(backup.Namespace).Update(backup) if err != nil { - return errors.Wrapf(err, "failed to mark MySQLBackup %q as started", kubeutil.NamespaceAndName(backup)) + return errors.Wrapf(err, "failed to mark Backup %q as started", kubeutil.NamespaceAndName(backup)) } // TODO: Should backuputil.NewConfiguredRunner accept a map[string][]byte @@ -311,24 +311,24 @@ func (controller *AgentController) performBackup(backup *v1alpha1.MySQLBackup, c credsMap[k] = string(v) } - runner, err := backuputil.NewConfiguredRunner(backup.Spec.Executor, executor.DefaultCreds(), backup.Spec.Storage, credsMap) + runner, err := backuputil.NewConfiguredRunner(backup.Spec.Executor, executor.DefaultCreds(), backup.Spec.StorageProvider, credsMap) if err != nil { backup.Status.Phase = v1alpha1.BackupPhaseFailed - backup, updateErr := controller.client.MySQLBackups(backup.Namespace).Update(backup) + backup, updateErr := controller.client.Backups(backup.Namespace).Update(backup) if updateErr != nil { - return errors.Wrapf(err, "failed to mark MySQLBackup %q as failed", kubeutil.NamespaceAndName(backup)) + return errors.Wrapf(err, "failed to mark Backup %q as failed", kubeutil.NamespaceAndName(backup)) } controller.recorder.Event(backup, corev1.EventTypeWarning, "FailedValidation", err.Error()) return nil // We return nil as the error cannot be retried. } - key, err := runner.Backup(fmt.Sprintf("%s-%s", backup.Spec.ClusterRef.Name, backup.Name)) + key, err := runner.Backup(fmt.Sprintf("%s-%s", backup.Spec.Cluster.Name, backup.Name)) if err != nil { backup.Status.Phase = v1alpha1.BackupPhaseFailed - backup, updateErr := controller.client.MySQLBackups(backup.Namespace).Update(backup) + backup, updateErr := controller.client.Backups(backup.Namespace).Update(backup) if updateErr != nil { - return errors.Wrapf(err, "failed to mark MySQLBackup %q as failed", kubeutil.NamespaceAndName(backup)) + return errors.Wrapf(err, "failed to mark Backup %q as failed", kubeutil.NamespaceAndName(backup)) } controller.recorder.Event(backup, corev1.EventTypeWarning, "BackupFailed", err.Error()) @@ -340,13 +340,13 @@ func (controller *AgentController) performBackup(backup *v1alpha1.MySQLBackup, c backup.Status.Phase = v1alpha1.BackupPhaseComplete backup.Status.TimeCompleted = metav1.Time{Time: finished} backup.Status.Outcome = v1alpha1.BackupOutcome{Location: key} - backup, err = controller.client.MySQLBackups(backup.Namespace).Update(backup) + backup, err = controller.client.Backups(backup.Namespace).Update(backup) if err != nil { - return errors.Wrapf(err, "failed to mark MySQLBackup %q as complete", kubeutil.NamespaceAndName(backup)) + return errors.Wrapf(err, "failed to mark Backup %q as complete", kubeutil.NamespaceAndName(backup)) } metrics.IncEventCounter(clusterBackupCount) - glog.Infof("MySQLBackup %q succeeded in %v", backup.Name, finished.Sub(started)) + glog.Infof("Backup %q succeeded in %v", backup.Name, finished.Sub(started)) controller.recorder.Event(backup, corev1.EventTypeNormal, "Success", "Backup complete") return nil diff --git a/pkg/controllers/backup/operator_controller.go b/pkg/controllers/backup/operator_controller.go index d9b7f6a33..70d1c0924 100644 --- a/pkg/controllers/backup/operator_controller.go +++ b/pkg/controllers/backup/operator_controller.go @@ -47,16 +47,16 @@ import ( const controllerAgentName = "operator-backup-controller" // OperatorController handles validation, labeling, and scheduling of -// MySQLBackups to be executed on a specific (primary) mysql-agent. It is run +// Backups to be executed on a specific (primary) mysql-agent. It is run // in the operator. type OperatorController struct { - client clientset.MySQLBackupsGetter + client clientset.BackupsGetter syncHandler func(key string) error - // backupLister is able to list/get MySQLBackups from a shared informer's + // backupLister is able to list/get Backups from a shared informer's // store. - backupLister listersv1alpha1.MySQLBackupLister - // backupListerSynced returns true if the MySQLBackup shared informer has + backupLister listersv1alpha1.BackupLister + // backupListerSynced returns true if the Backup shared informer has // synced at least once. backupListerSynced cache.InformerSynced @@ -66,10 +66,10 @@ type OperatorController struct { // least once. podListerSynced cache.InformerSynced - // clusterLister is able to list/get MySQLClusters from a shared informer's + // clusterLister is able to list/get Clusters from a shared informer's // store. - clusterLister listersv1alpha1.MySQLClusterLister - // clusterListerSynced returns true if the MySQLCluster shared informer has + clusterLister listersv1alpha1.ClusterLister + // clusterListerSynced returns true if the Cluster shared informer has // synced at least once. clusterListerSynced cache.InformerSynced @@ -82,9 +82,9 @@ type OperatorController struct { // NewOperatorController constructs a new OperatorController. func NewOperatorController( kubeClient kubernetes.Interface, - client clientset.MySQLBackupsGetter, - backupInformer informersv1alpha1.MySQLBackupInformer, - clusterInformer informersv1alpha1.MySQLClusterInformer, + client clientset.BackupsGetter, + backupInformer informersv1alpha1.BackupInformer, + clusterInformer informersv1alpha1.ClusterInformer, podInformer corev1informers.PodInformer, ) *OperatorController { // Create event broadcaster. @@ -111,13 +111,13 @@ func NewOperatorController( backupInformer.Informer().AddEventHandler( cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { - backup := obj.(*v1alpha1.MySQLBackup) + backup := obj.(*v1alpha1.Backup) switch backup.Status.Phase { case v1alpha1.BackupPhaseUnknown, v1alpha1.BackupPhaseNew: // Only process new backups. default: - glog.V(2).Infof("MySQLBackup %q is not new, skipping (phase=%q)", + glog.V(2).Infof("Backup %q is not new, skipping (phase=%q)", kubeutil.NamespaceAndName(backup), backup.Status.Phase) return } @@ -221,9 +221,9 @@ func (controller *OperatorController) processBackup(key string) error { } // Get resource from store. - backup, err := controller.backupLister.MySQLBackups(ns).Get(name) + backup, err := controller.backupLister.Backups(ns).Get(name) if err != nil { - return errors.Wrap(err, "error getting MySQLBackup") + return errors.Wrap(err, "error getting Backup") } // Don't modify items in the cache. @@ -236,14 +236,14 @@ func (controller *OperatorController) processBackup(key string) error { validationErrs := field.ErrorList{} fldPath := field.NewPath("spec") - // Check the referenced MySQLCluster exists. - _, err := controller.clusterLister.MySQLClusters(ns).Get(backup.Spec.ClusterRef.Name) + // Check the referenced Cluster exists. + _, err := controller.clusterLister.Clusters(ns).Get(backup.Spec.Cluster.Name) if err != nil { if !apierrors.IsNotFound(err) { return err } validationErrs = append(validationErrs, - field.NotFound(fldPath.Child("clusterRef").Child("name"), backup.Spec.ClusterRef.Name)) + field.NotFound(fldPath.Child("clusterRef").Child("name"), backup.Spec.Cluster.Name)) } if len(validationErrs) > 0 { @@ -251,14 +251,14 @@ func (controller *OperatorController) processBackup(key string) error { } } - // If the MySQLBackup is not valid emit an event to that effect and mark + // If the Backup is not valid emit an event to that effect and mark // it as failed. // TODO(apryde): Maybe we should add an UpdateFunc to the backupInformer // and support users fixing validation errors via updates (rather than // recreation). if validationErr != nil { backup.Status.Phase = v1alpha1.BackupPhaseFailed - backup, err = controller.client.MySQLBackups(ns).Update(backup) + backup, err = controller.client.Backups(ns).Update(backup) if err != nil { return errors.Wrapf(err, "failed to update (phase=%q)", v1alpha1.BackupPhaseFailed) } @@ -275,7 +275,7 @@ func (controller *OperatorController) processBackup(key string) error { } // Update resource. - backup, err = controller.client.MySQLBackups(ns).Update(backup) + backup, err = controller.client.Backups(ns).Update(backup) if err != nil { return errors.Wrap(err, "failed to update") } @@ -285,10 +285,10 @@ func (controller *OperatorController) processBackup(key string) error { return nil } -// scheduleBackup schedules a MySQLBackup on a specific member of a MySQLCluster. -func (controller *OperatorController) scheduleBackup(backup *v1alpha1.MySQLBackup) (*v1alpha1.MySQLBackup, error) { +// scheduleBackup schedules a Backup on a specific member of a Cluster. +func (controller *OperatorController) scheduleBackup(backup *v1alpha1.Backup) (*v1alpha1.Backup, error) { var ( - name = backup.Spec.ClusterRef.Name + name = backup.Spec.Cluster.Name ns = backup.Namespace ) diff --git a/pkg/controllers/backup/schedule/controller.go b/pkg/controllers/backup/schedule/controller.go index 728b74e5a..6e5203109 100644 --- a/pkg/controllers/backup/schedule/controller.go +++ b/pkg/controllers/backup/schedule/controller.go @@ -48,15 +48,15 @@ const controllerName = "backupschedule-controller" const ( // CronScheduleValidationError is used as part of the Event 'reason' when a - // MySQLBackupSchedule fails validation due to an invalid Cron schedule string. + // BackupSchedule fails validation due to an invalid Cron schedule string. CronScheduleValidationError = "CronScheduleValidationError" ) -// Controller watches the Kubernetes API for changes to MySQLBackupSchedule +// Controller watches the Kubernetes API for changes to BackupSchedule // resources. type Controller struct { opClient mysqlop.Interface - backupScheduleLister oplisters.MySQLBackupScheduleLister + backupScheduleLister oplisters.BackupScheduleLister backupScheduleListerSynced cache.InformerSynced syncHandler func(scheduleName string) error queue workqueue.RateLimitingInterface @@ -70,7 +70,7 @@ type Controller struct { func NewController( opClient mysqlop.Interface, kubeClient kubernetes.Interface, - backupScheduleInformer opinformers.MySQLBackupScheduleInformer, + backupScheduleInformer opinformers.BackupScheduleInformer, syncPeriod time.Duration, namespace string, ) *Controller { @@ -96,7 +96,7 @@ func NewController( backupScheduleInformer.Informer().AddEventHandler( cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { - bs := obj.(*v1alpha1.MySQLBackupSchedule) + bs := obj.(*v1alpha1.BackupSchedule) switch bs.Status.Phase { case "", v1alpha1.BackupSchedulePhaseNew, v1alpha1.BackupSchedulePhaseEnabled: @@ -161,9 +161,9 @@ func (controller *Controller) Run(ctx context.Context, numWorkers int) error { } func (controller *Controller) enqueueAllEnabledSchedules() { - backupSchedules, err := controller.backupScheduleLister.MySQLBackupSchedules(controller.namespace).List(labels.NewSelector()) + backupSchedules, err := controller.backupScheduleLister.BackupSchedules(controller.namespace).List(labels.NewSelector()) if err != nil { - glog.Errorf("Error listing MySQLBackupSchedules: %v", err) + glog.Errorf("Error listing BackupSchedules: %v", err) return } @@ -221,14 +221,14 @@ func (controller *Controller) processSchedule(key string) error { } glog.V(6).Info("Getting backup schedule") - bs, err := controller.backupScheduleLister.MySQLBackupSchedules(ns).Get(name) + bs, err := controller.backupScheduleLister.BackupSchedules(ns).Get(name) if err != nil { // backup schedule no longer exists if apierrors.IsNotFound(err) { glog.Errorf("Backup schedule not found, err: %v", err) return nil } - return errors.Wrap(err, "error getting MySQLBackupSchedule") + return errors.Wrap(err, "error getting BackupSchedule") } switch bs.Status.Phase { @@ -264,9 +264,9 @@ func (controller *Controller) processSchedule(key string) error { // update status if it's changed if currentPhase != bs.Status.Phase { - var updatedBackupSchedule *v1alpha1.MySQLBackupSchedule + var updatedBackupSchedule *v1alpha1.BackupSchedule err := retry.RetryOnConflict(retry.DefaultRetry, func() error { - updatedBackupSchedule, err = controller.opClient.MysqlV1alpha1().MySQLBackupSchedules(ns).Update(bs) + updatedBackupSchedule, err = controller.opClient.MysqlV1alpha1().BackupSchedules(ns).Update(bs) if err != nil { return errors.Wrapf(err, "error updating backup schedule phase to %q", bs.Status.Phase) } @@ -286,7 +286,7 @@ func (controller *Controller) processSchedule(key string) error { return controller.submitBackupIfDue(bs, cronSchedule) } -func parseCronSchedule(item *v1alpha1.MySQLBackupSchedule) (cron.Schedule, []string) { +func parseCronSchedule(item *v1alpha1.BackupSchedule) (cron.Schedule, []string) { var validationErrors []string var schedule cron.Schedule @@ -321,7 +321,7 @@ func parseCronSchedule(item *v1alpha1.MySQLBackupSchedule) (cron.Schedule, []str return schedule, nil } -func (controller *Controller) submitBackupIfDue(item *v1alpha1.MySQLBackupSchedule, cronSchedule cron.Schedule) error { +func (controller *Controller) submitBackupIfDue(item *v1alpha1.BackupSchedule, cronSchedule cron.Schedule) error { var ( now = controller.clock.Now() isDue, nextRunTime = getNextRunTime(item, cronSchedule, now) @@ -336,8 +336,8 @@ func (controller *Controller) submitBackupIfDue(item *v1alpha1.MySQLBackupSchedu // trigger a Backup if it's time. glog.Infof("Backup schedule %s[%s] is due, submitting Backup", item.Name, item.Spec.Schedule) backup := getBackup(item, now) - if _, err := controller.opClient.MysqlV1alpha1().MySQLBackups(backup.Namespace).Create(backup); err != nil { - return errors.Wrap(err, "error creating MySQLBackup") + if _, err := controller.opClient.MysqlV1alpha1().Backups(backup.Namespace).Create(backup); err != nil { + return errors.Wrap(err, "error creating Backup") } bs := item.DeepCopy() @@ -345,7 +345,7 @@ func (controller *Controller) submitBackupIfDue(item *v1alpha1.MySQLBackupSchedu bs.Status.LastBackup = metav1.NewTime(now) err := retry.RetryOnConflict(retry.DefaultRetry, func() error { - if _, err := controller.opClient.MysqlV1alpha1().MySQLBackupSchedules(bs.Namespace).Update(bs); err != nil { + if _, err := controller.opClient.MysqlV1alpha1().BackupSchedules(bs.Namespace).Update(bs); err != nil { return errors.Wrapf(err, "error updating backup schedule's LastBackup time to %v", bs.Status.LastBackup) } return nil @@ -359,7 +359,7 @@ func (controller *Controller) submitBackupIfDue(item *v1alpha1.MySQLBackupSchedu // getNextRunTime gets the latest run time (if the backup schedule hasn't run // yet, this will be the zero value which will trigger an immediate backup). -func getNextRunTime(bs *v1alpha1.MySQLBackupSchedule, cronSchedule cron.Schedule, asOf time.Time) (bool, time.Time) { +func getNextRunTime(bs *v1alpha1.BackupSchedule, cronSchedule cron.Schedule, asOf time.Time) (bool, time.Time) { lastBackupTime := bs.Status.LastBackup.Time nextRunTime := cronSchedule.Next(lastBackupTime) @@ -367,8 +367,8 @@ func getNextRunTime(bs *v1alpha1.MySQLBackupSchedule, cronSchedule cron.Schedule return asOf.After(nextRunTime), nextRunTime } -func getBackup(item *v1alpha1.MySQLBackupSchedule, timestamp time.Time) *v1alpha1.MySQLBackup { - backup := &v1alpha1.MySQLBackup{ +func getBackup(item *v1alpha1.BackupSchedule, timestamp time.Time) *v1alpha1.Backup { + backup := &v1alpha1.Backup{ Spec: item.Spec.BackupTemplate, ObjectMeta: metav1.ObjectMeta{ Namespace: item.Namespace, diff --git a/pkg/controllers/backup/schedule/controller_test.go b/pkg/controllers/backup/schedule/controller_test.go index ed5a6f959..2ba32d1e4 100644 --- a/pkg/controllers/backup/schedule/controller_test.go +++ b/pkg/controllers/backup/schedule/controller_test.go @@ -48,12 +48,12 @@ func TestProcessSchedule(t *testing.T) { tests := []struct { name string scheduleKey string - schedule *v1alpha1.MySQLBackupSchedule + schedule *v1alpha1.BackupSchedule fakeClockTime string expectedErr bool - expectedSchedulePhaseUpdate *v1alpha1.MySQLBackupSchedule - expectedScheduleLastBackupUpdate *v1alpha1.MySQLBackupSchedule - expectedBackupCreate *v1alpha1.MySQLBackup + expectedSchedulePhaseUpdate *v1alpha1.BackupSchedule + expectedScheduleLastBackupUpdate *v1alpha1.BackupSchedule + expectedBackupCreate *v1alpha1.Backup expectedEvents []string }{ { @@ -70,72 +70,72 @@ func TestProcessSchedule(t *testing.T) { }, { name: "schedule with phase FailedValidation does not get processed", - schedule: NewTestMySQLBackupSchedule("ns", "name").WithPhase(v1alpha1.BackupSchedulePhaseFailedValidation).MySQLBackupSchedule, + schedule: NewTestBackupSchedule("ns", "name").WithPhase(v1alpha1.BackupSchedulePhaseFailedValidation).BackupSchedule, expectedErr: false, expectedEvents: []string{}, }, { name: "schedule with phase New gets validated and failed if invalid", - schedule: NewTestMySQLBackupSchedule("ns", "name").WithPhase(v1alpha1.BackupSchedulePhaseNew).MySQLBackupSchedule, + schedule: NewTestBackupSchedule("ns", "name").WithPhase(v1alpha1.BackupSchedulePhaseNew).BackupSchedule, expectedErr: false, - expectedSchedulePhaseUpdate: NewTestMySQLBackupSchedule("ns", "name"). + expectedSchedulePhaseUpdate: NewTestBackupSchedule("ns", "name"). WithLabel(constants.MySQLOperatorVersionLabel, mysqlOperatorVersion). WithPhase(v1alpha1.BackupSchedulePhaseFailedValidation). - MySQLBackupSchedule, + BackupSchedule, expectedEvents: []string{"Warning CronScheduleValidationError Schedule must be a non-empty valid Cron expression"}, }, { name: "schedule with phase gets validated and failed if invalid", - schedule: NewTestMySQLBackupSchedule("ns", "name").MySQLBackupSchedule, + schedule: NewTestBackupSchedule("ns", "name").BackupSchedule, expectedErr: false, - expectedSchedulePhaseUpdate: NewTestMySQLBackupSchedule("ns", "name"). + expectedSchedulePhaseUpdate: NewTestBackupSchedule("ns", "name"). WithLabel(constants.MySQLOperatorVersionLabel, mysqlOperatorVersion). WithPhase(v1alpha1.BackupSchedulePhaseFailedValidation). - MySQLBackupSchedule, + BackupSchedule, expectedEvents: []string{"Warning CronScheduleValidationError Schedule must be a non-empty valid Cron expression"}, }, { name: "schedule with phase Enabled gets re-validated and failed if invalid", - schedule: NewTestMySQLBackupSchedule("ns", "name").WithPhase(v1alpha1.BackupSchedulePhaseEnabled).MySQLBackupSchedule, + schedule: NewTestBackupSchedule("ns", "name").WithPhase(v1alpha1.BackupSchedulePhaseEnabled).BackupSchedule, expectedErr: false, - expectedSchedulePhaseUpdate: NewTestMySQLBackupSchedule("ns", "name"). + expectedSchedulePhaseUpdate: NewTestBackupSchedule("ns", "name"). WithLabel(constants.MySQLOperatorVersionLabel, mysqlOperatorVersion). WithPhase(v1alpha1.BackupSchedulePhaseFailedValidation). - MySQLBackupSchedule, + BackupSchedule, expectedEvents: []string{"Warning CronScheduleValidationError Schedule must be a non-empty valid Cron expression"}, }, { name: "schedule with phase New gets validated and triggers a backup", - schedule: NewTestMySQLBackupSchedule("ns", "name").WithPhase(v1alpha1.BackupSchedulePhaseNew).WithCronSchedule("@every 5m").MySQLBackupSchedule, + schedule: NewTestBackupSchedule("ns", "name").WithPhase(v1alpha1.BackupSchedulePhaseNew).WithCronSchedule("@every 5m").BackupSchedule, fakeClockTime: "2017-01-01 12:00:00", expectedErr: false, - expectedSchedulePhaseUpdate: NewTestMySQLBackupSchedule("ns", "name").WithLabel(constants.MySQLOperatorVersionLabel, mysqlOperatorVersion). - WithPhase(v1alpha1.BackupSchedulePhaseEnabled).WithCronSchedule("@every 5m").MySQLBackupSchedule, - expectedBackupCreate: NewTestMySQLBackup().WithNamespace("ns").WithName("name-20170101120000").WithLabel("backup-schedule", "name").MySQLBackup, - expectedScheduleLastBackupUpdate: NewTestMySQLBackupSchedule("ns", "name").WithLabel(constants.MySQLOperatorVersionLabel, mysqlOperatorVersion). - WithPhase(v1alpha1.BackupSchedulePhaseEnabled).WithCronSchedule("@every 5m").WithLastBackupTime("2017-01-01 12:00:00").MySQLBackupSchedule, + expectedSchedulePhaseUpdate: NewTestBackupSchedule("ns", "name").WithLabel(constants.MySQLOperatorVersionLabel, mysqlOperatorVersion). + WithPhase(v1alpha1.BackupSchedulePhaseEnabled).WithCronSchedule("@every 5m").BackupSchedule, + expectedBackupCreate: NewTestBackup().WithNamespace("ns").WithName("name-20170101120000").WithLabel("backup-schedule", "name").Backup, + expectedScheduleLastBackupUpdate: NewTestBackupSchedule("ns", "name").WithLabel(constants.MySQLOperatorVersionLabel, mysqlOperatorVersion). + WithPhase(v1alpha1.BackupSchedulePhaseEnabled).WithCronSchedule("@every 5m").WithLastBackupTime("2017-01-01 12:00:00").BackupSchedule, expectedEvents: []string{}, }, { name: "schedule with phase Enabled gets re-validated and triggers a backup if valid", - schedule: NewTestMySQLBackupSchedule("ns", "name").WithLabel(constants.MySQLOperatorVersionLabel, mysqlOperatorVersion). - WithPhase(v1alpha1.BackupSchedulePhaseEnabled).WithCronSchedule("@every 5m").MySQLBackupSchedule, + schedule: NewTestBackupSchedule("ns", "name").WithLabel(constants.MySQLOperatorVersionLabel, mysqlOperatorVersion). + WithPhase(v1alpha1.BackupSchedulePhaseEnabled).WithCronSchedule("@every 5m").BackupSchedule, fakeClockTime: "2017-01-01 12:00:00", expectedErr: false, - expectedBackupCreate: NewTestMySQLBackup().WithNamespace("ns").WithName("name-20170101120000").WithLabel("backup-schedule", "name").MySQLBackup, - expectedScheduleLastBackupUpdate: NewTestMySQLBackupSchedule("ns", "name").WithLabel(constants.MySQLOperatorVersionLabel, mysqlOperatorVersion). - WithPhase(v1alpha1.BackupSchedulePhaseEnabled).WithCronSchedule("@every 5m").WithLastBackupTime("2017-01-01 12:00:00").MySQLBackupSchedule, + expectedBackupCreate: NewTestBackup().WithNamespace("ns").WithName("name-20170101120000").WithLabel("backup-schedule", "name").Backup, + expectedScheduleLastBackupUpdate: NewTestBackupSchedule("ns", "name").WithLabel(constants.MySQLOperatorVersionLabel, mysqlOperatorVersion). + WithPhase(v1alpha1.BackupSchedulePhaseEnabled).WithCronSchedule("@every 5m").WithLastBackupTime("2017-01-01 12:00:00").BackupSchedule, expectedEvents: []string{}, }, { name: "schedule that's already run gets LastBackup updated", - schedule: NewTestMySQLBackupSchedule("ns", "name").WithLabel(constants.MySQLOperatorVersionLabel, mysqlOperatorVersion). - WithPhase(v1alpha1.BackupSchedulePhaseEnabled).WithCronSchedule("@every 5m").WithLastBackupTime("2000-01-01 00:00:00").MySQLBackupSchedule, + schedule: NewTestBackupSchedule("ns", "name").WithLabel(constants.MySQLOperatorVersionLabel, mysqlOperatorVersion). + WithPhase(v1alpha1.BackupSchedulePhaseEnabled).WithCronSchedule("@every 5m").WithLastBackupTime("2000-01-01 00:00:00").BackupSchedule, fakeClockTime: "2017-01-01 12:00:00", expectedErr: false, - expectedBackupCreate: NewTestMySQLBackup().WithNamespace("ns").WithName("name-20170101120000").WithLabel("backup-schedule", "name").MySQLBackup, - expectedScheduleLastBackupUpdate: NewTestMySQLBackupSchedule("ns", "name").WithLabel(constants.MySQLOperatorVersionLabel, mysqlOperatorVersion). - WithPhase(v1alpha1.BackupSchedulePhaseEnabled).WithCronSchedule("@every 5m").WithLastBackupTime("2017-01-01 12:00:00").MySQLBackupSchedule, + expectedBackupCreate: NewTestBackup().WithNamespace("ns").WithName("name-20170101120000").WithLabel("backup-schedule", "name").Backup, + expectedScheduleLastBackupUpdate: NewTestBackupSchedule("ns", "name").WithLabel(constants.MySQLOperatorVersionLabel, mysqlOperatorVersion). + WithPhase(v1alpha1.BackupSchedulePhaseEnabled).WithCronSchedule("@every 5m").WithLastBackupTime("2017-01-01 12:00:00").BackupSchedule, expectedEvents: []string{}, }, } @@ -151,7 +151,7 @@ func TestProcessSchedule(t *testing.T) { c := NewController( mysqlopclient, kubeclient, - mysqlopInformerFactory.Mysql().V1alpha1().MySQLBackupSchedules(), + mysqlopInformerFactory.Mysql().V1alpha1().BackupSchedules(), time.Duration(0), metav1.NamespaceDefault, ) @@ -170,7 +170,7 @@ func TestProcessSchedule(t *testing.T) { c.clock = clock.NewFakeClock(testTime) if test.schedule != nil { - mysqlopInformerFactory.Mysql().V1alpha1().MySQLBackupSchedules().Informer().GetStore().Add(test.schedule) + mysqlopInformerFactory.Mysql().V1alpha1().BackupSchedules().Informer().GetStore().Add(test.schedule) // this is necessary so the Update() call returns the appropriate object mysqlopclient.PrependReactor("update", "mysqlbackupschedules", func(action core.Action) (bool, runtime.Object, error) { @@ -232,41 +232,41 @@ func TestProcessSchedule(t *testing.T) { func TestGetNextRunTime(t *testing.T) { tests := []struct { name string - schedule *v1alpha1.MySQLBackupSchedule + schedule *v1alpha1.BackupSchedule lastRanOffset string expectedDue bool expectedNextRunTimeOffset string }{ { name: "first run", - schedule: &v1alpha1.MySQLBackupSchedule{Spec: v1alpha1.BackupScheduleSpec{Schedule: "@every 5m"}}, + schedule: &v1alpha1.BackupSchedule{Spec: v1alpha1.BackupScheduleSpec{Schedule: "@every 5m"}}, expectedDue: true, expectedNextRunTimeOffset: "5m", }, { name: "just ran", - schedule: &v1alpha1.MySQLBackupSchedule{Spec: v1alpha1.BackupScheduleSpec{Schedule: "@every 5m"}}, + schedule: &v1alpha1.BackupSchedule{Spec: v1alpha1.BackupScheduleSpec{Schedule: "@every 5m"}}, lastRanOffset: "0s", expectedDue: false, expectedNextRunTimeOffset: "5m", }, { name: "almost but not quite time to run", - schedule: &v1alpha1.MySQLBackupSchedule{Spec: v1alpha1.BackupScheduleSpec{Schedule: "@every 5m"}}, + schedule: &v1alpha1.BackupSchedule{Spec: v1alpha1.BackupScheduleSpec{Schedule: "@every 5m"}}, lastRanOffset: "4m59s", expectedDue: false, expectedNextRunTimeOffset: "5m", }, { name: "time to run again", - schedule: &v1alpha1.MySQLBackupSchedule{Spec: v1alpha1.BackupScheduleSpec{Schedule: "@every 5m"}}, + schedule: &v1alpha1.BackupSchedule{Spec: v1alpha1.BackupScheduleSpec{Schedule: "@every 5m"}}, lastRanOffset: "5m", expectedDue: true, expectedNextRunTimeOffset: "5m", }, { name: "several runs missed", - schedule: &v1alpha1.MySQLBackupSchedule{Spec: v1alpha1.BackupScheduleSpec{Schedule: "@every 5m"}}, + schedule: &v1alpha1.BackupSchedule{Spec: v1alpha1.BackupScheduleSpec{Schedule: "@every 5m"}}, lastRanOffset: "5h", expectedDue: true, expectedNextRunTimeOffset: "5m", @@ -308,7 +308,7 @@ func TestParseCronSchedule(t *testing.T) { // Start with a Schedule with: // - schedule: once a day at 9am // - last backup: 2017-08-10 12:27:00 (just happened) - s := &v1alpha1.MySQLBackupSchedule{ + s := &v1alpha1.BackupSchedule{ Spec: v1alpha1.BackupScheduleSpec{ Schedule: "0 9 * * *", }, @@ -350,13 +350,13 @@ func TestParseCronSchedule(t *testing.T) { func TestGetBackup(t *testing.T) { tests := []struct { name string - schedule *v1alpha1.MySQLBackupSchedule + schedule *v1alpha1.BackupSchedule testClockTime string - expectedBackup *v1alpha1.MySQLBackup + expectedBackup *v1alpha1.Backup }{ { name: "ensure name is formatted correctly (AM time)", - schedule: &v1alpha1.MySQLBackupSchedule{ + schedule: &v1alpha1.BackupSchedule{ ObjectMeta: metav1.ObjectMeta{ Namespace: "foo", Name: "bar", @@ -366,7 +366,7 @@ func TestGetBackup(t *testing.T) { }, }, testClockTime: "2017-07-25 09:15:00", - expectedBackup: &v1alpha1.MySQLBackup{ + expectedBackup: &v1alpha1.Backup{ ObjectMeta: metav1.ObjectMeta{ Namespace: "foo", Name: "bar-20170725091500", @@ -376,7 +376,7 @@ func TestGetBackup(t *testing.T) { }, { name: "ensure name is formatted correctly (PM time)", - schedule: &v1alpha1.MySQLBackupSchedule{ + schedule: &v1alpha1.BackupSchedule{ ObjectMeta: metav1.ObjectMeta{ Namespace: "foo", Name: "bar", @@ -386,7 +386,7 @@ func TestGetBackup(t *testing.T) { }, }, testClockTime: "2017-07-25 14:15:00", - expectedBackup: &v1alpha1.MySQLBackup{ + expectedBackup: &v1alpha1.Backup{ ObjectMeta: metav1.ObjectMeta{ Namespace: "foo", Name: "bar-20170725141500", @@ -396,19 +396,19 @@ func TestGetBackup(t *testing.T) { }, { name: "ensure schedule backup template is copied", - schedule: &v1alpha1.MySQLBackupSchedule{ + schedule: &v1alpha1.BackupSchedule{ ObjectMeta: metav1.ObjectMeta{ Namespace: "foo", Name: "bar", }, Spec: v1alpha1.BackupScheduleSpec{ BackupTemplate: v1alpha1.BackupSpec{ - Executor: &v1alpha1.Executor{ - Provider: "mysqldump", + Executor: &v1alpha1.BackupExecutor{ + Name: "mysqldump", Databases: []string{"db1", "db2"}, }, - Storage: &v1alpha1.Storage{ - Provider: "s3", + StorageProvider: &v1alpha1.BackupStorageProvider{ + Name: "s3", SecretRef: &corev1.LocalObjectReference{ Name: "backup-storage-creds", }, @@ -418,7 +418,7 @@ func TestGetBackup(t *testing.T) { "bucket": "bucket", }, }, - ClusterRef: &corev1.LocalObjectReference{ + Cluster: &corev1.LocalObjectReference{ Name: "test-cluster", }, AgentScheduled: "hostname-1", @@ -426,18 +426,18 @@ func TestGetBackup(t *testing.T) { }, }, testClockTime: "2017-07-25 09:15:00", - expectedBackup: &v1alpha1.MySQLBackup{ + expectedBackup: &v1alpha1.Backup{ ObjectMeta: metav1.ObjectMeta{ Namespace: "foo", Name: "bar-20170725091500", }, Spec: v1alpha1.BackupSpec{ - Executor: &v1alpha1.Executor{ - Provider: "mysqldump", + Executor: &v1alpha1.BackupExecutor{ + Name: "mysqldump", Databases: []string{"db1", "db2"}, }, - Storage: &v1alpha1.Storage{ - Provider: "s3", + StorageProvider: &v1alpha1.BackupStorageProvider{ + Name: "s3", SecretRef: &corev1.LocalObjectReference{ Name: "backup-storage-creds", }, @@ -447,7 +447,7 @@ func TestGetBackup(t *testing.T) { "bucket": "bucket", }, }, - ClusterRef: &corev1.LocalObjectReference{ + Cluster: &corev1.LocalObjectReference{ Name: "test-cluster", }, AgentScheduled: "hostname-1", diff --git a/pkg/controllers/cluster/cluster_control.go b/pkg/controllers/cluster/cluster_control.go index 1f218f886..9de59ec2b 100644 --- a/pkg/controllers/cluster/cluster_control.go +++ b/pkg/controllers/cluster/cluster_control.go @@ -28,57 +28,57 @@ import ( ) type clusterUpdaterInterface interface { - UpdateClusterStatus(cluster *v1alpha1.MySQLCluster, status *v1alpha1.MySQLClusterStatus) error - UpdateClusterLabels(cluster *v1alpha1.MySQLCluster, lbls labels.Set) error + UpdateClusterStatus(cluster *v1alpha1.Cluster, status *v1alpha1.ClusterStatus) error + UpdateClusterLabels(cluster *v1alpha1.Cluster, lbls labels.Set) error } type clusterUpdater struct { client clientset.Interface - lister listersv1alpha1.MySQLClusterLister + lister listersv1alpha1.ClusterLister } -func newClusterUpdater(client clientset.Interface, lister listersv1alpha1.MySQLClusterLister) clusterUpdaterInterface { +func newClusterUpdater(client clientset.Interface, lister listersv1alpha1.ClusterLister) clusterUpdaterInterface { return &clusterUpdater{client: client, lister: lister} } -func (csu *clusterUpdater) UpdateClusterStatus(cluster *v1alpha1.MySQLCluster, status *v1alpha1.MySQLClusterStatus) error { +func (csu *clusterUpdater) UpdateClusterStatus(cluster *v1alpha1.Cluster, status *v1alpha1.ClusterStatus) error { return retry.RetryOnConflict(retry.DefaultRetry, func() error { cluster.Status = *status - _, updateErr := csu.client.MysqlV1alpha1().MySQLClusters(cluster.Namespace).Update(cluster) + _, updateErr := csu.client.MysqlV1alpha1().Clusters(cluster.Namespace).Update(cluster) if updateErr == nil { return nil } - updated, err := csu.lister.MySQLClusters(cluster.Namespace).Get(cluster.Name) + updated, err := csu.lister.Clusters(cluster.Namespace).Get(cluster.Name) if err != nil { - glog.Errorf("Error getting updated MySQLCluster %s/%s: %v", cluster.Namespace, cluster.Name, err) + glog.Errorf("Error getting updated Cluster %s/%s: %v", cluster.Namespace, cluster.Name, err) return err } - // Copy the MySQLCluster so we don't mutate the cache. + // Copy the Cluster so we don't mutate the cache. cluster = updated.DeepCopy() return updateErr }) } -func (csu *clusterUpdater) UpdateClusterLabels(cluster *v1alpha1.MySQLCluster, lbls labels.Set) error { +func (csu *clusterUpdater) UpdateClusterLabels(cluster *v1alpha1.Cluster, lbls labels.Set) error { return retry.RetryOnConflict(retry.DefaultRetry, func() error { cluster.Labels = labels.Merge(labels.Set(cluster.Labels), lbls) - _, updateErr := csu.client.MysqlV1alpha1().MySQLClusters(cluster.Namespace).Update(cluster) + _, updateErr := csu.client.MysqlV1alpha1().Clusters(cluster.Namespace).Update(cluster) if updateErr == nil { return nil } key := fmt.Sprintf("%s/%s", cluster.GetNamespace(), cluster.GetName()) - glog.V(4).Infof("Conflict updating MySQLCluster labels. Getting updated MySQLCluster %s from cache...", key) + glog.V(4).Infof("Conflict updating Cluster labels. Getting updated Cluster %s from cache...", key) - updated, err := csu.lister.MySQLClusters(cluster.GetNamespace()).Get(cluster.GetName()) + updated, err := csu.lister.Clusters(cluster.GetNamespace()).Get(cluster.GetName()) if err != nil { - glog.Errorf("Error getting updated MySQLCluster %s: %v", key, err) + glog.Errorf("Error getting updated Cluster %s: %v", key, err) return err } - // Copy the MySQLCluster so we don't mutate the cache. + // Copy the Cluster so we don't mutate the cache. cluster = updated.DeepCopy() return updateErr }) diff --git a/pkg/controllers/cluster/config_control.go b/pkg/controllers/cluster/config_control.go index c22c39fdd..02aa406e7 100644 --- a/pkg/controllers/cluster/config_control.go +++ b/pkg/controllers/cluster/config_control.go @@ -20,7 +20,7 @@ import ( ) // ConfigMapControlInterface defines the interface that the -// MySQLClusterController uses to create Configmaps. It is implemented as an +// ClusterController uses to create Configmaps. It is implemented as an // interface to enable testing. type ConfigMapControlInterface interface { CreateConfigMap(c *v1.ConfigMap) error diff --git a/pkg/controllers/cluster/controller.go b/pkg/controllers/cluster/controller.go index d0c3bb0aa..47ab94fa0 100644 --- a/pkg/controllers/cluster/controller.go +++ b/pkg/controllers/cluster/controller.go @@ -64,16 +64,16 @@ const ( // synced. SuccessSynced = "Synced" // ErrResourceExists is used as part of the Event 'reason' when a - // MySQLCluster fails to sync due to a resource of the same name already + // Cluster fails to sync due to a resource of the same name already // existing. ErrResourceExists = "ErrResourceExists" // MessageResourceExists is the message used for Events when a resource // fails to sync due to a resource already existing. - MessageResourceExists = "%s %s/%s already exists and is not managed by MySQLCluster" + MessageResourceExists = "%s %s/%s already exists and is not managed by Cluster" // MessageResourceSynced is the message used for an Event fired when a - // MySQLCluster is synced successfully - MessageResourceSynced = "MySQLCluster synced successfully" + // Cluster is synced successfully + MessageResourceSynced = "Cluster synced successfully" ) // The MySQLController watches the Kubernetes API for changes to MySQL resources @@ -87,13 +87,13 @@ type MySQLController struct { shutdown bool queue workqueue.RateLimitingInterface - // clusterLister is able to list/get MySQLClusters from a shared informer's + // clusterLister is able to list/get Clusters from a shared informer's // store. - clusterLister listersv1alpha1.MySQLClusterLister - // clusterListerSynced returns true if the MySQLCluster shared informer has + clusterLister listersv1alpha1.ClusterLister + // clusterListerSynced returns true if the Cluster shared informer has // synced at least once. clusterListerSynced cache.InformerSynced - // clusterUpdater implements control logic for updating MySQLCluster + // clusterUpdater implements control logic for updating Cluster // statuses. Implemented as an interface to enable testing. clusterUpdater clusterUpdaterInterface @@ -104,7 +104,7 @@ type MySQLController struct { // has synced at least once. statefulSetListerSynced cache.InformerSynced // statefulSetControl enables control of StatefulSets associated with - // MySQLClusters. + // Clusters. statefulSetControl StatefulSetControlInterface // podLister is able to list/get Pods from a shared @@ -114,7 +114,7 @@ type MySQLController struct { // has synced at least once. podListerSynced cache.InformerSynced // podControl enables control of Pods associated with - // MySQLClusters. + // Clusters. podControl PodControlInterface // serviceLister is able to list/get Services from a shared informer's @@ -124,10 +124,10 @@ type MySQLController struct { // has synced at least once. serviceListerSynced cache.InformerSynced - // serviceControl enables control of Services associated with MySQLClusters. + // serviceControl enables control of Services associated with Clusters. serviceControl ServiceControlInterface - // secretControl enables control of Services associated with MySQLClusters. + // secretControl enables control of Services associated with Clusters. secretControl SecretControlInterface // recorder is an event recorder for recording Event resources to the @@ -140,7 +140,7 @@ func NewController( opConfig options.MySQLOperatorServer, opClient clientset.Interface, kubeClient kubernetes.Interface, - clusterInformer informersv1alpha1.MySQLClusterInformer, + clusterInformer informersv1alpha1.ClusterInformer, statefulSetInformer appsinformers.StatefulSetInformer, podInformer coreinformers.PodInformer, serviceInformer coreinformers.ServiceInformer, @@ -190,7 +190,7 @@ func NewController( m.enqueueCluster(new) }, DeleteFunc: func(obj interface{}) { - cluster, ok := obj.(*v1alpha1.MySQLCluster) + cluster, ok := obj.(*v1alpha1.Cluster) if ok { m.onClusterDeleted(cluster.Name) } @@ -208,7 +208,7 @@ func NewController( // If cluster is ready ... if newStatefulSet.Status.ReadyReplicas == newStatefulSet.Status.Replicas { - clusterName, ok := newStatefulSet.Labels[constants.MySQLClusterLabel] + clusterName, ok := newStatefulSet.Labels[constants.ClusterLabel] if ok { m.onClusterReady(clusterName) } @@ -229,10 +229,10 @@ func (m *MySQLController) Run(ctx context.Context, threadiness int) { defer utilruntime.HandleCrash() defer m.queue.ShutDown() - glog.Info("Starting MySQLCluster controller") + glog.Info("Starting Cluster controller") // Wait for the caches to be synced before starting workers - glog.Info("Waiting for MySQLCluster controller informer caches to sync") + glog.Info("Waiting for Cluster controller informer caches to sync") if !controllerutils.WaitForCacheSync("mysql cluster", ctx.Done(), m.clusterListerSynced, m.statefulSetListerSynced, @@ -241,14 +241,14 @@ func (m *MySQLController) Run(ctx context.Context, threadiness int) { return } - glog.Info("Starting MySQLCluster controller workers") + glog.Info("Starting Cluster controller workers") // Launch two workers to process Foo resources for i := 0; i < threadiness; i++ { go wait.Until(m.runWorker, time.Second, ctx.Done()) } - glog.Info("Started MySQLCluster controller workers") - defer glog.Info("Shutting down MySQLCluster controller workers") + glog.Info("Started Cluster controller workers") + defer glog.Info("Shutting down Cluster controller workers") <-ctx.Done() } @@ -293,7 +293,7 @@ func (m *MySQLController) processNextWorkItem() bool { } // syncHandler compares the actual state with the desired, and attempts to -// converge the two. It then updates the Status block of the MySQLCluster +// converge the two. It then updates the Status block of the Cluster // resource with the current status of the resource. func (m *MySQLController) syncHandler(key string) error { // Convert the namespace/name string into a distinct namespace and name. @@ -305,10 +305,10 @@ func (m *MySQLController) syncHandler(key string) error { nsName := types.NamespacedName{Namespace: namespace, Name: name} - // Get the MySQLCluster resource with this namespace/name. - cluster, err := m.clusterLister.MySQLClusters(namespace).Get(name) + // Get the Cluster resource with this namespace/name. + cluster, err := m.clusterLister.Clusters(namespace).Get(name) if err != nil { - // The MySQLCluster resource may no longer exist, in which case we stop processing. + // The Cluster resource may no longer exist, in which case we stop processing. if apierrors.IsNotFound(err) { utilruntime.HandleError(fmt.Errorf("mysqlcluster '%s' in work queue no longer exists", key)) return nil @@ -318,7 +318,7 @@ func (m *MySQLController) syncHandler(key string) error { cluster.EnsureDefaults() if err = cluster.Validate(); err != nil { - return errors.Wrap(err, "validating MySQLCluster") + return errors.Wrap(err, "validating Cluster") } operatorVersion := buildversion.GetBuildVersion() @@ -329,7 +329,7 @@ func (m *MySQLController) syncHandler(key string) error { if cluster.Labels == nil { cluster.Labels = make(map[string]string) } - cluster.Labels[constants.MySQLClusterLabel] = cluster.Name + cluster.Labels[constants.ClusterLabel] = cluster.Name cluster.Labels[constants.MySQLOperatorVersionLabel] = buildversion.GetBuildVersion() return m.clusterUpdater.UpdateClusterLabels(cluster.DeepCopy(), labels.Set(cluster.Labels)) } @@ -357,7 +357,7 @@ func (m *MySQLController) syncHandler(key string) error { return err } - // If the Service is not controlled by this MySQLCluster resource, we should + // If the Service is not controlled by this Cluster resource, we should // log a warning to the event recorder and return. if !metav1.IsControlledBy(svc, cluster) { msg := fmt.Sprintf(MessageResourceExists, "Service", svc.Namespace, svc.Name) @@ -380,7 +380,7 @@ func (m *MySQLController) syncHandler(key string) error { return err } - // If the StatefulSet is not controlled by this MySQLCluster resource, we + // If the StatefulSet is not controlled by this Cluster resource, we // should log a warning to the event recorder and return. if !metav1.IsControlledBy(ss, cluster) { msg := fmt.Sprintf(MessageResourceExists, "StatefulSet", ss.Namespace, ss.Name) @@ -394,7 +394,7 @@ func (m *MySQLController) syncHandler(key string) error { return err } - // If this number of the replicas on the MySQLCluster does not equal the + // If this number of the replicas on the Cluster does not equal the // current desired replicas on the StatefulSet, we should update the // StatefulSet resource. if cluster.Spec.Replicas != *ss.Spec.Replicas { @@ -409,7 +409,7 @@ func (m *MySQLController) syncHandler(key string) error { } } - // Finally, we update the status block of the MySQLCluster resource to + // Finally, we update the status block of the Cluster resource to // reflect the current state of the world. err = m.updateClusterStatus(cluster, ss) if err != nil { @@ -421,8 +421,8 @@ func (m *MySQLController) syncHandler(key string) error { } // ensureMySQLOperatorVersion updates the MySQLOperator resource types that require it to make it consistent with the specifed operator version. -func (m *MySQLController) ensureMySQLOperatorVersion(c *v1alpha1.MySQLCluster, ss *apps.StatefulSet, operatorVersion string) error { - // Ensure the Pods belonging to the MySQLCluster are updated to the correct 'mysql-agent' image for the current MySQLOperator version. +func (m *MySQLController) ensureMySQLOperatorVersion(c *v1alpha1.Cluster, ss *apps.StatefulSet, operatorVersion string) error { + // Ensure the Pods belonging to the Cluster are updated to the correct 'mysql-agent' image for the current MySQLOperator version. container := statefulsets.MySQLAgentName pods, err := m.podLister.List(SelectorForCluster(c)) for _, pod := range pods { @@ -446,30 +446,30 @@ func (m *MySQLController) ensureMySQLOperatorVersion(c *v1alpha1.MySQLCluster, s } } - // Ensure the MySQLCluster is updated with the correct MySQLOperator version. + // Ensure the Cluster is updated with the correct MySQLOperator version. if !SelectorForClusterOperatorVersion(operatorVersion).Matches(labels.Set(c.Labels)) { glog.Infof("Upgrading cluster statefulset '%s/%s' to latest operator version: %s", c.Namespace, c.Name, operatorVersion) copy := c.DeepCopy() copy.Labels[constants.MySQLOperatorVersionLabel] = operatorVersion err := m.clusterUpdater.UpdateClusterLabels(copy, labels.Set(copy.Labels)) if err != nil { - return errors.Wrap(err, "upgrade operator version: MySQLClusterUpdate failed") + return errors.Wrap(err, "upgrade operator version: ClusterUpdate failed") } } return nil } -// updateClusterStatusForSS updates MySQLCluster statuses based on changes to their associated StatefulSets. -func (m *MySQLController) updateClusterStatus(cluster *v1alpha1.MySQLCluster, ss *apps.StatefulSet) error { +// updateClusterStatusForSS updates Cluster statuses based on changes to their associated StatefulSets. +func (m *MySQLController) updateClusterStatus(cluster *v1alpha1.Cluster, ss *apps.StatefulSet) error { glog.V(4).Infof("%s/%s: ss.Spec.Replicas=%d, ss.Status.ReadyReplicas=%d, ss.Status.Replicas=%d", cluster.Namespace, cluster.Name, *ss.Spec.Replicas, ss.Status.ReadyReplicas, ss.Status.Replicas) phase := cluster.Status.Phase if (ss.Status.ReadyReplicas < ss.Status.Replicas) || (*ss.Spec.Replicas != ss.Status.Replicas) { - phase = v1alpha1.MySQLClusterPending + phase = v1alpha1.ClusterPhasePending } else if ss.Status.ReadyReplicas == ss.Status.Replicas { - phase = v1alpha1.MySQLClusterRunning + phase = v1alpha1.ClusterPhaseRunning } if phase != cluster.Status.Phase { @@ -483,9 +483,9 @@ func (m *MySQLController) updateClusterStatus(cluster *v1alpha1.MySQLCluster, ss return nil } -// enqueueCluster takes a MySQLCluster resource and converts it into a +// enqueueCluster takes a Cluster resource and converts it into a // namespace/name string which is then put onto the work queue. This method -// should *not* be passed resources of any type other than MySQLCluster. +// should *not* be passed resources of any type other than Cluster. func (m *MySQLController) enqueueCluster(obj interface{}) { key, err := cache.MetaNamespaceKeyFunc(obj) if err != nil { @@ -518,15 +518,15 @@ func (m *MySQLController) handleObject(obj interface{}) { glog.V(4).Infof("Processing object: %s", object.GetName()) if ownerRef := metav1.GetControllerOf(object); ownerRef != nil { - // If this object is not owned by a MySQLCluster, we should not do + // If this object is not owned by a Cluster, we should not do // anything more with it. - if ownerRef.Kind != v1alpha1.MySQLClusterCRDResourceKind { + if ownerRef.Kind != v1alpha1.ClusterCRDResourceKind { return } - cluster, err := m.clusterLister.MySQLClusters(object.GetNamespace()).Get(ownerRef.Name) + cluster, err := m.clusterLister.Clusters(object.GetNamespace()).Get(ownerRef.Name) if err != nil { - glog.V(4).Infof("ignoring orphaned object '%s' of MySQLCluster '%s'", object.GetSelfLink(), ownerRef.Name) + glog.V(4).Infof("ignoring orphaned object '%s' of Cluster '%s'", object.GetSelfLink(), ownerRef.Name) return } diff --git a/pkg/controllers/cluster/controller_test.go b/pkg/controllers/cluster/controller_test.go index 5a4ae7e3c..c098d0068 100644 --- a/pkg/controllers/cluster/controller_test.go +++ b/pkg/controllers/cluster/controller_test.go @@ -50,7 +50,11 @@ func mockOperatorConfig() options.MySQLOperatorServer { func TestMessageResourceExistsFormatString(t *testing.T) { ss := statefulsets.NewForCluster( - &v1alpha1.MySQLCluster{ + &v1alpha1.Cluster{ + TypeMeta: metav1.TypeMeta{ + Kind: "Cluster", + APIVersion: "mysql.oracle.com/v1alpha1", + }, ObjectMeta: metav1.ObjectMeta{ Name: "test-cluster", Namespace: "default", @@ -59,7 +63,7 @@ func TestMessageResourceExistsFormatString(t *testing.T) { mockOperatorConfig().Images, "test-cluster", ) - expected := "StatefulSet default/test-cluster already exists and is not managed by MySQLCluster" + expected := "StatefulSet default/test-cluster already exists and is not managed by Cluster" msg := fmt.Sprintf(MessageResourceExists, "StatefulSet", ss.Namespace, ss.Name) if msg != expected { t.Errorf("Got %q, expected %q", msg, expected) @@ -67,7 +71,7 @@ func TestMessageResourceExistsFormatString(t *testing.T) { } func TestSyncBadNameSpaceKeyError(t *testing.T) { - cluster := mockMySQLCluster(buildversion.GetBuildVersion(), "test-cluster", "test-namespace", int32(3)) + cluster := mockCluster(buildversion.GetBuildVersion(), "test-cluster", "test-namespace", int32(3)) fakeController, _ := newFakeMySQLController(cluster) key := "a/bad/namespace/key" @@ -79,7 +83,7 @@ func TestSyncBadNameSpaceKeyError(t *testing.T) { // TODO: mysqlcluster 'test-namespace/test-cluster' in work queue no longer exists func TestSyncClusterNoLongerExistsError(t *testing.T) { - cluster := mockMySQLCluster(buildversion.GetBuildVersion(), "test-cluster", "test-namespace", int32(3)) + cluster := mockCluster(buildversion.GetBuildVersion(), "test-cluster", "test-namespace", int32(3)) fakeController, fakeInformers := newFakeMySQLController(cluster) fakeInformers.clusterInformer.Informer().GetStore().Delete(cluster) key, _ := cache.MetaNamespaceKeyFunc(cluster) @@ -90,7 +94,7 @@ func TestSyncClusterNoLongerExistsError(t *testing.T) { } func TestSyncClusterValidateError(t *testing.T) { - cluster := mockMySQLCluster(buildversion.GetBuildVersion(), "test-cluster", "test-namespace", int32(3)) + cluster := mockCluster(buildversion.GetBuildVersion(), "test-cluster", "test-namespace", int32(3)) cluster.Status.Phase = "Bad_Phase" fakeController, fakeInformers := newFakeMySQLController(cluster) fakeInformers.clusterInformer.Informer().GetStore().Add(cluster) @@ -99,7 +103,7 @@ func TestSyncClusterValidateError(t *testing.T) { if err == nil { t.Errorf("SyncHandler should return an error when the cluster resource is invalid.") } - if err.Error() != `validating MySQLCluster: status.phase: Invalid value: "Bad_Phase": invalid phase specified` { + if err.Error() != `validating Cluster: status.phase: Invalid value: "Bad_Phase": invalid phase specified` { t.Errorf("SyncHandler should return the correct error when the cluster resource is invalid: %q", err) } } @@ -109,7 +113,7 @@ func TestSyncEnsureClusterLabels(t *testing.T) { name := "test-cluster" namespace := "test-namespace" replicas := int32(3) - cluster := mockMySQLCluster(version, name, namespace, replicas) + cluster := mockCluster(version, name, namespace, replicas) cluster.Labels = nil fakeController, fakeInformers := newFakeMySQLController(cluster) @@ -117,24 +121,24 @@ func TestSyncEnsureClusterLabels(t *testing.T) { key, _ := cache.MetaNamespaceKeyFunc(cluster) err := fakeController.syncHandler(key) if err != nil { - t.Fatalf("Unexpected MySQLCluster syncHandler error: %+v", err) + t.Fatalf("Unexpected Cluster syncHandler error: %+v", err) } assertOperatorClusterInvariants(t, fakeController, namespace, name, version) } func assertOperatorClusterInvariants(t *testing.T, controller *MySQLController, namespace string, name string, version string) { - cluster, err := controller.opClient.MysqlV1alpha1().MySQLClusters(namespace).Get(name, metav1.GetOptions{}) + cluster, err := controller.opClient.MysqlV1alpha1().Clusters(namespace).Get(name, metav1.GetOptions{}) if err != nil { - t.Fatalf("Get client MySQLCluster err: %+v", err) + t.Fatalf("Get client Cluster err: %+v", err) } - clName := cluster.Labels[constants.MySQLClusterLabel] + clName := cluster.Labels[constants.ClusterLabel] if clName != name { - t.Errorf("Expected MySQLCluster to have name label '%s', got '%s'.", version, clName) + t.Errorf("Expected Cluster to have name label '%s', got '%s'.", version, clName) } clVersion := cluster.Labels[constants.MySQLOperatorVersionLabel] if clVersion != version { - t.Errorf("Expected MySQLCluster to have version label '%s', got '%s'.", version, clVersion) + t.Errorf("Expected Cluster to have version label '%s', got '%s'.", version, clVersion) } } @@ -143,36 +147,36 @@ func TestSyncEnsureSecret(t *testing.T) { name := "test-cluster" namespace := "test-namespace" replicas := int32(3) - cluster := mockMySQLCluster(version, name, namespace, replicas) + cluster := mockCluster(version, name, namespace, replicas) fakeController, fakeInformers := newFakeMySQLController(cluster) fakeInformers.clusterInformer.Informer().GetStore().Add(cluster) key, _ := cache.MetaNamespaceKeyFunc(cluster) err := fakeController.syncHandler(key) if err != nil { - t.Fatalf("Unexpected MySQLCluster syncHandler error: %+v", err) + t.Fatalf("Unexpected Cluster syncHandler error: %+v", err) } assertOperatorSecretInvariants(t, fakeController, cluster) } -func assertOperatorSecretInvariants(t *testing.T, controller *MySQLController, cluster *v1alpha1.MySQLCluster) { +func assertOperatorSecretInvariants(t *testing.T, controller *MySQLController, cluster *v1alpha1.Cluster) { secretName := secrets.GetRootPasswordSecretName(cluster) secret, err := controller.kubeClient.CoreV1().Secrets(cluster.Namespace).Get(secretName, metav1.GetOptions{}) if err != nil { - t.Fatalf("Get client MySQLCluster secret error: %+v", err) + t.Fatalf("Get client Cluster secret error: %+v", err) } if secret == nil { - t.Fatalf("Expected MySQLCluster to have an associated secret.") + t.Fatalf("Expected Cluster to have an associated secret.") } if secret.Namespace != cluster.Namespace { - t.Errorf("Expected MySQLCluster secret to have namespace '%s', got '%s'.", secret.Namespace, cluster.Namespace) + t.Errorf("Expected Cluster secret to have namespace '%s', got '%s'.", secret.Namespace, cluster.Namespace) } if secret.Name != secretName { - t.Errorf("Expected MySQLCluster secret to have name '%s', got '%s'.", secret.Name, secretName) + t.Errorf("Expected Cluster secret to have name '%s', got '%s'.", secret.Name, secretName) } if secret.Data["password"] == nil { - t.Fatalf("Expected MySQLCluster secret to have an associated password.") + t.Fatalf("Expected Cluster secret to have an associated password.") } } @@ -181,39 +185,39 @@ func TestSyncEnsureService(t *testing.T) { name := "test-cluster" namespace := "test-namespace" replicas := int32(3) - cluster := mockMySQLCluster(version, name, namespace, replicas) + cluster := mockCluster(version, name, namespace, replicas) fakeController, fakeInformers := newFakeMySQLController(cluster) fakeInformers.clusterInformer.Informer().GetStore().Add(cluster) key, _ := cache.MetaNamespaceKeyFunc(cluster) err := fakeController.syncHandler(key) if err != nil { - t.Fatalf("Unexpected MySQLCluster syncHandler error: %+v", err) + t.Fatalf("Unexpected Cluster syncHandler error: %+v", err) } assertOperatorServiceInvariants(t, fakeController, cluster) } -func assertOperatorServiceInvariants(t *testing.T, controller *MySQLController, cluster *v1alpha1.MySQLCluster) { +func assertOperatorServiceInvariants(t *testing.T, controller *MySQLController, cluster *v1alpha1.Cluster) { kubeClient := controller.kubeClient service, err := kubeClient.CoreV1().Services(cluster.Namespace).Get(cluster.Name, metav1.GetOptions{}) if err != nil { - t.Fatalf("Get client MySQLCluster service error: %+v", err) + t.Fatalf("Get client Cluster service error: %+v", err) } if service == nil { - t.Fatalf("Expected MySQLCluster to have an associated service.") + t.Fatalf("Expected Cluster to have an associated service.") } if service.Namespace != cluster.Namespace { - t.Errorf("Expected MySQLCluster service to have namespace '%s', got '%s'.", service.Namespace, cluster.Namespace) + t.Errorf("Expected Cluster service to have namespace '%s', got '%s'.", service.Namespace, cluster.Namespace) } if service.Name != cluster.Name { - t.Errorf("Expected MySQLCluster service to have name '%s', got '%s'.", service.Name, cluster.Name) + t.Errorf("Expected Cluster service to have name '%s', got '%s'.", service.Name, cluster.Name) } if service.OwnerReferences == nil { - t.Fatalf("Expected MySQLCluster service to have an associated owner reference to the parent MySQLCluster.") + t.Fatalf("Expected Cluster service to have an associated owner reference to the parent Cluster.") } else { if !hasOwnerReference(service.OwnerReferences, cluster) { - t.Errorf("Expected MySQLCluster service to have an associated owner reference to the parent MySQLCluster.") + t.Errorf("Expected Cluster service to have an associated owner reference to the parent Cluster.") } } } @@ -223,52 +227,52 @@ func TestSyncEnsureStatefulSet(t *testing.T) { name := "test-cluster" namespace := "test-namespace" replicas := int32(3) - cluster := mockMySQLCluster(version, name, namespace, replicas) + cluster := mockCluster(version, name, namespace, replicas) fakeController, fakeInformers := newFakeMySQLController(cluster) fakeInformers.clusterInformer.Informer().GetStore().Add(cluster) key, _ := cache.MetaNamespaceKeyFunc(cluster) err := fakeController.syncHandler(key) if err != nil { - t.Fatalf("Unexpected MySQLCluster syncHandler error: %+v", err) + t.Fatalf("Unexpected Cluster syncHandler error: %+v", err) } assertOperatorStatefulSetInvariants(t, fakeController, cluster) } -func assertOperatorStatefulSetInvariants(t *testing.T, controller *MySQLController, cluster *v1alpha1.MySQLCluster) { +func assertOperatorStatefulSetInvariants(t *testing.T, controller *MySQLController, cluster *v1alpha1.Cluster) { kubeClient := controller.kubeClient statefulset, err := kubeClient.AppsV1beta1().StatefulSets(cluster.Namespace).Get(cluster.Name, metav1.GetOptions{}) if err != nil { - t.Fatalf("Get client MySQLCluster statefulset error: %+v", err) + t.Fatalf("Get client Cluster statefulset error: %+v", err) } if statefulset == nil { - t.Fatalf("Expected MySQLCluster to have an associated statefulset.") + t.Fatalf("Expected Cluster to have an associated statefulset.") } if statefulset.Namespace != cluster.Namespace { - t.Errorf("Expected MySQLCluster statefulset to have namespace '%s', got '%s'.", statefulset.Namespace, cluster.Namespace) + t.Errorf("Expected Cluster statefulset to have namespace '%s', got '%s'.", statefulset.Namespace, cluster.Namespace) } if statefulset.Name != cluster.Name { - t.Errorf("Expected MySQLCluster statefulset to have name '%s', got '%s'.", statefulset.Name, cluster.Name) + t.Errorf("Expected Cluster statefulset to have name '%s', got '%s'.", statefulset.Name, cluster.Name) } if statefulset.OwnerReferences == nil { - t.Fatalf("Expected MySQLCluster statefulset to have an associated owner reference to the parent MySQLCluster.") + t.Fatalf("Expected Cluster statefulset to have an associated owner reference to the parent Cluster.") } else { if !hasOwnerReference(statefulset.OwnerReferences, cluster) { - t.Errorf("Expected MySQLCluster statefulset to have an associated owner reference to the parent MySQLCluster.") + t.Errorf("Expected Cluster statefulset to have an associated owner reference to the parent Cluster.") } } if *statefulset.Spec.Replicas != cluster.Spec.Replicas { - t.Errorf("Expected MySQLCluster statefulset to have Replicas '%d', got '%d'.", cluster.Spec.Replicas, *statefulset.Spec.Replicas) + t.Errorf("Expected Cluster statefulset to have Replicas '%d', got '%d'.", cluster.Spec.Replicas, *statefulset.Spec.Replicas) } if statefulset.Spec.Template.Spec.Containers == nil || len(statefulset.Spec.Template.Spec.Containers) != 2 { - t.Fatalf("Expected MySQLCluster to have an associated statefulset with two pod templates.") + t.Fatalf("Expected Cluster to have an associated statefulset with two pod templates.") } if !hasContainer(statefulset.Spec.Template.Spec.Containers, "mysql") { - t.Errorf("Expected MySQLCluster statefulset to have template container 'mysql'.") + t.Errorf("Expected Cluster statefulset to have template container 'mysql'.") } if !hasContainer(statefulset.Spec.Template.Spec.Containers, "mysql-agent") { - t.Errorf("Expected MySQLCluster statefulset to have template container 'mysql-agent'.") + t.Errorf("Expected Cluster statefulset to have template container 'mysql-agent'.") } } @@ -278,7 +282,7 @@ func TestEnsureMySQLOperatorVersionWhenNotRequired(t *testing.T) { name := "test-ensure-operator-version" namespace := "test-namespace" replicas := int32(3) - cluster := mockMySQLCluster(originalOperatorVersion, name, namespace, replicas) + cluster := mockCluster(originalOperatorVersion, name, namespace, replicas) statefulSet := mockClusterStatefulSet(cluster) pods := mockClusterPods(statefulSet) @@ -307,7 +311,7 @@ func TestEnsureMySQLOperatorVersionWhenRequired(t *testing.T) { name := "test-ensure-operator-version" namespace := "test-namespace" replicas := int32(3) - cluster := mockMySQLCluster(originalOperatorVersion, name, namespace, replicas) + cluster := mockCluster(originalOperatorVersion, name, namespace, replicas) statefulSet := mockClusterStatefulSet(cluster) pods := mockClusterPods(statefulSet) @@ -333,14 +337,14 @@ func TestEnsureMySQLOperatorVersionWhenRequired(t *testing.T) { func assertOperatorVersionInvariants(t *testing.T, controller *MySQLController, namespace string, name string, version string) { expectedImageVersion := mockOperatorConfig().Images.MySQLAgentImage + ":" + version - // Check MySQLCluster has the correct operator version - updatedCluster, err := controller.opClient.MysqlV1alpha1().MySQLClusters(namespace).Get(name, metav1.GetOptions{}) + // Check Cluster has the correct operator version + updatedCluster, err := controller.opClient.MysqlV1alpha1().Clusters(namespace).Get(name, metav1.GetOptions{}) if err != nil { - t.Fatalf("Get client MySQLCluster err: %+v", err) + t.Fatalf("Get client Cluster err: %+v", err) } if !SelectorForClusterOperatorVersion(version).Matches(labels.Set(updatedCluster.Labels)) { clVersion := updatedCluster.Labels[constants.MySQLOperatorVersionLabel] - t.Errorf("Expected MySQLCluster to have version label '%s', got '%s'.", version, clVersion) + t.Errorf("Expected Cluster to have version label '%s', got '%s'.", version, clVersion) } // Check StatefulSets has the correct operator version. @@ -391,7 +395,7 @@ func TestMySQLControllerSyncClusterFromScratch(t *testing.T) { name := "from-scratch" namespace := "test-namespace" replicas := int32(3) - cluster := mockMySQLCluster(version, name, namespace, replicas) + cluster := mockCluster(version, name, namespace, replicas) // create mock mysqloperator controller and prepoulate infromer fakeController, fakeInformers := newFakeMySQLController(cluster) @@ -405,13 +409,13 @@ func TestMySQLControllerSyncClusterFromScratch(t *testing.T) { assertOperatorServiceInvariants(t, fakeController, cluster) assertOperatorStatefulSetInvariants(t, fakeController, cluster) assertOperatorVersionInvariants(t, fakeController, namespace, name, version) - cluster, err := fakeController.opClient.MysqlV1alpha1().MySQLClusters(namespace).Get(name, metav1.GetOptions{}) + cluster, err := fakeController.opClient.MysqlV1alpha1().Clusters(namespace).Get(name, metav1.GetOptions{}) if err != nil { - t.Fatalf("Get client MySQLCluster err: %+v", err) + t.Fatalf("Get client Cluster err: %+v", err) } } -func hasOwnerReference(ownerReferences []metav1.OwnerReference, cluster *v1alpha1.MySQLCluster) bool { +func hasOwnerReference(ownerReferences []metav1.OwnerReference, cluster *v1alpha1.Cluster) bool { for _, or := range ownerReferences { if or.APIVersion == cluster.APIVersion && or.Kind == cluster.Kind && or.Name == cluster.Name { return true @@ -429,18 +433,18 @@ func hasContainer(containers []v1.Container, name string) bool { return false } -func mockMySQLCluster(operatorVersion string, name string, namespace string, replicas int32) *v1alpha1.MySQLCluster { - cluster := &v1alpha1.MySQLCluster{ +func mockCluster(operatorVersion string, name string, namespace string, replicas int32) *v1alpha1.Cluster { + cluster := &v1alpha1.Cluster{ TypeMeta: metav1.TypeMeta{ - Kind: "MySQLCluster", + Kind: "Cluster", APIVersion: "mysql.oracle.com/v1alpha1", }, ObjectMeta: metav1.ObjectMeta{ Name: name, Namespace: namespace, - Labels: map[string]string{constants.MySQLClusterLabel: name, constants.MySQLOperatorVersionLabel: operatorVersion}, + Labels: map[string]string{constants.ClusterLabel: name, constants.MySQLOperatorVersionLabel: operatorVersion}, }, - Spec: v1alpha1.MySQLClusterSpec{ + Spec: v1alpha1.ClusterSpec{ Replicas: replicas, }, } @@ -448,7 +452,7 @@ func mockMySQLCluster(operatorVersion string, name string, namespace string, rep return cluster } -func mockClusterStatefulSet(cluster *v1alpha1.MySQLCluster) *apps.StatefulSet { +func mockClusterStatefulSet(cluster *v1alpha1.Cluster) *apps.StatefulSet { return statefulsets.NewForCluster(cluster, mockOperatorConfig().Images, cluster.Name) } @@ -475,7 +479,7 @@ func mockClusterPod(ss *apps.StatefulSet, ordinal int) *v1.Pod { ObjectMeta: metav1.ObjectMeta{ Name: fmt.Sprintf("%s-%d", ss.Name, ordinal), Namespace: ss.Namespace, - Labels: map[string]string{constants.MySQLClusterLabel: clusterName, constants.MySQLOperatorVersionLabel: operatorVersion}, + Labels: map[string]string{constants.ClusterLabel: clusterName, constants.MySQLOperatorVersionLabel: operatorVersion}, }, Spec: v1.PodSpec{ Containers: []v1.Container{ @@ -486,14 +490,14 @@ func mockClusterPod(ss *apps.StatefulSet, ordinal int) *v1.Pod { return pod } -// mock MySQLCluster controller ********** +// mock Cluster controller ********** func alwaysReady() bool { return true } // fakeMySQLControllerInformers contain references to the set of underlying informers associated // with a newFakeMySQLController. type fakeMySQLControllerInformers struct { - clusterInformer informersv1alpha1.MySQLClusterInformer + clusterInformer informersv1alpha1.ClusterInformer statefulSetInformer appsinformers.StatefulSetInformer podInformer coreinformers.PodInformer serviceInformer coreinformers.ServiceInformer @@ -501,7 +505,7 @@ type fakeMySQLControllerInformers struct { // newFakeMySQLController creates a new fake MySQLController with a fake mysqlop and kube clients and informers // for unit testing. -func newFakeMySQLController(cluster *v1alpha1.MySQLCluster, kuberesources ...runtime.Object) (*MySQLController, *fakeMySQLControllerInformers) { +func newFakeMySQLController(cluster *v1alpha1.Cluster, kuberesources ...runtime.Object) (*MySQLController, *fakeMySQLControllerInformers) { mysqlopClient := mysqlfake.NewSimpleClientset(cluster) kubeClient := fake.NewSimpleClientset(kuberesources...) @@ -509,7 +513,7 @@ func newFakeMySQLController(cluster *v1alpha1.MySQLCluster, kuberesources ...run mysqlopInformerFactory := informerfactory.NewSharedInformerFactory(mysqlopClient, util.NoResyncPeriodFunc()) fakeInformers := &fakeMySQLControllerInformers{ - clusterInformer: mysqlopInformerFactory.Mysql().V1alpha1().MySQLClusters(), + clusterInformer: mysqlopInformerFactory.Mysql().V1alpha1().Clusters(), statefulSetInformer: kubeInformerFactory.Apps().V1beta1().StatefulSets(), podInformer: kubeInformerFactory.Core().V1().Pods(), serviceInformer: kubeInformerFactory.Core().V1().Services(), diff --git a/pkg/controllers/cluster/labeler/cluster_labeler.go b/pkg/controllers/cluster/labeler/cluster_labeler.go index 716cc260e..377927145 100644 --- a/pkg/controllers/cluster/labeler/cluster_labeler.go +++ b/pkg/controllers/cluster/labeler/cluster_labeler.go @@ -42,7 +42,7 @@ import ( const controllerAgentName = "innodb-cluster-labeler" // ClusterLabelerController adds annotations about the InnoDB cluster state -// to the MySQLCluster's Pods. This controller should only be run iff the the +// to the Cluster's Pods. This controller should only be run iff the the // local MySQL instance believes that it is the primary of the MySQL cluster. type ClusterLabelerController struct { // localInstance represents the local MySQL instance. @@ -88,14 +88,14 @@ func NewClusterLabelerController( func (clc *ClusterLabelerController) updateClusterRoleLabel(pod *corev1.Pod, val string) error { new := pod.DeepCopy() if val == "" { - delete(new.Labels, constants.LabelMySQLClusterRole) + delete(new.Labels, constants.LabelClusterRole) } else { - new.Labels[constants.LabelMySQLClusterRole] = val + new.Labels[constants.LabelClusterRole] = val } return clc.podControl.PatchPod(pod, new) } -// syncHandler labels the Pods in a MySQLCluster as being either a primary or +// syncHandler labels the Pods in a Cluster as being either a primary or // secondary based on the given innodb.ClusterStatus. func (clc *ClusterLabelerController) syncHandler(key string) error { obj, exists, err := clc.store.GetByKey(key) @@ -129,11 +129,11 @@ func (clc *ClusterLabelerController) syncHandler(key string) error { var role string if !inCluster(status, pod.Name, clc.localInstance.Port) { glog.Infof("Removing %q label from previously labeled primary %s/%s", - constants.LabelMySQLClusterRole, pod.Namespace, pod.Name) + constants.LabelClusterRole, pod.Namespace, pod.Name) role = "" } else { glog.Infof("Labeling previously labeled primary %s/%s as secondary", pod.Namespace, pod.Name) - role = constants.MySQLClusterRoleSecondary + role = constants.ClusterRoleSecondary } if err := clc.updateClusterRoleLabel(pod, role); err != nil { @@ -150,7 +150,7 @@ func (clc *ClusterLabelerController) syncHandler(key string) error { } glog.Infof("Labeling %s/%s as primary", primary.Namespace, primary.Name) - if err := clc.updateClusterRoleLabel(primary, constants.MySQLClusterRolePrimary); err != nil { + if err := clc.updateClusterRoleLabel(primary, constants.ClusterRolePrimary); err != nil { return errors.Wrapf(err, "labeling %s/%s as primary", primary.Namespace, primary.Name) } } @@ -166,16 +166,16 @@ func (clc *ClusterLabelerController) syncHandler(key string) error { if !inCluster(status, pod.Name, clc.localInstance.Port) { if HasRoleSelector(clusterName).Matches(labels.Set(pod.Labels)) { glog.Infof("Removing %q label from %s/%s as it's no longer in an ONLINE state", - constants.LabelMySQLClusterRole, pod.Namespace, pod.Name) + constants.LabelClusterRole, pod.Namespace, pod.Name) if err := clc.updateClusterRoleLabel(pod, ""); err != nil { - return errors.Wrapf(err, "removing %q label from %s/%s", constants.LabelMySQLClusterRole, pod.Namespace, pod.Name) + return errors.Wrapf(err, "removing %q label from %s/%s", constants.LabelClusterRole, pod.Namespace, pod.Name) } } continue } if pod.Name != clc.localInstance.PodName() && !SecondarySelector(clusterName).Matches(labels.Set(pod.Labels)) { glog.Infof("Labeling %s/%s as secondary", pod.Namespace, pod.Name) - if err := clc.updateClusterRoleLabel(pod, constants.MySQLClusterRoleSecondary); err != nil { + if err := clc.updateClusterRoleLabel(pod, constants.ClusterRoleSecondary); err != nil { return errors.Wrapf(err, "labeling %s/%s as secondary", pod.Namespace, pod.Name) } } diff --git a/pkg/controllers/cluster/labeler/cluster_labeler_test.go b/pkg/controllers/cluster/labeler/cluster_labeler_test.go index e981e5945..ce6811026 100644 --- a/pkg/controllers/cluster/labeler/cluster_labeler_test.go +++ b/pkg/controllers/cluster/labeler/cluster_labeler_test.go @@ -70,7 +70,7 @@ func TestClusterLabelerLabelsPrimaryAndSecondaries(t *testing.T) { Name: "test-cluster-0", Namespace: metav1.NamespaceDefault, Labels: map[string]string{ - constants.MySQLClusterLabel: "test-cluster", + constants.ClusterLabel: "test-cluster", }, }, }, @@ -83,7 +83,7 @@ func TestClusterLabelerLabelsPrimaryAndSecondaries(t *testing.T) { Name: "test-cluster-1", Namespace: metav1.NamespaceDefault, Labels: map[string]string{ - constants.MySQLClusterLabel: "test-cluster", + constants.ClusterLabel: "test-cluster", }, }, }, @@ -96,13 +96,13 @@ func TestClusterLabelerLabelsPrimaryAndSecondaries(t *testing.T) { Name: "test-cluster-2", Namespace: metav1.NamespaceDefault, Labels: map[string]string{ - constants.MySQLClusterLabel: "test-cluster", + constants.ClusterLabel: "test-cluster", }, }, }, } status := innodb.ClusterStatus{ - ClusterName: "MySQLCluster", + ClusterName: "Cluster", DefaultReplicaSet: innodb.ReplicaSet{ Name: "default", Primary: "test-cluster-0.test-cluster:3306", @@ -146,8 +146,8 @@ func TestClusterLabelerLabelsPrimaryAndSecondaries(t *testing.T) { if err != nil { t.Fatal(err) } - role, ok := pod.Labels[constants.LabelMySQLClusterRole] - if !ok || role != constants.MySQLClusterRolePrimary { + role, ok := pod.Labels[constants.LabelClusterRole] + if !ok || role != constants.ClusterRolePrimary { t.Errorf("test-cluster-0 not labeled as primary labels=%+v", pod.Labels) } @@ -156,8 +156,8 @@ func TestClusterLabelerLabelsPrimaryAndSecondaries(t *testing.T) { if err != nil { t.Fatal(err) } - role, ok = pod.Labels[constants.LabelMySQLClusterRole] - if !ok || role != constants.MySQLClusterRoleSecondary { + role, ok = pod.Labels[constants.LabelClusterRole] + if !ok || role != constants.ClusterRoleSecondary { t.Errorf("test-cluster-1 not labeled as secondary labels=%+v", pod.Labels) } @@ -166,8 +166,8 @@ func TestClusterLabelerLabelsPrimaryAndSecondaries(t *testing.T) { if err != nil { t.Fatal(err) } - role, ok = pod.Labels[constants.LabelMySQLClusterRole] - if !ok || role != constants.MySQLClusterRoleSecondary { + role, ok = pod.Labels[constants.LabelClusterRole] + if !ok || role != constants.ClusterRoleSecondary { t.Errorf("test-cluster-1 not labeled as secondary labels=%+v", pod.Labels) } } @@ -183,8 +183,8 @@ func TestClusterLabelerRelabelsOldPrimary(t *testing.T) { Name: "test-cluster-0", Namespace: metav1.NamespaceDefault, Labels: map[string]string{ - constants.MySQLClusterLabel: "test-cluster", - constants.LabelMySQLClusterRole: constants.MySQLClusterRolePrimary, + constants.ClusterLabel: "test-cluster", + constants.LabelClusterRole: constants.ClusterRolePrimary, }, }, }, @@ -197,8 +197,8 @@ func TestClusterLabelerRelabelsOldPrimary(t *testing.T) { Name: "test-cluster-1", Namespace: metav1.NamespaceDefault, Labels: map[string]string{ - constants.MySQLClusterLabel: "test-cluster", - constants.LabelMySQLClusterRole: constants.MySQLClusterRoleSecondary, + constants.ClusterLabel: "test-cluster", + constants.LabelClusterRole: constants.ClusterRoleSecondary, }, }, }, @@ -211,14 +211,14 @@ func TestClusterLabelerRelabelsOldPrimary(t *testing.T) { Name: "test-cluster-2", Namespace: metav1.NamespaceDefault, Labels: map[string]string{ - constants.MySQLClusterLabel: "test-cluster", - constants.LabelMySQLClusterRole: constants.MySQLClusterRoleSecondary, + constants.ClusterLabel: "test-cluster", + constants.LabelClusterRole: constants.ClusterRoleSecondary, }, }, }, } status := innodb.ClusterStatus{ - ClusterName: "MySQLCluster", + ClusterName: "Cluster", DefaultReplicaSet: innodb.ReplicaSet{ Name: "default", Primary: "test-cluster-1.test-cluster:3306", @@ -262,8 +262,8 @@ func TestClusterLabelerRelabelsOldPrimary(t *testing.T) { if err != nil { t.Fatal(err) } - role, ok := pod.Labels[constants.LabelMySQLClusterRole] - if !ok || role != constants.MySQLClusterRoleSecondary { + role, ok := pod.Labels[constants.LabelClusterRole] + if !ok || role != constants.ClusterRoleSecondary { t.Errorf("test-cluster-0 not labeled as secondary labels=%+v", pod.Labels) } @@ -272,8 +272,8 @@ func TestClusterLabelerRelabelsOldPrimary(t *testing.T) { if err != nil { t.Fatal(err) } - role, ok = pod.Labels[constants.LabelMySQLClusterRole] - if !ok || role != constants.MySQLClusterRolePrimary { + role, ok = pod.Labels[constants.LabelClusterRole] + if !ok || role != constants.ClusterRolePrimary { t.Errorf("test-cluster-1 not labeled as primary labels=%+v", pod.Labels) } } @@ -289,8 +289,8 @@ func TestClusterLabelerDoesntRelabelCorrectlyLabeledPods(t *testing.T) { Name: "test-cluster-0", Namespace: metav1.NamespaceDefault, Labels: map[string]string{ - constants.MySQLClusterLabel: "test-cluster", - constants.LabelMySQLClusterRole: constants.MySQLClusterRolePrimary, + constants.ClusterLabel: "test-cluster", + constants.LabelClusterRole: constants.ClusterRolePrimary, }, }, }, @@ -303,8 +303,8 @@ func TestClusterLabelerDoesntRelabelCorrectlyLabeledPods(t *testing.T) { Name: "test-cluster-1", Namespace: metav1.NamespaceDefault, Labels: map[string]string{ - constants.MySQLClusterLabel: "test-cluster", - constants.LabelMySQLClusterRole: constants.MySQLClusterRoleSecondary, + constants.ClusterLabel: "test-cluster", + constants.LabelClusterRole: constants.ClusterRoleSecondary, }, }, }, @@ -317,14 +317,14 @@ func TestClusterLabelerDoesntRelabelCorrectlyLabeledPods(t *testing.T) { Name: "test-cluster-2", Namespace: metav1.NamespaceDefault, Labels: map[string]string{ - constants.MySQLClusterLabel: "test-cluster", - constants.LabelMySQLClusterRole: constants.MySQLClusterRoleSecondary, + constants.ClusterLabel: "test-cluster", + constants.LabelClusterRole: constants.ClusterRoleSecondary, }, }, }, } status := innodb.ClusterStatus{ - ClusterName: "MySQLCluster", + ClusterName: "Cluster", DefaultReplicaSet: innodb.ReplicaSet{ Name: "default", Primary: "test-cluster-0.test-cluster:3306", @@ -375,8 +375,8 @@ func TestClusterLabelerRemovesLabelFromInstanceInMissingState(t *testing.T) { Name: "test-cluster-0", Namespace: metav1.NamespaceDefault, Labels: map[string]string{ - constants.MySQLClusterLabel: "test-cluster", - constants.LabelMySQLClusterRole: constants.MySQLClusterRolePrimary, + constants.ClusterLabel: "test-cluster", + constants.LabelClusterRole: constants.ClusterRolePrimary, }, }, }, @@ -389,8 +389,8 @@ func TestClusterLabelerRemovesLabelFromInstanceInMissingState(t *testing.T) { Name: "test-cluster-1", Namespace: metav1.NamespaceDefault, Labels: map[string]string{ - constants.MySQLClusterLabel: "test-cluster", - constants.LabelMySQLClusterRole: constants.MySQLClusterRoleSecondary, + constants.ClusterLabel: "test-cluster", + constants.LabelClusterRole: constants.ClusterRoleSecondary, }, }, }, @@ -403,14 +403,14 @@ func TestClusterLabelerRemovesLabelFromInstanceInMissingState(t *testing.T) { Name: "test-cluster-2", Namespace: metav1.NamespaceDefault, Labels: map[string]string{ - constants.MySQLClusterLabel: "test-cluster", - constants.LabelMySQLClusterRole: constants.MySQLClusterRoleSecondary, + constants.ClusterLabel: "test-cluster", + constants.LabelClusterRole: constants.ClusterRoleSecondary, }, }, }, } status := innodb.ClusterStatus{ - ClusterName: "MySQLCluster", + ClusterName: "Cluster", DefaultReplicaSet: innodb.ReplicaSet{ Name: "default", Primary: "test-cluster-0.test-cluster:3306", @@ -454,7 +454,7 @@ func TestClusterLabelerRemovesLabelFromInstanceInMissingState(t *testing.T) { if err != nil { t.Fatal(err) } - role, _ := pod.Labels[constants.LabelMySQLClusterRole] + role, _ := pod.Labels[constants.LabelClusterRole] if role != "" { t.Errorf("label not removed from test-cluster-2 labels=%+v", pod.Labels) } diff --git a/pkg/controllers/cluster/labeler/selectors.go b/pkg/controllers/cluster/labeler/selectors.go index c797b7bad..649a6e748 100644 --- a/pkg/controllers/cluster/labeler/selectors.go +++ b/pkg/controllers/cluster/labeler/selectors.go @@ -22,35 +22,35 @@ import ( ) // PrimarySelector returns a label selector that selects only primaries of a -// MySQLCluster's Pods. +// Cluster's Pods. func PrimarySelector(name string) labels.Selector { return labels.SelectorFromSet(labels.Set{ - constants.MySQLClusterLabel: name, - constants.LabelMySQLClusterRole: constants.MySQLClusterRolePrimary, + constants.ClusterLabel: name, + constants.LabelClusterRole: constants.ClusterRolePrimary, }) } // SecondarySelector returns a label selector that selects only secondaries of a -// MySQLCluster's Pods. +// Cluster's Pods. func SecondarySelector(name string) labels.Selector { return labels.SelectorFromSet(labels.Set{ - constants.MySQLClusterLabel: name, - constants.LabelMySQLClusterRole: constants.MySQLClusterRoleSecondary, + constants.ClusterLabel: name, + constants.LabelClusterRole: constants.ClusterRoleSecondary, }) } // NonPrimarySelector returns a label selector that selects all Pods excluding -// primaries of a MySQLCluster. +// primaries of a Cluster. func NonPrimarySelector(name string) labels.Selector { - s := labels.SelectorFromSet(labels.Set{constants.MySQLClusterLabel: name}) - requirement, _ := labels.NewRequirement(constants.LabelMySQLClusterRole, selection.NotIn, []string{constants.MySQLClusterRolePrimary}) + s := labels.SelectorFromSet(labels.Set{constants.ClusterLabel: name}) + requirement, _ := labels.NewRequirement(constants.LabelClusterRole, selection.NotIn, []string{constants.ClusterRolePrimary}) return s.Add(*requirement) } // HasRoleSelector returns a label selector that selects all Pods for a -// MySQLCluster that have been labeled as having a role. +// Cluster that have been labeled as having a role. func HasRoleSelector(name string) labels.Selector { - s := labels.SelectorFromSet(labels.Set{constants.MySQLClusterLabel: name}) - requirement, _ := labels.NewRequirement(constants.LabelMySQLClusterRole, selection.Exists, []string{}) + s := labels.SelectorFromSet(labels.Set{constants.ClusterLabel: name}) + requirement, _ := labels.NewRequirement(constants.LabelClusterRole, selection.Exists, []string{}) return s.Add(*requirement) } diff --git a/pkg/controllers/cluster/labeler/selectors_test.go b/pkg/controllers/cluster/labeler/selectors_test.go index 45f3f4447..61192aba5 100644 --- a/pkg/controllers/cluster/labeler/selectors_test.go +++ b/pkg/controllers/cluster/labeler/selectors_test.go @@ -33,28 +33,28 @@ func TestPrimarySelector(t *testing.T) { { name: "primary", labels: map[string]string{ - constants.MySQLClusterLabel: "primary", - constants.LabelMySQLClusterRole: constants.MySQLClusterRolePrimary, + constants.ClusterLabel: "primary", + constants.LabelClusterRole: constants.ClusterRolePrimary, }, matches: 1, }, { name: "secondary", labels: map[string]string{ - constants.MySQLClusterLabel: "secondary", - constants.LabelMySQLClusterRole: constants.MySQLClusterRoleSecondary, + constants.ClusterLabel: "secondary", + constants.LabelClusterRole: constants.ClusterRoleSecondary, }, matches: 0, }, { name: "blank", labels: map[string]string{ - constants.MySQLClusterLabel: "blank", - constants.LabelMySQLClusterRole: "", + constants.ClusterLabel: "blank", + constants.LabelClusterRole: "", }, matches: 0, }, { name: "missing", labels: map[string]string{ - constants.MySQLClusterLabel: "missing", + constants.ClusterLabel: "missing", }, matches: 0, }, @@ -85,28 +85,28 @@ func TestSecondarySelector(t *testing.T) { { name: "secondary", labels: map[string]string{ - constants.MySQLClusterLabel: "secondary", - constants.LabelMySQLClusterRole: constants.MySQLClusterRoleSecondary, + constants.ClusterLabel: "secondary", + constants.LabelClusterRole: constants.ClusterRoleSecondary, }, matches: 1, }, { name: "primary", labels: map[string]string{ - constants.MySQLClusterLabel: "primary", - constants.LabelMySQLClusterRole: constants.MySQLClusterRolePrimary, + constants.ClusterLabel: "primary", + constants.LabelClusterRole: constants.ClusterRolePrimary, }, matches: 0, }, { name: "blank", labels: map[string]string{ - constants.MySQLClusterLabel: "blank", - constants.LabelMySQLClusterRole: "", + constants.ClusterLabel: "blank", + constants.LabelClusterRole: "", }, matches: 0, }, { name: "missing", labels: map[string]string{ - constants.MySQLClusterLabel: "missing", + constants.ClusterLabel: "missing", }, matches: 0, }, @@ -137,28 +137,28 @@ func TestNonPrimarySelector(t *testing.T) { { name: "secondary", labels: map[string]string{ - constants.MySQLClusterLabel: "secondary", - constants.LabelMySQLClusterRole: constants.MySQLClusterRoleSecondary, + constants.ClusterLabel: "secondary", + constants.LabelClusterRole: constants.ClusterRoleSecondary, }, matches: 1, }, { name: "primary", labels: map[string]string{ - constants.MySQLClusterLabel: "primary", - constants.LabelMySQLClusterRole: constants.MySQLClusterRolePrimary, + constants.ClusterLabel: "primary", + constants.LabelClusterRole: constants.ClusterRolePrimary, }, matches: 0, }, { name: "blank", labels: map[string]string{ - constants.MySQLClusterLabel: "blank", - constants.LabelMySQLClusterRole: "", + constants.ClusterLabel: "blank", + constants.LabelClusterRole: "", }, matches: 1, }, { name: "missing", labels: map[string]string{ - constants.MySQLClusterLabel: "missing", + constants.ClusterLabel: "missing", }, matches: 1, }, @@ -189,28 +189,28 @@ func TestHasRoleSelector(t *testing.T) { { name: "secondary", labels: map[string]string{ - constants.MySQLClusterLabel: "secondary", - constants.LabelMySQLClusterRole: constants.MySQLClusterRoleSecondary, + constants.ClusterLabel: "secondary", + constants.LabelClusterRole: constants.ClusterRoleSecondary, }, matches: 1, }, { name: "primary", labels: map[string]string{ - constants.MySQLClusterLabel: "primary", - constants.LabelMySQLClusterRole: constants.MySQLClusterRolePrimary, + constants.ClusterLabel: "primary", + constants.LabelClusterRole: constants.ClusterRolePrimary, }, matches: 1, }, { name: "blank", labels: map[string]string{ - constants.MySQLClusterLabel: "blank", - constants.LabelMySQLClusterRole: "", + constants.ClusterLabel: "blank", + constants.LabelClusterRole: "", }, matches: 1, }, { name: "missing", labels: map[string]string{ - constants.MySQLClusterLabel: "missing", + constants.ClusterLabel: "missing", }, matches: 0, }, diff --git a/pkg/controllers/cluster/pod_control.go b/pkg/controllers/cluster/pod_control.go index 9ca0faf88..f36ff9963 100644 --- a/pkg/controllers/cluster/pod_control.go +++ b/pkg/controllers/cluster/pod_control.go @@ -27,7 +27,7 @@ import ( ) // PodControlInterface defines the interface that the -// MySQLClusterController uses to create, update, and delete mysql pods. It +// ClusterController uses to create, update, and delete mysql pods. It // is implemented as an interface to enable testing. type PodControlInterface interface { PatchPod(old *v1.Pod, new *v1.Pod) error diff --git a/pkg/controllers/cluster/secret_control.go b/pkg/controllers/cluster/secret_control.go index b9fd7cab0..2973179d4 100644 --- a/pkg/controllers/cluster/secret_control.go +++ b/pkg/controllers/cluster/secret_control.go @@ -23,11 +23,11 @@ import ( "github.com/oracle/mysql-operator/pkg/resources/secrets" ) -// SecretControlInterface defines the interface that the MySQLClusterController +// SecretControlInterface defines the interface that the ClusterController // uses to get and create Secrets. It is implemented as an interface to enable // testing. type SecretControlInterface interface { - GetForCluster(cluster *v1alpha1.MySQLCluster) (*v1.Secret, error) + GetForCluster(cluster *v1alpha1.Cluster) (*v1.Secret, error) CreateSecret(s *v1.Secret) error } @@ -41,7 +41,7 @@ func NewRealSecretControl(client kubernetes.Interface) SecretControlInterface { return &realSecretControl{client: client} } -func (rsc *realSecretControl) GetForCluster(cluster *v1alpha1.MySQLCluster) (*v1.Secret, error) { +func (rsc *realSecretControl) GetForCluster(cluster *v1alpha1.Cluster) (*v1.Secret, error) { return rsc.client.CoreV1(). Secrets(cluster.Namespace). Get(secrets.GetRootPasswordSecretName(cluster), metav1.GetOptions{}) diff --git a/pkg/controllers/cluster/service_control.go b/pkg/controllers/cluster/service_control.go index 6e9f517be..9673cc168 100644 --- a/pkg/controllers/cluster/service_control.go +++ b/pkg/controllers/cluster/service_control.go @@ -20,7 +20,7 @@ import ( corelistersv1 "k8s.io/client-go/listers/core/v1" ) -// ServiceControlInterface defines the interface that the MySQLClusterController +// ServiceControlInterface defines the interface that the ClusterController // uses to create Services. It is implemented as an interface to enable testing. type ServiceControlInterface interface { CreateService(s *corev1.Service) error diff --git a/pkg/controllers/cluster/statefulset_control.go b/pkg/controllers/cluster/statefulset_control.go index ccc5c5a97..27dac15a7 100644 --- a/pkg/controllers/cluster/statefulset_control.go +++ b/pkg/controllers/cluster/statefulset_control.go @@ -27,7 +27,7 @@ import ( ) // StatefulSetControlInterface defines the interface that the -// MySQLClusterController uses to create and update StatefulSets. It +// ClusterController uses to create and update StatefulSets. It // is implemented as an interface to enable testing. type StatefulSetControlInterface interface { CreateStatefulSet(ss *apps.StatefulSet) error diff --git a/pkg/controllers/cluster/utils.go b/pkg/controllers/cluster/utils.go index 3d85d6470..dd48edb93 100644 --- a/pkg/controllers/cluster/utils.go +++ b/pkg/controllers/cluster/utils.go @@ -27,8 +27,8 @@ import ( // SelectorForCluster creates a labels.Selector to match a given clusters // associated resources. -func SelectorForCluster(c *v1alpha1.MySQLCluster) labels.Selector { - return labels.SelectorFromSet(labels.Set{constants.MySQLClusterLabel: c.Name}) +func SelectorForCluster(c *v1alpha1.Cluster) labels.Selector { + return labels.SelectorFromSet(labels.Set{constants.ClusterLabel: c.Name}) } // SelectorForClusterOperatorVersion creates a labels.Selector to match a given clusters diff --git a/pkg/controllers/restore/agent_controller.go b/pkg/controllers/restore/agent_controller.go index 0c685dd4b..1daf8ef1f 100644 --- a/pkg/controllers/restore/agent_controller.go +++ b/pkg/controllers/restore/agent_controller.go @@ -49,7 +49,7 @@ import ( const agentControllerAgentName = "agent-restore-controller" -// AgentController handles the excution of MySQLRestores on a specific (primary) +// AgentController handles the excution of Restores on a specific (primary) // mysql-agent. It is run in each mysql-agent. // TODO: Probably should only be run iff the local mysql instance is a primary. type AgentController struct { @@ -57,13 +57,13 @@ type AgentController struct { podName string kubeClient kubernetes.Interface - client clientset.MySQLRestoresGetter + client clientset.RestoresGetter syncHandler func(key string) error - // restoreLister is able to list/get MySQLRestores from a shared informer's + // restoreLister is able to list/get Restores from a shared informer's // store. - restoreLister listersv1alpha1.MySQLRestoreLister - // restoreListerSynced returns true if the MySQLRestore shared informer has + restoreLister listersv1alpha1.RestoreLister + // restoreListerSynced returns true if the Restore shared informer has // synced at least once. restoreListerSynced cache.InformerSynced @@ -73,17 +73,17 @@ type AgentController struct { // least once. podListerSynced cache.InformerSynced - // clusterLister is able to list/get MySQLClusters from a shared informer's + // clusterLister is able to list/get Clusters from a shared informer's // store. - clusterLister listersv1alpha1.MySQLClusterLister - // clusterListerSynced returns true if the MySQLCluster shared informer has + clusterLister listersv1alpha1.ClusterLister + // clusterListerSynced returns true if the Cluster shared informer has // synced at least once. clusterListerSynced cache.InformerSynced - // backupLister is able to list/get MySQLBackups from a shared informer's + // backupLister is able to list/get Backups from a shared informer's // store. - backupLister listersv1alpha1.MySQLBackupLister - // backupListerSynced returns true if the MySQLBackup shared informer has + backupLister listersv1alpha1.BackupLister + // backupListerSynced returns true if the Backup shared informer has // synced at least once. backupListerSynced cache.InformerSynced @@ -96,10 +96,10 @@ type AgentController struct { // NewAgentController constructs a new AgentController. func NewAgentController( kubeClient kubernetes.Interface, - client clientset.MySQLRestoresGetter, - restoreInformer informersv1alpha1.MySQLRestoreInformer, - clusterInformer informersv1alpha1.MySQLClusterInformer, - backupInformer informersv1alpha1.MySQLBackupInformer, + client clientset.RestoresGetter, + restoreInformer informersv1alpha1.RestoreInformer, + clusterInformer informersv1alpha1.ClusterInformer, + backupInformer informersv1alpha1.BackupInformer, podInformer corev1informers.PodInformer, podName string, ) *AgentController { @@ -131,7 +131,7 @@ func NewAgentController( restoreInformer.Informer().AddEventHandler( cache.ResourceEventHandlerFuncs{ UpdateFunc: func(oldObj, newObj interface{}) { - new := newObj.(*v1alpha1.MySQLRestore) + new := newObj.(*v1alpha1.Restore) if new.Status.Phase == v1alpha1.RestorePhaseScheduled && new.Spec.AgentScheduled == c.podName { key, err := cache.MetaNamespaceKeyFunc(new) if err != nil { @@ -141,7 +141,7 @@ func NewAgentController( c.queue.Add(key) return } - glog.V(2).Infof("MySQLRestore %q is not Scheduled, skipping (phase=%q)", + glog.V(2).Infof("Restore %q is not Scheduled, skipping (phase=%q)", kubeutil.NamespaceAndName(new), new.Status.Phase) }, @@ -238,9 +238,9 @@ func (controller *AgentController) processRestore(key string) error { } // Get resource from store. - restore, err := controller.restoreLister.MySQLRestores(ns).Get(name) + restore, err := controller.restoreLister.Restores(ns).Get(name) if err != nil { - return errors.Wrap(err, "error getting MySQLRestore") + return errors.Wrap(err, "error getting Restore") } // Don't modify items in the cache. @@ -249,7 +249,7 @@ func (controller *AgentController) processRestore(key string) error { restore = restore.EnsureDefaults() var ( - backup *v1alpha1.MySQLBackup + backup *v1alpha1.Backup creds *corev1.Secret ) @@ -260,8 +260,8 @@ func (controller *AgentController) processRestore(key string) error { validationErrs := field.ErrorList{} fldPath := field.NewPath("spec") - // Check the referenced MySQLCluster exists. - _, err := controller.clusterLister.MySQLClusters(ns).Get(restore.Spec.ClusterRef.Name) + // Check the referenced Cluster exists. + _, err := controller.clusterLister.Clusters(ns).Get(restore.Spec.ClusterRef.Name) if err != nil { if !apierrors.IsNotFound(err) { return err @@ -270,8 +270,8 @@ func (controller *AgentController) processRestore(key string) error { field.NotFound(fldPath.Child("clusterRef").Child("name"), restore.Spec.ClusterRef.Name)) } - // Check the referenced MySQLBackup exists. - backup, err = controller.backupLister.MySQLBackups(ns).Get(restore.Spec.BackupRef.Name) + // Check the referenced Backup exists. + backup, err = controller.backupLister.Backups(ns).Get(restore.Spec.BackupRef.Name) if err != nil { if !apierrors.IsNotFound(err) { return err @@ -280,27 +280,27 @@ func (controller *AgentController) processRestore(key string) error { field.NotFound(fldPath.Child("backupRef").Child("name"), restore.Spec.BackupRef.Name)) } - creds, err = controller.kubeClient.CoreV1().Secrets(ns).Get(backup.Spec.Storage.SecretRef.Name, metav1.GetOptions{}) + creds, err = controller.kubeClient.CoreV1().Secrets(ns).Get(backup.Spec.StorageProvider.SecretRef.Name, metav1.GetOptions{}) if err != nil { if !apierrors.IsNotFound(err) { return errors.Wrap(err, "getting backup credentials secret") } validationErrs = append(validationErrs, - field.NotFound(fldPath.Child("backupRef").Child("name"), backup.Spec.Storage.SecretRef.Name)) + field.NotFound(fldPath.Child("backupRef").Child("name"), backup.Spec.StorageProvider.SecretRef.Name)) } if len(validationErrs) > 0 { validationErr = validationErrs.ToAggregate() } } - // If the MySQLRestore is not valid emit an event to that effect and mark + // If the Restore is not valid emit an event to that effect and mark // it as failed. // TODO(apryde): Maybe we should add an UpdateFunc to the restoreInformer // and support users fixing validation errors via updates (rather than // recreation). if validationErr != nil { restore.Status.Phase = v1alpha1.RestorePhaseFailed - restore, err = controller.client.MySQLRestores(ns).Update(restore) + restore, err = controller.client.Restores(ns).Update(restore) if err != nil { return errors.Wrapf(err, "failed to update (phase=%q)", v1alpha1.RestorePhaseFailed) } @@ -317,14 +317,14 @@ func (controller *AgentController) processRestore(key string) error { return nil } -func (controller *AgentController) performRestore(restore *v1alpha1.MySQLRestore, backup *v1alpha1.MySQLBackup, creds *corev1.Secret) error { +func (controller *AgentController) performRestore(restore *v1alpha1.Restore, backup *v1alpha1.Backup, creds *corev1.Secret) error { // Update restore phase to started. started := time.Now() restore.Status.Phase = v1alpha1.RestorePhaseStarted restore.Status.TimeStarted = metav1.Time{Time: started} - restore, err := controller.client.MySQLRestores(restore.Namespace).Update(restore) + restore, err := controller.client.Restores(restore.Namespace).Update(restore) if err != nil { - return errors.Wrapf(err, "failed to mark MySQLRestore %q as started", kubeutil.NamespaceAndName(restore)) + return errors.Wrapf(err, "failed to mark Restore %q as started", kubeutil.NamespaceAndName(restore)) } // TODO: Should backuputil.NewConfiguredRunner accept a map[string][]byte @@ -334,12 +334,12 @@ func (controller *AgentController) performRestore(restore *v1alpha1.MySQLRestore credsMap[k] = string(v) } - runner, err := backuputil.NewConfiguredRunner(backup.Spec.Executor, executor.DefaultCreds(), backup.Spec.Storage, credsMap) + runner, err := backuputil.NewConfiguredRunner(backup.Spec.Executor, executor.DefaultCreds(), backup.Spec.StorageProvider, credsMap) if err != nil { restore.Status.Phase = v1alpha1.RestorePhaseFailed - restore, updateErr := controller.client.MySQLRestores(restore.Namespace).Update(restore) + restore, updateErr := controller.client.Restores(restore.Namespace).Update(restore) if updateErr != nil { - return errors.Wrapf(err, "failed to mark MySQLRestore %q as failed", kubeutil.NamespaceAndName(restore)) + return errors.Wrapf(err, "failed to mark Restore %q as failed", kubeutil.NamespaceAndName(restore)) } controller.recorder.Event(restore, corev1.EventTypeWarning, "FailedValidation", err.Error()) @@ -349,9 +349,9 @@ func (controller *AgentController) performRestore(restore *v1alpha1.MySQLRestore err = runner.Restore(backup.Status.Outcome.Location) if err != nil { restore.Status.Phase = v1alpha1.RestorePhaseFailed - restore, updateErr := controller.client.MySQLRestores(restore.Namespace).Update(restore) + restore, updateErr := controller.client.Restores(restore.Namespace).Update(restore) if updateErr != nil { - return errors.Wrapf(err, "failed to mark MySQLRestore %q as failed", kubeutil.NamespaceAndName(restore)) + return errors.Wrapf(err, "failed to mark Restore %q as failed", kubeutil.NamespaceAndName(restore)) } controller.recorder.Event(restore, corev1.EventTypeWarning, "RestoreFailed", err.Error()) @@ -362,13 +362,13 @@ func (controller *AgentController) performRestore(restore *v1alpha1.MySQLRestore restore.Status.Phase = v1alpha1.RestorePhaseComplete restore.Status.TimeCompleted = metav1.Time{Time: finished} - restore, err = controller.client.MySQLRestores(restore.Namespace).Update(restore) + restore, err = controller.client.Restores(restore.Namespace).Update(restore) if err != nil { - return errors.Wrapf(err, "failed to mark MySQLRestore %q as complete", kubeutil.NamespaceAndName(restore)) + return errors.Wrapf(err, "failed to mark Restore %q as complete", kubeutil.NamespaceAndName(restore)) } metrics.IncEventCounter(clusterRestoreCount) - glog.Infof("MySQLRestore %q succeeded in %v", restore.Name, finished.Sub(started)) + glog.Infof("Restore %q succeeded in %v", restore.Name, finished.Sub(started)) controller.recorder.Event(restore, corev1.EventTypeNormal, "Success", "Restore complete") return nil diff --git a/pkg/controllers/restore/operator_controller.go b/pkg/controllers/restore/operator_controller.go index ce3ca71dc..7bdd67e38 100644 --- a/pkg/controllers/restore/operator_controller.go +++ b/pkg/controllers/restore/operator_controller.go @@ -47,16 +47,16 @@ import ( const controllerAgentName = "operator-restore-controller" // OperatorController handles validation, labeling, and scheduling of -// MySQLRestores to be executed on a specific (primary) mysql-agent. It is run +// Restores to be executed on a specific (primary) mysql-agent. It is run // in the operator. type OperatorController struct { - client clientset.MySQLRestoresGetter + client clientset.RestoresGetter syncHandler func(key string) error - // restoreLister is able to list/get MySQLRestores from a shared informer's + // restoreLister is able to list/get Restores from a shared informer's // store. - restoreLister listersv1alpha1.MySQLRestoreLister - // restoreListerSynced returns true if the MySQLRestore shared informer has + restoreLister listersv1alpha1.RestoreLister + // restoreListerSynced returns true if the Restore shared informer has // synced at least once. restoreListerSynced cache.InformerSynced @@ -66,17 +66,17 @@ type OperatorController struct { // least once. podListerSynced cache.InformerSynced - // clusterLister is able to list/get MySQLClusters from a shared informer's + // clusterLister is able to list/get Clusters from a shared informer's // store. - clusterLister listersv1alpha1.MySQLClusterLister - // clusterListerSynced returns true if the MySQLCluster shared informer has + clusterLister listersv1alpha1.ClusterLister + // clusterListerSynced returns true if the Cluster shared informer has // synced at least once. clusterListerSynced cache.InformerSynced - // backupLister is able to list/get MySQLBackups from a shared informer's + // backupLister is able to list/get Backups from a shared informer's // store. - backupLister listersv1alpha1.MySQLBackupLister - // backupListerSynced returns true if the MySQLBackup shared informer has + backupLister listersv1alpha1.BackupLister + // backupListerSynced returns true if the Backup shared informer has // synced at least once. backupListerSynced cache.InformerSynced @@ -89,10 +89,10 @@ type OperatorController struct { // NewOperatorController constructs a new OperatorController. func NewOperatorController( kubeClient kubernetes.Interface, - client clientset.MySQLRestoresGetter, - restoreInformer informersv1alpha1.MySQLRestoreInformer, - clusterInformer informersv1alpha1.MySQLClusterInformer, - backupInformer informersv1alpha1.MySQLBackupInformer, + client clientset.RestoresGetter, + restoreInformer informersv1alpha1.RestoreInformer, + clusterInformer informersv1alpha1.ClusterInformer, + backupInformer informersv1alpha1.BackupInformer, podInformer corev1informers.PodInformer, ) *OperatorController { // Create event broadcaster. @@ -121,13 +121,13 @@ func NewOperatorController( restoreInformer.Informer().AddEventHandler( cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { - restore := obj.(*v1alpha1.MySQLRestore) + restore := obj.(*v1alpha1.Restore) switch restore.Status.Phase { case v1alpha1.RestorePhaseUnknown, v1alpha1.RestorePhaseNew: // Only process new restores. default: - glog.V(2).Infof("MySQLRestore %q is not new, skipping (phase=%q)", + glog.V(2).Infof("Restore %q is not new, skipping (phase=%q)", kubeutil.NamespaceAndName(restore), restore.Status.Phase) return } @@ -232,9 +232,9 @@ func (controller *OperatorController) processRestore(key string) error { } // Get resource from store. - restore, err := controller.restoreLister.MySQLRestores(ns).Get(name) + restore, err := controller.restoreLister.Restores(ns).Get(name) if err != nil { - return errors.Wrap(err, "error getting MySQLRestore") + return errors.Wrap(err, "error getting Restore") } // Don't modify items in the cache. @@ -249,8 +249,8 @@ func (controller *OperatorController) processRestore(key string) error { validationErrs := field.ErrorList{} fldPath := field.NewPath("spec") - // Check the referenced MySQLCluster exists. - _, err := controller.clusterLister.MySQLClusters(ns).Get(restore.Spec.ClusterRef.Name) + // Check the referenced Cluster exists. + _, err := controller.clusterLister.Clusters(ns).Get(restore.Spec.ClusterRef.Name) if err != nil { if !apierrors.IsNotFound(err) { return err @@ -259,8 +259,8 @@ func (controller *OperatorController) processRestore(key string) error { field.NotFound(fldPath.Child("clusterRef").Child("name"), restore.Spec.ClusterRef.Name)) } - // Check the referenced MySQLBackup exists. - _, err = controller.backupLister.MySQLBackups(ns).Get(restore.Spec.BackupRef.Name) + // Check the referenced Backup exists. + _, err = controller.backupLister.Backups(ns).Get(restore.Spec.BackupRef.Name) if err != nil { if !apierrors.IsNotFound(err) { return err @@ -273,14 +273,14 @@ func (controller *OperatorController) processRestore(key string) error { } } - // If the MySQLRestore is not valid emit an event to that effect and mark + // If the Restore is not valid emit an event to that effect and mark // it as failed. // TODO(apryde): Maybe we should add an UpdateFunc to the restoreInformer // and support users fixing validation errors via updates (rather than // recreation). if validationErr != nil { restore.Status.Phase = v1alpha1.RestorePhaseFailed - restore, err = controller.client.MySQLRestores(ns).Update(restore) + restore, err = controller.client.Restores(ns).Update(restore) if err != nil { return errors.Wrapf(err, "failed to update (phase=%q)", v1alpha1.RestorePhaseFailed) } @@ -296,7 +296,7 @@ func (controller *OperatorController) processRestore(key string) error { } // Update resource. - restore, err = controller.client.MySQLRestores(ns).Update(restore) + restore, err = controller.client.Restores(ns).Update(restore) if err != nil { return errors.Wrap(err, "failed to update") } @@ -306,8 +306,8 @@ func (controller *OperatorController) processRestore(key string) error { return nil } -// scheduleRestore schedules a MySQLRestore on a specific member of a MySQLCluster. -func (controller *OperatorController) scheduleRestore(restore *v1alpha1.MySQLRestore) (*v1alpha1.MySQLRestore, error) { +// scheduleRestore schedules a Restore on a specific member of a Cluster. +func (controller *OperatorController) scheduleRestore(restore *v1alpha1.Restore) (*v1alpha1.Restore, error) { var ( name = restore.Spec.ClusterRef.Name ns = restore.Namespace diff --git a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/backup.go b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/backup.go new file mode 100644 index 000000000..0ad5d139b --- /dev/null +++ b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/backup.go @@ -0,0 +1,153 @@ +// Copyright 2018 Oracle and/or its affiliates. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package v1alpha1 + +import ( + v1alpha1 "github.com/oracle/mysql-operator/pkg/apis/mysql/v1alpha1" + scheme "github.com/oracle/mysql-operator/pkg/generated/clientset/versioned/scheme" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + rest "k8s.io/client-go/rest" +) + +// BackupsGetter has a method to return a BackupInterface. +// A group's client should implement this interface. +type BackupsGetter interface { + Backups(namespace string) BackupInterface +} + +// BackupInterface has methods to work with Backup resources. +type BackupInterface interface { + Create(*v1alpha1.Backup) (*v1alpha1.Backup, error) + Update(*v1alpha1.Backup) (*v1alpha1.Backup, error) + Delete(name string, options *v1.DeleteOptions) error + DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error + Get(name string, options v1.GetOptions) (*v1alpha1.Backup, error) + List(opts v1.ListOptions) (*v1alpha1.BackupList, error) + Watch(opts v1.ListOptions) (watch.Interface, error) + Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.Backup, err error) + BackupExpansion +} + +// backups implements BackupInterface +type backups struct { + client rest.Interface + ns string +} + +// newBackups returns a Backups +func newBackups(c *MysqlV1alpha1Client, namespace string) *backups { + return &backups{ + client: c.RESTClient(), + ns: namespace, + } +} + +// Get takes name of the backup, and returns the corresponding backup object, and an error if there is any. +func (c *backups) Get(name string, options v1.GetOptions) (result *v1alpha1.Backup, err error) { + result = &v1alpha1.Backup{} + err = c.client.Get(). + Namespace(c.ns). + Resource("backups"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of Backups that match those selectors. +func (c *backups) List(opts v1.ListOptions) (result *v1alpha1.BackupList, err error) { + result = &v1alpha1.BackupList{} + err = c.client.Get(). + Namespace(c.ns). + Resource("backups"). + VersionedParams(&opts, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested backups. +func (c *backups) Watch(opts v1.ListOptions) (watch.Interface, error) { + opts.Watch = true + return c.client.Get(). + Namespace(c.ns). + Resource("backups"). + VersionedParams(&opts, scheme.ParameterCodec). + Watch() +} + +// Create takes the representation of a backup and creates it. Returns the server's representation of the backup, and an error, if there is any. +func (c *backups) Create(backup *v1alpha1.Backup) (result *v1alpha1.Backup, err error) { + result = &v1alpha1.Backup{} + err = c.client.Post(). + Namespace(c.ns). + Resource("backups"). + Body(backup). + Do(). + Into(result) + return +} + +// Update takes the representation of a backup and updates it. Returns the server's representation of the backup, and an error, if there is any. +func (c *backups) Update(backup *v1alpha1.Backup) (result *v1alpha1.Backup, err error) { + result = &v1alpha1.Backup{} + err = c.client.Put(). + Namespace(c.ns). + Resource("backups"). + Name(backup.Name). + Body(backup). + Do(). + Into(result) + return +} + +// Delete takes name of the backup and deletes it. Returns an error if one occurs. +func (c *backups) Delete(name string, options *v1.DeleteOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("backups"). + Name(name). + Body(options). + Do(). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *backups) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("backups"). + VersionedParams(&listOptions, scheme.ParameterCodec). + Body(options). + Do(). + Error() +} + +// Patch applies the patch and returns the patched backup. +func (c *backups) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.Backup, err error) { + result = &v1alpha1.Backup{} + err = c.client.Patch(pt). + Namespace(c.ns). + Resource("backups"). + SubResource(subresources...). + Name(name). + Body(data). + Do(). + Into(result) + return +} diff --git a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/backupschedule.go b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/backupschedule.go new file mode 100644 index 000000000..eb7bb9a30 --- /dev/null +++ b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/backupschedule.go @@ -0,0 +1,153 @@ +// Copyright 2018 Oracle and/or its affiliates. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package v1alpha1 + +import ( + v1alpha1 "github.com/oracle/mysql-operator/pkg/apis/mysql/v1alpha1" + scheme "github.com/oracle/mysql-operator/pkg/generated/clientset/versioned/scheme" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + rest "k8s.io/client-go/rest" +) + +// BackupSchedulesGetter has a method to return a BackupScheduleInterface. +// A group's client should implement this interface. +type BackupSchedulesGetter interface { + BackupSchedules(namespace string) BackupScheduleInterface +} + +// BackupScheduleInterface has methods to work with BackupSchedule resources. +type BackupScheduleInterface interface { + Create(*v1alpha1.BackupSchedule) (*v1alpha1.BackupSchedule, error) + Update(*v1alpha1.BackupSchedule) (*v1alpha1.BackupSchedule, error) + Delete(name string, options *v1.DeleteOptions) error + DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error + Get(name string, options v1.GetOptions) (*v1alpha1.BackupSchedule, error) + List(opts v1.ListOptions) (*v1alpha1.BackupScheduleList, error) + Watch(opts v1.ListOptions) (watch.Interface, error) + Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.BackupSchedule, err error) + BackupScheduleExpansion +} + +// backupSchedules implements BackupScheduleInterface +type backupSchedules struct { + client rest.Interface + ns string +} + +// newBackupSchedules returns a BackupSchedules +func newBackupSchedules(c *MysqlV1alpha1Client, namespace string) *backupSchedules { + return &backupSchedules{ + client: c.RESTClient(), + ns: namespace, + } +} + +// Get takes name of the backupSchedule, and returns the corresponding backupSchedule object, and an error if there is any. +func (c *backupSchedules) Get(name string, options v1.GetOptions) (result *v1alpha1.BackupSchedule, err error) { + result = &v1alpha1.BackupSchedule{} + err = c.client.Get(). + Namespace(c.ns). + Resource("backupschedules"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of BackupSchedules that match those selectors. +func (c *backupSchedules) List(opts v1.ListOptions) (result *v1alpha1.BackupScheduleList, err error) { + result = &v1alpha1.BackupScheduleList{} + err = c.client.Get(). + Namespace(c.ns). + Resource("backupschedules"). + VersionedParams(&opts, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested backupSchedules. +func (c *backupSchedules) Watch(opts v1.ListOptions) (watch.Interface, error) { + opts.Watch = true + return c.client.Get(). + Namespace(c.ns). + Resource("backupschedules"). + VersionedParams(&opts, scheme.ParameterCodec). + Watch() +} + +// Create takes the representation of a backupSchedule and creates it. Returns the server's representation of the backupSchedule, and an error, if there is any. +func (c *backupSchedules) Create(backupSchedule *v1alpha1.BackupSchedule) (result *v1alpha1.BackupSchedule, err error) { + result = &v1alpha1.BackupSchedule{} + err = c.client.Post(). + Namespace(c.ns). + Resource("backupschedules"). + Body(backupSchedule). + Do(). + Into(result) + return +} + +// Update takes the representation of a backupSchedule and updates it. Returns the server's representation of the backupSchedule, and an error, if there is any. +func (c *backupSchedules) Update(backupSchedule *v1alpha1.BackupSchedule) (result *v1alpha1.BackupSchedule, err error) { + result = &v1alpha1.BackupSchedule{} + err = c.client.Put(). + Namespace(c.ns). + Resource("backupschedules"). + Name(backupSchedule.Name). + Body(backupSchedule). + Do(). + Into(result) + return +} + +// Delete takes name of the backupSchedule and deletes it. Returns an error if one occurs. +func (c *backupSchedules) Delete(name string, options *v1.DeleteOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("backupschedules"). + Name(name). + Body(options). + Do(). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *backupSchedules) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("backupschedules"). + VersionedParams(&listOptions, scheme.ParameterCodec). + Body(options). + Do(). + Error() +} + +// Patch applies the patch and returns the patched backupSchedule. +func (c *backupSchedules) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.BackupSchedule, err error) { + result = &v1alpha1.BackupSchedule{} + err = c.client.Patch(pt). + Namespace(c.ns). + Resource("backupschedules"). + SubResource(subresources...). + Name(name). + Body(data). + Do(). + Into(result) + return +} diff --git a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/cluster.go b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/cluster.go new file mode 100644 index 000000000..14d21f492 --- /dev/null +++ b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/cluster.go @@ -0,0 +1,153 @@ +// Copyright 2018 Oracle and/or its affiliates. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package v1alpha1 + +import ( + v1alpha1 "github.com/oracle/mysql-operator/pkg/apis/mysql/v1alpha1" + scheme "github.com/oracle/mysql-operator/pkg/generated/clientset/versioned/scheme" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + rest "k8s.io/client-go/rest" +) + +// ClustersGetter has a method to return a ClusterInterface. +// A group's client should implement this interface. +type ClustersGetter interface { + Clusters(namespace string) ClusterInterface +} + +// ClusterInterface has methods to work with Cluster resources. +type ClusterInterface interface { + Create(*v1alpha1.Cluster) (*v1alpha1.Cluster, error) + Update(*v1alpha1.Cluster) (*v1alpha1.Cluster, error) + Delete(name string, options *v1.DeleteOptions) error + DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error + Get(name string, options v1.GetOptions) (*v1alpha1.Cluster, error) + List(opts v1.ListOptions) (*v1alpha1.ClusterList, error) + Watch(opts v1.ListOptions) (watch.Interface, error) + Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.Cluster, err error) + ClusterExpansion +} + +// clusters implements ClusterInterface +type clusters struct { + client rest.Interface + ns string +} + +// newClusters returns a Clusters +func newClusters(c *MysqlV1alpha1Client, namespace string) *clusters { + return &clusters{ + client: c.RESTClient(), + ns: namespace, + } +} + +// Get takes name of the cluster, and returns the corresponding cluster object, and an error if there is any. +func (c *clusters) Get(name string, options v1.GetOptions) (result *v1alpha1.Cluster, err error) { + result = &v1alpha1.Cluster{} + err = c.client.Get(). + Namespace(c.ns). + Resource("clusters"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of Clusters that match those selectors. +func (c *clusters) List(opts v1.ListOptions) (result *v1alpha1.ClusterList, err error) { + result = &v1alpha1.ClusterList{} + err = c.client.Get(). + Namespace(c.ns). + Resource("clusters"). + VersionedParams(&opts, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested clusters. +func (c *clusters) Watch(opts v1.ListOptions) (watch.Interface, error) { + opts.Watch = true + return c.client.Get(). + Namespace(c.ns). + Resource("clusters"). + VersionedParams(&opts, scheme.ParameterCodec). + Watch() +} + +// Create takes the representation of a cluster and creates it. Returns the server's representation of the cluster, and an error, if there is any. +func (c *clusters) Create(cluster *v1alpha1.Cluster) (result *v1alpha1.Cluster, err error) { + result = &v1alpha1.Cluster{} + err = c.client.Post(). + Namespace(c.ns). + Resource("clusters"). + Body(cluster). + Do(). + Into(result) + return +} + +// Update takes the representation of a cluster and updates it. Returns the server's representation of the cluster, and an error, if there is any. +func (c *clusters) Update(cluster *v1alpha1.Cluster) (result *v1alpha1.Cluster, err error) { + result = &v1alpha1.Cluster{} + err = c.client.Put(). + Namespace(c.ns). + Resource("clusters"). + Name(cluster.Name). + Body(cluster). + Do(). + Into(result) + return +} + +// Delete takes name of the cluster and deletes it. Returns an error if one occurs. +func (c *clusters) Delete(name string, options *v1.DeleteOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("clusters"). + Name(name). + Body(options). + Do(). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *clusters) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("clusters"). + VersionedParams(&listOptions, scheme.ParameterCodec). + Body(options). + Do(). + Error() +} + +// Patch applies the patch and returns the patched cluster. +func (c *clusters) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.Cluster, err error) { + result = &v1alpha1.Cluster{} + err = c.client.Patch(pt). + Namespace(c.ns). + Resource("clusters"). + SubResource(subresources...). + Name(name). + Body(data). + Do(). + Into(result) + return +} diff --git a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_backup.go b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_backup.go new file mode 100644 index 000000000..74d63232e --- /dev/null +++ b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_backup.go @@ -0,0 +1,124 @@ +// Copyright 2018 Oracle and/or its affiliates. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fake + +import ( + v1alpha1 "github.com/oracle/mysql-operator/pkg/apis/mysql/v1alpha1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + labels "k8s.io/apimachinery/pkg/labels" + schema "k8s.io/apimachinery/pkg/runtime/schema" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + testing "k8s.io/client-go/testing" +) + +// FakeBackups implements BackupInterface +type FakeBackups struct { + Fake *FakeMysqlV1alpha1 + ns string +} + +var backupsResource = schema.GroupVersionResource{Group: "mysql.oracle.com", Version: "v1alpha1", Resource: "backups"} + +var backupsKind = schema.GroupVersionKind{Group: "mysql.oracle.com", Version: "v1alpha1", Kind: "Backup"} + +// Get takes name of the backup, and returns the corresponding backup object, and an error if there is any. +func (c *FakeBackups) Get(name string, options v1.GetOptions) (result *v1alpha1.Backup, err error) { + obj, err := c.Fake. + Invokes(testing.NewGetAction(backupsResource, c.ns, name), &v1alpha1.Backup{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.Backup), err +} + +// List takes label and field selectors, and returns the list of Backups that match those selectors. +func (c *FakeBackups) List(opts v1.ListOptions) (result *v1alpha1.BackupList, err error) { + obj, err := c.Fake. + Invokes(testing.NewListAction(backupsResource, backupsKind, c.ns, opts), &v1alpha1.BackupList{}) + + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &v1alpha1.BackupList{} + for _, item := range obj.(*v1alpha1.BackupList).Items { + if label.Matches(labels.Set(item.Labels)) { + list.Items = append(list.Items, item) + } + } + return list, err +} + +// Watch returns a watch.Interface that watches the requested backups. +func (c *FakeBackups) Watch(opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewWatchAction(backupsResource, c.ns, opts)) + +} + +// Create takes the representation of a backup and creates it. Returns the server's representation of the backup, and an error, if there is any. +func (c *FakeBackups) Create(backup *v1alpha1.Backup) (result *v1alpha1.Backup, err error) { + obj, err := c.Fake. + Invokes(testing.NewCreateAction(backupsResource, c.ns, backup), &v1alpha1.Backup{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.Backup), err +} + +// Update takes the representation of a backup and updates it. Returns the server's representation of the backup, and an error, if there is any. +func (c *FakeBackups) Update(backup *v1alpha1.Backup) (result *v1alpha1.Backup, err error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateAction(backupsResource, c.ns, backup), &v1alpha1.Backup{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.Backup), err +} + +// Delete takes name of the backup and deletes it. Returns an error if one occurs. +func (c *FakeBackups) Delete(name string, options *v1.DeleteOptions) error { + _, err := c.Fake. + Invokes(testing.NewDeleteAction(backupsResource, c.ns, name), &v1alpha1.Backup{}) + + return err +} + +// DeleteCollection deletes a collection of objects. +func (c *FakeBackups) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + action := testing.NewDeleteCollectionAction(backupsResource, c.ns, listOptions) + + _, err := c.Fake.Invokes(action, &v1alpha1.BackupList{}) + return err +} + +// Patch applies the patch and returns the patched backup. +func (c *FakeBackups) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.Backup, err error) { + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(backupsResource, c.ns, name, data, subresources...), &v1alpha1.Backup{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.Backup), err +} diff --git a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_backupschedule.go b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_backupschedule.go new file mode 100644 index 000000000..544aef865 --- /dev/null +++ b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_backupschedule.go @@ -0,0 +1,124 @@ +// Copyright 2018 Oracle and/or its affiliates. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fake + +import ( + v1alpha1 "github.com/oracle/mysql-operator/pkg/apis/mysql/v1alpha1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + labels "k8s.io/apimachinery/pkg/labels" + schema "k8s.io/apimachinery/pkg/runtime/schema" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + testing "k8s.io/client-go/testing" +) + +// FakeBackupSchedules implements BackupScheduleInterface +type FakeBackupSchedules struct { + Fake *FakeMysqlV1alpha1 + ns string +} + +var backupschedulesResource = schema.GroupVersionResource{Group: "mysql.oracle.com", Version: "v1alpha1", Resource: "backupschedules"} + +var backupschedulesKind = schema.GroupVersionKind{Group: "mysql.oracle.com", Version: "v1alpha1", Kind: "BackupSchedule"} + +// Get takes name of the backupSchedule, and returns the corresponding backupSchedule object, and an error if there is any. +func (c *FakeBackupSchedules) Get(name string, options v1.GetOptions) (result *v1alpha1.BackupSchedule, err error) { + obj, err := c.Fake. + Invokes(testing.NewGetAction(backupschedulesResource, c.ns, name), &v1alpha1.BackupSchedule{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.BackupSchedule), err +} + +// List takes label and field selectors, and returns the list of BackupSchedules that match those selectors. +func (c *FakeBackupSchedules) List(opts v1.ListOptions) (result *v1alpha1.BackupScheduleList, err error) { + obj, err := c.Fake. + Invokes(testing.NewListAction(backupschedulesResource, backupschedulesKind, c.ns, opts), &v1alpha1.BackupScheduleList{}) + + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &v1alpha1.BackupScheduleList{} + for _, item := range obj.(*v1alpha1.BackupScheduleList).Items { + if label.Matches(labels.Set(item.Labels)) { + list.Items = append(list.Items, item) + } + } + return list, err +} + +// Watch returns a watch.Interface that watches the requested backupSchedules. +func (c *FakeBackupSchedules) Watch(opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewWatchAction(backupschedulesResource, c.ns, opts)) + +} + +// Create takes the representation of a backupSchedule and creates it. Returns the server's representation of the backupSchedule, and an error, if there is any. +func (c *FakeBackupSchedules) Create(backupSchedule *v1alpha1.BackupSchedule) (result *v1alpha1.BackupSchedule, err error) { + obj, err := c.Fake. + Invokes(testing.NewCreateAction(backupschedulesResource, c.ns, backupSchedule), &v1alpha1.BackupSchedule{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.BackupSchedule), err +} + +// Update takes the representation of a backupSchedule and updates it. Returns the server's representation of the backupSchedule, and an error, if there is any. +func (c *FakeBackupSchedules) Update(backupSchedule *v1alpha1.BackupSchedule) (result *v1alpha1.BackupSchedule, err error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateAction(backupschedulesResource, c.ns, backupSchedule), &v1alpha1.BackupSchedule{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.BackupSchedule), err +} + +// Delete takes name of the backupSchedule and deletes it. Returns an error if one occurs. +func (c *FakeBackupSchedules) Delete(name string, options *v1.DeleteOptions) error { + _, err := c.Fake. + Invokes(testing.NewDeleteAction(backupschedulesResource, c.ns, name), &v1alpha1.BackupSchedule{}) + + return err +} + +// DeleteCollection deletes a collection of objects. +func (c *FakeBackupSchedules) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + action := testing.NewDeleteCollectionAction(backupschedulesResource, c.ns, listOptions) + + _, err := c.Fake.Invokes(action, &v1alpha1.BackupScheduleList{}) + return err +} + +// Patch applies the patch and returns the patched backupSchedule. +func (c *FakeBackupSchedules) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.BackupSchedule, err error) { + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(backupschedulesResource, c.ns, name, data, subresources...), &v1alpha1.BackupSchedule{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.BackupSchedule), err +} diff --git a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_cluster.go b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_cluster.go new file mode 100644 index 000000000..7e554b349 --- /dev/null +++ b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_cluster.go @@ -0,0 +1,124 @@ +// Copyright 2018 Oracle and/or its affiliates. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fake + +import ( + v1alpha1 "github.com/oracle/mysql-operator/pkg/apis/mysql/v1alpha1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + labels "k8s.io/apimachinery/pkg/labels" + schema "k8s.io/apimachinery/pkg/runtime/schema" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + testing "k8s.io/client-go/testing" +) + +// FakeClusters implements ClusterInterface +type FakeClusters struct { + Fake *FakeMysqlV1alpha1 + ns string +} + +var clustersResource = schema.GroupVersionResource{Group: "mysql.oracle.com", Version: "v1alpha1", Resource: "clusters"} + +var clustersKind = schema.GroupVersionKind{Group: "mysql.oracle.com", Version: "v1alpha1", Kind: "Cluster"} + +// Get takes name of the cluster, and returns the corresponding cluster object, and an error if there is any. +func (c *FakeClusters) Get(name string, options v1.GetOptions) (result *v1alpha1.Cluster, err error) { + obj, err := c.Fake. + Invokes(testing.NewGetAction(clustersResource, c.ns, name), &v1alpha1.Cluster{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.Cluster), err +} + +// List takes label and field selectors, and returns the list of Clusters that match those selectors. +func (c *FakeClusters) List(opts v1.ListOptions) (result *v1alpha1.ClusterList, err error) { + obj, err := c.Fake. + Invokes(testing.NewListAction(clustersResource, clustersKind, c.ns, opts), &v1alpha1.ClusterList{}) + + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &v1alpha1.ClusterList{} + for _, item := range obj.(*v1alpha1.ClusterList).Items { + if label.Matches(labels.Set(item.Labels)) { + list.Items = append(list.Items, item) + } + } + return list, err +} + +// Watch returns a watch.Interface that watches the requested clusters. +func (c *FakeClusters) Watch(opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewWatchAction(clustersResource, c.ns, opts)) + +} + +// Create takes the representation of a cluster and creates it. Returns the server's representation of the cluster, and an error, if there is any. +func (c *FakeClusters) Create(cluster *v1alpha1.Cluster) (result *v1alpha1.Cluster, err error) { + obj, err := c.Fake. + Invokes(testing.NewCreateAction(clustersResource, c.ns, cluster), &v1alpha1.Cluster{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.Cluster), err +} + +// Update takes the representation of a cluster and updates it. Returns the server's representation of the cluster, and an error, if there is any. +func (c *FakeClusters) Update(cluster *v1alpha1.Cluster) (result *v1alpha1.Cluster, err error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateAction(clustersResource, c.ns, cluster), &v1alpha1.Cluster{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.Cluster), err +} + +// Delete takes name of the cluster and deletes it. Returns an error if one occurs. +func (c *FakeClusters) Delete(name string, options *v1.DeleteOptions) error { + _, err := c.Fake. + Invokes(testing.NewDeleteAction(clustersResource, c.ns, name), &v1alpha1.Cluster{}) + + return err +} + +// DeleteCollection deletes a collection of objects. +func (c *FakeClusters) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + action := testing.NewDeleteCollectionAction(clustersResource, c.ns, listOptions) + + _, err := c.Fake.Invokes(action, &v1alpha1.ClusterList{}) + return err +} + +// Patch applies the patch and returns the patched cluster. +func (c *FakeClusters) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.Cluster, err error) { + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(clustersResource, c.ns, name, data, subresources...), &v1alpha1.Cluster{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.Cluster), err +} diff --git a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_mysql_client.go b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_mysql_client.go index 5c9cdbd0d..eae6d0758 100644 --- a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_mysql_client.go +++ b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_mysql_client.go @@ -24,20 +24,20 @@ type FakeMysqlV1alpha1 struct { *testing.Fake } -func (c *FakeMysqlV1alpha1) MySQLBackups(namespace string) v1alpha1.MySQLBackupInterface { - return &FakeMySQLBackups{c, namespace} +func (c *FakeMysqlV1alpha1) Backups(namespace string) v1alpha1.BackupInterface { + return &FakeBackups{c, namespace} } -func (c *FakeMysqlV1alpha1) MySQLBackupSchedules(namespace string) v1alpha1.MySQLBackupScheduleInterface { - return &FakeMySQLBackupSchedules{c, namespace} +func (c *FakeMysqlV1alpha1) BackupSchedules(namespace string) v1alpha1.BackupScheduleInterface { + return &FakeBackupSchedules{c, namespace} } -func (c *FakeMysqlV1alpha1) MySQLClusters(namespace string) v1alpha1.MySQLClusterInterface { - return &FakeMySQLClusters{c, namespace} +func (c *FakeMysqlV1alpha1) Clusters(namespace string) v1alpha1.ClusterInterface { + return &FakeClusters{c, namespace} } -func (c *FakeMysqlV1alpha1) MySQLRestores(namespace string) v1alpha1.MySQLRestoreInterface { - return &FakeMySQLRestores{c, namespace} +func (c *FakeMysqlV1alpha1) Restores(namespace string) v1alpha1.RestoreInterface { + return &FakeRestores{c, namespace} } // RESTClient returns a RESTClient that is used to communicate diff --git a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_mysqlbackup.go b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_mysqlbackup.go deleted file mode 100644 index 781868bbb..000000000 --- a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_mysqlbackup.go +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright 2018 Oracle and/or its affiliates. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package fake - -import ( - v1alpha1 "github.com/oracle/mysql-operator/pkg/apis/mysql/v1alpha1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - labels "k8s.io/apimachinery/pkg/labels" - schema "k8s.io/apimachinery/pkg/runtime/schema" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - testing "k8s.io/client-go/testing" -) - -// FakeMySQLBackups implements MySQLBackupInterface -type FakeMySQLBackups struct { - Fake *FakeMysqlV1alpha1 - ns string -} - -var mysqlbackupsResource = schema.GroupVersionResource{Group: "mysql.oracle.com", Version: "v1alpha1", Resource: "mysqlbackups"} - -var mysqlbackupsKind = schema.GroupVersionKind{Group: "mysql.oracle.com", Version: "v1alpha1", Kind: "MySQLBackup"} - -// Get takes name of the mySQLBackup, and returns the corresponding mySQLBackup object, and an error if there is any. -func (c *FakeMySQLBackups) Get(name string, options v1.GetOptions) (result *v1alpha1.MySQLBackup, err error) { - obj, err := c.Fake. - Invokes(testing.NewGetAction(mysqlbackupsResource, c.ns, name), &v1alpha1.MySQLBackup{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha1.MySQLBackup), err -} - -// List takes label and field selectors, and returns the list of MySQLBackups that match those selectors. -func (c *FakeMySQLBackups) List(opts v1.ListOptions) (result *v1alpha1.MySQLBackupList, err error) { - obj, err := c.Fake. - Invokes(testing.NewListAction(mysqlbackupsResource, mysqlbackupsKind, c.ns, opts), &v1alpha1.MySQLBackupList{}) - - if obj == nil { - return nil, err - } - - label, _, _ := testing.ExtractFromListOptions(opts) - if label == nil { - label = labels.Everything() - } - list := &v1alpha1.MySQLBackupList{} - for _, item := range obj.(*v1alpha1.MySQLBackupList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested mySQLBackups. -func (c *FakeMySQLBackups) Watch(opts v1.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(testing.NewWatchAction(mysqlbackupsResource, c.ns, opts)) - -} - -// Create takes the representation of a mySQLBackup and creates it. Returns the server's representation of the mySQLBackup, and an error, if there is any. -func (c *FakeMySQLBackups) Create(mySQLBackup *v1alpha1.MySQLBackup) (result *v1alpha1.MySQLBackup, err error) { - obj, err := c.Fake. - Invokes(testing.NewCreateAction(mysqlbackupsResource, c.ns, mySQLBackup), &v1alpha1.MySQLBackup{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha1.MySQLBackup), err -} - -// Update takes the representation of a mySQLBackup and updates it. Returns the server's representation of the mySQLBackup, and an error, if there is any. -func (c *FakeMySQLBackups) Update(mySQLBackup *v1alpha1.MySQLBackup) (result *v1alpha1.MySQLBackup, err error) { - obj, err := c.Fake. - Invokes(testing.NewUpdateAction(mysqlbackupsResource, c.ns, mySQLBackup), &v1alpha1.MySQLBackup{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha1.MySQLBackup), err -} - -// Delete takes name of the mySQLBackup and deletes it. Returns an error if one occurs. -func (c *FakeMySQLBackups) Delete(name string, options *v1.DeleteOptions) error { - _, err := c.Fake. - Invokes(testing.NewDeleteAction(mysqlbackupsResource, c.ns, name), &v1alpha1.MySQLBackup{}) - - return err -} - -// DeleteCollection deletes a collection of objects. -func (c *FakeMySQLBackups) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { - action := testing.NewDeleteCollectionAction(mysqlbackupsResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &v1alpha1.MySQLBackupList{}) - return err -} - -// Patch applies the patch and returns the patched mySQLBackup. -func (c *FakeMySQLBackups) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.MySQLBackup, err error) { - obj, err := c.Fake. - Invokes(testing.NewPatchSubresourceAction(mysqlbackupsResource, c.ns, name, data, subresources...), &v1alpha1.MySQLBackup{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha1.MySQLBackup), err -} diff --git a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_mysqlbackupschedule.go b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_mysqlbackupschedule.go deleted file mode 100644 index 30e7a3a1c..000000000 --- a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_mysqlbackupschedule.go +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright 2018 Oracle and/or its affiliates. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package fake - -import ( - v1alpha1 "github.com/oracle/mysql-operator/pkg/apis/mysql/v1alpha1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - labels "k8s.io/apimachinery/pkg/labels" - schema "k8s.io/apimachinery/pkg/runtime/schema" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - testing "k8s.io/client-go/testing" -) - -// FakeMySQLBackupSchedules implements MySQLBackupScheduleInterface -type FakeMySQLBackupSchedules struct { - Fake *FakeMysqlV1alpha1 - ns string -} - -var mysqlbackupschedulesResource = schema.GroupVersionResource{Group: "mysql.oracle.com", Version: "v1alpha1", Resource: "mysqlbackupschedules"} - -var mysqlbackupschedulesKind = schema.GroupVersionKind{Group: "mysql.oracle.com", Version: "v1alpha1", Kind: "MySQLBackupSchedule"} - -// Get takes name of the mySQLBackupSchedule, and returns the corresponding mySQLBackupSchedule object, and an error if there is any. -func (c *FakeMySQLBackupSchedules) Get(name string, options v1.GetOptions) (result *v1alpha1.MySQLBackupSchedule, err error) { - obj, err := c.Fake. - Invokes(testing.NewGetAction(mysqlbackupschedulesResource, c.ns, name), &v1alpha1.MySQLBackupSchedule{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha1.MySQLBackupSchedule), err -} - -// List takes label and field selectors, and returns the list of MySQLBackupSchedules that match those selectors. -func (c *FakeMySQLBackupSchedules) List(opts v1.ListOptions) (result *v1alpha1.MySQLBackupScheduleList, err error) { - obj, err := c.Fake. - Invokes(testing.NewListAction(mysqlbackupschedulesResource, mysqlbackupschedulesKind, c.ns, opts), &v1alpha1.MySQLBackupScheduleList{}) - - if obj == nil { - return nil, err - } - - label, _, _ := testing.ExtractFromListOptions(opts) - if label == nil { - label = labels.Everything() - } - list := &v1alpha1.MySQLBackupScheduleList{} - for _, item := range obj.(*v1alpha1.MySQLBackupScheduleList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested mySQLBackupSchedules. -func (c *FakeMySQLBackupSchedules) Watch(opts v1.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(testing.NewWatchAction(mysqlbackupschedulesResource, c.ns, opts)) - -} - -// Create takes the representation of a mySQLBackupSchedule and creates it. Returns the server's representation of the mySQLBackupSchedule, and an error, if there is any. -func (c *FakeMySQLBackupSchedules) Create(mySQLBackupSchedule *v1alpha1.MySQLBackupSchedule) (result *v1alpha1.MySQLBackupSchedule, err error) { - obj, err := c.Fake. - Invokes(testing.NewCreateAction(mysqlbackupschedulesResource, c.ns, mySQLBackupSchedule), &v1alpha1.MySQLBackupSchedule{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha1.MySQLBackupSchedule), err -} - -// Update takes the representation of a mySQLBackupSchedule and updates it. Returns the server's representation of the mySQLBackupSchedule, and an error, if there is any. -func (c *FakeMySQLBackupSchedules) Update(mySQLBackupSchedule *v1alpha1.MySQLBackupSchedule) (result *v1alpha1.MySQLBackupSchedule, err error) { - obj, err := c.Fake. - Invokes(testing.NewUpdateAction(mysqlbackupschedulesResource, c.ns, mySQLBackupSchedule), &v1alpha1.MySQLBackupSchedule{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha1.MySQLBackupSchedule), err -} - -// Delete takes name of the mySQLBackupSchedule and deletes it. Returns an error if one occurs. -func (c *FakeMySQLBackupSchedules) Delete(name string, options *v1.DeleteOptions) error { - _, err := c.Fake. - Invokes(testing.NewDeleteAction(mysqlbackupschedulesResource, c.ns, name), &v1alpha1.MySQLBackupSchedule{}) - - return err -} - -// DeleteCollection deletes a collection of objects. -func (c *FakeMySQLBackupSchedules) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { - action := testing.NewDeleteCollectionAction(mysqlbackupschedulesResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &v1alpha1.MySQLBackupScheduleList{}) - return err -} - -// Patch applies the patch and returns the patched mySQLBackupSchedule. -func (c *FakeMySQLBackupSchedules) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.MySQLBackupSchedule, err error) { - obj, err := c.Fake. - Invokes(testing.NewPatchSubresourceAction(mysqlbackupschedulesResource, c.ns, name, data, subresources...), &v1alpha1.MySQLBackupSchedule{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha1.MySQLBackupSchedule), err -} diff --git a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_mysqlcluster.go b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_mysqlcluster.go deleted file mode 100644 index fa89ec319..000000000 --- a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_mysqlcluster.go +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright 2018 Oracle and/or its affiliates. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package fake - -import ( - v1alpha1 "github.com/oracle/mysql-operator/pkg/apis/mysql/v1alpha1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - labels "k8s.io/apimachinery/pkg/labels" - schema "k8s.io/apimachinery/pkg/runtime/schema" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - testing "k8s.io/client-go/testing" -) - -// FakeMySQLClusters implements MySQLClusterInterface -type FakeMySQLClusters struct { - Fake *FakeMysqlV1alpha1 - ns string -} - -var mysqlclustersResource = schema.GroupVersionResource{Group: "mysql.oracle.com", Version: "v1alpha1", Resource: "mysqlclusters"} - -var mysqlclustersKind = schema.GroupVersionKind{Group: "mysql.oracle.com", Version: "v1alpha1", Kind: "MySQLCluster"} - -// Get takes name of the mySQLCluster, and returns the corresponding mySQLCluster object, and an error if there is any. -func (c *FakeMySQLClusters) Get(name string, options v1.GetOptions) (result *v1alpha1.MySQLCluster, err error) { - obj, err := c.Fake. - Invokes(testing.NewGetAction(mysqlclustersResource, c.ns, name), &v1alpha1.MySQLCluster{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha1.MySQLCluster), err -} - -// List takes label and field selectors, and returns the list of MySQLClusters that match those selectors. -func (c *FakeMySQLClusters) List(opts v1.ListOptions) (result *v1alpha1.MySQLClusterList, err error) { - obj, err := c.Fake. - Invokes(testing.NewListAction(mysqlclustersResource, mysqlclustersKind, c.ns, opts), &v1alpha1.MySQLClusterList{}) - - if obj == nil { - return nil, err - } - - label, _, _ := testing.ExtractFromListOptions(opts) - if label == nil { - label = labels.Everything() - } - list := &v1alpha1.MySQLClusterList{} - for _, item := range obj.(*v1alpha1.MySQLClusterList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested mySQLClusters. -func (c *FakeMySQLClusters) Watch(opts v1.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(testing.NewWatchAction(mysqlclustersResource, c.ns, opts)) - -} - -// Create takes the representation of a mySQLCluster and creates it. Returns the server's representation of the mySQLCluster, and an error, if there is any. -func (c *FakeMySQLClusters) Create(mySQLCluster *v1alpha1.MySQLCluster) (result *v1alpha1.MySQLCluster, err error) { - obj, err := c.Fake. - Invokes(testing.NewCreateAction(mysqlclustersResource, c.ns, mySQLCluster), &v1alpha1.MySQLCluster{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha1.MySQLCluster), err -} - -// Update takes the representation of a mySQLCluster and updates it. Returns the server's representation of the mySQLCluster, and an error, if there is any. -func (c *FakeMySQLClusters) Update(mySQLCluster *v1alpha1.MySQLCluster) (result *v1alpha1.MySQLCluster, err error) { - obj, err := c.Fake. - Invokes(testing.NewUpdateAction(mysqlclustersResource, c.ns, mySQLCluster), &v1alpha1.MySQLCluster{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha1.MySQLCluster), err -} - -// Delete takes name of the mySQLCluster and deletes it. Returns an error if one occurs. -func (c *FakeMySQLClusters) Delete(name string, options *v1.DeleteOptions) error { - _, err := c.Fake. - Invokes(testing.NewDeleteAction(mysqlclustersResource, c.ns, name), &v1alpha1.MySQLCluster{}) - - return err -} - -// DeleteCollection deletes a collection of objects. -func (c *FakeMySQLClusters) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { - action := testing.NewDeleteCollectionAction(mysqlclustersResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &v1alpha1.MySQLClusterList{}) - return err -} - -// Patch applies the patch and returns the patched mySQLCluster. -func (c *FakeMySQLClusters) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.MySQLCluster, err error) { - obj, err := c.Fake. - Invokes(testing.NewPatchSubresourceAction(mysqlclustersResource, c.ns, name, data, subresources...), &v1alpha1.MySQLCluster{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha1.MySQLCluster), err -} diff --git a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_mysqlrestore.go b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_mysqlrestore.go deleted file mode 100644 index 33a438201..000000000 --- a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_mysqlrestore.go +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright 2018 Oracle and/or its affiliates. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package fake - -import ( - v1alpha1 "github.com/oracle/mysql-operator/pkg/apis/mysql/v1alpha1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - labels "k8s.io/apimachinery/pkg/labels" - schema "k8s.io/apimachinery/pkg/runtime/schema" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - testing "k8s.io/client-go/testing" -) - -// FakeMySQLRestores implements MySQLRestoreInterface -type FakeMySQLRestores struct { - Fake *FakeMysqlV1alpha1 - ns string -} - -var mysqlrestoresResource = schema.GroupVersionResource{Group: "mysql.oracle.com", Version: "v1alpha1", Resource: "mysqlrestores"} - -var mysqlrestoresKind = schema.GroupVersionKind{Group: "mysql.oracle.com", Version: "v1alpha1", Kind: "MySQLRestore"} - -// Get takes name of the mySQLRestore, and returns the corresponding mySQLRestore object, and an error if there is any. -func (c *FakeMySQLRestores) Get(name string, options v1.GetOptions) (result *v1alpha1.MySQLRestore, err error) { - obj, err := c.Fake. - Invokes(testing.NewGetAction(mysqlrestoresResource, c.ns, name), &v1alpha1.MySQLRestore{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha1.MySQLRestore), err -} - -// List takes label and field selectors, and returns the list of MySQLRestores that match those selectors. -func (c *FakeMySQLRestores) List(opts v1.ListOptions) (result *v1alpha1.MySQLRestoreList, err error) { - obj, err := c.Fake. - Invokes(testing.NewListAction(mysqlrestoresResource, mysqlrestoresKind, c.ns, opts), &v1alpha1.MySQLRestoreList{}) - - if obj == nil { - return nil, err - } - - label, _, _ := testing.ExtractFromListOptions(opts) - if label == nil { - label = labels.Everything() - } - list := &v1alpha1.MySQLRestoreList{} - for _, item := range obj.(*v1alpha1.MySQLRestoreList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested mySQLRestores. -func (c *FakeMySQLRestores) Watch(opts v1.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(testing.NewWatchAction(mysqlrestoresResource, c.ns, opts)) - -} - -// Create takes the representation of a mySQLRestore and creates it. Returns the server's representation of the mySQLRestore, and an error, if there is any. -func (c *FakeMySQLRestores) Create(mySQLRestore *v1alpha1.MySQLRestore) (result *v1alpha1.MySQLRestore, err error) { - obj, err := c.Fake. - Invokes(testing.NewCreateAction(mysqlrestoresResource, c.ns, mySQLRestore), &v1alpha1.MySQLRestore{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha1.MySQLRestore), err -} - -// Update takes the representation of a mySQLRestore and updates it. Returns the server's representation of the mySQLRestore, and an error, if there is any. -func (c *FakeMySQLRestores) Update(mySQLRestore *v1alpha1.MySQLRestore) (result *v1alpha1.MySQLRestore, err error) { - obj, err := c.Fake. - Invokes(testing.NewUpdateAction(mysqlrestoresResource, c.ns, mySQLRestore), &v1alpha1.MySQLRestore{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha1.MySQLRestore), err -} - -// Delete takes name of the mySQLRestore and deletes it. Returns an error if one occurs. -func (c *FakeMySQLRestores) Delete(name string, options *v1.DeleteOptions) error { - _, err := c.Fake. - Invokes(testing.NewDeleteAction(mysqlrestoresResource, c.ns, name), &v1alpha1.MySQLRestore{}) - - return err -} - -// DeleteCollection deletes a collection of objects. -func (c *FakeMySQLRestores) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { - action := testing.NewDeleteCollectionAction(mysqlrestoresResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &v1alpha1.MySQLRestoreList{}) - return err -} - -// Patch applies the patch and returns the patched mySQLRestore. -func (c *FakeMySQLRestores) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.MySQLRestore, err error) { - obj, err := c.Fake. - Invokes(testing.NewPatchSubresourceAction(mysqlrestoresResource, c.ns, name, data, subresources...), &v1alpha1.MySQLRestore{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha1.MySQLRestore), err -} diff --git a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_restore.go b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_restore.go new file mode 100644 index 000000000..5f743ca25 --- /dev/null +++ b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/fake/fake_restore.go @@ -0,0 +1,124 @@ +// Copyright 2018 Oracle and/or its affiliates. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fake + +import ( + v1alpha1 "github.com/oracle/mysql-operator/pkg/apis/mysql/v1alpha1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + labels "k8s.io/apimachinery/pkg/labels" + schema "k8s.io/apimachinery/pkg/runtime/schema" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + testing "k8s.io/client-go/testing" +) + +// FakeRestores implements RestoreInterface +type FakeRestores struct { + Fake *FakeMysqlV1alpha1 + ns string +} + +var restoresResource = schema.GroupVersionResource{Group: "mysql.oracle.com", Version: "v1alpha1", Resource: "restores"} + +var restoresKind = schema.GroupVersionKind{Group: "mysql.oracle.com", Version: "v1alpha1", Kind: "Restore"} + +// Get takes name of the restore, and returns the corresponding restore object, and an error if there is any. +func (c *FakeRestores) Get(name string, options v1.GetOptions) (result *v1alpha1.Restore, err error) { + obj, err := c.Fake. + Invokes(testing.NewGetAction(restoresResource, c.ns, name), &v1alpha1.Restore{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.Restore), err +} + +// List takes label and field selectors, and returns the list of Restores that match those selectors. +func (c *FakeRestores) List(opts v1.ListOptions) (result *v1alpha1.RestoreList, err error) { + obj, err := c.Fake. + Invokes(testing.NewListAction(restoresResource, restoresKind, c.ns, opts), &v1alpha1.RestoreList{}) + + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &v1alpha1.RestoreList{} + for _, item := range obj.(*v1alpha1.RestoreList).Items { + if label.Matches(labels.Set(item.Labels)) { + list.Items = append(list.Items, item) + } + } + return list, err +} + +// Watch returns a watch.Interface that watches the requested restores. +func (c *FakeRestores) Watch(opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewWatchAction(restoresResource, c.ns, opts)) + +} + +// Create takes the representation of a restore and creates it. Returns the server's representation of the restore, and an error, if there is any. +func (c *FakeRestores) Create(restore *v1alpha1.Restore) (result *v1alpha1.Restore, err error) { + obj, err := c.Fake. + Invokes(testing.NewCreateAction(restoresResource, c.ns, restore), &v1alpha1.Restore{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.Restore), err +} + +// Update takes the representation of a restore and updates it. Returns the server's representation of the restore, and an error, if there is any. +func (c *FakeRestores) Update(restore *v1alpha1.Restore) (result *v1alpha1.Restore, err error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateAction(restoresResource, c.ns, restore), &v1alpha1.Restore{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.Restore), err +} + +// Delete takes name of the restore and deletes it. Returns an error if one occurs. +func (c *FakeRestores) Delete(name string, options *v1.DeleteOptions) error { + _, err := c.Fake. + Invokes(testing.NewDeleteAction(restoresResource, c.ns, name), &v1alpha1.Restore{}) + + return err +} + +// DeleteCollection deletes a collection of objects. +func (c *FakeRestores) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + action := testing.NewDeleteCollectionAction(restoresResource, c.ns, listOptions) + + _, err := c.Fake.Invokes(action, &v1alpha1.RestoreList{}) + return err +} + +// Patch applies the patch and returns the patched restore. +func (c *FakeRestores) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.Restore, err error) { + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(restoresResource, c.ns, name, data, subresources...), &v1alpha1.Restore{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.Restore), err +} diff --git a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/generated_expansion.go b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/generated_expansion.go index be57ccf23..874c05976 100644 --- a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/generated_expansion.go +++ b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/generated_expansion.go @@ -14,10 +14,10 @@ package v1alpha1 -type MySQLBackupExpansion interface{} +type BackupExpansion interface{} -type MySQLBackupScheduleExpansion interface{} +type BackupScheduleExpansion interface{} -type MySQLClusterExpansion interface{} +type ClusterExpansion interface{} -type MySQLRestoreExpansion interface{} +type RestoreExpansion interface{} diff --git a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/mysql_client.go b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/mysql_client.go index 0c61b24a3..c5445be50 100644 --- a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/mysql_client.go +++ b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/mysql_client.go @@ -23,10 +23,10 @@ import ( type MysqlV1alpha1Interface interface { RESTClient() rest.Interface - MySQLBackupsGetter - MySQLBackupSchedulesGetter - MySQLClustersGetter - MySQLRestoresGetter + BackupsGetter + BackupSchedulesGetter + ClustersGetter + RestoresGetter } // MysqlV1alpha1Client is used to interact with features provided by the mysql.oracle.com group. @@ -34,20 +34,20 @@ type MysqlV1alpha1Client struct { restClient rest.Interface } -func (c *MysqlV1alpha1Client) MySQLBackups(namespace string) MySQLBackupInterface { - return newMySQLBackups(c, namespace) +func (c *MysqlV1alpha1Client) Backups(namespace string) BackupInterface { + return newBackups(c, namespace) } -func (c *MysqlV1alpha1Client) MySQLBackupSchedules(namespace string) MySQLBackupScheduleInterface { - return newMySQLBackupSchedules(c, namespace) +func (c *MysqlV1alpha1Client) BackupSchedules(namespace string) BackupScheduleInterface { + return newBackupSchedules(c, namespace) } -func (c *MysqlV1alpha1Client) MySQLClusters(namespace string) MySQLClusterInterface { - return newMySQLClusters(c, namespace) +func (c *MysqlV1alpha1Client) Clusters(namespace string) ClusterInterface { + return newClusters(c, namespace) } -func (c *MysqlV1alpha1Client) MySQLRestores(namespace string) MySQLRestoreInterface { - return newMySQLRestores(c, namespace) +func (c *MysqlV1alpha1Client) Restores(namespace string) RestoreInterface { + return newRestores(c, namespace) } // NewForConfig creates a new MysqlV1alpha1Client for the given config. diff --git a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/mysqlbackup.go b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/mysqlbackup.go deleted file mode 100644 index 1b1171e71..000000000 --- a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/mysqlbackup.go +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright 2018 Oracle and/or its affiliates. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package v1alpha1 - -import ( - v1alpha1 "github.com/oracle/mysql-operator/pkg/apis/mysql/v1alpha1" - scheme "github.com/oracle/mysql-operator/pkg/generated/clientset/versioned/scheme" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - rest "k8s.io/client-go/rest" -) - -// MySQLBackupsGetter has a method to return a MySQLBackupInterface. -// A group's client should implement this interface. -type MySQLBackupsGetter interface { - MySQLBackups(namespace string) MySQLBackupInterface -} - -// MySQLBackupInterface has methods to work with MySQLBackup resources. -type MySQLBackupInterface interface { - Create(*v1alpha1.MySQLBackup) (*v1alpha1.MySQLBackup, error) - Update(*v1alpha1.MySQLBackup) (*v1alpha1.MySQLBackup, error) - Delete(name string, options *v1.DeleteOptions) error - DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error - Get(name string, options v1.GetOptions) (*v1alpha1.MySQLBackup, error) - List(opts v1.ListOptions) (*v1alpha1.MySQLBackupList, error) - Watch(opts v1.ListOptions) (watch.Interface, error) - Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.MySQLBackup, err error) - MySQLBackupExpansion -} - -// mySQLBackups implements MySQLBackupInterface -type mySQLBackups struct { - client rest.Interface - ns string -} - -// newMySQLBackups returns a MySQLBackups -func newMySQLBackups(c *MysqlV1alpha1Client, namespace string) *mySQLBackups { - return &mySQLBackups{ - client: c.RESTClient(), - ns: namespace, - } -} - -// Get takes name of the mySQLBackup, and returns the corresponding mySQLBackup object, and an error if there is any. -func (c *mySQLBackups) Get(name string, options v1.GetOptions) (result *v1alpha1.MySQLBackup, err error) { - result = &v1alpha1.MySQLBackup{} - err = c.client.Get(). - Namespace(c.ns). - Resource("mysqlbackups"). - Name(name). - VersionedParams(&options, scheme.ParameterCodec). - Do(). - Into(result) - return -} - -// List takes label and field selectors, and returns the list of MySQLBackups that match those selectors. -func (c *mySQLBackups) List(opts v1.ListOptions) (result *v1alpha1.MySQLBackupList, err error) { - result = &v1alpha1.MySQLBackupList{} - err = c.client.Get(). - Namespace(c.ns). - Resource("mysqlbackups"). - VersionedParams(&opts, scheme.ParameterCodec). - Do(). - Into(result) - return -} - -// Watch returns a watch.Interface that watches the requested mySQLBackups. -func (c *mySQLBackups) Watch(opts v1.ListOptions) (watch.Interface, error) { - opts.Watch = true - return c.client.Get(). - Namespace(c.ns). - Resource("mysqlbackups"). - VersionedParams(&opts, scheme.ParameterCodec). - Watch() -} - -// Create takes the representation of a mySQLBackup and creates it. Returns the server's representation of the mySQLBackup, and an error, if there is any. -func (c *mySQLBackups) Create(mySQLBackup *v1alpha1.MySQLBackup) (result *v1alpha1.MySQLBackup, err error) { - result = &v1alpha1.MySQLBackup{} - err = c.client.Post(). - Namespace(c.ns). - Resource("mysqlbackups"). - Body(mySQLBackup). - Do(). - Into(result) - return -} - -// Update takes the representation of a mySQLBackup and updates it. Returns the server's representation of the mySQLBackup, and an error, if there is any. -func (c *mySQLBackups) Update(mySQLBackup *v1alpha1.MySQLBackup) (result *v1alpha1.MySQLBackup, err error) { - result = &v1alpha1.MySQLBackup{} - err = c.client.Put(). - Namespace(c.ns). - Resource("mysqlbackups"). - Name(mySQLBackup.Name). - Body(mySQLBackup). - Do(). - Into(result) - return -} - -// Delete takes name of the mySQLBackup and deletes it. Returns an error if one occurs. -func (c *mySQLBackups) Delete(name string, options *v1.DeleteOptions) error { - return c.client.Delete(). - Namespace(c.ns). - Resource("mysqlbackups"). - Name(name). - Body(options). - Do(). - Error() -} - -// DeleteCollection deletes a collection of objects. -func (c *mySQLBackups) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { - return c.client.Delete(). - Namespace(c.ns). - Resource("mysqlbackups"). - VersionedParams(&listOptions, scheme.ParameterCodec). - Body(options). - Do(). - Error() -} - -// Patch applies the patch and returns the patched mySQLBackup. -func (c *mySQLBackups) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.MySQLBackup, err error) { - result = &v1alpha1.MySQLBackup{} - err = c.client.Patch(pt). - Namespace(c.ns). - Resource("mysqlbackups"). - SubResource(subresources...). - Name(name). - Body(data). - Do(). - Into(result) - return -} diff --git a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/mysqlbackupschedule.go b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/mysqlbackupschedule.go deleted file mode 100644 index 0427586de..000000000 --- a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/mysqlbackupschedule.go +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright 2018 Oracle and/or its affiliates. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package v1alpha1 - -import ( - v1alpha1 "github.com/oracle/mysql-operator/pkg/apis/mysql/v1alpha1" - scheme "github.com/oracle/mysql-operator/pkg/generated/clientset/versioned/scheme" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - rest "k8s.io/client-go/rest" -) - -// MySQLBackupSchedulesGetter has a method to return a MySQLBackupScheduleInterface. -// A group's client should implement this interface. -type MySQLBackupSchedulesGetter interface { - MySQLBackupSchedules(namespace string) MySQLBackupScheduleInterface -} - -// MySQLBackupScheduleInterface has methods to work with MySQLBackupSchedule resources. -type MySQLBackupScheduleInterface interface { - Create(*v1alpha1.MySQLBackupSchedule) (*v1alpha1.MySQLBackupSchedule, error) - Update(*v1alpha1.MySQLBackupSchedule) (*v1alpha1.MySQLBackupSchedule, error) - Delete(name string, options *v1.DeleteOptions) error - DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error - Get(name string, options v1.GetOptions) (*v1alpha1.MySQLBackupSchedule, error) - List(opts v1.ListOptions) (*v1alpha1.MySQLBackupScheduleList, error) - Watch(opts v1.ListOptions) (watch.Interface, error) - Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.MySQLBackupSchedule, err error) - MySQLBackupScheduleExpansion -} - -// mySQLBackupSchedules implements MySQLBackupScheduleInterface -type mySQLBackupSchedules struct { - client rest.Interface - ns string -} - -// newMySQLBackupSchedules returns a MySQLBackupSchedules -func newMySQLBackupSchedules(c *MysqlV1alpha1Client, namespace string) *mySQLBackupSchedules { - return &mySQLBackupSchedules{ - client: c.RESTClient(), - ns: namespace, - } -} - -// Get takes name of the mySQLBackupSchedule, and returns the corresponding mySQLBackupSchedule object, and an error if there is any. -func (c *mySQLBackupSchedules) Get(name string, options v1.GetOptions) (result *v1alpha1.MySQLBackupSchedule, err error) { - result = &v1alpha1.MySQLBackupSchedule{} - err = c.client.Get(). - Namespace(c.ns). - Resource("mysqlbackupschedules"). - Name(name). - VersionedParams(&options, scheme.ParameterCodec). - Do(). - Into(result) - return -} - -// List takes label and field selectors, and returns the list of MySQLBackupSchedules that match those selectors. -func (c *mySQLBackupSchedules) List(opts v1.ListOptions) (result *v1alpha1.MySQLBackupScheduleList, err error) { - result = &v1alpha1.MySQLBackupScheduleList{} - err = c.client.Get(). - Namespace(c.ns). - Resource("mysqlbackupschedules"). - VersionedParams(&opts, scheme.ParameterCodec). - Do(). - Into(result) - return -} - -// Watch returns a watch.Interface that watches the requested mySQLBackupSchedules. -func (c *mySQLBackupSchedules) Watch(opts v1.ListOptions) (watch.Interface, error) { - opts.Watch = true - return c.client.Get(). - Namespace(c.ns). - Resource("mysqlbackupschedules"). - VersionedParams(&opts, scheme.ParameterCodec). - Watch() -} - -// Create takes the representation of a mySQLBackupSchedule and creates it. Returns the server's representation of the mySQLBackupSchedule, and an error, if there is any. -func (c *mySQLBackupSchedules) Create(mySQLBackupSchedule *v1alpha1.MySQLBackupSchedule) (result *v1alpha1.MySQLBackupSchedule, err error) { - result = &v1alpha1.MySQLBackupSchedule{} - err = c.client.Post(). - Namespace(c.ns). - Resource("mysqlbackupschedules"). - Body(mySQLBackupSchedule). - Do(). - Into(result) - return -} - -// Update takes the representation of a mySQLBackupSchedule and updates it. Returns the server's representation of the mySQLBackupSchedule, and an error, if there is any. -func (c *mySQLBackupSchedules) Update(mySQLBackupSchedule *v1alpha1.MySQLBackupSchedule) (result *v1alpha1.MySQLBackupSchedule, err error) { - result = &v1alpha1.MySQLBackupSchedule{} - err = c.client.Put(). - Namespace(c.ns). - Resource("mysqlbackupschedules"). - Name(mySQLBackupSchedule.Name). - Body(mySQLBackupSchedule). - Do(). - Into(result) - return -} - -// Delete takes name of the mySQLBackupSchedule and deletes it. Returns an error if one occurs. -func (c *mySQLBackupSchedules) Delete(name string, options *v1.DeleteOptions) error { - return c.client.Delete(). - Namespace(c.ns). - Resource("mysqlbackupschedules"). - Name(name). - Body(options). - Do(). - Error() -} - -// DeleteCollection deletes a collection of objects. -func (c *mySQLBackupSchedules) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { - return c.client.Delete(). - Namespace(c.ns). - Resource("mysqlbackupschedules"). - VersionedParams(&listOptions, scheme.ParameterCodec). - Body(options). - Do(). - Error() -} - -// Patch applies the patch and returns the patched mySQLBackupSchedule. -func (c *mySQLBackupSchedules) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.MySQLBackupSchedule, err error) { - result = &v1alpha1.MySQLBackupSchedule{} - err = c.client.Patch(pt). - Namespace(c.ns). - Resource("mysqlbackupschedules"). - SubResource(subresources...). - Name(name). - Body(data). - Do(). - Into(result) - return -} diff --git a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/mysqlcluster.go b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/mysqlcluster.go deleted file mode 100644 index 443540c43..000000000 --- a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/mysqlcluster.go +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright 2018 Oracle and/or its affiliates. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package v1alpha1 - -import ( - v1alpha1 "github.com/oracle/mysql-operator/pkg/apis/mysql/v1alpha1" - scheme "github.com/oracle/mysql-operator/pkg/generated/clientset/versioned/scheme" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - rest "k8s.io/client-go/rest" -) - -// MySQLClustersGetter has a method to return a MySQLClusterInterface. -// A group's client should implement this interface. -type MySQLClustersGetter interface { - MySQLClusters(namespace string) MySQLClusterInterface -} - -// MySQLClusterInterface has methods to work with MySQLCluster resources. -type MySQLClusterInterface interface { - Create(*v1alpha1.MySQLCluster) (*v1alpha1.MySQLCluster, error) - Update(*v1alpha1.MySQLCluster) (*v1alpha1.MySQLCluster, error) - Delete(name string, options *v1.DeleteOptions) error - DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error - Get(name string, options v1.GetOptions) (*v1alpha1.MySQLCluster, error) - List(opts v1.ListOptions) (*v1alpha1.MySQLClusterList, error) - Watch(opts v1.ListOptions) (watch.Interface, error) - Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.MySQLCluster, err error) - MySQLClusterExpansion -} - -// mySQLClusters implements MySQLClusterInterface -type mySQLClusters struct { - client rest.Interface - ns string -} - -// newMySQLClusters returns a MySQLClusters -func newMySQLClusters(c *MysqlV1alpha1Client, namespace string) *mySQLClusters { - return &mySQLClusters{ - client: c.RESTClient(), - ns: namespace, - } -} - -// Get takes name of the mySQLCluster, and returns the corresponding mySQLCluster object, and an error if there is any. -func (c *mySQLClusters) Get(name string, options v1.GetOptions) (result *v1alpha1.MySQLCluster, err error) { - result = &v1alpha1.MySQLCluster{} - err = c.client.Get(). - Namespace(c.ns). - Resource("mysqlclusters"). - Name(name). - VersionedParams(&options, scheme.ParameterCodec). - Do(). - Into(result) - return -} - -// List takes label and field selectors, and returns the list of MySQLClusters that match those selectors. -func (c *mySQLClusters) List(opts v1.ListOptions) (result *v1alpha1.MySQLClusterList, err error) { - result = &v1alpha1.MySQLClusterList{} - err = c.client.Get(). - Namespace(c.ns). - Resource("mysqlclusters"). - VersionedParams(&opts, scheme.ParameterCodec). - Do(). - Into(result) - return -} - -// Watch returns a watch.Interface that watches the requested mySQLClusters. -func (c *mySQLClusters) Watch(opts v1.ListOptions) (watch.Interface, error) { - opts.Watch = true - return c.client.Get(). - Namespace(c.ns). - Resource("mysqlclusters"). - VersionedParams(&opts, scheme.ParameterCodec). - Watch() -} - -// Create takes the representation of a mySQLCluster and creates it. Returns the server's representation of the mySQLCluster, and an error, if there is any. -func (c *mySQLClusters) Create(mySQLCluster *v1alpha1.MySQLCluster) (result *v1alpha1.MySQLCluster, err error) { - result = &v1alpha1.MySQLCluster{} - err = c.client.Post(). - Namespace(c.ns). - Resource("mysqlclusters"). - Body(mySQLCluster). - Do(). - Into(result) - return -} - -// Update takes the representation of a mySQLCluster and updates it. Returns the server's representation of the mySQLCluster, and an error, if there is any. -func (c *mySQLClusters) Update(mySQLCluster *v1alpha1.MySQLCluster) (result *v1alpha1.MySQLCluster, err error) { - result = &v1alpha1.MySQLCluster{} - err = c.client.Put(). - Namespace(c.ns). - Resource("mysqlclusters"). - Name(mySQLCluster.Name). - Body(mySQLCluster). - Do(). - Into(result) - return -} - -// Delete takes name of the mySQLCluster and deletes it. Returns an error if one occurs. -func (c *mySQLClusters) Delete(name string, options *v1.DeleteOptions) error { - return c.client.Delete(). - Namespace(c.ns). - Resource("mysqlclusters"). - Name(name). - Body(options). - Do(). - Error() -} - -// DeleteCollection deletes a collection of objects. -func (c *mySQLClusters) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { - return c.client.Delete(). - Namespace(c.ns). - Resource("mysqlclusters"). - VersionedParams(&listOptions, scheme.ParameterCodec). - Body(options). - Do(). - Error() -} - -// Patch applies the patch and returns the patched mySQLCluster. -func (c *mySQLClusters) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.MySQLCluster, err error) { - result = &v1alpha1.MySQLCluster{} - err = c.client.Patch(pt). - Namespace(c.ns). - Resource("mysqlclusters"). - SubResource(subresources...). - Name(name). - Body(data). - Do(). - Into(result) - return -} diff --git a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/mysqlrestore.go b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/mysqlrestore.go deleted file mode 100644 index 8b71eaaba..000000000 --- a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/mysqlrestore.go +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright 2018 Oracle and/or its affiliates. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package v1alpha1 - -import ( - v1alpha1 "github.com/oracle/mysql-operator/pkg/apis/mysql/v1alpha1" - scheme "github.com/oracle/mysql-operator/pkg/generated/clientset/versioned/scheme" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - rest "k8s.io/client-go/rest" -) - -// MySQLRestoresGetter has a method to return a MySQLRestoreInterface. -// A group's client should implement this interface. -type MySQLRestoresGetter interface { - MySQLRestores(namespace string) MySQLRestoreInterface -} - -// MySQLRestoreInterface has methods to work with MySQLRestore resources. -type MySQLRestoreInterface interface { - Create(*v1alpha1.MySQLRestore) (*v1alpha1.MySQLRestore, error) - Update(*v1alpha1.MySQLRestore) (*v1alpha1.MySQLRestore, error) - Delete(name string, options *v1.DeleteOptions) error - DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error - Get(name string, options v1.GetOptions) (*v1alpha1.MySQLRestore, error) - List(opts v1.ListOptions) (*v1alpha1.MySQLRestoreList, error) - Watch(opts v1.ListOptions) (watch.Interface, error) - Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.MySQLRestore, err error) - MySQLRestoreExpansion -} - -// mySQLRestores implements MySQLRestoreInterface -type mySQLRestores struct { - client rest.Interface - ns string -} - -// newMySQLRestores returns a MySQLRestores -func newMySQLRestores(c *MysqlV1alpha1Client, namespace string) *mySQLRestores { - return &mySQLRestores{ - client: c.RESTClient(), - ns: namespace, - } -} - -// Get takes name of the mySQLRestore, and returns the corresponding mySQLRestore object, and an error if there is any. -func (c *mySQLRestores) Get(name string, options v1.GetOptions) (result *v1alpha1.MySQLRestore, err error) { - result = &v1alpha1.MySQLRestore{} - err = c.client.Get(). - Namespace(c.ns). - Resource("mysqlrestores"). - Name(name). - VersionedParams(&options, scheme.ParameterCodec). - Do(). - Into(result) - return -} - -// List takes label and field selectors, and returns the list of MySQLRestores that match those selectors. -func (c *mySQLRestores) List(opts v1.ListOptions) (result *v1alpha1.MySQLRestoreList, err error) { - result = &v1alpha1.MySQLRestoreList{} - err = c.client.Get(). - Namespace(c.ns). - Resource("mysqlrestores"). - VersionedParams(&opts, scheme.ParameterCodec). - Do(). - Into(result) - return -} - -// Watch returns a watch.Interface that watches the requested mySQLRestores. -func (c *mySQLRestores) Watch(opts v1.ListOptions) (watch.Interface, error) { - opts.Watch = true - return c.client.Get(). - Namespace(c.ns). - Resource("mysqlrestores"). - VersionedParams(&opts, scheme.ParameterCodec). - Watch() -} - -// Create takes the representation of a mySQLRestore and creates it. Returns the server's representation of the mySQLRestore, and an error, if there is any. -func (c *mySQLRestores) Create(mySQLRestore *v1alpha1.MySQLRestore) (result *v1alpha1.MySQLRestore, err error) { - result = &v1alpha1.MySQLRestore{} - err = c.client.Post(). - Namespace(c.ns). - Resource("mysqlrestores"). - Body(mySQLRestore). - Do(). - Into(result) - return -} - -// Update takes the representation of a mySQLRestore and updates it. Returns the server's representation of the mySQLRestore, and an error, if there is any. -func (c *mySQLRestores) Update(mySQLRestore *v1alpha1.MySQLRestore) (result *v1alpha1.MySQLRestore, err error) { - result = &v1alpha1.MySQLRestore{} - err = c.client.Put(). - Namespace(c.ns). - Resource("mysqlrestores"). - Name(mySQLRestore.Name). - Body(mySQLRestore). - Do(). - Into(result) - return -} - -// Delete takes name of the mySQLRestore and deletes it. Returns an error if one occurs. -func (c *mySQLRestores) Delete(name string, options *v1.DeleteOptions) error { - return c.client.Delete(). - Namespace(c.ns). - Resource("mysqlrestores"). - Name(name). - Body(options). - Do(). - Error() -} - -// DeleteCollection deletes a collection of objects. -func (c *mySQLRestores) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { - return c.client.Delete(). - Namespace(c.ns). - Resource("mysqlrestores"). - VersionedParams(&listOptions, scheme.ParameterCodec). - Body(options). - Do(). - Error() -} - -// Patch applies the patch and returns the patched mySQLRestore. -func (c *mySQLRestores) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.MySQLRestore, err error) { - result = &v1alpha1.MySQLRestore{} - err = c.client.Patch(pt). - Namespace(c.ns). - Resource("mysqlrestores"). - SubResource(subresources...). - Name(name). - Body(data). - Do(). - Into(result) - return -} diff --git a/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/restore.go b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/restore.go new file mode 100644 index 000000000..983b04fa3 --- /dev/null +++ b/pkg/generated/clientset/versioned/typed/mysql/v1alpha1/restore.go @@ -0,0 +1,153 @@ +// Copyright 2018 Oracle and/or its affiliates. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package v1alpha1 + +import ( + v1alpha1 "github.com/oracle/mysql-operator/pkg/apis/mysql/v1alpha1" + scheme "github.com/oracle/mysql-operator/pkg/generated/clientset/versioned/scheme" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + rest "k8s.io/client-go/rest" +) + +// RestoresGetter has a method to return a RestoreInterface. +// A group's client should implement this interface. +type RestoresGetter interface { + Restores(namespace string) RestoreInterface +} + +// RestoreInterface has methods to work with Restore resources. +type RestoreInterface interface { + Create(*v1alpha1.Restore) (*v1alpha1.Restore, error) + Update(*v1alpha1.Restore) (*v1alpha1.Restore, error) + Delete(name string, options *v1.DeleteOptions) error + DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error + Get(name string, options v1.GetOptions) (*v1alpha1.Restore, error) + List(opts v1.ListOptions) (*v1alpha1.RestoreList, error) + Watch(opts v1.ListOptions) (watch.Interface, error) + Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.Restore, err error) + RestoreExpansion +} + +// restores implements RestoreInterface +type restores struct { + client rest.Interface + ns string +} + +// newRestores returns a Restores +func newRestores(c *MysqlV1alpha1Client, namespace string) *restores { + return &restores{ + client: c.RESTClient(), + ns: namespace, + } +} + +// Get takes name of the restore, and returns the corresponding restore object, and an error if there is any. +func (c *restores) Get(name string, options v1.GetOptions) (result *v1alpha1.Restore, err error) { + result = &v1alpha1.Restore{} + err = c.client.Get(). + Namespace(c.ns). + Resource("restores"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of Restores that match those selectors. +func (c *restores) List(opts v1.ListOptions) (result *v1alpha1.RestoreList, err error) { + result = &v1alpha1.RestoreList{} + err = c.client.Get(). + Namespace(c.ns). + Resource("restores"). + VersionedParams(&opts, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested restores. +func (c *restores) Watch(opts v1.ListOptions) (watch.Interface, error) { + opts.Watch = true + return c.client.Get(). + Namespace(c.ns). + Resource("restores"). + VersionedParams(&opts, scheme.ParameterCodec). + Watch() +} + +// Create takes the representation of a restore and creates it. Returns the server's representation of the restore, and an error, if there is any. +func (c *restores) Create(restore *v1alpha1.Restore) (result *v1alpha1.Restore, err error) { + result = &v1alpha1.Restore{} + err = c.client.Post(). + Namespace(c.ns). + Resource("restores"). + Body(restore). + Do(). + Into(result) + return +} + +// Update takes the representation of a restore and updates it. Returns the server's representation of the restore, and an error, if there is any. +func (c *restores) Update(restore *v1alpha1.Restore) (result *v1alpha1.Restore, err error) { + result = &v1alpha1.Restore{} + err = c.client.Put(). + Namespace(c.ns). + Resource("restores"). + Name(restore.Name). + Body(restore). + Do(). + Into(result) + return +} + +// Delete takes name of the restore and deletes it. Returns an error if one occurs. +func (c *restores) Delete(name string, options *v1.DeleteOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("restores"). + Name(name). + Body(options). + Do(). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *restores) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("restores"). + VersionedParams(&listOptions, scheme.ParameterCodec). + Body(options). + Do(). + Error() +} + +// Patch applies the patch and returns the patched restore. +func (c *restores) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.Restore, err error) { + result = &v1alpha1.Restore{} + err = c.client.Patch(pt). + Namespace(c.ns). + Resource("restores"). + SubResource(subresources...). + Name(name). + Body(data). + Do(). + Into(result) + return +} diff --git a/pkg/generated/informers/externalversions/generic.go b/pkg/generated/informers/externalversions/generic.go index 0b856984a..84231d9fe 100644 --- a/pkg/generated/informers/externalversions/generic.go +++ b/pkg/generated/informers/externalversions/generic.go @@ -51,14 +51,14 @@ func (f *genericInformer) Lister() cache.GenericLister { func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource) (GenericInformer, error) { switch resource { // Group=mysql.oracle.com, Version=v1alpha1 - case v1alpha1.SchemeGroupVersion.WithResource("mysqlbackups"): - return &genericInformer{resource: resource.GroupResource(), informer: f.Mysql().V1alpha1().MySQLBackups().Informer()}, nil - case v1alpha1.SchemeGroupVersion.WithResource("mysqlbackupschedules"): - return &genericInformer{resource: resource.GroupResource(), informer: f.Mysql().V1alpha1().MySQLBackupSchedules().Informer()}, nil - case v1alpha1.SchemeGroupVersion.WithResource("mysqlclusters"): - return &genericInformer{resource: resource.GroupResource(), informer: f.Mysql().V1alpha1().MySQLClusters().Informer()}, nil - case v1alpha1.SchemeGroupVersion.WithResource("mysqlrestores"): - return &genericInformer{resource: resource.GroupResource(), informer: f.Mysql().V1alpha1().MySQLRestores().Informer()}, nil + case v1alpha1.SchemeGroupVersion.WithResource("backups"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Mysql().V1alpha1().Backups().Informer()}, nil + case v1alpha1.SchemeGroupVersion.WithResource("backupschedules"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Mysql().V1alpha1().BackupSchedules().Informer()}, nil + case v1alpha1.SchemeGroupVersion.WithResource("clusters"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Mysql().V1alpha1().Clusters().Informer()}, nil + case v1alpha1.SchemeGroupVersion.WithResource("restores"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Mysql().V1alpha1().Restores().Informer()}, nil } diff --git a/pkg/generated/informers/externalversions/mysql/v1alpha1/mysqlbackupschedule.go b/pkg/generated/informers/externalversions/mysql/v1alpha1/backup.go similarity index 55% rename from pkg/generated/informers/externalversions/mysql/v1alpha1/mysqlbackupschedule.go rename to pkg/generated/informers/externalversions/mysql/v1alpha1/backup.go index 811e3280f..df954d6e9 100644 --- a/pkg/generated/informers/externalversions/mysql/v1alpha1/mysqlbackupschedule.go +++ b/pkg/generated/informers/externalversions/mysql/v1alpha1/backup.go @@ -29,59 +29,59 @@ import ( cache "k8s.io/client-go/tools/cache" ) -// MySQLBackupScheduleInformer provides access to a shared informer and lister for -// MySQLBackupSchedules. -type MySQLBackupScheduleInformer interface { +// BackupInformer provides access to a shared informer and lister for +// Backups. +type BackupInformer interface { Informer() cache.SharedIndexInformer - Lister() v1alpha1.MySQLBackupScheduleLister + Lister() v1alpha1.BackupLister } -type mySQLBackupScheduleInformer struct { +type backupInformer struct { factory internalinterfaces.SharedInformerFactory tweakListOptions internalinterfaces.TweakListOptionsFunc namespace string } -// NewMySQLBackupScheduleInformer constructs a new informer for MySQLBackupSchedule type. +// NewBackupInformer constructs a new informer for Backup type. // Always prefer using an informer factory to get a shared informer instead of getting an independent // one. This reduces memory footprint and number of connections to the server. -func NewMySQLBackupScheduleInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { - return NewFilteredMySQLBackupScheduleInformer(client, namespace, resyncPeriod, indexers, nil) +func NewBackupInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredBackupInformer(client, namespace, resyncPeriod, indexers, nil) } -// NewFilteredMySQLBackupScheduleInformer constructs a new informer for MySQLBackupSchedule type. +// NewFilteredBackupInformer constructs a new informer for Backup type. // Always prefer using an informer factory to get a shared informer instead of getting an independent // one. This reduces memory footprint and number of connections to the server. -func NewFilteredMySQLBackupScheduleInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { +func NewFilteredBackupInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ ListFunc: func(options v1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } - return client.MysqlV1alpha1().MySQLBackupSchedules(namespace).List(options) + return client.MysqlV1alpha1().Backups(namespace).List(options) }, WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } - return client.MysqlV1alpha1().MySQLBackupSchedules(namespace).Watch(options) + return client.MysqlV1alpha1().Backups(namespace).Watch(options) }, }, - &mysql_v1alpha1.MySQLBackupSchedule{}, + &mysql_v1alpha1.Backup{}, resyncPeriod, indexers, ) } -func (f *mySQLBackupScheduleInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { - return NewFilteredMySQLBackupScheduleInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +func (f *backupInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredBackupInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) } -func (f *mySQLBackupScheduleInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&mysql_v1alpha1.MySQLBackupSchedule{}, f.defaultInformer) +func (f *backupInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&mysql_v1alpha1.Backup{}, f.defaultInformer) } -func (f *mySQLBackupScheduleInformer) Lister() v1alpha1.MySQLBackupScheduleLister { - return v1alpha1.NewMySQLBackupScheduleLister(f.Informer().GetIndexer()) +func (f *backupInformer) Lister() v1alpha1.BackupLister { + return v1alpha1.NewBackupLister(f.Informer().GetIndexer()) } diff --git a/pkg/generated/informers/externalversions/mysql/v1alpha1/mysqlrestore.go b/pkg/generated/informers/externalversions/mysql/v1alpha1/backupschedule.go similarity index 58% rename from pkg/generated/informers/externalversions/mysql/v1alpha1/mysqlrestore.go rename to pkg/generated/informers/externalversions/mysql/v1alpha1/backupschedule.go index feffef388..078c63bfa 100644 --- a/pkg/generated/informers/externalversions/mysql/v1alpha1/mysqlrestore.go +++ b/pkg/generated/informers/externalversions/mysql/v1alpha1/backupschedule.go @@ -29,59 +29,59 @@ import ( cache "k8s.io/client-go/tools/cache" ) -// MySQLRestoreInformer provides access to a shared informer and lister for -// MySQLRestores. -type MySQLRestoreInformer interface { +// BackupScheduleInformer provides access to a shared informer and lister for +// BackupSchedules. +type BackupScheduleInformer interface { Informer() cache.SharedIndexInformer - Lister() v1alpha1.MySQLRestoreLister + Lister() v1alpha1.BackupScheduleLister } -type mySQLRestoreInformer struct { +type backupScheduleInformer struct { factory internalinterfaces.SharedInformerFactory tweakListOptions internalinterfaces.TweakListOptionsFunc namespace string } -// NewMySQLRestoreInformer constructs a new informer for MySQLRestore type. +// NewBackupScheduleInformer constructs a new informer for BackupSchedule type. // Always prefer using an informer factory to get a shared informer instead of getting an independent // one. This reduces memory footprint and number of connections to the server. -func NewMySQLRestoreInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { - return NewFilteredMySQLRestoreInformer(client, namespace, resyncPeriod, indexers, nil) +func NewBackupScheduleInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredBackupScheduleInformer(client, namespace, resyncPeriod, indexers, nil) } -// NewFilteredMySQLRestoreInformer constructs a new informer for MySQLRestore type. +// NewFilteredBackupScheduleInformer constructs a new informer for BackupSchedule type. // Always prefer using an informer factory to get a shared informer instead of getting an independent // one. This reduces memory footprint and number of connections to the server. -func NewFilteredMySQLRestoreInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { +func NewFilteredBackupScheduleInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ ListFunc: func(options v1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } - return client.MysqlV1alpha1().MySQLRestores(namespace).List(options) + return client.MysqlV1alpha1().BackupSchedules(namespace).List(options) }, WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } - return client.MysqlV1alpha1().MySQLRestores(namespace).Watch(options) + return client.MysqlV1alpha1().BackupSchedules(namespace).Watch(options) }, }, - &mysql_v1alpha1.MySQLRestore{}, + &mysql_v1alpha1.BackupSchedule{}, resyncPeriod, indexers, ) } -func (f *mySQLRestoreInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { - return NewFilteredMySQLRestoreInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +func (f *backupScheduleInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredBackupScheduleInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) } -func (f *mySQLRestoreInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&mysql_v1alpha1.MySQLRestore{}, f.defaultInformer) +func (f *backupScheduleInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&mysql_v1alpha1.BackupSchedule{}, f.defaultInformer) } -func (f *mySQLRestoreInformer) Lister() v1alpha1.MySQLRestoreLister { - return v1alpha1.NewMySQLRestoreLister(f.Informer().GetIndexer()) +func (f *backupScheduleInformer) Lister() v1alpha1.BackupScheduleLister { + return v1alpha1.NewBackupScheduleLister(f.Informer().GetIndexer()) } diff --git a/pkg/generated/informers/externalversions/mysql/v1alpha1/mysqlcluster.go b/pkg/generated/informers/externalversions/mysql/v1alpha1/cluster.go similarity index 59% rename from pkg/generated/informers/externalversions/mysql/v1alpha1/mysqlcluster.go rename to pkg/generated/informers/externalversions/mysql/v1alpha1/cluster.go index eb0856f98..21621c522 100644 --- a/pkg/generated/informers/externalversions/mysql/v1alpha1/mysqlcluster.go +++ b/pkg/generated/informers/externalversions/mysql/v1alpha1/cluster.go @@ -29,59 +29,59 @@ import ( cache "k8s.io/client-go/tools/cache" ) -// MySQLClusterInformer provides access to a shared informer and lister for -// MySQLClusters. -type MySQLClusterInformer interface { +// ClusterInformer provides access to a shared informer and lister for +// Clusters. +type ClusterInformer interface { Informer() cache.SharedIndexInformer - Lister() v1alpha1.MySQLClusterLister + Lister() v1alpha1.ClusterLister } -type mySQLClusterInformer struct { +type clusterInformer struct { factory internalinterfaces.SharedInformerFactory tweakListOptions internalinterfaces.TweakListOptionsFunc namespace string } -// NewMySQLClusterInformer constructs a new informer for MySQLCluster type. +// NewClusterInformer constructs a new informer for Cluster type. // Always prefer using an informer factory to get a shared informer instead of getting an independent // one. This reduces memory footprint and number of connections to the server. -func NewMySQLClusterInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { - return NewFilteredMySQLClusterInformer(client, namespace, resyncPeriod, indexers, nil) +func NewClusterInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredClusterInformer(client, namespace, resyncPeriod, indexers, nil) } -// NewFilteredMySQLClusterInformer constructs a new informer for MySQLCluster type. +// NewFilteredClusterInformer constructs a new informer for Cluster type. // Always prefer using an informer factory to get a shared informer instead of getting an independent // one. This reduces memory footprint and number of connections to the server. -func NewFilteredMySQLClusterInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { +func NewFilteredClusterInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ ListFunc: func(options v1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } - return client.MysqlV1alpha1().MySQLClusters(namespace).List(options) + return client.MysqlV1alpha1().Clusters(namespace).List(options) }, WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } - return client.MysqlV1alpha1().MySQLClusters(namespace).Watch(options) + return client.MysqlV1alpha1().Clusters(namespace).Watch(options) }, }, - &mysql_v1alpha1.MySQLCluster{}, + &mysql_v1alpha1.Cluster{}, resyncPeriod, indexers, ) } -func (f *mySQLClusterInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { - return NewFilteredMySQLClusterInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +func (f *clusterInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredClusterInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) } -func (f *mySQLClusterInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&mysql_v1alpha1.MySQLCluster{}, f.defaultInformer) +func (f *clusterInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&mysql_v1alpha1.Cluster{}, f.defaultInformer) } -func (f *mySQLClusterInformer) Lister() v1alpha1.MySQLClusterLister { - return v1alpha1.NewMySQLClusterLister(f.Informer().GetIndexer()) +func (f *clusterInformer) Lister() v1alpha1.ClusterLister { + return v1alpha1.NewClusterLister(f.Informer().GetIndexer()) } diff --git a/pkg/generated/informers/externalversions/mysql/v1alpha1/interface.go b/pkg/generated/informers/externalversions/mysql/v1alpha1/interface.go index 840533264..a5042c46e 100644 --- a/pkg/generated/informers/externalversions/mysql/v1alpha1/interface.go +++ b/pkg/generated/informers/externalversions/mysql/v1alpha1/interface.go @@ -22,14 +22,14 @@ import ( // Interface provides access to all the informers in this group version. type Interface interface { - // MySQLBackups returns a MySQLBackupInformer. - MySQLBackups() MySQLBackupInformer - // MySQLBackupSchedules returns a MySQLBackupScheduleInformer. - MySQLBackupSchedules() MySQLBackupScheduleInformer - // MySQLClusters returns a MySQLClusterInformer. - MySQLClusters() MySQLClusterInformer - // MySQLRestores returns a MySQLRestoreInformer. - MySQLRestores() MySQLRestoreInformer + // Backups returns a BackupInformer. + Backups() BackupInformer + // BackupSchedules returns a BackupScheduleInformer. + BackupSchedules() BackupScheduleInformer + // Clusters returns a ClusterInformer. + Clusters() ClusterInformer + // Restores returns a RestoreInformer. + Restores() RestoreInformer } type version struct { @@ -43,22 +43,22 @@ func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakList return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} } -// MySQLBackups returns a MySQLBackupInformer. -func (v *version) MySQLBackups() MySQLBackupInformer { - return &mySQLBackupInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} +// Backups returns a BackupInformer. +func (v *version) Backups() BackupInformer { + return &backupInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} } -// MySQLBackupSchedules returns a MySQLBackupScheduleInformer. -func (v *version) MySQLBackupSchedules() MySQLBackupScheduleInformer { - return &mySQLBackupScheduleInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} +// BackupSchedules returns a BackupScheduleInformer. +func (v *version) BackupSchedules() BackupScheduleInformer { + return &backupScheduleInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} } -// MySQLClusters returns a MySQLClusterInformer. -func (v *version) MySQLClusters() MySQLClusterInformer { - return &mySQLClusterInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} +// Clusters returns a ClusterInformer. +func (v *version) Clusters() ClusterInformer { + return &clusterInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} } -// MySQLRestores returns a MySQLRestoreInformer. -func (v *version) MySQLRestores() MySQLRestoreInformer { - return &mySQLRestoreInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} +// Restores returns a RestoreInformer. +func (v *version) Restores() RestoreInformer { + return &restoreInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} } diff --git a/pkg/generated/informers/externalversions/mysql/v1alpha1/mysqlbackup.go b/pkg/generated/informers/externalversions/mysql/v1alpha1/restore.go similarity index 58% rename from pkg/generated/informers/externalversions/mysql/v1alpha1/mysqlbackup.go rename to pkg/generated/informers/externalversions/mysql/v1alpha1/restore.go index 130f757b9..550719f4b 100644 --- a/pkg/generated/informers/externalversions/mysql/v1alpha1/mysqlbackup.go +++ b/pkg/generated/informers/externalversions/mysql/v1alpha1/restore.go @@ -29,59 +29,59 @@ import ( cache "k8s.io/client-go/tools/cache" ) -// MySQLBackupInformer provides access to a shared informer and lister for -// MySQLBackups. -type MySQLBackupInformer interface { +// RestoreInformer provides access to a shared informer and lister for +// Restores. +type RestoreInformer interface { Informer() cache.SharedIndexInformer - Lister() v1alpha1.MySQLBackupLister + Lister() v1alpha1.RestoreLister } -type mySQLBackupInformer struct { +type restoreInformer struct { factory internalinterfaces.SharedInformerFactory tweakListOptions internalinterfaces.TweakListOptionsFunc namespace string } -// NewMySQLBackupInformer constructs a new informer for MySQLBackup type. +// NewRestoreInformer constructs a new informer for Restore type. // Always prefer using an informer factory to get a shared informer instead of getting an independent // one. This reduces memory footprint and number of connections to the server. -func NewMySQLBackupInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { - return NewFilteredMySQLBackupInformer(client, namespace, resyncPeriod, indexers, nil) +func NewRestoreInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredRestoreInformer(client, namespace, resyncPeriod, indexers, nil) } -// NewFilteredMySQLBackupInformer constructs a new informer for MySQLBackup type. +// NewFilteredRestoreInformer constructs a new informer for Restore type. // Always prefer using an informer factory to get a shared informer instead of getting an independent // one. This reduces memory footprint and number of connections to the server. -func NewFilteredMySQLBackupInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { +func NewFilteredRestoreInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ ListFunc: func(options v1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } - return client.MysqlV1alpha1().MySQLBackups(namespace).List(options) + return client.MysqlV1alpha1().Restores(namespace).List(options) }, WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } - return client.MysqlV1alpha1().MySQLBackups(namespace).Watch(options) + return client.MysqlV1alpha1().Restores(namespace).Watch(options) }, }, - &mysql_v1alpha1.MySQLBackup{}, + &mysql_v1alpha1.Restore{}, resyncPeriod, indexers, ) } -func (f *mySQLBackupInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { - return NewFilteredMySQLBackupInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +func (f *restoreInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredRestoreInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) } -func (f *mySQLBackupInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&mysql_v1alpha1.MySQLBackup{}, f.defaultInformer) +func (f *restoreInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&mysql_v1alpha1.Restore{}, f.defaultInformer) } -func (f *mySQLBackupInformer) Lister() v1alpha1.MySQLBackupLister { - return v1alpha1.NewMySQLBackupLister(f.Informer().GetIndexer()) +func (f *restoreInformer) Lister() v1alpha1.RestoreLister { + return v1alpha1.NewRestoreLister(f.Informer().GetIndexer()) } diff --git a/pkg/generated/listers/mysql/v1alpha1/backup.go b/pkg/generated/listers/mysql/v1alpha1/backup.go new file mode 100644 index 000000000..3033b854b --- /dev/null +++ b/pkg/generated/listers/mysql/v1alpha1/backup.go @@ -0,0 +1,92 @@ +// Copyright 2018 Oracle and/or its affiliates. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// This file was automatically generated by lister-gen + +package v1alpha1 + +import ( + v1alpha1 "github.com/oracle/mysql-operator/pkg/apis/mysql/v1alpha1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// BackupLister helps list Backups. +type BackupLister interface { + // List lists all Backups in the indexer. + List(selector labels.Selector) (ret []*v1alpha1.Backup, err error) + // Backups returns an object that can list and get Backups. + Backups(namespace string) BackupNamespaceLister + BackupListerExpansion +} + +// backupLister implements the BackupLister interface. +type backupLister struct { + indexer cache.Indexer +} + +// NewBackupLister returns a new BackupLister. +func NewBackupLister(indexer cache.Indexer) BackupLister { + return &backupLister{indexer: indexer} +} + +// List lists all Backups in the indexer. +func (s *backupLister) List(selector labels.Selector) (ret []*v1alpha1.Backup, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1alpha1.Backup)) + }) + return ret, err +} + +// Backups returns an object that can list and get Backups. +func (s *backupLister) Backups(namespace string) BackupNamespaceLister { + return backupNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// BackupNamespaceLister helps list and get Backups. +type BackupNamespaceLister interface { + // List lists all Backups in the indexer for a given namespace. + List(selector labels.Selector) (ret []*v1alpha1.Backup, err error) + // Get retrieves the Backup from the indexer for a given namespace and name. + Get(name string) (*v1alpha1.Backup, error) + BackupNamespaceListerExpansion +} + +// backupNamespaceLister implements the BackupNamespaceLister +// interface. +type backupNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all Backups in the indexer for a given namespace. +func (s backupNamespaceLister) List(selector labels.Selector) (ret []*v1alpha1.Backup, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*v1alpha1.Backup)) + }) + return ret, err +} + +// Get retrieves the Backup from the indexer for a given namespace and name. +func (s backupNamespaceLister) Get(name string) (*v1alpha1.Backup, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1alpha1.Resource("backup"), name) + } + return obj.(*v1alpha1.Backup), nil +} diff --git a/pkg/generated/listers/mysql/v1alpha1/backupschedule.go b/pkg/generated/listers/mysql/v1alpha1/backupschedule.go new file mode 100644 index 000000000..d061f7133 --- /dev/null +++ b/pkg/generated/listers/mysql/v1alpha1/backupschedule.go @@ -0,0 +1,92 @@ +// Copyright 2018 Oracle and/or its affiliates. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// This file was automatically generated by lister-gen + +package v1alpha1 + +import ( + v1alpha1 "github.com/oracle/mysql-operator/pkg/apis/mysql/v1alpha1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// BackupScheduleLister helps list BackupSchedules. +type BackupScheduleLister interface { + // List lists all BackupSchedules in the indexer. + List(selector labels.Selector) (ret []*v1alpha1.BackupSchedule, err error) + // BackupSchedules returns an object that can list and get BackupSchedules. + BackupSchedules(namespace string) BackupScheduleNamespaceLister + BackupScheduleListerExpansion +} + +// backupScheduleLister implements the BackupScheduleLister interface. +type backupScheduleLister struct { + indexer cache.Indexer +} + +// NewBackupScheduleLister returns a new BackupScheduleLister. +func NewBackupScheduleLister(indexer cache.Indexer) BackupScheduleLister { + return &backupScheduleLister{indexer: indexer} +} + +// List lists all BackupSchedules in the indexer. +func (s *backupScheduleLister) List(selector labels.Selector) (ret []*v1alpha1.BackupSchedule, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1alpha1.BackupSchedule)) + }) + return ret, err +} + +// BackupSchedules returns an object that can list and get BackupSchedules. +func (s *backupScheduleLister) BackupSchedules(namespace string) BackupScheduleNamespaceLister { + return backupScheduleNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// BackupScheduleNamespaceLister helps list and get BackupSchedules. +type BackupScheduleNamespaceLister interface { + // List lists all BackupSchedules in the indexer for a given namespace. + List(selector labels.Selector) (ret []*v1alpha1.BackupSchedule, err error) + // Get retrieves the BackupSchedule from the indexer for a given namespace and name. + Get(name string) (*v1alpha1.BackupSchedule, error) + BackupScheduleNamespaceListerExpansion +} + +// backupScheduleNamespaceLister implements the BackupScheduleNamespaceLister +// interface. +type backupScheduleNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all BackupSchedules in the indexer for a given namespace. +func (s backupScheduleNamespaceLister) List(selector labels.Selector) (ret []*v1alpha1.BackupSchedule, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*v1alpha1.BackupSchedule)) + }) + return ret, err +} + +// Get retrieves the BackupSchedule from the indexer for a given namespace and name. +func (s backupScheduleNamespaceLister) Get(name string) (*v1alpha1.BackupSchedule, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1alpha1.Resource("backupschedule"), name) + } + return obj.(*v1alpha1.BackupSchedule), nil +} diff --git a/pkg/generated/listers/mysql/v1alpha1/cluster.go b/pkg/generated/listers/mysql/v1alpha1/cluster.go new file mode 100644 index 000000000..4ce0c1998 --- /dev/null +++ b/pkg/generated/listers/mysql/v1alpha1/cluster.go @@ -0,0 +1,92 @@ +// Copyright 2018 Oracle and/or its affiliates. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// This file was automatically generated by lister-gen + +package v1alpha1 + +import ( + v1alpha1 "github.com/oracle/mysql-operator/pkg/apis/mysql/v1alpha1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// ClusterLister helps list Clusters. +type ClusterLister interface { + // List lists all Clusters in the indexer. + List(selector labels.Selector) (ret []*v1alpha1.Cluster, err error) + // Clusters returns an object that can list and get Clusters. + Clusters(namespace string) ClusterNamespaceLister + ClusterListerExpansion +} + +// clusterLister implements the ClusterLister interface. +type clusterLister struct { + indexer cache.Indexer +} + +// NewClusterLister returns a new ClusterLister. +func NewClusterLister(indexer cache.Indexer) ClusterLister { + return &clusterLister{indexer: indexer} +} + +// List lists all Clusters in the indexer. +func (s *clusterLister) List(selector labels.Selector) (ret []*v1alpha1.Cluster, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1alpha1.Cluster)) + }) + return ret, err +} + +// Clusters returns an object that can list and get Clusters. +func (s *clusterLister) Clusters(namespace string) ClusterNamespaceLister { + return clusterNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// ClusterNamespaceLister helps list and get Clusters. +type ClusterNamespaceLister interface { + // List lists all Clusters in the indexer for a given namespace. + List(selector labels.Selector) (ret []*v1alpha1.Cluster, err error) + // Get retrieves the Cluster from the indexer for a given namespace and name. + Get(name string) (*v1alpha1.Cluster, error) + ClusterNamespaceListerExpansion +} + +// clusterNamespaceLister implements the ClusterNamespaceLister +// interface. +type clusterNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all Clusters in the indexer for a given namespace. +func (s clusterNamespaceLister) List(selector labels.Selector) (ret []*v1alpha1.Cluster, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*v1alpha1.Cluster)) + }) + return ret, err +} + +// Get retrieves the Cluster from the indexer for a given namespace and name. +func (s clusterNamespaceLister) Get(name string) (*v1alpha1.Cluster, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1alpha1.Resource("cluster"), name) + } + return obj.(*v1alpha1.Cluster), nil +} diff --git a/pkg/generated/listers/mysql/v1alpha1/expansion_generated.go b/pkg/generated/listers/mysql/v1alpha1/expansion_generated.go index 05a5bff7b..471d3a717 100644 --- a/pkg/generated/listers/mysql/v1alpha1/expansion_generated.go +++ b/pkg/generated/listers/mysql/v1alpha1/expansion_generated.go @@ -16,34 +16,34 @@ package v1alpha1 -// MySQLBackupListerExpansion allows custom methods to be added to -// MySQLBackupLister. -type MySQLBackupListerExpansion interface{} +// BackupListerExpansion allows custom methods to be added to +// BackupLister. +type BackupListerExpansion interface{} -// MySQLBackupNamespaceListerExpansion allows custom methods to be added to -// MySQLBackupNamespaceLister. -type MySQLBackupNamespaceListerExpansion interface{} +// BackupNamespaceListerExpansion allows custom methods to be added to +// BackupNamespaceLister. +type BackupNamespaceListerExpansion interface{} -// MySQLBackupScheduleListerExpansion allows custom methods to be added to -// MySQLBackupScheduleLister. -type MySQLBackupScheduleListerExpansion interface{} +// BackupScheduleListerExpansion allows custom methods to be added to +// BackupScheduleLister. +type BackupScheduleListerExpansion interface{} -// MySQLBackupScheduleNamespaceListerExpansion allows custom methods to be added to -// MySQLBackupScheduleNamespaceLister. -type MySQLBackupScheduleNamespaceListerExpansion interface{} +// BackupScheduleNamespaceListerExpansion allows custom methods to be added to +// BackupScheduleNamespaceLister. +type BackupScheduleNamespaceListerExpansion interface{} -// MySQLClusterListerExpansion allows custom methods to be added to -// MySQLClusterLister. -type MySQLClusterListerExpansion interface{} +// ClusterListerExpansion allows custom methods to be added to +// ClusterLister. +type ClusterListerExpansion interface{} -// MySQLClusterNamespaceListerExpansion allows custom methods to be added to -// MySQLClusterNamespaceLister. -type MySQLClusterNamespaceListerExpansion interface{} +// ClusterNamespaceListerExpansion allows custom methods to be added to +// ClusterNamespaceLister. +type ClusterNamespaceListerExpansion interface{} -// MySQLRestoreListerExpansion allows custom methods to be added to -// MySQLRestoreLister. -type MySQLRestoreListerExpansion interface{} +// RestoreListerExpansion allows custom methods to be added to +// RestoreLister. +type RestoreListerExpansion interface{} -// MySQLRestoreNamespaceListerExpansion allows custom methods to be added to -// MySQLRestoreNamespaceLister. -type MySQLRestoreNamespaceListerExpansion interface{} +// RestoreNamespaceListerExpansion allows custom methods to be added to +// RestoreNamespaceLister. +type RestoreNamespaceListerExpansion interface{} diff --git a/pkg/generated/listers/mysql/v1alpha1/mysqlbackup.go b/pkg/generated/listers/mysql/v1alpha1/mysqlbackup.go deleted file mode 100644 index 60010cc35..000000000 --- a/pkg/generated/listers/mysql/v1alpha1/mysqlbackup.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2018 Oracle and/or its affiliates. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// This file was automatically generated by lister-gen - -package v1alpha1 - -import ( - v1alpha1 "github.com/oracle/mysql-operator/pkg/apis/mysql/v1alpha1" - "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/client-go/tools/cache" -) - -// MySQLBackupLister helps list MySQLBackups. -type MySQLBackupLister interface { - // List lists all MySQLBackups in the indexer. - List(selector labels.Selector) (ret []*v1alpha1.MySQLBackup, err error) - // MySQLBackups returns an object that can list and get MySQLBackups. - MySQLBackups(namespace string) MySQLBackupNamespaceLister - MySQLBackupListerExpansion -} - -// mySQLBackupLister implements the MySQLBackupLister interface. -type mySQLBackupLister struct { - indexer cache.Indexer -} - -// NewMySQLBackupLister returns a new MySQLBackupLister. -func NewMySQLBackupLister(indexer cache.Indexer) MySQLBackupLister { - return &mySQLBackupLister{indexer: indexer} -} - -// List lists all MySQLBackups in the indexer. -func (s *mySQLBackupLister) List(selector labels.Selector) (ret []*v1alpha1.MySQLBackup, err error) { - err = cache.ListAll(s.indexer, selector, func(m interface{}) { - ret = append(ret, m.(*v1alpha1.MySQLBackup)) - }) - return ret, err -} - -// MySQLBackups returns an object that can list and get MySQLBackups. -func (s *mySQLBackupLister) MySQLBackups(namespace string) MySQLBackupNamespaceLister { - return mySQLBackupNamespaceLister{indexer: s.indexer, namespace: namespace} -} - -// MySQLBackupNamespaceLister helps list and get MySQLBackups. -type MySQLBackupNamespaceLister interface { - // List lists all MySQLBackups in the indexer for a given namespace. - List(selector labels.Selector) (ret []*v1alpha1.MySQLBackup, err error) - // Get retrieves the MySQLBackup from the indexer for a given namespace and name. - Get(name string) (*v1alpha1.MySQLBackup, error) - MySQLBackupNamespaceListerExpansion -} - -// mySQLBackupNamespaceLister implements the MySQLBackupNamespaceLister -// interface. -type mySQLBackupNamespaceLister struct { - indexer cache.Indexer - namespace string -} - -// List lists all MySQLBackups in the indexer for a given namespace. -func (s mySQLBackupNamespaceLister) List(selector labels.Selector) (ret []*v1alpha1.MySQLBackup, err error) { - err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { - ret = append(ret, m.(*v1alpha1.MySQLBackup)) - }) - return ret, err -} - -// Get retrieves the MySQLBackup from the indexer for a given namespace and name. -func (s mySQLBackupNamespaceLister) Get(name string) (*v1alpha1.MySQLBackup, error) { - obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) - if err != nil { - return nil, err - } - if !exists { - return nil, errors.NewNotFound(v1alpha1.Resource("mysqlbackup"), name) - } - return obj.(*v1alpha1.MySQLBackup), nil -} diff --git a/pkg/generated/listers/mysql/v1alpha1/mysqlbackupschedule.go b/pkg/generated/listers/mysql/v1alpha1/mysqlbackupschedule.go deleted file mode 100644 index bb900da62..000000000 --- a/pkg/generated/listers/mysql/v1alpha1/mysqlbackupschedule.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2018 Oracle and/or its affiliates. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// This file was automatically generated by lister-gen - -package v1alpha1 - -import ( - v1alpha1 "github.com/oracle/mysql-operator/pkg/apis/mysql/v1alpha1" - "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/client-go/tools/cache" -) - -// MySQLBackupScheduleLister helps list MySQLBackupSchedules. -type MySQLBackupScheduleLister interface { - // List lists all MySQLBackupSchedules in the indexer. - List(selector labels.Selector) (ret []*v1alpha1.MySQLBackupSchedule, err error) - // MySQLBackupSchedules returns an object that can list and get MySQLBackupSchedules. - MySQLBackupSchedules(namespace string) MySQLBackupScheduleNamespaceLister - MySQLBackupScheduleListerExpansion -} - -// mySQLBackupScheduleLister implements the MySQLBackupScheduleLister interface. -type mySQLBackupScheduleLister struct { - indexer cache.Indexer -} - -// NewMySQLBackupScheduleLister returns a new MySQLBackupScheduleLister. -func NewMySQLBackupScheduleLister(indexer cache.Indexer) MySQLBackupScheduleLister { - return &mySQLBackupScheduleLister{indexer: indexer} -} - -// List lists all MySQLBackupSchedules in the indexer. -func (s *mySQLBackupScheduleLister) List(selector labels.Selector) (ret []*v1alpha1.MySQLBackupSchedule, err error) { - err = cache.ListAll(s.indexer, selector, func(m interface{}) { - ret = append(ret, m.(*v1alpha1.MySQLBackupSchedule)) - }) - return ret, err -} - -// MySQLBackupSchedules returns an object that can list and get MySQLBackupSchedules. -func (s *mySQLBackupScheduleLister) MySQLBackupSchedules(namespace string) MySQLBackupScheduleNamespaceLister { - return mySQLBackupScheduleNamespaceLister{indexer: s.indexer, namespace: namespace} -} - -// MySQLBackupScheduleNamespaceLister helps list and get MySQLBackupSchedules. -type MySQLBackupScheduleNamespaceLister interface { - // List lists all MySQLBackupSchedules in the indexer for a given namespace. - List(selector labels.Selector) (ret []*v1alpha1.MySQLBackupSchedule, err error) - // Get retrieves the MySQLBackupSchedule from the indexer for a given namespace and name. - Get(name string) (*v1alpha1.MySQLBackupSchedule, error) - MySQLBackupScheduleNamespaceListerExpansion -} - -// mySQLBackupScheduleNamespaceLister implements the MySQLBackupScheduleNamespaceLister -// interface. -type mySQLBackupScheduleNamespaceLister struct { - indexer cache.Indexer - namespace string -} - -// List lists all MySQLBackupSchedules in the indexer for a given namespace. -func (s mySQLBackupScheduleNamespaceLister) List(selector labels.Selector) (ret []*v1alpha1.MySQLBackupSchedule, err error) { - err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { - ret = append(ret, m.(*v1alpha1.MySQLBackupSchedule)) - }) - return ret, err -} - -// Get retrieves the MySQLBackupSchedule from the indexer for a given namespace and name. -func (s mySQLBackupScheduleNamespaceLister) Get(name string) (*v1alpha1.MySQLBackupSchedule, error) { - obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) - if err != nil { - return nil, err - } - if !exists { - return nil, errors.NewNotFound(v1alpha1.Resource("mysqlbackupschedule"), name) - } - return obj.(*v1alpha1.MySQLBackupSchedule), nil -} diff --git a/pkg/generated/listers/mysql/v1alpha1/mysqlcluster.go b/pkg/generated/listers/mysql/v1alpha1/mysqlcluster.go deleted file mode 100644 index 9e3ba72a0..000000000 --- a/pkg/generated/listers/mysql/v1alpha1/mysqlcluster.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2018 Oracle and/or its affiliates. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// This file was automatically generated by lister-gen - -package v1alpha1 - -import ( - v1alpha1 "github.com/oracle/mysql-operator/pkg/apis/mysql/v1alpha1" - "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/client-go/tools/cache" -) - -// MySQLClusterLister helps list MySQLClusters. -type MySQLClusterLister interface { - // List lists all MySQLClusters in the indexer. - List(selector labels.Selector) (ret []*v1alpha1.MySQLCluster, err error) - // MySQLClusters returns an object that can list and get MySQLClusters. - MySQLClusters(namespace string) MySQLClusterNamespaceLister - MySQLClusterListerExpansion -} - -// mySQLClusterLister implements the MySQLClusterLister interface. -type mySQLClusterLister struct { - indexer cache.Indexer -} - -// NewMySQLClusterLister returns a new MySQLClusterLister. -func NewMySQLClusterLister(indexer cache.Indexer) MySQLClusterLister { - return &mySQLClusterLister{indexer: indexer} -} - -// List lists all MySQLClusters in the indexer. -func (s *mySQLClusterLister) List(selector labels.Selector) (ret []*v1alpha1.MySQLCluster, err error) { - err = cache.ListAll(s.indexer, selector, func(m interface{}) { - ret = append(ret, m.(*v1alpha1.MySQLCluster)) - }) - return ret, err -} - -// MySQLClusters returns an object that can list and get MySQLClusters. -func (s *mySQLClusterLister) MySQLClusters(namespace string) MySQLClusterNamespaceLister { - return mySQLClusterNamespaceLister{indexer: s.indexer, namespace: namespace} -} - -// MySQLClusterNamespaceLister helps list and get MySQLClusters. -type MySQLClusterNamespaceLister interface { - // List lists all MySQLClusters in the indexer for a given namespace. - List(selector labels.Selector) (ret []*v1alpha1.MySQLCluster, err error) - // Get retrieves the MySQLCluster from the indexer for a given namespace and name. - Get(name string) (*v1alpha1.MySQLCluster, error) - MySQLClusterNamespaceListerExpansion -} - -// mySQLClusterNamespaceLister implements the MySQLClusterNamespaceLister -// interface. -type mySQLClusterNamespaceLister struct { - indexer cache.Indexer - namespace string -} - -// List lists all MySQLClusters in the indexer for a given namespace. -func (s mySQLClusterNamespaceLister) List(selector labels.Selector) (ret []*v1alpha1.MySQLCluster, err error) { - err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { - ret = append(ret, m.(*v1alpha1.MySQLCluster)) - }) - return ret, err -} - -// Get retrieves the MySQLCluster from the indexer for a given namespace and name. -func (s mySQLClusterNamespaceLister) Get(name string) (*v1alpha1.MySQLCluster, error) { - obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) - if err != nil { - return nil, err - } - if !exists { - return nil, errors.NewNotFound(v1alpha1.Resource("mysqlcluster"), name) - } - return obj.(*v1alpha1.MySQLCluster), nil -} diff --git a/pkg/generated/listers/mysql/v1alpha1/mysqlrestore.go b/pkg/generated/listers/mysql/v1alpha1/mysqlrestore.go deleted file mode 100644 index 44bf5400a..000000000 --- a/pkg/generated/listers/mysql/v1alpha1/mysqlrestore.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2018 Oracle and/or its affiliates. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// This file was automatically generated by lister-gen - -package v1alpha1 - -import ( - v1alpha1 "github.com/oracle/mysql-operator/pkg/apis/mysql/v1alpha1" - "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/client-go/tools/cache" -) - -// MySQLRestoreLister helps list MySQLRestores. -type MySQLRestoreLister interface { - // List lists all MySQLRestores in the indexer. - List(selector labels.Selector) (ret []*v1alpha1.MySQLRestore, err error) - // MySQLRestores returns an object that can list and get MySQLRestores. - MySQLRestores(namespace string) MySQLRestoreNamespaceLister - MySQLRestoreListerExpansion -} - -// mySQLRestoreLister implements the MySQLRestoreLister interface. -type mySQLRestoreLister struct { - indexer cache.Indexer -} - -// NewMySQLRestoreLister returns a new MySQLRestoreLister. -func NewMySQLRestoreLister(indexer cache.Indexer) MySQLRestoreLister { - return &mySQLRestoreLister{indexer: indexer} -} - -// List lists all MySQLRestores in the indexer. -func (s *mySQLRestoreLister) List(selector labels.Selector) (ret []*v1alpha1.MySQLRestore, err error) { - err = cache.ListAll(s.indexer, selector, func(m interface{}) { - ret = append(ret, m.(*v1alpha1.MySQLRestore)) - }) - return ret, err -} - -// MySQLRestores returns an object that can list and get MySQLRestores. -func (s *mySQLRestoreLister) MySQLRestores(namespace string) MySQLRestoreNamespaceLister { - return mySQLRestoreNamespaceLister{indexer: s.indexer, namespace: namespace} -} - -// MySQLRestoreNamespaceLister helps list and get MySQLRestores. -type MySQLRestoreNamespaceLister interface { - // List lists all MySQLRestores in the indexer for a given namespace. - List(selector labels.Selector) (ret []*v1alpha1.MySQLRestore, err error) - // Get retrieves the MySQLRestore from the indexer for a given namespace and name. - Get(name string) (*v1alpha1.MySQLRestore, error) - MySQLRestoreNamespaceListerExpansion -} - -// mySQLRestoreNamespaceLister implements the MySQLRestoreNamespaceLister -// interface. -type mySQLRestoreNamespaceLister struct { - indexer cache.Indexer - namespace string -} - -// List lists all MySQLRestores in the indexer for a given namespace. -func (s mySQLRestoreNamespaceLister) List(selector labels.Selector) (ret []*v1alpha1.MySQLRestore, err error) { - err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { - ret = append(ret, m.(*v1alpha1.MySQLRestore)) - }) - return ret, err -} - -// Get retrieves the MySQLRestore from the indexer for a given namespace and name. -func (s mySQLRestoreNamespaceLister) Get(name string) (*v1alpha1.MySQLRestore, error) { - obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) - if err != nil { - return nil, err - } - if !exists { - return nil, errors.NewNotFound(v1alpha1.Resource("mysqlrestore"), name) - } - return obj.(*v1alpha1.MySQLRestore), nil -} diff --git a/pkg/generated/listers/mysql/v1alpha1/restore.go b/pkg/generated/listers/mysql/v1alpha1/restore.go new file mode 100644 index 000000000..863b1478e --- /dev/null +++ b/pkg/generated/listers/mysql/v1alpha1/restore.go @@ -0,0 +1,92 @@ +// Copyright 2018 Oracle and/or its affiliates. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// This file was automatically generated by lister-gen + +package v1alpha1 + +import ( + v1alpha1 "github.com/oracle/mysql-operator/pkg/apis/mysql/v1alpha1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// RestoreLister helps list Restores. +type RestoreLister interface { + // List lists all Restores in the indexer. + List(selector labels.Selector) (ret []*v1alpha1.Restore, err error) + // Restores returns an object that can list and get Restores. + Restores(namespace string) RestoreNamespaceLister + RestoreListerExpansion +} + +// restoreLister implements the RestoreLister interface. +type restoreLister struct { + indexer cache.Indexer +} + +// NewRestoreLister returns a new RestoreLister. +func NewRestoreLister(indexer cache.Indexer) RestoreLister { + return &restoreLister{indexer: indexer} +} + +// List lists all Restores in the indexer. +func (s *restoreLister) List(selector labels.Selector) (ret []*v1alpha1.Restore, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1alpha1.Restore)) + }) + return ret, err +} + +// Restores returns an object that can list and get Restores. +func (s *restoreLister) Restores(namespace string) RestoreNamespaceLister { + return restoreNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// RestoreNamespaceLister helps list and get Restores. +type RestoreNamespaceLister interface { + // List lists all Restores in the indexer for a given namespace. + List(selector labels.Selector) (ret []*v1alpha1.Restore, err error) + // Get retrieves the Restore from the indexer for a given namespace and name. + Get(name string) (*v1alpha1.Restore, error) + RestoreNamespaceListerExpansion +} + +// restoreNamespaceLister implements the RestoreNamespaceLister +// interface. +type restoreNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all Restores in the indexer for a given namespace. +func (s restoreNamespaceLister) List(selector labels.Selector) (ret []*v1alpha1.Restore, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*v1alpha1.Restore)) + }) + return ret, err +} + +// Get retrieves the Restore from the indexer for a given namespace and name. +func (s restoreNamespaceLister) Get(name string) (*v1alpha1.Restore, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1alpha1.Resource("restore"), name) + } + return obj.(*v1alpha1.Restore), nil +} diff --git a/pkg/resources/secrets/secret.go b/pkg/resources/secrets/secret.go index ed0e1ae50..16b0434c6 100644 --- a/pkg/resources/secrets/secret.go +++ b/pkg/resources/secrets/secret.go @@ -27,17 +27,17 @@ import ( // NewMysqlRootPassword returns a Kubernetes secret containing a // generated MySQL root password. -func NewMysqlRootPassword(cluster *v1alpha1.MySQLCluster) *corev1.Secret { +func NewMysqlRootPassword(cluster *v1alpha1.Cluster) *corev1.Secret { CreateSecret := RandomAlphanumericString(16) secret := &corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{constants.MySQLClusterLabel: cluster.Name}, + Labels: map[string]string{constants.ClusterLabel: cluster.Name}, Name: GetRootPasswordSecretName(cluster), OwnerReferences: []metav1.OwnerReference{ *metav1.NewControllerRef(cluster, schema.GroupVersionKind{ Group: v1alpha1.SchemeGroupVersion.Group, Version: v1alpha1.SchemeGroupVersion.Version, - Kind: v1alpha1.MySQLClusterCRDResourceKind, + Kind: v1alpha1.ClusterCRDResourceKind, }), }, Namespace: cluster.Namespace, @@ -49,6 +49,6 @@ func NewMysqlRootPassword(cluster *v1alpha1.MySQLCluster) *corev1.Secret { // GetRootPasswordSecretName returns the root password secret name for the // given mysql cluster. -func GetRootPasswordSecretName(cluster *v1alpha1.MySQLCluster) string { +func GetRootPasswordSecretName(cluster *v1alpha1.Cluster) string { return fmt.Sprintf("%s-root-password", cluster.Name) } diff --git a/pkg/resources/secrets/secret_test.go b/pkg/resources/secrets/secret_test.go index 9999f22b0..8b2d6744e 100644 --- a/pkg/resources/secrets/secret_test.go +++ b/pkg/resources/secrets/secret_test.go @@ -23,9 +23,9 @@ import ( ) func TestGetRootPasswordSecretName(t *testing.T) { - cluster := &v1alpha1.MySQLCluster{ + cluster := &v1alpha1.Cluster{ ObjectMeta: metav1.ObjectMeta{Name: "example-cluster"}, - Spec: v1alpha1.MySQLClusterSpec{}, + Spec: v1alpha1.ClusterSpec{}, } actual := GetRootPasswordSecretName(cluster) diff --git a/pkg/resources/services/service.go b/pkg/resources/services/service.go index 193ff120b..9aa177a3b 100644 --- a/pkg/resources/services/service.go +++ b/pkg/resources/services/service.go @@ -24,18 +24,18 @@ import ( ) // NewForCluster will return a new headless Kubernetes service for a MySQL cluster -func NewForCluster(cluster *v1alpha1.MySQLCluster) *corev1.Service { +func NewForCluster(cluster *v1alpha1.Cluster) *corev1.Service { mysqlPort := corev1.ServicePort{Port: 3306} svc := &corev1.Service{ ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{constants.MySQLClusterLabel: cluster.Name}, + Labels: map[string]string{constants.ClusterLabel: cluster.Name}, Name: cluster.Name, Namespace: cluster.Namespace, OwnerReferences: []metav1.OwnerReference{ *metav1.NewControllerRef(cluster, schema.GroupVersionKind{ Group: v1alpha1.SchemeGroupVersion.Group, Version: v1alpha1.SchemeGroupVersion.Version, - Kind: v1alpha1.MySQLClusterCRDResourceKind, + Kind: v1alpha1.ClusterCRDResourceKind, }), }, Annotations: map[string]string{ @@ -45,7 +45,7 @@ func NewForCluster(cluster *v1alpha1.MySQLCluster) *corev1.Service { Spec: corev1.ServiceSpec{ Ports: []corev1.ServicePort{mysqlPort}, Selector: map[string]string{ - constants.MySQLClusterLabel: cluster.Name, + constants.ClusterLabel: cluster.Name, }, ClusterIP: corev1.ClusterIPNone, }, diff --git a/pkg/resources/statefulsets/statefulset.go b/pkg/resources/statefulsets/statefulset.go index 495028ded..3a7de0723 100644 --- a/pkg/resources/statefulsets/statefulset.go +++ b/pkg/resources/statefulsets/statefulset.go @@ -49,7 +49,7 @@ const ( replicationGroupPort = 13306 ) -func volumeMounts(cluster *v1alpha1.MySQLCluster) []v1.VolumeMount { +func volumeMounts(cluster *v1alpha1.Cluster) []v1.VolumeMount { var mounts []v1.VolumeMount name := mySQLVolumeName @@ -93,7 +93,7 @@ func volumeMounts(cluster *v1alpha1.MySQLCluster) []v1.VolumeMount { return mounts } -func clusterNameEnvVar(cluster *v1alpha1.MySQLCluster) v1.EnvVar { +func clusterNameEnvVar(cluster *v1alpha1.Cluster) v1.EnvVar { return v1.EnvVar{Name: "MYSQL_CLUSTER_NAME", Value: cluster.Name} } @@ -125,7 +125,7 @@ func multiMasterEnvVar(enabled bool) v1.EnvVar { // Returns the MySQL_ROOT_PASSWORD environment variable // If a user specifies a secret in the spec we use that // else we create a secret with a random password -func mysqlRootPassword(cluster *v1alpha1.MySQLCluster) v1.EnvVar { +func mysqlRootPassword(cluster *v1alpha1.Cluster) v1.EnvVar { var secretName string if cluster.RequiresSecret() { secretName = secrets.GetRootPasswordSecretName(cluster) @@ -164,7 +164,7 @@ func getReplicationGroupSeeds(name string, replicas int) string { // Builds the MySQL operator container for a cluster. // The 'mysqlImage' parameter is the image name of the mysql server to use with // no version information.. e.g. 'mysql/mysql-server' -func mysqlServerContainer(cluster *v1alpha1.MySQLCluster, mysqlServerImage string, rootPassword v1.EnvVar, serviceName string, replicas int, baseServerID uint32) v1.Container { +func mysqlServerContainer(cluster *v1alpha1.Cluster, mysqlServerImage string, rootPassword v1.EnvVar, serviceName string, replicas int, baseServerID uint32) v1.Container { replicationGroupSeeds := getReplicationGroupSeeds(cluster.Namespace, replicas) args := []string{ @@ -232,7 +232,7 @@ func mysqlServerContainer(cluster *v1alpha1.MySQLCluster, mysqlServerImage strin } } -func mysqlAgentContainer(cluster *v1alpha1.MySQLCluster, mysqlAgentImage string, rootPassword v1.EnvVar, serviceName string, replicas int) v1.Container { +func mysqlAgentContainer(cluster *v1alpha1.Cluster, mysqlAgentImage string, rootPassword v1.EnvVar, serviceName string, replicas int) v1.Container { agentVersion := version.GetBuildVersion() if version := os.Getenv("MYSQL_AGENT_VERSION"); version != "" { agentVersion = version @@ -280,8 +280,8 @@ func mysqlAgentContainer(cluster *v1alpha1.MySQLCluster, mysqlAgentImage string, } } -// NewForCluster creates a new StatefulSet for the given MySQLCluster. -func NewForCluster(cluster *v1alpha1.MySQLCluster, images operatoropts.Images, serviceName string) *apps.StatefulSet { +// NewForCluster creates a new StatefulSet for the given Cluster. +func NewForCluster(cluster *v1alpha1.Cluster, images operatoropts.Images, serviceName string) *apps.StatefulSet { rootPassword := mysqlRootPassword(cluster) replicas := int(cluster.Spec.Replicas) baseServerID := cluster.Spec.BaseServerID @@ -350,10 +350,10 @@ func NewForCluster(cluster *v1alpha1.MySQLCluster, images operatoropts.Images, s mysqlAgentContainer(cluster, images.MySQLAgentImage, rootPassword, serviceName, replicas)} podLabels := map[string]string{ - constants.MySQLClusterLabel: cluster.Name, + constants.ClusterLabel: cluster.Name, } if cluster.Spec.MultiMaster { - podLabels[constants.LabelMySQLClusterRole] = constants.MySQLClusterRolePrimary + podLabels[constants.LabelClusterRole] = constants.ClusterRolePrimary } ss := &apps.StatefulSet{ @@ -364,11 +364,11 @@ func NewForCluster(cluster *v1alpha1.MySQLCluster, images operatoropts.Images, s *metav1.NewControllerRef(cluster, schema.GroupVersionKind{ Group: v1alpha1.SchemeGroupVersion.Group, Version: v1alpha1.SchemeGroupVersion.Version, - Kind: v1alpha1.MySQLClusterCRDResourceKind, + Kind: v1alpha1.ClusterCRDResourceKind, }), }, Labels: map[string]string{ - constants.MySQLClusterLabel: cluster.Name, + constants.ClusterLabel: cluster.Name, constants.MySQLOperatorVersionLabel: version.GetBuildVersion(), }, }, diff --git a/pkg/resources/statefulsets/statefulset_test.go b/pkg/resources/statefulsets/statefulset_test.go index 629df9040..e781af79a 100644 --- a/pkg/resources/statefulsets/statefulset_test.go +++ b/pkg/resources/statefulsets/statefulset_test.go @@ -33,9 +33,9 @@ func mockOperatorConfig() options.MySQLOperatorServer { } func TestMySQLRootPasswordNoSecretRef(t *testing.T) { - cluster := &v1alpha1.MySQLCluster{ + cluster := &v1alpha1.Cluster{ ObjectMeta: metav1.ObjectMeta{Name: "cluster"}, - Spec: v1alpha1.MySQLClusterSpec{}, + Spec: v1alpha1.ClusterSpec{}, } actual := mysqlRootPassword(cluster).ValueFrom.SecretKeyRef.Name @@ -46,8 +46,8 @@ func TestMySQLRootPasswordNoSecretRef(t *testing.T) { } func TestMySQLRootPasswordWithSecretRef(t *testing.T) { - cluster := &v1alpha1.MySQLCluster{ - Spec: v1alpha1.MySQLClusterSpec{ + cluster := &v1alpha1.Cluster{ + Spec: v1alpha1.ClusterSpec{ SecretRef: &corev1.LocalObjectReference{Name: "secret"}, }, } @@ -60,8 +60,8 @@ func TestMySQLRootPasswordWithSecretRef(t *testing.T) { } func TestClusterWithoutPVCHasBackupContainerAndVolumes(t *testing.T) { - cluster := &v1alpha1.MySQLCluster{ - Spec: v1alpha1.MySQLClusterSpec{ + cluster := &v1alpha1.Cluster{ + Spec: v1alpha1.ClusterSpec{ SecretRef: &corev1.LocalObjectReference{Name: "secret"}, }, } @@ -79,8 +79,8 @@ func TestClusterWithoutPVCHasBackupContainerAndVolumes(t *testing.T) { } func TestClusterWithPVCHasBackupContainerAndVolumes(t *testing.T) { - cluster := &v1alpha1.MySQLCluster{ - Spec: v1alpha1.MySQLClusterSpec{ + cluster := &v1alpha1.Cluster{ + Spec: v1alpha1.ClusterSpec{ SecretRef: &corev1.LocalObjectReference{Name: "secret"}, VolumeClaimTemplate: &corev1.PersistentVolumeClaim{}, BackupVolumeClaimTemplate: &corev1.PersistentVolumeClaim{}, @@ -101,8 +101,8 @@ func TestClusterWithPVCHasBackupContainerAndVolumes(t *testing.T) { func TestClusterHasNodeSelector(t *testing.T) { nvmeSelector := map[string]string{"disk": "nvme"} - cluster := &v1alpha1.MySQLCluster{ - Spec: v1alpha1.MySQLClusterSpec{ + cluster := &v1alpha1.Cluster{ + Spec: v1alpha1.ClusterSpec{ NodeSelector: nvmeSelector, }, } @@ -115,8 +115,8 @@ func TestClusterHasNodeSelector(t *testing.T) { } func TestClusterCustomConfig(t *testing.T) { - cluster := &v1alpha1.MySQLCluster{ - Spec: v1alpha1.MySQLClusterSpec{ + cluster := &v1alpha1.Cluster{ + Spec: v1alpha1.ClusterSpec{ ConfigRef: &corev1.LocalObjectReference{ Name: "mycnf", }, @@ -142,8 +142,8 @@ func TestClusterCustomConfig(t *testing.T) { } func TestClusterCustomSSLSetup(t *testing.T) { - cluster := &v1alpha1.MySQLCluster{ - Spec: v1alpha1.MySQLClusterSpec{ + cluster := &v1alpha1.Cluster{ + Spec: v1alpha1.ClusterSpec{ SSLSecretRef: &corev1.LocalObjectReference{ Name: "my-ssl", }, diff --git a/pkg/util/mysqlsh/mysqlsh_test.go b/pkg/util/mysqlsh/mysqlsh_test.go index a99bb50bf..236e9d3c7 100644 --- a/pkg/util/mysqlsh/mysqlsh_test.go +++ b/pkg/util/mysqlsh/mysqlsh_test.go @@ -29,7 +29,7 @@ import ( const clusterStatusOutput = ` mysqlx: [Warning] Using a password on the command line interface can be insecure. { - "clusterName": "MySQLCluster", + "clusterName": "Cluster", "defaultReplicaSet": { "name": "default", "primary": "mysql-test-cluster-0.service.namespace.svc.cluster.local:3306", @@ -103,7 +103,7 @@ func TestGetClusterStatus(t *testing.T) { "--no-wizard", "--uri", "root:foo@localhost.service.namespace.svc.cluster.local:3306", "--py", - "-e", "print dba.get_cluster('MySQLCluster').status()", + "-e", "print dba.get_cluster('Cluster').status()", } if !reflect.DeepEqual(fcmd.RunLog[0], expectedCall) { t.Errorf("Expected call %+v, got %+v", expectedCall, fcmd.RunLog[0]) @@ -113,8 +113,8 @@ func TestGetClusterStatus(t *testing.T) { t.Fatalf("Expected err = nil, got: %v", err) } - if status.ClusterName != "MySQLCluster" { - t.Errorf("Expected status.ClusterName = \"MySQLCluster\", got %q", status.ClusterName) + if status.ClusterName != "Cluster" { + t.Errorf("Expected status.ClusterName = \"Cluster\", got %q", status.ClusterName) } n := len(status.DefaultReplicaSet.Topology) @@ -154,7 +154,7 @@ mysqlx: [Warning] Using a password on the command line interface can be insecure "--no-wizard", "--uri", "root:foo@localhost.service.namespace.svc.cluster.local:3306", "--py", - "-e", fmt.Sprintf("print dba.get_cluster('MySQLCluster').check_instance_state('%s')", instanceURI), + "-e", fmt.Sprintf("print dba.get_cluster('Cluster').check_instance_state('%s')", instanceURI), } if !reflect.DeepEqual(fcmd.RunLog[0], expectedCall) { t.Errorf("Expected call %+v, got %+v", expectedCall, fcmd.RunLog[0]) @@ -198,7 +198,7 @@ func TestRemoveInstanceFromCluster(t *testing.T) { "--no-wizard", "--uri", "root:foo@localhost:3306", "--py", - "-e", `dba.get_cluster('MySQLCluster').remove_instance('root:foo@mysql-cluster-1:3306', {'force': True})`, + "-e", `dba.get_cluster('Cluster').remove_instance('root:foo@mysql-cluster-1:3306', {'force': True})`, } if !reflect.DeepEqual(fcmd.RunLog[0], expectedCall) { t.Errorf("Expected call %+v, got %+v", expectedCall, fcmd.RunLog[0]) @@ -219,10 +219,10 @@ func TestNewErrorFromStderr(t *testing.T) { name: "create_cluster", output: `Traceback (most recent call last): File "", line 1, in -mysqlsh.DBError: MySQL Error (1062): Dba.create_cluster: Duplicate entry 'MySQLCluster' for key 'cluster_name'`, +mysqlsh.DBError: MySQL Error (1062): Dba.create_cluster: Duplicate entry 'Cluster' for key 'cluster_name'`, expected: &Error{ Type: "mysqlsh.DBError", - Message: "MySQL Error (1062): Dba.create_cluster: Duplicate entry 'MySQLCluster' for key 'cluster_name'", + Message: "MySQL Error (1062): Dba.create_cluster: Duplicate entry 'Cluster' for key 'cluster_name'", }, }, { name: "get_cluster", diff --git a/pkg/util/test/test_backup.go b/pkg/util/test/test_backup.go index 7ce616d62..b6c0fd97b 100644 --- a/pkg/util/test/test_backup.go +++ b/pkg/util/test/test_backup.go @@ -21,23 +21,23 @@ import ( "github.com/oracle/mysql-operator/pkg/apis/mysql/v1alpha1" ) -type TestMySQLBackup struct { - *v1alpha1.MySQLBackup +type TestBackup struct { + *v1alpha1.Backup } -func NewTestMySQLBackup() *TestMySQLBackup { - return &TestMySQLBackup{ - MySQLBackup: &v1alpha1.MySQLBackup{ +func NewTestBackup() *TestBackup { + return &TestBackup{ + Backup: &v1alpha1.Backup{ ObjectMeta: metav1.ObjectMeta{ Namespace: metav1.NamespaceDefault, }, Spec: v1alpha1.BackupSpec{ - Executor: &v1alpha1.Executor{ - Provider: "mysqldump", + Executor: &v1alpha1.BackupExecutor{ + Name: "mysqldump", Databases: []string{"test"}, }, - Storage: &v1alpha1.Storage{ - Provider: "s3", + StorageProvider: &v1alpha1.BackupStorageProvider{ + Name: "s3", SecretRef: &corev1.LocalObjectReference{ Name: "name", }, @@ -47,23 +47,23 @@ func NewTestMySQLBackup() *TestMySQLBackup { "bucket": "bucket", }, }, - ClusterRef: &corev1.LocalObjectReference{}, + Cluster: &corev1.LocalObjectReference{}, }, }, } } -func (b *TestMySQLBackup) WithNamespace(namespace string) *TestMySQLBackup { +func (b *TestBackup) WithNamespace(namespace string) *TestBackup { b.Namespace = namespace return b } -func (b *TestMySQLBackup) WithName(name string) *TestMySQLBackup { +func (b *TestBackup) WithName(name string) *TestBackup { b.Name = name return b } -func (b *TestMySQLBackup) WithLabel(key, value string) *TestMySQLBackup { +func (b *TestBackup) WithLabel(key, value string) *TestBackup { if b.Labels == nil { b.Labels = make(map[string]string) } diff --git a/pkg/util/test/test_backupschedule.go b/pkg/util/test/test_backupschedule.go index 5cba6774a..3dbe35b90 100644 --- a/pkg/util/test/test_backupschedule.go +++ b/pkg/util/test/test_backupschedule.go @@ -23,13 +23,13 @@ import ( api "github.com/oracle/mysql-operator/pkg/apis/mysql/v1alpha1" ) -type TestMySQLBackupSchedule struct { - *api.MySQLBackupSchedule +type TestBackupSchedule struct { + *api.BackupSchedule } -func NewTestMySQLBackupSchedule(namespace, name string) *TestMySQLBackupSchedule { - return &TestMySQLBackupSchedule{ - MySQLBackupSchedule: &api.MySQLBackupSchedule{ +func NewTestBackupSchedule(namespace, name string) *TestBackupSchedule { + return &TestBackupSchedule{ + BackupSchedule: &api.BackupSchedule{ ObjectMeta: metav1.ObjectMeta{ Namespace: namespace, Name: name, @@ -37,12 +37,12 @@ func NewTestMySQLBackupSchedule(namespace, name string) *TestMySQLBackupSchedule }, Spec: api.BackupScheduleSpec{ BackupTemplate: api.BackupSpec{ - Executor: &api.Executor{ - Provider: "mysqldump", + Executor: &api.BackupExecutor{ + Name: "mysqldump", Databases: []string{"test"}, }, - Storage: &api.Storage{ - Provider: "s3", + StorageProvider: &api.BackupStorageProvider{ + Name: "s3", SecretRef: &corev1.LocalObjectReference{ Name: "name", }, @@ -52,30 +52,30 @@ func NewTestMySQLBackupSchedule(namespace, name string) *TestMySQLBackupSchedule "bucket": "bucket", }, }, - ClusterRef: &corev1.LocalObjectReference{}, + Cluster: &corev1.LocalObjectReference{}, }, }, }, } } -func (s *TestMySQLBackupSchedule) WithPhase(phase api.BackupSchedulePhase) *TestMySQLBackupSchedule { +func (s *TestBackupSchedule) WithPhase(phase api.BackupSchedulePhase) *TestBackupSchedule { s.Status.Phase = phase return s } -func (s *TestMySQLBackupSchedule) WithCronSchedule(cronExpression string) *TestMySQLBackupSchedule { +func (s *TestBackupSchedule) WithCronSchedule(cronExpression string) *TestBackupSchedule { s.Spec.Schedule = cronExpression return s } -func (s *TestMySQLBackupSchedule) WithLastBackupTime(timeString string) *TestMySQLBackupSchedule { +func (s *TestBackupSchedule) WithLastBackupTime(timeString string) *TestBackupSchedule { t, _ := time.Parse("2006-01-02 15:04:05", timeString) s.Status.LastBackup = metav1.Time{Time: t} return s } -func (s *TestMySQLBackupSchedule) WithLabel(key, value string) *TestMySQLBackupSchedule { +func (s *TestBackupSchedule) WithLabel(key, value string) *TestBackupSchedule { s.Labels[key] = value return s } diff --git a/test/e2e/backup_restore.go b/test/e2e/backup_restore.go index de911a7f5..555a56ce3 100644 --- a/test/e2e/backup_restore.go +++ b/test/e2e/backup_restore.go @@ -44,13 +44,13 @@ var _ = Describe("Backup/Restore", func() { clusterName := "backup-restore" ns := f.Namespace.Name - clusterJig := framework.NewMySQLClusterTestJig(mcs, cs, clusterName) - backupJig := framework.NewMySQLBackupTestJig(mcs, cs, clusterName) - restoreJig := framework.NewMySQLRestoreTestJig(mcs, cs, clusterName) + clusterJig := framework.NewClusterTestJig(mcs, cs, clusterName) + backupJig := framework.NewBackupTestJig(mcs, cs, clusterName) + restoreJig := framework.NewRestoreTestJig(mcs, cs, clusterName) By("Creating a cluster to backup") - cluster := clusterJig.CreateAndAwaitMySQLClusterOrFail(ns, 3, nil, framework.DefaultTimeout) + cluster := clusterJig.CreateAndAwaitClusterOrFail(ns, 3, nil, framework.DefaultTimeout) By("Creating testdb in the cluster to be backed up") @@ -72,9 +72,9 @@ var _ = Describe("Backup/Restore", func() { By("Backing up testdb") dbs := []string{framework.TestDBName} - backup := backupJig.CreateAndAwaitMySQLDumpBackupOrFail(ns, clusterName, dbs, func(b *v1alpha1.MySQLBackup) { - b.Spec.Storage = &v1alpha1.Storage{ - Provider: "s3", + backup := backupJig.CreateAndAwaitMySQLDumpBackupOrFail(ns, clusterName, dbs, func(b *v1alpha1.Backup) { + b.Spec.StorageProvider = &v1alpha1.BackupStorageProvider{ + Name: "s3", SecretRef: &corev1.LocalObjectReference{ Name: secret.Name, }, @@ -101,7 +101,7 @@ var _ = Describe("Backup/Restore", func() { By("Restoring the backup") - restore := restoreJig.CreateAndAwaitMySQLRestoreOrFail(ns, clusterName, backup.Name, nil, framework.DefaultTimeout) + restore := restoreJig.CreateAndAwaitRestoreOrFail(ns, clusterName, backup.Name, nil, framework.DefaultTimeout) Expect(restore.Status.TimeCompleted).ToNot(BeZero()) By("Checking testdb is present and contains the correct uuid") diff --git a/test/e2e/cluster_creation.go b/test/e2e/cluster_creation.go index 0e1b1d0ab..1b0613ba0 100644 --- a/test/e2e/cluster_creation.go +++ b/test/e2e/cluster_creation.go @@ -24,16 +24,16 @@ import ( "github.com/oracle/mysql-operator/test/e2e/framework" ) -var _ = Describe("MySQLCluster creation", func() { +var _ = Describe("Cluster creation", func() { f := framework.NewDefaultFramework("cluster-creation") It("should be possible to create a basic 3 member cluster with a 28 character name", func() { clusterName := "basic-twenty-eight-char-name" Expect(clusterName).To(HaveLen(28)) - jig := framework.NewMySQLClusterTestJig(f.MySQLClientSet, f.ClientSet, clusterName) + jig := framework.NewClusterTestJig(f.MySQLClientSet, f.ClientSet, clusterName) - cluster := jig.CreateAndAwaitMySQLClusterOrFail(f.Namespace.Name, 3, nil, framework.DefaultTimeout) + cluster := jig.CreateAndAwaitClusterOrFail(f.Namespace.Name, 3, nil, framework.DefaultTimeout) expected, err := framework.WriteSQLTest(cluster, cluster.Name+"-0") Expect(err).NotTo(HaveOccurred()) @@ -47,9 +47,9 @@ var _ = Describe("MySQLCluster creation", func() { clusterName := "multi-master" replicas := int32(3) - jig := framework.NewMySQLClusterTestJig(f.MySQLClientSet, f.ClientSet, clusterName) + jig := framework.NewClusterTestJig(f.MySQLClientSet, f.ClientSet, clusterName) - cluster := jig.CreateAndAwaitMySQLClusterOrFail(f.Namespace.Name, replicas, func(cluster *v1alpha1.MySQLCluster) { + cluster := jig.CreateAndAwaitClusterOrFail(f.Namespace.Name, replicas, func(cluster *v1alpha1.Cluster) { cluster.Spec.MultiMaster = true }, framework.DefaultTimeout) diff --git a/test/e2e/container_crash.go b/test/e2e/container_crash.go index bd7b66b99..ca122d1d3 100644 --- a/test/e2e/container_crash.go +++ b/test/e2e/container_crash.go @@ -37,13 +37,13 @@ var _ = Describe("Container crash", func() { mcs = f.MySQLClientSet }) - It("should be the case that single-primary MySQLClusters recover from mysql-server containers crashing", func() { + It("should be the case that single-primary Clusters recover from mysql-server containers crashing", func() { clusterName := "mysql-server-crash" ns := f.Namespace.Name - jig := framework.NewMySQLClusterTestJig(mcs, cs, clusterName) + jig := framework.NewClusterTestJig(mcs, cs, clusterName) - cluster := jig.CreateAndAwaitMySQLClusterOrFail(ns, 3, nil, framework.DefaultTimeout) + cluster := jig.CreateAndAwaitClusterOrFail(ns, 3, nil, framework.DefaultTimeout) primary := framework.GetReadyPrimaryPodName(cs, ns, cluster.Name) @@ -82,13 +82,13 @@ var _ = Describe("Container crash", func() { Expect(actual).To(Equal(expected)) }) - It("should be the case that multi-primary MySQLClusters recover from mysql-server containers crashing", func() { + It("should be the case that multi-primary Clusters recover from mysql-server containers crashing", func() { clusterName := "mysql-server-crash" ns := f.Namespace.Name - jig := framework.NewMySQLClusterTestJig(mcs, cs, clusterName) + jig := framework.NewClusterTestJig(mcs, cs, clusterName) - cluster := jig.CreateAndAwaitMySQLClusterOrFail(ns, 3, func(cluster *v1alpha1.MySQLCluster) { + cluster := jig.CreateAndAwaitClusterOrFail(ns, 3, func(cluster *v1alpha1.Cluster) { cluster.Spec.MultiMaster = true }, framework.DefaultTimeout) @@ -117,13 +117,13 @@ var _ = Describe("Container crash", func() { Expect(actual).To(Equal(expected)) }) - It("should be the case that single-primary MySQLClusters recover from mysql-agent containers crashing", func() { + It("should be the case that single-primary Clusters recover from mysql-agent containers crashing", func() { clusterName := "mysql-agent-crash" ns := f.Namespace.Name - jig := framework.NewMySQLClusterTestJig(mcs, cs, clusterName) + jig := framework.NewClusterTestJig(mcs, cs, clusterName) - cluster := jig.CreateAndAwaitMySQLClusterOrFail(ns, 3, nil, framework.DefaultTimeout) + cluster := jig.CreateAndAwaitClusterOrFail(ns, 3, nil, framework.DefaultTimeout) primary := framework.GetReadyPrimaryPodName(cs, ns, cluster.Name) @@ -162,13 +162,13 @@ var _ = Describe("Container crash", func() { Expect(actual).To(Equal(expected)) }) - It("should be the case that multi-primary MySQLClusters recover from mysql-agent containers crashing", func() { + It("should be the case that multi-primary Clusters recover from mysql-agent containers crashing", func() { clusterName := "mysql-agent-crash" ns := f.Namespace.Name - jig := framework.NewMySQLClusterTestJig(mcs, cs, clusterName) + jig := framework.NewClusterTestJig(mcs, cs, clusterName) - cluster := jig.CreateAndAwaitMySQLClusterOrFail(ns, 3, func(cluster *v1alpha1.MySQLCluster) { + cluster := jig.CreateAndAwaitClusterOrFail(ns, 3, func(cluster *v1alpha1.Cluster) { cluster.Spec.MultiMaster = true }, framework.DefaultTimeout) diff --git a/test/e2e/framework/backup.go b/test/e2e/framework/backup.go index f82fcf3a8..ba00d7dd6 100644 --- a/test/e2e/framework/backup.go +++ b/test/e2e/framework/backup.go @@ -31,8 +31,8 @@ import ( mysqlclientset "github.com/oracle/mysql-operator/pkg/generated/clientset/versioned" ) -// MySQLBackupTestJig is a jig to help MySQLBackup testing. -type MySQLBackupTestJig struct { +// BackupTestJig is a jig to help Backup testing. +type BackupTestJig struct { ID string Name string Labels map[string]string @@ -41,10 +41,10 @@ type MySQLBackupTestJig struct { KubeClient clientset.Interface } -// NewMySQLBackupTestJig allocates and inits a new MySQLBackupTestJig. -func NewMySQLBackupTestJig(mysqlClient mysqlclientset.Interface, kubeClient clientset.Interface, name string) *MySQLBackupTestJig { +// NewBackupTestJig allocates and inits a new BackupTestJig. +func NewBackupTestJig(mysqlClient mysqlclientset.Interface, kubeClient clientset.Interface, name string) *BackupTestJig { id := string(uuid.NewUUID()) - return &MySQLBackupTestJig{ + return &BackupTestJig{ ID: id, Name: name, Labels: map[string]string{ @@ -57,13 +57,13 @@ func NewMySQLBackupTestJig(mysqlClient mysqlclientset.Interface, kubeClient clie } } -// newMySQLBackupTemplate returns the default v1alpha1.MySQLBackup template for -// this jig, but does not actually create the MySQLBackup. The default -// MySQLBackup has the same name as the jig. -func (j *MySQLBackupTestJig) newMySQLBackupTemplate(namespace, clusterName string) *v1alpha1.MySQLBackup { - return &v1alpha1.MySQLBackup{ +// newBackupTemplate returns the default v1alpha1.Backup template for +// this jig, but does not actually create the Backup. The default +// Backup has the same name as the jig. +func (j *BackupTestJig) newBackupTemplate(namespace, clusterName string) *v1alpha1.Backup { + return &v1alpha1.Backup{ TypeMeta: metav1.TypeMeta{ - Kind: v1alpha1.MySQLBackupCRDResourceKind, + Kind: v1alpha1.BackupCRDResourceKind, APIVersion: v1alpha1.SchemeGroupVersion.String(), }, ObjectMeta: metav1.ObjectMeta{ @@ -72,47 +72,47 @@ func (j *MySQLBackupTestJig) newMySQLBackupTemplate(namespace, clusterName strin Labels: j.Labels, }, Spec: v1alpha1.BackupSpec{ - ClusterRef: &corev1.LocalObjectReference{ + Cluster: &corev1.LocalObjectReference{ Name: clusterName, }, }, } } -// CreateMySQLBackupOrFail creates a new MySQLBackup based on the jig's -// defaults. Callers can provide a function to tweak the MySQLBackup object +// CreateBackupOrFail creates a new Backup based on the jig's +// defaults. Callers can provide a function to tweak the Backup object // before it is created. -func (j *MySQLBackupTestJig) CreateMySQLBackupOrFail(namespace, clusterName string, tweak func(backup *v1alpha1.MySQLBackup)) *v1alpha1.MySQLBackup { - backup := j.newMySQLBackupTemplate(namespace, clusterName) +func (j *BackupTestJig) CreateBackupOrFail(namespace, clusterName string, tweak func(backup *v1alpha1.Backup)) *v1alpha1.Backup { + backup := j.newBackupTemplate(namespace, clusterName) if tweak != nil { tweak(backup) } name := types.NamespacedName{Namespace: namespace, Name: j.Name} - By(fmt.Sprintf("Creating a MySQLBackup %q", name)) + By(fmt.Sprintf("Creating a Backup %q", name)) - result, err := j.MySQLClient.MysqlV1alpha1().MySQLBackups(namespace).Create(backup) + result, err := j.MySQLClient.MysqlV1alpha1().Backups(namespace).Create(backup) if err != nil { - Failf("Failed to create MySQLBackup %q: %v", name, err) + Failf("Failed to create Backup %q: %v", name, err) } return result } -// CreateAndAwaitMySQLBackupOrFail creates a new MySQLBackup based on the +// CreateAndAwaitBackupOrFail creates a new Backup based on the // jig's defaults, waits for it to become ready. Callers can provide a function -// to tweak the MySQLBackup object before it is created. -func (j *MySQLBackupTestJig) CreateAndAwaitMySQLBackupOrFail(namespace, clusterName string, tweak func(backup *v1alpha1.MySQLBackup), timeout time.Duration) *v1alpha1.MySQLBackup { - backup := j.CreateMySQLBackupOrFail(namespace, clusterName, tweak) +// to tweak the Backup object before it is created. +func (j *BackupTestJig) CreateAndAwaitBackupOrFail(namespace, clusterName string, tweak func(backup *v1alpha1.Backup), timeout time.Duration) *v1alpha1.Backup { + backup := j.CreateBackupOrFail(namespace, clusterName, tweak) return j.WaitForbackupReadyOrFail(namespace, backup.Name, timeout) } -// CreateAndAwaitMySQLDumpBackupOrFail creates a new MySQLBackup based on the +// CreateAndAwaitMySQLDumpBackupOrFail creates a new Backup based on the // jig's defaults, waits for it to become ready. Callers can provide a function -// to tweak the MySQLBackup object before it is created. -func (j *MySQLBackupTestJig) CreateAndAwaitMySQLDumpBackupOrFail(namespace, clusterName string, databases []string, tweak func(backup *v1alpha1.MySQLBackup), timeout time.Duration) *v1alpha1.MySQLBackup { - backup := j.CreateMySQLBackupOrFail(namespace, clusterName, func(backup *v1alpha1.MySQLBackup) { - backup.Spec.Executor = &v1alpha1.Executor{ - Provider: "mysqldump", +// to tweak the Backup object before it is created. +func (j *BackupTestJig) CreateAndAwaitMySQLDumpBackupOrFail(namespace, clusterName string, databases []string, tweak func(backup *v1alpha1.Backup), timeout time.Duration) *v1alpha1.Backup { + backup := j.CreateBackupOrFail(namespace, clusterName, func(backup *v1alpha1.Backup) { + backup.Spec.Executor = &v1alpha1.BackupExecutor{ + Name: "mysqldump", Databases: databases, } tweak(backup) @@ -123,7 +123,7 @@ func (j *MySQLBackupTestJig) CreateAndAwaitMySQLDumpBackupOrFail(namespace, clus // CreateS3AuthSecret creates a secret containing the S3 (compat.) credentials // for storing backups. -func (j *MySQLBackupTestJig) CreateS3AuthSecret(namespace, name string) (*corev1.Secret, error) { +func (j *BackupTestJig) CreateS3AuthSecret(namespace, name string) (*corev1.Secret, error) { return j.KubeClient.CoreV1().Secrets(namespace).Create(&corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -136,10 +136,10 @@ func (j *MySQLBackupTestJig) CreateS3AuthSecret(namespace, name string) (*corev1 }) } -func (j *MySQLBackupTestJig) waitForConditionOrFail(namespace, name string, timeout time.Duration, message string, conditionFn func(*v1alpha1.MySQLBackup) bool) *v1alpha1.MySQLBackup { - var backup *v1alpha1.MySQLBackup +func (j *BackupTestJig) waitForConditionOrFail(namespace, name string, timeout time.Duration, message string, conditionFn func(*v1alpha1.Backup) bool) *v1alpha1.Backup { + var backup *v1alpha1.Backup pollFunc := func() (bool, error) { - b, err := j.MySQLClient.MysqlV1alpha1().MySQLBackups(namespace).Get(name, metav1.GetOptions{}) + b, err := j.MySQLClient.MysqlV1alpha1().Backups(namespace).Get(name, metav1.GetOptions{}) if err != nil { return false, err } @@ -150,16 +150,16 @@ func (j *MySQLBackupTestJig) waitForConditionOrFail(namespace, name string, time return false, nil } if err := wait.PollImmediate(Poll, timeout, pollFunc); err != nil { - Failf("Timed out waiting for MySQLBackup %q to %s", name, message) + Failf("Timed out waiting for Backup %q to %s", name, message) } return backup } // WaitForbackupReadyOrFail waits up to a given timeout for a backup to be in // the running phase. -func (j *MySQLBackupTestJig) WaitForbackupReadyOrFail(namespace, name string, timeout time.Duration) *v1alpha1.MySQLBackup { - Logf("Waiting up to %v for MySQLBackup \"%s/%s\" to be complete executing", timeout, namespace, name) - backup := j.waitForConditionOrFail(namespace, name, timeout, "to complete executing", func(backup *v1alpha1.MySQLBackup) bool { +func (j *BackupTestJig) WaitForbackupReadyOrFail(namespace, name string, timeout time.Duration) *v1alpha1.Backup { + Logf("Waiting up to %v for Backup \"%s/%s\" to be complete executing", timeout, namespace, name) + backup := j.waitForConditionOrFail(namespace, name, timeout, "to complete executing", func(backup *v1alpha1.Backup) bool { phase := backup.Status.Phase if phase == v1alpha1.BackupPhaseComplete { return true @@ -177,7 +177,7 @@ func (j *MySQLBackupTestJig) WaitForbackupReadyOrFail(namespace, name string, ti } Logf(e.String()) } - Failf("MySQLBackup entered state %q", v1alpha1.BackupPhaseFailed) + Failf("Backup entered state %q", v1alpha1.BackupPhaseFailed) } return false }) diff --git a/test/e2e/framework/cluster.go b/test/e2e/framework/cluster.go index ffab2e876..9b1183b74 100644 --- a/test/e2e/framework/cluster.go +++ b/test/e2e/framework/cluster.go @@ -39,8 +39,8 @@ import ( // TestDBName is the name of database to use when executing test SQL queries. const TestDBName = "testdb" -// MySQLClusterTestJig is a jig to help MySQLCluster testing. -type MySQLClusterTestJig struct { +// ClusterTestJig is a jig to help Cluster testing. +type ClusterTestJig struct { ID string Name string Labels map[string]string @@ -49,10 +49,10 @@ type MySQLClusterTestJig struct { KubeClient clientset.Interface } -// NewMySQLClusterTestJig allocates and inits a new MySQLClusterTestJig. -func NewMySQLClusterTestJig(mysqlClient mysqlclientset.Interface, kubeClient clientset.Interface, name string) *MySQLClusterTestJig { +// NewClusterTestJig allocates and inits a new ClusterTestJig. +func NewClusterTestJig(mysqlClient mysqlclientset.Interface, kubeClient clientset.Interface, name string) *ClusterTestJig { id := string(uuid.NewUUID()) - return &MySQLClusterTestJig{ + return &ClusterTestJig{ ID: id, Name: name, Labels: map[string]string{ @@ -65,56 +65,56 @@ func NewMySQLClusterTestJig(mysqlClient mysqlclientset.Interface, kubeClient cli } } -// newMySQLClusterTemplate returns the default v1.MySQLCluster template for this jig, but -// does not actually create the MySQLCluster. The default MySQLCluster has the same name +// newClusterTemplate returns the default v1.Cluster template for this jig, but +// does not actually create the Cluster. The default Cluster has the same name // as the jig and has the given number of replicas. -func (j *MySQLClusterTestJig) newMySQLClusterTemplate(namespace string, replicas int32) *v1.MySQLCluster { - return &v1.MySQLCluster{ +func (j *ClusterTestJig) newClusterTemplate(namespace string, replicas int32) *v1.Cluster { + return &v1.Cluster{ ObjectMeta: metav1.ObjectMeta{ Namespace: namespace, Name: j.Name, Labels: j.Labels, }, - Spec: v1.MySQLClusterSpec{ + Spec: v1.ClusterSpec{ Replicas: replicas, }, } } -// CreateMySQLClusterOrFail creates a new MySQLCluster based on the jig's -// defaults. Callers can provide a function to tweak the MySQLCluster object +// CreateClusterOrFail creates a new Cluster based on the jig's +// defaults. Callers can provide a function to tweak the Cluster object // before it is created. -func (j *MySQLClusterTestJig) CreateMySQLClusterOrFail(namespace string, replicas int32, tweak func(cluster *v1.MySQLCluster)) *v1.MySQLCluster { - cluster := j.newMySQLClusterTemplate(namespace, replicas) +func (j *ClusterTestJig) CreateClusterOrFail(namespace string, replicas int32, tweak func(cluster *v1.Cluster)) *v1.Cluster { + cluster := j.newClusterTemplate(namespace, replicas) if tweak != nil { tweak(cluster) } name := types.NamespacedName{Namespace: namespace, Name: j.Name} - By(fmt.Sprintf("Creating a MySQLCluster %q with .spec.replicas=%d", name, replicas)) + By(fmt.Sprintf("Creating a Cluster %q with .spec.replicas=%d", name, replicas)) - result, err := j.MySQLClient.MysqlV1alpha1().MySQLClusters(namespace).Create(cluster) + result, err := j.MySQLClient.MysqlV1alpha1().Clusters(namespace).Create(cluster) if err != nil { - Failf("Failed to create MySQLCluster %q: %v", name, err) + Failf("Failed to create Cluster %q: %v", name, err) } return result } -// CreateAndAwaitMySQLClusterOrFail creates a new MySQLCluster based on the +// CreateAndAwaitClusterOrFail creates a new Cluster based on the // jig's defaults, waits for it to become ready, and then sanity checks it and // its dependant resources. Callers can provide a function to tweak the -// MySQLCluster object before it is created. -func (j *MySQLClusterTestJig) CreateAndAwaitMySQLClusterOrFail(namespace string, replicas int32, tweak func(cluster *v1.MySQLCluster), timeout time.Duration) *v1.MySQLCluster { - cluster := j.CreateMySQLClusterOrFail(namespace, replicas, tweak) +// Cluster object before it is created. +func (j *ClusterTestJig) CreateAndAwaitClusterOrFail(namespace string, replicas int32, tweak func(cluster *v1.Cluster), timeout time.Duration) *v1.Cluster { + cluster := j.CreateClusterOrFail(namespace, replicas, tweak) cluster = j.WaitForClusterReadyOrFail(namespace, cluster.Name, timeout) - j.SanityCheckMySQLCluster(cluster) + j.SanityCheckCluster(cluster) return cluster } -func (j *MySQLClusterTestJig) waitForConditionOrFail(namespace, name string, timeout time.Duration, message string, conditionFn func(*v1.MySQLCluster) bool) *v1.MySQLCluster { - var cluster *v1.MySQLCluster +func (j *ClusterTestJig) waitForConditionOrFail(namespace, name string, timeout time.Duration, message string, conditionFn func(*v1.Cluster) bool) *v1.Cluster { + var cluster *v1.Cluster pollFunc := func() (bool, error) { - c, err := j.MySQLClient.MysqlV1alpha1().MySQLClusters(namespace).Get(name, metav1.GetOptions{}) + c, err := j.MySQLClient.MysqlV1alpha1().Clusters(namespace).Get(name, metav1.GetOptions{}) if err != nil { return false, err } @@ -125,17 +125,17 @@ func (j *MySQLClusterTestJig) waitForConditionOrFail(namespace, name string, tim return false, nil } if err := wait.PollImmediate(Poll, timeout, pollFunc); err != nil { - Failf("Timed out waiting for MySQLCluster %q to %s", name, message) + Failf("Timed out waiting for Cluster %q to %s", name, message) } return cluster } // WaitForClusterReadyOrFail waits up to a given timeout for a cluster to be in // the running phase. -func (j *MySQLClusterTestJig) WaitForClusterReadyOrFail(namespace, name string, timeout time.Duration) *v1.MySQLCluster { - Logf("Waiting up to %v for MySQLCluster \"%s/%s\" to be ready", timeout, namespace, name) - cluster := j.waitForConditionOrFail(namespace, name, timeout, "have all nodes ready", func(cluster *v1.MySQLCluster) bool { - if cluster.Status.Phase == v1.MySQLClusterRunning { +func (j *ClusterTestJig) WaitForClusterReadyOrFail(namespace, name string, timeout time.Duration) *v1.Cluster { + Logf("Waiting up to %v for Cluster \"%s/%s\" to be ready", timeout, namespace, name) + cluster := j.waitForConditionOrFail(namespace, name, timeout, "have all nodes ready", func(cluster *v1.Cluster) bool { + if cluster.Status.Phase == v1.ClusterPhaseRunning { return true } return false @@ -143,13 +143,13 @@ func (j *MySQLClusterTestJig) WaitForClusterReadyOrFail(namespace, name string, return cluster } -// SanityCheckMySQLCluster checks basic properties of a given MySQLCluster match +// SanityCheckCluster checks basic properties of a given Cluster match // our expectations. -func (j *MySQLClusterTestJig) SanityCheckMySQLCluster(cluster *v1.MySQLCluster) { +func (j *ClusterTestJig) SanityCheckCluster(cluster *v1.Cluster) { name := types.NamespacedName{Namespace: cluster.Namespace, Name: cluster.Name} ss, err := j.KubeClient.AppsV1beta1().StatefulSets(cluster.Namespace).Get(cluster.Name, metav1.GetOptions{}) if err != nil { - Failf("Failed to get StatefulSet %[1]q for MySQLCluster %[1]q: %[2]v", name, err) + Failf("Failed to get StatefulSet %[1]q for Cluster %[1]q: %[2]v", name, err) } if ss.Status.ReadyReplicas != cluster.Spec.Replicas { @@ -159,7 +159,7 @@ func (j *MySQLClusterTestJig) SanityCheckMySQLCluster(cluster *v1.MySQLCluster) // Do we have a service? _, err = j.KubeClient.CoreV1().Services(cluster.Namespace).Get(cluster.Name, metav1.GetOptions{}) if err != nil { - Failf("Failed to get Servce %[1]q for MySQLCluster %[1]q: %v", name, err) + Failf("Failed to get Servce %[1]q for Cluster %[1]q: %v", name, err) } // Do we have a root password secret? @@ -170,9 +170,9 @@ func (j *MySQLClusterTestJig) SanityCheckMySQLCluster(cluster *v1.MySQLCluster) } } -// ExecuteSQLOrDie executes the given SQL statement(s) on a specified MySQLCluster +// ExecuteSQLOrDie executes the given SQL statement(s) on a specified Cluster // member via kubectl exec. -func ExecuteSQL(cluster *v1.MySQLCluster, member, sql string) (string, error) { +func ExecuteSQL(cluster *v1.Cluster, member, sql string) (string, error) { cmd := fmt.Sprintf("mysql -h %s.%s -u root -p$MYSQL_ROOT_PASSWORD -e '%s'", member, cluster.Name, sql) return RunKubectl(fmt.Sprintf("--namespace=%v", cluster.Namespace), "exec", member, "-c", "mysql", @@ -185,7 +185,7 @@ func lastLine(out string) string { } // ReadSQLTest SELECTs v from testdb.foo where k=foo. -func ReadSQLTest(cluster *v1.MySQLCluster, member string) (string, error) { +func ReadSQLTest(cluster *v1.Cluster, member string) (string, error) { By("SELECT v FROM foo WHERE k=\"foo\"") output, err := ExecuteSQL(cluster, member, strings.Join([]string{ fmt.Sprintf("use %s;", TestDBName), @@ -200,7 +200,7 @@ func ReadSQLTest(cluster *v1.MySQLCluster, member string) (string, error) { // WriteSQLTest creates a test table, inserts a row, and writes a uuid into it. // It returns the generated UUID. -func WriteSQLTest(cluster *v1.MySQLCluster, member string) (string, error) { +func WriteSQLTest(cluster *v1.Cluster, member string) (string, error) { By("Creating a database and table, writing to that table, and writing a uuid") id := uuid.NewUUID() if _, err := ExecuteSQL(cluster, member, strings.Join([]string{ diff --git a/test/e2e/framework/restore.go b/test/e2e/framework/restore.go index b272d7ac2..db1b99909 100644 --- a/test/e2e/framework/restore.go +++ b/test/e2e/framework/restore.go @@ -31,8 +31,8 @@ import ( mysqlclientset "github.com/oracle/mysql-operator/pkg/generated/clientset/versioned" ) -// MySQLRestoreTestJig is a jig to help MySQLRestore testing. -type MySQLRestoreTestJig struct { +// RestoreTestJig is a jig to help Restore testing. +type RestoreTestJig struct { ID string Name string Labels map[string]string @@ -41,10 +41,10 @@ type MySQLRestoreTestJig struct { KubeClient clientset.Interface } -// NewMySQLRestoreTestJig allocates and inits a new MySQLRestoreTestJig. -func NewMySQLRestoreTestJig(mysqlClient mysqlclientset.Interface, kubeClient clientset.Interface, name string) *MySQLRestoreTestJig { +// NewRestoreTestJig allocates and inits a new RestoreTestJig. +func NewRestoreTestJig(mysqlClient mysqlclientset.Interface, kubeClient clientset.Interface, name string) *RestoreTestJig { id := string(uuid.NewUUID()) - return &MySQLRestoreTestJig{ + return &RestoreTestJig{ ID: id, Name: name, Labels: map[string]string{ @@ -57,11 +57,11 @@ func NewMySQLRestoreTestJig(mysqlClient mysqlclientset.Interface, kubeClient cli } } -// newMySQLRestoreTemplate returns the default v1alpha1.MySQLRestore template for this jig, but -// does not actually create the MySQLRestore. The default MySQLRestore has the +// newRestoreTemplate returns the default v1alpha1.Restore template for this jig, but +// does not actually create the Restore. The default Restore has the // same name as the jig. -func (j *MySQLRestoreTestJig) newMySQLRestoreTemplate(namespace, clusterName, backupName string) *v1alpha1.MySQLRestore { - return &v1alpha1.MySQLRestore{ +func (j *RestoreTestJig) newRestoreTemplate(namespace, clusterName, backupName string) *v1alpha1.Restore { + return &v1alpha1.Restore{ ObjectMeta: metav1.ObjectMeta{ GenerateName: j.Name, Namespace: namespace, @@ -78,37 +78,37 @@ func (j *MySQLRestoreTestJig) newMySQLRestoreTemplate(namespace, clusterName, ba } } -// CreateMySQLRestoreOrFail creates a new MySQLRestore based on the jig's -// defaults. Callers can provide a function to tweak the MySQLRestore object +// CreateRestoreOrFail creates a new Restore based on the jig's +// defaults. Callers can provide a function to tweak the Restore object // before it is created. -func (j *MySQLRestoreTestJig) CreateMySQLRestoreOrFail(namespace, clusterName, backupName string, tweak func(restore *v1alpha1.MySQLRestore)) *v1alpha1.MySQLRestore { - restore := j.newMySQLRestoreTemplate(namespace, clusterName, backupName) +func (j *RestoreTestJig) CreateRestoreOrFail(namespace, clusterName, backupName string, tweak func(restore *v1alpha1.Restore)) *v1alpha1.Restore { + restore := j.newRestoreTemplate(namespace, clusterName, backupName) if tweak != nil { tweak(restore) } name := types.NamespacedName{Namespace: namespace, Name: j.Name} - By(fmt.Sprintf("Creating a MySQLRestore %q", name)) + By(fmt.Sprintf("Creating a Restore %q", name)) - result, err := j.MySQLClient.MysqlV1alpha1().MySQLRestores(namespace).Create(restore) + result, err := j.MySQLClient.MysqlV1alpha1().Restores(namespace).Create(restore) if err != nil { - Failf("Failed to create MySQLRestore %q: %v", name, err) + Failf("Failed to create Restore %q: %v", name, err) } return result } -// CreateAndAwaitMySQLRestoreOrFail creates a new MySQLRestore based on the +// CreateAndAwaitRestoreOrFail creates a new Restore based on the // jig's defaults, waits for it to become ready. Callers can provide a function -// to tweak the MySQLRestore object before it is created. -func (j *MySQLRestoreTestJig) CreateAndAwaitMySQLRestoreOrFail(namespace, clusterName, backupName string, tweak func(restore *v1alpha1.MySQLRestore), timeout time.Duration) *v1alpha1.MySQLRestore { - restore := j.CreateMySQLRestoreOrFail(namespace, clusterName, backupName, tweak) +// to tweak the Restore object before it is created. +func (j *RestoreTestJig) CreateAndAwaitRestoreOrFail(namespace, clusterName, backupName string, tweak func(restore *v1alpha1.Restore), timeout time.Duration) *v1alpha1.Restore { + restore := j.CreateRestoreOrFail(namespace, clusterName, backupName, tweak) restore = j.WaitForRestoreCompleteOrFail(namespace, restore.Name, timeout) return restore } // CreateS3AuthSecret creates a secret containing the S3 (compat.) credentials // for storing backups. -func (j *MySQLRestoreTestJig) CreateS3AuthSecret(namespace, name string) (*corev1.Secret, error) { +func (j *RestoreTestJig) CreateS3AuthSecret(namespace, name string) (*corev1.Secret, error) { return j.KubeClient.CoreV1().Secrets(namespace).Create(&corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -121,10 +121,10 @@ func (j *MySQLRestoreTestJig) CreateS3AuthSecret(namespace, name string) (*corev }) } -func (j *MySQLRestoreTestJig) waitForConditionOrFail(namespace, name string, timeout time.Duration, message string, conditionFn func(*v1alpha1.MySQLRestore) bool) *v1alpha1.MySQLRestore { - var restore *v1alpha1.MySQLRestore +func (j *RestoreTestJig) waitForConditionOrFail(namespace, name string, timeout time.Duration, message string, conditionFn func(*v1alpha1.Restore) bool) *v1alpha1.Restore { + var restore *v1alpha1.Restore pollFunc := func() (bool, error) { - r, err := j.MySQLClient.MysqlV1alpha1().MySQLRestores(namespace).Get(name, metav1.GetOptions{}) + r, err := j.MySQLClient.MysqlV1alpha1().Restores(namespace).Get(name, metav1.GetOptions{}) if err != nil { return false, err } @@ -135,16 +135,16 @@ func (j *MySQLRestoreTestJig) waitForConditionOrFail(namespace, name string, tim return false, nil } if err := wait.PollImmediate(Poll, timeout, pollFunc); err != nil { - Failf("Timed out waiting for MySQLRestore %q to %s", name, message) + Failf("Timed out waiting for Restore %q to %s", name, message) } return restore } -// WaitForRestoreCompleteOrFail waits up to a given timeout for a MySQLRestore +// WaitForRestoreCompleteOrFail waits up to a given timeout for a Restore // to enter the complete phase. -func (j *MySQLRestoreTestJig) WaitForRestoreCompleteOrFail(namespace, name string, timeout time.Duration) *v1alpha1.MySQLRestore { - Logf("Waiting up to %v for MySQLRestore \"%s/%s\" to be complete executing", timeout, namespace, name) - restore := j.waitForConditionOrFail(namespace, name, timeout, "to complete executing", func(restore *v1alpha1.MySQLRestore) bool { +func (j *RestoreTestJig) WaitForRestoreCompleteOrFail(namespace, name string, timeout time.Duration) *v1alpha1.Restore { + Logf("Waiting up to %v for Restore \"%s/%s\" to be complete executing", timeout, namespace, name) + restore := j.waitForConditionOrFail(namespace, name, timeout, "to complete executing", func(restore *v1alpha1.Restore) bool { phase := restore.Status.Phase if phase == v1alpha1.RestorePhaseComplete { return true @@ -162,7 +162,7 @@ func (j *MySQLRestoreTestJig) WaitForRestoreCompleteOrFail(namespace, name strin } Logf(e.String()) } - Failf("MySQLRestore entered state %q", v1alpha1.RestorePhaseFailed) + Failf("Restore entered state %q", v1alpha1.RestorePhaseFailed) } return false }) diff --git a/test/e2e/pod_crash.go b/test/e2e/pod_crash.go index 9f8d0ece1..e673795fa 100644 --- a/test/e2e/pod_crash.go +++ b/test/e2e/pod_crash.go @@ -38,14 +38,14 @@ var _ = Describe("Pod crash", func() { mcs = f.MySQLClientSet }) - It("should be the case that single-primary MySQLClusters recover from Pods crashing", func() { + It("should be the case that single-primary Clusters recover from Pods crashing", func() { clusterName := "pod-crash" ns := f.Namespace.Name grace := int64(0) // kill don't gracefully terminate - jig := framework.NewMySQLClusterTestJig(mcs, cs, clusterName) + jig := framework.NewClusterTestJig(mcs, cs, clusterName) - cluster := jig.CreateAndAwaitMySQLClusterOrFail(ns, 3, nil, framework.DefaultTimeout) + cluster := jig.CreateAndAwaitClusterOrFail(ns, 3, nil, framework.DefaultTimeout) primary := framework.GetReadyPrimaryPodName(cs, ns, cluster.Name) @@ -79,14 +79,14 @@ var _ = Describe("Pod crash", func() { Expect(actual).To(Equal(expected)) }) - It("should be the case that multi-primary MySQLClusters recover from Pods crashing", func() { + It("should be the case that multi-primary Clusters recover from Pods crashing", func() { clusterName := "pod-crash" ns := f.Namespace.Name grace := int64(0) // kill don't gracefully terminate - jig := framework.NewMySQLClusterTestJig(mcs, cs, clusterName) + jig := framework.NewClusterTestJig(mcs, cs, clusterName) - cluster := jig.CreateAndAwaitMySQLClusterOrFail(ns, 3, func(cluster *v1alpha1.MySQLCluster) { + cluster := jig.CreateAndAwaitClusterOrFail(ns, 3, func(cluster *v1alpha1.Cluster) { cluster.Spec.MultiMaster = true }, framework.DefaultTimeout) diff --git a/test/examples/examples_test.go b/test/examples/examples_test.go index cd6f8a947..04f193267 100644 --- a/test/examples/examples_test.go +++ b/test/examples/examples_test.go @@ -20,27 +20,27 @@ func TestRemoveInstanceFromCluster(t *testing.T) { kind := getKind(t, file) t.Logf("validating file: %s of kind: %v", file, kind) switch kind { - case "MySQLCluster": - validateMySQLCluster(t, file) - case "MySQLBackup": - validateMySQLBackup(t, file) - case "MySQLRestore": - validateMySQLRestore(t, file) - case "MySQLBackupSchedule": - validateMySQLBackupSchedule(t, file) + case "Cluster": + validateCluster(t, file) + case "Backup": + validateBackup(t, file) + case "Restore": + validateRestore(t, file) + case "BackupSchedule": + validateBackupSchedule(t, file) default: t.Logf("ignoring file: %s of kind: %v", file, kind) } } } -func validateMySQLCluster(t *testing.T, file string) { +func validateCluster(t *testing.T, file string) { bytes, err := ioutil.ReadFile(file) if err != nil { t.Errorf("Failed to read file: %s, err: %v", file, err) return } - var r v1alpha1.MySQLCluster + var r v1alpha1.Cluster err = yaml.Unmarshal(bytes, &r) if err != nil { t.Errorf("Failed to parse file: %s, err: %v", file, err) @@ -54,20 +54,20 @@ func validateMySQLCluster(t *testing.T, file string) { } } -func validateMySQLBackup(t *testing.T, file string) { +func validateBackup(t *testing.T, file string) { bytes, err := ioutil.ReadFile(file) if err != nil { t.Errorf("Failed to read file: %s, err: %v", file, err) return } - var r v1alpha1.MySQLBackup + var r v1alpha1.Backup err = yaml.Unmarshal(bytes, &r) if err != nil { t.Errorf("Failed to parse file: %s, err: %v", file, err) return } - r.Spec.ClusterRef = &corev1.LocalObjectReference{} - r.Spec.Storage.SecretRef = &corev1.LocalObjectReference{Name: "test"} + r.Spec.Cluster = &corev1.LocalObjectReference{} + r.Spec.StorageProvider.SecretRef = &corev1.LocalObjectReference{Name: "test"} resource := r.EnsureDefaults() err = resource.Validate() if err != nil { @@ -76,13 +76,13 @@ func validateMySQLBackup(t *testing.T, file string) { } } -func validateMySQLRestore(t *testing.T, file string) { +func validateRestore(t *testing.T, file string) { bytes, err := ioutil.ReadFile(file) if err != nil { t.Errorf("Failed to read file: %s, err: %v", file, err) return } - var r v1alpha1.MySQLRestore + var r v1alpha1.Restore err = yaml.Unmarshal(bytes, &r) if err != nil { t.Errorf("Failed to parse file: %s, err: %v", file, err) @@ -96,13 +96,13 @@ func validateMySQLRestore(t *testing.T, file string) { } } -func validateMySQLBackupSchedule(t *testing.T, file string) { +func validateBackupSchedule(t *testing.T, file string) { bytes, err := ioutil.ReadFile(file) if err != nil { t.Errorf("Failed to read file: %s, err: %v", file, err) return } - var r v1alpha1.MySQLBackupSchedule + var r v1alpha1.BackupSchedule err = yaml.Unmarshal(bytes, &r) if err != nil { t.Errorf("Failed to parse file: %s, err: %v", file, err) From 8125cfd4ee1ee2e59d3a80ec4cfad1fb9acb427a Mon Sep 17 00:00:00 2001 From: Andrew Pryde Date: Mon, 4 Jun 2018 14:27:33 +0100 Subject: [PATCH 02/15] Bump dependencies to track Kubernetes 1.10 --- Gopkg.lock | 75 +- Gopkg.toml | 19 +- contrib/manifests/rbac.yaml | 8 +- pkg/apis/mysql/v1alpha1/types.go | 24 +- vendor/github.com/google/btree/.travis.yml | 1 - vendor/github.com/google/btree/LICENSE | 202 - vendor/github.com/google/btree/README.md | 12 - vendor/github.com/google/btree/btree.go | 821 --- vendor/github.com/google/btree/btree_mem.go | 76 - vendor/github.com/google/btree/btree_test.go | 689 --- .../gregjones/httpcache/.travis.yml | 18 - .../gregjones/httpcache/LICENSE.txt | 7 - .../github.com/gregjones/httpcache/README.md | 24 - .../httpcache/diskcache/diskcache.go | 61 - .../httpcache/diskcache/diskcache_test.go | 42 - .../gregjones/httpcache/httpcache.go | 557 -- .../gregjones/httpcache/httpcache_test.go | 1384 ----- .../httpcache/leveldbcache/leveldbcache.go | 51 - .../leveldbcache/leveldbcache_test.go | 46 - .../gregjones/httpcache/memcache/appengine.go | 61 - .../httpcache/memcache/appengine_test.go | 44 - .../gregjones/httpcache/memcache/memcache.go | 60 - .../httpcache/memcache/memcache_test.go | 47 - .../gregjones/httpcache/redis/redis.go | 43 - .../gregjones/httpcache/redis/redis_test.go | 43 - vendor/github.com/juju/ratelimit/LICENSE | 191 - vendor/github.com/juju/ratelimit/README.md | 117 - vendor/github.com/juju/ratelimit/ratelimit.go | 284 - .../juju/ratelimit/ratelimit_test.go | 389 -- vendor/github.com/juju/ratelimit/reader.go | 51 - vendor/github.com/petar/GoLLRB/.gitignore | 23 - vendor/github.com/petar/GoLLRB/AUTHORS | 4 - vendor/github.com/petar/GoLLRB/LICENSE | 27 - vendor/github.com/petar/GoLLRB/README.md | 66 - .../petar/GoLLRB/doc/Sedgewick-LLRB.pdf | Bin 819932 -> 0 bytes .../GoLLRB/doc/Sedgewick-RedBlackBST.java | 475 -- .../GoLLRB/doc/Sedgewick-Talk-Penn2008.pdf | Bin 11636171 -> 0 bytes vendor/github.com/petar/GoLLRB/example/ex1.go | 26 - vendor/github.com/petar/GoLLRB/llrb/avgvar.go | 39 - .../github.com/petar/GoLLRB/llrb/iterator.go | 93 - .../petar/GoLLRB/llrb/iterator_test.go | 76 - .../petar/GoLLRB/llrb/llrb-stats.go | 46 - vendor/github.com/petar/GoLLRB/llrb/llrb.go | 456 -- .../github.com/petar/GoLLRB/llrb/llrb_test.go | 239 - vendor/github.com/petar/GoLLRB/llrb/util.go | 17 - vendor/github.com/peterbourgon/diskv/LICENSE | 19 - .../github.com/peterbourgon/diskv/README.md | 141 - .../peterbourgon/diskv/basic_test.go | 336 -- .../peterbourgon/diskv/compression.go | 64 - .../peterbourgon/diskv/compression_test.go | 72 - vendor/github.com/peterbourgon/diskv/diskv.go | 624 --- .../examples/content-addressable-store/cas.go | 63 - .../super-simple-store/super-simple-store.go | 30 - .../peterbourgon/diskv/import_test.go | 76 - vendor/github.com/peterbourgon/diskv/index.go | 115 - .../peterbourgon/diskv/index_test.go | 148 - .../peterbourgon/diskv/issues_test.go | 121 - .../peterbourgon/diskv/keys_test.go | 231 - .../peterbourgon/diskv/speed_test.go | 153 - .../peterbourgon/diskv/stream_test.go | 117 - vendor/golang.org/x/time/AUTHORS | 3 + vendor/golang.org/x/time/CONTRIBUTING.md | 26 + vendor/golang.org/x/time/CONTRIBUTORS | 3 + vendor/golang.org/x/time/LICENSE | 27 + vendor/golang.org/x/time/PATENTS | 22 + vendor/golang.org/x/time/README.md | 17 + vendor/golang.org/x/time/rate/rate.go | 384 ++ vendor/golang.org/x/time/rate/rate_go16.go | 21 + vendor/golang.org/x/time/rate/rate_go17.go | 21 + vendor/golang.org/x/time/rate/rate_test.go | 459 ++ .../api/.github/PULL_REQUEST_TEMPLATE.md | 2 + vendor/k8s.io/api/CONTRIBUTING.md | 7 + vendor/k8s.io/api/Godeps/Godeps.json | 396 +- vendor/k8s.io/api/Godeps/OWNERS | 2 + vendor/k8s.io/api/OWNERS | 1 - .../v1beta1/zz_generated.deepcopy.go | 5 +- .../v1alpha1/zz_generated.deepcopy.go | 8 +- .../v1beta1/generated.proto | 8 +- .../admissionregistration/v1beta1/types.go | 14 +- .../v1beta1/types_swagger_doc_generated.go | 4 +- .../v1beta1/zz_generated.deepcopy.go | 14 +- vendor/k8s.io/api/apps/OWNERS | 1 - vendor/k8s.io/api/apps/v1/generated.proto | 2 +- vendor/k8s.io/api/apps/v1/types.go | 2 +- .../apps/v1/types_swagger_doc_generated.go | 2 +- .../api/apps/v1/zz_generated.deepcopy.go | 32 +- .../api/apps/v1beta1/zz_generated.deepcopy.go | 26 +- .../api/apps/v1beta2/zz_generated.deepcopy.go | 35 +- vendor/k8s.io/api/authentication/OWNERS | 1 - vendor/k8s.io/api/authentication/v1/BUILD | 1 + .../api/authentication/v1/generated.pb.go | 962 +++- .../api/authentication/v1/generated.proto | 61 + .../k8s.io/api/authentication/v1/register.go | 1 + vendor/k8s.io/api/authentication/v1/types.go | 61 + .../v1/types_swagger_doc_generated.go | 41 + .../v1/zz_generated.deepcopy.go | 133 +- .../v1beta1/zz_generated.deepcopy.go | 33 +- vendor/k8s.io/api/authorization/OWNERS | 1 - .../authorization/v1/zz_generated.deepcopy.go | 42 +- .../v1beta1/zz_generated.deepcopy.go | 42 +- vendor/k8s.io/api/autoscaling/OWNERS | 1 - .../k8s.io/api/autoscaling/v1/generated.pb.go | 1006 +++- .../k8s.io/api/autoscaling/v1/generated.proto | 65 +- vendor/k8s.io/api/autoscaling/v1/types.go | 63 +- .../v1/types_swagger_doc_generated.go | 30 +- .../autoscaling/v1/zz_generated.deepcopy.go | 115 +- .../api/autoscaling/v2beta1/generated.pb.go | 995 +++- .../api/autoscaling/v2beta1/generated.proto | 66 +- .../k8s.io/api/autoscaling/v2beta1/types.go | 64 +- .../v2beta1/types_swagger_doc_generated.go | 30 +- .../v2beta1/zz_generated.deepcopy.go | 112 +- vendor/k8s.io/api/batch/OWNERS | 1 - .../api/batch/v1/zz_generated.deepcopy.go | 14 +- .../batch/v1beta1/zz_generated.deepcopy.go | 15 +- .../batch/v2alpha1/zz_generated.deepcopy.go | 15 +- vendor/k8s.io/api/certificates/OWNERS | 1 - .../k8s.io/api/certificates/v1beta1/types.go | 2 +- .../v1beta1/zz_generated.deepcopy.go | 36 +- vendor/k8s.io/api/code-of-conduct.md | 3 + vendor/k8s.io/api/core/v1/BUILD | 3 +- vendor/k8s.io/api/core/v1/generated.pb.go | 4641 +++++++++++------ vendor/k8s.io/api/core/v1/generated.proto | 158 +- vendor/k8s.io/api/core/v1/register.go | 2 - vendor/k8s.io/api/core/v1/types.go | 169 +- .../core/v1/types_swagger_doc_generated.go | 69 +- .../api/core/v1/zz_generated.deepcopy.go | 328 +- .../k8s.io/api/events/v1beta1/generated.proto | 2 +- vendor/k8s.io/api/events/v1beta1/types.go | 2 +- .../v1beta1/types_swagger_doc_generated.go | 2 +- .../events/v1beta1/zz_generated.deepcopy.go | 8 +- vendor/k8s.io/api/extensions/OWNERS | 1 - .../v1beta1/zz_generated.deepcopy.go | 47 +- .../v1alpha1/zz_generated.deepcopy.go | 5 +- .../networking/v1/zz_generated.deepcopy.go | 8 +- vendor/k8s.io/api/policy/OWNERS | 4 + vendor/k8s.io/api/policy/v1beta1/BUILD | 1 + .../k8s.io/api/policy/v1beta1/generated.pb.go | 3526 +++++++++++-- .../k8s.io/api/policy/v1beta1/generated.proto | 193 + vendor/k8s.io/api/policy/v1beta1/register.go | 2 + vendor/k8s.io/api/policy/v1beta1/types.go | 253 + .../v1beta1/types_swagger_doc_generated.go | 124 + .../policy/v1beta1/zz_generated.deepcopy.go | 295 +- vendor/k8s.io/api/rbac/OWNERS | 1 - .../api/rbac/v1/zz_generated.deepcopy.go | 26 +- .../rbac/v1alpha1/zz_generated.deepcopy.go | 26 +- .../api/rbac/v1beta1/zz_generated.deepcopy.go | 26 +- .../api/scheduling/v1alpha1/generated.proto | 7 +- .../k8s.io/api/scheduling/v1alpha1/types.go | 7 +- .../v1alpha1/types_swagger_doc_generated.go | 6 +- .../v1alpha1/zz_generated.deepcopy.go | 8 +- .../v1alpha1/zz_generated.deepcopy.go | 8 +- .../api/storage/v1/zz_generated.deepcopy.go | 8 +- .../storage/v1alpha1/zz_generated.deepcopy.go | 8 +- .../api/storage/v1beta1/generated.pb.go | 1579 +++++- .../api/storage/v1beta1/generated.proto | 97 + vendor/k8s.io/api/storage/v1beta1/register.go | 3 + vendor/k8s.io/api/storage/v1beta1/types.go | 107 + .../v1beta1/types_swagger_doc_generated.go | 63 + .../storage/v1beta1/zz_generated.deepcopy.go | 167 +- .../.github/PULL_REQUEST_TEMPLATE.md | 2 + vendor/k8s.io/apiserver/Godeps/Godeps.json | 970 ++-- vendor/k8s.io/apiserver/Godeps/OWNERS | 4 + vendor/k8s.io/apiserver/OWNERS | 1 - vendor/k8s.io/apiserver/README.md | 2 +- vendor/k8s.io/apiserver/code-of-conduct.md | 3 + vendor/k8s.io/apiserver/hack/godep-deps.sh | 78 - .../apiserver/hack/sync-from-kubernetes.sh | 73 - vendor/k8s.io/apiserver/pkg/admission/BUILD | 5 +- .../k8s.io/apiserver/pkg/admission/config.go | 59 +- .../apiserver/pkg/admission/config_test.go | 103 +- .../pkg/admission/configuration/BUILD | 11 +- .../configuration/mutating_webhook_manager.go | 88 +- .../mutating_webhook_manager_test.go | 105 +- .../validating_webhook_manager.go | 80 +- .../validating_webhook_manager_test.go | 105 +- .../apiserver/pkg/admission/decorator.go | 39 + .../apiserver/pkg/admission/initializer/BUILD | 1 - .../apiserver/pkg/admission/metrics/BUILD | 3 +- .../pkg/admission/metrics/metrics_test.go | 16 +- .../pkg/admission/plugin/initialization/BUILD | 3 +- .../plugin/namespace/lifecycle/BUILD | 3 +- .../plugin/namespace/lifecycle/admission.go | 15 +- .../pkg/admission/plugin/webhook/config/BUILD | 4 +- .../v1alpha1/zz_generated.conversion.go | 2 +- .../v1alpha1/zz_generated.deepcopy.go | 5 +- .../v1alpha1/zz_generated.defaults.go | 2 +- .../webhookadmission/zz_generated.deepcopy.go | 5 +- .../plugin/webhook/config/authentication.go | 37 +- .../admission/plugin/webhook/config/client.go | 18 +- .../pkg/admission/plugin/webhook/errors/BUILD | 3 +- .../plugin/webhook/initializer/BUILD | 3 +- .../plugin/webhook/initializer/initializer.go | 2 +- .../webhook/initializer/initializer_test.go | 2 - .../admission/plugin/webhook/mutating/BUILD | 6 +- .../plugin/webhook/mutating/admission.go | 56 +- .../plugin/webhook/mutating/admission_test.go | 14 +- .../admission/plugin/webhook/namespace/BUILD | 3 +- .../plugin/webhook/namespace/matcher.go | 4 +- .../plugin/webhook/namespace/matcher_test.go | 6 +- .../pkg/admission/plugin/webhook/rules/BUILD | 3 +- .../admission/plugin/webhook/rules/rules.go | 12 + .../admission/plugin/webhook/validating/BUILD | 8 +- .../plugin/webhook/validating/admission.go | 55 +- .../webhook/validating/admission_test.go | 14 +- .../admission/plugin/webhook/versioned/BUILD | 3 +- .../k8s.io/apiserver/pkg/admission/plugins.go | 18 +- .../apiserver/pkg/apis/apiserver/types.go | 2 +- .../pkg/apis/apiserver/v1alpha1/BUILD | 1 - .../pkg/apis/apiserver/v1alpha1/conversion.go | 88 - .../pkg/apis/apiserver/v1alpha1/types.go | 2 +- .../v1alpha1/zz_generated.conversion.go | 36 +- .../v1alpha1/zz_generated.deepcopy.go | 15 +- .../v1alpha1/zz_generated.defaults.go | 2 +- .../apis/apiserver/zz_generated.deepcopy.go | 17 +- .../apiserver/pkg/apis/audit/install/BUILD | 3 +- .../k8s.io/apiserver/pkg/apis/audit/types.go | 25 +- .../apiserver/pkg/apis/audit/v1alpha1/BUILD | 4 +- .../pkg/apis/audit/v1alpha1/generated.pb.go | 317 +- .../pkg/apis/audit/v1alpha1/generated.proto | 25 +- .../pkg/apis/audit/v1alpha1/types.go | 25 +- .../audit/v1alpha1/zz_generated.conversion.go | 7 +- .../audit/v1alpha1/zz_generated.deepcopy.go | 21 +- .../audit/v1alpha1/zz_generated.defaults.go | 2 +- .../apiserver/pkg/apis/audit/v1beta1/BUILD | 4 +- .../pkg/apis/audit/v1beta1/generated.pb.go | 318 +- .../pkg/apis/audit/v1beta1/generated.proto | 25 +- .../apiserver/pkg/apis/audit/v1beta1/types.go | 27 +- .../audit/v1beta1/zz_generated.conversion.go | 7 +- .../audit/v1beta1/zz_generated.deepcopy.go | 21 +- .../audit/v1beta1/zz_generated.defaults.go | 2 +- .../apiserver/pkg/apis/audit/validation/BUILD | 3 +- .../pkg/apis/audit/zz_generated.deepcopy.go | 47 +- .../apiserver/pkg/apis/example/install/BUILD | 3 +- .../apiserver/pkg/apis/example/v1/BUILD | 1 - .../pkg/apis/example/v1/generated.proto | 2 +- .../apiserver/pkg/apis/example/v1/types.go | 2 +- .../example/v1/zz_generated.conversion.go | 5 +- .../apis/example/v1/zz_generated.deepcopy.go | 12 +- .../apis/example/v1/zz_generated.defaults.go | 2 +- .../pkg/apis/example/zz_generated.deepcopy.go | 15 +- .../apiserver/pkg/apis/example2/install/BUILD | 3 +- .../apiserver/pkg/apis/example2/v1/BUILD | 1 - .../example2/v1/zz_generated.conversion.go | 2 +- .../apis/example2/v1/zz_generated.deepcopy.go | 5 +- .../apis/example2/v1/zz_generated.defaults.go | 2 +- .../apis/example2/zz_generated.deepcopy.go | 2 +- vendor/k8s.io/apiserver/pkg/audit/BUILD | 9 +- .../k8s.io/apiserver/pkg/audit/policy/BUILD | 3 +- .../apiserver/pkg/audit/policy/checker.go | 33 +- .../pkg/audit/policy/checker_test.go | 32 + vendor/k8s.io/apiserver/pkg/audit/request.go | 49 +- .../apiserver/pkg/audit/request_test.go | 38 + vendor/k8s.io/apiserver/pkg/audit/union.go | 11 + .../apiserver/pkg/authentication/group/BUILD | 3 +- .../authentication/request/anonymous/BUILD | 3 +- .../authentication/request/bearertoken/BUILD | 3 +- .../request/headerrequest/BUILD | 3 +- .../pkg/authentication/request/union/BUILD | 3 +- .../authentication/request/websocket/BUILD | 3 +- .../pkg/authentication/request/x509/BUILD | 3 +- .../pkg/authentication/serviceaccount/BUILD | 3 +- .../pkg/authentication/token/cache/BUILD | 3 +- .../authentication/token/cache/cache_test.go | 4 +- .../pkg/authentication/token/tokenfile/BUILD | 3 +- .../pkg/authentication/token/union/BUILD | 3 +- .../authorization/authorizer/interfaces.go | 2 +- .../pkg/authorization/authorizerfactory/BUILD | 3 +- .../apiserver/pkg/authorization/union/BUILD | 3 +- .../pkg/authorization/union/union.go | 2 +- vendor/k8s.io/apiserver/pkg/endpoints/BUILD | 8 +- .../apiserver/pkg/endpoints/apiserver_test.go | 217 +- .../apiserver/pkg/endpoints/discovery/BUILD | 3 +- .../apiserver/pkg/endpoints/filters/BUILD | 3 +- .../apiserver/pkg/endpoints/filters/audit.go | 2 +- .../pkg/endpoints/filters/audit_test.go | 2 +- .../pkg/endpoints/filters/authentication.go | 5 +- .../pkg/endpoints/filters/authorization.go | 1 + .../apiserver/pkg/endpoints/handlers/BUILD | 11 +- .../pkg/endpoints/handlers/create.go | 2 +- .../pkg/endpoints/handlers/delete.go | 4 +- .../pkg/endpoints/handlers/negotiation/BUILD | 3 +- .../pkg/endpoints/handlers/negotiation/doc.go | 2 +- .../endpoints/handlers/negotiation/errors.go | 4 +- .../handlers/negotiation/negotiate.go | 55 +- .../handlers/negotiation/negotiate_test.go | 2 +- .../apiserver/pkg/endpoints/handlers/patch.go | 40 +- .../apiserver/pkg/endpoints/handlers/proxy.go | 285 - .../pkg/endpoints/handlers/response.go | 32 +- .../endpoints/handlers/responsewriters/BUILD | 3 +- .../apiserver/pkg/endpoints/handlers/rest.go | 6 +- .../pkg/endpoints/handlers/rest_test.go | 3 +- .../pkg/endpoints/handlers/update.go | 2 +- .../apiserver/pkg/endpoints/installer.go | 79 +- .../apiserver/pkg/endpoints/metrics/BUILD | 3 +- .../pkg/endpoints/metrics/metrics.go | 66 +- .../apiserver/pkg/endpoints/openapi/BUILD | 3 +- .../openapi/testing/zz_generated.deepcopy.go | 5 +- .../apiserver/pkg/endpoints/proxy_test.go | 570 -- .../apiserver/pkg/endpoints/request/BUILD | 10 +- .../pkg/endpoints/request/context.go | 7 +- .../pkg/endpoints/request/requestinfo.go | 3 +- .../pkg/endpoints/request/requestinfo_test.go | 3 +- .../apiserver/pkg/endpoints/testing/OWNERS | 1 - .../testing/zz_generated.deepcopy.go | 17 +- .../apiserver/pkg/registry/generic/OWNERS | 1 - .../apiserver/pkg/registry/generic/options.go | 3 + .../pkg/registry/generic/registry/BUILD | 7 +- .../pkg/registry/generic/registry/store.go | 43 +- .../registry/generic/registry/store_test.go | 5 +- .../apiserver/pkg/registry/generic/rest/BUILD | 3 +- .../generic/rest/response_checker_test.go | 2 +- .../k8s.io/apiserver/pkg/registry/rest/BUILD | 5 +- .../k8s.io/apiserver/pkg/registry/rest/OWNERS | 1 - .../apiserver/pkg/registry/rest/rest.go | 25 +- .../pkg/registry/rest/resttest/resttest.go | 4 +- .../apiserver/pkg/registry/rest/table.go | 10 +- .../registry/rest/zz_generated.deepcopy.go | 5 +- vendor/k8s.io/apiserver/pkg/server/BUILD | 41 +- vendor/k8s.io/apiserver/pkg/server/config.go | 97 +- .../apiserver/pkg/server/config_test.go | 4 - .../k8s.io/apiserver/pkg/server/filters/BUILD | 4 +- .../pkg/server/filters/compression.go | 1 + .../pkg/server/filters/compression_test.go | 2 +- .../apiserver/pkg/server/filters/cors_test.go | 61 +- .../pkg/server/filters/longrunning.go | 6 +- .../pkg/server/filters/maxinflight.go | 86 +- .../apiserver/pkg/server/filters/timeout.go | 4 +- .../apiserver/pkg/server/filters/waitgroup.go | 2 +- .../apiserver/pkg/server/filters/wrap.go | 4 +- .../apiserver/pkg/server/genericapiserver.go | 2 +- .../pkg/server/genericapiserver_test.go | 38 +- vendor/k8s.io/apiserver/pkg/server/handler.go | 3 +- .../k8s.io/apiserver/pkg/server/healthz/BUILD | 3 +- .../k8s.io/apiserver/pkg/server/httplog/BUILD | 3 +- vendor/k8s.io/apiserver/pkg/server/mux/BUILD | 3 +- .../k8s.io/apiserver/pkg/server/options/BUILD | 14 +- .../apiserver/pkg/server/options/admission.go | 147 +- .../pkg/server/options/admission_test.go | 195 +- .../pkg/server/options/api_enablement.go | 111 + .../apiserver/pkg/server/options/audit.go | 269 +- .../pkg/server/options/audit_test.go | 172 + .../pkg/server/options/authentication.go | 17 +- .../pkg/server/options/authorization.go | 2 +- .../pkg/server/options/encryptionconfig/BUILD | 5 +- .../server/options/encryptionconfig/config.go | 21 +- .../options/encryptionconfig/config_test.go | 69 +- .../options/encryptionconfig/plugins.go | 118 - .../server/options/encryptionconfig/types.go | 4 +- .../apiserver/pkg/server/options/etcd.go | 17 +- .../pkg/server/options/recommended.go | 49 +- .../apiserver/pkg/server/options/serving.go | 130 +- .../pkg/server/options/serving_test.go | 6 +- .../server/options/serving_with_loopback.go | 79 + .../apiserver/pkg/server/resourceconfig/BUILD | 45 + .../resourceconfig/doc.go} | 5 +- .../pkg/server/resourceconfig/helpers.go | 164 + .../pkg/server/resourceconfig/helpers_test.go | 178 + .../server/routes/data/swagger/datafile.go | 6 +- .../apiserver/pkg/server/routes/openapi.go | 9 +- vendor/k8s.io/apiserver/pkg/server/serve.go | 39 +- .../k8s.io/apiserver/pkg/server/storage/BUILD | 3 +- .../pkg/server/storage/resource_config.go | 142 +- .../server/storage/resource_config_test.go | 85 +- .../pkg/server/storage/storage_factory.go | 19 +- vendor/k8s.io/apiserver/pkg/storage/BUILD | 5 +- vendor/k8s.io/apiserver/pkg/storage/cacher.go | 87 +- .../pkg/storage/cacher_whitebox_test.go | 124 +- .../k8s.io/apiserver/pkg/storage/etcd/BUILD | 4 +- .../pkg/storage/etcd/api_object_versioner.go | 39 + .../storage/etcd/api_object_versioner_test.go | 38 + .../apiserver/pkg/storage/etcd/etcd_helper.go | 32 +- .../pkg/storage/etcd/etcd_helper_test.go | 2 +- .../pkg/storage/etcd/etcd_watcher.go | 31 +- .../pkg/storage/etcd/etcd_watcher_test.go | 42 +- .../pkg/storage/etcd/metrics/metrics.go | 12 + .../apiserver/pkg/storage/etcd/testing/BUILD | 1 + .../pkg/storage/etcd/testing/utils.go | 32 +- .../apiserver/pkg/storage/etcd/util/BUILD | 3 +- .../k8s.io/apiserver/pkg/storage/etcd3/BUILD | 3 +- .../pkg/storage/etcd3/preflight/BUILD | 3 +- .../apiserver/pkg/storage/etcd3/store.go | 41 +- .../apiserver/pkg/storage/etcd3/store_test.go | 36 +- .../apiserver/pkg/storage/etcd3/watcher.go | 13 +- .../pkg/storage/etcd3/watcher_test.go | 5 +- .../apiserver/pkg/storage/interfaces.go | 22 +- .../k8s.io/apiserver/pkg/storage/names/BUILD | 3 +- .../pkg/storage/selection_predicate.go | 2 +- .../pkg/storage/storagebackend/config.go | 3 + .../pkg/storage/storagebackend/factory/BUILD | 3 +- .../storage/storagebackend/factory/etcd3.go | 15 +- .../storage/testing/zz_generated.deepcopy.go | 5 +- .../k8s.io/apiserver/pkg/storage/tests/BUILD | 3 +- .../pkg/storage/tests/cacher_test.go | 39 +- vendor/k8s.io/apiserver/pkg/storage/util.go | 46 - .../k8s.io/apiserver/pkg/storage/util_test.go | 34 - .../k8s.io/apiserver/pkg/storage/value/BUILD | 3 +- .../pkg/storage/value/encrypt/aes/BUILD | 3 +- .../pkg/storage/value/encrypt/envelope/BUILD | 107 +- .../value/encrypt/envelope/envelope.go | 33 +- .../value/encrypt/envelope/envelope_test.go | 10 +- .../value/encrypt/envelope/grpc_service.go | 144 + .../envelope/grpc_service_unix_test.go | 173 + .../value/encrypt/envelope/v1beta1/BUILD | 33 + .../encrypt/envelope/v1beta1/service.pb.go | 370 ++ .../encrypt/envelope/v1beta1/service.proto | 54 + .../pkg/storage/value/encrypt/secretbox/BUILD | 3 +- .../apiserver/pkg/storage/watch_cache.go | 74 +- .../apiserver/pkg/storage/watch_cache_test.go | 72 +- .../k8s.io/apiserver/pkg/util/feature/BUILD | 3 +- .../pkg/util/feature/feature_gate.go | 8 +- vendor/k8s.io/apiserver/pkg/util/flag/BUILD | 6 +- .../pkg/util/flag/ciphersuites_flag.go | 87 + .../pkg/util/flag/ciphersuites_flag_test.go | 114 + vendor/k8s.io/apiserver/pkg/util/flag/noop.go | 41 + .../apiserver/pkg/util/flushwriter/BUILD | 3 +- vendor/k8s.io/apiserver/pkg/util/logs/logs.go | 14 +- vendor/k8s.io/apiserver/pkg/util/proxy/BUILD | 3 +- .../k8s.io/apiserver/pkg/util/webhook/BUILD | 3 +- .../apiserver/pkg/util/webhook/webhook.go | 3 +- .../pkg/util/webhook/webhook_test.go | 15 +- .../k8s.io/apiserver/pkg/util/wsstream/BUILD | 3 +- .../k8s.io/apiserver/plugin/pkg/audit/BUILD | 1 + .../apiserver/plugin/pkg/audit/buffered/BUILD | 44 + .../plugin/pkg/audit/buffered/buffered.go | 283 + .../pkg/audit/buffered/buffered_test.go | 181 + .../keystone => audit/buffered}/doc.go | 9 +- .../apiserver/plugin/pkg/audit/log/BUILD | 3 +- .../apiserver/plugin/pkg/audit/log/backend.go | 13 +- .../apiserver/plugin/pkg/audit/webhook/BUILD | 11 +- .../plugin/pkg/audit/webhook/webhook.go | 348 +- .../plugin/pkg/audit/webhook/webhook_test.go | 287 +- .../audit/webhook/webhook_v1alpha1_test.go | 289 - .../plugin/pkg/authenticator/password/BUILD | 1 - .../pkg/authenticator/password/allow/BUILD | 3 +- .../pkg/authenticator/password/keystone/BUILD | 36 - .../password/keystone/keystone.go | 94 - .../authenticator/password/passwordfile/BUILD | 3 +- .../pkg/authenticator/request/basicauth/BUILD | 3 +- .../plugin/pkg/authenticator/token/oidc/BUILD | 19 +- .../pkg/authenticator/token/oidc/OWNERS | 1 + .../pkg/authenticator/token/oidc/oidc.go | 314 +- .../pkg/authenticator/token/oidc/oidc_test.go | 1094 ++-- .../token/oidc/testdata/ecdsa_1.pem | 7 + .../token/oidc/testdata/ecdsa_2.pem | 7 + .../token/oidc/testdata/ecdsa_3.pem | 7 + .../authenticator/token/oidc/testdata/gen.sh | 27 + .../token/oidc/testdata/rsa_1.pem | 27 + .../token/oidc/testdata/rsa_2.pem | 27 + .../token/oidc/testdata/rsa_3.pem | 27 + .../authenticator/token/oidc/testing/BUILD | 30 - .../token/oidc/testing/provider.go | 200 - .../pkg/authenticator/token/webhook/BUILD | 3 +- .../plugin/pkg/authorizer/webhook/BUILD | 3 +- .../plugin/pkg/authorizer/webhook/webhook.go | 2 +- .../.github/PULL_REQUEST_TEMPLATE.md | 6 +- vendor/k8s.io/client-go/CHANGELOG.md | 105 + vendor/k8s.io/client-go/CONTRIBUTING.md | 7 + vendor/k8s.io/client-go/Godeps/Godeps.json | 328 +- vendor/k8s.io/client-go/Godeps/OWNERS | 2 + vendor/k8s.io/client-go/INSTALL.md | 6 +- vendor/k8s.io/client-go/README.md | 42 +- vendor/k8s.io/client-go/code-of-conduct.md | 3 + vendor/k8s.io/client-go/discovery/BUILD | 1 - .../k8s.io/client-go/discovery/cached/BUILD | 3 +- .../client-go/discovery/discovery_client.go | 34 +- .../discovery/discovery_client_test.go | 66 +- vendor/k8s.io/client-go/discovery/fake/BUILD | 1 - .../k8s.io/client-go/discovery/restmapper.go | 2 + vendor/k8s.io/client-go/dynamic/BUILD | 3 +- vendor/k8s.io/client-go/dynamic/client.go | 55 +- .../k8s.io/client-go/dynamic/client_test.go | 104 +- .../k8s.io/client-go/dynamic/fake/client.go | 2 +- .../create-update-delete-deployment/BUILD | 3 +- .../create-update-delete-deployment/README.md | 2 +- .../in-cluster-client-configuration/BUILD | 3 +- .../out-of-cluster-client-configuration/BUILD | 3 +- .../main.go | 11 +- .../k8s.io/client-go/examples/workqueue/BUILD | 3 +- .../admissionregistration/interface.go | 4 +- .../v1alpha1/initializerconfiguration.go | 7 +- .../v1alpha1/interface.go | 4 +- .../v1beta1/interface.go | 4 +- .../v1beta1/mutatingwebhookconfiguration.go | 7 +- .../v1beta1/validatingwebhookconfiguration.go | 7 +- .../client-go/informers/apps/interface.go | 4 +- .../informers/apps/v1/controllerrevision.go | 7 +- .../client-go/informers/apps/v1/daemonset.go | 7 +- .../client-go/informers/apps/v1/deployment.go | 7 +- .../client-go/informers/apps/v1/interface.go | 4 +- .../client-go/informers/apps/v1/replicaset.go | 7 +- .../informers/apps/v1/statefulset.go | 7 +- .../apps/v1beta1/controllerrevision.go | 7 +- .../informers/apps/v1beta1/deployment.go | 7 +- .../informers/apps/v1beta1/interface.go | 4 +- .../informers/apps/v1beta1/statefulset.go | 7 +- .../apps/v1beta2/controllerrevision.go | 7 +- .../informers/apps/v1beta2/daemonset.go | 7 +- .../informers/apps/v1beta2/deployment.go | 7 +- .../informers/apps/v1beta2/interface.go | 4 +- .../informers/apps/v1beta2/replicaset.go | 7 +- .../informers/apps/v1beta2/statefulset.go | 7 +- .../informers/autoscaling/interface.go | 4 +- .../autoscaling/v1/horizontalpodautoscaler.go | 7 +- .../informers/autoscaling/v1/interface.go | 4 +- .../v2beta1/horizontalpodautoscaler.go | 7 +- .../autoscaling/v2beta1/interface.go | 4 +- .../client-go/informers/batch/interface.go | 4 +- .../client-go/informers/batch/v1/interface.go | 4 +- .../client-go/informers/batch/v1/job.go | 7 +- .../informers/batch/v1beta1/cronjob.go | 7 +- .../informers/batch/v1beta1/interface.go | 4 +- .../informers/batch/v2alpha1/cronjob.go | 7 +- .../informers/batch/v2alpha1/interface.go | 4 +- .../informers/certificates/interface.go | 4 +- .../v1beta1/certificatesigningrequest.go | 7 +- .../certificates/v1beta1/interface.go | 4 +- .../client-go/informers/core/interface.go | 4 +- .../informers/core/v1/componentstatus.go | 7 +- .../client-go/informers/core/v1/configmap.go | 7 +- .../client-go/informers/core/v1/endpoints.go | 7 +- .../client-go/informers/core/v1/event.go | 7 +- .../client-go/informers/core/v1/interface.go | 4 +- .../client-go/informers/core/v1/limitrange.go | 7 +- .../client-go/informers/core/v1/namespace.go | 7 +- .../client-go/informers/core/v1/node.go | 7 +- .../informers/core/v1/persistentvolume.go | 7 +- .../core/v1/persistentvolumeclaim.go | 7 +- .../k8s.io/client-go/informers/core/v1/pod.go | 7 +- .../informers/core/v1/podtemplate.go | 7 +- .../core/v1/replicationcontroller.go | 7 +- .../informers/core/v1/resourcequota.go | 7 +- .../client-go/informers/core/v1/secret.go | 7 +- .../client-go/informers/core/v1/service.go | 7 +- .../informers/core/v1/serviceaccount.go | 7 +- .../client-go/informers/events/interface.go | 4 +- .../informers/events/v1beta1/event.go | 7 +- .../informers/events/v1beta1/interface.go | 4 +- .../informers/extensions/interface.go | 4 +- .../informers/extensions/v1beta1/daemonset.go | 7 +- .../extensions/v1beta1/deployment.go | 7 +- .../informers/extensions/v1beta1/ingress.go | 7 +- .../informers/extensions/v1beta1/interface.go | 4 +- .../extensions/v1beta1/podsecuritypolicy.go | 7 +- .../extensions/v1beta1/replicaset.go | 7 +- vendor/k8s.io/client-go/informers/factory.go | 11 +- vendor/k8s.io/client-go/informers/generic.go | 9 +- .../internalinterfaces/factory_interfaces.go | 7 +- .../informers/networking/interface.go | 4 +- .../informers/networking/v1/interface.go | 4 +- .../informers/networking/v1/networkpolicy.go | 7 +- .../client-go/informers/policy/interface.go | 4 +- .../client-go/informers/policy/v1beta1/BUILD | 1 + .../informers/policy/v1beta1/interface.go | 11 +- .../policy/v1beta1/poddisruptionbudget.go | 7 +- .../policy/v1beta1/podsecuritypolicy.go | 88 + .../client-go/informers/rbac/interface.go | 4 +- .../informers/rbac/v1/clusterrole.go | 7 +- .../informers/rbac/v1/clusterrolebinding.go | 7 +- .../client-go/informers/rbac/v1/interface.go | 4 +- .../client-go/informers/rbac/v1/role.go | 7 +- .../informers/rbac/v1/rolebinding.go | 7 +- .../informers/rbac/v1alpha1/clusterrole.go | 7 +- .../rbac/v1alpha1/clusterrolebinding.go | 7 +- .../informers/rbac/v1alpha1/interface.go | 4 +- .../client-go/informers/rbac/v1alpha1/role.go | 7 +- .../informers/rbac/v1alpha1/rolebinding.go | 7 +- .../informers/rbac/v1beta1/clusterrole.go | 7 +- .../rbac/v1beta1/clusterrolebinding.go | 7 +- .../informers/rbac/v1beta1/interface.go | 4 +- .../client-go/informers/rbac/v1beta1/role.go | 7 +- .../informers/rbac/v1beta1/rolebinding.go | 7 +- .../informers/scheduling/interface.go | 4 +- .../scheduling/v1alpha1/interface.go | 4 +- .../scheduling/v1alpha1/priorityclass.go | 7 +- .../client-go/informers/settings/interface.go | 4 +- .../informers/settings/v1alpha1/interface.go | 4 +- .../informers/settings/v1alpha1/podpreset.go | 7 +- .../client-go/informers/storage/interface.go | 4 +- .../informers/storage/v1/interface.go | 4 +- .../informers/storage/v1/storageclass.go | 7 +- .../informers/storage/v1alpha1/interface.go | 4 +- .../storage/v1alpha1/volumeattachment.go | 7 +- .../client-go/informers/storage/v1beta1/BUILD | 1 + .../informers/storage/v1beta1/interface.go | 11 +- .../informers/storage/v1beta1/storageclass.go | 7 +- .../storage/v1beta1/volumeattachment.go | 88 + .../k8s.io/client-go/kubernetes/clientset.go | 4 +- vendor/k8s.io/client-go/kubernetes/doc.go | 4 +- .../kubernetes/fake/clientset_generated.go | 14 +- .../k8s.io/client-go/kubernetes/fake/doc.go | 4 +- .../client-go/kubernetes/fake/register.go | 7 +- .../k8s.io/client-go/kubernetes/scheme/doc.go | 4 +- .../client-go/kubernetes/scheme/register.go | 7 +- .../v1alpha1/admissionregistration_client.go | 4 +- .../admissionregistration/v1alpha1/doc.go | 4 +- .../v1alpha1/fake/doc.go | 4 +- .../fake/fake_admissionregistration_client.go | 4 +- .../fake/fake_initializerconfiguration.go | 4 +- .../v1alpha1/generated_expansion.go | 4 +- .../v1alpha1/initializerconfiguration.go | 4 +- .../v1beta1/admissionregistration_client.go | 4 +- .../admissionregistration/v1beta1/doc.go | 4 +- .../admissionregistration/v1beta1/fake/doc.go | 4 +- .../fake/fake_admissionregistration_client.go | 4 +- .../fake/fake_mutatingwebhookconfiguration.go | 4 +- .../fake_validatingwebhookconfiguration.go | 4 +- .../v1beta1/generated_expansion.go | 4 +- .../v1beta1/mutatingwebhookconfiguration.go | 4 +- .../v1beta1/validatingwebhookconfiguration.go | 4 +- .../kubernetes/typed/apps/v1/apps_client.go | 4 +- .../typed/apps/v1/controllerrevision.go | 4 +- .../kubernetes/typed/apps/v1/daemonset.go | 4 +- .../kubernetes/typed/apps/v1/deployment.go | 4 +- .../client-go/kubernetes/typed/apps/v1/doc.go | 4 +- .../kubernetes/typed/apps/v1/fake/doc.go | 4 +- .../typed/apps/v1/fake/fake_apps_client.go | 4 +- .../apps/v1/fake/fake_controllerrevision.go | 4 +- .../typed/apps/v1/fake/fake_daemonset.go | 4 +- .../typed/apps/v1/fake/fake_deployment.go | 4 +- .../typed/apps/v1/fake/fake_replicaset.go | 4 +- .../typed/apps/v1/fake/fake_statefulset.go | 4 +- .../typed/apps/v1/generated_expansion.go | 4 +- .../kubernetes/typed/apps/v1/replicaset.go | 4 +- .../kubernetes/typed/apps/v1/statefulset.go | 4 +- .../typed/apps/v1beta1/apps_client.go | 4 +- .../typed/apps/v1beta1/controllerrevision.go | 4 +- .../typed/apps/v1beta1/deployment.go | 4 +- .../kubernetes/typed/apps/v1beta1/doc.go | 4 +- .../kubernetes/typed/apps/v1beta1/fake/doc.go | 4 +- .../apps/v1beta1/fake/fake_apps_client.go | 4 +- .../v1beta1/fake/fake_controllerrevision.go | 4 +- .../apps/v1beta1/fake/fake_deployment.go | 4 +- .../typed/apps/v1beta1/fake/fake_scale.go | 4 +- .../apps/v1beta1/fake/fake_statefulset.go | 4 +- .../typed/apps/v1beta1/generated_expansion.go | 4 +- .../kubernetes/typed/apps/v1beta1/scale.go | 4 +- .../typed/apps/v1beta1/statefulset.go | 4 +- .../typed/apps/v1beta2/apps_client.go | 4 +- .../typed/apps/v1beta2/controllerrevision.go | 4 +- .../typed/apps/v1beta2/daemonset.go | 4 +- .../typed/apps/v1beta2/deployment.go | 4 +- .../kubernetes/typed/apps/v1beta2/doc.go | 4 +- .../kubernetes/typed/apps/v1beta2/fake/doc.go | 4 +- .../apps/v1beta2/fake/fake_apps_client.go | 4 +- .../v1beta2/fake/fake_controllerrevision.go | 4 +- .../typed/apps/v1beta2/fake/fake_daemonset.go | 4 +- .../apps/v1beta2/fake/fake_deployment.go | 4 +- .../apps/v1beta2/fake/fake_replicaset.go | 4 +- .../typed/apps/v1beta2/fake/fake_scale.go | 4 +- .../apps/v1beta2/fake/fake_statefulset.go | 4 +- .../typed/apps/v1beta2/generated_expansion.go | 4 +- .../typed/apps/v1beta2/replicaset.go | 4 +- .../kubernetes/typed/apps/v1beta2/scale.go | 4 +- .../typed/apps/v1beta2/statefulset.go | 4 +- .../v1/authentication_client.go | 4 +- .../kubernetes/typed/authentication/v1/doc.go | 4 +- .../typed/authentication/v1/fake/doc.go | 4 +- .../v1/fake/fake_authentication_client.go | 4 +- .../v1/fake/fake_tokenreview.go | 4 +- .../authentication/v1/generated_expansion.go | 4 +- .../typed/authentication/v1/tokenreview.go | 4 +- .../v1beta1/authentication_client.go | 4 +- .../typed/authentication/v1beta1/doc.go | 4 +- .../typed/authentication/v1beta1/fake/doc.go | 4 +- .../fake/fake_authentication_client.go | 4 +- .../v1beta1/fake/fake_tokenreview.go | 4 +- .../v1beta1/generated_expansion.go | 4 +- .../authentication/v1beta1/tokenreview.go | 4 +- .../authorization/v1/authorization_client.go | 4 +- .../kubernetes/typed/authorization/v1/doc.go | 4 +- .../typed/authorization/v1/fake/doc.go | 4 +- .../v1/fake/fake_authorization_client.go | 4 +- .../v1/fake/fake_localsubjectaccessreview.go | 4 +- .../v1/fake/fake_selfsubjectaccessreview.go | 4 +- .../v1/fake/fake_selfsubjectrulesreview.go | 4 +- .../v1/fake/fake_subjectaccessreview.go | 4 +- .../authorization/v1/generated_expansion.go | 4 +- .../v1/localsubjectaccessreview.go | 4 +- .../v1/selfsubjectaccessreview.go | 4 +- .../v1/selfsubjectrulesreview.go | 4 +- .../authorization/v1/subjectaccessreview.go | 4 +- .../v1beta1/authorization_client.go | 4 +- .../typed/authorization/v1beta1/doc.go | 4 +- .../typed/authorization/v1beta1/fake/doc.go | 4 +- .../v1beta1/fake/fake_authorization_client.go | 4 +- .../fake/fake_localsubjectaccessreview.go | 4 +- .../fake/fake_selfsubjectaccessreview.go | 4 +- .../fake/fake_selfsubjectrulesreview.go | 4 +- .../v1beta1/fake/fake_subjectaccessreview.go | 4 +- .../v1beta1/generated_expansion.go | 4 +- .../v1beta1/localsubjectaccessreview.go | 4 +- .../v1beta1/selfsubjectaccessreview.go | 4 +- .../v1beta1/selfsubjectrulesreview.go | 4 +- .../v1beta1/subjectaccessreview.go | 4 +- .../autoscaling/v1/autoscaling_client.go | 4 +- .../kubernetes/typed/autoscaling/v1/doc.go | 4 +- .../typed/autoscaling/v1/fake/doc.go | 4 +- .../v1/fake/fake_autoscaling_client.go | 4 +- .../v1/fake/fake_horizontalpodautoscaler.go | 4 +- .../autoscaling/v1/generated_expansion.go | 4 +- .../autoscaling/v1/horizontalpodautoscaler.go | 4 +- .../autoscaling/v2beta1/autoscaling_client.go | 4 +- .../typed/autoscaling/v2beta1/doc.go | 4 +- .../typed/autoscaling/v2beta1/fake/doc.go | 4 +- .../v2beta1/fake/fake_autoscaling_client.go | 4 +- .../fake/fake_horizontalpodautoscaler.go | 4 +- .../v2beta1/generated_expansion.go | 4 +- .../v2beta1/horizontalpodautoscaler.go | 4 +- .../kubernetes/typed/batch/v1/batch_client.go | 4 +- .../kubernetes/typed/batch/v1/doc.go | 4 +- .../kubernetes/typed/batch/v1/fake/doc.go | 4 +- .../typed/batch/v1/fake/fake_batch_client.go | 4 +- .../typed/batch/v1/fake/fake_job.go | 4 +- .../typed/batch/v1/generated_expansion.go | 4 +- .../kubernetes/typed/batch/v1/job.go | 4 +- .../typed/batch/v1beta1/batch_client.go | 4 +- .../kubernetes/typed/batch/v1beta1/cronjob.go | 4 +- .../kubernetes/typed/batch/v1beta1/doc.go | 4 +- .../typed/batch/v1beta1/fake/doc.go | 4 +- .../batch/v1beta1/fake/fake_batch_client.go | 4 +- .../typed/batch/v1beta1/fake/fake_cronjob.go | 4 +- .../batch/v1beta1/generated_expansion.go | 4 +- .../typed/batch/v2alpha1/batch_client.go | 4 +- .../typed/batch/v2alpha1/cronjob.go | 4 +- .../kubernetes/typed/batch/v2alpha1/doc.go | 4 +- .../typed/batch/v2alpha1/fake/doc.go | 4 +- .../batch/v2alpha1/fake/fake_batch_client.go | 4 +- .../typed/batch/v2alpha1/fake/fake_cronjob.go | 4 +- .../batch/v2alpha1/generated_expansion.go | 4 +- .../v1beta1/certificates_client.go | 4 +- .../v1beta1/certificatesigningrequest.go | 4 +- .../typed/certificates/v1beta1/doc.go | 4 +- .../typed/certificates/v1beta1/fake/doc.go | 4 +- .../v1beta1/fake/fake_certificates_client.go | 4 +- .../fake/fake_certificatesigningrequest.go | 4 +- .../v1beta1/generated_expansion.go | 4 +- .../client-go/kubernetes/typed/core/v1/BUILD | 2 + .../typed/core/v1/componentstatus.go | 4 +- .../kubernetes/typed/core/v1/configmap.go | 4 +- .../kubernetes/typed/core/v1/core_client.go | 4 +- .../client-go/kubernetes/typed/core/v1/doc.go | 4 +- .../kubernetes/typed/core/v1/endpoints.go | 4 +- .../kubernetes/typed/core/v1/event.go | 4 +- .../kubernetes/typed/core/v1/fake/BUILD | 2 + .../kubernetes/typed/core/v1/fake/doc.go | 4 +- .../core/v1/fake/fake_componentstatus.go | 4 +- .../typed/core/v1/fake/fake_configmap.go | 4 +- .../typed/core/v1/fake/fake_core_client.go | 4 +- .../typed/core/v1/fake/fake_endpoints.go | 4 +- .../typed/core/v1/fake/fake_event.go | 4 +- .../typed/core/v1/fake/fake_limitrange.go | 4 +- .../typed/core/v1/fake/fake_namespace.go | 4 +- .../typed/core/v1/fake/fake_node.go | 4 +- .../core/v1/fake/fake_persistentvolume.go | 4 +- .../v1/fake/fake_persistentvolumeclaim.go | 4 +- .../kubernetes/typed/core/v1/fake/fake_pod.go | 4 +- .../typed/core/v1/fake/fake_podtemplate.go | 4 +- .../v1/fake/fake_replicationcontroller.go | 4 +- .../typed/core/v1/fake/fake_resourcequota.go | 4 +- .../typed/core/v1/fake/fake_secret.go | 4 +- .../typed/core/v1/fake/fake_service.go | 4 +- .../typed/core/v1/fake/fake_serviceaccount.go | 4 +- .../v1/fake/fake_serviceaccount_expansion.go | 31 + .../typed/core/v1/generated_expansion.go | 6 +- .../kubernetes/typed/core/v1/limitrange.go | 4 +- .../kubernetes/typed/core/v1/namespace.go | 4 +- .../kubernetes/typed/core/v1/node.go | 4 +- .../typed/core/v1/persistentvolume.go | 4 +- .../typed/core/v1/persistentvolumeclaim.go | 4 +- .../client-go/kubernetes/typed/core/v1/pod.go | 4 +- .../kubernetes/typed/core/v1/podtemplate.go | 4 +- .../typed/core/v1/replicationcontroller.go | 4 +- .../kubernetes/typed/core/v1/resourcequota.go | 4 +- .../kubernetes/typed/core/v1/secret.go | 4 +- .../kubernetes/typed/core/v1/service.go | 4 +- .../typed/core/v1/serviceaccount.go | 4 +- .../typed/core/v1/serviceaccount_expansion.go | 41 + .../kubernetes/typed/events/v1beta1/doc.go | 4 +- .../kubernetes/typed/events/v1beta1/event.go | 4 +- .../typed/events/v1beta1/events_client.go | 4 +- .../typed/events/v1beta1/fake/doc.go | 4 +- .../typed/events/v1beta1/fake/fake_event.go | 4 +- .../events/v1beta1/fake/fake_events_client.go | 4 +- .../events/v1beta1/generated_expansion.go | 4 +- .../typed/extensions/v1beta1/daemonset.go | 4 +- .../typed/extensions/v1beta1/deployment.go | 4 +- .../typed/extensions/v1beta1/doc.go | 4 +- .../extensions/v1beta1/extensions_client.go | 4 +- .../typed/extensions/v1beta1/fake/doc.go | 4 +- .../extensions/v1beta1/fake/fake_daemonset.go | 4 +- .../v1beta1/fake/fake_deployment.go | 4 +- .../v1beta1/fake/fake_extensions_client.go | 4 +- .../extensions/v1beta1/fake/fake_ingress.go | 4 +- .../v1beta1/fake/fake_podsecuritypolicy.go | 4 +- .../v1beta1/fake/fake_replicaset.go | 4 +- .../extensions/v1beta1/fake/fake_scale.go | 4 +- .../extensions/v1beta1/generated_expansion.go | 4 +- .../typed/extensions/v1beta1/ingress.go | 4 +- .../extensions/v1beta1/podsecuritypolicy.go | 4 +- .../typed/extensions/v1beta1/replicaset.go | 4 +- .../typed/extensions/v1beta1/scale.go | 4 +- .../kubernetes/typed/networking/v1/doc.go | 4 +- .../typed/networking/v1/fake/doc.go | 4 +- .../v1/fake/fake_networking_client.go | 4 +- .../networking/v1/fake/fake_networkpolicy.go | 4 +- .../networking/v1/generated_expansion.go | 4 +- .../typed/networking/v1/networking_client.go | 4 +- .../typed/networking/v1/networkpolicy.go | 4 +- .../kubernetes/typed/policy/v1beta1/BUILD | 1 + .../kubernetes/typed/policy/v1beta1/doc.go | 4 +- .../typed/policy/v1beta1/eviction.go | 4 +- .../typed/policy/v1beta1/fake/BUILD | 1 + .../typed/policy/v1beta1/fake/doc.go | 4 +- .../policy/v1beta1/fake/fake_eviction.go | 4 +- .../v1beta1/fake/fake_poddisruptionbudget.go | 4 +- .../v1beta1/fake/fake_podsecuritypolicy.go | 120 + .../policy/v1beta1/fake/fake_policy_client.go | 8 +- .../policy/v1beta1/generated_expansion.go | 6 +- .../policy/v1beta1/poddisruptionbudget.go | 4 +- .../typed/policy/v1beta1/podsecuritypolicy.go | 147 + .../typed/policy/v1beta1/policy_client.go | 9 +- .../kubernetes/typed/rbac/v1/clusterrole.go | 4 +- .../typed/rbac/v1/clusterrolebinding.go | 4 +- .../client-go/kubernetes/typed/rbac/v1/doc.go | 4 +- .../kubernetes/typed/rbac/v1/fake/doc.go | 4 +- .../typed/rbac/v1/fake/fake_clusterrole.go | 4 +- .../rbac/v1/fake/fake_clusterrolebinding.go | 4 +- .../typed/rbac/v1/fake/fake_rbac_client.go | 4 +- .../typed/rbac/v1/fake/fake_role.go | 4 +- .../typed/rbac/v1/fake/fake_rolebinding.go | 4 +- .../typed/rbac/v1/generated_expansion.go | 4 +- .../kubernetes/typed/rbac/v1/rbac_client.go | 4 +- .../kubernetes/typed/rbac/v1/role.go | 4 +- .../kubernetes/typed/rbac/v1/rolebinding.go | 4 +- .../typed/rbac/v1alpha1/clusterrole.go | 4 +- .../typed/rbac/v1alpha1/clusterrolebinding.go | 4 +- .../kubernetes/typed/rbac/v1alpha1/doc.go | 4 +- .../typed/rbac/v1alpha1/fake/doc.go | 4 +- .../rbac/v1alpha1/fake/fake_clusterrole.go | 4 +- .../v1alpha1/fake/fake_clusterrolebinding.go | 4 +- .../rbac/v1alpha1/fake/fake_rbac_client.go | 4 +- .../typed/rbac/v1alpha1/fake/fake_role.go | 4 +- .../rbac/v1alpha1/fake/fake_rolebinding.go | 4 +- .../rbac/v1alpha1/generated_expansion.go | 4 +- .../typed/rbac/v1alpha1/rbac_client.go | 4 +- .../kubernetes/typed/rbac/v1alpha1/role.go | 4 +- .../typed/rbac/v1alpha1/rolebinding.go | 4 +- .../typed/rbac/v1beta1/clusterrole.go | 4 +- .../typed/rbac/v1beta1/clusterrolebinding.go | 4 +- .../kubernetes/typed/rbac/v1beta1/doc.go | 4 +- .../kubernetes/typed/rbac/v1beta1/fake/doc.go | 4 +- .../rbac/v1beta1/fake/fake_clusterrole.go | 4 +- .../v1beta1/fake/fake_clusterrolebinding.go | 4 +- .../rbac/v1beta1/fake/fake_rbac_client.go | 4 +- .../typed/rbac/v1beta1/fake/fake_role.go | 4 +- .../rbac/v1beta1/fake/fake_rolebinding.go | 4 +- .../typed/rbac/v1beta1/generated_expansion.go | 4 +- .../typed/rbac/v1beta1/rbac_client.go | 4 +- .../kubernetes/typed/rbac/v1beta1/role.go | 4 +- .../typed/rbac/v1beta1/rolebinding.go | 4 +- .../typed/scheduling/v1alpha1/doc.go | 4 +- .../typed/scheduling/v1alpha1/fake/doc.go | 4 +- .../v1alpha1/fake/fake_priorityclass.go | 4 +- .../v1alpha1/fake/fake_scheduling_client.go | 4 +- .../v1alpha1/generated_expansion.go | 4 +- .../scheduling/v1alpha1/priorityclass.go | 4 +- .../scheduling/v1alpha1/scheduling_client.go | 4 +- .../kubernetes/typed/settings/v1alpha1/doc.go | 4 +- .../typed/settings/v1alpha1/fake/doc.go | 4 +- .../settings/v1alpha1/fake/fake_podpreset.go | 4 +- .../v1alpha1/fake/fake_settings_client.go | 4 +- .../settings/v1alpha1/generated_expansion.go | 4 +- .../typed/settings/v1alpha1/podpreset.go | 4 +- .../settings/v1alpha1/settings_client.go | 4 +- .../kubernetes/typed/storage/v1/doc.go | 4 +- .../kubernetes/typed/storage/v1/fake/doc.go | 4 +- .../storage/v1/fake/fake_storage_client.go | 4 +- .../storage/v1/fake/fake_storageclass.go | 4 +- .../typed/storage/v1/generated_expansion.go | 4 +- .../typed/storage/v1/storage_client.go | 4 +- .../typed/storage/v1/storageclass.go | 4 +- .../kubernetes/typed/storage/v1alpha1/doc.go | 4 +- .../typed/storage/v1alpha1/fake/doc.go | 4 +- .../v1alpha1/fake/fake_storage_client.go | 4 +- .../v1alpha1/fake/fake_volumeattachment.go | 4 +- .../storage/v1alpha1/generated_expansion.go | 4 +- .../typed/storage/v1alpha1/storage_client.go | 4 +- .../storage/v1alpha1/volumeattachment.go | 4 +- .../kubernetes/typed/storage/v1beta1/BUILD | 1 + .../kubernetes/typed/storage/v1beta1/doc.go | 4 +- .../typed/storage/v1beta1/fake/BUILD | 1 + .../typed/storage/v1beta1/fake/doc.go | 4 +- .../v1beta1/fake/fake_storage_client.go | 8 +- .../storage/v1beta1/fake/fake_storageclass.go | 4 +- .../v1beta1/fake/fake_volumeattachment.go | 131 + .../storage/v1beta1/generated_expansion.go | 6 +- .../typed/storage/v1beta1/storage_client.go | 9 +- .../typed/storage/v1beta1/storageclass.go | 4 +- .../typed/storage/v1beta1/volumeattachment.go | 163 + .../v1alpha1/expansion_generated.go | 4 +- .../v1alpha1/initializerconfiguration.go | 4 +- .../v1beta1/expansion_generated.go | 4 +- .../v1beta1/mutatingwebhookconfiguration.go | 4 +- .../v1beta1/validatingwebhookconfiguration.go | 4 +- .../listers/apps/v1/controllerrevision.go | 4 +- .../client-go/listers/apps/v1/daemonset.go | 4 +- .../client-go/listers/apps/v1/deployment.go | 4 +- .../listers/apps/v1/expansion_generated.go | 4 +- .../client-go/listers/apps/v1/replicaset.go | 4 +- .../client-go/listers/apps/v1/statefulset.go | 4 +- .../apps/v1beta1/controllerrevision.go | 4 +- .../listers/apps/v1beta1/deployment.go | 4 +- .../apps/v1beta1/expansion_generated.go | 4 +- .../client-go/listers/apps/v1beta1/scale.go | 4 +- .../listers/apps/v1beta1/statefulset.go | 4 +- .../apps/v1beta2/controllerrevision.go | 4 +- .../listers/apps/v1beta2/daemonset.go | 4 +- .../listers/apps/v1beta2/deployment.go | 4 +- .../apps/v1beta2/expansion_generated.go | 4 +- .../listers/apps/v1beta2/replicaset.go | 4 +- .../client-go/listers/apps/v1beta2/scale.go | 4 +- .../listers/apps/v1beta2/statefulset.go | 4 +- .../authentication/v1/expansion_generated.go | 4 +- .../listers/authentication/v1/tokenreview.go | 4 +- .../v1beta1/expansion_generated.go | 4 +- .../authentication/v1beta1/tokenreview.go | 4 +- .../authorization/v1/expansion_generated.go | 4 +- .../v1/localsubjectaccessreview.go | 4 +- .../v1/selfsubjectaccessreview.go | 4 +- .../v1/selfsubjectrulesreview.go | 4 +- .../authorization/v1/subjectaccessreview.go | 4 +- .../v1beta1/expansion_generated.go | 4 +- .../v1beta1/localsubjectaccessreview.go | 4 +- .../v1beta1/selfsubjectaccessreview.go | 4 +- .../v1beta1/selfsubjectrulesreview.go | 4 +- .../v1beta1/subjectaccessreview.go | 4 +- .../autoscaling/v1/expansion_generated.go | 4 +- .../autoscaling/v1/horizontalpodautoscaler.go | 4 +- .../v2beta1/expansion_generated.go | 4 +- .../v2beta1/horizontalpodautoscaler.go | 4 +- .../listers/batch/v1/expansion_generated.go | 4 +- .../k8s.io/client-go/listers/batch/v1/job.go | 4 +- .../listers/batch/v1beta1/cronjob.go | 4 +- .../batch/v1beta1/expansion_generated.go | 4 +- .../listers/batch/v2alpha1/cronjob.go | 4 +- .../batch/v2alpha1/expansion_generated.go | 4 +- .../v1beta1/certificatesigningrequest.go | 4 +- .../v1beta1/expansion_generated.go | 4 +- .../listers/core/v1/componentstatus.go | 4 +- .../client-go/listers/core/v1/configmap.go | 4 +- .../client-go/listers/core/v1/endpoints.go | 4 +- .../k8s.io/client-go/listers/core/v1/event.go | 4 +- .../listers/core/v1/expansion_generated.go | 4 +- .../client-go/listers/core/v1/limitrange.go | 4 +- .../client-go/listers/core/v1/namespace.go | 4 +- .../k8s.io/client-go/listers/core/v1/node.go | 4 +- .../listers/core/v1/persistentvolume.go | 4 +- .../listers/core/v1/persistentvolumeclaim.go | 4 +- .../k8s.io/client-go/listers/core/v1/pod.go | 4 +- .../client-go/listers/core/v1/podtemplate.go | 4 +- .../listers/core/v1/replicationcontroller.go | 4 +- .../listers/core/v1/resourcequota.go | 4 +- .../client-go/listers/core/v1/secret.go | 4 +- .../client-go/listers/core/v1/service.go | 4 +- .../listers/core/v1/serviceaccount.go | 4 +- .../client-go/listers/events/v1beta1/event.go | 4 +- .../events/v1beta1/expansion_generated.go | 4 +- .../listers/extensions/v1beta1/BUILD | 3 +- .../listers/extensions/v1beta1/daemonset.go | 4 +- .../listers/extensions/v1beta1/deployment.go | 4 +- .../extensions/v1beta1/expansion_generated.go | 4 +- .../listers/extensions/v1beta1/ingress.go | 4 +- .../extensions/v1beta1/podsecuritypolicy.go | 4 +- .../listers/extensions/v1beta1/replicaset.go | 4 +- .../listers/extensions/v1beta1/scale.go | 4 +- .../v1alpha1/expansion_generated.go | 4 +- .../imagepolicy/v1alpha1/imagereview.go | 4 +- .../networking/v1/expansion_generated.go | 4 +- .../listers/networking/v1/networkpolicy.go | 4 +- .../client-go/listers/policy/v1beta1/BUILD | 1 + .../listers/policy/v1beta1/eviction.go | 4 +- .../policy/v1beta1/expansion_generated.go | 8 +- .../policy/v1beta1/poddisruptionbudget.go | 4 +- .../policy/v1beta1/podsecuritypolicy.go | 65 + .../client-go/listers/rbac/v1/clusterrole.go | 4 +- .../listers/rbac/v1/clusterrolebinding.go | 4 +- .../listers/rbac/v1/expansion_generated.go | 4 +- .../k8s.io/client-go/listers/rbac/v1/role.go | 4 +- .../client-go/listers/rbac/v1/rolebinding.go | 4 +- .../listers/rbac/v1alpha1/clusterrole.go | 4 +- .../rbac/v1alpha1/clusterrolebinding.go | 4 +- .../rbac/v1alpha1/expansion_generated.go | 4 +- .../client-go/listers/rbac/v1alpha1/role.go | 4 +- .../listers/rbac/v1alpha1/rolebinding.go | 4 +- .../listers/rbac/v1beta1/clusterrole.go | 4 +- .../rbac/v1beta1/clusterrolebinding.go | 4 +- .../rbac/v1beta1/expansion_generated.go | 4 +- .../client-go/listers/rbac/v1beta1/role.go | 4 +- .../listers/rbac/v1beta1/rolebinding.go | 4 +- .../v1alpha1/expansion_generated.go | 4 +- .../scheduling/v1alpha1/priorityclass.go | 4 +- .../settings/v1alpha1/expansion_generated.go | 4 +- .../listers/settings/v1alpha1/podpreset.go | 4 +- .../listers/storage/v1/expansion_generated.go | 4 +- .../listers/storage/v1/storageclass.go | 4 +- .../storage/v1alpha1/expansion_generated.go | 4 +- .../storage/v1alpha1/volumeattachment.go | 4 +- .../client-go/listers/storage/v1beta1/BUILD | 1 + .../storage/v1beta1/expansion_generated.go | 8 +- .../listers/storage/v1beta1/storageclass.go | 4 +- .../storage/v1beta1/volumeattachment.go | 65 + .../pkg/apis/clientauthentication/BUILD | 36 + .../pkg/apis/clientauthentication/doc.go} | 14 +- .../apis/clientauthentication/install/BUILD | 32 + .../clientauthentication/install/install.go | 43 + .../pkg/apis/clientauthentication/register.go | 50 + .../pkg/apis/clientauthentication/types.go | 70 + .../apis/clientauthentication/v1alpha1/BUILD | 39 + .../apis/clientauthentication/v1alpha1/doc.go | 23 + .../clientauthentication/v1alpha1/register.go | 55 + .../clientauthentication/v1alpha1/types.go | 70 + .../v1alpha1/zz_generated.conversion.go | 141 + .../v1alpha1/zz_generated.deepcopy.go | 137 + .../v1alpha1/zz_generated.defaults.go | 32 + .../zz_generated.deepcopy.go | 137 + vendor/k8s.io/client-go/pkg/version/def.bzl | 14 + .../authenticator/token/oidc/testing/BUILD | 30 - .../token/oidc/testing/provider.go | 200 - .../client-go/plugin/pkg/client/auth/BUILD | 1 + .../plugin/pkg/client/auth/azure/BUILD | 3 +- .../plugin/pkg/client/auth/exec/BUILD | 44 + .../plugin/pkg/client/auth/exec/exec.go | 280 + .../plugin/pkg/client/auth/exec/exec_test.go | 413 ++ .../client/auth/exec/testdata/test-plugin.sh | 18 + .../plugin/pkg/client/auth/gcp/BUILD | 3 +- .../plugin/pkg/client/auth/gcp/gcp.go | 75 +- .../plugin/pkg/client/auth/gcp/gcp_test.go | 109 + .../plugin/pkg/client/auth/oidc/BUILD | 3 +- .../plugin/pkg/client/auth/openstack/BUILD | 3 +- vendor/k8s.io/client-go/rest/BUILD | 5 +- vendor/k8s.io/client-go/rest/client.go | 4 +- vendor/k8s.io/client-go/rest/client_test.go | 2 +- vendor/k8s.io/client-go/rest/config.go | 14 +- vendor/k8s.io/client-go/rest/config_test.go | 2 +- vendor/k8s.io/client-go/rest/fake/fake.go | 2 +- vendor/k8s.io/client-go/rest/request.go | 3 +- vendor/k8s.io/client-go/rest/request_test.go | 14 +- vendor/k8s.io/client-go/rest/transport.go | 16 +- vendor/k8s.io/client-go/rest/versions.go | 88 - vendor/k8s.io/client-go/rest/watch/BUILD | 1 - .../client-go/rest/zz_generated.deepcopy.go | 4 +- vendor/k8s.io/client-go/scale/BUILD | 3 +- vendor/k8s.io/client-go/scale/client.go | 48 +- vendor/k8s.io/client-go/scale/client_test.go | 2 +- .../k8s.io/client-go/scale/roundtrip_test.go | 2 +- .../client-go/scale/scheme/appsint/doc.go | 2 +- .../appsv1beta1/zz_generated.conversion.go | 4 +- .../appsv1beta2/zz_generated.conversion.go | 4 +- .../autoscalingv1/zz_generated.conversion.go | 4 +- .../scale/scheme/extensionsint/doc.go | 2 +- .../zz_generated.conversion.go | 4 +- .../scale/scheme/zz_generated.deepcopy.go | 7 +- vendor/k8s.io/client-go/scale/util.go | 19 + vendor/k8s.io/client-go/testing/BUILD | 18 + vendor/k8s.io/client-go/testing/fixture.go | 60 +- .../k8s.io/client-go/testing/fixture_test.go | 192 + vendor/k8s.io/client-go/tools/auth/BUILD | 1 - .../k8s.io/client-go/tools/auth/clientauth.go | 2 +- .../client-go/tools/bootstrap/token/api/BUILD | 26 + .../tools/bootstrap/token/api/OWNERS | 5 + .../tools/bootstrap/token/api/doc.go | 20 + .../tools/bootstrap/token/api/types.go | 100 + .../tools/bootstrap/token/util/BUILD | 32 + .../tools/bootstrap/token/util/helpers.go | 52 + .../bootstrap/token/util/helpers_test.go | 76 + vendor/k8s.io/client-go/tools/cache/BUILD | 6 +- .../client-go/tools/cache/controller.go | 4 +- .../client-go/tools/cache/controller_test.go | 2 +- .../client-go/tools/cache/delta_fifo.go | 84 +- .../client-go/tools/cache/delta_fifo_test.go | 57 +- vendor/k8s.io/client-go/tools/cache/fifo.go | 2 +- .../k8s.io/client-go/tools/cache/listwatch.go | 14 +- .../k8s.io/client-go/tools/cache/reflector.go | 10 +- .../client-go/tools/cache/shared_informer.go | 59 +- .../tools/cache/shared_informer_test.go | 12 + .../client-go/tools/cache/testing/BUILD | 3 +- vendor/k8s.io/client-go/tools/clientcmd/BUILD | 3 +- .../client-go/tools/clientcmd/api/BUILD | 3 +- .../client-go/tools/clientcmd/api/types.go | 32 + .../client-go/tools/clientcmd/api/v1/types.go | 32 + .../clientcmd/api/v1/zz_generated.deepcopy.go | 58 +- .../clientcmd/api/zz_generated.deepcopy.go | 58 +- .../tools/clientcmd/client_config.go | 12 +- .../tools/clientcmd/client_config_test.go | 2 +- .../client-go/tools/clientcmd/loader.go | 11 +- .../client-go/tools/clientcmd/loader_test.go | 19 +- .../client-go/tools/clientcmd/validation.go | 23 + .../tools/clientcmd/validation_test.go | 129 + .../client-go/tools/leaderelection/BUILD | 3 +- .../tools/leaderelection/leaderelection.go | 4 +- .../leaderelection/leaderelection_test.go | 2 +- .../resourcelock/configmaplock.go | 12 +- vendor/k8s.io/client-go/tools/pager/BUILD | 5 +- .../client-go/tools/pager/pager_test.go | 6 +- .../k8s.io/client-go/tools/portforward/BUILD | 3 +- .../tools/portforward/portforward.go | 4 +- .../tools/portforward/portforward_test.go | 2 +- vendor/k8s.io/client-go/tools/record/BUILD | 3 +- .../client-go/tools/remotecommand/BUILD | 3 +- vendor/k8s.io/client-go/transport/BUILD | 6 +- vendor/k8s.io/client-go/transport/cache.go | 33 +- vendor/k8s.io/client-go/transport/config.go | 4 - .../client-go/transport/round_trippers.go | 31 - .../transport/round_trippers_test.go | 61 - vendor/k8s.io/client-go/util/buffer/BUILD | 3 +- vendor/k8s.io/client-go/util/cert/BUILD | 3 +- vendor/k8s.io/client-go/util/cert/cert.go | 42 +- .../k8s.io/client-go/util/certificate/BUILD | 3 +- .../util/certificate/certificate_manager.go | 89 +- .../certificate/certificate_manager_test.go | 61 +- .../client-go/util/certificate/csr/BUILD | 3 +- .../k8s.io/client-go/util/flowcontrol/BUILD | 5 +- .../client-go/util/flowcontrol/throttle.go | 55 +- .../util/flowcontrol/throttle_test.go | 24 - vendor/k8s.io/client-go/util/integer/BUILD | 3 +- vendor/k8s.io/client-go/util/jsonpath/BUILD | 3 +- .../client-go/util/jsonpath/jsonpath_test.go | 2 +- vendor/k8s.io/client-go/util/retry/BUILD | 3 +- vendor/k8s.io/client-go/util/testing/BUILD | 3 +- vendor/k8s.io/client-go/util/workqueue/BUILD | 6 +- .../util/workqueue/default_rate_limiters.go | 8 +- .../util/workqueue/delaying_queue.go | 2 +- .../.github/PULL_REQUEST_TEMPLATE.md | 2 + vendor/k8s.io/code-generator/CONTRIBUTING.md | 7 + .../k8s.io/code-generator/Godeps/Godeps.json | 528 +- vendor/k8s.io/code-generator/Godeps/OWNERS | 2 + .../example/v1/zz_generated.conversion.go | 5 +- .../example/v1/zz_generated.conversions.go | 113 - .../apis/example/v1/zz_generated.deepcopy.go | 8 +- .../apis/example/v1/zz_generated.defaults.go | 2 +- .../apis/example/zz_generated.deepcopy.go | 8 +- .../example2/v1/zz_generated.conversion.go | 5 +- .../apis/example2/v1/zz_generated.deepcopy.go | 8 +- .../apis/example2/v1/zz_generated.defaults.go | 2 +- .../apis/example2/zz_generated.deepcopy.go | 8 +- .../clientset/internalversion/clientset.go | 2 + .../clientset/internalversion/doc.go | 2 + .../fake/clientset_generated.go | 12 +- .../clientset/internalversion/fake/doc.go | 2 + .../internalversion/fake/register.go | 5 +- .../clientset/internalversion/scheme/doc.go | 2 + .../internalversion/scheme/register.go | 6 +- .../typed/example/internalversion/doc.go | 2 + .../example/internalversion/example_client.go | 2 + .../typed/example/internalversion/fake/doc.go | 2 + .../fake/fake_example_client.go | 2 + .../internalversion/fake/fake_testtype.go | 2 + .../internalversion/generated_expansion.go | 2 + .../typed/example/internalversion/testtype.go | 2 + .../typed/example2/internalversion/doc.go | 2 + .../internalversion/example2_client.go | 2 + .../example2/internalversion/fake/doc.go | 2 + .../fake/fake_example2_client.go | 2 + .../internalversion/fake/fake_testtype.go | 2 + .../internalversion/generated_expansion.go | 2 + .../example2/internalversion/testtype.go | 2 + .../clientset/versioned/clientset.go | 2 + .../apiserver/clientset/versioned/doc.go | 2 + .../versioned/fake/clientset_generated.go | 12 +- .../apiserver/clientset/versioned/fake/doc.go | 2 + .../clientset/versioned/fake/register.go | 5 +- .../clientset/versioned/scheme/doc.go | 2 + .../clientset/versioned/scheme/register.go | 5 +- .../versioned/typed/example/v1/doc.go | 2 + .../typed/example/v1/example_client.go | 2 + .../versioned/typed/example/v1/fake/doc.go | 2 + .../example/v1/fake/fake_example_client.go | 2 + .../typed/example/v1/fake/fake_testtype.go | 2 + .../typed/example/v1/generated_expansion.go | 2 + .../versioned/typed/example/v1/testtype.go | 2 + .../versioned/typed/example2/v1/doc.go | 2 + .../typed/example2/v1/example2_client.go | 2 + .../versioned/typed/example2/v1/fake/doc.go | 2 + .../example2/v1/fake/fake_example2_client.go | 2 + .../typed/example2/v1/fake/fake_testtype.go | 2 + .../typed/example2/v1/generated_expansion.go | 2 + .../versioned/typed/example2/v1/testtype.go | 2 + .../externalversions/example/interface.go | 2 +- .../externalversions/example/v1/interface.go | 2 +- .../externalversions/example/v1/testtype.go | 5 +- .../externalversions/example2/interface.go | 2 +- .../externalversions/example2/v1/interface.go | 2 +- .../externalversions/example2/v1/testtype.go | 5 +- .../informers/externalversions/factory.go | 9 +- .../informers/externalversions/generic.go | 3 +- .../internalinterfaces/factory_interfaces.go | 5 +- .../internalversion/example/interface.go | 2 +- .../example/internalversion/interface.go | 2 +- .../example/internalversion/testtype.go | 5 +- .../internalversion/example2/interface.go | 2 +- .../example2/internalversion/interface.go | 2 +- .../example2/internalversion/testtype.go | 5 +- .../informers/internalversion/factory.go | 9 +- .../informers/internalversion/generic.go | 3 +- .../internalinterfaces/factory_interfaces.go | 5 +- .../internalversion/expansion_generated.go | 2 +- .../example/internalversion/testtype.go | 2 +- .../listers/example/v1/expansion_generated.go | 2 +- .../apiserver/listers/example/v1/testtype.go | 2 +- .../internalversion/expansion_generated.go | 2 +- .../example2/internalversion/testtype.go | 2 +- .../example2/v1/expansion_generated.go | 2 +- .../apiserver/listers/example2/v1/testtype.go | 2 +- .../apis/example/v1/zz_generated.deepcopy.go | 8 +- .../apis/example2/v1/zz_generated.deepcopy.go | 8 +- .../crd/clientset/versioned/clientset.go | 2 + .../_examples/crd/clientset/versioned/doc.go | 2 + .../versioned/fake/clientset_generated.go | 12 +- .../crd/clientset/versioned/fake/doc.go | 2 + .../crd/clientset/versioned/fake/register.go | 5 +- .../crd/clientset/versioned/scheme/doc.go | 2 + .../clientset/versioned/scheme/register.go | 5 +- .../versioned/typed/example/v1/doc.go | 2 + .../typed/example/v1/example_client.go | 2 + .../versioned/typed/example/v1/fake/doc.go | 2 + .../example/v1/fake/fake_example_client.go | 2 + .../typed/example/v1/fake/fake_testtype.go | 2 + .../typed/example/v1/generated_expansion.go | 2 + .../versioned/typed/example/v1/testtype.go | 2 + .../versioned/typed/example2/v1/doc.go | 2 + .../typed/example2/v1/example2_client.go | 2 + .../versioned/typed/example2/v1/fake/doc.go | 2 + .../example2/v1/fake/fake_example2_client.go | 2 + .../typed/example2/v1/fake/fake_testtype.go | 2 + .../typed/example2/v1/generated_expansion.go | 2 + .../versioned/typed/example2/v1/testtype.go | 2 + .../externalversions/example/interface.go | 2 +- .../externalversions/example/v1/interface.go | 2 +- .../externalversions/example/v1/testtype.go | 5 +- .../externalversions/example2/interface.go | 2 +- .../externalversions/example2/v1/interface.go | 2 +- .../externalversions/example2/v1/testtype.go | 5 +- .../crd/informers/externalversions/factory.go | 9 +- .../crd/informers/externalversions/generic.go | 3 +- .../internalinterfaces/factory_interfaces.go | 5 +- .../listers/example/v1/expansion_generated.go | 2 +- .../crd/listers/example/v1/testtype.go | 2 +- .../example2/v1/expansion_generated.go | 2 +- .../crd/listers/example2/v1/testtype.go | 2 +- .../code-generator/cmd/client-gen/BUILD | 4 +- .../code-generator/cmd/client-gen/args/BUILD | 5 +- .../cmd/client-gen/args/args.go | 91 +- .../cmd/client-gen/args/gvpackages.go | 161 +- .../cmd/client-gen/args/gvpackages_test.go | 57 +- .../client-gen/generators/client_generator.go | 32 +- .../generators/fake/fake_client_generator.go | 12 +- .../fake/generator_fake_for_clientset.go | 14 +- .../generators/generator_for_clientset.go | 4 +- .../generators/generator_for_group.go | 5 +- .../generators/scheme/generator_for_scheme.go | 30 +- .../cmd/client-gen/generators/util/BUILD | 3 +- .../code-generator/cmd/client-gen/main.go | 44 +- .../code-generator/cmd/client-gen/types/BUILD | 3 +- .../cmd/client-gen/types/helpers.go | 20 +- .../cmd/client-gen/types/types.go | 14 +- .../code-generator/cmd/conversion-gen/BUILD | 6 +- .../cmd/conversion-gen/args/BUILD | 26 + .../cmd/conversion-gen/args/args.go | 83 + .../cmd/conversion-gen/generators/BUILD | 1 + .../conversion-gen/generators/conversion.go | 35 +- .../code-generator/cmd/conversion-gen/main.go | 40 +- .../code-generator/cmd/deepcopy-gen/BUILD | 10 +- .../cmd/deepcopy-gen/args/BUILD | 27 + .../cmd/deepcopy-gen/args/args.go | 54 + .../code-generator/cmd/deepcopy-gen/main.go | 31 +- .../code-generator/cmd/defaulter-gen/BUILD | 10 +- .../cmd/defaulter-gen/args/BUILD | 27 + .../cmd/defaulter-gen/args/args.go | 54 + .../code-generator/cmd/defaulter-gen/main.go | 33 +- .../code-generator/cmd/go-to-protobuf/BUILD | 3 +- .../code-generator/cmd/go-to-protobuf/main.go | 1 + .../cmd/go-to-protobuf/protobuf/BUILD | 4 +- .../cmd/go-to-protobuf/protobuf/cmd.go | 6 +- .../cmd/go-to-protobuf/protobuf/generator.go | 11 +- .../cmd/go-to-protobuf/protoc-gen-gogo/BUILD | 3 +- .../code-generator/cmd/import-boss/BUILD | 4 +- .../code-generator/cmd/import-boss/main.go | 3 +- .../code-generator/cmd/informer-gen/BUILD | 6 +- .../cmd/informer-gen/args/BUILD | 27 + .../cmd/informer-gen/args/args.go | 77 + .../cmd/informer-gen/generators/BUILD | 3 +- .../cmd/informer-gen/generators/customargs.go | 33 - .../cmd/informer-gen/generators/generic.go | 6 +- .../informer-gen/generators/groupinterface.go | 4 +- .../cmd/informer-gen/generators/packages.go | 34 +- .../code-generator/cmd/informer-gen/main.go | 39 +- .../code-generator/cmd/lister-gen/BUILD | 7 +- .../code-generator/cmd/lister-gen/args/BUILD | 27 + .../cmd/lister-gen/args/args.go | 56 + .../cmd/lister-gen/generators/lister.go | 8 - .../code-generator/cmd/lister-gen/main.go | 25 +- .../code-generator/cmd/openapi-gen/BUILD | 11 +- .../code-generator/cmd/openapi-gen/args/BUILD | 26 + .../cmd/openapi-gen/args/args.go | 53 + .../code-generator/cmd/openapi-gen/main.go | 24 +- .../k8s.io/code-generator/cmd/set-gen/BUILD | 4 +- .../k8s.io/code-generator/cmd/set-gen/main.go | 3 +- .../k8s.io/code-generator/code-of-conduct.md | 3 + .../k8s.io/code-generator/generate-groups.sh | 2 +- .../generate-internal-groups.sh | 4 +- vendor/k8s.io/code-generator/hack/BUILD | 18 + .../hack/boilerplate.go.txt} | 3 +- vendor/k8s.io/code-generator/pkg/util/BUILD | 22 + .../k8s.io/code-generator/pkg/util/build.go | 61 + vendor/k8s.io/gengo/code-of-conduct.md | 59 +- .../go-to-protobuf/build-image/Dockerfile | 2 +- vendor/k8s.io/gengo/parser/parse.go | 2 +- 1317 files changed, 29202 insertions(+), 21393 deletions(-) delete mode 100644 vendor/github.com/google/btree/.travis.yml delete mode 100644 vendor/github.com/google/btree/LICENSE delete mode 100644 vendor/github.com/google/btree/README.md delete mode 100644 vendor/github.com/google/btree/btree.go delete mode 100644 vendor/github.com/google/btree/btree_mem.go delete mode 100644 vendor/github.com/google/btree/btree_test.go delete mode 100644 vendor/github.com/gregjones/httpcache/.travis.yml delete mode 100644 vendor/github.com/gregjones/httpcache/LICENSE.txt delete mode 100644 vendor/github.com/gregjones/httpcache/README.md delete mode 100644 vendor/github.com/gregjones/httpcache/diskcache/diskcache.go delete mode 100644 vendor/github.com/gregjones/httpcache/diskcache/diskcache_test.go delete mode 100644 vendor/github.com/gregjones/httpcache/httpcache.go delete mode 100644 vendor/github.com/gregjones/httpcache/httpcache_test.go delete mode 100644 vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache.go delete mode 100644 vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache_test.go delete mode 100644 vendor/github.com/gregjones/httpcache/memcache/appengine.go delete mode 100644 vendor/github.com/gregjones/httpcache/memcache/appengine_test.go delete mode 100644 vendor/github.com/gregjones/httpcache/memcache/memcache.go delete mode 100644 vendor/github.com/gregjones/httpcache/memcache/memcache_test.go delete mode 100644 vendor/github.com/gregjones/httpcache/redis/redis.go delete mode 100644 vendor/github.com/gregjones/httpcache/redis/redis_test.go delete mode 100644 vendor/github.com/juju/ratelimit/LICENSE delete mode 100644 vendor/github.com/juju/ratelimit/README.md delete mode 100644 vendor/github.com/juju/ratelimit/ratelimit.go delete mode 100644 vendor/github.com/juju/ratelimit/ratelimit_test.go delete mode 100644 vendor/github.com/juju/ratelimit/reader.go delete mode 100644 vendor/github.com/petar/GoLLRB/.gitignore delete mode 100644 vendor/github.com/petar/GoLLRB/AUTHORS delete mode 100644 vendor/github.com/petar/GoLLRB/LICENSE delete mode 100644 vendor/github.com/petar/GoLLRB/README.md delete mode 100644 vendor/github.com/petar/GoLLRB/doc/Sedgewick-LLRB.pdf delete mode 100644 vendor/github.com/petar/GoLLRB/doc/Sedgewick-RedBlackBST.java delete mode 100644 vendor/github.com/petar/GoLLRB/doc/Sedgewick-Talk-Penn2008.pdf delete mode 100644 vendor/github.com/petar/GoLLRB/example/ex1.go delete mode 100644 vendor/github.com/petar/GoLLRB/llrb/avgvar.go delete mode 100644 vendor/github.com/petar/GoLLRB/llrb/iterator.go delete mode 100644 vendor/github.com/petar/GoLLRB/llrb/iterator_test.go delete mode 100644 vendor/github.com/petar/GoLLRB/llrb/llrb-stats.go delete mode 100644 vendor/github.com/petar/GoLLRB/llrb/llrb.go delete mode 100644 vendor/github.com/petar/GoLLRB/llrb/llrb_test.go delete mode 100644 vendor/github.com/petar/GoLLRB/llrb/util.go delete mode 100644 vendor/github.com/peterbourgon/diskv/LICENSE delete mode 100644 vendor/github.com/peterbourgon/diskv/README.md delete mode 100644 vendor/github.com/peterbourgon/diskv/basic_test.go delete mode 100644 vendor/github.com/peterbourgon/diskv/compression.go delete mode 100644 vendor/github.com/peterbourgon/diskv/compression_test.go delete mode 100644 vendor/github.com/peterbourgon/diskv/diskv.go delete mode 100644 vendor/github.com/peterbourgon/diskv/examples/content-addressable-store/cas.go delete mode 100644 vendor/github.com/peterbourgon/diskv/examples/super-simple-store/super-simple-store.go delete mode 100644 vendor/github.com/peterbourgon/diskv/import_test.go delete mode 100644 vendor/github.com/peterbourgon/diskv/index.go delete mode 100644 vendor/github.com/peterbourgon/diskv/index_test.go delete mode 100644 vendor/github.com/peterbourgon/diskv/issues_test.go delete mode 100644 vendor/github.com/peterbourgon/diskv/keys_test.go delete mode 100644 vendor/github.com/peterbourgon/diskv/speed_test.go delete mode 100644 vendor/github.com/peterbourgon/diskv/stream_test.go create mode 100644 vendor/golang.org/x/time/AUTHORS create mode 100644 vendor/golang.org/x/time/CONTRIBUTING.md create mode 100644 vendor/golang.org/x/time/CONTRIBUTORS create mode 100644 vendor/golang.org/x/time/LICENSE create mode 100644 vendor/golang.org/x/time/PATENTS create mode 100644 vendor/golang.org/x/time/README.md create mode 100644 vendor/golang.org/x/time/rate/rate.go create mode 100644 vendor/golang.org/x/time/rate/rate_go16.go create mode 100644 vendor/golang.org/x/time/rate/rate_go17.go create mode 100644 vendor/golang.org/x/time/rate/rate_test.go create mode 100644 vendor/k8s.io/api/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 vendor/k8s.io/api/CONTRIBUTING.md create mode 100644 vendor/k8s.io/api/Godeps/OWNERS create mode 100644 vendor/k8s.io/api/code-of-conduct.md create mode 100644 vendor/k8s.io/apiserver/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 vendor/k8s.io/apiserver/Godeps/OWNERS create mode 100644 vendor/k8s.io/apiserver/code-of-conduct.md delete mode 100755 vendor/k8s.io/apiserver/hack/godep-deps.sh delete mode 100755 vendor/k8s.io/apiserver/hack/sync-from-kubernetes.sh create mode 100644 vendor/k8s.io/apiserver/pkg/admission/decorator.go delete mode 100644 vendor/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/conversion.go create mode 100644 vendor/k8s.io/apiserver/pkg/audit/request_test.go delete mode 100644 vendor/k8s.io/apiserver/pkg/endpoints/handlers/proxy.go delete mode 100644 vendor/k8s.io/apiserver/pkg/endpoints/proxy_test.go create mode 100644 vendor/k8s.io/apiserver/pkg/server/options/api_enablement.go create mode 100644 vendor/k8s.io/apiserver/pkg/server/options/audit_test.go delete mode 100644 vendor/k8s.io/apiserver/pkg/server/options/encryptionconfig/plugins.go create mode 100644 vendor/k8s.io/apiserver/pkg/server/options/serving_with_loopback.go create mode 100644 vendor/k8s.io/apiserver/pkg/server/resourceconfig/BUILD rename vendor/k8s.io/apiserver/pkg/{apis/example/v1/types_swagger_doc_generated.go => server/resourceconfig/doc.go} (72%) create mode 100644 vendor/k8s.io/apiserver/pkg/server/resourceconfig/helpers.go create mode 100644 vendor/k8s.io/apiserver/pkg/server/resourceconfig/helpers_test.go create mode 100644 vendor/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/grpc_service.go create mode 100644 vendor/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/grpc_service_unix_test.go create mode 100644 vendor/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/v1beta1/BUILD create mode 100644 vendor/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/v1beta1/service.pb.go create mode 100644 vendor/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/v1beta1/service.proto create mode 100644 vendor/k8s.io/apiserver/pkg/util/flag/ciphersuites_flag.go create mode 100644 vendor/k8s.io/apiserver/pkg/util/flag/ciphersuites_flag_test.go create mode 100644 vendor/k8s.io/apiserver/pkg/util/flag/noop.go create mode 100644 vendor/k8s.io/apiserver/plugin/pkg/audit/buffered/BUILD create mode 100644 vendor/k8s.io/apiserver/plugin/pkg/audit/buffered/buffered.go create mode 100644 vendor/k8s.io/apiserver/plugin/pkg/audit/buffered/buffered_test.go rename vendor/k8s.io/apiserver/plugin/pkg/{authenticator/password/keystone => audit/buffered}/doc.go (60%) delete mode 100644 vendor/k8s.io/apiserver/plugin/pkg/audit/webhook/webhook_v1alpha1_test.go delete mode 100644 vendor/k8s.io/apiserver/plugin/pkg/authenticator/password/keystone/BUILD delete mode 100644 vendor/k8s.io/apiserver/plugin/pkg/authenticator/password/keystone/keystone.go create mode 100644 vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/oidc/testdata/ecdsa_1.pem create mode 100644 vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/oidc/testdata/ecdsa_2.pem create mode 100644 vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/oidc/testdata/ecdsa_3.pem create mode 100755 vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/oidc/testdata/gen.sh create mode 100644 vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/oidc/testdata/rsa_1.pem create mode 100644 vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/oidc/testdata/rsa_2.pem create mode 100644 vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/oidc/testdata/rsa_3.pem delete mode 100644 vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/oidc/testing/BUILD delete mode 100644 vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/oidc/testing/provider.go create mode 100644 vendor/k8s.io/client-go/CONTRIBUTING.md create mode 100644 vendor/k8s.io/client-go/Godeps/OWNERS create mode 100644 vendor/k8s.io/client-go/code-of-conduct.md create mode 100644 vendor/k8s.io/client-go/informers/policy/v1beta1/podsecuritypolicy.go create mode 100644 vendor/k8s.io/client-go/informers/storage/v1beta1/volumeattachment.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_serviceaccount_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/serviceaccount_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/fake_podsecuritypolicy.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/podsecuritypolicy.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_volumeattachment.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/volumeattachment.go create mode 100644 vendor/k8s.io/client-go/listers/policy/v1beta1/podsecuritypolicy.go create mode 100644 vendor/k8s.io/client-go/listers/storage/v1beta1/volumeattachment.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/BUILD rename vendor/k8s.io/{apiserver/pkg/endpoints/apiserver.go => client-go/pkg/apis/clientauthentication/doc.go} (72%) create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/install/BUILD create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/install/install.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/register.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/types.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/BUILD create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/doc.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/register.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/types.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.conversion.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.defaults.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/client-go/plugin/pkg/auth/authenticator/token/oidc/testing/BUILD delete mode 100644 vendor/k8s.io/client-go/plugin/pkg/auth/authenticator/token/oidc/testing/provider.go create mode 100644 vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/BUILD create mode 100644 vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec.go create mode 100644 vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec_test.go create mode 100755 vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/testdata/test-plugin.sh delete mode 100644 vendor/k8s.io/client-go/rest/versions.go create mode 100644 vendor/k8s.io/client-go/testing/fixture_test.go create mode 100644 vendor/k8s.io/client-go/tools/bootstrap/token/api/BUILD create mode 100644 vendor/k8s.io/client-go/tools/bootstrap/token/api/OWNERS create mode 100644 vendor/k8s.io/client-go/tools/bootstrap/token/api/doc.go create mode 100644 vendor/k8s.io/client-go/tools/bootstrap/token/api/types.go create mode 100644 vendor/k8s.io/client-go/tools/bootstrap/token/util/BUILD create mode 100644 vendor/k8s.io/client-go/tools/bootstrap/token/util/helpers.go create mode 100644 vendor/k8s.io/client-go/tools/bootstrap/token/util/helpers_test.go create mode 100644 vendor/k8s.io/code-generator/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 vendor/k8s.io/code-generator/CONTRIBUTING.md create mode 100644 vendor/k8s.io/code-generator/Godeps/OWNERS delete mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example/v1/zz_generated.conversions.go create mode 100644 vendor/k8s.io/code-generator/cmd/conversion-gen/args/BUILD create mode 100644 vendor/k8s.io/code-generator/cmd/conversion-gen/args/args.go create mode 100644 vendor/k8s.io/code-generator/cmd/deepcopy-gen/args/BUILD create mode 100644 vendor/k8s.io/code-generator/cmd/deepcopy-gen/args/args.go create mode 100644 vendor/k8s.io/code-generator/cmd/defaulter-gen/args/BUILD create mode 100644 vendor/k8s.io/code-generator/cmd/defaulter-gen/args/args.go create mode 100644 vendor/k8s.io/code-generator/cmd/informer-gen/args/BUILD create mode 100644 vendor/k8s.io/code-generator/cmd/informer-gen/args/args.go delete mode 100644 vendor/k8s.io/code-generator/cmd/informer-gen/generators/customargs.go create mode 100644 vendor/k8s.io/code-generator/cmd/lister-gen/args/BUILD create mode 100644 vendor/k8s.io/code-generator/cmd/lister-gen/args/args.go create mode 100644 vendor/k8s.io/code-generator/cmd/openapi-gen/args/BUILD create mode 100644 vendor/k8s.io/code-generator/cmd/openapi-gen/args/args.go create mode 100644 vendor/k8s.io/code-generator/code-of-conduct.md create mode 100644 vendor/k8s.io/code-generator/hack/BUILD rename vendor/k8s.io/{apiserver/pkg/apis/example2/v1/types_swagger_doc_generated.go => code-generator/hack/boilerplate.go.txt} (91%) create mode 100644 vendor/k8s.io/code-generator/pkg/util/BUILD create mode 100644 vendor/k8s.io/code-generator/pkg/util/build.go diff --git a/Gopkg.lock b/Gopkg.lock index 4bd0f18b7..4f26bae0d 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -126,12 +126,6 @@ ] revision = "4bd1920723d7b7c925de087aa32e2187708897f7" -[[projects]] - branch = "master" - name = "github.com/google/btree" - packages = ["."] - revision = "316fb6d3f031ae8f4d457c6c5186b9e3ded70435" - [[projects]] name = "github.com/google/gofuzz" packages = ["."] @@ -146,15 +140,6 @@ ] revision = "68f4ded48ba9414dab2ae69b3f0d69971da73aa5" -[[projects]] - branch = "master" - name = "github.com/gregjones/httpcache" - packages = [ - ".", - "diskcache" - ] - revision = "316c5e0ff04e0ce21cfae9fbbb2ab39c7fc74e71" - [[projects]] name = "github.com/hashicorp/golang-lru" packages = [ @@ -191,12 +176,6 @@ revision = "6ed27152e0428abfde127acb33b08b03a1e67cac" version = "1.0.2" -[[projects]] - branch = "master" - name = "github.com/juju/ratelimit" - packages = ["."] - revision = "5b9ff866471762aa2ab2dced63c9fb6f53921342" - [[projects]] name = "github.com/mailru/easyjson" packages = [ @@ -262,18 +241,6 @@ revision = "e790cca94e6cc75c7064b1332e63811d4aae1a53" version = "v1.1" -[[projects]] - branch = "master" - name = "github.com/petar/GoLLRB" - packages = ["llrb"] - revision = "53be0d36a84c2a886ca057d34b6aa4468df9ccb4" - -[[projects]] - name = "github.com/peterbourgon/diskv" - packages = ["."] - revision = "5f041e8faa004a95c88a202771f4cc3e991971e6" - version = "v2.0.1" - [[projects]] name = "github.com/pkg/errors" packages = ["."] @@ -393,6 +360,12 @@ ] revision = "2910a502d2bf9e43193af9d68ca516529614eed3" +[[projects]] + branch = "master" + name = "golang.org/x/time" + packages = ["rate"] + revision = "fbb02b2291d28baffd63558aa44b4b56f178d650" + [[projects]] branch = "master" name = "golang.org/x/tools" @@ -414,7 +387,6 @@ revision = "7f97868eec74b32b0982dd158a51a446d1da7eb5" [[projects]] - branch = "release-1.9" name = "k8s.io/api" packages = [ "admissionregistration/v1alpha1", @@ -446,7 +418,8 @@ "storage/v1alpha1", "storage/v1beta1" ] - revision = "006a217681ae70cbacdd66a5e2fca1a61a8ff28e" + revision = "73d903622b7391f3312dcbac6483fed484e185f8" + version = "kubernetes-1.10.0" [[projects]] branch = "release-1.9" @@ -455,8 +428,6 @@ "pkg/api/errors", "pkg/api/meta", "pkg/api/resource", - "pkg/apimachinery", - "pkg/apimachinery/registered", "pkg/apis/meta/internalversion", "pkg/apis/meta/v1", "pkg/apis/meta/v1/unstructured", @@ -500,13 +471,13 @@ revision = "68f9c3a1feb3140df59c67ced62d3a5df8e6c9c2" [[projects]] - branch = "release-1.9" name = "k8s.io/apiserver" packages = [ "pkg/util/flag", "pkg/util/logs" ] - revision = "d0762227e2dd234c2db8efc3946c33ad2453c9e8" + revision = "5ae41ac86efd753e2ba012f097b83a914b268236" + version = "kubernetes-1.10.0" [[projects]] name = "k8s.io/client-go" @@ -636,7 +607,10 @@ "listers/storage/v1", "listers/storage/v1alpha1", "listers/storage/v1beta1", + "pkg/apis/clientauthentication", + "pkg/apis/clientauthentication/v1alpha1", "pkg/version", + "plugin/pkg/client/auth/exec", "rest", "rest/watch", "testing", @@ -659,11 +633,10 @@ "util/retry", "util/workqueue" ] - revision = "78700dec6369ba22221b72770783300f143df150" - version = "v6.0.0" + revision = "23781f4d6632d88e869066eaebb743857aa1ef9b" + version = "v7.0.0" [[projects]] - branch = "release-1.9" name = "k8s.io/code-generator" packages = [ "cmd/client-gen", @@ -674,17 +647,25 @@ "cmd/client-gen/generators/util", "cmd/client-gen/path", "cmd/client-gen/types", + "cmd/conversion-gen", + "cmd/conversion-gen/args", + "cmd/conversion-gen/generators", "cmd/deepcopy-gen", + "cmd/deepcopy-gen/args", "cmd/defaulter-gen", + "cmd/defaulter-gen/args", "cmd/informer-gen", + "cmd/informer-gen/args", "cmd/informer-gen/generators", "cmd/lister-gen", - "cmd/lister-gen/generators" + "cmd/lister-gen/args", + "cmd/lister-gen/generators", + "pkg/util" ] - revision = "91d3f6a57905178524105a085085901bb73bd3dc" + revision = "7ead8f38b01cf8653249f5af80ce7b2c8aba12e2" + version = "kubernetes-1.10.0" [[projects]] - branch = "master" name = "k8s.io/gengo" packages = [ "args", @@ -696,7 +677,7 @@ "parser", "types" ] - revision = "1ef560bbde5195c01629039ad3b337ce63e7b321" + revision = "b6c426f7730e6d66e6e476a85d1c3eb7633880e0" [[projects]] branch = "master" @@ -719,6 +700,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "d86dd12b8d707a70abdab55f5864ba1663633ed54a33f45f9a4c7ce4a8ab3040" + inputs-digest = "7a642b60a4d338452115f73c55b32f3ac1a7916cd5e9999001f03a2e0698e9be" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 01e19a95a..dfe316971 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -22,13 +22,11 @@ # Code generation dependencies required = [ "k8s.io/code-generator/cmd/client-gen", - # needed by generated clientsets, but not an explicit dep in client-gen itself - "k8s.io/apimachinery/pkg/apimachinery/registered", - + "k8s.io/code-generator/cmd/conversion-gen", "k8s.io/code-generator/cmd/deepcopy-gen", "k8s.io/code-generator/cmd/defaulter-gen", - "k8s.io/code-generator/cmd/lister-gen", "k8s.io/code-generator/cmd/informer-gen", + "k8s.io/code-generator/cmd/lister-gen", ] [[constraint]] @@ -49,23 +47,23 @@ required = [ [[constraint]] name = "k8s.io/api" - branch = "release-1.9" + version = "kubernetes-1.10.0" [[constraint]] branch = "release-1.9" name = "k8s.io/apimachinery" [[constraint]] - branch = "release-1.9" name = "k8s.io/apiserver" + version = "kubernetes-1.10.0" [[constraint]] name = "k8s.io/client-go" - version = "~6.0" + version = "kubernetes-1.10.0" [[constraint]] - branch = "release-1.9" name = "k8s.io/code-generator" + version = "kubernetes-1.10.0" [[constraint]] branch = "master" @@ -75,9 +73,12 @@ required = [ branch = "master" name = "github.com/heptiolabs/healthcheck" +# gengo needs to be manually pinned to the version listed in code-generators +# Gopkg.toml, because the k8s project does not produce Gopkg.toml files & dep +# does not parse the Godeps.json file to determine revisions to use. [[override]] - branch = "master" name = "k8s.io/gengo" + revision = "b6c426f7730e6d66e6e476a85d1c3eb7633880e0" [[constraint]] name = "github.com/robfig/cron" diff --git a/contrib/manifests/rbac.yaml b/contrib/manifests/rbac.yaml index 7876dad51..a00f491c9 100644 --- a/contrib/manifests/rbac.yaml +++ b/contrib/manifests/rbac.yaml @@ -59,10 +59,10 @@ rules: - apiGroups: - mysql.oracle.com resources: - - backups - - backupschedules - - clusters - - restores + - mysqlbackups + - mysqlbackupschedules + - mysqlclusters + - mysqlrestores verbs: - get - list diff --git a/pkg/apis/mysql/v1alpha1/types.go b/pkg/apis/mysql/v1alpha1/types.go index 79b65465e..4dc794b92 100644 --- a/pkg/apis/mysql/v1alpha1/types.go +++ b/pkg/apis/mysql/v1alpha1/types.go @@ -150,9 +150,10 @@ type ClusterStatus struct { // +genclient // +genclient:noStatus +// +resource:path=mysqlclusters +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // Cluster represents a cluster spec and associated metadata -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object type Cluster struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata"` @@ -160,8 +161,9 @@ type Cluster struct { Status ClusterStatus `json:"status"` } -// ClusterList is a placeholder type for a list of MySQL clusters // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ClusterList is a placeholder type for a list of MySQL clusters type ClusterList struct { metav1.TypeMeta `json:",inline"` metav1.ListMeta `json:"metadata"` @@ -257,10 +259,11 @@ type BackupStatus struct { // +genclient // +genclient:noStatus +// +resource:path=mysqlbackups +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // Backup is a MySQL Operator resource that represents a backup of a MySQL // cluster. -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object type Backup struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata"` @@ -269,8 +272,9 @@ type Backup struct { Status BackupStatus `json:"status"` } -// BackupList is a list of Backups. // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// BackupList is a list of Backups. type BackupList struct { metav1.TypeMeta `json:",inline"` metav1.ListMeta `json:"metadata"` @@ -318,10 +322,11 @@ type ScheduleStatus struct { // +genclient // +genclient:noStatus +// +resource:path=mysqlbackupschedules +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // BackupSchedule is a MySQL Operator resource that represents a backup // schedule of a MySQL cluster. -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object type BackupSchedule struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata"` @@ -330,8 +335,9 @@ type BackupSchedule struct { Status ScheduleStatus `json:"status,omitempty"` } -// BackupScheduleList is a list of BackupSchedules. // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// BackupScheduleList is a list of BackupSchedules. type BackupScheduleList struct { metav1.TypeMeta `json:",inline"` metav1.ListMeta `json:"metadata"` @@ -390,10 +396,11 @@ type RestoreStatus struct { // +genclient // +genclient:noStatus +// +resource:path=mysqlrestores +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // Restore is a MySQL Operator resource that represents the restoration of // backup of a MySQL cluster. -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object type Restore struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata"` @@ -402,8 +409,9 @@ type Restore struct { Status RestoreStatus `json:"status"` } -// RestoreList is a list of Restores. // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// RestoreList is a list of Restores. type RestoreList struct { metav1.TypeMeta `json:",inline"` metav1.ListMeta `json:"metadata"` diff --git a/vendor/github.com/google/btree/.travis.yml b/vendor/github.com/google/btree/.travis.yml deleted file mode 100644 index 4f2ee4d97..000000000 --- a/vendor/github.com/google/btree/.travis.yml +++ /dev/null @@ -1 +0,0 @@ -language: go diff --git a/vendor/github.com/google/btree/LICENSE b/vendor/github.com/google/btree/LICENSE deleted file mode 100644 index d64569567..000000000 --- a/vendor/github.com/google/btree/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/google/btree/README.md b/vendor/github.com/google/btree/README.md deleted file mode 100644 index 6062a4dac..000000000 --- a/vendor/github.com/google/btree/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# BTree implementation for Go - -![Travis CI Build Status](https://api.travis-ci.org/google/btree.svg?branch=master) - -This package provides an in-memory B-Tree implementation for Go, useful as -an ordered, mutable data structure. - -The API is based off of the wonderful -http://godoc.org/github.com/petar/GoLLRB/llrb, and is meant to allow btree to -act as a drop-in replacement for gollrb trees. - -See http://godoc.org/github.com/google/btree for documentation. diff --git a/vendor/github.com/google/btree/btree.go b/vendor/github.com/google/btree/btree.go deleted file mode 100644 index eb74b1d39..000000000 --- a/vendor/github.com/google/btree/btree.go +++ /dev/null @@ -1,821 +0,0 @@ -// Copyright 2014 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package btree implements in-memory B-Trees of arbitrary degree. -// -// btree implements an in-memory B-Tree for use as an ordered data structure. -// It is not meant for persistent storage solutions. -// -// It has a flatter structure than an equivalent red-black or other binary tree, -// which in some cases yields better memory usage and/or performance. -// See some discussion on the matter here: -// http://google-opensource.blogspot.com/2013/01/c-containers-that-save-memory-and-time.html -// Note, though, that this project is in no way related to the C++ B-Tree -// implementation written about there. -// -// Within this tree, each node contains a slice of items and a (possibly nil) -// slice of children. For basic numeric values or raw structs, this can cause -// efficiency differences when compared to equivalent C++ template code that -// stores values in arrays within the node: -// * Due to the overhead of storing values as interfaces (each -// value needs to be stored as the value itself, then 2 words for the -// interface pointing to that value and its type), resulting in higher -// memory use. -// * Since interfaces can point to values anywhere in memory, values are -// most likely not stored in contiguous blocks, resulting in a higher -// number of cache misses. -// These issues don't tend to matter, though, when working with strings or other -// heap-allocated structures, since C++-equivalent structures also must store -// pointers and also distribute their values across the heap. -// -// This implementation is designed to be a drop-in replacement to gollrb.LLRB -// trees, (http://github.com/petar/gollrb), an excellent and probably the most -// widely used ordered tree implementation in the Go ecosystem currently. -// Its functions, therefore, exactly mirror those of -// llrb.LLRB where possible. Unlike gollrb, though, we currently don't -// support storing multiple equivalent values. -package btree - -import ( - "fmt" - "io" - "sort" - "strings" - "sync" -) - -// Item represents a single object in the tree. -type Item interface { - // Less tests whether the current item is less than the given argument. - // - // This must provide a strict weak ordering. - // If !a.Less(b) && !b.Less(a), we treat this to mean a == b (i.e. we can only - // hold one of either a or b in the tree). - Less(than Item) bool -} - -const ( - DefaultFreeListSize = 32 -) - -var ( - nilItems = make(items, 16) - nilChildren = make(children, 16) -) - -// FreeList represents a free list of btree nodes. By default each -// BTree has its own FreeList, but multiple BTrees can share the same -// FreeList. -// Two Btrees using the same freelist are safe for concurrent write access. -type FreeList struct { - mu sync.Mutex - freelist []*node -} - -// NewFreeList creates a new free list. -// size is the maximum size of the returned free list. -func NewFreeList(size int) *FreeList { - return &FreeList{freelist: make([]*node, 0, size)} -} - -func (f *FreeList) newNode() (n *node) { - f.mu.Lock() - index := len(f.freelist) - 1 - if index < 0 { - f.mu.Unlock() - return new(node) - } - n = f.freelist[index] - f.freelist[index] = nil - f.freelist = f.freelist[:index] - f.mu.Unlock() - return -} - -func (f *FreeList) freeNode(n *node) { - f.mu.Lock() - if len(f.freelist) < cap(f.freelist) { - f.freelist = append(f.freelist, n) - } - f.mu.Unlock() -} - -// ItemIterator allows callers of Ascend* to iterate in-order over portions of -// the tree. When this function returns false, iteration will stop and the -// associated Ascend* function will immediately return. -type ItemIterator func(i Item) bool - -// New creates a new B-Tree with the given degree. -// -// New(2), for example, will create a 2-3-4 tree (each node contains 1-3 items -// and 2-4 children). -func New(degree int) *BTree { - return NewWithFreeList(degree, NewFreeList(DefaultFreeListSize)) -} - -// NewWithFreeList creates a new B-Tree that uses the given node free list. -func NewWithFreeList(degree int, f *FreeList) *BTree { - if degree <= 1 { - panic("bad degree") - } - return &BTree{ - degree: degree, - cow: ©OnWriteContext{freelist: f}, - } -} - -// items stores items in a node. -type items []Item - -// insertAt inserts a value into the given index, pushing all subsequent values -// forward. -func (s *items) insertAt(index int, item Item) { - *s = append(*s, nil) - if index < len(*s) { - copy((*s)[index+1:], (*s)[index:]) - } - (*s)[index] = item -} - -// removeAt removes a value at a given index, pulling all subsequent values -// back. -func (s *items) removeAt(index int) Item { - item := (*s)[index] - copy((*s)[index:], (*s)[index+1:]) - (*s)[len(*s)-1] = nil - *s = (*s)[:len(*s)-1] - return item -} - -// pop removes and returns the last element in the list. -func (s *items) pop() (out Item) { - index := len(*s) - 1 - out = (*s)[index] - (*s)[index] = nil - *s = (*s)[:index] - return -} - -// truncate truncates this instance at index so that it contains only the -// first index items. index must be less than or equal to length. -func (s *items) truncate(index int) { - var toClear items - *s, toClear = (*s)[:index], (*s)[index:] - for len(toClear) > 0 { - toClear = toClear[copy(toClear, nilItems):] - } -} - -// find returns the index where the given item should be inserted into this -// list. 'found' is true if the item already exists in the list at the given -// index. -func (s items) find(item Item) (index int, found bool) { - i := sort.Search(len(s), func(i int) bool { - return item.Less(s[i]) - }) - if i > 0 && !s[i-1].Less(item) { - return i - 1, true - } - return i, false -} - -// children stores child nodes in a node. -type children []*node - -// insertAt inserts a value into the given index, pushing all subsequent values -// forward. -func (s *children) insertAt(index int, n *node) { - *s = append(*s, nil) - if index < len(*s) { - copy((*s)[index+1:], (*s)[index:]) - } - (*s)[index] = n -} - -// removeAt removes a value at a given index, pulling all subsequent values -// back. -func (s *children) removeAt(index int) *node { - n := (*s)[index] - copy((*s)[index:], (*s)[index+1:]) - (*s)[len(*s)-1] = nil - *s = (*s)[:len(*s)-1] - return n -} - -// pop removes and returns the last element in the list. -func (s *children) pop() (out *node) { - index := len(*s) - 1 - out = (*s)[index] - (*s)[index] = nil - *s = (*s)[:index] - return -} - -// truncate truncates this instance at index so that it contains only the -// first index children. index must be less than or equal to length. -func (s *children) truncate(index int) { - var toClear children - *s, toClear = (*s)[:index], (*s)[index:] - for len(toClear) > 0 { - toClear = toClear[copy(toClear, nilChildren):] - } -} - -// node is an internal node in a tree. -// -// It must at all times maintain the invariant that either -// * len(children) == 0, len(items) unconstrained -// * len(children) == len(items) + 1 -type node struct { - items items - children children - cow *copyOnWriteContext -} - -func (n *node) mutableFor(cow *copyOnWriteContext) *node { - if n.cow == cow { - return n - } - out := cow.newNode() - if cap(out.items) >= len(n.items) { - out.items = out.items[:len(n.items)] - } else { - out.items = make(items, len(n.items), cap(n.items)) - } - copy(out.items, n.items) - // Copy children - if cap(out.children) >= len(n.children) { - out.children = out.children[:len(n.children)] - } else { - out.children = make(children, len(n.children), cap(n.children)) - } - copy(out.children, n.children) - return out -} - -func (n *node) mutableChild(i int) *node { - c := n.children[i].mutableFor(n.cow) - n.children[i] = c - return c -} - -// split splits the given node at the given index. The current node shrinks, -// and this function returns the item that existed at that index and a new node -// containing all items/children after it. -func (n *node) split(i int) (Item, *node) { - item := n.items[i] - next := n.cow.newNode() - next.items = append(next.items, n.items[i+1:]...) - n.items.truncate(i) - if len(n.children) > 0 { - next.children = append(next.children, n.children[i+1:]...) - n.children.truncate(i + 1) - } - return item, next -} - -// maybeSplitChild checks if a child should be split, and if so splits it. -// Returns whether or not a split occurred. -func (n *node) maybeSplitChild(i, maxItems int) bool { - if len(n.children[i].items) < maxItems { - return false - } - first := n.mutableChild(i) - item, second := first.split(maxItems / 2) - n.items.insertAt(i, item) - n.children.insertAt(i+1, second) - return true -} - -// insert inserts an item into the subtree rooted at this node, making sure -// no nodes in the subtree exceed maxItems items. Should an equivalent item be -// be found/replaced by insert, it will be returned. -func (n *node) insert(item Item, maxItems int) Item { - i, found := n.items.find(item) - if found { - out := n.items[i] - n.items[i] = item - return out - } - if len(n.children) == 0 { - n.items.insertAt(i, item) - return nil - } - if n.maybeSplitChild(i, maxItems) { - inTree := n.items[i] - switch { - case item.Less(inTree): - // no change, we want first split node - case inTree.Less(item): - i++ // we want second split node - default: - out := n.items[i] - n.items[i] = item - return out - } - } - return n.mutableChild(i).insert(item, maxItems) -} - -// get finds the given key in the subtree and returns it. -func (n *node) get(key Item) Item { - i, found := n.items.find(key) - if found { - return n.items[i] - } else if len(n.children) > 0 { - return n.children[i].get(key) - } - return nil -} - -// min returns the first item in the subtree. -func min(n *node) Item { - if n == nil { - return nil - } - for len(n.children) > 0 { - n = n.children[0] - } - if len(n.items) == 0 { - return nil - } - return n.items[0] -} - -// max returns the last item in the subtree. -func max(n *node) Item { - if n == nil { - return nil - } - for len(n.children) > 0 { - n = n.children[len(n.children)-1] - } - if len(n.items) == 0 { - return nil - } - return n.items[len(n.items)-1] -} - -// toRemove details what item to remove in a node.remove call. -type toRemove int - -const ( - removeItem toRemove = iota // removes the given item - removeMin // removes smallest item in the subtree - removeMax // removes largest item in the subtree -) - -// remove removes an item from the subtree rooted at this node. -func (n *node) remove(item Item, minItems int, typ toRemove) Item { - var i int - var found bool - switch typ { - case removeMax: - if len(n.children) == 0 { - return n.items.pop() - } - i = len(n.items) - case removeMin: - if len(n.children) == 0 { - return n.items.removeAt(0) - } - i = 0 - case removeItem: - i, found = n.items.find(item) - if len(n.children) == 0 { - if found { - return n.items.removeAt(i) - } - return nil - } - default: - panic("invalid type") - } - // If we get to here, we have children. - if len(n.children[i].items) <= minItems { - return n.growChildAndRemove(i, item, minItems, typ) - } - child := n.mutableChild(i) - // Either we had enough items to begin with, or we've done some - // merging/stealing, because we've got enough now and we're ready to return - // stuff. - if found { - // The item exists at index 'i', and the child we've selected can give us a - // predecessor, since if we've gotten here it's got > minItems items in it. - out := n.items[i] - // We use our special-case 'remove' call with typ=maxItem to pull the - // predecessor of item i (the rightmost leaf of our immediate left child) - // and set it into where we pulled the item from. - n.items[i] = child.remove(nil, minItems, removeMax) - return out - } - // Final recursive call. Once we're here, we know that the item isn't in this - // node and that the child is big enough to remove from. - return child.remove(item, minItems, typ) -} - -// growChildAndRemove grows child 'i' to make sure it's possible to remove an -// item from it while keeping it at minItems, then calls remove to actually -// remove it. -// -// Most documentation says we have to do two sets of special casing: -// 1) item is in this node -// 2) item is in child -// In both cases, we need to handle the two subcases: -// A) node has enough values that it can spare one -// B) node doesn't have enough values -// For the latter, we have to check: -// a) left sibling has node to spare -// b) right sibling has node to spare -// c) we must merge -// To simplify our code here, we handle cases #1 and #2 the same: -// If a node doesn't have enough items, we make sure it does (using a,b,c). -// We then simply redo our remove call, and the second time (regardless of -// whether we're in case 1 or 2), we'll have enough items and can guarantee -// that we hit case A. -func (n *node) growChildAndRemove(i int, item Item, minItems int, typ toRemove) Item { - if i > 0 && len(n.children[i-1].items) > minItems { - // Steal from left child - child := n.mutableChild(i) - stealFrom := n.mutableChild(i - 1) - stolenItem := stealFrom.items.pop() - child.items.insertAt(0, n.items[i-1]) - n.items[i-1] = stolenItem - if len(stealFrom.children) > 0 { - child.children.insertAt(0, stealFrom.children.pop()) - } - } else if i < len(n.items) && len(n.children[i+1].items) > minItems { - // steal from right child - child := n.mutableChild(i) - stealFrom := n.mutableChild(i + 1) - stolenItem := stealFrom.items.removeAt(0) - child.items = append(child.items, n.items[i]) - n.items[i] = stolenItem - if len(stealFrom.children) > 0 { - child.children = append(child.children, stealFrom.children.removeAt(0)) - } - } else { - if i >= len(n.items) { - i-- - } - child := n.mutableChild(i) - // merge with right child - mergeItem := n.items.removeAt(i) - mergeChild := n.children.removeAt(i + 1) - child.items = append(child.items, mergeItem) - child.items = append(child.items, mergeChild.items...) - child.children = append(child.children, mergeChild.children...) - n.cow.freeNode(mergeChild) - } - return n.remove(item, minItems, typ) -} - -type direction int - -const ( - descend = direction(-1) - ascend = direction(+1) -) - -// iterate provides a simple method for iterating over elements in the tree. -// -// When ascending, the 'start' should be less than 'stop' and when descending, -// the 'start' should be greater than 'stop'. Setting 'includeStart' to true -// will force the iterator to include the first item when it equals 'start', -// thus creating a "greaterOrEqual" or "lessThanEqual" rather than just a -// "greaterThan" or "lessThan" queries. -func (n *node) iterate(dir direction, start, stop Item, includeStart bool, hit bool, iter ItemIterator) (bool, bool) { - var ok bool - switch dir { - case ascend: - for i := 0; i < len(n.items); i++ { - if start != nil && n.items[i].Less(start) { - continue - } - if len(n.children) > 0 { - if hit, ok = n.children[i].iterate(dir, start, stop, includeStart, hit, iter); !ok { - return hit, false - } - } - if !includeStart && !hit && start != nil && !start.Less(n.items[i]) { - hit = true - continue - } - hit = true - if stop != nil && !n.items[i].Less(stop) { - return hit, false - } - if !iter(n.items[i]) { - return hit, false - } - } - if len(n.children) > 0 { - if hit, ok = n.children[len(n.children)-1].iterate(dir, start, stop, includeStart, hit, iter); !ok { - return hit, false - } - } - case descend: - for i := len(n.items) - 1; i >= 0; i-- { - if start != nil && !n.items[i].Less(start) { - if !includeStart || hit || start.Less(n.items[i]) { - continue - } - } - if len(n.children) > 0 { - if hit, ok = n.children[i+1].iterate(dir, start, stop, includeStart, hit, iter); !ok { - return hit, false - } - } - if stop != nil && !stop.Less(n.items[i]) { - return hit, false // continue - } - hit = true - if !iter(n.items[i]) { - return hit, false - } - } - if len(n.children) > 0 { - if hit, ok = n.children[0].iterate(dir, start, stop, includeStart, hit, iter); !ok { - return hit, false - } - } - } - return hit, true -} - -// Used for testing/debugging purposes. -func (n *node) print(w io.Writer, level int) { - fmt.Fprintf(w, "%sNODE:%v\n", strings.Repeat(" ", level), n.items) - for _, c := range n.children { - c.print(w, level+1) - } -} - -// BTree is an implementation of a B-Tree. -// -// BTree stores Item instances in an ordered structure, allowing easy insertion, -// removal, and iteration. -// -// Write operations are not safe for concurrent mutation by multiple -// goroutines, but Read operations are. -type BTree struct { - degree int - length int - root *node - cow *copyOnWriteContext -} - -// copyOnWriteContext pointers determine node ownership... a tree with a write -// context equivalent to a node's write context is allowed to modify that node. -// A tree whose write context does not match a node's is not allowed to modify -// it, and must create a new, writable copy (IE: it's a Clone). -// -// When doing any write operation, we maintain the invariant that the current -// node's context is equal to the context of the tree that requested the write. -// We do this by, before we descend into any node, creating a copy with the -// correct context if the contexts don't match. -// -// Since the node we're currently visiting on any write has the requesting -// tree's context, that node is modifiable in place. Children of that node may -// not share context, but before we descend into them, we'll make a mutable -// copy. -type copyOnWriteContext struct { - freelist *FreeList -} - -// Clone clones the btree, lazily. Clone should not be called concurrently, -// but the original tree (t) and the new tree (t2) can be used concurrently -// once the Clone call completes. -// -// The internal tree structure of b is marked read-only and shared between t and -// t2. Writes to both t and t2 use copy-on-write logic, creating new nodes -// whenever one of b's original nodes would have been modified. Read operations -// should have no performance degredation. Write operations for both t and t2 -// will initially experience minor slow-downs caused by additional allocs and -// copies due to the aforementioned copy-on-write logic, but should converge to -// the original performance characteristics of the original tree. -func (t *BTree) Clone() (t2 *BTree) { - // Create two entirely new copy-on-write contexts. - // This operation effectively creates three trees: - // the original, shared nodes (old b.cow) - // the new b.cow nodes - // the new out.cow nodes - cow1, cow2 := *t.cow, *t.cow - out := *t - t.cow = &cow1 - out.cow = &cow2 - return &out -} - -// maxItems returns the max number of items to allow per node. -func (t *BTree) maxItems() int { - return t.degree*2 - 1 -} - -// minItems returns the min number of items to allow per node (ignored for the -// root node). -func (t *BTree) minItems() int { - return t.degree - 1 -} - -func (c *copyOnWriteContext) newNode() (n *node) { - n = c.freelist.newNode() - n.cow = c - return -} - -func (c *copyOnWriteContext) freeNode(n *node) { - if n.cow == c { - // clear to allow GC - n.items.truncate(0) - n.children.truncate(0) - n.cow = nil - c.freelist.freeNode(n) - } -} - -// ReplaceOrInsert adds the given item to the tree. If an item in the tree -// already equals the given one, it is removed from the tree and returned. -// Otherwise, nil is returned. -// -// nil cannot be added to the tree (will panic). -func (t *BTree) ReplaceOrInsert(item Item) Item { - if item == nil { - panic("nil item being added to BTree") - } - if t.root == nil { - t.root = t.cow.newNode() - t.root.items = append(t.root.items, item) - t.length++ - return nil - } else { - t.root = t.root.mutableFor(t.cow) - if len(t.root.items) >= t.maxItems() { - item2, second := t.root.split(t.maxItems() / 2) - oldroot := t.root - t.root = t.cow.newNode() - t.root.items = append(t.root.items, item2) - t.root.children = append(t.root.children, oldroot, second) - } - } - out := t.root.insert(item, t.maxItems()) - if out == nil { - t.length++ - } - return out -} - -// Delete removes an item equal to the passed in item from the tree, returning -// it. If no such item exists, returns nil. -func (t *BTree) Delete(item Item) Item { - return t.deleteItem(item, removeItem) -} - -// DeleteMin removes the smallest item in the tree and returns it. -// If no such item exists, returns nil. -func (t *BTree) DeleteMin() Item { - return t.deleteItem(nil, removeMin) -} - -// DeleteMax removes the largest item in the tree and returns it. -// If no such item exists, returns nil. -func (t *BTree) DeleteMax() Item { - return t.deleteItem(nil, removeMax) -} - -func (t *BTree) deleteItem(item Item, typ toRemove) Item { - if t.root == nil || len(t.root.items) == 0 { - return nil - } - t.root = t.root.mutableFor(t.cow) - out := t.root.remove(item, t.minItems(), typ) - if len(t.root.items) == 0 && len(t.root.children) > 0 { - oldroot := t.root - t.root = t.root.children[0] - t.cow.freeNode(oldroot) - } - if out != nil { - t.length-- - } - return out -} - -// AscendRange calls the iterator for every value in the tree within the range -// [greaterOrEqual, lessThan), until iterator returns false. -func (t *BTree) AscendRange(greaterOrEqual, lessThan Item, iterator ItemIterator) { - if t.root == nil { - return - } - t.root.iterate(ascend, greaterOrEqual, lessThan, true, false, iterator) -} - -// AscendLessThan calls the iterator for every value in the tree within the range -// [first, pivot), until iterator returns false. -func (t *BTree) AscendLessThan(pivot Item, iterator ItemIterator) { - if t.root == nil { - return - } - t.root.iterate(ascend, nil, pivot, false, false, iterator) -} - -// AscendGreaterOrEqual calls the iterator for every value in the tree within -// the range [pivot, last], until iterator returns false. -func (t *BTree) AscendGreaterOrEqual(pivot Item, iterator ItemIterator) { - if t.root == nil { - return - } - t.root.iterate(ascend, pivot, nil, true, false, iterator) -} - -// Ascend calls the iterator for every value in the tree within the range -// [first, last], until iterator returns false. -func (t *BTree) Ascend(iterator ItemIterator) { - if t.root == nil { - return - } - t.root.iterate(ascend, nil, nil, false, false, iterator) -} - -// DescendRange calls the iterator for every value in the tree within the range -// [lessOrEqual, greaterThan), until iterator returns false. -func (t *BTree) DescendRange(lessOrEqual, greaterThan Item, iterator ItemIterator) { - if t.root == nil { - return - } - t.root.iterate(descend, lessOrEqual, greaterThan, true, false, iterator) -} - -// DescendLessOrEqual calls the iterator for every value in the tree within the range -// [pivot, first], until iterator returns false. -func (t *BTree) DescendLessOrEqual(pivot Item, iterator ItemIterator) { - if t.root == nil { - return - } - t.root.iterate(descend, pivot, nil, true, false, iterator) -} - -// DescendGreaterThan calls the iterator for every value in the tree within -// the range (pivot, last], until iterator returns false. -func (t *BTree) DescendGreaterThan(pivot Item, iterator ItemIterator) { - if t.root == nil { - return - } - t.root.iterate(descend, nil, pivot, false, false, iterator) -} - -// Descend calls the iterator for every value in the tree within the range -// [last, first], until iterator returns false. -func (t *BTree) Descend(iterator ItemIterator) { - if t.root == nil { - return - } - t.root.iterate(descend, nil, nil, false, false, iterator) -} - -// Get looks for the key item in the tree, returning it. It returns nil if -// unable to find that item. -func (t *BTree) Get(key Item) Item { - if t.root == nil { - return nil - } - return t.root.get(key) -} - -// Min returns the smallest item in the tree, or nil if the tree is empty. -func (t *BTree) Min() Item { - return min(t.root) -} - -// Max returns the largest item in the tree, or nil if the tree is empty. -func (t *BTree) Max() Item { - return max(t.root) -} - -// Has returns true if the given key is in the tree. -func (t *BTree) Has(key Item) bool { - return t.Get(key) != nil -} - -// Len returns the number of items currently in the tree. -func (t *BTree) Len() int { - return t.length -} - -// Int implements the Item interface for integers. -type Int int - -// Less returns true if int(a) < int(b). -func (a Int) Less(b Item) bool { - return a < b.(Int) -} diff --git a/vendor/github.com/google/btree/btree_mem.go b/vendor/github.com/google/btree/btree_mem.go deleted file mode 100644 index cb95b7fa1..000000000 --- a/vendor/github.com/google/btree/btree_mem.go +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2014 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build ignore - -// This binary compares memory usage between btree and gollrb. -package main - -import ( - "flag" - "fmt" - "math/rand" - "runtime" - "time" - - "github.com/google/btree" - "github.com/petar/GoLLRB/llrb" -) - -var ( - size = flag.Int("size", 1000000, "size of the tree to build") - degree = flag.Int("degree", 8, "degree of btree") - gollrb = flag.Bool("llrb", false, "use llrb instead of btree") -) - -func main() { - flag.Parse() - vals := rand.Perm(*size) - var t, v interface{} - v = vals - var stats runtime.MemStats - for i := 0; i < 10; i++ { - runtime.GC() - } - fmt.Println("-------- BEFORE ----------") - runtime.ReadMemStats(&stats) - fmt.Printf("%+v\n", stats) - start := time.Now() - if *gollrb { - tr := llrb.New() - for _, v := range vals { - tr.ReplaceOrInsert(llrb.Int(v)) - } - t = tr // keep it around - } else { - tr := btree.New(*degree) - for _, v := range vals { - tr.ReplaceOrInsert(btree.Int(v)) - } - t = tr // keep it around - } - fmt.Printf("%v inserts in %v\n", *size, time.Since(start)) - fmt.Println("-------- AFTER ----------") - runtime.ReadMemStats(&stats) - fmt.Printf("%+v\n", stats) - for i := 0; i < 10; i++ { - runtime.GC() - } - fmt.Println("-------- AFTER GC ----------") - runtime.ReadMemStats(&stats) - fmt.Printf("%+v\n", stats) - if t == v { - fmt.Println("to make sure vals and tree aren't GC'd") - } -} diff --git a/vendor/github.com/google/btree/btree_test.go b/vendor/github.com/google/btree/btree_test.go deleted file mode 100644 index 5da9d8b69..000000000 --- a/vendor/github.com/google/btree/btree_test.go +++ /dev/null @@ -1,689 +0,0 @@ -// Copyright 2014 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package btree - -import ( - "flag" - "fmt" - "math/rand" - "reflect" - "sort" - "sync" - "testing" - "time" -) - -func init() { - seed := time.Now().Unix() - fmt.Println(seed) - rand.Seed(seed) -} - -// perm returns a random permutation of n Int items in the range [0, n). -func perm(n int) (out []Item) { - for _, v := range rand.Perm(n) { - out = append(out, Int(v)) - } - return -} - -// rang returns an ordered list of Int items in the range [0, n). -func rang(n int) (out []Item) { - for i := 0; i < n; i++ { - out = append(out, Int(i)) - } - return -} - -// all extracts all items from a tree in order as a slice. -func all(t *BTree) (out []Item) { - t.Ascend(func(a Item) bool { - out = append(out, a) - return true - }) - return -} - -// rangerev returns a reversed ordered list of Int items in the range [0, n). -func rangrev(n int) (out []Item) { - for i := n - 1; i >= 0; i-- { - out = append(out, Int(i)) - } - return -} - -// allrev extracts all items from a tree in reverse order as a slice. -func allrev(t *BTree) (out []Item) { - t.Descend(func(a Item) bool { - out = append(out, a) - return true - }) - return -} - -var btreeDegree = flag.Int("degree", 32, "B-Tree degree") - -func TestBTree(t *testing.T) { - tr := New(*btreeDegree) - const treeSize = 10000 - for i := 0; i < 10; i++ { - if min := tr.Min(); min != nil { - t.Fatalf("empty min, got %+v", min) - } - if max := tr.Max(); max != nil { - t.Fatalf("empty max, got %+v", max) - } - for _, item := range perm(treeSize) { - if x := tr.ReplaceOrInsert(item); x != nil { - t.Fatal("insert found item", item) - } - } - for _, item := range perm(treeSize) { - if x := tr.ReplaceOrInsert(item); x == nil { - t.Fatal("insert didn't find item", item) - } - } - if min, want := tr.Min(), Item(Int(0)); min != want { - t.Fatalf("min: want %+v, got %+v", want, min) - } - if max, want := tr.Max(), Item(Int(treeSize-1)); max != want { - t.Fatalf("max: want %+v, got %+v", want, max) - } - got := all(tr) - want := rang(treeSize) - if !reflect.DeepEqual(got, want) { - t.Fatalf("mismatch:\n got: %v\nwant: %v", got, want) - } - - gotrev := allrev(tr) - wantrev := rangrev(treeSize) - if !reflect.DeepEqual(gotrev, wantrev) { - t.Fatalf("mismatch:\n got: %v\nwant: %v", got, want) - } - - for _, item := range perm(treeSize) { - if x := tr.Delete(item); x == nil { - t.Fatalf("didn't find %v", item) - } - } - if got = all(tr); len(got) > 0 { - t.Fatalf("some left!: %v", got) - } - } -} - -func ExampleBTree() { - tr := New(*btreeDegree) - for i := Int(0); i < 10; i++ { - tr.ReplaceOrInsert(i) - } - fmt.Println("len: ", tr.Len()) - fmt.Println("get3: ", tr.Get(Int(3))) - fmt.Println("get100: ", tr.Get(Int(100))) - fmt.Println("del4: ", tr.Delete(Int(4))) - fmt.Println("del100: ", tr.Delete(Int(100))) - fmt.Println("replace5: ", tr.ReplaceOrInsert(Int(5))) - fmt.Println("replace100:", tr.ReplaceOrInsert(Int(100))) - fmt.Println("min: ", tr.Min()) - fmt.Println("delmin: ", tr.DeleteMin()) - fmt.Println("max: ", tr.Max()) - fmt.Println("delmax: ", tr.DeleteMax()) - fmt.Println("len: ", tr.Len()) - // Output: - // len: 10 - // get3: 3 - // get100: - // del4: 4 - // del100: - // replace5: 5 - // replace100: - // min: 0 - // delmin: 0 - // max: 100 - // delmax: 100 - // len: 8 -} - -func TestDeleteMin(t *testing.T) { - tr := New(3) - for _, v := range perm(100) { - tr.ReplaceOrInsert(v) - } - var got []Item - for v := tr.DeleteMin(); v != nil; v = tr.DeleteMin() { - got = append(got, v) - } - if want := rang(100); !reflect.DeepEqual(got, want) { - t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) - } -} - -func TestDeleteMax(t *testing.T) { - tr := New(3) - for _, v := range perm(100) { - tr.ReplaceOrInsert(v) - } - var got []Item - for v := tr.DeleteMax(); v != nil; v = tr.DeleteMax() { - got = append(got, v) - } - // Reverse our list. - for i := 0; i < len(got)/2; i++ { - got[i], got[len(got)-i-1] = got[len(got)-i-1], got[i] - } - if want := rang(100); !reflect.DeepEqual(got, want) { - t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) - } -} - -func TestAscendRange(t *testing.T) { - tr := New(2) - for _, v := range perm(100) { - tr.ReplaceOrInsert(v) - } - var got []Item - tr.AscendRange(Int(40), Int(60), func(a Item) bool { - got = append(got, a) - return true - }) - if want := rang(100)[40:60]; !reflect.DeepEqual(got, want) { - t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) - } - got = got[:0] - tr.AscendRange(Int(40), Int(60), func(a Item) bool { - if a.(Int) > 50 { - return false - } - got = append(got, a) - return true - }) - if want := rang(100)[40:51]; !reflect.DeepEqual(got, want) { - t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) - } -} - -func TestDescendRange(t *testing.T) { - tr := New(2) - for _, v := range perm(100) { - tr.ReplaceOrInsert(v) - } - var got []Item - tr.DescendRange(Int(60), Int(40), func(a Item) bool { - got = append(got, a) - return true - }) - if want := rangrev(100)[39:59]; !reflect.DeepEqual(got, want) { - t.Fatalf("descendrange:\n got: %v\nwant: %v", got, want) - } - got = got[:0] - tr.DescendRange(Int(60), Int(40), func(a Item) bool { - if a.(Int) < 50 { - return false - } - got = append(got, a) - return true - }) - if want := rangrev(100)[39:50]; !reflect.DeepEqual(got, want) { - t.Fatalf("descendrange:\n got: %v\nwant: %v", got, want) - } -} -func TestAscendLessThan(t *testing.T) { - tr := New(*btreeDegree) - for _, v := range perm(100) { - tr.ReplaceOrInsert(v) - } - var got []Item - tr.AscendLessThan(Int(60), func(a Item) bool { - got = append(got, a) - return true - }) - if want := rang(100)[:60]; !reflect.DeepEqual(got, want) { - t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) - } - got = got[:0] - tr.AscendLessThan(Int(60), func(a Item) bool { - if a.(Int) > 50 { - return false - } - got = append(got, a) - return true - }) - if want := rang(100)[:51]; !reflect.DeepEqual(got, want) { - t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) - } -} - -func TestDescendLessOrEqual(t *testing.T) { - tr := New(*btreeDegree) - for _, v := range perm(100) { - tr.ReplaceOrInsert(v) - } - var got []Item - tr.DescendLessOrEqual(Int(40), func(a Item) bool { - got = append(got, a) - return true - }) - if want := rangrev(100)[59:]; !reflect.DeepEqual(got, want) { - t.Fatalf("descendlessorequal:\n got: %v\nwant: %v", got, want) - } - got = got[:0] - tr.DescendLessOrEqual(Int(60), func(a Item) bool { - if a.(Int) < 50 { - return false - } - got = append(got, a) - return true - }) - if want := rangrev(100)[39:50]; !reflect.DeepEqual(got, want) { - t.Fatalf("descendlessorequal:\n got: %v\nwant: %v", got, want) - } -} -func TestAscendGreaterOrEqual(t *testing.T) { - tr := New(*btreeDegree) - for _, v := range perm(100) { - tr.ReplaceOrInsert(v) - } - var got []Item - tr.AscendGreaterOrEqual(Int(40), func(a Item) bool { - got = append(got, a) - return true - }) - if want := rang(100)[40:]; !reflect.DeepEqual(got, want) { - t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) - } - got = got[:0] - tr.AscendGreaterOrEqual(Int(40), func(a Item) bool { - if a.(Int) > 50 { - return false - } - got = append(got, a) - return true - }) - if want := rang(100)[40:51]; !reflect.DeepEqual(got, want) { - t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) - } -} - -func TestDescendGreaterThan(t *testing.T) { - tr := New(*btreeDegree) - for _, v := range perm(100) { - tr.ReplaceOrInsert(v) - } - var got []Item - tr.DescendGreaterThan(Int(40), func(a Item) bool { - got = append(got, a) - return true - }) - if want := rangrev(100)[:59]; !reflect.DeepEqual(got, want) { - t.Fatalf("descendgreaterthan:\n got: %v\nwant: %v", got, want) - } - got = got[:0] - tr.DescendGreaterThan(Int(40), func(a Item) bool { - if a.(Int) < 50 { - return false - } - got = append(got, a) - return true - }) - if want := rangrev(100)[:50]; !reflect.DeepEqual(got, want) { - t.Fatalf("descendgreaterthan:\n got: %v\nwant: %v", got, want) - } -} - -const benchmarkTreeSize = 10000 - -func BenchmarkInsert(b *testing.B) { - b.StopTimer() - insertP := perm(benchmarkTreeSize) - b.StartTimer() - i := 0 - for i < b.N { - tr := New(*btreeDegree) - for _, item := range insertP { - tr.ReplaceOrInsert(item) - i++ - if i >= b.N { - return - } - } - } -} - -func BenchmarkDeleteInsert(b *testing.B) { - b.StopTimer() - insertP := perm(benchmarkTreeSize) - tr := New(*btreeDegree) - for _, item := range insertP { - tr.ReplaceOrInsert(item) - } - b.StartTimer() - for i := 0; i < b.N; i++ { - tr.Delete(insertP[i%benchmarkTreeSize]) - tr.ReplaceOrInsert(insertP[i%benchmarkTreeSize]) - } -} - -func BenchmarkDeleteInsertCloneOnce(b *testing.B) { - b.StopTimer() - insertP := perm(benchmarkTreeSize) - tr := New(*btreeDegree) - for _, item := range insertP { - tr.ReplaceOrInsert(item) - } - tr = tr.Clone() - b.StartTimer() - for i := 0; i < b.N; i++ { - tr.Delete(insertP[i%benchmarkTreeSize]) - tr.ReplaceOrInsert(insertP[i%benchmarkTreeSize]) - } -} - -func BenchmarkDeleteInsertCloneEachTime(b *testing.B) { - b.StopTimer() - insertP := perm(benchmarkTreeSize) - tr := New(*btreeDegree) - for _, item := range insertP { - tr.ReplaceOrInsert(item) - } - b.StartTimer() - for i := 0; i < b.N; i++ { - tr = tr.Clone() - tr.Delete(insertP[i%benchmarkTreeSize]) - tr.ReplaceOrInsert(insertP[i%benchmarkTreeSize]) - } -} - -func BenchmarkDelete(b *testing.B) { - b.StopTimer() - insertP := perm(benchmarkTreeSize) - removeP := perm(benchmarkTreeSize) - b.StartTimer() - i := 0 - for i < b.N { - b.StopTimer() - tr := New(*btreeDegree) - for _, v := range insertP { - tr.ReplaceOrInsert(v) - } - b.StartTimer() - for _, item := range removeP { - tr.Delete(item) - i++ - if i >= b.N { - return - } - } - if tr.Len() > 0 { - panic(tr.Len()) - } - } -} - -func BenchmarkGet(b *testing.B) { - b.StopTimer() - insertP := perm(benchmarkTreeSize) - removeP := perm(benchmarkTreeSize) - b.StartTimer() - i := 0 - for i < b.N { - b.StopTimer() - tr := New(*btreeDegree) - for _, v := range insertP { - tr.ReplaceOrInsert(v) - } - b.StartTimer() - for _, item := range removeP { - tr.Get(item) - i++ - if i >= b.N { - return - } - } - } -} - -func BenchmarkGetCloneEachTime(b *testing.B) { - b.StopTimer() - insertP := perm(benchmarkTreeSize) - removeP := perm(benchmarkTreeSize) - b.StartTimer() - i := 0 - for i < b.N { - b.StopTimer() - tr := New(*btreeDegree) - for _, v := range insertP { - tr.ReplaceOrInsert(v) - } - b.StartTimer() - for _, item := range removeP { - tr = tr.Clone() - tr.Get(item) - i++ - if i >= b.N { - return - } - } - } -} - -type byInts []Item - -func (a byInts) Len() int { - return len(a) -} - -func (a byInts) Less(i, j int) bool { - return a[i].(Int) < a[j].(Int) -} - -func (a byInts) Swap(i, j int) { - a[i], a[j] = a[j], a[i] -} - -func BenchmarkAscend(b *testing.B) { - arr := perm(benchmarkTreeSize) - tr := New(*btreeDegree) - for _, v := range arr { - tr.ReplaceOrInsert(v) - } - sort.Sort(byInts(arr)) - b.ResetTimer() - for i := 0; i < b.N; i++ { - j := 0 - tr.Ascend(func(item Item) bool { - if item.(Int) != arr[j].(Int) { - b.Fatalf("mismatch: expected: %v, got %v", arr[j].(Int), item.(Int)) - } - j++ - return true - }) - } -} - -func BenchmarkDescend(b *testing.B) { - arr := perm(benchmarkTreeSize) - tr := New(*btreeDegree) - for _, v := range arr { - tr.ReplaceOrInsert(v) - } - sort.Sort(byInts(arr)) - b.ResetTimer() - for i := 0; i < b.N; i++ { - j := len(arr) - 1 - tr.Descend(func(item Item) bool { - if item.(Int) != arr[j].(Int) { - b.Fatalf("mismatch: expected: %v, got %v", arr[j].(Int), item.(Int)) - } - j-- - return true - }) - } -} -func BenchmarkAscendRange(b *testing.B) { - arr := perm(benchmarkTreeSize) - tr := New(*btreeDegree) - for _, v := range arr { - tr.ReplaceOrInsert(v) - } - sort.Sort(byInts(arr)) - b.ResetTimer() - for i := 0; i < b.N; i++ { - j := 100 - tr.AscendRange(Int(100), arr[len(arr)-100], func(item Item) bool { - if item.(Int) != arr[j].(Int) { - b.Fatalf("mismatch: expected: %v, got %v", arr[j].(Int), item.(Int)) - } - j++ - return true - }) - if j != len(arr)-100 { - b.Fatalf("expected: %v, got %v", len(arr)-100, j) - } - } -} - -func BenchmarkDescendRange(b *testing.B) { - arr := perm(benchmarkTreeSize) - tr := New(*btreeDegree) - for _, v := range arr { - tr.ReplaceOrInsert(v) - } - sort.Sort(byInts(arr)) - b.ResetTimer() - for i := 0; i < b.N; i++ { - j := len(arr) - 100 - tr.DescendRange(arr[len(arr)-100], Int(100), func(item Item) bool { - if item.(Int) != arr[j].(Int) { - b.Fatalf("mismatch: expected: %v, got %v", arr[j].(Int), item.(Int)) - } - j-- - return true - }) - if j != 100 { - b.Fatalf("expected: %v, got %v", len(arr)-100, j) - } - } -} -func BenchmarkAscendGreaterOrEqual(b *testing.B) { - arr := perm(benchmarkTreeSize) - tr := New(*btreeDegree) - for _, v := range arr { - tr.ReplaceOrInsert(v) - } - sort.Sort(byInts(arr)) - b.ResetTimer() - for i := 0; i < b.N; i++ { - j := 100 - k := 0 - tr.AscendGreaterOrEqual(Int(100), func(item Item) bool { - if item.(Int) != arr[j].(Int) { - b.Fatalf("mismatch: expected: %v, got %v", arr[j].(Int), item.(Int)) - } - j++ - k++ - return true - }) - if j != len(arr) { - b.Fatalf("expected: %v, got %v", len(arr), j) - } - if k != len(arr)-100 { - b.Fatalf("expected: %v, got %v", len(arr)-100, k) - } - } -} -func BenchmarkDescendLessOrEqual(b *testing.B) { - arr := perm(benchmarkTreeSize) - tr := New(*btreeDegree) - for _, v := range arr { - tr.ReplaceOrInsert(v) - } - sort.Sort(byInts(arr)) - b.ResetTimer() - for i := 0; i < b.N; i++ { - j := len(arr) - 100 - k := len(arr) - tr.DescendLessOrEqual(arr[len(arr)-100], func(item Item) bool { - if item.(Int) != arr[j].(Int) { - b.Fatalf("mismatch: expected: %v, got %v", arr[j].(Int), item.(Int)) - } - j-- - k-- - return true - }) - if j != -1 { - b.Fatalf("expected: %v, got %v", -1, j) - } - if k != 99 { - b.Fatalf("expected: %v, got %v", 99, k) - } - } -} - -const cloneTestSize = 10000 - -func cloneTest(t *testing.T, b *BTree, start int, p []Item, wg *sync.WaitGroup, trees *[]*BTree) { - t.Logf("Starting new clone at %v", start) - *trees = append(*trees, b) - for i := start; i < cloneTestSize; i++ { - b.ReplaceOrInsert(p[i]) - if i%(cloneTestSize/5) == 0 { - wg.Add(1) - go cloneTest(t, b.Clone(), i+1, p, wg, trees) - } - } - wg.Done() -} - -func TestCloneConcurrentOperations(t *testing.T) { - b := New(*btreeDegree) - trees := []*BTree{} - p := perm(cloneTestSize) - var wg sync.WaitGroup - wg.Add(1) - go cloneTest(t, b, 0, p, &wg, &trees) - wg.Wait() - want := rang(cloneTestSize) - t.Logf("Starting equality checks on %d trees", len(trees)) - for i, tree := range trees { - if !reflect.DeepEqual(want, all(tree)) { - t.Errorf("tree %v mismatch", i) - } - } - t.Log("Removing half from first half") - toRemove := rang(cloneTestSize)[cloneTestSize/2:] - for i := 0; i < len(trees)/2; i++ { - tree := trees[i] - wg.Add(1) - go func() { - for _, item := range toRemove { - tree.Delete(item) - } - wg.Done() - }() - } - wg.Wait() - t.Log("Checking all values again") - for i, tree := range trees { - var wantpart []Item - if i < len(trees)/2 { - wantpart = want[:cloneTestSize/2] - } else { - wantpart = want - } - if got := all(tree); !reflect.DeepEqual(wantpart, got) { - t.Errorf("tree %v mismatch, want %v got %v", i, len(want), len(got)) - } - } -} diff --git a/vendor/github.com/gregjones/httpcache/.travis.yml b/vendor/github.com/gregjones/httpcache/.travis.yml deleted file mode 100644 index 2bca4c599..000000000 --- a/vendor/github.com/gregjones/httpcache/.travis.yml +++ /dev/null @@ -1,18 +0,0 @@ -sudo: false -language: go -go: - - 1.6.x - - 1.7.x - - 1.8.x - - master -matrix: - allow_failures: - - go: master - fast_finish: true -install: - - # Do nothing. This is needed to prevent default install action "go get -t -v ./..." from happening here (we want it to happen inside script step). -script: - - go get -t -v ./... - - diff -u <(echo -n) <(gofmt -d .) - - go tool vet . - - go test -v -race ./... diff --git a/vendor/github.com/gregjones/httpcache/LICENSE.txt b/vendor/github.com/gregjones/httpcache/LICENSE.txt deleted file mode 100644 index 81316beb0..000000000 --- a/vendor/github.com/gregjones/httpcache/LICENSE.txt +++ /dev/null @@ -1,7 +0,0 @@ -Copyright © 2012 Greg Jones (greg.jones@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/vendor/github.com/gregjones/httpcache/README.md b/vendor/github.com/gregjones/httpcache/README.md deleted file mode 100644 index 61bd830e5..000000000 --- a/vendor/github.com/gregjones/httpcache/README.md +++ /dev/null @@ -1,24 +0,0 @@ -httpcache -========= - -[![Build Status](https://travis-ci.org/gregjones/httpcache.svg?branch=master)](https://travis-ci.org/gregjones/httpcache) [![GoDoc](https://godoc.org/github.com/gregjones/httpcache?status.svg)](https://godoc.org/github.com/gregjones/httpcache) - -Package httpcache provides a http.RoundTripper implementation that works as a mostly RFC-compliant cache for http responses. - -It is only suitable for use as a 'private' cache (i.e. for a web-browser or an API-client and not for a shared proxy). - -Cache Backends --------------- - -- The built-in 'memory' cache stores responses in an in-memory map. -- [`github.com/gregjones/httpcache/diskcache`](https://github.com/gregjones/httpcache/tree/master/diskcache) provides a filesystem-backed cache using the [diskv](https://github.com/peterbourgon/diskv) library. -- [`github.com/gregjones/httpcache/memcache`](https://github.com/gregjones/httpcache/tree/master/memcache) provides memcache implementations, for both App Engine and 'normal' memcache servers. -- [`sourcegraph.com/sourcegraph/s3cache`](https://sourcegraph.com/github.com/sourcegraph/s3cache) uses Amazon S3 for storage. -- [`github.com/gregjones/httpcache/leveldbcache`](https://github.com/gregjones/httpcache/tree/master/leveldbcache) provides a filesystem-backed cache using [leveldb](https://github.com/syndtr/goleveldb/leveldb). -- [`github.com/die-net/lrucache`](https://github.com/die-net/lrucache) provides an in-memory cache that will evict least-recently used entries. -- [`github.com/die-net/lrucache/twotier`](https://github.com/die-net/lrucache/tree/master/twotier) allows caches to be combined, for example to use lrucache above with a persistent disk-cache. - -License -------- - -- [MIT License](LICENSE.txt) diff --git a/vendor/github.com/gregjones/httpcache/diskcache/diskcache.go b/vendor/github.com/gregjones/httpcache/diskcache/diskcache.go deleted file mode 100644 index 42e3129d8..000000000 --- a/vendor/github.com/gregjones/httpcache/diskcache/diskcache.go +++ /dev/null @@ -1,61 +0,0 @@ -// Package diskcache provides an implementation of httpcache.Cache that uses the diskv package -// to supplement an in-memory map with persistent storage -// -package diskcache - -import ( - "bytes" - "crypto/md5" - "encoding/hex" - "github.com/peterbourgon/diskv" - "io" -) - -// Cache is an implementation of httpcache.Cache that supplements the in-memory map with persistent storage -type Cache struct { - d *diskv.Diskv -} - -// Get returns the response corresponding to key if present -func (c *Cache) Get(key string) (resp []byte, ok bool) { - key = keyToFilename(key) - resp, err := c.d.Read(key) - if err != nil { - return []byte{}, false - } - return resp, true -} - -// Set saves a response to the cache as key -func (c *Cache) Set(key string, resp []byte) { - key = keyToFilename(key) - c.d.WriteStream(key, bytes.NewReader(resp), true) -} - -// Delete removes the response with key from the cache -func (c *Cache) Delete(key string) { - key = keyToFilename(key) - c.d.Erase(key) -} - -func keyToFilename(key string) string { - h := md5.New() - io.WriteString(h, key) - return hex.EncodeToString(h.Sum(nil)) -} - -// New returns a new Cache that will store files in basePath -func New(basePath string) *Cache { - return &Cache{ - d: diskv.New(diskv.Options{ - BasePath: basePath, - CacheSizeMax: 100 * 1024 * 1024, // 100MB - }), - } -} - -// NewWithDiskv returns a new Cache using the provided Diskv as underlying -// storage. -func NewWithDiskv(d *diskv.Diskv) *Cache { - return &Cache{d} -} diff --git a/vendor/github.com/gregjones/httpcache/diskcache/diskcache_test.go b/vendor/github.com/gregjones/httpcache/diskcache/diskcache_test.go deleted file mode 100644 index 35c76cbd1..000000000 --- a/vendor/github.com/gregjones/httpcache/diskcache/diskcache_test.go +++ /dev/null @@ -1,42 +0,0 @@ -package diskcache - -import ( - "bytes" - "io/ioutil" - "os" - "testing" -) - -func TestDiskCache(t *testing.T) { - tempDir, err := ioutil.TempDir("", "httpcache") - if err != nil { - t.Fatalf("TempDir: %v", err) - } - defer os.RemoveAll(tempDir) - - cache := New(tempDir) - - key := "testKey" - _, ok := cache.Get(key) - if ok { - t.Fatal("retrieved key before adding it") - } - - val := []byte("some bytes") - cache.Set(key, val) - - retVal, ok := cache.Get(key) - if !ok { - t.Fatal("could not retrieve an element we just added") - } - if !bytes.Equal(retVal, val) { - t.Fatal("retrieved a different value than what we put in") - } - - cache.Delete(key) - - _, ok = cache.Get(key) - if ok { - t.Fatal("deleted key still present") - } -} diff --git a/vendor/github.com/gregjones/httpcache/httpcache.go b/vendor/github.com/gregjones/httpcache/httpcache.go deleted file mode 100644 index b26e167f0..000000000 --- a/vendor/github.com/gregjones/httpcache/httpcache.go +++ /dev/null @@ -1,557 +0,0 @@ -// Package httpcache provides a http.RoundTripper implementation that works as a -// mostly RFC-compliant cache for http responses. -// -// It is only suitable for use as a 'private' cache (i.e. for a web-browser or an API-client -// and not for a shared proxy). -// -package httpcache - -import ( - "bufio" - "bytes" - "errors" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/http/httputil" - "strings" - "sync" - "time" -) - -const ( - stale = iota - fresh - transparent - // XFromCache is the header added to responses that are returned from the cache - XFromCache = "X-From-Cache" -) - -// A Cache interface is used by the Transport to store and retrieve responses. -type Cache interface { - // Get returns the []byte representation of a cached response and a bool - // set to true if the value isn't empty - Get(key string) (responseBytes []byte, ok bool) - // Set stores the []byte representation of a response against a key - Set(key string, responseBytes []byte) - // Delete removes the value associated with the key - Delete(key string) -} - -// cacheKey returns the cache key for req. -func cacheKey(req *http.Request) string { - if req.Method == http.MethodGet { - return req.URL.String() - } else { - return req.Method + " " + req.URL.String() - } -} - -// CachedResponse returns the cached http.Response for req if present, and nil -// otherwise. -func CachedResponse(c Cache, req *http.Request) (resp *http.Response, err error) { - cachedVal, ok := c.Get(cacheKey(req)) - if !ok { - return - } - - b := bytes.NewBuffer(cachedVal) - return http.ReadResponse(bufio.NewReader(b), req) -} - -// MemoryCache is an implemtation of Cache that stores responses in an in-memory map. -type MemoryCache struct { - mu sync.RWMutex - items map[string][]byte -} - -// Get returns the []byte representation of the response and true if present, false if not -func (c *MemoryCache) Get(key string) (resp []byte, ok bool) { - c.mu.RLock() - resp, ok = c.items[key] - c.mu.RUnlock() - return resp, ok -} - -// Set saves response resp to the cache with key -func (c *MemoryCache) Set(key string, resp []byte) { - c.mu.Lock() - c.items[key] = resp - c.mu.Unlock() -} - -// Delete removes key from the cache -func (c *MemoryCache) Delete(key string) { - c.mu.Lock() - delete(c.items, key) - c.mu.Unlock() -} - -// NewMemoryCache returns a new Cache that will store items in an in-memory map -func NewMemoryCache() *MemoryCache { - c := &MemoryCache{items: map[string][]byte{}} - return c -} - -// Transport is an implementation of http.RoundTripper that will return values from a cache -// where possible (avoiding a network request) and will additionally add validators (etag/if-modified-since) -// to repeated requests allowing servers to return 304 / Not Modified -type Transport struct { - // The RoundTripper interface actually used to make requests - // If nil, http.DefaultTransport is used - Transport http.RoundTripper - Cache Cache - // If true, responses returned from the cache will be given an extra header, X-From-Cache - MarkCachedResponses bool -} - -// NewTransport returns a new Transport with the -// provided Cache implementation and MarkCachedResponses set to true -func NewTransport(c Cache) *Transport { - return &Transport{Cache: c, MarkCachedResponses: true} -} - -// Client returns an *http.Client that caches responses. -func (t *Transport) Client() *http.Client { - return &http.Client{Transport: t} -} - -// varyMatches will return false unless all of the cached values for the headers listed in Vary -// match the new request -func varyMatches(cachedResp *http.Response, req *http.Request) bool { - for _, header := range headerAllCommaSepValues(cachedResp.Header, "vary") { - header = http.CanonicalHeaderKey(header) - if header != "" && req.Header.Get(header) != cachedResp.Header.Get("X-Varied-"+header) { - return false - } - } - return true -} - -// RoundTrip takes a Request and returns a Response -// -// If there is a fresh Response already in cache, then it will be returned without connecting to -// the server. -// -// If there is a stale Response, then any validators it contains will be set on the new request -// to give the server a chance to respond with NotModified. If this happens, then the cached Response -// will be returned. -func (t *Transport) RoundTrip(req *http.Request) (resp *http.Response, err error) { - cacheKey := cacheKey(req) - cacheable := (req.Method == "GET" || req.Method == "HEAD") && req.Header.Get("range") == "" - var cachedResp *http.Response - if cacheable { - cachedResp, err = CachedResponse(t.Cache, req) - } else { - // Need to invalidate an existing value - t.Cache.Delete(cacheKey) - } - - transport := t.Transport - if transport == nil { - transport = http.DefaultTransport - } - - if cacheable && cachedResp != nil && err == nil { - if t.MarkCachedResponses { - cachedResp.Header.Set(XFromCache, "1") - } - - if varyMatches(cachedResp, req) { - // Can only use cached value if the new request doesn't Vary significantly - freshness := getFreshness(cachedResp.Header, req.Header) - if freshness == fresh { - return cachedResp, nil - } - - if freshness == stale { - var req2 *http.Request - // Add validators if caller hasn't already done so - etag := cachedResp.Header.Get("etag") - if etag != "" && req.Header.Get("etag") == "" { - req2 = cloneRequest(req) - req2.Header.Set("if-none-match", etag) - } - lastModified := cachedResp.Header.Get("last-modified") - if lastModified != "" && req.Header.Get("last-modified") == "" { - if req2 == nil { - req2 = cloneRequest(req) - } - req2.Header.Set("if-modified-since", lastModified) - } - if req2 != nil { - req = req2 - } - } - } - - resp, err = transport.RoundTrip(req) - if err == nil && req.Method == "GET" && resp.StatusCode == http.StatusNotModified { - // Replace the 304 response with the one from cache, but update with some new headers - endToEndHeaders := getEndToEndHeaders(resp.Header) - for _, header := range endToEndHeaders { - cachedResp.Header[header] = resp.Header[header] - } - cachedResp.Status = fmt.Sprintf("%d %s", http.StatusOK, http.StatusText(http.StatusOK)) - cachedResp.StatusCode = http.StatusOK - - resp = cachedResp - } else if (err != nil || (cachedResp != nil && resp.StatusCode >= 500)) && - req.Method == "GET" && canStaleOnError(cachedResp.Header, req.Header) { - // In case of transport failure and stale-if-error activated, returns cached content - // when available - cachedResp.Status = fmt.Sprintf("%d %s", http.StatusOK, http.StatusText(http.StatusOK)) - cachedResp.StatusCode = http.StatusOK - return cachedResp, nil - } else { - if err != nil || resp.StatusCode != http.StatusOK { - t.Cache.Delete(cacheKey) - } - if err != nil { - return nil, err - } - } - } else { - reqCacheControl := parseCacheControl(req.Header) - if _, ok := reqCacheControl["only-if-cached"]; ok { - resp = newGatewayTimeoutResponse(req) - } else { - resp, err = transport.RoundTrip(req) - if err != nil { - return nil, err - } - } - } - - if cacheable && canStore(parseCacheControl(req.Header), parseCacheControl(resp.Header)) { - for _, varyKey := range headerAllCommaSepValues(resp.Header, "vary") { - varyKey = http.CanonicalHeaderKey(varyKey) - fakeHeader := "X-Varied-" + varyKey - reqValue := req.Header.Get(varyKey) - if reqValue != "" { - resp.Header.Set(fakeHeader, reqValue) - } - } - switch req.Method { - case "GET": - // Delay caching until EOF is reached. - resp.Body = &cachingReadCloser{ - R: resp.Body, - OnEOF: func(r io.Reader) { - resp := *resp - resp.Body = ioutil.NopCloser(r) - respBytes, err := httputil.DumpResponse(&resp, true) - if err == nil { - t.Cache.Set(cacheKey, respBytes) - } - }, - } - default: - respBytes, err := httputil.DumpResponse(resp, true) - if err == nil { - t.Cache.Set(cacheKey, respBytes) - } - } - } else { - t.Cache.Delete(cacheKey) - } - return resp, nil -} - -// ErrNoDateHeader indicates that the HTTP headers contained no Date header. -var ErrNoDateHeader = errors.New("no Date header") - -// Date parses and returns the value of the Date header. -func Date(respHeaders http.Header) (date time.Time, err error) { - dateHeader := respHeaders.Get("date") - if dateHeader == "" { - err = ErrNoDateHeader - return - } - - return time.Parse(time.RFC1123, dateHeader) -} - -type realClock struct{} - -func (c *realClock) since(d time.Time) time.Duration { - return time.Since(d) -} - -type timer interface { - since(d time.Time) time.Duration -} - -var clock timer = &realClock{} - -// getFreshness will return one of fresh/stale/transparent based on the cache-control -// values of the request and the response -// -// fresh indicates the response can be returned -// stale indicates that the response needs validating before it is returned -// transparent indicates the response should not be used to fulfil the request -// -// Because this is only a private cache, 'public' and 'private' in cache-control aren't -// signficant. Similarly, smax-age isn't used. -func getFreshness(respHeaders, reqHeaders http.Header) (freshness int) { - respCacheControl := parseCacheControl(respHeaders) - reqCacheControl := parseCacheControl(reqHeaders) - if _, ok := reqCacheControl["no-cache"]; ok { - return transparent - } - if _, ok := respCacheControl["no-cache"]; ok { - return stale - } - if _, ok := reqCacheControl["only-if-cached"]; ok { - return fresh - } - - date, err := Date(respHeaders) - if err != nil { - return stale - } - currentAge := clock.since(date) - - var lifetime time.Duration - var zeroDuration time.Duration - - // If a response includes both an Expires header and a max-age directive, - // the max-age directive overrides the Expires header, even if the Expires header is more restrictive. - if maxAge, ok := respCacheControl["max-age"]; ok { - lifetime, err = time.ParseDuration(maxAge + "s") - if err != nil { - lifetime = zeroDuration - } - } else { - expiresHeader := respHeaders.Get("Expires") - if expiresHeader != "" { - expires, err := time.Parse(time.RFC1123, expiresHeader) - if err != nil { - lifetime = zeroDuration - } else { - lifetime = expires.Sub(date) - } - } - } - - if maxAge, ok := reqCacheControl["max-age"]; ok { - // the client is willing to accept a response whose age is no greater than the specified time in seconds - lifetime, err = time.ParseDuration(maxAge + "s") - if err != nil { - lifetime = zeroDuration - } - } - if minfresh, ok := reqCacheControl["min-fresh"]; ok { - // the client wants a response that will still be fresh for at least the specified number of seconds. - minfreshDuration, err := time.ParseDuration(minfresh + "s") - if err == nil { - currentAge = time.Duration(currentAge + minfreshDuration) - } - } - - if maxstale, ok := reqCacheControl["max-stale"]; ok { - // Indicates that the client is willing to accept a response that has exceeded its expiration time. - // If max-stale is assigned a value, then the client is willing to accept a response that has exceeded - // its expiration time by no more than the specified number of seconds. - // If no value is assigned to max-stale, then the client is willing to accept a stale response of any age. - // - // Responses served only because of a max-stale value are supposed to have a Warning header added to them, - // but that seems like a hassle, and is it actually useful? If so, then there needs to be a different - // return-value available here. - if maxstale == "" { - return fresh - } - maxstaleDuration, err := time.ParseDuration(maxstale + "s") - if err == nil { - currentAge = time.Duration(currentAge - maxstaleDuration) - } - } - - if lifetime > currentAge { - return fresh - } - - return stale -} - -// Returns true if either the request or the response includes the stale-if-error -// cache control extension: https://tools.ietf.org/html/rfc5861 -func canStaleOnError(respHeaders, reqHeaders http.Header) bool { - respCacheControl := parseCacheControl(respHeaders) - reqCacheControl := parseCacheControl(reqHeaders) - - var err error - lifetime := time.Duration(-1) - - if staleMaxAge, ok := respCacheControl["stale-if-error"]; ok { - if staleMaxAge != "" { - lifetime, err = time.ParseDuration(staleMaxAge + "s") - if err != nil { - return false - } - } else { - return true - } - } - if staleMaxAge, ok := reqCacheControl["stale-if-error"]; ok { - if staleMaxAge != "" { - lifetime, err = time.ParseDuration(staleMaxAge + "s") - if err != nil { - return false - } - } else { - return true - } - } - - if lifetime >= 0 { - date, err := Date(respHeaders) - if err != nil { - return false - } - currentAge := clock.since(date) - if lifetime > currentAge { - return true - } - } - - return false -} - -func getEndToEndHeaders(respHeaders http.Header) []string { - // These headers are always hop-by-hop - hopByHopHeaders := map[string]struct{}{ - "Connection": struct{}{}, - "Keep-Alive": struct{}{}, - "Proxy-Authenticate": struct{}{}, - "Proxy-Authorization": struct{}{}, - "Te": struct{}{}, - "Trailers": struct{}{}, - "Transfer-Encoding": struct{}{}, - "Upgrade": struct{}{}, - } - - for _, extra := range strings.Split(respHeaders.Get("connection"), ",") { - // any header listed in connection, if present, is also considered hop-by-hop - if strings.Trim(extra, " ") != "" { - hopByHopHeaders[http.CanonicalHeaderKey(extra)] = struct{}{} - } - } - endToEndHeaders := []string{} - for respHeader, _ := range respHeaders { - if _, ok := hopByHopHeaders[respHeader]; !ok { - endToEndHeaders = append(endToEndHeaders, respHeader) - } - } - return endToEndHeaders -} - -func canStore(reqCacheControl, respCacheControl cacheControl) (canStore bool) { - if _, ok := respCacheControl["no-store"]; ok { - return false - } - if _, ok := reqCacheControl["no-store"]; ok { - return false - } - return true -} - -func newGatewayTimeoutResponse(req *http.Request) *http.Response { - var braw bytes.Buffer - braw.WriteString("HTTP/1.1 504 Gateway Timeout\r\n\r\n") - resp, err := http.ReadResponse(bufio.NewReader(&braw), req) - if err != nil { - panic(err) - } - return resp -} - -// cloneRequest returns a clone of the provided *http.Request. -// The clone is a shallow copy of the struct and its Header map. -// (This function copyright goauth2 authors: https://code.google.com/p/goauth2) -func cloneRequest(r *http.Request) *http.Request { - // shallow copy of the struct - r2 := new(http.Request) - *r2 = *r - // deep copy of the Header - r2.Header = make(http.Header) - for k, s := range r.Header { - r2.Header[k] = s - } - return r2 -} - -type cacheControl map[string]string - -func parseCacheControl(headers http.Header) cacheControl { - cc := cacheControl{} - ccHeader := headers.Get("Cache-Control") - for _, part := range strings.Split(ccHeader, ",") { - part = strings.Trim(part, " ") - if part == "" { - continue - } - if strings.ContainsRune(part, '=') { - keyval := strings.Split(part, "=") - cc[strings.Trim(keyval[0], " ")] = strings.Trim(keyval[1], ",") - } else { - cc[part] = "" - } - } - return cc -} - -// headerAllCommaSepValues returns all comma-separated values (each -// with whitespace trimmed) for header name in headers. According to -// Section 4.2 of the HTTP/1.1 spec -// (http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2), -// values from multiple occurrences of a header should be concatenated, if -// the header's value is a comma-separated list. -func headerAllCommaSepValues(headers http.Header, name string) []string { - var vals []string - for _, val := range headers[http.CanonicalHeaderKey(name)] { - fields := strings.Split(val, ",") - for i, f := range fields { - fields[i] = strings.TrimSpace(f) - } - vals = append(vals, fields...) - } - return vals -} - -// cachingReadCloser is a wrapper around ReadCloser R that calls OnEOF -// handler with a full copy of the content read from R when EOF is -// reached. -type cachingReadCloser struct { - // Underlying ReadCloser. - R io.ReadCloser - // OnEOF is called with a copy of the content of R when EOF is reached. - OnEOF func(io.Reader) - - buf bytes.Buffer // buf stores a copy of the content of R. -} - -// Read reads the next len(p) bytes from R or until R is drained. The -// return value n is the number of bytes read. If R has no data to -// return, err is io.EOF and OnEOF is called with a full copy of what -// has been read so far. -func (r *cachingReadCloser) Read(p []byte) (n int, err error) { - n, err = r.R.Read(p) - r.buf.Write(p[:n]) - if err == io.EOF { - r.OnEOF(bytes.NewReader(r.buf.Bytes())) - } - return n, err -} - -func (r *cachingReadCloser) Close() error { - return r.R.Close() -} - -// NewMemoryCacheTransport returns a new Transport using the in-memory cache implementation -func NewMemoryCacheTransport() *Transport { - c := NewMemoryCache() - t := NewTransport(c) - return t -} diff --git a/vendor/github.com/gregjones/httpcache/httpcache_test.go b/vendor/github.com/gregjones/httpcache/httpcache_test.go deleted file mode 100644 index f22ed837f..000000000 --- a/vendor/github.com/gregjones/httpcache/httpcache_test.go +++ /dev/null @@ -1,1384 +0,0 @@ -package httpcache - -import ( - "bytes" - "errors" - "flag" - "io" - "io/ioutil" - "net/http" - "net/http/httptest" - "os" - "strconv" - "testing" - "time" -) - -var s struct { - server *httptest.Server - client http.Client - transport *Transport - done chan struct{} // Closed to unlock infinite handlers. -} - -type fakeClock struct { - elapsed time.Duration -} - -func (c *fakeClock) since(t time.Time) time.Duration { - return c.elapsed -} - -func TestMain(m *testing.M) { - flag.Parse() - setup() - code := m.Run() - teardown() - os.Exit(code) -} - -func setup() { - tp := NewMemoryCacheTransport() - client := http.Client{Transport: tp} - s.transport = tp - s.client = client - s.done = make(chan struct{}) - - mux := http.NewServeMux() - s.server = httptest.NewServer(mux) - - mux.HandleFunc("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Cache-Control", "max-age=3600") - })) - - mux.HandleFunc("/method", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Cache-Control", "max-age=3600") - w.Write([]byte(r.Method)) - })) - - mux.HandleFunc("/range", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - lm := "Fri, 14 Dec 2010 01:01:50 GMT" - if r.Header.Get("if-modified-since") == lm { - w.WriteHeader(http.StatusNotModified) - return - } - w.Header().Set("last-modified", lm) - if r.Header.Get("range") == "bytes=4-9" { - w.WriteHeader(http.StatusPartialContent) - w.Write([]byte(" text ")) - return - } - w.Write([]byte("Some text content")) - })) - - mux.HandleFunc("/nostore", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Cache-Control", "no-store") - })) - - mux.HandleFunc("/etag", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - etag := "124567" - if r.Header.Get("if-none-match") == etag { - w.WriteHeader(http.StatusNotModified) - return - } - w.Header().Set("etag", etag) - })) - - mux.HandleFunc("/lastmodified", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - lm := "Fri, 14 Dec 2010 01:01:50 GMT" - if r.Header.Get("if-modified-since") == lm { - w.WriteHeader(http.StatusNotModified) - return - } - w.Header().Set("last-modified", lm) - })) - - mux.HandleFunc("/varyaccept", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Cache-Control", "max-age=3600") - w.Header().Set("Content-Type", "text/plain") - w.Header().Set("Vary", "Accept") - w.Write([]byte("Some text content")) - })) - - mux.HandleFunc("/doublevary", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Cache-Control", "max-age=3600") - w.Header().Set("Content-Type", "text/plain") - w.Header().Set("Vary", "Accept, Accept-Language") - w.Write([]byte("Some text content")) - })) - mux.HandleFunc("/2varyheaders", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Cache-Control", "max-age=3600") - w.Header().Set("Content-Type", "text/plain") - w.Header().Add("Vary", "Accept") - w.Header().Add("Vary", "Accept-Language") - w.Write([]byte("Some text content")) - })) - mux.HandleFunc("/varyunused", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Cache-Control", "max-age=3600") - w.Header().Set("Content-Type", "text/plain") - w.Header().Set("Vary", "X-Madeup-Header") - w.Write([]byte("Some text content")) - })) - - updateFieldsCounter := 0 - mux.HandleFunc("/updatefields", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("X-Counter", strconv.Itoa(updateFieldsCounter)) - w.Header().Set("Etag", `"e"`) - updateFieldsCounter++ - if r.Header.Get("if-none-match") != "" { - w.WriteHeader(http.StatusNotModified) - return - } - w.Write([]byte("Some text content")) - })) - - // Take 3 seconds to return 200 OK (for testing client timeouts). - mux.HandleFunc("/3seconds", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - time.Sleep(3 * time.Second) - })) - - mux.HandleFunc("/infinite", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - for { - select { - case <-s.done: - return - default: - w.Write([]byte{0}) - } - } - })) -} - -func teardown() { - close(s.done) - s.server.Close() -} - -func resetTest() { - s.transport.Cache = NewMemoryCache() - clock = &realClock{} -} - -// TestCacheableMethod ensures that uncacheable method does not get stored -// in cache and get incorrectly used for a following cacheable method request. -func TestCacheableMethod(t *testing.T) { - resetTest() - { - req, err := http.NewRequest("POST", s.server.URL+"/method", nil) - if err != nil { - t.Fatal(err) - } - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - var buf bytes.Buffer - _, err = io.Copy(&buf, resp.Body) - if err != nil { - t.Fatal(err) - } - err = resp.Body.Close() - if err != nil { - t.Fatal(err) - } - if got, want := buf.String(), "POST"; got != want { - t.Errorf("got %q, want %q", got, want) - } - if resp.StatusCode != http.StatusOK { - t.Errorf("response status code isn't 200 OK: %v", resp.StatusCode) - } - } - { - req, err := http.NewRequest("GET", s.server.URL+"/method", nil) - if err != nil { - t.Fatal(err) - } - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - var buf bytes.Buffer - _, err = io.Copy(&buf, resp.Body) - if err != nil { - t.Fatal(err) - } - err = resp.Body.Close() - if err != nil { - t.Fatal(err) - } - if got, want := buf.String(), "GET"; got != want { - t.Errorf("got wrong body %q, want %q", got, want) - } - if resp.StatusCode != http.StatusOK { - t.Errorf("response status code isn't 200 OK: %v", resp.StatusCode) - } - if resp.Header.Get(XFromCache) != "" { - t.Errorf("XFromCache header isn't blank") - } - } -} - -func TestDontServeHeadResponseToGetRequest(t *testing.T) { - resetTest() - url := s.server.URL + "/" - req, err := http.NewRequest(http.MethodHead, url, nil) - if err != nil { - t.Fatal(err) - } - _, err = s.client.Do(req) - if err != nil { - t.Fatal(err) - } - req, err = http.NewRequest(http.MethodGet, url, nil) - if err != nil { - t.Fatal(err) - } - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - if resp.Header.Get(XFromCache) != "" { - t.Errorf("Cache should not match") - } -} - -func TestDontStorePartialRangeInCache(t *testing.T) { - resetTest() - { - req, err := http.NewRequest("GET", s.server.URL+"/range", nil) - if err != nil { - t.Fatal(err) - } - req.Header.Set("range", "bytes=4-9") - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - var buf bytes.Buffer - _, err = io.Copy(&buf, resp.Body) - if err != nil { - t.Fatal(err) - } - err = resp.Body.Close() - if err != nil { - t.Fatal(err) - } - if got, want := buf.String(), " text "; got != want { - t.Errorf("got %q, want %q", got, want) - } - if resp.StatusCode != http.StatusPartialContent { - t.Errorf("response status code isn't 206 Partial Content: %v", resp.StatusCode) - } - } - { - req, err := http.NewRequest("GET", s.server.URL+"/range", nil) - if err != nil { - t.Fatal(err) - } - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - var buf bytes.Buffer - _, err = io.Copy(&buf, resp.Body) - if err != nil { - t.Fatal(err) - } - err = resp.Body.Close() - if err != nil { - t.Fatal(err) - } - if got, want := buf.String(), "Some text content"; got != want { - t.Errorf("got %q, want %q", got, want) - } - if resp.StatusCode != http.StatusOK { - t.Errorf("response status code isn't 200 OK: %v", resp.StatusCode) - } - if resp.Header.Get(XFromCache) != "" { - t.Error("XFromCache header isn't blank") - } - } - { - req, err := http.NewRequest("GET", s.server.URL+"/range", nil) - if err != nil { - t.Fatal(err) - } - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - var buf bytes.Buffer - _, err = io.Copy(&buf, resp.Body) - if err != nil { - t.Fatal(err) - } - err = resp.Body.Close() - if err != nil { - t.Fatal(err) - } - if got, want := buf.String(), "Some text content"; got != want { - t.Errorf("got %q, want %q", got, want) - } - if resp.StatusCode != http.StatusOK { - t.Errorf("response status code isn't 200 OK: %v", resp.StatusCode) - } - if resp.Header.Get(XFromCache) != "1" { - t.Errorf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) - } - } - { - req, err := http.NewRequest("GET", s.server.URL+"/range", nil) - if err != nil { - t.Fatal(err) - } - req.Header.Set("range", "bytes=4-9") - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - var buf bytes.Buffer - _, err = io.Copy(&buf, resp.Body) - if err != nil { - t.Fatal(err) - } - err = resp.Body.Close() - if err != nil { - t.Fatal(err) - } - if got, want := buf.String(), " text "; got != want { - t.Errorf("got %q, want %q", got, want) - } - if resp.StatusCode != http.StatusPartialContent { - t.Errorf("response status code isn't 206 Partial Content: %v", resp.StatusCode) - } - } -} - -func TestCacheOnlyIfBodyRead(t *testing.T) { - resetTest() - { - req, err := http.NewRequest("GET", s.server.URL, nil) - if err != nil { - t.Fatal(err) - } - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - // We do not read the body - resp.Body.Close() - } - { - req, err := http.NewRequest("GET", s.server.URL, nil) - if err != nil { - t.Fatal(err) - } - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatalf("XFromCache header isn't blank") - } - } -} - -func TestOnlyReadBodyOnDemand(t *testing.T) { - resetTest() - - req, err := http.NewRequest("GET", s.server.URL+"/infinite", nil) - if err != nil { - t.Fatal(err) - } - resp, err := s.client.Do(req) // This shouldn't hang forever. - if err != nil { - t.Fatal(err) - } - buf := make([]byte, 10) // Only partially read the body. - _, err = resp.Body.Read(buf) - if err != nil { - t.Fatal(err) - } - resp.Body.Close() -} - -func TestGetOnlyIfCachedHit(t *testing.T) { - resetTest() - { - req, err := http.NewRequest("GET", s.server.URL, nil) - if err != nil { - t.Fatal(err) - } - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - _, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - } - { - req, err := http.NewRequest("GET", s.server.URL, nil) - if err != nil { - t.Fatal(err) - } - req.Header.Add("cache-control", "only-if-cached") - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "1" { - t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) - } - if resp.StatusCode != http.StatusOK { - t.Fatalf("response status code isn't 200 OK: %v", resp.StatusCode) - } - } -} - -func TestGetOnlyIfCachedMiss(t *testing.T) { - resetTest() - req, err := http.NewRequest("GET", s.server.URL, nil) - if err != nil { - t.Fatal(err) - } - req.Header.Add("cache-control", "only-if-cached") - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - if resp.StatusCode != http.StatusGatewayTimeout { - t.Fatalf("response status code isn't 504 GatewayTimeout: %v", resp.StatusCode) - } -} - -func TestGetNoStoreRequest(t *testing.T) { - resetTest() - req, err := http.NewRequest("GET", s.server.URL, nil) - if err != nil { - t.Fatal(err) - } - req.Header.Add("Cache-Control", "no-store") - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - } - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - } -} - -func TestGetNoStoreResponse(t *testing.T) { - resetTest() - req, err := http.NewRequest("GET", s.server.URL+"/nostore", nil) - if err != nil { - t.Fatal(err) - } - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - } - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - } -} - -func TestGetWithEtag(t *testing.T) { - resetTest() - req, err := http.NewRequest("GET", s.server.URL+"/etag", nil) - if err != nil { - t.Fatal(err) - } - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - _, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - - } - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "1" { - t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) - } - // additional assertions to verify that 304 response is converted properly - if resp.StatusCode != http.StatusOK { - t.Fatalf("response status code isn't 200 OK: %v", resp.StatusCode) - } - if _, ok := resp.Header["Connection"]; ok { - t.Fatalf("Connection header isn't absent") - } - } -} - -func TestGetWithLastModified(t *testing.T) { - resetTest() - req, err := http.NewRequest("GET", s.server.URL+"/lastmodified", nil) - if err != nil { - t.Fatal(err) - } - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - _, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - } - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "1" { - t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) - } - } -} - -func TestGetWithVary(t *testing.T) { - resetTest() - req, err := http.NewRequest("GET", s.server.URL+"/varyaccept", nil) - if err != nil { - t.Fatal(err) - } - req.Header.Set("Accept", "text/plain") - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get("Vary") != "Accept" { - t.Fatalf(`Vary header isn't "Accept": %v`, resp.Header.Get("Vary")) - } - _, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - } - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "1" { - t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) - } - } - req.Header.Set("Accept", "text/html") - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - } - req.Header.Set("Accept", "") - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - } -} - -func TestGetWithDoubleVary(t *testing.T) { - resetTest() - req, err := http.NewRequest("GET", s.server.URL+"/doublevary", nil) - if err != nil { - t.Fatal(err) - } - req.Header.Set("Accept", "text/plain") - req.Header.Set("Accept-Language", "da, en-gb;q=0.8, en;q=0.7") - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get("Vary") == "" { - t.Fatalf(`Vary header is blank`) - } - _, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - } - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "1" { - t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) - } - } - req.Header.Set("Accept-Language", "") - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - } - req.Header.Set("Accept-Language", "da") - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - } -} - -func TestGetWith2VaryHeaders(t *testing.T) { - resetTest() - // Tests that multiple Vary headers' comma-separated lists are - // merged. See https://github.com/gregjones/httpcache/issues/27. - const ( - accept = "text/plain" - acceptLanguage = "da, en-gb;q=0.8, en;q=0.7" - ) - req, err := http.NewRequest("GET", s.server.URL+"/2varyheaders", nil) - if err != nil { - t.Fatal(err) - } - req.Header.Set("Accept", accept) - req.Header.Set("Accept-Language", acceptLanguage) - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get("Vary") == "" { - t.Fatalf(`Vary header is blank`) - } - _, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - } - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "1" { - t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) - } - } - req.Header.Set("Accept-Language", "") - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - } - req.Header.Set("Accept-Language", "da") - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - } - req.Header.Set("Accept-Language", acceptLanguage) - req.Header.Set("Accept", "") - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - } - req.Header.Set("Accept", "image/png") - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - _, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - } - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "1" { - t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) - } - } -} - -func TestGetVaryUnused(t *testing.T) { - resetTest() - req, err := http.NewRequest("GET", s.server.URL+"/varyunused", nil) - if err != nil { - t.Fatal(err) - } - req.Header.Set("Accept", "text/plain") - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get("Vary") == "" { - t.Fatalf(`Vary header is blank`) - } - _, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - } - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "1" { - t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) - } - } -} - -func TestUpdateFields(t *testing.T) { - resetTest() - req, err := http.NewRequest("GET", s.server.URL+"/updatefields", nil) - if err != nil { - t.Fatal(err) - } - var counter, counter2 string - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - counter = resp.Header.Get("x-counter") - _, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - } - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "1" { - t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) - } - counter2 = resp.Header.Get("x-counter") - } - if counter == counter2 { - t.Fatalf(`both "x-counter" values are equal: %v %v`, counter, counter2) - } -} - -func TestParseCacheControl(t *testing.T) { - resetTest() - h := http.Header{} - for range parseCacheControl(h) { - t.Fatal("cacheControl should be empty") - } - - h.Set("cache-control", "no-cache") - { - cc := parseCacheControl(h) - if _, ok := cc["foo"]; ok { - t.Error(`Value "foo" shouldn't exist`) - } - noCache, ok := cc["no-cache"] - if !ok { - t.Fatalf(`"no-cache" value isn't set`) - } - if noCache != "" { - t.Fatalf(`"no-cache" value isn't blank: %v`, noCache) - } - } - h.Set("cache-control", "no-cache, max-age=3600") - { - cc := parseCacheControl(h) - noCache, ok := cc["no-cache"] - if !ok { - t.Fatalf(`"no-cache" value isn't set`) - } - if noCache != "" { - t.Fatalf(`"no-cache" value isn't blank: %v`, noCache) - } - if cc["max-age"] != "3600" { - t.Fatalf(`"max-age" value isn't "3600": %v`, cc["max-age"]) - } - } -} - -func TestNoCacheRequestExpiration(t *testing.T) { - resetTest() - respHeaders := http.Header{} - respHeaders.Set("Cache-Control", "max-age=7200") - - reqHeaders := http.Header{} - reqHeaders.Set("Cache-Control", "no-cache") - if getFreshness(respHeaders, reqHeaders) != transparent { - t.Fatal("freshness isn't transparent") - } -} - -func TestNoCacheResponseExpiration(t *testing.T) { - resetTest() - respHeaders := http.Header{} - respHeaders.Set("Cache-Control", "no-cache") - respHeaders.Set("Expires", "Wed, 19 Apr 3000 11:43:00 GMT") - - reqHeaders := http.Header{} - if getFreshness(respHeaders, reqHeaders) != stale { - t.Fatal("freshness isn't stale") - } -} - -func TestReqMustRevalidate(t *testing.T) { - resetTest() - // not paying attention to request setting max-stale means never returning stale - // responses, so always acting as if must-revalidate is set - respHeaders := http.Header{} - - reqHeaders := http.Header{} - reqHeaders.Set("Cache-Control", "must-revalidate") - if getFreshness(respHeaders, reqHeaders) != stale { - t.Fatal("freshness isn't stale") - } -} - -func TestRespMustRevalidate(t *testing.T) { - resetTest() - respHeaders := http.Header{} - respHeaders.Set("Cache-Control", "must-revalidate") - - reqHeaders := http.Header{} - if getFreshness(respHeaders, reqHeaders) != stale { - t.Fatal("freshness isn't stale") - } -} - -func TestFreshExpiration(t *testing.T) { - resetTest() - now := time.Now() - respHeaders := http.Header{} - respHeaders.Set("date", now.Format(time.RFC1123)) - respHeaders.Set("expires", now.Add(time.Duration(2)*time.Second).Format(time.RFC1123)) - - reqHeaders := http.Header{} - if getFreshness(respHeaders, reqHeaders) != fresh { - t.Fatal("freshness isn't fresh") - } - - clock = &fakeClock{elapsed: 3 * time.Second} - if getFreshness(respHeaders, reqHeaders) != stale { - t.Fatal("freshness isn't stale") - } -} - -func TestMaxAge(t *testing.T) { - resetTest() - now := time.Now() - respHeaders := http.Header{} - respHeaders.Set("date", now.Format(time.RFC1123)) - respHeaders.Set("cache-control", "max-age=2") - - reqHeaders := http.Header{} - if getFreshness(respHeaders, reqHeaders) != fresh { - t.Fatal("freshness isn't fresh") - } - - clock = &fakeClock{elapsed: 3 * time.Second} - if getFreshness(respHeaders, reqHeaders) != stale { - t.Fatal("freshness isn't stale") - } -} - -func TestMaxAgeZero(t *testing.T) { - resetTest() - now := time.Now() - respHeaders := http.Header{} - respHeaders.Set("date", now.Format(time.RFC1123)) - respHeaders.Set("cache-control", "max-age=0") - - reqHeaders := http.Header{} - if getFreshness(respHeaders, reqHeaders) != stale { - t.Fatal("freshness isn't stale") - } -} - -func TestBothMaxAge(t *testing.T) { - resetTest() - now := time.Now() - respHeaders := http.Header{} - respHeaders.Set("date", now.Format(time.RFC1123)) - respHeaders.Set("cache-control", "max-age=2") - - reqHeaders := http.Header{} - reqHeaders.Set("cache-control", "max-age=0") - if getFreshness(respHeaders, reqHeaders) != stale { - t.Fatal("freshness isn't stale") - } -} - -func TestMinFreshWithExpires(t *testing.T) { - resetTest() - now := time.Now() - respHeaders := http.Header{} - respHeaders.Set("date", now.Format(time.RFC1123)) - respHeaders.Set("expires", now.Add(time.Duration(2)*time.Second).Format(time.RFC1123)) - - reqHeaders := http.Header{} - reqHeaders.Set("cache-control", "min-fresh=1") - if getFreshness(respHeaders, reqHeaders) != fresh { - t.Fatal("freshness isn't fresh") - } - - reqHeaders = http.Header{} - reqHeaders.Set("cache-control", "min-fresh=2") - if getFreshness(respHeaders, reqHeaders) != stale { - t.Fatal("freshness isn't stale") - } -} - -func TestEmptyMaxStale(t *testing.T) { - resetTest() - now := time.Now() - respHeaders := http.Header{} - respHeaders.Set("date", now.Format(time.RFC1123)) - respHeaders.Set("cache-control", "max-age=20") - - reqHeaders := http.Header{} - reqHeaders.Set("cache-control", "max-stale") - clock = &fakeClock{elapsed: 10 * time.Second} - if getFreshness(respHeaders, reqHeaders) != fresh { - t.Fatal("freshness isn't fresh") - } - - clock = &fakeClock{elapsed: 60 * time.Second} - if getFreshness(respHeaders, reqHeaders) != fresh { - t.Fatal("freshness isn't fresh") - } -} - -func TestMaxStaleValue(t *testing.T) { - resetTest() - now := time.Now() - respHeaders := http.Header{} - respHeaders.Set("date", now.Format(time.RFC1123)) - respHeaders.Set("cache-control", "max-age=10") - - reqHeaders := http.Header{} - reqHeaders.Set("cache-control", "max-stale=20") - clock = &fakeClock{elapsed: 5 * time.Second} - if getFreshness(respHeaders, reqHeaders) != fresh { - t.Fatal("freshness isn't fresh") - } - - clock = &fakeClock{elapsed: 15 * time.Second} - if getFreshness(respHeaders, reqHeaders) != fresh { - t.Fatal("freshness isn't fresh") - } - - clock = &fakeClock{elapsed: 30 * time.Second} - if getFreshness(respHeaders, reqHeaders) != stale { - t.Fatal("freshness isn't stale") - } -} - -func containsHeader(headers []string, header string) bool { - for _, v := range headers { - if http.CanonicalHeaderKey(v) == http.CanonicalHeaderKey(header) { - return true - } - } - return false -} - -func TestGetEndToEndHeaders(t *testing.T) { - resetTest() - var ( - headers http.Header - end2end []string - ) - - headers = http.Header{} - headers.Set("content-type", "text/html") - headers.Set("te", "deflate") - - end2end = getEndToEndHeaders(headers) - if !containsHeader(end2end, "content-type") { - t.Fatal(`doesn't contain "content-type" header`) - } - if containsHeader(end2end, "te") { - t.Fatal(`doesn't contain "te" header`) - } - - headers = http.Header{} - headers.Set("connection", "content-type") - headers.Set("content-type", "text/csv") - headers.Set("te", "deflate") - end2end = getEndToEndHeaders(headers) - if containsHeader(end2end, "connection") { - t.Fatal(`doesn't contain "connection" header`) - } - if containsHeader(end2end, "content-type") { - t.Fatal(`doesn't contain "content-type" header`) - } - if containsHeader(end2end, "te") { - t.Fatal(`doesn't contain "te" header`) - } - - headers = http.Header{} - end2end = getEndToEndHeaders(headers) - if len(end2end) != 0 { - t.Fatal(`non-zero end2end headers`) - } - - headers = http.Header{} - headers.Set("connection", "content-type") - end2end = getEndToEndHeaders(headers) - if len(end2end) != 0 { - t.Fatal(`non-zero end2end headers`) - } -} - -type transportMock struct { - response *http.Response - err error -} - -func (t transportMock) RoundTrip(req *http.Request) (resp *http.Response, err error) { - return t.response, t.err -} - -func TestStaleIfErrorRequest(t *testing.T) { - resetTest() - now := time.Now() - tmock := transportMock{ - response: &http.Response{ - Status: http.StatusText(http.StatusOK), - StatusCode: http.StatusOK, - Header: http.Header{ - "Date": []string{now.Format(time.RFC1123)}, - "Cache-Control": []string{"no-cache"}, - }, - Body: ioutil.NopCloser(bytes.NewBuffer([]byte("some data"))), - }, - err: nil, - } - tp := NewMemoryCacheTransport() - tp.Transport = &tmock - - // First time, response is cached on success - r, _ := http.NewRequest("GET", "http://somewhere.com/", nil) - r.Header.Set("Cache-Control", "stale-if-error") - resp, err := tp.RoundTrip(r) - if err != nil { - t.Fatal(err) - } - if resp == nil { - t.Fatal("resp is nil") - } - _, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - - // On failure, response is returned from the cache - tmock.response = nil - tmock.err = errors.New("some error") - resp, err = tp.RoundTrip(r) - if err != nil { - t.Fatal(err) - } - if resp == nil { - t.Fatal("resp is nil") - } -} - -func TestStaleIfErrorRequestLifetime(t *testing.T) { - resetTest() - now := time.Now() - tmock := transportMock{ - response: &http.Response{ - Status: http.StatusText(http.StatusOK), - StatusCode: http.StatusOK, - Header: http.Header{ - "Date": []string{now.Format(time.RFC1123)}, - "Cache-Control": []string{"no-cache"}, - }, - Body: ioutil.NopCloser(bytes.NewBuffer([]byte("some data"))), - }, - err: nil, - } - tp := NewMemoryCacheTransport() - tp.Transport = &tmock - - // First time, response is cached on success - r, _ := http.NewRequest("GET", "http://somewhere.com/", nil) - r.Header.Set("Cache-Control", "stale-if-error=100") - resp, err := tp.RoundTrip(r) - if err != nil { - t.Fatal(err) - } - if resp == nil { - t.Fatal("resp is nil") - } - _, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - - // On failure, response is returned from the cache - tmock.response = nil - tmock.err = errors.New("some error") - resp, err = tp.RoundTrip(r) - if err != nil { - t.Fatal(err) - } - if resp == nil { - t.Fatal("resp is nil") - } - - // Same for http errors - tmock.response = &http.Response{StatusCode: http.StatusInternalServerError} - tmock.err = nil - resp, err = tp.RoundTrip(r) - if err != nil { - t.Fatal(err) - } - if resp == nil { - t.Fatal("resp is nil") - } - - // If failure last more than max stale, error is returned - clock = &fakeClock{elapsed: 200 * time.Second} - _, err = tp.RoundTrip(r) - if err != tmock.err { - t.Fatalf("got err %v, want %v", err, tmock.err) - } -} - -func TestStaleIfErrorResponse(t *testing.T) { - resetTest() - now := time.Now() - tmock := transportMock{ - response: &http.Response{ - Status: http.StatusText(http.StatusOK), - StatusCode: http.StatusOK, - Header: http.Header{ - "Date": []string{now.Format(time.RFC1123)}, - "Cache-Control": []string{"no-cache, stale-if-error"}, - }, - Body: ioutil.NopCloser(bytes.NewBuffer([]byte("some data"))), - }, - err: nil, - } - tp := NewMemoryCacheTransport() - tp.Transport = &tmock - - // First time, response is cached on success - r, _ := http.NewRequest("GET", "http://somewhere.com/", nil) - resp, err := tp.RoundTrip(r) - if err != nil { - t.Fatal(err) - } - if resp == nil { - t.Fatal("resp is nil") - } - _, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - - // On failure, response is returned from the cache - tmock.response = nil - tmock.err = errors.New("some error") - resp, err = tp.RoundTrip(r) - if err != nil { - t.Fatal(err) - } - if resp == nil { - t.Fatal("resp is nil") - } -} - -func TestStaleIfErrorResponseLifetime(t *testing.T) { - resetTest() - now := time.Now() - tmock := transportMock{ - response: &http.Response{ - Status: http.StatusText(http.StatusOK), - StatusCode: http.StatusOK, - Header: http.Header{ - "Date": []string{now.Format(time.RFC1123)}, - "Cache-Control": []string{"no-cache, stale-if-error=100"}, - }, - Body: ioutil.NopCloser(bytes.NewBuffer([]byte("some data"))), - }, - err: nil, - } - tp := NewMemoryCacheTransport() - tp.Transport = &tmock - - // First time, response is cached on success - r, _ := http.NewRequest("GET", "http://somewhere.com/", nil) - resp, err := tp.RoundTrip(r) - if err != nil { - t.Fatal(err) - } - if resp == nil { - t.Fatal("resp is nil") - } - _, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - - // On failure, response is returned from the cache - tmock.response = nil - tmock.err = errors.New("some error") - resp, err = tp.RoundTrip(r) - if err != nil { - t.Fatal(err) - } - if resp == nil { - t.Fatal("resp is nil") - } - - // If failure last more than max stale, error is returned - clock = &fakeClock{elapsed: 200 * time.Second} - _, err = tp.RoundTrip(r) - if err != tmock.err { - t.Fatalf("got err %v, want %v", err, tmock.err) - } -} - -// Test that http.Client.Timeout is respected when cache transport is used. -// That is so as long as request cancellation is propagated correctly. -// In the past, that required CancelRequest to be implemented correctly, -// but modern http.Client uses Request.Cancel (or request context) instead, -// so we don't have to do anything. -func TestClientTimeout(t *testing.T) { - if testing.Short() { - t.Skip("skipping timeout test in short mode") // Because it takes at least 3 seconds to run. - } - resetTest() - client := &http.Client{ - Transport: NewMemoryCacheTransport(), - Timeout: time.Second, - } - started := time.Now() - resp, err := client.Get(s.server.URL + "/3seconds") - taken := time.Since(started) - if err == nil { - t.Error("got nil error, want timeout error") - } - if resp != nil { - t.Error("got non-nil resp, want nil resp") - } - if taken >= 2*time.Second { - t.Error("client.Do took 2+ seconds, want < 2 seconds") - } -} diff --git a/vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache.go b/vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache.go deleted file mode 100644 index 9bcb7e277..000000000 --- a/vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache.go +++ /dev/null @@ -1,51 +0,0 @@ -// Package leveldbcache provides an implementation of httpcache.Cache that -// uses github.com/syndtr/goleveldb/leveldb -package leveldbcache - -import ( - "github.com/syndtr/goleveldb/leveldb" -) - -// Cache is an implementation of httpcache.Cache with leveldb storage -type Cache struct { - db *leveldb.DB -} - -// Get returns the response corresponding to key if present -func (c *Cache) Get(key string) (resp []byte, ok bool) { - var err error - resp, err = c.db.Get([]byte(key), nil) - if err != nil { - return []byte{}, false - } - return resp, true -} - -// Set saves a response to the cache as key -func (c *Cache) Set(key string, resp []byte) { - c.db.Put([]byte(key), resp, nil) -} - -// Delete removes the response with key from the cache -func (c *Cache) Delete(key string) { - c.db.Delete([]byte(key), nil) -} - -// New returns a new Cache that will store leveldb in path -func New(path string) (*Cache, error) { - cache := &Cache{} - - var err error - cache.db, err = leveldb.OpenFile(path, nil) - - if err != nil { - return nil, err - } - return cache, nil -} - -// NewWithDB returns a new Cache using the provided leveldb as underlying -// storage. -func NewWithDB(db *leveldb.DB) *Cache { - return &Cache{db} -} diff --git a/vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache_test.go b/vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache_test.go deleted file mode 100644 index b885c0169..000000000 --- a/vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache_test.go +++ /dev/null @@ -1,46 +0,0 @@ -package leveldbcache - -import ( - "bytes" - "io/ioutil" - "os" - "path/filepath" - "testing" -) - -func TestDiskCache(t *testing.T) { - tempDir, err := ioutil.TempDir("", "httpcache") - if err != nil { - t.Fatalf("TempDir: %v", err) - } - defer os.RemoveAll(tempDir) - - cache, err := New(filepath.Join(tempDir, "db")) - if err != nil { - t.Fatalf("New leveldb,: %v", err) - } - - key := "testKey" - _, ok := cache.Get(key) - if ok { - t.Fatal("retrieved key before adding it") - } - - val := []byte("some bytes") - cache.Set(key, val) - - retVal, ok := cache.Get(key) - if !ok { - t.Fatal("could not retrieve an element we just added") - } - if !bytes.Equal(retVal, val) { - t.Fatal("retrieved a different value than what we put in") - } - - cache.Delete(key) - - _, ok = cache.Get(key) - if ok { - t.Fatal("deleted key still present") - } -} diff --git a/vendor/github.com/gregjones/httpcache/memcache/appengine.go b/vendor/github.com/gregjones/httpcache/memcache/appengine.go deleted file mode 100644 index e68d9bc09..000000000 --- a/vendor/github.com/gregjones/httpcache/memcache/appengine.go +++ /dev/null @@ -1,61 +0,0 @@ -// +build appengine - -// Package memcache provides an implementation of httpcache.Cache that uses App -// Engine's memcache package to store cached responses. -// -// When not built for Google App Engine, this package will provide an -// implementation that connects to a specified memcached server. See the -// memcache.go file in this package for details. -package memcache - -import ( - "appengine" - "appengine/memcache" -) - -// Cache is an implementation of httpcache.Cache that caches responses in App -// Engine's memcache. -type Cache struct { - appengine.Context -} - -// cacheKey modifies an httpcache key for use in memcache. Specifically, it -// prefixes keys to avoid collision with other data stored in memcache. -func cacheKey(key string) string { - return "httpcache:" + key -} - -// Get returns the response corresponding to key if present. -func (c *Cache) Get(key string) (resp []byte, ok bool) { - item, err := memcache.Get(c.Context, cacheKey(key)) - if err != nil { - if err != memcache.ErrCacheMiss { - c.Context.Errorf("error getting cached response: %v", err) - } - return nil, false - } - return item.Value, true -} - -// Set saves a response to the cache as key. -func (c *Cache) Set(key string, resp []byte) { - item := &memcache.Item{ - Key: cacheKey(key), - Value: resp, - } - if err := memcache.Set(c.Context, item); err != nil { - c.Context.Errorf("error caching response: %v", err) - } -} - -// Delete removes the response with key from the cache. -func (c *Cache) Delete(key string) { - if err := memcache.Delete(c.Context, cacheKey(key)); err != nil { - c.Context.Errorf("error deleting cached response: %v", err) - } -} - -// New returns a new Cache for the given context. -func New(ctx appengine.Context) *Cache { - return &Cache{ctx} -} diff --git a/vendor/github.com/gregjones/httpcache/memcache/appengine_test.go b/vendor/github.com/gregjones/httpcache/memcache/appengine_test.go deleted file mode 100644 index 818b2776e..000000000 --- a/vendor/github.com/gregjones/httpcache/memcache/appengine_test.go +++ /dev/null @@ -1,44 +0,0 @@ -// +build appengine - -package memcache - -import ( - "bytes" - "testing" - - "appengine/aetest" -) - -func TestAppEngine(t *testing.T) { - ctx, err := aetest.NewContext(nil) - if err != nil { - t.Fatal(err) - } - defer ctx.Close() - - cache := New(ctx) - - key := "testKey" - _, ok := cache.Get(key) - if ok { - t.Fatal("retrieved key before adding it") - } - - val := []byte("some bytes") - cache.Set(key, val) - - retVal, ok := cache.Get(key) - if !ok { - t.Fatal("could not retrieve an element we just added") - } - if !bytes.Equal(retVal, val) { - t.Fatal("retrieved a different value than what we put in") - } - - cache.Delete(key) - - _, ok = cache.Get(key) - if ok { - t.Fatal("deleted key still present") - } -} diff --git a/vendor/github.com/gregjones/httpcache/memcache/memcache.go b/vendor/github.com/gregjones/httpcache/memcache/memcache.go deleted file mode 100644 index 462f0e541..000000000 --- a/vendor/github.com/gregjones/httpcache/memcache/memcache.go +++ /dev/null @@ -1,60 +0,0 @@ -// +build !appengine - -// Package memcache provides an implementation of httpcache.Cache that uses -// gomemcache to store cached responses. -// -// When built for Google App Engine, this package will provide an -// implementation that uses App Engine's memcache service. See the -// appengine.go file in this package for details. -package memcache - -import ( - "github.com/bradfitz/gomemcache/memcache" -) - -// Cache is an implementation of httpcache.Cache that caches responses in a -// memcache server. -type Cache struct { - *memcache.Client -} - -// cacheKey modifies an httpcache key for use in memcache. Specifically, it -// prefixes keys to avoid collision with other data stored in memcache. -func cacheKey(key string) string { - return "httpcache:" + key -} - -// Get returns the response corresponding to key if present. -func (c *Cache) Get(key string) (resp []byte, ok bool) { - item, err := c.Client.Get(cacheKey(key)) - if err != nil { - return nil, false - } - return item.Value, true -} - -// Set saves a response to the cache as key. -func (c *Cache) Set(key string, resp []byte) { - item := &memcache.Item{ - Key: cacheKey(key), - Value: resp, - } - c.Client.Set(item) -} - -// Delete removes the response with key from the cache. -func (c *Cache) Delete(key string) { - c.Client.Delete(cacheKey(key)) -} - -// New returns a new Cache using the provided memcache server(s) with equal -// weight. If a server is listed multiple times, it gets a proportional amount -// of weight. -func New(server ...string) *Cache { - return NewWithClient(memcache.New(server...)) -} - -// NewWithClient returns a new Cache with the given memcache client. -func NewWithClient(client *memcache.Client) *Cache { - return &Cache{client} -} diff --git a/vendor/github.com/gregjones/httpcache/memcache/memcache_test.go b/vendor/github.com/gregjones/httpcache/memcache/memcache_test.go deleted file mode 100644 index 4dcc547c6..000000000 --- a/vendor/github.com/gregjones/httpcache/memcache/memcache_test.go +++ /dev/null @@ -1,47 +0,0 @@ -// +build !appengine - -package memcache - -import ( - "bytes" - "net" - "testing" -) - -const testServer = "localhost:11211" - -func TestMemCache(t *testing.T) { - conn, err := net.Dial("tcp", testServer) - if err != nil { - // TODO: rather than skip the test, fall back to a faked memcached server - t.Skipf("skipping test; no server running at %s", testServer) - } - conn.Write([]byte("flush_all\r\n")) // flush memcache - conn.Close() - - cache := New(testServer) - - key := "testKey" - _, ok := cache.Get(key) - if ok { - t.Fatal("retrieved key before adding it") - } - - val := []byte("some bytes") - cache.Set(key, val) - - retVal, ok := cache.Get(key) - if !ok { - t.Fatal("could not retrieve an element we just added") - } - if !bytes.Equal(retVal, val) { - t.Fatal("retrieved a different value than what we put in") - } - - cache.Delete(key) - - _, ok = cache.Get(key) - if ok { - t.Fatal("deleted key still present") - } -} diff --git a/vendor/github.com/gregjones/httpcache/redis/redis.go b/vendor/github.com/gregjones/httpcache/redis/redis.go deleted file mode 100644 index 3143d4438..000000000 --- a/vendor/github.com/gregjones/httpcache/redis/redis.go +++ /dev/null @@ -1,43 +0,0 @@ -// Package redis provides a redis interface for http caching. -package redis - -import ( - "github.com/garyburd/redigo/redis" - "github.com/gregjones/httpcache" -) - -// cache is an implementation of httpcache.Cache that caches responses in a -// redis server. -type cache struct { - redis.Conn -} - -// cacheKey modifies an httpcache key for use in redis. Specifically, it -// prefixes keys to avoid collision with other data stored in redis. -func cacheKey(key string) string { - return "rediscache:" + key -} - -// Get returns the response corresponding to key if present. -func (c cache) Get(key string) (resp []byte, ok bool) { - item, err := redis.Bytes(c.Do("GET", cacheKey(key))) - if err != nil { - return nil, false - } - return item, true -} - -// Set saves a response to the cache as key. -func (c cache) Set(key string, resp []byte) { - c.Do("SET", cacheKey(key), resp) -} - -// Delete removes the response with key from the cache. -func (c cache) Delete(key string) { - c.Do("DEL", cacheKey(key)) -} - -// NewWithClient returns a new Cache with the given redis connection. -func NewWithClient(client redis.Conn) httpcache.Cache { - return cache{client} -} diff --git a/vendor/github.com/gregjones/httpcache/redis/redis_test.go b/vendor/github.com/gregjones/httpcache/redis/redis_test.go deleted file mode 100644 index 72f6f619a..000000000 --- a/vendor/github.com/gregjones/httpcache/redis/redis_test.go +++ /dev/null @@ -1,43 +0,0 @@ -package redis - -import ( - "bytes" - "testing" - - "github.com/garyburd/redigo/redis" -) - -func TestRedisCache(t *testing.T) { - conn, err := redis.Dial("tcp", "localhost:6379") - if err != nil { - // TODO: rather than skip the test, fall back to a faked redis server - t.Skipf("skipping test; no server running at localhost:6379") - } - conn.Do("FLUSHALL") - - cache := NewWithClient(conn) - - key := "testKey" - _, ok := cache.Get(key) - if ok { - t.Fatal("retrieved key before adding it") - } - - val := []byte("some bytes") - cache.Set(key, val) - - retVal, ok := cache.Get(key) - if !ok { - t.Fatal("could not retrieve an element we just added") - } - if !bytes.Equal(retVal, val) { - t.Fatal("retrieved a different value than what we put in") - } - - cache.Delete(key) - - _, ok = cache.Get(key) - if ok { - t.Fatal("deleted key still present") - } -} diff --git a/vendor/github.com/juju/ratelimit/LICENSE b/vendor/github.com/juju/ratelimit/LICENSE deleted file mode 100644 index ade9307b3..000000000 --- a/vendor/github.com/juju/ratelimit/LICENSE +++ /dev/null @@ -1,191 +0,0 @@ -All files in this repository are licensed as follows. If you contribute -to this repository, it is assumed that you license your contribution -under the same license unless you state otherwise. - -All files Copyright (C) 2015 Canonical Ltd. unless otherwise specified in the file. - -This software is licensed under the LGPLv3, included below. - -As a special exception to the GNU Lesser General Public License version 3 -("LGPL3"), the copyright holders of this Library give you permission to -convey to a third party a Combined Work that links statically or dynamically -to this Library without providing any Minimal Corresponding Source or -Minimal Application Code as set out in 4d or providing the installation -information set out in section 4e, provided that you comply with the other -provisions of LGPL3 and provided that you meet, for the Application the -terms and conditions of the license(s) which apply to the Application. - -Except as stated in this special exception, the provisions of LGPL3 will -continue to comply in full to this Library. If you modify this Library, you -may apply this exception to your version of this Library, but you are not -obliged to do so. If you do not wish to do so, delete this exception -statement from your version. This exception does not (and cannot) modify any -license terms which apply to the Application, with which you must still -comply. - - - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/vendor/github.com/juju/ratelimit/README.md b/vendor/github.com/juju/ratelimit/README.md deleted file mode 100644 index a0fdfe2b1..000000000 --- a/vendor/github.com/juju/ratelimit/README.md +++ /dev/null @@ -1,117 +0,0 @@ -# ratelimit --- - import "github.com/juju/ratelimit" - -The ratelimit package provides an efficient token bucket implementation. See -http://en.wikipedia.org/wiki/Token_bucket. - -## Usage - -#### func Reader - -```go -func Reader(r io.Reader, bucket *Bucket) io.Reader -``` -Reader returns a reader that is rate limited by the given token bucket. Each -token in the bucket represents one byte. - -#### func Writer - -```go -func Writer(w io.Writer, bucket *Bucket) io.Writer -``` -Writer returns a writer that is rate limited by the given token bucket. Each -token in the bucket represents one byte. - -#### type Bucket - -```go -type Bucket struct { -} -``` - -Bucket represents a token bucket that fills at a predetermined rate. Methods on -Bucket may be called concurrently. - -#### func NewBucket - -```go -func NewBucket(fillInterval time.Duration, capacity int64) *Bucket -``` -NewBucket returns a new token bucket that fills at the rate of one token every -fillInterval, up to the given maximum capacity. Both arguments must be positive. -The bucket is initially full. - -#### func NewBucketWithQuantum - -```go -func NewBucketWithQuantum(fillInterval time.Duration, capacity, quantum int64) *Bucket -``` -NewBucketWithQuantum is similar to NewBucket, but allows the specification of -the quantum size - quantum tokens are added every fillInterval. - -#### func NewBucketWithRate - -```go -func NewBucketWithRate(rate float64, capacity int64) *Bucket -``` -NewBucketWithRate returns a token bucket that fills the bucket at the rate of -rate tokens per second up to the given maximum capacity. Because of limited -clock resolution, at high rates, the actual rate may be up to 1% different from -the specified rate. - -#### func (*Bucket) Rate - -```go -func (tb *Bucket) Rate() float64 -``` -Rate returns the fill rate of the bucket, in tokens per second. - -#### func (*Bucket) Take - -```go -func (tb *Bucket) Take(count int64) time.Duration -``` -Take takes count tokens from the bucket without blocking. It returns the time -that the caller should wait until the tokens are actually available. - -Note that if the request is irrevocable - there is no way to return tokens to -the bucket once this method commits us to taking them. - -#### func (*Bucket) TakeAvailable - -```go -func (tb *Bucket) TakeAvailable(count int64) int64 -``` -TakeAvailable takes up to count immediately available tokens from the bucket. It -returns the number of tokens removed, or zero if there are no available tokens. -It does not block. - -#### func (*Bucket) TakeMaxDuration - -```go -func (tb *Bucket) TakeMaxDuration(count int64, maxWait time.Duration) (time.Duration, bool) -``` -TakeMaxDuration is like Take, except that it will only take tokens from the -bucket if the wait time for the tokens is no greater than maxWait. - -If it would take longer than maxWait for the tokens to become available, it does -nothing and reports false, otherwise it returns the time that the caller should -wait until the tokens are actually available, and reports true. - -#### func (*Bucket) Wait - -```go -func (tb *Bucket) Wait(count int64) -``` -Wait takes count tokens from the bucket, waiting until they are available. - -#### func (*Bucket) WaitMaxDuration - -```go -func (tb *Bucket) WaitMaxDuration(count int64, maxWait time.Duration) bool -``` -WaitMaxDuration is like Wait except that it will only take tokens from the -bucket if it needs to wait for no greater than maxWait. It reports whether any -tokens have been removed from the bucket If no tokens have been removed, it -returns immediately. diff --git a/vendor/github.com/juju/ratelimit/ratelimit.go b/vendor/github.com/juju/ratelimit/ratelimit.go deleted file mode 100644 index 1c3f25b2e..000000000 --- a/vendor/github.com/juju/ratelimit/ratelimit.go +++ /dev/null @@ -1,284 +0,0 @@ -// Copyright 2014 Canonical Ltd. -// Licensed under the LGPLv3 with static-linking exception. -// See LICENCE file for details. - -// Package ratelimit provides an efficient token bucket implementation -// that can be used to limit the rate of arbitrary things. -// See http://en.wikipedia.org/wiki/Token_bucket. -package ratelimit - -import ( - "math" - "strconv" - "sync" - "time" -) - -// Bucket represents a token bucket that fills at a predetermined rate. -// Methods on Bucket may be called concurrently. -type Bucket struct { - startTime time.Time - capacity int64 - quantum int64 - fillInterval time.Duration - clock Clock - - // The mutex guards the fields following it. - mu sync.Mutex - - // avail holds the number of available tokens - // in the bucket, as of availTick ticks from startTime. - // It will be negative when there are consumers - // waiting for tokens. - avail int64 - availTick int64 -} - -// Clock is used to inject testable fakes. -type Clock interface { - Now() time.Time - Sleep(d time.Duration) -} - -// realClock implements Clock in terms of standard time functions. -type realClock struct{} - -// Now is identical to time.Now. -func (realClock) Now() time.Time { - return time.Now() -} - -// Sleep is identical to time.Sleep. -func (realClock) Sleep(d time.Duration) { - time.Sleep(d) -} - -// NewBucket returns a new token bucket that fills at the -// rate of one token every fillInterval, up to the given -// maximum capacity. Both arguments must be -// positive. The bucket is initially full. -func NewBucket(fillInterval time.Duration, capacity int64) *Bucket { - return NewBucketWithClock(fillInterval, capacity, realClock{}) -} - -// NewBucketWithClock is identical to NewBucket but injects a testable clock -// interface. -func NewBucketWithClock(fillInterval time.Duration, capacity int64, clock Clock) *Bucket { - return NewBucketWithQuantumAndClock(fillInterval, capacity, 1, clock) -} - -// rateMargin specifes the allowed variance of actual -// rate from specified rate. 1% seems reasonable. -const rateMargin = 0.01 - -// NewBucketWithRate returns a token bucket that fills the bucket -// at the rate of rate tokens per second up to the given -// maximum capacity. Because of limited clock resolution, -// at high rates, the actual rate may be up to 1% different from the -// specified rate. -func NewBucketWithRate(rate float64, capacity int64) *Bucket { - return NewBucketWithRateAndClock(rate, capacity, realClock{}) -} - -// NewBucketWithRateAndClock is identical to NewBucketWithRate but injects a -// testable clock interface. -func NewBucketWithRateAndClock(rate float64, capacity int64, clock Clock) *Bucket { - for quantum := int64(1); quantum < 1<<50; quantum = nextQuantum(quantum) { - fillInterval := time.Duration(1e9 * float64(quantum) / rate) - if fillInterval <= 0 { - continue - } - tb := NewBucketWithQuantumAndClock(fillInterval, capacity, quantum, clock) - if diff := math.Abs(tb.Rate() - rate); diff/rate <= rateMargin { - return tb - } - } - panic("cannot find suitable quantum for " + strconv.FormatFloat(rate, 'g', -1, 64)) -} - -// nextQuantum returns the next quantum to try after q. -// We grow the quantum exponentially, but slowly, so we -// get a good fit in the lower numbers. -func nextQuantum(q int64) int64 { - q1 := q * 11 / 10 - if q1 == q { - q1++ - } - return q1 -} - -// NewBucketWithQuantum is similar to NewBucket, but allows -// the specification of the quantum size - quantum tokens -// are added every fillInterval. -func NewBucketWithQuantum(fillInterval time.Duration, capacity, quantum int64) *Bucket { - return NewBucketWithQuantumAndClock(fillInterval, capacity, quantum, realClock{}) -} - -// NewBucketWithQuantumAndClock is identical to NewBucketWithQuantum but injects -// a testable clock interface. -func NewBucketWithQuantumAndClock(fillInterval time.Duration, capacity, quantum int64, clock Clock) *Bucket { - if fillInterval <= 0 { - panic("token bucket fill interval is not > 0") - } - if capacity <= 0 { - panic("token bucket capacity is not > 0") - } - if quantum <= 0 { - panic("token bucket quantum is not > 0") - } - return &Bucket{ - clock: clock, - startTime: clock.Now(), - capacity: capacity, - quantum: quantum, - avail: capacity, - fillInterval: fillInterval, - } -} - -// Wait takes count tokens from the bucket, waiting until they are -// available. -func (tb *Bucket) Wait(count int64) { - if d := tb.Take(count); d > 0 { - tb.clock.Sleep(d) - } -} - -// WaitMaxDuration is like Wait except that it will -// only take tokens from the bucket if it needs to wait -// for no greater than maxWait. It reports whether -// any tokens have been removed from the bucket -// If no tokens have been removed, it returns immediately. -func (tb *Bucket) WaitMaxDuration(count int64, maxWait time.Duration) bool { - d, ok := tb.TakeMaxDuration(count, maxWait) - if d > 0 { - tb.clock.Sleep(d) - } - return ok -} - -const infinityDuration time.Duration = 0x7fffffffffffffff - -// Take takes count tokens from the bucket without blocking. It returns -// the time that the caller should wait until the tokens are actually -// available. -// -// Note that if the request is irrevocable - there is no way to return -// tokens to the bucket once this method commits us to taking them. -func (tb *Bucket) Take(count int64) time.Duration { - d, _ := tb.take(tb.clock.Now(), count, infinityDuration) - return d -} - -// TakeMaxDuration is like Take, except that -// it will only take tokens from the bucket if the wait -// time for the tokens is no greater than maxWait. -// -// If it would take longer than maxWait for the tokens -// to become available, it does nothing and reports false, -// otherwise it returns the time that the caller should -// wait until the tokens are actually available, and reports -// true. -func (tb *Bucket) TakeMaxDuration(count int64, maxWait time.Duration) (time.Duration, bool) { - return tb.take(tb.clock.Now(), count, maxWait) -} - -// TakeAvailable takes up to count immediately available tokens from the -// bucket. It returns the number of tokens removed, or zero if there are -// no available tokens. It does not block. -func (tb *Bucket) TakeAvailable(count int64) int64 { - return tb.takeAvailable(tb.clock.Now(), count) -} - -// takeAvailable is the internal version of TakeAvailable - it takes the -// current time as an argument to enable easy testing. -func (tb *Bucket) takeAvailable(now time.Time, count int64) int64 { - if count <= 0 { - return 0 - } - tb.mu.Lock() - defer tb.mu.Unlock() - - tb.adjust(now) - if tb.avail <= 0 { - return 0 - } - if count > tb.avail { - count = tb.avail - } - tb.avail -= count - return count -} - -// Available returns the number of available tokens. It will be negative -// when there are consumers waiting for tokens. Note that if this -// returns greater than zero, it does not guarantee that calls that take -// tokens from the buffer will succeed, as the number of available -// tokens could have changed in the meantime. This method is intended -// primarily for metrics reporting and debugging. -func (tb *Bucket) Available() int64 { - return tb.available(tb.clock.Now()) -} - -// available is the internal version of available - it takes the current time as -// an argument to enable easy testing. -func (tb *Bucket) available(now time.Time) int64 { - tb.mu.Lock() - defer tb.mu.Unlock() - tb.adjust(now) - return tb.avail -} - -// Capacity returns the capacity that the bucket was created with. -func (tb *Bucket) Capacity() int64 { - return tb.capacity -} - -// Rate returns the fill rate of the bucket, in tokens per second. -func (tb *Bucket) Rate() float64 { - return 1e9 * float64(tb.quantum) / float64(tb.fillInterval) -} - -// take is the internal version of Take - it takes the current time as -// an argument to enable easy testing. -func (tb *Bucket) take(now time.Time, count int64, maxWait time.Duration) (time.Duration, bool) { - if count <= 0 { - return 0, true - } - tb.mu.Lock() - defer tb.mu.Unlock() - - currentTick := tb.adjust(now) - avail := tb.avail - count - if avail >= 0 { - tb.avail = avail - return 0, true - } - // Round up the missing tokens to the nearest multiple - // of quantum - the tokens won't be available until - // that tick. - endTick := currentTick + (-avail+tb.quantum-1)/tb.quantum - endTime := tb.startTime.Add(time.Duration(endTick) * tb.fillInterval) - waitTime := endTime.Sub(now) - if waitTime > maxWait { - return 0, false - } - tb.avail = avail - return waitTime, true -} - -// adjust adjusts the current bucket capacity based on the current time. -// It returns the current tick. -func (tb *Bucket) adjust(now time.Time) (currentTick int64) { - currentTick = int64(now.Sub(tb.startTime) / tb.fillInterval) - - if tb.avail >= tb.capacity { - return - } - tb.avail += (currentTick - tb.availTick) * tb.quantum - if tb.avail > tb.capacity { - tb.avail = tb.capacity - } - tb.availTick = currentTick - return -} diff --git a/vendor/github.com/juju/ratelimit/ratelimit_test.go b/vendor/github.com/juju/ratelimit/ratelimit_test.go deleted file mode 100644 index 62d88ded0..000000000 --- a/vendor/github.com/juju/ratelimit/ratelimit_test.go +++ /dev/null @@ -1,389 +0,0 @@ -// Copyright 2014 Canonical Ltd. -// Licensed under the LGPLv3 with static-linking exception. -// See LICENCE file for details. - -package ratelimit - -import ( - "math" - "testing" - "time" - - gc "gopkg.in/check.v1" -) - -func TestPackage(t *testing.T) { - gc.TestingT(t) -} - -type rateLimitSuite struct{} - -var _ = gc.Suite(rateLimitSuite{}) - -type takeReq struct { - time time.Duration - count int64 - expectWait time.Duration -} - -var takeTests = []struct { - about string - fillInterval time.Duration - capacity int64 - reqs []takeReq -}{{ - about: "serial requests", - fillInterval: 250 * time.Millisecond, - capacity: 10, - reqs: []takeReq{{ - time: 0, - count: 0, - expectWait: 0, - }, { - time: 0, - count: 10, - expectWait: 0, - }, { - time: 0, - count: 1, - expectWait: 250 * time.Millisecond, - }, { - time: 250 * time.Millisecond, - count: 1, - expectWait: 250 * time.Millisecond, - }}, -}, { - about: "concurrent requests", - fillInterval: 250 * time.Millisecond, - capacity: 10, - reqs: []takeReq{{ - time: 0, - count: 10, - expectWait: 0, - }, { - time: 0, - count: 2, - expectWait: 500 * time.Millisecond, - }, { - time: 0, - count: 2, - expectWait: 1000 * time.Millisecond, - }, { - time: 0, - count: 1, - expectWait: 1250 * time.Millisecond, - }}, -}, { - about: "more than capacity", - fillInterval: 1 * time.Millisecond, - capacity: 10, - reqs: []takeReq{{ - time: 0, - count: 10, - expectWait: 0, - }, { - time: 20 * time.Millisecond, - count: 15, - expectWait: 5 * time.Millisecond, - }}, -}, { - about: "sub-quantum time", - fillInterval: 10 * time.Millisecond, - capacity: 10, - reqs: []takeReq{{ - time: 0, - count: 10, - expectWait: 0, - }, { - time: 7 * time.Millisecond, - count: 1, - expectWait: 3 * time.Millisecond, - }, { - time: 8 * time.Millisecond, - count: 1, - expectWait: 12 * time.Millisecond, - }}, -}, { - about: "within capacity", - fillInterval: 10 * time.Millisecond, - capacity: 5, - reqs: []takeReq{{ - time: 0, - count: 5, - expectWait: 0, - }, { - time: 60 * time.Millisecond, - count: 5, - expectWait: 0, - }, { - time: 60 * time.Millisecond, - count: 1, - expectWait: 10 * time.Millisecond, - }, { - time: 80 * time.Millisecond, - count: 2, - expectWait: 10 * time.Millisecond, - }}, -}} - -var availTests = []struct { - about string - capacity int64 - fillInterval time.Duration - take int64 - sleep time.Duration - - expectCountAfterTake int64 - expectCountAfterSleep int64 -}{{ - about: "should fill tokens after interval", - capacity: 5, - fillInterval: time.Second, - take: 5, - sleep: time.Second, - expectCountAfterTake: 0, - expectCountAfterSleep: 1, -}, { - about: "should fill tokens plus existing count", - capacity: 2, - fillInterval: time.Second, - take: 1, - sleep: time.Second, - expectCountAfterTake: 1, - expectCountAfterSleep: 2, -}, { - about: "shouldn't fill before interval", - capacity: 2, - fillInterval: 2 * time.Second, - take: 1, - sleep: time.Second, - expectCountAfterTake: 1, - expectCountAfterSleep: 1, -}, { - about: "should fill only once after 1*interval before 2*interval", - capacity: 2, - fillInterval: 2 * time.Second, - take: 1, - sleep: 3 * time.Second, - expectCountAfterTake: 1, - expectCountAfterSleep: 2, -}} - -func (rateLimitSuite) TestTake(c *gc.C) { - for i, test := range takeTests { - tb := NewBucket(test.fillInterval, test.capacity) - for j, req := range test.reqs { - d, ok := tb.take(tb.startTime.Add(req.time), req.count, infinityDuration) - c.Assert(ok, gc.Equals, true) - if d != req.expectWait { - c.Fatalf("test %d.%d, %s, got %v want %v", i, j, test.about, d, req.expectWait) - } - } - } -} - -func (rateLimitSuite) TestTakeMaxDuration(c *gc.C) { - for i, test := range takeTests { - tb := NewBucket(test.fillInterval, test.capacity) - for j, req := range test.reqs { - if req.expectWait > 0 { - d, ok := tb.take(tb.startTime.Add(req.time), req.count, req.expectWait-1) - c.Assert(ok, gc.Equals, false) - c.Assert(d, gc.Equals, time.Duration(0)) - } - d, ok := tb.take(tb.startTime.Add(req.time), req.count, req.expectWait) - c.Assert(ok, gc.Equals, true) - if d != req.expectWait { - c.Fatalf("test %d.%d, %s, got %v want %v", i, j, test.about, d, req.expectWait) - } - } - } -} - -type takeAvailableReq struct { - time time.Duration - count int64 - expect int64 -} - -var takeAvailableTests = []struct { - about string - fillInterval time.Duration - capacity int64 - reqs []takeAvailableReq -}{{ - about: "serial requests", - fillInterval: 250 * time.Millisecond, - capacity: 10, - reqs: []takeAvailableReq{{ - time: 0, - count: 0, - expect: 0, - }, { - time: 0, - count: 10, - expect: 10, - }, { - time: 0, - count: 1, - expect: 0, - }, { - time: 250 * time.Millisecond, - count: 1, - expect: 1, - }}, -}, { - about: "concurrent requests", - fillInterval: 250 * time.Millisecond, - capacity: 10, - reqs: []takeAvailableReq{{ - time: 0, - count: 5, - expect: 5, - }, { - time: 0, - count: 2, - expect: 2, - }, { - time: 0, - count: 5, - expect: 3, - }, { - time: 0, - count: 1, - expect: 0, - }}, -}, { - about: "more than capacity", - fillInterval: 1 * time.Millisecond, - capacity: 10, - reqs: []takeAvailableReq{{ - time: 0, - count: 10, - expect: 10, - }, { - time: 20 * time.Millisecond, - count: 15, - expect: 10, - }}, -}, { - about: "within capacity", - fillInterval: 10 * time.Millisecond, - capacity: 5, - reqs: []takeAvailableReq{{ - time: 0, - count: 5, - expect: 5, - }, { - time: 60 * time.Millisecond, - count: 5, - expect: 5, - }, { - time: 70 * time.Millisecond, - count: 1, - expect: 1, - }}, -}} - -func (rateLimitSuite) TestTakeAvailable(c *gc.C) { - for i, test := range takeAvailableTests { - tb := NewBucket(test.fillInterval, test.capacity) - for j, req := range test.reqs { - d := tb.takeAvailable(tb.startTime.Add(req.time), req.count) - if d != req.expect { - c.Fatalf("test %d.%d, %s, got %v want %v", i, j, test.about, d, req.expect) - } - } - } -} - -func (rateLimitSuite) TestPanics(c *gc.C) { - c.Assert(func() { NewBucket(0, 1) }, gc.PanicMatches, "token bucket fill interval is not > 0") - c.Assert(func() { NewBucket(-2, 1) }, gc.PanicMatches, "token bucket fill interval is not > 0") - c.Assert(func() { NewBucket(1, 0) }, gc.PanicMatches, "token bucket capacity is not > 0") - c.Assert(func() { NewBucket(1, -2) }, gc.PanicMatches, "token bucket capacity is not > 0") -} - -func isCloseTo(x, y, tolerance float64) bool { - return math.Abs(x-y)/y < tolerance -} - -func (rateLimitSuite) TestRate(c *gc.C) { - tb := NewBucket(1, 1) - if !isCloseTo(tb.Rate(), 1e9, 0.00001) { - c.Fatalf("got %v want 1e9", tb.Rate()) - } - tb = NewBucket(2*time.Second, 1) - if !isCloseTo(tb.Rate(), 0.5, 0.00001) { - c.Fatalf("got %v want 0.5", tb.Rate()) - } - tb = NewBucketWithQuantum(100*time.Millisecond, 1, 5) - if !isCloseTo(tb.Rate(), 50, 0.00001) { - c.Fatalf("got %v want 50", tb.Rate()) - } -} - -func checkRate(c *gc.C, rate float64) { - tb := NewBucketWithRate(rate, 1<<62) - if !isCloseTo(tb.Rate(), rate, rateMargin) { - c.Fatalf("got %g want %v", tb.Rate(), rate) - } - d, ok := tb.take(tb.startTime, 1<<62, infinityDuration) - c.Assert(ok, gc.Equals, true) - c.Assert(d, gc.Equals, time.Duration(0)) - - // Check that the actual rate is as expected by - // asking for a not-quite multiple of the bucket's - // quantum and checking that the wait time - // correct. - d, ok = tb.take(tb.startTime, tb.quantum*2-tb.quantum/2, infinityDuration) - c.Assert(ok, gc.Equals, true) - expectTime := 1e9 * float64(tb.quantum) * 2 / rate - if !isCloseTo(float64(d), expectTime, rateMargin) { - c.Fatalf("rate %g: got %g want %v", rate, float64(d), expectTime) - } -} - -func (rateLimitSuite) TestNewWithRate(c *gc.C) { - for rate := float64(1); rate < 1e6; rate += 7 { - checkRate(c, rate) - } - for _, rate := range []float64{ - 1024 * 1024 * 1024, - 1e-5, - 0.9e-5, - 0.5, - 0.9, - 0.9e8, - 3e12, - 4e18, - } { - checkRate(c, rate) - checkRate(c, rate/3) - checkRate(c, rate*1.3) - } -} - -func TestAvailable(t *testing.T) { - for i, tt := range availTests { - tb := NewBucket(tt.fillInterval, tt.capacity) - if c := tb.takeAvailable(tb.startTime, tt.take); c != tt.take { - t.Fatalf("#%d: %s, take = %d, want = %d", i, tt.about, c, tt.take) - } - if c := tb.available(tb.startTime); c != tt.expectCountAfterTake { - t.Fatalf("#%d: %s, after take, available = %d, want = %d", i, tt.about, c, tt.expectCountAfterTake) - } - if c := tb.available(tb.startTime.Add(tt.sleep)); c != tt.expectCountAfterSleep { - t.Fatalf("#%d: %s, after some time it should fill in new tokens, available = %d, want = %d", - i, tt.about, c, tt.expectCountAfterSleep) - } - } - -} - -func BenchmarkWait(b *testing.B) { - tb := NewBucket(1, 16*1024) - for i := b.N - 1; i >= 0; i-- { - tb.Wait(1) - } -} diff --git a/vendor/github.com/juju/ratelimit/reader.go b/vendor/github.com/juju/ratelimit/reader.go deleted file mode 100644 index 6403bf78d..000000000 --- a/vendor/github.com/juju/ratelimit/reader.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2014 Canonical Ltd. -// Licensed under the LGPLv3 with static-linking exception. -// See LICENCE file for details. - -package ratelimit - -import "io" - -type reader struct { - r io.Reader - bucket *Bucket -} - -// Reader returns a reader that is rate limited by -// the given token bucket. Each token in the bucket -// represents one byte. -func Reader(r io.Reader, bucket *Bucket) io.Reader { - return &reader{ - r: r, - bucket: bucket, - } -} - -func (r *reader) Read(buf []byte) (int, error) { - n, err := r.r.Read(buf) - if n <= 0 { - return n, err - } - r.bucket.Wait(int64(n)) - return n, err -} - -type writer struct { - w io.Writer - bucket *Bucket -} - -// Writer returns a reader that is rate limited by -// the given token bucket. Each token in the bucket -// represents one byte. -func Writer(w io.Writer, bucket *Bucket) io.Writer { - return &writer{ - w: w, - bucket: bucket, - } -} - -func (w *writer) Write(buf []byte) (int, error) { - w.bucket.Wait(int64(len(buf))) - return w.w.Write(buf) -} diff --git a/vendor/github.com/petar/GoLLRB/.gitignore b/vendor/github.com/petar/GoLLRB/.gitignore deleted file mode 100644 index e333b2dbf..000000000 --- a/vendor/github.com/petar/GoLLRB/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -syntax:glob -*.[568ao] -*.ao -*.so -*.pyc -*.swp -*.swo -._* -.nfs.* -[568a].out -*~ -*.orig -*.pb.go -core -_obj -_test -src/pkg/Make.deps -_testmain.go - -syntax:regexp -^pkg/ -^src/cmd/(.*)/6?\1$ -^.*/core.[0-9]*$ diff --git a/vendor/github.com/petar/GoLLRB/AUTHORS b/vendor/github.com/petar/GoLLRB/AUTHORS deleted file mode 100644 index 78d1de495..000000000 --- a/vendor/github.com/petar/GoLLRB/AUTHORS +++ /dev/null @@ -1,4 +0,0 @@ -Petar Maymounkov -Vadim Vygonets -Ian Smith -Martin Bruse diff --git a/vendor/github.com/petar/GoLLRB/LICENSE b/vendor/github.com/petar/GoLLRB/LICENSE deleted file mode 100644 index b75312c78..000000000 --- a/vendor/github.com/petar/GoLLRB/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2010, Petar Maymounkov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -(*) Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. - -(*) Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -(*) Neither the name of Petar Maymounkov nor the names of its contributors may be -used to endorse or promote products derived from this software without specific -prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/petar/GoLLRB/README.md b/vendor/github.com/petar/GoLLRB/README.md deleted file mode 100644 index 742ca0bd5..000000000 --- a/vendor/github.com/petar/GoLLRB/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# GoLLRB - -GoLLRB is a Left-Leaning Red-Black (LLRB) implementation of 2-3 balanced binary -search trees in Go Language. - -## Overview - -As of this writing and to the best of the author's knowledge, -Go still does not have a balanced binary search tree (BBST) data structure. -These data structures are quite useful in a variety of cases. A BBST maintains -elements in sorted order under dynamic updates (inserts and deletes) and can -support various order-specific queries. Furthermore, in practice one often -implements other common data structures like Priority Queues, using BBST's. - -2-3 trees (a type of BBST's), as well as the runtime-similar 2-3-4 trees, are -the de facto standard BBST algoritms found in implementations of Python, Java, -and other libraries. The LLRB method of implementing 2-3 trees is a recent -improvement over the traditional implementation. The LLRB approach was -discovered relatively recently (in 2008) by Robert Sedgewick of Princeton -University. - -GoLLRB is a Go implementation of LLRB 2-3 trees. - -## Maturity - -GoLLRB has been used in some pretty heavy-weight machine learning tasks over many gigabytes of data. -I consider it to be in stable, perhaps even production, shape. There are no known bugs. - -## Installation - -With a healthy Go Language installed, simply run `go get github.com/petar/GoLLRB/llrb` - -## Example - - package main - - import ( - "fmt" - "github.com/petar/GoLLRB/llrb" - ) - - func lessInt(a, b interface{}) bool { return a.(int) < b.(int) } - - func main() { - tree := llrb.New(lessInt) - tree.ReplaceOrInsert(1) - tree.ReplaceOrInsert(2) - tree.ReplaceOrInsert(3) - tree.ReplaceOrInsert(4) - tree.DeleteMin() - tree.Delete(4) - c := tree.IterAscend() - for { - u := <-c - if u == nil { - break - } - fmt.Printf("%d\n", int(u.(int))) - } - } - -## About - -GoLLRB was written by [Petar Maymounkov](http://pdos.csail.mit.edu/~petar/). - -Follow me on [Twitter @maymounkov](http://www.twitter.com/maymounkov)! diff --git a/vendor/github.com/petar/GoLLRB/doc/Sedgewick-LLRB.pdf b/vendor/github.com/petar/GoLLRB/doc/Sedgewick-LLRB.pdf deleted file mode 100644 index a399b06ae09a1fe32d8235ac569f38128248637a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 819932 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%0D^Ic|NC(e$eDBkGAUe**%qajtxI{`0740$&iu2 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%0D99DAMZ=9jL17%tEs^VCvICaF}Cf)CZ~LCs_- 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%0ArHe5XHr^F%jmTxj=wjYcL>TzNJ;- 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 diff --git a/vendor/github.com/petar/GoLLRB/doc/Sedgewick-RedBlackBST.java b/vendor/github.com/petar/GoLLRB/doc/Sedgewick-RedBlackBST.java deleted file mode 100644 index 55ac177f8..000000000 --- a/vendor/github.com/petar/GoLLRB/doc/Sedgewick-RedBlackBST.java +++ /dev/null @@ -1,475 +0,0 @@ -public class RedBlackBST, Value> -{ - private static final int BST = 0; - private static final int TD234 = 1; - private static final int BU23 = 2; - private static final boolean RED = true; - private static final boolean BLACK = false; - - private Node root; // root of the BST - private int k; // ordinal for drawing - private final int species; // species kind of tree for insert - private int heightBLACK; // black height of tree - - RedBlackBST(int species) - { this.species = species; } - - private class Node - { - Key key; // key - Value value; // associated data - Node left, right; // left and right subtrees - boolean color; // color of parent link - private int N; // number of nodes in tree rooted here - private int height; // height of tree rooted here - private double xc, yc; // for drawing - - Node(Key key, Value value) - { - this.key = key; - this.value = value; - this.color = RED; - this.N = 1; - this.height = 1; - } - } - - public int size() - { return size(root); } - - private int size(Node x) - { - if (x == null) return 0; - else return x.N; - } - - public int rootRank() - { - if (root == null) return 0; - else return size(root.left); - } - - public int height() - { return height(root); } - - public int heightB() - { return heightBLACK; } - - private int height(Node x) - { - if (x == null) return 0; - else return x.height; - } - - public boolean contains(Key key) - { return (get(key) != null); } - - public Value get(Key key) - { return get(root, key); } - - private Value get(Node x, Key key) - { - if (x == null) return null; - if (eq (key, x.key)) return x.value; - if (less(key, x.key)) return get(x.left, key); - else return get(x.right, key); - } - - public Key min() - { - if (root == null) return null; - else return min(root); - } - - private Key min(Node x) - { - if (x.left == null) return x.key; - else return min(x.left); - } - - public Key max() - { - if (root == null) return null; - else return max(root); - } - - private Key max(Node x) - { - if (x.right == null) return x.key; - else return max(x.right); - } - - public void put(Key key, Value value) - { - root = insert(root, key, value); - if (isRed(root)) heightBLACK++; - root.color = BLACK; - } - - private Node insert(Node h, Key key, Value value) - { - if (h == null) - return new Node(key, value); - - if (species == TD234) - if (isRed(h.left) && isRed(h.right)) - colorFlip(h); - - if (eq(key, h.key)) - h.value = value; - else if (less(key, h.key)) - h.left = insert(h.left, key, value); - else - h.right = insert(h.right, key, value); - - if (species == BST) return setN(h); - - if (isRed(h.right)) - h = rotateLeft(h); - - if (isRed(h.left) && isRed(h.left.left)) - h = rotateRight(h); - - if (species == BU23) - if (isRed(h.left) && isRed(h.right)) - colorFlip(h); - - return setN(h); - } - - public void deleteMin() - { - root = deleteMin(root); - root.color = BLACK; - } - - private Node deleteMin(Node h) - { - if (h.left == null) - return null; - - if (!isRed(h.left) && !isRed(h.left.left)) - h = moveRedLeft(h); - - h.left = deleteMin(h.left); - - return fixUp(h); - } - - public void deleteMax() - { - root = deleteMax(root); - root.color = BLACK; - } - - private Node deleteMax(Node h) - { - // if (h.right == null) - // { - // if (h.left != null) - // h.left.color = BLACK; - // return h.left; - // } - - if (isRed(h.left)) - h = rotateRight(h); - - if (h.right == null) - return null; - - if (!isRed(h.right) && !isRed(h.right.left)) - h = moveRedRight(h); - - h.right = deleteMax(h.right); - - return fixUp(h); - } - - public void delete(Key key) - { - root = delete(root, key); - root.color = BLACK; - } - - private Node delete(Node h, Key key) - { - if (less(key, h.key)) - { - if (!isRed(h.left) && !isRed(h.left.left)) - h = moveRedLeft(h); - h.left = delete(h.left, key); - } - else - { - if (isRed(h.left)) - h = rotateRight(h); - if (eq(key, h.key) && (h.right == null)) - return null; - if (!isRed(h.right) && !isRed(h.right.left)) - h = moveRedRight(h); - if (eq(key, h.key)) - { - h.value = get(h.right, min(h.right)); - h.key = min(h.right); - h.right = deleteMin(h.right); - } - else h.right = delete(h.right, key); - } - - return fixUp(h); - } - -// Helper methods - - private boolean less(Key a, Key b) { return a.compareTo(b) < 0; } - private boolean eq (Key a, Key b) { return a.compareTo(b) == 0; } - - private boolean isRed(Node x) - { - if (x == null) return false; - return (x.color == RED); - } - - private void colorFlip(Node h) - { - h.color = !h.color; - h.left.color = !h.left.color; - h.right.color = !h.right.color; - } - - private Node rotateLeft(Node h) - { // Make a right-leaning 3-node lean to the left. - Node x = h.right; - h.right = x.left; - x.left = setN(h); - x.color = x.left.color; - x.left.color = RED; - return setN(x); - } - - private Node rotateRight(Node h) - { // Make a left-leaning 3-node lean to the right. - Node x = h.left; - h.left = x.right; - x.right = setN(h); - x.color = x.right.color; - x.right.color = RED; - return setN(x); - } - - private Node moveRedLeft(Node h) - { // Assuming that h is red and both h.left and h.left.left - // are black, make h.left or one of its children red. - colorFlip(h); - if (isRed(h.right.left)) - { - h.right = rotateRight(h.right); - h = rotateLeft(h); - colorFlip(h); - } - return h; - } - - private Node moveRedRight(Node h) - { // Assuming that h is red and both h.right and h.right.left - // are black, make h.right or one of its children red. - colorFlip(h); - if (isRed(h.left.left)) - { - h = rotateRight(h); - colorFlip(h); - } - return h; - } - - private Node fixUp(Node h) - { - if (isRed(h.right)) - h = rotateLeft(h); - - if (isRed(h.left) && isRed(h.left.left)) - h = rotateRight(h); - - if (isRed(h.left) && isRed(h.right)) - colorFlip(h); - - return setN(h); - } - - private Node setN(Node h) - { - h.N = size(h.left) + size(h.right) + 1; - if (height(h.left) > height(h.right)) h.height = height(h.left) + 1; - else h.height = height(h.right) + 1; - return h; - } - - public String toString() - { - if (root == null) return ""; - else return heightB() + " " + toString(root); - } - - public String toString(Node x) - { - String s = "("; - if (x.left == null) s += "("; else s += toString(x.left); - if (isRed(x)) s += "*"; - if (x.right == null) s += ")"; else s += toString(x.right); - return s + ")"; - } - -// Methods for tree drawing - - public void draw(double y, double lineWidth, double nodeSize) - { - k = 0; - setcoords(root, y); - StdDraw.setPenColor(StdDraw.BLACK); - StdDraw.setPenRadius(lineWidth); - drawlines(root); - StdDraw.setPenColor(StdDraw.WHITE); - drawnodes(root, nodeSize); - } - - public void setcoords(Node x, double d) - { - if (x == null) return; - setcoords(x.left, d-.04); - x.xc = (0.5 + k++)/size(); x.yc = d - .04; - setcoords(x.right, d-.04); - } - - public void drawlines(Node x) - { - if (x == null) return; - drawlines(x.left); - if (x.left != null) - { - if (x.left.color == RED) StdDraw.setPenColor(StdDraw.RED); - else StdDraw.setPenColor(StdDraw.BLACK); - StdDraw.line(x.xc, x.yc, x.left.xc, x.left.yc); - } - if (x.right != null) - { - if (x.right.color == RED) StdDraw.setPenColor(StdDraw.RED); - else StdDraw.setPenColor(StdDraw.BLACK); - StdDraw.line(x.xc, x.yc, x.right.xc, x.right.yc); - } - drawlines(x.right); - } - - public void drawnodes(Node x, double nodeSize) - { - if (x == null) return; - drawnodes(x.left, nodeSize); - StdDraw.filledCircle(x.xc, x.yc, nodeSize); - drawnodes(x.right, nodeSize); - } - - public void mark(Key key) - { - StdDraw.setPenColor(StdDraw.BLACK); - marknodes(key, root); - } - - public void marknodes(Key key, Node x) - { - if (x == null) return; - marknodes(key, x.left); - if (eq(key, x.key)) - StdDraw.filledCircle(x.xc, x.yc, .004); - marknodes(key, x.right); - } - - public int ipl() - { return ipl(root); } - - public int ipl(Node x) - { - if (x == null) return 0; - return size(x) - 1 + ipl(x.left) + ipl(x.right); - } - - public int sizeRed() - { return sizeRed(root); } - - public int sizeRed(Node x) - { - if (x == null) return 0; - if (isRed(x)) return 1 + sizeRed(x.left) + sizeRed(x.right); - else return sizeRed(x.left) + sizeRed(x.right); - } - -// Integrity checks - - public boolean check() - { // Is this tree a red-black tree? - return isBST() && is234() && isBalanced(); - } - - private boolean isBST() - { // Is this tree a BST? - return isBST(root, min(), max()); - } - - private boolean isBST(Node x, Key min, Key max) - { // Are all the values in the BST rooted at x between min and max, - // and does the same property hold for both subtrees? - if (x == null) return true; - if (less(x.key, min) || less(max, x.key)) return false; - return isBST(x.left, min, x.key) && isBST(x.right, x.key, max); - } - - private boolean is234() { return is234(root); } - private boolean is234(Node x) - { // Does the tree have no red right links, and at most two (left) - // red links in a row on any path? - if (x == null) return true; - if (isRed(x.right)) return false; - if (isRed(x)) - if (isRed(x.left)) - if (isRed(x.left.left)) return false; - return is234(x.left) && is234(x.right); - } - - private boolean isBalanced() - { // Do all paths from root to leaf have same number of black edges? - int black = 0; // number of black links on path from root to min - Node x = root; - while (x != null) - { - if (!isRed(x)) black++; - x = x.left; - } - return isBalanced(root, black); - } - - private boolean isBalanced(Node x, int black) - { // Does every path from the root to a leaf have the given number - // of black links? - if (x == null && black == 0) return true; - else if (x == null && black != 0) return false; - if (!isRed(x)) black--; - return isBalanced(x.left, black) && isBalanced(x.right, black); - } - - - public static void main(String[] args) - { - StdDraw.setPenRadius(.0025); - int species = Integer.parseInt(args[0]); - RedBlackBST st; - st = new RedBlackBST(species); - int[] a = { 3, 1, 4, 2, 5, 9, 6, 8, 7 }; - for (int i = 0; i < a.length; i++) - st.put(a[i], i); - StdOut.println(st); - StdDraw.clear(StdDraw.LIGHT_GRAY); - st.draw(.95, .0025, .008); - StdOut.println(st.min() + " " + st.max() + " " + st.check()); - StdOut.println(st.ipl()); - StdOut.println(st.heightB()); - } - -} diff --git a/vendor/github.com/petar/GoLLRB/doc/Sedgewick-Talk-Penn2008.pdf b/vendor/github.com/petar/GoLLRB/doc/Sedgewick-Talk-Penn2008.pdf deleted file mode 100644 index 07861abedacbb8a39b6f8aedad0d95ea8c343ed3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11636171 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%0A!w4EurGF_YlryEfW!(S`e;^stHke{^ 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�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