Use TPR object namespace while creating its objects
This commit is contained in:
parent
9169808133
commit
dfde075c66
10
cmd/main.go
10
cmd/main.go
|
|
@ -16,7 +16,7 @@ import (
|
||||||
|
|
||||||
var (
|
var (
|
||||||
KubeConfigFile string
|
KubeConfigFile string
|
||||||
Namespace string
|
podNamespace string
|
||||||
OutOfCluster bool
|
OutOfCluster bool
|
||||||
version string
|
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.BoolVar(&OutOfCluster, "outofcluster", false, "Whether the operator runs in- our outside of the Kubernetes cluster.")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
Namespace = os.Getenv("MY_POD_NAMESPACE")
|
podNamespace = os.Getenv("MY_POD_NAMESPACE")
|
||||||
if len(Namespace) == 0 {
|
if len(podNamespace) == 0 {
|
||||||
Namespace = "default"
|
podNamespace = "default"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -47,7 +47,7 @@ func ControllerConfig() *controller.Config {
|
||||||
|
|
||||||
teamsApi := teams.NewTeamsAPI(constants.TeamsAPIUrl)
|
teamsApi := teams.NewTeamsAPI(constants.TeamsAPIUrl)
|
||||||
return &controller.Config{
|
return &controller.Config{
|
||||||
Namespace: Namespace,
|
PodNamespace: podNamespace,
|
||||||
KubeClient: client,
|
KubeClient: client,
|
||||||
RestClient: restClient,
|
RestClient: restClient,
|
||||||
TeamsAPIClient: teamsApi,
|
TeamsAPIClient: teamsApi,
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ apiVersion: extensions/v1beta1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: postgres-operator
|
name: postgres-operator
|
||||||
|
namespace: acid
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 1
|
||||||
template:
|
template:
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ kind: "Postgresql"
|
||||||
|
|
||||||
metadata:
|
metadata:
|
||||||
name: testcluster
|
name: testcluster
|
||||||
|
namespace: acid
|
||||||
|
|
||||||
spec:
|
spec:
|
||||||
teamId: "50051320"
|
teamId: "50051320"
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@ var (
|
||||||
|
|
||||||
//TODO: remove struct duplication
|
//TODO: remove struct duplication
|
||||||
type Config struct {
|
type Config struct {
|
||||||
Namespace string
|
ControllerNamespace string
|
||||||
KubeClient *kubernetes.Clientset //TODO: move clients to the better place?
|
KubeClient *kubernetes.Clientset //TODO: move clients to the better place?
|
||||||
RestClient *rest.RESTClient
|
RestClient *rest.RESTClient
|
||||||
EtcdClient etcdclient.KeysAPI
|
EtcdClient etcdclient.KeysAPI
|
||||||
|
|
@ -74,7 +74,8 @@ func New(cfg Config, spec *spec.Postgresql) *Cluster {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Cluster) getReadonlyToken() (string, error) {
|
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 {
|
if err != nil {
|
||||||
return "", fmt.Errorf("Can't get credentials secret: %s", err)
|
return "", fmt.Errorf("Can't get credentials secret: %s", err)
|
||||||
|
|
@ -198,7 +199,7 @@ func (c *Cluster) waitPodDelete() error {
|
||||||
return retryutil.Retry(
|
return retryutil.Retry(
|
||||||
constants.ResourceCheckInterval, int(constants.ResourceCheckTimeout/constants.ResourceCheckInterval),
|
constants.ResourceCheckInterval, int(constants.ResourceCheckTimeout/constants.ResourceCheckInterval),
|
||||||
func() (bool, error) {
|
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 {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
@ -213,7 +214,7 @@ func (c *Cluster) waitStatefulsetReady() error {
|
||||||
listOptions := v1.ListOptions{
|
listOptions := v1.ListOptions{
|
||||||
LabelSelector: c.labelsSet().String(),
|
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 {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
@ -228,6 +229,7 @@ func (c *Cluster) waitStatefulsetReady() error {
|
||||||
|
|
||||||
func (c *Cluster) waitPodLabelsReady() error {
|
func (c *Cluster) waitPodLabelsReady() error {
|
||||||
ls := c.labelsSet()
|
ls := c.labelsSet()
|
||||||
|
namespace := (*c.cluster).Metadata.Namespace
|
||||||
|
|
||||||
listOptions := v1.ListOptions{
|
listOptions := v1.ListOptions{
|
||||||
LabelSelector: ls.String(),
|
LabelSelector: ls.String(),
|
||||||
|
|
@ -238,7 +240,7 @@ func (c *Cluster) waitPodLabelsReady() error {
|
||||||
replicaListOption := v1.ListOptions{
|
replicaListOption := v1.ListOptions{
|
||||||
LabelSelector: labels.Merge(ls, labels.Set{"spilo-role": "replica"}).String(),
|
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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -247,11 +249,11 @@ func (c *Cluster) waitPodLabelsReady() error {
|
||||||
return retryutil.Retry(
|
return retryutil.Retry(
|
||||||
constants.ResourceCheckInterval, int(constants.ResourceCheckTimeout/constants.ResourceCheckInterval),
|
constants.ResourceCheckInterval, int(constants.ResourceCheckTimeout/constants.ResourceCheckInterval),
|
||||||
func() (bool, error) {
|
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 {
|
if err != nil {
|
||||||
return false, err
|
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 {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
@ -305,7 +307,7 @@ func (c *Cluster) waitClusterReady() error {
|
||||||
|
|
||||||
func (c *Cluster) Delete() error {
|
func (c *Cluster) Delete() error {
|
||||||
clusterName := (*c.cluster).Metadata.Name
|
clusterName := (*c.cluster).Metadata.Name
|
||||||
namespace := c.config.Namespace
|
namespace := (*c.cluster).Metadata.Namespace
|
||||||
orphanDependents := false
|
orphanDependents := false
|
||||||
deleteOptions := &v1.DeleteOptions{
|
deleteOptions := &v1.DeleteOptions{
|
||||||
OrphanDependents: &orphanDependents,
|
OrphanDependents: &orphanDependents,
|
||||||
|
|
|
||||||
|
|
@ -22,12 +22,12 @@ END;
|
||||||
$$`
|
$$`
|
||||||
|
|
||||||
func (c *Cluster) createStatefulSet() {
|
func (c *Cluster) createStatefulSet() {
|
||||||
clusterName := (*c.cluster).Metadata.Name
|
meta := (*c.cluster).Metadata
|
||||||
|
|
||||||
envVars := []v1.EnvVar{
|
envVars := []v1.EnvVar{
|
||||||
{
|
{
|
||||||
Name: "SCOPE",
|
Name: "SCOPE",
|
||||||
Value: clusterName,
|
Value: meta.Name,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: "PGROOT",
|
Name: "PGROOT",
|
||||||
|
|
@ -114,7 +114,7 @@ bootstrap:
|
||||||
}
|
}
|
||||||
|
|
||||||
container := v1.Container{
|
container := v1.Container{
|
||||||
Name: clusterName,
|
Name: meta.Name,
|
||||||
Image: c.dockerImage,
|
Image: c.dockerImage,
|
||||||
ImagePullPolicy: v1.PullAlways,
|
ImagePullPolicy: v1.PullAlways,
|
||||||
Resources: v1.ResourceRequirements{
|
Resources: v1.ResourceRequirements{
|
||||||
|
|
@ -155,6 +155,7 @@ bootstrap:
|
||||||
template := v1.PodTemplateSpec{
|
template := v1.PodTemplateSpec{
|
||||||
ObjectMeta: v1.ObjectMeta{
|
ObjectMeta: v1.ObjectMeta{
|
||||||
Labels: c.labelsSet(),
|
Labels: c.labelsSet(),
|
||||||
|
Namespace: meta.Namespace,
|
||||||
Annotations: map[string]string{"pod.alpha.kubernetes.io/initialized": "true"},
|
Annotations: map[string]string{"pod.alpha.kubernetes.io/initialized": "true"},
|
||||||
},
|
},
|
||||||
Spec: podSpec,
|
Spec: podSpec,
|
||||||
|
|
@ -162,17 +163,18 @@ bootstrap:
|
||||||
|
|
||||||
statefulSet := &v1beta1.StatefulSet{
|
statefulSet := &v1beta1.StatefulSet{
|
||||||
ObjectMeta: v1.ObjectMeta{
|
ObjectMeta: v1.ObjectMeta{
|
||||||
Name: clusterName,
|
Name: meta.Name,
|
||||||
|
Namespace: meta.Namespace,
|
||||||
Labels: c.labelsSet(),
|
Labels: c.labelsSet(),
|
||||||
},
|
},
|
||||||
Spec: v1beta1.StatefulSetSpec{
|
Spec: v1beta1.StatefulSetSpec{
|
||||||
Replicas: &c.cluster.Spec.NumberOfInstances,
|
Replicas: &c.cluster.Spec.NumberOfInstances,
|
||||||
ServiceName: clusterName,
|
ServiceName: meta.Name,
|
||||||
Template: template,
|
Template: template,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err := c.config.KubeClient.StatefulSets(c.config.Namespace).Create(statefulSet)
|
_, err := c.config.KubeClient.StatefulSets(meta.Namespace).Create(statefulSet)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.logger.Errorf("Can't create statefulset: %s", err)
|
c.logger.Errorf("Can't create statefulset: %s", err)
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -182,6 +184,7 @@ bootstrap:
|
||||||
|
|
||||||
func (c *Cluster) applySecrets() {
|
func (c *Cluster) applySecrets() {
|
||||||
var err error
|
var err error
|
||||||
|
namespace := (*c.cluster).Metadata.Namespace
|
||||||
for username, pgUser := range c.pgUsers {
|
for username, pgUser := range c.pgUsers {
|
||||||
//Skip users with no password i.e. human users (they'll be authenticated using pam)
|
//Skip users with no password i.e. human users (they'll be authenticated using pam)
|
||||||
if pgUser.password == "" {
|
if pgUser.password == "" {
|
||||||
|
|
@ -190,6 +193,7 @@ func (c *Cluster) applySecrets() {
|
||||||
secret := v1.Secret{
|
secret := v1.Secret{
|
||||||
ObjectMeta: v1.ObjectMeta{
|
ObjectMeta: v1.ObjectMeta{
|
||||||
Name: c.credentialSecretName(username),
|
Name: c.credentialSecretName(username),
|
||||||
|
Namespace: namespace,
|
||||||
Labels: c.labelsSet(),
|
Labels: c.labelsSet(),
|
||||||
},
|
},
|
||||||
Type: v1.SecretTypeOpaque,
|
Type: v1.SecretTypeOpaque,
|
||||||
|
|
@ -198,11 +202,11 @@ func (c *Cluster) applySecrets() {
|
||||||
"password": []byte(pgUser.password),
|
"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) {
|
if k8sutil.IsKubernetesResourceAlreadyExistError(err) {
|
||||||
c.logger.Infof("Skipping update of '%s'", secret.Name)
|
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 {
|
if err != nil {
|
||||||
c.logger.Errorf("Can't get current secret: %s", err)
|
c.logger.Errorf("Can't get current secret: %s", err)
|
||||||
}
|
}
|
||||||
|
|
@ -223,17 +227,18 @@ func (c *Cluster) applySecrets() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Cluster) createService() {
|
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) {
|
if !k8sutil.ResourceNotFound(err) {
|
||||||
c.logger.Infof("Service '%s' already exists", clusterName)
|
c.logger.Infof("Service '%s' already exists", meta.Name)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
service := v1.Service{
|
service := v1.Service{
|
||||||
ObjectMeta: v1.ObjectMeta{
|
ObjectMeta: v1.ObjectMeta{
|
||||||
Name: clusterName,
|
Name: meta.Name,
|
||||||
|
Namespace: meta.Namespace,
|
||||||
Labels: c.labelsSet(),
|
Labels: c.labelsSet(),
|
||||||
},
|
},
|
||||||
Spec: v1.ServiceSpec{
|
Spec: v1.ServiceSpec{
|
||||||
|
|
@ -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 {
|
if err != nil {
|
||||||
c.logger.Errorf("Error while creating service: %+v", err)
|
c.logger.Errorf("Error while creating service: %+v", err)
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -252,22 +257,23 @@ func (c *Cluster) createService() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Cluster) createEndpoint() {
|
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) {
|
if !k8sutil.ResourceNotFound(err) {
|
||||||
c.logger.Infof("Endpoint '%s' already exists", clusterName)
|
c.logger.Infof("Endpoint '%s' already exists", meta.Name)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
endpoint := v1.Endpoints{
|
endpoint := v1.Endpoints{
|
||||||
ObjectMeta: v1.ObjectMeta{
|
ObjectMeta: v1.ObjectMeta{
|
||||||
Name: clusterName,
|
Name: meta.Name,
|
||||||
|
Namespace: meta.Namespace,
|
||||||
Labels: c.labelsSet(),
|
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 {
|
if err != nil {
|
||||||
c.logger.Errorf("Error while creating endpoint: %+v", err)
|
c.logger.Errorf("Error while creating endpoint: %+v", err)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
Namespace string
|
PodNamespace string
|
||||||
KubeClient *kubernetes.Clientset
|
KubeClient *kubernetes.Clientset
|
||||||
RestClient *rest.RESTClient
|
RestClient *rest.RESTClient
|
||||||
EtcdClient etcdclient.KeysAPI
|
EtcdClient etcdclient.KeysAPI
|
||||||
|
|
@ -81,6 +81,7 @@ func (c *Controller) createTPR() error {
|
||||||
tpr := &v1beta1extensions.ThirdPartyResource{
|
tpr := &v1beta1extensions.ThirdPartyResource{
|
||||||
ObjectMeta: v1.ObjectMeta{
|
ObjectMeta: v1.ObjectMeta{
|
||||||
Name: TPRName,
|
Name: TPRName,
|
||||||
|
//PodNamespace: c.config.PodNamespace, //ThirdPartyResources are cluster-wide
|
||||||
},
|
},
|
||||||
Versions: []v1beta1extensions.APIVersion{
|
Versions: []v1beta1extensions.APIVersion{
|
||||||
{Name: constants.TPRApiVersion},
|
{Name: constants.TPRApiVersion},
|
||||||
|
|
@ -101,12 +102,12 @@ func (c *Controller) createTPR() error {
|
||||||
|
|
||||||
restClient := c.config.RestClient
|
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 {
|
func (c *Controller) makeClusterConfig() cluster.Config {
|
||||||
return cluster.Config{
|
return cluster.Config{
|
||||||
Namespace: c.config.Namespace,
|
ControllerNamespace: c.config.PodNamespace,
|
||||||
KubeClient: c.config.KubeClient,
|
KubeClient: c.config.KubeClient,
|
||||||
RestClient: c.config.RestClient,
|
RestClient: c.config.RestClient,
|
||||||
EtcdClient: c.config.EtcdClient,
|
EtcdClient: c.config.EtcdClient,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue