istio
265 строк · 6.4 Кб
1// Copyright Istio Authors. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package controller
16
17import (
18"testing"
19
20core "github.com/envoyproxy/go-control-plane/envoy/config/core/v3"
21v1 "k8s.io/api/core/v1"
22
23"istio.io/api/label"
24"istio.io/istio/pilot/pkg/model"
25cluster2 "istio.io/istio/pkg/cluster"
26"istio.io/istio/pkg/config/labels"
27"istio.io/istio/pkg/network"
28"istio.io/istio/pkg/test/util/assert"
29)
30
31func TestNewEndpointBuilderTopologyLabels(t *testing.T) {
32cases := []struct {
33name string
34ctl testController
35podLabels labels.Instance
36expected labels.Instance
37}{
38{
39name: "empty",
40ctl: testController{},
41podLabels: nil,
42expected: labels.Instance{},
43},
44{
45name: "region only",
46ctl: testController{
47locality: "myregion",
48},
49podLabels: labels.Instance{
50"k1": "v1",
51label.TopologyNetwork.Name: "mynetwork",
52},
53expected: labels.Instance{
54"k1": "v1",
55NodeRegionLabelGA: "myregion",
56label.TopologyNetwork.Name: "mynetwork",
57},
58},
59{
60name: "region and zone",
61ctl: testController{
62locality: "myregion/myzone",
63},
64podLabels: labels.Instance{
65"k1": "v1",
66label.TopologyNetwork.Name: "mynetwork",
67},
68expected: labels.Instance{
69"k1": "v1",
70NodeRegionLabelGA: "myregion",
71NodeZoneLabelGA: "myzone",
72label.TopologyNetwork.Name: "mynetwork",
73},
74},
75{
76name: "network only ",
77ctl: testController{
78network: "mynetwork",
79},
80podLabels: labels.Instance{
81"k1": "v1",
82},
83expected: labels.Instance{
84"k1": "v1",
85label.TopologyNetwork.Name: "mynetwork",
86},
87},
88{
89name: "network priority",
90ctl: testController{
91network: "ns-network",
92},
93podLabels: labels.Instance{
94label.TopologyNetwork.Name: "pod-network",
95},
96expected: labels.Instance{
97label.TopologyNetwork.Name: "pod-network",
98},
99},
100{
101name: "all values",
102ctl: testController{
103locality: "myregion/myzone/mysubzone",
104cluster: "mycluster",
105network: "mynetwork",
106},
107podLabels: labels.Instance{
108"k1": "v1",
109label.TopologyNetwork.Name: "mynetwork",
110},
111expected: labels.Instance{
112"k1": "v1",
113NodeRegionLabelGA: "myregion",
114NodeZoneLabelGA: "myzone",
115label.TopologySubzone.Name: "mysubzone",
116label.TopologyCluster.Name: "mycluster",
117label.TopologyNetwork.Name: "mynetwork",
118},
119},
120}
121
122for _, c := range cases {
123t.Run(c.name, func(t *testing.T) {
124pod := v1.Pod{}
125pod.Name = "testpod"
126pod.Namespace = "testns"
127pod.Spec.ServiceAccountName = "testsan"
128pod.Labels = c.podLabels
129
130eb := NewEndpointBuilder(c.ctl, &pod)
131
132assert.Equal(t, eb.labels, c.expected)
133})
134}
135}
136
137func TestNewEndpointBuilderFromMetadataTopologyLabels(t *testing.T) {
138cases := []struct {
139name string
140ctl testController
141proxy *model.Proxy
142expected labels.Instance
143}{
144{
145name: "empty",
146ctl: testController{},
147proxy: &model.Proxy{
148Metadata: &model.NodeMetadata{},
149},
150expected: labels.Instance{},
151},
152{
153name: "region only",
154ctl: testController{},
155proxy: &model.Proxy{
156Labels: labels.Instance{
157"k1": "v1",
158label.TopologyNetwork.Name: "mynetwork",
159},
160Metadata: &model.NodeMetadata{
161Labels: labels.Instance{
162"k1": "v1",
163label.TopologyNetwork.Name: "mynetwork",
164},
165},
166Locality: &core.Locality{
167Region: "myregion",
168},
169},
170expected: labels.Instance{
171"k1": "v1",
172NodeRegionLabelGA: "myregion",
173label.TopologyNetwork.Name: "mynetwork",
174},
175},
176{
177name: "region and zone",
178ctl: testController{},
179proxy: &model.Proxy{
180Labels: labels.Instance{
181"k1": "v1",
182label.TopologyNetwork.Name: "mynetwork",
183},
184Metadata: &model.NodeMetadata{
185Labels: labels.Instance{
186"k1": "v1",
187label.TopologyNetwork.Name: "mynetwork",
188},
189},
190Locality: &core.Locality{
191Region: "myregion",
192Zone: "myzone",
193},
194},
195expected: labels.Instance{
196"k1": "v1",
197NodeRegionLabelGA: "myregion",
198NodeZoneLabelGA: "myzone",
199label.TopologyNetwork.Name: "mynetwork",
200},
201},
202{
203name: "all values set",
204ctl: testController{
205cluster: "mycluster",
206},
207proxy: &model.Proxy{
208Labels: labels.Instance{
209"k1": "v1",
210label.TopologyNetwork.Name: "mynetwork",
211},
212Metadata: &model.NodeMetadata{
213Labels: labels.Instance{
214"k1": "v1",
215label.TopologyNetwork.Name: "mynetwork",
216},
217},
218Locality: &core.Locality{
219Region: "myregion",
220Zone: "myzone",
221SubZone: "mysubzone",
222},
223},
224expected: labels.Instance{
225"k1": "v1",
226NodeRegionLabelGA: "myregion",
227NodeZoneLabelGA: "myzone",
228label.TopologySubzone.Name: "mysubzone",
229label.TopologyCluster.Name: "mycluster",
230label.TopologyNetwork.Name: "mynetwork",
231},
232},
233}
234
235for _, c := range cases {
236t.Run(c.name, func(t *testing.T) {
237eb := NewEndpointBuilderFromMetadata(c.ctl, c.proxy)
238
239assert.Equal(t, eb.labels, c.expected)
240})
241}
242}
243
244var _ controllerInterface = testController{}
245
246type testController struct {
247locality string
248cluster cluster2.ID
249network network.ID
250}
251
252func (c testController) getPodLocality(*v1.Pod) string {
253return c.locality
254}
255
256func (c testController) Network(ip string, instance labels.Instance) network.ID {
257if n := instance[label.TopologyNetwork.Name]; n != "" {
258return network.ID(n)
259}
260return c.network
261}
262
263func (c testController) Cluster() cluster2.ID {
264return c.cluster
265}
266