fetch cluster resources by name, not by label selectors

This commit is contained in:
Murat Kabilov 2017-09-04 18:03:54 +02:00 committed by GitHub
parent 57c3111d1a
commit 39c123e96a
2 changed files with 61 additions and 57 deletions

View File

@ -46,6 +46,27 @@ type spiloConfiguration struct {
Bootstrap pgBootstrap `json:"bootstrap"`
}
func (c *Cluster) containerName() string {
return c.Name
}
func (c *Cluster) statefulSetName() string {
return c.Name
}
func (c *Cluster) endpointName() string {
return c.Name
}
func (c *Cluster) serviceName(role postgresRole) string {
name := c.Name
if role == replica {
name = name + "-repl"
}
return name
}
func (c *Cluster) resourceRequirements(resources spec.Resources) (*v1.ResourceRequirements, error) {
var err error
@ -274,7 +295,7 @@ func (c *Cluster) generatePodTemplate(resourceRequirements *v1.ResourceRequireme
}
privilegedMode := bool(true)
container := v1.Container{
Name: c.Name,
Name: c.containerName(),
Image: c.OpConfig.DockerImage,
ImagePullPolicy: v1.PullAlways,
Resources: *resourceRequirements,
@ -314,7 +335,7 @@ func (c *Cluster) generatePodTemplate(resourceRequirements *v1.ResourceRequireme
template := v1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Labels: c.labelsSet(),
Namespace: c.Name,
Namespace: c.Namespace,
},
Spec: podSpec,
}
@ -339,13 +360,13 @@ func (c *Cluster) generateStatefulSet(spec spec.PostgresSpec) (*v1beta1.Stateful
statefulSet := &v1beta1.StatefulSet{
ObjectMeta: metav1.ObjectMeta{
Name: c.Name,
Name: c.statefulSetName(),
Namespace: c.Namespace,
Labels: c.labelsSet(),
},
Spec: v1beta1.StatefulSetSpec{
Replicas: &spec.NumberOfInstances,
ServiceName: c.Name,
ServiceName: c.serviceName(master),
Template: *podTemplate,
VolumeClaimTemplates: []v1.PersistentVolumeClaim{*volumeClaimTemplate},
},
@ -428,12 +449,12 @@ func (c *Cluster) generateSingleUserSecret(namespace string, pgUser spec.PgUser)
}
func (c *Cluster) generateService(role postgresRole, newSpec *spec.PostgresSpec) *v1.Service {
var dnsName string
dnsNameFunction := c.masterDNSName
name := c.Name
if role == replica {
dnsNameFunction = c.replicaDNSName
name = name + "-repl"
if role == master {
dnsName = c.masterDNSName()
} else {
dnsName = c.replicaDNSName()
}
serviceSpec := v1.ServiceSpec{
@ -462,15 +483,14 @@ func (c *Cluster) generateService(role postgresRole, newSpec *spec.PostgresSpec)
serviceSpec.LoadBalancerSourceRanges = sourceRanges
annotations = map[string]string{
constants.ZalandoDNSNameAnnotation: dnsNameFunction(),
constants.ZalandoDNSNameAnnotation: dnsName,
constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue,
}
}
service := &v1.Service{
ObjectMeta: metav1.ObjectMeta{
Name: name,
Name: c.serviceName(role),
Namespace: c.Namespace,
Labels: c.roleLabelsSet(role),
Annotations: annotations,
@ -484,7 +504,7 @@ func (c *Cluster) generateService(role postgresRole, newSpec *spec.PostgresSpec)
func (c *Cluster) generateMasterEndpoints(subsets []v1.EndpointSubset) *v1.Endpoints {
endpoints := &v1.Endpoints{
ObjectMeta: metav1.ObjectMeta{
Name: c.Name,
Name: c.endpointName(),
Namespace: c.Namespace,
Labels: c.roleLabelsSet(master),
},

View File

@ -16,45 +16,33 @@ import (
)
func (c *Cluster) loadResources() error {
var err error
ns := c.Namespace
listOptions := metav1.ListOptions{
LabelSelector: c.labelsSet().String(),
masterService, err := c.KubeClient.Services(ns).Get(c.serviceName(master), metav1.GetOptions{})
if err == nil {
c.Services[master] = masterService
} else if !k8sutil.ResourceNotFound(err) {
c.logger.Errorf("could not get master service: %v", err)
}
services, err := c.KubeClient.Services(ns).List(listOptions)
replicaService, err := c.KubeClient.Services(ns).Get(c.serviceName(replica), metav1.GetOptions{})
if err == nil {
c.Services[replica] = replicaService
} else if !k8sutil.ResourceNotFound(err) {
c.logger.Errorf("could not get replica service: %v", err)
}
ep, err := c.KubeClient.Endpoints(ns).Get(c.endpointName(), metav1.GetOptions{})
if err == nil {
c.Endpoint = ep
} else if !k8sutil.ResourceNotFound(err) {
c.logger.Errorf("could not get endpoint: %v", err)
}
secrets, err := c.KubeClient.Secrets(ns).List(metav1.ListOptions{LabelSelector: c.labelsSet().String()})
if err != nil {
return fmt.Errorf("could not get list of services: %v", err)
}
if len(services.Items) > 2 {
return fmt.Errorf("too many(%d) services for a cluster", len(services.Items))
}
for i, svc := range services.Items {
switch postgresRole(svc.Labels[c.OpConfig.PodRoleLabel]) {
case replica:
c.Services[replica] = &services.Items[i]
default:
c.Services[master] = &services.Items[i]
}
}
endpoints, err := c.KubeClient.Endpoints(ns).List(listOptions)
if err != nil {
return fmt.Errorf("could not get list of endpoints: %v", err)
}
if len(endpoints.Items) > 2 {
return fmt.Errorf("too many(%d) endpoints for a cluster", len(endpoints.Items))
}
for i, ep := range endpoints.Items {
if ep.Labels[c.OpConfig.PodRoleLabel] != string(replica) {
c.Endpoint = &endpoints.Items[i]
break
}
}
secrets, err := c.KubeClient.Secrets(ns).List(listOptions)
if err != nil {
return fmt.Errorf("could not get list of secrets: %v", err)
c.logger.Errorf("could not get list of secrets: %v", err)
}
for i, secret := range secrets.Items {
if _, ok := c.Secrets[secret.UID]; ok {
@ -64,15 +52,11 @@ func (c *Cluster) loadResources() error {
c.logger.Debugf("secret loaded, uid: %q", secret.UID)
}
statefulSets, err := c.KubeClient.StatefulSets(ns).List(listOptions)
if err != nil {
return fmt.Errorf("could not get list of statefulsets: %v", err)
}
if len(statefulSets.Items) > 1 {
return fmt.Errorf("too many(%d) statefulsets for a cluster", len(statefulSets.Items))
}
if len(statefulSets.Items) == 1 {
c.Statefulset = &statefulSets.Items[0]
ss, err := c.KubeClient.StatefulSets(ns).Get(c.statefulSetName(), metav1.GetOptions{})
if err == nil {
c.Statefulset = ss
} else if !k8sutil.ResourceNotFound(err) {
c.logger.Errorf("could not get statefulset: %v", err)
}
return nil