diff --git a/manifests/testpostgresql.yaml b/manifests/testpostgresql.yaml index 319ecdbea..3308d8e58 100644 --- a/manifests/testpostgresql.yaml +++ b/manifests/testpostgresql.yaml @@ -3,13 +3,13 @@ kind: "Postgresql" metadata: name: testcluster - namespace: acid + namespace: default spec: teamId: "50051320" volume: - size: 100Gi - storageClass: gp2 + size: 10Gi + storageClass: standard numberOfInstances: 3 users: #Application/Robot users jdoe: diff --git a/pkg/cluster/cluster.go b/pkg/cluster/cluster.go index beb6ae7da..ad3e1d870 100644 --- a/pkg/cluster/cluster.go +++ b/pkg/cluster/cluster.go @@ -200,10 +200,14 @@ func (c *Cluster) Create() error { func (c *Cluster) Update(newSpec *spec.Postgresql, rollingUpdate bool) error { nSpec := newSpec.Spec + cSpec := c.Spec clusterName := c.ClusterName() + volumeSize := cSpec.Volume.Size + volumeStorageClass := cSpec.Volume.StorageClass resourceList := resources.ResourceList(nSpec.Resources) template := resources.PodTemplate(clusterName, resourceList, c.dockerImage, nSpec.Version, c.etcdHost) - statefulSet := resources.StatefulSet(clusterName, template, nSpec.NumberOfInstances) + volumeClaimTemplate := resources.VolumeClaimTemplate(volumeSize, volumeStorageClass) + statefulSet := resources.StatefulSet(clusterName, template, volumeClaimTemplate, nSpec.NumberOfInstances) //TODO: mind the case of updating allowedSourceRanges err := c.updateStatefulSet(statefulSet) diff --git a/pkg/cluster/resources.go b/pkg/cluster/resources.go index 8e24a1fe8..21dd819f7 100644 --- a/pkg/cluster/resources.go +++ b/pkg/cluster/resources.go @@ -104,10 +104,13 @@ func (c *Cluster) ListResources() error { func (c *Cluster) createStatefulSet() (*v1beta1.StatefulSet, error) { cSpec := c.Spec + volumeSize := cSpec.Volume.Size + volumeStorageClass := cSpec.Volume.StorageClass clusterName := c.ClusterName() resourceList := resources.ResourceList(cSpec.Resources) template := resources.PodTemplate(clusterName, resourceList, c.dockerImage, cSpec.Version, c.etcdHost) - statefulSet := resources.StatefulSet(clusterName, template, cSpec.NumberOfInstances) + volumeClaimTemplate := resources.VolumeClaimTemplate(volumeSize, volumeStorageClass) + statefulSet := resources.StatefulSet(clusterName, template, volumeClaimTemplate, cSpec.NumberOfInstances) statefulSet, err := c.config.KubeClient.StatefulSets(statefulSet.Namespace).Create(statefulSet) if k8sutil.ResourceAlreadyExists(err) { @@ -145,11 +148,11 @@ func (c *Cluster) deleteStatefulSet(statefulSet *v1beta1.StatefulSet) error { } func (c *Cluster) createEndpoint() (*v1.Endpoints, error) { - endpoint := resources.Endpoint(c.ClusterName()) + endpointSpec := resources.Endpoint(c.ClusterName()) - endpoint, err := c.config.KubeClient.Endpoints(endpoint.Namespace).Create(endpoint) + endpoint, err := c.config.KubeClient.Endpoints(endpointSpec.Namespace).Create(endpointSpec) if k8sutil.ResourceAlreadyExists(err) { - return nil, fmt.Errorf("Endpoint '%s' already exists", util.NameFromMeta(endpoint.ObjectMeta)) + return nil, fmt.Errorf("Endpoint '%s' already exists", util.NameFromMeta(endpointSpec.ObjectMeta)) } if err != nil { return nil, err diff --git a/pkg/util/resources/factory.go b/pkg/util/resources/factory.go index eabeffc9c..b1eabbdc3 100644 --- a/pkg/util/resources/factory.go +++ b/pkg/util/resources/factory.go @@ -17,6 +17,7 @@ import ( const ( superuserName = "postgres" replicationUsername = "replication" + dataVolumeName = "pgdata" ) func credentialSecretName(clusterName, username string) string { @@ -147,7 +148,7 @@ bootstrap: }, VolumeMounts: []v1.VolumeMount{ { - Name: "pgdata", + Name: dataVolumeName, MountPath: "/home/postgres/pgdata", //TODO: fetch from manifesto }, }, @@ -158,13 +159,7 @@ bootstrap: podSpec := v1.PodSpec{ ServiceAccountName: constants.ServiceAccountName, TerminationGracePeriodSeconds: &terminateGracePeriodSeconds, - Volumes: []v1.Volume{ - { - Name: "pgdata", - VolumeSource: v1.VolumeSource{EmptyDir: &v1.EmptyDirVolumeSource{}}, - }, - }, - Containers: []v1.Container{container}, + Containers: []v1.Container{container}, } template := v1.PodTemplateSpec{ @@ -179,7 +174,33 @@ bootstrap: return &template } -func StatefulSet(cluster spec.ClusterName, podTemplate *v1.PodTemplateSpec, numberOfInstances int32) *v1beta1.StatefulSet { +func VolumeClaimTemplate(volumeSize, volumeStorageClass string) *v1.PersistentVolumeClaim { + metadata := v1.ObjectMeta{ + Name: dataVolumeName, + } + if volumeStorageClass != "" { + // TODO: check if storage class exists + metadata.Annotations = map[string]string{"volume.beta.kubernetes.io/storage-class": volumeStorageClass} + } else { + metadata.Annotations = map[string]string{"volume.alpha.kubernetes.io/storage-class": "default"} + } + + volumeClaim := &v1.PersistentVolumeClaim{ + ObjectMeta: metadata, + Spec: v1.PersistentVolumeClaimSpec{ + AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce}, + Resources: v1.ResourceRequirements{ + Requests: v1.ResourceList{ + v1.ResourceStorage: resource.MustParse(volumeSize), + }, + }, + }, + } + return volumeClaim +} + +func StatefulSet(cluster spec.ClusterName, podTemplate *v1.PodTemplateSpec, + persistenVolumeClaim *v1.PersistentVolumeClaim, numberOfInstances int32) *v1beta1.StatefulSet { statefulSet := &v1beta1.StatefulSet{ ObjectMeta: v1.ObjectMeta{ Name: cluster.Name, @@ -187,9 +208,10 @@ func StatefulSet(cluster spec.ClusterName, podTemplate *v1.PodTemplateSpec, numb Labels: labelsSet(cluster.Name), }, Spec: v1beta1.StatefulSetSpec{ - Replicas: &numberOfInstances, - ServiceName: cluster.Name, - Template: *podTemplate, + Replicas: &numberOfInstances, + ServiceName: cluster.Name, + Template: *podTemplate, + VolumeClaimTemplates: []v1.PersistentVolumeClaim{*persistenVolumeClaim}, }, }