Lets see if test works.
This commit is contained in:
		
							parent
							
								
									35e0e5fc19
								
							
						
					
					
						commit
						1a528a486b
					
				| 
						 | 
					@ -16,6 +16,7 @@ import (
 | 
				
			||||||
	"github.com/zalando/postgres-operator/pkg/util"
 | 
						"github.com/zalando/postgres-operator/pkg/util"
 | 
				
			||||||
	"github.com/zalando/postgres-operator/pkg/util/constants"
 | 
						"github.com/zalando/postgres-operator/pkg/util/constants"
 | 
				
			||||||
	"github.com/zalando/postgres-operator/pkg/util/filesystems"
 | 
						"github.com/zalando/postgres-operator/pkg/util/filesystems"
 | 
				
			||||||
 | 
						"github.com/zalando/postgres-operator/pkg/util/volumes"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (c *Cluster) syncVolumes() error {
 | 
					func (c *Cluster) syncVolumes() error {
 | 
				
			||||||
| 
						 | 
					@ -30,7 +31,16 @@ func (c *Cluster) syncVolumes() error {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if c.OpConfig.StorageResizeMode == "mixed" {
 | 
						if c.OpConfig.StorageResizeMode == "mixed" {
 | 
				
			||||||
		// mixed op uses AWS API to adjust size,throughput,iops and calls pvc chance for file system resize
 | 
							// mixed op uses AWS API to adjust size,throughput,iops and calls pvc chance for file system resize
 | 
				
			||||||
 | 
							// in case of errors we proceed to let K8s do its work, favoring disk space increase of other adjustments
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							err = c.populateVolumeMetaData()
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		err = c.syncUnderlyingEBSVolume()
 | 
							err = c.syncUnderlyingEBSVolume()
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// resize pvc to adjust filesystem size until better K8s support
 | 
							// resize pvc to adjust filesystem size until better K8s support
 | 
				
			||||||
		if err = c.syncVolumeClaims(); err != nil {
 | 
							if err = c.syncVolumeClaims(); err != nil {
 | 
				
			||||||
| 
						 | 
					@ -129,8 +139,6 @@ func (c *Cluster) syncUnderlyingEBSVolume() error {
 | 
				
			||||||
func (c *Cluster) populateVolumeMetaData() error {
 | 
					func (c *Cluster) populateVolumeMetaData() error {
 | 
				
			||||||
	c.logger.Infof("starting reading ebs meta data")
 | 
						c.logger.Infof("starting reading ebs meta data")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// TODO check if all known volumes match expectation, then no API call neeeded
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	pvs, err := c.listPersistentVolumes()
 | 
						pvs, err := c.listPersistentVolumes()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return fmt.Errorf("could not list persistent volumes: %v", err)
 | 
							return fmt.Errorf("could not list persistent volumes: %v", err)
 | 
				
			||||||
| 
						 | 
					@ -153,6 +161,12 @@ func (c *Cluster) populateVolumeMetaData() error {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(awsVolumes) != len(c.EBSVolumes) {
 | 
				
			||||||
 | 
							c.logger.Debugf("number of ebs volumes (%d) differs from known volumes (%d)", len(awsVolumes), len(c.EBSVolumes))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// reset map, operator is not responsible for dangling ebs volumes
 | 
				
			||||||
 | 
						c.EBSVolumes = make(map[string]volumes.VolumeProperties)
 | 
				
			||||||
	for _, volume := range awsVolumes {
 | 
						for _, volume := range awsVolumes {
 | 
				
			||||||
		c.EBSVolumes[volume.VolumeID] = volume
 | 
							c.EBSVolumes[volume.VolumeID] = volume
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -263,3 +263,119 @@ func TestMigrateEBS(t *testing.T) {
 | 
				
			||||||
	cluster.VolumeResizer = resizer
 | 
						cluster.VolumeResizer = resizer
 | 
				
			||||||
	cluster.executeEBSMigration()
 | 
						cluster.executeEBSMigration()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestMigrateGp3Support(t *testing.T) {
 | 
				
			||||||
 | 
						client, _ := newFakeK8sPVCclient()
 | 
				
			||||||
 | 
						clusterName := "acid-test-cluster"
 | 
				
			||||||
 | 
						namespace := "default"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// new cluster with pvc storage resize mode and configured labels
 | 
				
			||||||
 | 
						var cluster = New(
 | 
				
			||||||
 | 
							Config{
 | 
				
			||||||
 | 
								OpConfig: config.Config{
 | 
				
			||||||
 | 
									Resources: config.Resources{
 | 
				
			||||||
 | 
										ClusterLabels:    map[string]string{"application": "spilo"},
 | 
				
			||||||
 | 
										ClusterNameLabel: "cluster-name",
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									StorageResizeMode:            "mixed",
 | 
				
			||||||
 | 
									EnableEBSGp3Migration:        false,
 | 
				
			||||||
 | 
									EnableEBSGp3MigrationMaxSize: 1000,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							}, client, acidv1.Postgresql{}, logger, eventRecorder)
 | 
				
			||||||
 | 
						cluster.Spec.Volume.Size = "150Gi"
 | 
				
			||||||
 | 
						cluster.Spec.Volume.Iops = aws.Int64(6000)
 | 
				
			||||||
 | 
						cluster.Spec.Volume.Throughput = aws.Int64(275)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// set metadata, so that labels will get correct values
 | 
				
			||||||
 | 
						cluster.Name = clusterName
 | 
				
			||||||
 | 
						cluster.Namespace = namespace
 | 
				
			||||||
 | 
						filterLabels := cluster.labelsSet(false)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pvcList := CreatePVCs(namespace, clusterName, filterLabels, 2, "100Gi")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ps := v1.PersistentVolumeSpec{}
 | 
				
			||||||
 | 
						ps.AWSElasticBlockStore = &v1.AWSElasticBlockStoreVolumeSource{}
 | 
				
			||||||
 | 
						ps.AWSElasticBlockStore.VolumeID = "aws://eu-central-1b/ebs-volume-1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ps2 := v1.PersistentVolumeSpec{}
 | 
				
			||||||
 | 
						ps2.AWSElasticBlockStore = &v1.AWSElasticBlockStoreVolumeSource{}
 | 
				
			||||||
 | 
						ps2.AWSElasticBlockStore.VolumeID = "aws://eu-central-1b/ebs-volume-2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ps3 := v1.PersistentVolumeSpec{}
 | 
				
			||||||
 | 
						ps3.AWSElasticBlockStore = &v1.AWSElasticBlockStoreVolumeSource{}
 | 
				
			||||||
 | 
						ps3.AWSElasticBlockStore.VolumeID = "aws://eu-central-1b/ebs-volume-3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pvList := &v1.PersistentVolumeList{
 | 
				
			||||||
 | 
							Items: []v1.PersistentVolume{
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									ObjectMeta: metav1.ObjectMeta{
 | 
				
			||||||
 | 
										Name: "persistent-volume-0",
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									Spec: ps,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									ObjectMeta: metav1.ObjectMeta{
 | 
				
			||||||
 | 
										Name: "persistent-volume-1",
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									Spec: ps2,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									ObjectMeta: metav1.ObjectMeta{
 | 
				
			||||||
 | 
										Name: "persistent-volume-3",
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									Spec: ps3,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, pvc := range pvcList.Items {
 | 
				
			||||||
 | 
							cluster.KubeClient.PersistentVolumeClaims(namespace).Create(context.TODO(), &pvc, metav1.CreateOptions{})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, pv := range pvList.Items {
 | 
				
			||||||
 | 
							cluster.KubeClient.PersistentVolumes().Create(context.TODO(), &pv, metav1.CreateOptions{})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pod := v1.Pod{
 | 
				
			||||||
 | 
							ObjectMeta: metav1.ObjectMeta{
 | 
				
			||||||
 | 
								Name:   clusterName + "-0",
 | 
				
			||||||
 | 
								Labels: filterLabels,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							Spec: v1.PodSpec{},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cluster.KubeClient.Pods(namespace).Create(context.TODO(), &pod, metav1.CreateOptions{})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pod = v1.Pod{
 | 
				
			||||||
 | 
							ObjectMeta: metav1.ObjectMeta{
 | 
				
			||||||
 | 
								Name:   clusterName + "-1",
 | 
				
			||||||
 | 
								Labels: filterLabels,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							Spec: v1.PodSpec{},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cluster.KubeClient.Pods(namespace).Create(context.TODO(), &pod, metav1.CreateOptions{})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ctrl := gomock.NewController(t)
 | 
				
			||||||
 | 
						defer ctrl.Finish()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						resizer := mocks.NewMockVolumeResizer(ctrl)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						resizer.EXPECT().ExtractVolumeID(gomock.Eq("aws://eu-central-1b/ebs-volume-1")).Return("ebs-volume-1", nil)
 | 
				
			||||||
 | 
						resizer.EXPECT().ExtractVolumeID(gomock.Eq("aws://eu-central-1b/ebs-volume-2")).Return("ebs-volume-2", nil)
 | 
				
			||||||
 | 
						resizer.EXPECT().ExtractVolumeID(gomock.Eq("aws://eu-central-1b/ebs-volume-3")).Return("ebs-volume-3", nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						resizer.EXPECT().DescribeVolumes(gomock.Eq([]string{"ebs-volume-1", "ebs-volume-2"})).Return(
 | 
				
			||||||
 | 
							[]volumes.VolumeProperties{
 | 
				
			||||||
 | 
								{VolumeID: "ebs-volume-1", VolumeType: "gp3", Size: 100, Iops: 3000},
 | 
				
			||||||
 | 
								{VolumeID: "ebs-volume-2", VolumeType: "gp3", Size: 105, Iops: 4000},
 | 
				
			||||||
 | 
								{VolumeID: "ebs-volume-2", VolumeType: "gp3", Size: 150, Iops: 6000, Throughput: 275}}, nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// expect only gp2 volume to be modified
 | 
				
			||||||
 | 
						resizer.EXPECT().ModifyVolume(gomock.Eq("ebs-volume-1"), gomock.Eq(aws.String("gp3")), gomock.Eq(aws.Int64(150)), gomock.Eq(aws.Int64(6000)), gomock.Eq(aws.Int64(275))).Return(nil)
 | 
				
			||||||
 | 
						resizer.EXPECT().ModifyVolume(gomock.Eq("ebs-volume-2"), gomock.Eq(aws.String("gp3")), gomock.Eq(aws.Int64(150)), gomock.Eq(aws.Int64(6000)), gomock.Eq(aws.Int64(275))).Return(nil)
 | 
				
			||||||
 | 
						// resizer.EXPECT().ModifyVolume(gomock.Eq("ebs-volume-3"), gomock.Eq(aws.String("gp3")), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cluster.VolumeResizer = resizer
 | 
				
			||||||
 | 
						cluster.syncVolumes()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue