Skip to content

Commit

Permalink
allow more control over configured versioned resources for more flexi…
Browse files Browse the repository at this point in the history
…ble test cases (#606)
  • Loading branch information
linki authored Mar 5, 2024
1 parent f58a57c commit cc6c539
Show file tree
Hide file tree
Showing 3 changed files with 110 additions and 95 deletions.
121 changes: 44 additions & 77 deletions cmd/e2e/basic_test.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package main

import (
"context"
"fmt"
"slices"
"sort"
Expand Down Expand Up @@ -38,8 +37,6 @@ type TestStacksetSpecFactory struct {
ingress bool
routegroup bool
externalIngress bool
configMapRef bool
secretRef bool
limit int32
scaleDownTTL int64
replicas int32
Expand All @@ -51,13 +48,13 @@ type TestStacksetSpecFactory struct {
maxUnavailable int
metrics []zv1.AutoscalerMetrics
subResourceAnnotations map[string]string
configurationResources []zv1.ConfigurationResourcesSpec
volumes []corev1.Volume
}

func NewTestStacksetSpecFactory(stacksetName string) *TestStacksetSpecFactory {
return &TestStacksetSpecFactory{
stacksetName: stacksetName,
configMapRef: false,
secretRef: false,
ingress: false,
externalIngress: false,
limit: 4,
Expand All @@ -66,16 +63,44 @@ func NewTestStacksetSpecFactory(stacksetName string) *TestStacksetSpecFactory {
hpaMinReplicas: 1,
hpaMaxReplicas: 3,
subResourceAnnotations: map[string]string{},
configurationResources: []zv1.ConfigurationResourcesSpec{},
volumes: []corev1.Volume{},
}
}

func (f *TestStacksetSpecFactory) ConfigMapRef() *TestStacksetSpecFactory {
f.configMapRef = true
func (f *TestStacksetSpecFactory) AddReferencedConfigMap(configMapName string) *TestStacksetSpecFactory {
f.configurationResources = append(f.configurationResources, zv1.ConfigurationResourcesSpec{
ConfigMapRef: &corev1.LocalObjectReference{Name: configMapName},
})

f.volumes = append(f.volumes, corev1.Volume{
Name: configMapName,
VolumeSource: corev1.VolumeSource{
ConfigMap: &corev1.ConfigMapVolumeSource{
LocalObjectReference: corev1.LocalObjectReference{
Name: configMapName,
},
},
},
})

return f
}

func (f *TestStacksetSpecFactory) SecretRef() *TestStacksetSpecFactory {
f.secretRef = true
func (f *TestStacksetSpecFactory) AddReferencedSecret(secretName string) *TestStacksetSpecFactory {
f.configurationResources = append(f.configurationResources, zv1.ConfigurationResourcesSpec{
SecretRef: &corev1.LocalObjectReference{Name: secretName},
})

f.volumes = append(f.volumes, corev1.Volume{
Name: secretName,
VolumeSource: corev1.VolumeSource{
Secret: &corev1.SecretVolumeSource{
SecretName: secretName,
},
},
})

return f
}

Expand Down Expand Up @@ -151,74 +176,12 @@ func (f *TestStacksetSpecFactory) Create(t *testing.T, stackVersion string) zv1.
},
}

if f.configMapRef {
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: configMapName,
},
},
}

result.StackTemplate.Spec.PodTemplate.Spec.Volumes = []corev1.Volume{
{
Name: "config-volume",
VolumeSource: corev1.VolumeSource{
ConfigMap: &corev1.ConfigMapVolumeSource{
LocalObjectReference: corev1.LocalObjectReference{
Name: configMapName,
},
},
},
},
}
if len(f.configurationResources) > 0 {
result.StackTemplate.Spec.ConfigurationResources = f.configurationResources
}

if f.secretRef {
secretName := fmt.Sprintf("%s-%s-secret", f.stacksetName, stackVersion)
secret := &corev1.Secret{
ObjectMeta: metav1.ObjectMeta{
Name: secretName,
},
Data: map[string][]byte{
"key": []byte("value"),
},
}

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

result.StackTemplate.Spec.ConfigurationResources = []zv1.ConfigurationResourcesSpec{
{
SecretRef: &corev1.LocalObjectReference{
Name: secretName,
},
},
}

result.StackTemplate.Spec.PodTemplate.Spec.Volumes = []corev1.Volume{
{
Name: "secret-volume",
VolumeSource: corev1.VolumeSource{
Secret: &corev1.SecretVolumeSource{
SecretName: secretName,
},
},
},
}
if len(f.volumes) > 0 {
result.StackTemplate.Spec.PodTemplate.Spec.Volumes = f.volumes
}

if f.autoscaler {
Expand Down Expand Up @@ -727,10 +690,14 @@ func testStacksetCreate(
stackVersion := "v1"
stacksetSpecFactory := NewTestStacksetSpecFactory(stacksetName)
if configmapRef {
stacksetSpecFactory.ConfigMapRef()
configMapName := fmt.Sprintf("%s-%s-configmap", stacksetName, stackVersion)
createConfigMap(t, configMapName)
stacksetSpecFactory.AddReferencedConfigMap(configMapName)
}
if secretRef {
stacksetSpecFactory.SecretRef()
secretName := fmt.Sprintf("%s-%s-secret", stacksetName, stackVersion)
createSecret(t, secretName)
stacksetSpecFactory.AddReferencedSecret(secretName)
}
if hpa {
stacksetSpecFactory.Autoscaler(
Expand Down
57 changes: 39 additions & 18 deletions cmd/e2e/broken_stack_test.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
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 @@ -96,10 +94,14 @@ func TestBrokenStackWithConfigMaps(t *testing.T) {
t.Parallel()

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

firstVersion := "v1"

firstStack := fmt.Sprintf("%s-%s", stacksetName, firstVersion)

configMapName := fmt.Sprintf("%s-configmap", firstStack)
createConfigMap(t, configMapName)

factory := NewTestStacksetSpecFactory(stacksetName).Ingress().AddReferencedConfigMap(configMapName).StackGC(1, 30)
spec := factory.Create(t, firstVersion)
err := createStackSet(stacksetName, 0, spec)
require.NoError(t, err)
Expand All @@ -108,13 +110,11 @@ func TestBrokenStackWithConfigMaps(t *testing.T) {

unhealthyVersion := "v2"
unhealthyStack := fmt.Sprintf("%s-%s", stacksetName, unhealthyVersion)

configMapName = fmt.Sprintf("%s-configmap", unhealthyStack)

factory = NewTestStacksetSpecFactory(stacksetName).Ingress().AddReferencedConfigMap(configMapName).StackGC(1, 30)
spec = factory.Create(t, unhealthyVersion)
for _, cr := range spec.StackTemplate.Spec.ConfigurationResources {
if cr.IsConfigMapRef() {
err := configMapInterface().Delete(context.Background(), cr.GetName(), metav1.DeleteOptions{})
require.NoError(t, err)
}
}
err = updateStackset(stacksetName, spec)
require.NoError(t, err)
_, err = waitForStack(t, stacksetName, unhealthyVersion)
Expand All @@ -137,6 +137,11 @@ func TestBrokenStackWithConfigMaps(t *testing.T) {
// Create a healthy stack
healthyVersion := "v3"
healthyStack := fmt.Sprintf("%s-%s", stacksetName, healthyVersion)

configMapName = fmt.Sprintf("%s-configmap", healthyStack)
createConfigMap(t, configMapName)

factory = NewTestStacksetSpecFactory(stacksetName).Ingress().AddReferencedConfigMap(configMapName).StackGC(1, 30)
spec = factory.Create(t, healthyVersion)
err = updateStackset(stacksetName, spec)
require.NoError(t, err)
Expand All @@ -152,6 +157,11 @@ func TestBrokenStackWithConfigMaps(t *testing.T) {
// Create another healthy stack so we can test GC
finalVersion := "v4"
finalStack := fmt.Sprintf("%s-%s", stacksetName, finalVersion)

configMapName = fmt.Sprintf("%s-configmap", finalStack)
createConfigMap(t, configMapName)

factory = NewTestStacksetSpecFactory(stacksetName).Ingress().AddReferencedConfigMap(configMapName).StackGC(1, 30)
spec = factory.Create(t, finalVersion)
err = updateStackset(stacksetName, spec)
require.NoError(t, err)
Expand All @@ -176,9 +186,12 @@ func TestBrokenStackWithSecrets(t *testing.T) {
t.Parallel()

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

firstVersion := "v1"

secretName := fmt.Sprintf("%s-%s-secret", stacksetName, firstVersion)
createSecret(t, secretName)

factory := NewTestStacksetSpecFactory(stacksetName).Ingress().AddReferencedSecret(secretName).StackGC(1, 30)
firstStack := fmt.Sprintf("%s-%s", stacksetName, firstVersion)
spec := factory.Create(t, firstVersion)
err := createStackSet(stacksetName, 0, spec)
Expand All @@ -187,14 +200,12 @@ func TestBrokenStackWithSecrets(t *testing.T) {
require.NoError(t, err)

unhealthyVersion := "v2"

secretName = fmt.Sprintf("%s-%s-secret", stacksetName, unhealthyVersion)

factory = NewTestStacksetSpecFactory(stacksetName).Ingress().AddReferencedSecret(secretName).StackGC(1, 30)
unhealthyStack := fmt.Sprintf("%s-%s", stacksetName, unhealthyVersion)
spec = factory.Create(t, unhealthyVersion)
for _, cr := range spec.StackTemplate.Spec.ConfigurationResources {
if cr.IsSecretRef() {
err := secretInterface().Delete(context.Background(), cr.GetName(), metav1.DeleteOptions{})
require.NoError(t, err)
}
}
err = updateStackset(stacksetName, spec)
require.NoError(t, err)
_, err = waitForStack(t, stacksetName, unhealthyVersion)
Expand All @@ -216,6 +227,11 @@ func TestBrokenStackWithSecrets(t *testing.T) {

// Create a healthy stack
healthyVersion := "v3"

secretName = fmt.Sprintf("%s-%s-secret", stacksetName, healthyVersion)
createSecret(t, secretName)

factory = NewTestStacksetSpecFactory(stacksetName).Ingress().AddReferencedSecret(secretName).StackGC(1, 30)
healthyStack := fmt.Sprintf("%s-%s", stacksetName, healthyVersion)
spec = factory.Create(t, healthyVersion)
err = updateStackset(stacksetName, spec)
Expand All @@ -231,6 +247,11 @@ func TestBrokenStackWithSecrets(t *testing.T) {

// Create another healthy stack so we can test GC
finalVersion := "v4"

secretName = fmt.Sprintf("%s-%s-secret", stacksetName, finalVersion)
createSecret(t, secretName)

factory = NewTestStacksetSpecFactory(stacksetName).Ingress().AddReferencedSecret(secretName).StackGC(1, 30)
finalStack := fmt.Sprintf("%s-%s", stacksetName, finalVersion)
spec = factory.Create(t, finalVersion)
err = updateStackset(stacksetName, spec)
Expand Down
27 changes: 27 additions & 0 deletions cmd/e2e/test_utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"time"

"github.com/google/go-cmp/cmp"
"github.com/stretchr/testify/require"
rgv1 "github.com/szuecs/routegroup-client/apis/zalando.org/v1"
"github.com/zalando-incubator/stackset-controller/controller"
zv1 "github.com/zalando-incubator/stackset-controller/pkg/apis/zalando.org/v1"
Expand Down Expand Up @@ -591,6 +592,32 @@ func setDesiredTrafficWeightsStackset(stacksetName string, weights map[string]fl
}
}

func createConfigMap(t *testing.T, name string) {
configMap := &corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Name: name,
},
Data: map[string]string{
"key": "value",
},
}
_, err := configMapInterface().Create(context.Background(), configMap, metav1.CreateOptions{})
require.NoError(t, err)
}

func createSecret(t *testing.T, name string) {
secret := &corev1.Secret{
ObjectMeta: metav1.ObjectMeta{
Name: name,
},
Data: map[string][]byte{
"key": []byte("value"),
},
}
_, err := secretInterface().Create(context.Background(), secret, metav1.CreateOptions{})
require.NoError(t, err)
}

func pint32(i int32) *int32 {
return &i
}
Expand Down

0 comments on commit cc6c539

Please sign in to comment.