Skip to content
This repository was archived by the owner on Jan 28, 2025. It is now read-only.

Commit accec27

Browse files
Implement traefil support
Signed-off-by: PhilippPlotnikov <[email protected]>
1 parent cd8a86f commit accec27

File tree

1 file changed

+72
-11
lines changed

1 file changed

+72
-11
lines changed

rollout/trafficrouting/traefik/traefik.go

Lines changed: 72 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"context"
55
"strings"
66

7+
"github.com/pkg/errors"
8+
79
"github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1"
810
"github.com/argoproj/argo-rollouts/utils/defaults"
911
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -71,36 +73,95 @@ func (r *Reconciler) SetWeight(desiredWeight int32, additionalDestinations ...v1
7173
rollout := r.Rollout
7274
traefikServiceName := rollout.Spec.Strategy.Canary.TrafficRouting.Traefik.Service
7375
traefikService, err := r.Client.Get(ctx, traefikServiceName, metav1.GetOptions{})
74-
desiredTraefikService := traefikService.DeepCopy()
75-
canaryServiceName := rollout.Spec.Strategy.Canary.CanaryService
7676
if err != nil {
7777
return err
7878
}
79+
canaryServiceName := rollout.Spec.Strategy.Canary.CanaryService
80+
stableServiceName := rollout.Spec.Strategy.Canary.StableService
7981
services, isFound, err := unstructured.NestedSlice(traefikService.Object, "spec", "weighted", "services")
8082
if err != nil || !isFound {
8183
return err
8284
}
8385
for _, service := range services {
84-
serviceTest, ok := service.(map[string]interface{})
86+
typedService, ok := service.(map[string]interface{})
8587
if !ok {
86-
continue
88+
return errors.New("Failed type assertion setting weight for traefik service")
89+
}
90+
serviceName, isFound, err := unstructured.NestedString(typedService, "name")
91+
if err != nil || !isFound {
92+
return err
8793
}
88-
serviceName, _, _ := unstructured.NestedString(serviceTest, "name")
8994
if serviceName == canaryServiceName {
90-
unstructured.SetNestedField(serviceTest, int64(desiredWeight), "weight")
91-
break
95+
err := unstructured.SetNestedField(typedService, int64(desiredWeight), "weight")
96+
if err != nil {
97+
return err
98+
}
99+
continue
100+
}
101+
if serviceName == stableServiceName {
102+
err := unstructured.SetNestedField(typedService, int64(100-desiredWeight), "weight")
103+
if err != nil {
104+
return err
105+
}
106+
continue
92107
}
93108
}
94-
err = unstructured.SetNestedSlice(desiredTraefikService.Object, services, "spec", "weighted", "services")
109+
err = unstructured.SetNestedSlice(traefikService.Object, services, "spec", "weighted", "services")
95110
if err != nil {
96111
return err
97112
}
98-
r.Client.Create(ctx, desiredTraefikService, metav1.CreateOptions{})
99-
return nil
113+
_, err = r.Client.Update(ctx, traefikService, metav1.UpdateOptions{})
114+
return err
100115
}
101116

102117
func (r *Reconciler) VerifyWeight(desiredWeight int32, additionalDestinations ...v1alpha1.WeightDestination) (*bool, error) {
103-
return nil, nil
118+
ctx := context.TODO()
119+
verifyingStatus := false
120+
rollout := r.Rollout
121+
traefikServiceName := rollout.Spec.Strategy.Canary.TrafficRouting.Traefik.Service
122+
traefikService, err := r.Client.Get(ctx, traefikServiceName, metav1.GetOptions{})
123+
if err != nil {
124+
return &verifyingStatus, err
125+
}
126+
canaryServiceName := rollout.Spec.Strategy.Canary.CanaryService
127+
stableServiceName := rollout.Spec.Strategy.Canary.StableService
128+
services, isFound, err := unstructured.NestedSlice(traefikService.Object, "spec", "weighted", "services")
129+
if err != nil || !isFound {
130+
return &verifyingStatus, err
131+
}
132+
for _, service := range services {
133+
typedService, ok := service.(map[string]interface{})
134+
if !ok {
135+
return &verifyingStatus, errors.New("Failed type assertion setting weight for traefik service")
136+
}
137+
serviceName, isFound, err := unstructured.NestedString(typedService, "name")
138+
if err != nil || !isFound {
139+
return &verifyingStatus, err
140+
}
141+
if serviceName == canaryServiceName {
142+
verifyingStatus = false
143+
weight, isFound, err := unstructured.NestedInt64(typedService, "weight")
144+
if err != nil || !isFound {
145+
return &verifyingStatus, err
146+
}
147+
verifyingStatus = weight == int64(desiredWeight)
148+
if !verifyingStatus {
149+
return &verifyingStatus, errors.New("Traefik service weight for canary service is not right")
150+
}
151+
}
152+
if serviceName == stableServiceName {
153+
verifyingStatus = false
154+
weight, isFound, err := unstructured.NestedInt64(typedService, "weight")
155+
if err != nil || !isFound {
156+
return &verifyingStatus, err
157+
}
158+
verifyingStatus = weight == int64(100-desiredWeight)
159+
if !verifyingStatus {
160+
return &verifyingStatus, errors.New("Traefik service weight for canary service is not right")
161+
}
162+
}
163+
}
164+
return &verifyingStatus, nil
104165
}
105166

106167
func (r *Reconciler) Type() string {

0 commit comments

Comments
 (0)