From 55dbacdfa64f7c9796355700f8e6a5b82acdd8c6 Mon Sep 17 00:00:00 2001 From: Oleksii Kliukin Date: Thu, 9 Mar 2017 17:35:19 +0100 Subject: [PATCH] Assign DNS name to the cluster. DNS name is generated from the team name and cluster name. Use "zalando.org/dnsname" service annotation that makes 'mate' service assign a CNAME to the load balancer name. --- pkg/cluster/cluster.go | 6 +++++- pkg/cluster/resources.go | 2 +- pkg/util/resources/factory.go | 19 ++++++++++++------- pkg/util/util.go | 5 +++++ 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/pkg/cluster/cluster.go b/pkg/cluster/cluster.go index 9601d4a32..2674e6a87 100644 --- a/pkg/cluster/cluster.go +++ b/pkg/cluster/cluster.go @@ -88,6 +88,10 @@ func (c *Cluster) ClusterName() spec.ClusterName { } } +func (c *Cluster) ClusterTeamName() string { + return c.Spec.TeamId +} + func (c *Cluster) Run(stopCh <-chan struct{}) { go c.podEventsDispatcher(stopCh) @@ -199,7 +203,7 @@ func (c *Cluster) Update(newSpec *spec.Postgresql) error { newStatefulSet := getStatefulSet(c.ClusterName(), newSpec.Spec, c.etcdHost, c.dockerImage) - newService := resources.Service(c.ClusterName(), newSpec.Spec.AllowedSourceRanges) + newService := resources.Service(c.ClusterName(), c.ClusterTeamName(), newSpec.Spec.AllowedSourceRanges) if !servicesEqual(newService, c.Service) { c.logger.Infof("Service needs to be upated") if err := c.updateService(newService); err != nil { diff --git a/pkg/cluster/resources.go b/pkg/cluster/resources.go index 7e7e6304a..f724e1461 100644 --- a/pkg/cluster/resources.go +++ b/pkg/cluster/resources.go @@ -148,7 +148,7 @@ func (c *Cluster) createService() (*v1.Service, error) { if c.Service != nil { return nil, fmt.Errorf("Service already exists in the cluster") } - serviceSpec := resources.Service(c.ClusterName(), c.Spec.AllowedSourceRanges) + serviceSpec := resources.Service(c.ClusterName(), c.ClusterTeamName(), c.Spec.AllowedSourceRanges) service, err := c.config.KubeClient.Services(serviceSpec.Namespace).Create(serviceSpec) if k8sutil.ResourceAlreadyExists(err) { diff --git a/pkg/util/resources/factory.go b/pkg/util/resources/factory.go index b9718e13d..df6780b75 100644 --- a/pkg/util/resources/factory.go +++ b/pkg/util/resources/factory.go @@ -11,13 +11,17 @@ import ( "k8s.io/client-go/pkg/util/intstr" "github.bus.zalan.do/acid/postgres-operator/pkg/spec" + "github.bus.zalan.do/acid/postgres-operator/pkg/util" "github.bus.zalan.do/acid/postgres-operator/pkg/util/constants" ) const ( - superuserName = "postgres" - replicationUsername = "replication" - dataVolumeName = "pgdata" + superuserName = "postgres" + replicationUsername = "replication" + dataVolumeName = "pgdata" + zalandoDnsNameAnnotation = "zalando.org/dnsname" + // TODO: move DbHostedZone to operator configuration + DbHostedZone = "db.example.com" ) func credentialSecretName(clusterName, username string) string { @@ -248,12 +252,13 @@ func UserSecrets(cluster spec.ClusterName, pgUsers map[string]spec.PgUser) (secr return } -func Service(cluster spec.ClusterName, allowedSourceRanges []string) *v1.Service { +func Service(cluster spec.ClusterName, teamName string, allowedSourceRanges []string) *v1.Service { service := &v1.Service{ ObjectMeta: v1.ObjectMeta{ - Name: cluster.Name, - Namespace: cluster.Namespace, - Labels: labelsSet(cluster.Name), + Name: cluster.Name, + Namespace: cluster.Namespace, + Labels: labelsSet(cluster.Name), + Annotations: map[string]string{zalandoDnsNameAnnotation: util.ClusterDNSName(cluster.Name, teamName, DbHostedZone)}, }, Spec: v1.ServiceSpec{ Type: v1.ServiceTypeLoadBalancer, diff --git a/pkg/util/util.go b/pkg/util/util.go index 63f5984f4..59dc94882 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -4,6 +4,7 @@ import ( "math/rand" "time" + "fmt" "github.bus.zalan.do/acid/postgres-operator/pkg/spec" "k8s.io/client-go/pkg/api/v1" "k8s.io/client-go/pkg/types" @@ -43,3 +44,7 @@ func PodClusterName(pod *v1.Pod) spec.ClusterName { return spec.ClusterName{} } + +func ClusterDNSName(clusterName, teamName, hostedZone string) string { + return fmt.Sprintf("%s.%s.%s", clusterName, teamName, hostedZone) +}