forked from linkerd/linkerd2
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtraffic_split_adaptor_test.go
116 lines (97 loc) · 2.95 KB
/
traffic_split_adaptor_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package destination
import (
"encoding/json"
"reflect"
"testing"
ts "github.com/deislabs/smi-sdk-go/pkg/apis/split/v1alpha1"
"github.com/linkerd/linkerd2/controller/api/destination/watcher"
sp "github.com/linkerd/linkerd2/controller/gen/apis/serviceprofile/v1alpha2"
"k8s.io/apimachinery/pkg/api/resource"
)
func TestTrafficSplitAdaptor(t *testing.T) {
profile := &sp.ServiceProfile{
Spec: sp.ServiceProfileSpec{
Routes: []*sp.RouteSpec{
{
Name: "route",
},
},
DstOverrides: []*sp.WeightedDst{
{
Authority: "foo",
Weight: resource.MustParse("500m"),
},
},
},
}
split := &ts.TrafficSplit{
Spec: ts.TrafficSplitSpec{
Backends: []ts.TrafficSplitBackend{
{
Service: "bar",
Weight: resource.MustParse("1000m"),
},
},
},
}
t.Run("Profile update", func(t *testing.T) {
listener := watcher.NewBufferingProfileListener()
adaptor := newTrafficSplitAdaptor(listener, watcher.ServiceID{Name: "foo", Namespace: "ns"}, watcher.Port(80), "cluster.local")
adaptor.Update(profile)
if len(listener.Profiles) != 1 {
t.Fatalf("Expected one profile updated, got %d", len(listener.Profiles))
}
testCompare(t, profile.Spec, listener.Profiles[0].Spec)
})
t.Run("Traffic split without profile", func(t *testing.T) {
listener := watcher.NewBufferingProfileListener()
adaptor := newTrafficSplitAdaptor(listener, watcher.ServiceID{Name: "foo", Namespace: "ns"}, watcher.Port(80), "cluster.local")
adaptor.UpdateTrafficSplit(split)
if len(listener.Profiles) != 1 {
t.Fatalf("Expected one profile updated, got %d", len(listener.Profiles))
}
expected := &sp.ServiceProfile{
Spec: sp.ServiceProfileSpec{
DstOverrides: []*sp.WeightedDst{
{
Authority: "bar.ns.svc.cluster.local.:80",
Weight: resource.MustParse("1000m"),
},
},
},
}
testCompare(t, expected.Spec, listener.Profiles[0].Spec)
})
t.Run("Profile merged with traffic split", func(t *testing.T) {
listener := watcher.NewBufferingProfileListener()
adaptor := newTrafficSplitAdaptor(listener, watcher.ServiceID{Name: "foo", Namespace: "ns"}, watcher.Port(80), "cluster.local")
adaptor.Update(profile)
adaptor.UpdateTrafficSplit(split)
if len(listener.Profiles) != 2 {
t.Fatalf("Expected two profile updated, got %d", len(listener.Profiles))
}
expected := &sp.ServiceProfile{
Spec: sp.ServiceProfileSpec{
Routes: []*sp.RouteSpec{
{
Name: "route",
},
},
DstOverrides: []*sp.WeightedDst{
{
Authority: "bar.ns.svc.cluster.local.:80",
Weight: resource.MustParse("1000m"),
},
},
},
}
testCompare(t, expected.Spec, listener.Profiles[1].Spec)
})
}
func testCompare(t *testing.T, expected interface{}, actual interface{}) {
if !reflect.DeepEqual(expected, actual) {
expectedBytes, _ := json.Marshal(expected)
actualBytes, _ := json.Marshal(actual)
t.Fatalf("Expected %s but got %s", string(expectedBytes), string(actualBytes))
}
}