Extact pod and pvc creation.
This commit is contained in:
parent
ec5e1f5ebb
commit
e56a522651
|
|
@ -235,6 +235,24 @@ Then you can for example check the Patroni logs:
|
||||||
kubectl logs acid-minimal-cluster-0
|
kubectl logs acid-minimal-cluster-0
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Unit tests with Mocks and K8s Fake API
|
||||||
|
|
||||||
|
When ever possible you should rely on leveraging proper mocks and K8s fake client that allows full fledged testing of K8s objects in your unit tests.
|
||||||
|
|
||||||
|
To enable mocks, a code annotation is needed:
|
||||||
|
[Mock code gen annotation](https://github.com/zalando/postgres-operator/blob/master/pkg/util/volumes/volumes.go#L3)
|
||||||
|
|
||||||
|
To generate mocks run:
|
||||||
|
```bash
|
||||||
|
make mocks
|
||||||
|
```
|
||||||
|
|
||||||
|
Examples for mocks can be found in:
|
||||||
|
[Example mock usage](https://github.com/zalando/postgres-operator/blob/master/pkg/cluster/volumes_test.go#L248)
|
||||||
|
|
||||||
|
Examples for fake K8s objects can be found in:
|
||||||
|
[Example fake K8s client usage](https://github.com/zalando/postgres-operator/blob/master/pkg/cluster/volumes_test.go#L166)
|
||||||
|
|
||||||
## End-to-end tests
|
## End-to-end tests
|
||||||
|
|
||||||
The operator provides reference end-to-end (e2e) tests to
|
The operator provides reference end-to-end (e2e) tests to
|
||||||
|
|
|
||||||
|
|
@ -264,6 +264,63 @@ func TestMigrateEBS(t *testing.T) {
|
||||||
cluster.executeEBSMigration()
|
cluster.executeEBSMigration()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type testVolume struct {
|
||||||
|
iops int64
|
||||||
|
throughtput int64
|
||||||
|
size int64
|
||||||
|
volType string
|
||||||
|
}
|
||||||
|
|
||||||
|
func initTestVolumesAndPods(client k8sutil.KubernetesClient, namespace, clustername string, labels labels.Set, volumes []testVolume) {
|
||||||
|
i := 0
|
||||||
|
for _, v := range volumes {
|
||||||
|
storage1Gi, _ := resource.ParseQuantity(fmt.Sprintf("%d", v.size))
|
||||||
|
|
||||||
|
ps := v1.PersistentVolumeSpec{}
|
||||||
|
ps.AWSElasticBlockStore = &v1.AWSElasticBlockStoreVolumeSource{}
|
||||||
|
ps.AWSElasticBlockStore.VolumeID = fmt.Sprintf("aws://eu-central-1b/ebs-volume-%d", i+1)
|
||||||
|
|
||||||
|
pv := v1.PersistentVolume{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: fmt.Sprintf("persistent-volume-%d", i),
|
||||||
|
},
|
||||||
|
Spec: ps,
|
||||||
|
}
|
||||||
|
|
||||||
|
client.PersistentVolumes().Create(context.TODO(), &pv, metav1.CreateOptions{})
|
||||||
|
|
||||||
|
pvc := v1.PersistentVolumeClaim{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: fmt.Sprintf("%s-%s-%d", constants.DataVolumeName, clustername, i),
|
||||||
|
Namespace: namespace,
|
||||||
|
Labels: labels,
|
||||||
|
},
|
||||||
|
Spec: v1.PersistentVolumeClaimSpec{
|
||||||
|
Resources: v1.ResourceRequirements{
|
||||||
|
Requests: v1.ResourceList{
|
||||||
|
v1.ResourceStorage: storage1Gi,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
VolumeName: fmt.Sprintf("persistent-volume-%d", i),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
client.PersistentVolumeClaims(namespace).Create(context.TODO(), &pvc, metav1.CreateOptions{})
|
||||||
|
|
||||||
|
pod := v1.Pod{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: fmt.Sprintf("%s-%d", clustername, i),
|
||||||
|
Labels: labels,
|
||||||
|
},
|
||||||
|
Spec: v1.PodSpec{},
|
||||||
|
}
|
||||||
|
|
||||||
|
client.Pods(namespace).Create(context.TODO(), &pod, metav1.CreateOptions{})
|
||||||
|
|
||||||
|
i = i + 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestMigrateGp3Support(t *testing.T) {
|
func TestMigrateGp3Support(t *testing.T) {
|
||||||
client, _ := newFakeK8sPVCclient()
|
client, _ := newFakeK8sPVCclient()
|
||||||
clusterName := "acid-test-cluster"
|
clusterName := "acid-test-cluster"
|
||||||
|
|
@ -282,6 +339,7 @@ func TestMigrateGp3Support(t *testing.T) {
|
||||||
EnableEBSGp3MigrationMaxSize: 1000,
|
EnableEBSGp3MigrationMaxSize: 1000,
|
||||||
},
|
},
|
||||||
}, client, acidv1.Postgresql{}, logger, eventRecorder)
|
}, client, acidv1.Postgresql{}, logger, eventRecorder)
|
||||||
|
|
||||||
cluster.Spec.Volume.Size = "150Gi"
|
cluster.Spec.Volume.Size = "150Gi"
|
||||||
cluster.Spec.Volume.Iops = aws.Int64(6000)
|
cluster.Spec.Volume.Iops = aws.Int64(6000)
|
||||||
cluster.Spec.Volume.Throughput = aws.Int64(275)
|
cluster.Spec.Volume.Throughput = aws.Int64(275)
|
||||||
|
|
@ -291,80 +349,19 @@ func TestMigrateGp3Support(t *testing.T) {
|
||||||
cluster.Namespace = namespace
|
cluster.Namespace = namespace
|
||||||
filterLabels := cluster.labelsSet(false)
|
filterLabels := cluster.labelsSet(false)
|
||||||
|
|
||||||
pvcList := CreatePVCs(namespace, clusterName, filterLabels, 3, "100Gi")
|
testVolumes := []testVolume{
|
||||||
|
{
|
||||||
ps := v1.PersistentVolumeSpec{}
|
size: 100,
|
||||||
ps.AWSElasticBlockStore = &v1.AWSElasticBlockStoreVolumeSource{}
|
},
|
||||||
ps.AWSElasticBlockStore.VolumeID = "aws://eu-central-1b/ebs-volume-1"
|
{
|
||||||
|
size: 100,
|
||||||
ps2 := v1.PersistentVolumeSpec{}
|
},
|
||||||
ps2.AWSElasticBlockStore = &v1.AWSElasticBlockStoreVolumeSource{}
|
{
|
||||||
ps2.AWSElasticBlockStore.VolumeID = "aws://eu-central-1b/ebs-volume-2"
|
size: 100,
|
||||||
|
|
||||||
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-2",
|
|
||||||
},
|
|
||||||
Spec: ps3,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, pvc := range pvcList.Items {
|
initTestVolumesAndPods(cluster.KubeClient, namespace, clusterName, filterLabels, testVolumes)
|
||||||
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{})
|
|
||||||
|
|
||||||
pod = v1.Pod{
|
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
|
||||||
Name: clusterName + "-2",
|
|
||||||
Labels: filterLabels,
|
|
||||||
},
|
|
||||||
Spec: v1.PodSpec{},
|
|
||||||
}
|
|
||||||
|
|
||||||
cluster.KubeClient.Pods(namespace).Create(context.TODO(), &pod, metav1.CreateOptions{})
|
|
||||||
|
|
||||||
ctrl := gomock.NewController(t)
|
ctrl := gomock.NewController(t)
|
||||||
defer ctrl.Finish()
|
defer ctrl.Finish()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue