Skip to content

Commit 774c159

Browse files
authored
fix migrations to stackset (#191)
* fix: have only one place for the const definition, such that overrides also work as expected Signed-off-by: Sandor Szücs <sandor.szuecs@zalando.de> * fix: generate traffic settings on stackset if we do --migrate-to=stackset Signed-off-by: Sandor Szücs <sandor.szuecs@zalando.de> * pass the decision who manages the traffic via UpdateFromResources() to omit exported member of internal struct as commented Signed-off-by: Sandor Szücs <sandor.szuecs@zalando.de> * refactor BackendWeightsAnnotationKey to non public field Signed-off-by: Sandor Szücs <sandor.szuecs@zalando.de>
1 parent cca9bb9 commit 774c159

File tree

6 files changed

+46
-32
lines changed

6 files changed

+46
-32
lines changed

controller/stackset.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -892,7 +892,7 @@ func (c *StackSetController) ReconcileStackSet(container *core.StackSetContainer
892892
}
893893

894894
// Update statuses from external resources (ingresses, deployments, etc). Abort on errors.
895-
err = container.UpdateFromResources(c.backendWeightsAnnotationKey)
895+
err = container.UpdateFromResources(c.migrateTo == "stackset", c.backendWeightsAnnotationKey)
896896
if err != nil {
897897
return err
898898
}

pkg/core/stackset.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"strconv"
88

99
zv1 "github.com/zalando-incubator/stackset-controller/pkg/apis/zalando.org/v1"
10+
"github.com/zalando-incubator/stackset-controller/pkg/traffic"
1011
corev1 "k8s.io/api/core/v1"
1112
extensions "k8s.io/api/extensions/v1beta1"
1213
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -56,7 +57,6 @@ func (ssc *StackSetContainer) NewStack() (*StackContainer, string) {
5657
observedStackVersion := stackset.Status.ObservedStackVersion
5758
stackVersion := currentStackVersion(stackset)
5859
stackName := generateStackName(stackset, stackVersion)
59-
6060
stack := ssc.stackByName(stackName)
6161

6262
// If the current stack doesn't exist, check that we haven't created it before. We shouldn't recreate
@@ -223,11 +223,11 @@ func (ssc *StackSetContainer) GenerateIngress() (*extensions.Ingress, error) {
223223
return nil, err
224224
}
225225

226-
result.Annotations[BackendWeightsAnnotationKey] = string(actualWeightsData)
226+
result.Annotations[ssc.backendWeightsAnnotationKey] = string(actualWeightsData)
227227
if ssc.stacksetManagesTraffic {
228-
delete(result.Annotations, stackTrafficWeightsAnnotationKey)
228+
delete(result.Annotations, traffic.StackTrafficWeightsAnnotationKey)
229229
} else {
230-
result.Annotations[stackTrafficWeightsAnnotationKey] = string(desiredWeightData)
230+
result.Annotations[traffic.StackTrafficWeightsAnnotationKey] = string(desiredWeightData)
231231
}
232232

233233
return result, nil

pkg/core/stackset_test.go

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,8 @@ func TestExpiredStacks(t *testing.T) {
101101
},
102102
},
103103
},
104-
StackContainers: map[types.UID]*StackContainer{},
104+
StackContainers: map[types.UID]*StackContainer{},
105+
backendWeightsAnnotationKey: traffic.DefaultBackendWeightsAnnotationKey,
105106
}
106107
c.StackSet.Spec.StackLifecycle.Limit = &tc.limit
107108
for _, stack := range tc.stacks {
@@ -294,8 +295,9 @@ func TestStackSetNewStack(t *testing.T) {
294295
} {
295296
t.Run(tc.name, func(t *testing.T) {
296297
stackset := &StackSetContainer{
297-
StackSet: tc.stackset,
298-
StackContainers: tc.stacks,
298+
StackSet: tc.stackset,
299+
StackContainers: tc.stacks,
300+
backendWeightsAnnotationKey: traffic.DefaultBackendWeightsAnnotationKey,
299301
}
300302
newStack, newStackName := stackset.NewStack()
301303
require.EqualValues(t, tc.expectedStack, newStack)
@@ -324,6 +326,7 @@ func dummyStacksetContainer() *StackSetContainer {
324326
Stack: &zv1.Stack{},
325327
},
326328
},
329+
backendWeightsAnnotationKey: traffic.DefaultBackendWeightsAnnotationKey,
327330
}
328331
}
329332

@@ -350,7 +353,7 @@ func TestStackSetUpdateFromResourcesPopulatesIngress(t *testing.T) {
350353
t.Run(tc.name, func(t *testing.T) {
351354
c := dummyStacksetContainer()
352355
c.StackSet.Spec.Ingress = tc.ingress
353-
err := c.UpdateFromResources(traffic.DefaultBackendWeightsAnnotationKey)
356+
err := c.UpdateFromResources(true, traffic.DefaultBackendWeightsAnnotationKey)
354357
require.NoError(t, err)
355358

356359
for _, sc := range c.StackContainers {
@@ -394,7 +397,7 @@ func TestStackSetUpdateFromResourcesPopulatesBackendPort(t *testing.T) {
394397
t.Run(tc.name, func(t *testing.T) {
395398
c := dummyStacksetContainer()
396399
c.StackSet.Spec = tc.spec
397-
err := c.UpdateFromResources(traffic.DefaultBackendWeightsAnnotationKey)
400+
err := c.UpdateFromResources(true, traffic.DefaultBackendWeightsAnnotationKey)
398401
require.NoError(t, err)
399402

400403
for _, sc := range c.StackContainers {
@@ -448,7 +451,7 @@ func TestStackSetUpdateFromResourcesScaleDown(t *testing.T) {
448451
c.StackSet.Spec.Ingress = tc.ingress
449452
}
450453

451-
err := c.UpdateFromResources(traffic.DefaultBackendWeightsAnnotationKey)
454+
err := c.UpdateFromResources(true, traffic.DefaultBackendWeightsAnnotationKey)
452455
require.NoError(t, err)
453456

454457
for _, sc := range c.StackContainers {
@@ -789,9 +792,10 @@ func TestUpdateTrafficFromStackSet(t *testing.T) {
789792
"v2": stack2,
790793
"v3": stack3,
791794
},
795+
backendWeightsAnnotationKey: traffic.DefaultBackendWeightsAnnotationKey,
792796
}
793797

794-
err := ssc.UpdateFromResources(traffic.DefaultBackendWeightsAnnotationKey)
798+
err := ssc.UpdateFromResources(true, traffic.DefaultBackendWeightsAnnotationKey)
795799
require.NoError(t, err)
796800
require.True(t, ssc.stacksetManagesTraffic)
797801

@@ -820,9 +824,10 @@ func TestStackSetExternalIngressForcesTrafficManagement(t *testing.T) {
820824
StackContainers: map[types.UID]*StackContainer{
821825
"v1": testStack("foo-v1").stack(),
822826
},
827+
backendWeightsAnnotationKey: traffic.DefaultBackendWeightsAnnotationKey,
823828
}
824829

825-
err := ssc.UpdateFromResources(traffic.DefaultBackendWeightsAnnotationKey)
830+
err := ssc.UpdateFromResources(true, traffic.DefaultBackendWeightsAnnotationKey)
826831
require.NoError(t, err)
827832
require.True(t, ssc.stacksetManagesTraffic)
828833
require.EqualValues(t, &backendPort, ssc.externalIngressBackendPort)
@@ -879,16 +884,17 @@ func TestUpdateTrafficFromIngress(t *testing.T) {
879884
"v2": stack2,
880885
"v3": stack3,
881886
},
887+
backendWeightsAnnotationKey: traffic.DefaultBackendWeightsAnnotationKey,
882888
}
883889

884890
if tc.desiredWeights != "" {
885-
ssc.Ingress.Annotations[stackTrafficWeightsAnnotationKey] = tc.desiredWeights
891+
ssc.Ingress.Annotations[traffic.StackTrafficWeightsAnnotationKey] = tc.desiredWeights
886892
}
887893
if tc.actualWeights != "" {
888-
ssc.Ingress.Annotations[BackendWeightsAnnotationKey] = tc.actualWeights
894+
ssc.Ingress.Annotations[traffic.DefaultBackendWeightsAnnotationKey] = tc.actualWeights
889895
}
890896

891-
err := ssc.UpdateFromResources(traffic.DefaultBackendWeightsAnnotationKey)
897+
err := ssc.UpdateFromResources(false, traffic.DefaultBackendWeightsAnnotationKey)
892898
require.NoError(t, err)
893899
require.False(t, ssc.stacksetManagesTraffic)
894900

@@ -915,6 +921,7 @@ func TestGenerateStackSetStatus(t *testing.T) {
915921
"v4": testStack("v4").stack(),
916922
"v5": testStack("v5").ready(3).traffic(20, 10).stack(),
917923
},
924+
backendWeightsAnnotationKey: traffic.DefaultBackendWeightsAnnotationKey,
918925
}
919926

920927
expected := &zv1.StackSetStatus{
@@ -998,7 +1005,8 @@ func TestGenerateStackSetTraffic(t *testing.T) {
9981005
"v4": testStack("v4").stack(),
9991006
"v5": testStack("v5").ready(3).traffic(20, 10).stack(),
10001007
},
1001-
stacksetManagesTraffic: tc.managesTraffic,
1008+
stacksetManagesTraffic: tc.managesTraffic,
1009+
backendWeightsAnnotationKey: traffic.DefaultBackendWeightsAnnotationKey,
10021010
}
10031011

10041012
require.Equal(t, tc.expected, c.GenerateStackSetTraffic())
@@ -1059,7 +1067,8 @@ func TestStackSetGenerateIngress(t *testing.T) {
10591067
"v3": testStack("foo-v3").traffic(0.625, 0.625).stack(),
10601068
"v4": testStack("foo-v4").traffic(0, 0).stack(),
10611069
},
1062-
stacksetManagesTraffic: tc.stacksetManagesTraffic,
1070+
stacksetManagesTraffic: tc.stacksetManagesTraffic,
1071+
backendWeightsAnnotationKey: traffic.DefaultBackendWeightsAnnotationKey,
10631072
}
10641073
ingress, err := c.GenerateIngress()
10651074
require.NoError(t, err)
@@ -1164,7 +1173,8 @@ func TestStackSetGenerateIngress(t *testing.T) {
11641173

11651174
func TestStackSetGenerateIngressNone(t *testing.T) {
11661175
c := &StackSetContainer{
1167-
StackSet: &zv1.StackSet{},
1176+
StackSet: &zv1.StackSet{},
1177+
backendWeightsAnnotationKey: traffic.DefaultBackendWeightsAnnotationKey,
11681178
}
11691179
ingress, err := c.GenerateIngress()
11701180
require.NoError(t, err)

pkg/core/traffic.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,6 @@ import (
44
"time"
55
)
66

7-
const (
8-
stackTrafficWeightsAnnotationKey = "zalando.org/stack-traffic-weights"
9-
BackendWeightsAnnotationKey = "zalando.org/backend-weights"
10-
)
11-
127
type TrafficReconciler interface {
138
// Handle the traffic switching and/or scaling logic.
149
Reconcile(stacks map[string]*StackContainer, currentTimestamp time.Time) error

pkg/core/types.go

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"time"
99

1010
zv1 "github.com/zalando-incubator/stackset-controller/pkg/apis/zalando.org/v1"
11+
"github.com/zalando-incubator/stackset-controller/pkg/traffic"
1112
appsv1 "k8s.io/api/apps/v1"
1213
autoscaling "k8s.io/api/autoscaling/v2beta1"
1314
v1 "k8s.io/api/core/v1"
@@ -53,6 +54,11 @@ type StackSetContainer struct {
5354

5455
// Whether the stackset should be authoritative for the traffic, and not the ingress
5556
stacksetManagesTraffic bool
57+
58+
// backendWeightsAnnotationKey to store the runtime decision
59+
// which annotation is used, defaults to
60+
// traffic.DefaultBackendWeightsAnnotationKey
61+
backendWeightsAnnotationKey string
5662
}
5763

5864
// StackContainer is a container for storing the full state of a Stack
@@ -180,7 +186,7 @@ func (ssc *StackSetContainer) stackByName(name string) *StackContainer {
180186

181187
// updateDesiredTrafficFromIngress updates traffic weights of stack containers from the ingress object
182188
func (ssc *StackSetContainer) updateDesiredTrafficFromIngress() error {
183-
desired, err := ssc.getNormalizedTrafficFromIngress(stackTrafficWeightsAnnotationKey)
189+
desired, err := ssc.getNormalizedTrafficFromIngress(traffic.StackTrafficWeightsAnnotationKey)
184190
if err != nil {
185191
return fmt.Errorf("failed to get current actual Stack traffic weights: %v", err)
186192
}
@@ -192,8 +198,8 @@ func (ssc *StackSetContainer) updateDesiredTrafficFromIngress() error {
192198
return nil
193199
}
194200

195-
func (ssc *StackSetContainer) updateActualTrafficFromIngress(backendWeightsAnnotationKey string) error {
196-
actual, err := ssc.getNormalizedTrafficFromIngress(backendWeightsAnnotationKey)
201+
func (ssc *StackSetContainer) updateActualTrafficFromIngress() error {
202+
actual, err := ssc.getNormalizedTrafficFromIngress(ssc.backendWeightsAnnotationKey)
197203
if err != nil {
198204
return fmt.Errorf("failed to get current actual Stack traffic weights: %v", err)
199205
}
@@ -318,7 +324,10 @@ func (ssc *StackSetContainer) updateActualTrafficFromStackSet() error {
318324
}
319325

320326
// UpdateFromResources populates stack state information (e.g. replica counts or traffic) from related resources
321-
func (ssc *StackSetContainer) UpdateFromResources(backendWeightsAnnotationKey string) error {
327+
func (ssc *StackSetContainer) UpdateFromResources(stacksetManageTraffic bool, backendWeightsAnnotationKey string) error {
328+
ssc.stacksetManagesTraffic = stacksetManageTraffic
329+
ssc.backendWeightsAnnotationKey = backendWeightsAnnotationKey
330+
322331
if len(ssc.StackContainers) == 0 {
323332
return nil
324333
}
@@ -370,7 +379,7 @@ func (ssc *StackSetContainer) UpdateFromResources(backendWeightsAnnotationKey st
370379
}
371380

372381
// TODO(sszuecs): delete until end of function, if we drop ingress based desired traffic. For step1 we need the fallback but update the stackset status, too
373-
return ssc.updateActualTrafficFromIngress(backendWeightsAnnotationKey)
382+
return ssc.updateActualTrafficFromIngress()
374383
}
375384

376385
return nil

pkg/traffic/traffic.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313

1414
const (
1515
stacksetHeritageLabelKey = "stackset"
16-
stackTrafficWeightsAnnotationKey = "zalando.org/stack-traffic-weights"
16+
StackTrafficWeightsAnnotationKey = "zalando.org/stack-traffic-weights"
1717
DefaultBackendWeightsAnnotationKey = "zalando.org/backend-weights"
1818
)
1919

@@ -62,7 +62,7 @@ func (t *Switcher) Switch(stackset, stack, namespace string, weight float64) ([]
6262
annotation := map[string]map[string]map[string]string{
6363
"metadata": map[string]map[string]string{
6464
"annotations": map[string]string{
65-
stackTrafficWeightsAnnotationKey: string(stackWeightsData),
65+
StackTrafficWeightsAnnotationKey: string(stackWeightsData),
6666
},
6767
},
6868
}
@@ -139,7 +139,7 @@ func (t *Switcher) getIngressTraffic(name, namespace string, stacks []zv1.Stack)
139139
}
140140

141141
desiredTraffic := make(map[string]float64, len(stacks))
142-
if weights, ok := ingress.Annotations[stackTrafficWeightsAnnotationKey]; ok {
142+
if weights, ok := ingress.Annotations[StackTrafficWeightsAnnotationKey]; ok {
143143
err := json.Unmarshal([]byte(weights), &desiredTraffic)
144144
if err != nil {
145145
return nil, nil, fmt.Errorf("failed to get current desired Stack traffic weights: %v", err)

0 commit comments

Comments
 (0)