From dfde075c660cbc2590f433da3d7da8482cf440ae Mon Sep 17 00:00:00 2001 From: Murat Kabilov Date: Mon, 20 Feb 2017 11:23:31 +0100 Subject: [PATCH] Use TPR object namespace while creating its objects --- cmd/main.go | 10 +++--- manifests/postgres-operator.yaml | 1 + manifests/testpostgresql.yaml | 1 + pkg/cluster/cluster.go | 26 ++++++++-------- pkg/cluster/resources.go | 52 ++++++++++++++++++-------------- pkg/controller/controller.go | 15 ++++----- 6 files changed, 58 insertions(+), 47 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index 5f0e83db4..67e57c9b0 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -16,7 +16,7 @@ import ( var ( KubeConfigFile string - Namespace string + podNamespace string OutOfCluster bool version string ) @@ -26,9 +26,9 @@ func init() { flag.BoolVar(&OutOfCluster, "outofcluster", false, "Whether the operator runs in- our outside of the Kubernetes cluster.") flag.Parse() - Namespace = os.Getenv("MY_POD_NAMESPACE") - if len(Namespace) == 0 { - Namespace = "default" + podNamespace = os.Getenv("MY_POD_NAMESPACE") + if len(podNamespace) == 0 { + podNamespace = "default" } } @@ -47,7 +47,7 @@ func ControllerConfig() *controller.Config { teamsApi := teams.NewTeamsAPI(constants.TeamsAPIUrl) return &controller.Config{ - Namespace: Namespace, + PodNamespace: podNamespace, KubeClient: client, RestClient: restClient, TeamsAPIClient: teamsApi, diff --git a/manifests/postgres-operator.yaml b/manifests/postgres-operator.yaml index 9d300e38e..39dc99b1e 100644 --- a/manifests/postgres-operator.yaml +++ b/manifests/postgres-operator.yaml @@ -2,6 +2,7 @@ apiVersion: extensions/v1beta1 kind: Deployment metadata: name: postgres-operator + namespace: acid spec: replicas: 1 template: diff --git a/manifests/testpostgresql.yaml b/manifests/testpostgresql.yaml index bb0008d6c..190e17dfe 100644 --- a/manifests/testpostgresql.yaml +++ b/manifests/testpostgresql.yaml @@ -3,6 +3,7 @@ kind: "Postgresql" metadata: name: testcluster + namespace: acid spec: teamId: "50051320" diff --git a/pkg/cluster/cluster.go b/pkg/cluster/cluster.go index 5c687e117..ef68403c3 100644 --- a/pkg/cluster/cluster.go +++ b/pkg/cluster/cluster.go @@ -33,11 +33,11 @@ var ( //TODO: remove struct duplication type Config struct { - Namespace string - KubeClient *kubernetes.Clientset //TODO: move clients to the better place? - RestClient *rest.RESTClient - EtcdClient etcdclient.KeysAPI - TeamsAPIClient *teams.TeamsAPI + ControllerNamespace string + KubeClient *kubernetes.Clientset //TODO: move clients to the better place? + RestClient *rest.RESTClient + EtcdClient etcdclient.KeysAPI + TeamsAPIClient *teams.TeamsAPI } type pgUser struct { @@ -74,7 +74,8 @@ func New(cfg Config, spec *spec.Postgresql) *Cluster { } func (c *Cluster) getReadonlyToken() (string, error) { - credentialsSecret, err := c.config.KubeClient.Secrets(c.config.Namespace).Get("postgresql-operator") + // for some reason PlatformCredentialsSet creates secrets only in the default namespace + credentialsSecret, err := c.config.KubeClient.Secrets(v1.NamespaceDefault).Get("postgresql-operator") if err != nil { return "", fmt.Errorf("Can't get credentials secret: %s", err) @@ -198,7 +199,7 @@ func (c *Cluster) waitPodDelete() error { return retryutil.Retry( constants.ResourceCheckInterval, int(constants.ResourceCheckTimeout/constants.ResourceCheckInterval), func() (bool, error) { - pods, err := c.config.KubeClient.Pods(c.config.Namespace).List(listOptions) + pods, err := c.config.KubeClient.Pods((*c.cluster).Metadata.Namespace).List(listOptions) if err != nil { return false, err } @@ -213,7 +214,7 @@ func (c *Cluster) waitStatefulsetReady() error { listOptions := v1.ListOptions{ LabelSelector: c.labelsSet().String(), } - ss, err := c.config.KubeClient.StatefulSets(c.config.Namespace).List(listOptions) + ss, err := c.config.KubeClient.StatefulSets((*c.cluster).Metadata.Namespace).List(listOptions) if err != nil { return false, err } @@ -228,6 +229,7 @@ func (c *Cluster) waitStatefulsetReady() error { func (c *Cluster) waitPodLabelsReady() error { ls := c.labelsSet() + namespace := (*c.cluster).Metadata.Namespace listOptions := v1.ListOptions{ LabelSelector: ls.String(), @@ -238,7 +240,7 @@ func (c *Cluster) waitPodLabelsReady() error { replicaListOption := v1.ListOptions{ LabelSelector: labels.Merge(ls, labels.Set{"spilo-role": "replica"}).String(), } - pods, err := c.config.KubeClient.Pods(c.config.Namespace).List(listOptions) + pods, err := c.config.KubeClient.Pods(namespace).List(listOptions) if err != nil { return err } @@ -247,11 +249,11 @@ func (c *Cluster) waitPodLabelsReady() error { return retryutil.Retry( constants.ResourceCheckInterval, int(constants.ResourceCheckTimeout/constants.ResourceCheckInterval), func() (bool, error) { - masterPods, err := c.config.KubeClient.Pods(c.config.Namespace).List(masterListOption) + masterPods, err := c.config.KubeClient.Pods(namespace).List(masterListOption) if err != nil { return false, err } - replicaPods, err := c.config.KubeClient.Pods(c.config.Namespace).List(replicaListOption) + replicaPods, err := c.config.KubeClient.Pods(namespace).List(replicaListOption) if err != nil { return false, err } @@ -305,7 +307,7 @@ func (c *Cluster) waitClusterReady() error { func (c *Cluster) Delete() error { clusterName := (*c.cluster).Metadata.Name - namespace := c.config.Namespace + namespace := (*c.cluster).Metadata.Namespace orphanDependents := false deleteOptions := &v1.DeleteOptions{ OrphanDependents: &orphanDependents, diff --git a/pkg/cluster/resources.go b/pkg/cluster/resources.go index 10bc6f95c..09905c40c 100644 --- a/pkg/cluster/resources.go +++ b/pkg/cluster/resources.go @@ -22,12 +22,12 @@ END; $$` func (c *Cluster) createStatefulSet() { - clusterName := (*c.cluster).Metadata.Name + meta := (*c.cluster).Metadata envVars := []v1.EnvVar{ { Name: "SCOPE", - Value: clusterName, + Value: meta.Name, }, { Name: "PGROOT", @@ -114,7 +114,7 @@ bootstrap: } container := v1.Container{ - Name: clusterName, + Name: meta.Name, Image: c.dockerImage, ImagePullPolicy: v1.PullAlways, Resources: v1.ResourceRequirements{ @@ -155,6 +155,7 @@ bootstrap: template := v1.PodTemplateSpec{ ObjectMeta: v1.ObjectMeta{ Labels: c.labelsSet(), + Namespace: meta.Namespace, Annotations: map[string]string{"pod.alpha.kubernetes.io/initialized": "true"}, }, Spec: podSpec, @@ -162,17 +163,18 @@ bootstrap: statefulSet := &v1beta1.StatefulSet{ ObjectMeta: v1.ObjectMeta{ - Name: clusterName, - Labels: c.labelsSet(), + Name: meta.Name, + Namespace: meta.Namespace, + Labels: c.labelsSet(), }, Spec: v1beta1.StatefulSetSpec{ Replicas: &c.cluster.Spec.NumberOfInstances, - ServiceName: clusterName, + ServiceName: meta.Name, Template: template, }, } - _, err := c.config.KubeClient.StatefulSets(c.config.Namespace).Create(statefulSet) + _, err := c.config.KubeClient.StatefulSets(meta.Namespace).Create(statefulSet) if err != nil { c.logger.Errorf("Can't create statefulset: %s", err) } else { @@ -182,6 +184,7 @@ bootstrap: func (c *Cluster) applySecrets() { var err error + namespace := (*c.cluster).Metadata.Namespace for username, pgUser := range c.pgUsers { //Skip users with no password i.e. human users (they'll be authenticated using pam) if pgUser.password == "" { @@ -189,8 +192,9 @@ func (c *Cluster) applySecrets() { } secret := v1.Secret{ ObjectMeta: v1.ObjectMeta{ - Name: c.credentialSecretName(username), - Labels: c.labelsSet(), + Name: c.credentialSecretName(username), + Namespace: namespace, + Labels: c.labelsSet(), }, Type: v1.SecretTypeOpaque, Data: map[string][]byte{ @@ -198,11 +202,11 @@ func (c *Cluster) applySecrets() { "password": []byte(pgUser.password), }, } - _, err = c.config.KubeClient.Secrets(c.config.Namespace).Create(&secret) + _, err = c.config.KubeClient.Secrets(namespace).Create(&secret) if k8sutil.IsKubernetesResourceAlreadyExistError(err) { c.logger.Infof("Skipping update of '%s'", secret.Name) - curSecrets, err := c.config.KubeClient.Secrets(c.config.Namespace).Get(c.credentialSecretName(username)) + curSecrets, err := c.config.KubeClient.Secrets(namespace).Get(c.credentialSecretName(username)) if err != nil { c.logger.Errorf("Can't get current secret: %s", err) } @@ -223,18 +227,19 @@ func (c *Cluster) applySecrets() { } func (c *Cluster) createService() { - clusterName := (*c.cluster).Metadata.Name + meta := (*c.cluster).Metadata - _, err := c.config.KubeClient.Services(c.config.Namespace).Get(clusterName) + _, err := c.config.KubeClient.Services(meta.Namespace).Get(meta.Name) if !k8sutil.ResourceNotFound(err) { - c.logger.Infof("Service '%s' already exists", clusterName) + c.logger.Infof("Service '%s' already exists", meta.Name) return } service := v1.Service{ ObjectMeta: v1.ObjectMeta{ - Name: clusterName, - Labels: c.labelsSet(), + Name: meta.Name, + Namespace: meta.Namespace, + Labels: c.labelsSet(), }, Spec: v1.ServiceSpec{ Type: v1.ServiceTypeLoadBalancer, @@ -243,7 +248,7 @@ func (c *Cluster) createService() { }, } - _, err = c.config.KubeClient.Services(c.config.Namespace).Create(&service) + _, err = c.config.KubeClient.Services(meta.Namespace).Create(&service) if err != nil { c.logger.Errorf("Error while creating service: %+v", err) } else { @@ -252,22 +257,23 @@ func (c *Cluster) createService() { } func (c *Cluster) createEndpoint() { - clusterName := (*c.cluster).Metadata.Name + meta := (*c.cluster).Metadata - _, err := c.config.KubeClient.Endpoints(c.config.Namespace).Get(clusterName) + _, err := c.config.KubeClient.Endpoints(meta.Namespace).Get(meta.Name) if !k8sutil.ResourceNotFound(err) { - c.logger.Infof("Endpoint '%s' already exists", clusterName) + c.logger.Infof("Endpoint '%s' already exists", meta.Name) return } endpoint := v1.Endpoints{ ObjectMeta: v1.ObjectMeta{ - Name: clusterName, - Labels: c.labelsSet(), + Name: meta.Name, + Namespace: meta.Namespace, + Labels: c.labelsSet(), }, } - _, err = c.config.KubeClient.Endpoints(c.config.Namespace).Create(&endpoint) + _, err = c.config.KubeClient.Endpoints(meta.Namespace).Create(&endpoint) if err != nil { c.logger.Errorf("Error while creating endpoint: %+v", err) } else { diff --git a/pkg/controller/controller.go b/pkg/controller/controller.go index 2a058e5c2..578d94362 100644 --- a/pkg/controller/controller.go +++ b/pkg/controller/controller.go @@ -22,7 +22,7 @@ import ( ) type Config struct { - Namespace string + PodNamespace string KubeClient *kubernetes.Clientset RestClient *rest.RESTClient EtcdClient etcdclient.KeysAPI @@ -81,6 +81,7 @@ func (c *Controller) createTPR() error { tpr := &v1beta1extensions.ThirdPartyResource{ ObjectMeta: v1.ObjectMeta{ Name: TPRName, + //PodNamespace: c.config.PodNamespace, //ThirdPartyResources are cluster-wide }, Versions: []v1beta1extensions.APIVersion{ {Name: constants.TPRApiVersion}, @@ -101,16 +102,16 @@ func (c *Controller) createTPR() error { restClient := c.config.RestClient - return k8sutil.WaitTPRReady(restClient, constants.TPRReadyWaitInterval, constants.TPRReadyWaitTimeout, c.config.Namespace) + return k8sutil.WaitTPRReady(restClient, constants.TPRReadyWaitInterval, constants.TPRReadyWaitTimeout, c.config.PodNamespace) } func (c *Controller) makeClusterConfig() cluster.Config { return cluster.Config{ - Namespace: c.config.Namespace, - KubeClient: c.config.KubeClient, - RestClient: c.config.RestClient, - EtcdClient: c.config.EtcdClient, - TeamsAPIClient: c.config.TeamsAPIClient, + ControllerNamespace: c.config.PodNamespace, + KubeClient: c.config.KubeClient, + RestClient: c.config.RestClient, + EtcdClient: c.config.EtcdClient, + TeamsAPIClient: c.config.TeamsAPIClient, } }