Skip to content

Commit 23dae59

Browse files
katyannaMartin Linkhorst
andauthored
Add e2e tests for ConfigMap feature (#558)
* wip - ensure e2e tests for configmap versioning Signed-off-by: Katyanna Moura <[email protected]> * Enable ConfigMap support on e2e tests * enable versioned configmaps during e2e tests * pass testing variable to stackset factory to make assertions * add e2e tests for preventing traffic switch when configmap is missing --------- Signed-off-by: Katyanna Moura <[email protected]> Co-authored-by: Martin Linkhorst <[email protected]>
1 parent 1315add commit 23dae59

13 files changed

+209
-42
lines changed

cmd/e2e/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ watch -n 10 "kubectl get -n foo stackset,stack,ing,ep,deployment"
3232
kubectl delete namespace foo; kubectl create namespace foo
3333
make
3434
./build/stackset-controller --apiserver=http://127.0.0.1:8001 \
35-
--enable-routegroup-support --controller-id=foo \
35+
--enable-configmap-support --enable-routegroup-support --controller-id=foo \
3636
--cluster-domain=${CLUSTER_DOMAIN} --cluster-domain=${CLUSTER_DOMAIN_INTERNAL}
3737
```
3838
4. rebuild e2e test and run e2e tests in `foo` namespace

cmd/e2e/basic_test.go

Lines changed: 81 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package main
22

33
import (
4+
"context"
45
"fmt"
56
"slices"
67
"sort"
78
"strings"
89
"testing"
910

11+
"github.com/stretchr/testify/assert"
1012
"github.com/stretchr/testify/require"
1113
rgv1 "github.com/szuecs/routegroup-client/apis/zalando.org/v1"
1214
"github.com/zalando-incubator/stackset-controller/controller"
@@ -16,6 +18,7 @@ import (
1618
autoscalingv2 "k8s.io/api/autoscaling/v2"
1719
corev1 "k8s.io/api/core/v1"
1820
v1 "k8s.io/api/networking/v1"
21+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1922
"k8s.io/apimachinery/pkg/util/intstr"
2023
)
2124

@@ -35,6 +38,7 @@ type TestStacksetSpecFactory struct {
3538
ingress bool
3639
routegroup bool
3740
externalIngress bool
41+
configMap bool
3842
limit int32
3943
scaleDownTTL int64
4044
replicas int32
@@ -51,6 +55,7 @@ type TestStacksetSpecFactory struct {
5155
func NewTestStacksetSpecFactory(stacksetName string) *TestStacksetSpecFactory {
5256
return &TestStacksetSpecFactory{
5357
stacksetName: stacksetName,
58+
configMap: false,
5459
ingress: false,
5560
externalIngress: false,
5661
limit: 4,
@@ -62,6 +67,11 @@ func NewTestStacksetSpecFactory(stacksetName string) *TestStacksetSpecFactory {
6267
}
6368
}
6469

70+
func (f *TestStacksetSpecFactory) ConfigMap() *TestStacksetSpecFactory {
71+
f.configMap = true
72+
return f
73+
}
74+
6575
func (f *TestStacksetSpecFactory) Behavior(stabilizationWindowSeconds int32) *TestStacksetSpecFactory {
6676
f.hpaBehavior = true
6777
f.hpaStabilizationWindowSeconds = stabilizationWindowSeconds
@@ -103,7 +113,7 @@ func (f *TestStacksetSpecFactory) SubResourceAnnotations(annotations map[string]
103113
return f
104114
}
105115

106-
func (f *TestStacksetSpecFactory) Create(stackVersion string) zv1.StackSetSpec {
116+
func (f *TestStacksetSpecFactory) Create(t *testing.T, stackVersion string) zv1.StackSetSpec {
107117
var result = zv1.StackSetSpec{
108118
StackLifecycle: zv1.StackLifecycle{
109119
Limit: pint32(f.limit),
@@ -134,6 +144,42 @@ func (f *TestStacksetSpecFactory) Create(stackVersion string) zv1.StackSetSpec {
134144
},
135145
}
136146

147+
if f.configMap {
148+
configMapName := fmt.Sprintf("%s-%s-configmap", f.stacksetName, stackVersion)
149+
configMap := &corev1.ConfigMap{
150+
ObjectMeta: metav1.ObjectMeta{
151+
Name: configMapName,
152+
},
153+
Data: map[string]string{
154+
"key": "value",
155+
},
156+
}
157+
158+
_, err := configMapInterface().Create(context.Background(), configMap, metav1.CreateOptions{})
159+
require.NoError(t, err)
160+
161+
result.StackTemplate.Spec.ConfigurationResources = []zv1.ConfigurationResourcesSpec{
162+
{
163+
ConfigMapRef: corev1.LocalObjectReference{
164+
Name: configMapName,
165+
},
166+
},
167+
}
168+
169+
result.StackTemplate.Spec.StackSpec.PodTemplate.Spec.Volumes = []corev1.Volume{
170+
{
171+
Name: "config-volume",
172+
VolumeSource: corev1.VolumeSource{
173+
ConfigMap: &corev1.ConfigMapVolumeSource{
174+
LocalObjectReference: corev1.LocalObjectReference{
175+
Name: configMapName,
176+
},
177+
},
178+
},
179+
},
180+
}
181+
}
182+
137183
if f.autoscaler {
138184
result.StackTemplate.Spec.Autoscaler = &zv1.Autoscaler{
139185
MaxReplicas: f.hpaMaxReplicas,
@@ -287,6 +333,23 @@ func verifyStack(t *testing.T, stacksetName, currentVersion string, stacksetSpec
287333
require.EqualValues(t, expectedRef, hpa.Spec.ScaleTargetRef)
288334
}
289335

336+
// Verify ConfigMaps
337+
for _, rsc := range stacksetSpec.StackTemplate.Spec.ConfigurationResources {
338+
configMap, err := waitForConfigMap(t, rsc.ConfigMapRef.Name)
339+
require.NoError(t, err)
340+
assert.EqualValues(t, stackResourceLabels, configMap.Labels)
341+
assert.Contains(t, configMap.Name, stack.Name)
342+
assert.Equal(t, map[string]string{"key": "value"}, configMap.Data)
343+
assert.Equal(t, []metav1.OwnerReference{
344+
{
345+
APIVersion: "zalando.org/v1",
346+
Kind: "Stack",
347+
Name: stack.Name,
348+
UID: stack.UID,
349+
},
350+
}, configMap.OwnerReferences)
351+
}
352+
290353
verifyStackIngressSources(
291354
t,
292355
stack,
@@ -576,6 +639,7 @@ func verifyStacksetRouteGroup(t *testing.T, stacksetName string, stacksetSpec zv
576639
func testStacksetCreate(
577640
t *testing.T,
578641
testName string,
642+
configmap bool,
579643
hpa,
580644
ingress,
581645
routegroup,
@@ -589,6 +653,9 @@ func testStacksetCreate(
589653
stacksetName := fmt.Sprintf("stackset-create-%s-%s", ingType, testName)
590654
stackVersion := "v1"
591655
stacksetSpecFactory := NewTestStacksetSpecFactory(stacksetName)
656+
if configmap {
657+
stacksetSpecFactory.ConfigMap()
658+
}
592659
if hpa {
593660
stacksetSpecFactory.Autoscaler(
594661
1,
@@ -611,7 +678,7 @@ func testStacksetCreate(
611678
if len(subResourceAnnotations) > 0 {
612679
stacksetSpecFactory.SubResourceAnnotations(subResourceAnnotations)
613680
}
614-
stacksetSpec := stacksetSpecFactory.Create(stackVersion)
681+
stacksetSpec := stacksetSpecFactory.Create(t, stackVersion)
615682

616683
var err error
617684
switch ingType {
@@ -730,7 +797,7 @@ func testStacksetUpdate(
730797
oldSubResourceAnnotations,
731798
)
732799
}
733-
stacksetSpec := stacksetSpecFactory.Create(initialVersion)
800+
stacksetSpec := stacksetSpecFactory.Create(t, initialVersion)
734801

735802
var err error
736803
switch ingType {
@@ -840,7 +907,7 @@ func testStacksetUpdate(
840907
)
841908
}
842909

843-
updatedSpec := stacksetSpecFactory.Create(updatedVersion)
910+
updatedSpec := stacksetSpecFactory.Create(t, updatedVersion)
844911
err = updateStackset(stacksetName, updatedSpec)
845912
require.NoError(t, err)
846913

@@ -941,27 +1008,31 @@ func testStacksetUpdate(
9411008
}
9421009

9431010
func TestStacksetCreateBasic(t *testing.T) {
944-
testStacksetCreate(t, "basic", false, false, false, false, false, testAnnotationsCreate)
1011+
testStacksetCreate(t, "basic", false, false, false, false, false, false, testAnnotationsCreate)
1012+
}
1013+
1014+
func TestStacksetCreateConfigMap(t *testing.T) {
1015+
testStacksetCreate(t, "configmap", true, false, false, false, false, false, testAnnotationsCreate)
9451016
}
9461017

9471018
func TestStacksetCreateHPA(t *testing.T) {
948-
testStacksetCreate(t, "hpa", true, false, false, false, false, testAnnotationsCreate)
1019+
testStacksetCreate(t, "hpa", false, true, false, false, false, false, testAnnotationsCreate)
9491020
}
9501021

9511022
func TestStacksetCreateIngress(t *testing.T) {
952-
testStacksetCreate(t, "ingress", false, true, false, false, false, testAnnotationsCreate)
1023+
testStacksetCreate(t, "ingress", false, false, true, false, false, false, testAnnotationsCreate)
9531024
}
9541025

9551026
func TestStacksetCreateRouteGroup(t *testing.T) {
956-
testStacksetCreate(t, "routegroup", false, false, true, false, false, testAnnotationsCreate)
1027+
testStacksetCreate(t, "routegroup", false, false, false, true, false, false, testAnnotationsCreate)
9571028
}
9581029

9591030
func TestStacksetCreateExternalIngress(t *testing.T) {
960-
testStacksetCreate(t, "externalingress", false, false, false, true, false, testAnnotationsCreate)
1031+
testStacksetCreate(t, "externalingress", false, false, false, false, true, false, testAnnotationsCreate)
9611032
}
9621033

9631034
func TestStacksetCreateUpdateStrategy(t *testing.T) {
964-
testStacksetCreate(t, "updatestrategy", false, false, false, false, true, testAnnotationsCreate)
1035+
testStacksetCreate(t, "updatestrategy", false, false, false, false, false, true, testAnnotationsCreate)
9651036
}
9661037

9671038
func TestStacksetUpdateBasic(t *testing.T) {

cmd/e2e/broken_stack_test.go

Lines changed: 86 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package main
22

33
import (
4+
"context"
45
"fmt"
56
"testing"
67
"time"
78

89
"github.com/stretchr/testify/require"
910
corev1 "k8s.io/api/core/v1"
11+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1012
"k8s.io/apimachinery/pkg/util/intstr"
1113
)
1214

@@ -18,15 +20,15 @@ func TestBrokenStacks(t *testing.T) {
1820

1921
firstVersion := "v1"
2022
firstStack := fmt.Sprintf("%s-%s", stacksetName, firstVersion)
21-
spec := factory.Create(firstVersion)
23+
spec := factory.Create(t, firstVersion)
2224
err := createStackSet(stacksetName, 0, spec)
2325
require.NoError(t, err)
2426
_, err = waitForStack(t, stacksetName, firstVersion)
2527
require.NoError(t, err)
2628

2729
unhealthyVersion := "v2"
2830
unhealthyStack := fmt.Sprintf("%s-%s", stacksetName, unhealthyVersion)
29-
spec = factory.Create(unhealthyVersion)
31+
spec = factory.Create(t, unhealthyVersion)
3032
spec.StackTemplate.Spec.Service.Ports = []corev1.ServicePort{
3133
{
3234
Protocol: corev1.ProtocolTCP,
@@ -55,7 +57,7 @@ func TestBrokenStacks(t *testing.T) {
5557
// Create a healthy stack
5658
healthyVersion := "v3"
5759
healthyStack := fmt.Sprintf("%s-%s", stacksetName, healthyVersion)
58-
spec = factory.Create(healthyVersion)
60+
spec = factory.Create(t, healthyVersion)
5961
err = updateStackset(stacksetName, spec)
6062
require.NoError(t, err)
6163
_, err = waitForStack(t, stacksetName, healthyVersion)
@@ -70,7 +72,87 @@ func TestBrokenStacks(t *testing.T) {
7072
// Create another healthy stack so we can test GC
7173
finalVersion := "v4"
7274
finalStack := fmt.Sprintf("%s-%s", stacksetName, finalVersion)
73-
spec = factory.Create(finalVersion)
75+
spec = factory.Create(t, finalVersion)
76+
err = updateStackset(stacksetName, spec)
77+
require.NoError(t, err)
78+
_, err = waitForStack(t, stacksetName, finalVersion)
79+
require.NoError(t, err)
80+
81+
finalWeights := map[string]float64{finalStack: 100}
82+
err = setDesiredTrafficWeightsStackset(stacksetName, finalWeights)
83+
require.NoError(t, err)
84+
err = trafficWeightsUpdatedStackset(t, stacksetName, weightKindActual, finalWeights, nil).await()
85+
require.NoError(t, err)
86+
87+
// Check that the unhealthy stack was deleted
88+
for _, stack := range []string{unhealthyStack, firstStack} {
89+
err := resourceDeleted(t, "stack", stack, stackInterface()).withTimeout(time.Second * 60).await()
90+
require.NoError(t, err)
91+
}
92+
93+
}
94+
95+
func TestBrokenStackWithConfigMaps(t *testing.T) {
96+
t.Parallel()
97+
98+
stacksetName := "stackset-broken-stacks-with-configmap"
99+
factory := NewTestStacksetSpecFactory(stacksetName).Ingress().ConfigMap().StackGC(1, 30)
100+
101+
firstVersion := "v1"
102+
firstStack := fmt.Sprintf("%s-%s", stacksetName, firstVersion)
103+
spec := factory.Create(t, firstVersion)
104+
err := createStackSet(stacksetName, 0, spec)
105+
require.NoError(t, err)
106+
_, err = waitForStack(t, stacksetName, firstVersion)
107+
require.NoError(t, err)
108+
109+
unhealthyVersion := "v2"
110+
unhealthyStack := fmt.Sprintf("%s-%s", stacksetName, unhealthyVersion)
111+
spec = factory.Create(t, unhealthyVersion)
112+
for _, cr := range spec.StackTemplate.Spec.ConfigurationResources {
113+
if cr.ConfigMapRef.Name != "" {
114+
err := configMapInterface().Delete(context.Background(), cr.ConfigMapRef.Name, metav1.DeleteOptions{})
115+
require.NoError(t, err)
116+
}
117+
}
118+
err = updateStackset(stacksetName, spec)
119+
require.NoError(t, err)
120+
_, err = waitForStack(t, stacksetName, unhealthyVersion)
121+
require.NoError(t, err)
122+
123+
_, err = waitForIngress(t, stacksetName)
124+
require.NoError(t, err)
125+
126+
initialWeights := map[string]float64{firstStack: 100}
127+
err = trafficWeightsUpdatedStackset(t, stacksetName, weightKindActual, initialWeights, nil).await()
128+
require.NoError(t, err)
129+
130+
// Switch traffic to the second stack, this should fail
131+
desiredWeights := map[string]float64{unhealthyStack: 100}
132+
err = setDesiredTrafficWeightsStackset(stacksetName, desiredWeights)
133+
require.NoError(t, err)
134+
err = trafficWeightsUpdatedStackset(t, stacksetName, weightKindActual, desiredWeights, nil).await()
135+
require.Error(t, err)
136+
137+
// Create a healthy stack
138+
healthyVersion := "v3"
139+
healthyStack := fmt.Sprintf("%s-%s", stacksetName, healthyVersion)
140+
spec = factory.Create(t, healthyVersion)
141+
err = updateStackset(stacksetName, spec)
142+
require.NoError(t, err)
143+
_, err = waitForStack(t, stacksetName, healthyVersion)
144+
require.NoError(t, err)
145+
146+
healthyWeights := map[string]float64{healthyStack: 100}
147+
err = setDesiredTrafficWeightsStackset(stacksetName, healthyWeights)
148+
require.NoError(t, err)
149+
err = trafficWeightsUpdatedStackset(t, stacksetName, weightKindActual, healthyWeights, nil).await()
150+
require.NoError(t, err)
151+
152+
// Create another healthy stack so we can test GC
153+
finalVersion := "v4"
154+
finalStack := fmt.Sprintf("%s-%s", stacksetName, finalVersion)
155+
spec = factory.Create(t, finalVersion)
74156
err = updateStackset(stacksetName, spec)
75157
require.NoError(t, err)
76158
_, err = waitForStack(t, stacksetName, finalVersion)

cmd/e2e/configure_hpa_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ func TestConfigureAutoscaling(t *testing.T) {
2525
Autoscaler(1, 10, metrics).
2626
Behavior(stabilizationWindow)
2727
firstVersion := "v1"
28-
spec := factory.Create(firstVersion)
28+
spec := factory.Create(t, firstVersion)
2929
err := createStackSet(stacksetName, 0, spec)
3030
require.NoError(t, err)
3131

cmd/e2e/generated_autoscaler_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ func TestGenerateAutoscaler(t *testing.T) {
4444

4545
factory := NewTestStacksetSpecFactory(stacksetName).Ingress().Autoscaler(1, 10, metrics)
4646
firstVersion := "v1"
47-
spec := factory.Create(firstVersion)
47+
spec := factory.Create(t, firstVersion)
4848
err := createStackSet(stacksetName, 0, spec)
4949
require.NoError(t, err)
5050

0 commit comments

Comments
 (0)