Skip to content

Commit

Permalink
add e2e tests for preventing traffic switch when configmap is missing
Browse files Browse the repository at this point in the history
  • Loading branch information
linki committed Jan 12, 2024
1 parent a9413d5 commit 16bf599
Show file tree
Hide file tree
Showing 2 changed files with 113 additions and 21 deletions.
50 changes: 30 additions & 20 deletions cmd/e2e/basic_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,21 +67,9 @@ func NewTestStacksetSpecFactory(stacksetName string) *TestStacksetSpecFactory {
}
}

func (f *TestStacksetSpecFactory) ConfigMap(configMapName string, data map[string]string) (*TestStacksetSpecFactory, error) {
configMap := &corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Name: configMapName,
},
Data: data,
}

_, err := configMapInterface().Create(context.Background(), configMap, metav1.CreateOptions{})
if err != nil {
return nil, err
}

func (f *TestStacksetSpecFactory) ConfigMap() *TestStacksetSpecFactory {
f.configMap = true
return f, nil
return f
}

func (f *TestStacksetSpecFactory) Behavior(stabilizationWindowSeconds int32) *TestStacksetSpecFactory {
Expand Down Expand Up @@ -157,10 +145,36 @@ func (f *TestStacksetSpecFactory) Create(t *testing.T, stackVersion string) zv1.
}

if f.configMap {
configMapName := fmt.Sprintf("%s-%s-configmap", f.stacksetName, stackVersion)
configMap := &corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Name: configMapName,
},
Data: map[string]string{
"key": "value",
},
}

_, err := configMapInterface().Create(context.Background(), configMap, metav1.CreateOptions{})
require.NoError(t, err)

result.StackTemplate.Spec.ConfigurationResources = []zv1.ConfigurationResourcesSpec{
{
ConfigMapRef: corev1.LocalObjectReference{
Name: fmt.Sprintf("%s-%s-configmap", f.stacksetName, stackVersion),
Name: configMapName,
},
},
}

result.StackTemplate.Spec.StackSpec.PodTemplate.Spec.Volumes = []corev1.Volume{
{
Name: "config-volume",
VolumeSource: corev1.VolumeSource{
ConfigMap: &corev1.ConfigMapVolumeSource{
LocalObjectReference: corev1.LocalObjectReference{
Name: configMapName,
},
},
},
},
}
Expand Down Expand Up @@ -640,11 +654,7 @@ func testStacksetCreate(
stackVersion := "v1"
stacksetSpecFactory := NewTestStacksetSpecFactory(stacksetName)
if configmap {
_, err := stacksetSpecFactory.ConfigMap(
fmt.Sprintf("%s-%s-configmap", stacksetName, stackVersion),
map[string]string{"key": "value"},
)
require.NoError(t, err)
stacksetSpecFactory.ConfigMap()
}
if hpa {
stacksetSpecFactory.Autoscaler(
Expand Down
84 changes: 83 additions & 1 deletion cmd/e2e/broken_stack_test.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package main

import (
"context"
"fmt"
"testing"
"time"

"github.com/stretchr/testify/require"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/intstr"
)

Expand Down Expand Up @@ -70,7 +72,87 @@ func TestBrokenStacks(t *testing.T) {
// Create another healthy stack so we can test GC
finalVersion := "v4"
finalStack := fmt.Sprintf("%s-%s", stacksetName, finalVersion)
spec = factory.Create(finalVersion)
spec = factory.Create(t, finalVersion)
err = updateStackset(stacksetName, spec)
require.NoError(t, err)
_, err = waitForStack(t, stacksetName, finalVersion)
require.NoError(t, err)

finalWeights := map[string]float64{finalStack: 100}
err = setDesiredTrafficWeightsStackset(stacksetName, finalWeights)
require.NoError(t, err)
err = trafficWeightsUpdatedStackset(t, stacksetName, weightKindActual, finalWeights, nil).await()
require.NoError(t, err)

// Check that the unhealthy stack was deleted
for _, stack := range []string{unhealthyStack, firstStack} {
err := resourceDeleted(t, "stack", stack, stackInterface()).withTimeout(time.Second * 60).await()
require.NoError(t, err)
}

}

func TestBrokenStackWithConfigMaps(t *testing.T) {
t.Parallel()

stacksetName := "stackset-broken-stacks-with-configmap"
factory := NewTestStacksetSpecFactory(stacksetName).Ingress().ConfigMap().StackGC(1, 30)

firstVersion := "v1"
firstStack := fmt.Sprintf("%s-%s", stacksetName, firstVersion)
spec := factory.Create(t, firstVersion)
err := createStackSet(stacksetName, 0, spec)
require.NoError(t, err)
_, err = waitForStack(t, stacksetName, firstVersion)
require.NoError(t, err)

unhealthyVersion := "v2"
unhealthyStack := fmt.Sprintf("%s-%s", stacksetName, unhealthyVersion)
spec = factory.Create(t, unhealthyVersion)
for _, cr := range spec.StackTemplate.Spec.ConfigurationResources {
if cr.ConfigMapRef.Name != "" {
err := configMapInterface().Delete(context.Background(), cr.ConfigMapRef.Name, metav1.DeleteOptions{})
require.NoError(t, err)
}
}
err = updateStackset(stacksetName, spec)
require.NoError(t, err)
_, err = waitForStack(t, stacksetName, unhealthyVersion)
require.NoError(t, err)

_, err = waitForIngress(t, stacksetName)
require.NoError(t, err)

initialWeights := map[string]float64{firstStack: 100}
err = trafficWeightsUpdatedStackset(t, stacksetName, weightKindActual, initialWeights, nil).await()
require.NoError(t, err)

// Switch traffic to the second stack, this should fail
desiredWeights := map[string]float64{unhealthyStack: 100}
err = setDesiredTrafficWeightsStackset(stacksetName, desiredWeights)
require.NoError(t, err)
err = trafficWeightsUpdatedStackset(t, stacksetName, weightKindActual, desiredWeights, nil).await()
require.Error(t, err)

// Create a healthy stack
healthyVersion := "v3"
healthyStack := fmt.Sprintf("%s-%s", stacksetName, healthyVersion)
spec = factory.Create(t, healthyVersion)
err = updateStackset(stacksetName, spec)
require.NoError(t, err)
_, err = waitForStack(t, stacksetName, healthyVersion)
require.NoError(t, err)

healthyWeights := map[string]float64{healthyStack: 100}
err = setDesiredTrafficWeightsStackset(stacksetName, healthyWeights)
require.NoError(t, err)
err = trafficWeightsUpdatedStackset(t, stacksetName, weightKindActual, healthyWeights, nil).await()
require.NoError(t, err)

// Create another healthy stack so we can test GC
finalVersion := "v4"
finalStack := fmt.Sprintf("%s-%s", stacksetName, finalVersion)
spec = factory.Create(t, finalVersion)
err = updateStackset(stacksetName, spec)
require.NoError(t, err)
_, err = waitForStack(t, stacksetName, finalVersion)
Expand Down

0 comments on commit 16bf599

Please sign in to comment.