istio.io/istio@v0.0.0-20240520182934-d79c90f27776/pilot/pkg/serviceregistry/kube/controller/endpoint_builder_test.go (about) 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 15 package controller 16 17 import ( 18 "testing" 19 20 core "github.com/envoyproxy/go-control-plane/envoy/config/core/v3" 21 v1 "k8s.io/api/core/v1" 22 23 "istio.io/api/label" 24 "istio.io/istio/pilot/pkg/model" 25 cluster2 "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 31 func TestNewEndpointBuilderTopologyLabels(t *testing.T) { 32 cases := []struct { 33 name string 34 ctl testController 35 podLabels labels.Instance 36 expected labels.Instance 37 }{ 38 { 39 name: "empty", 40 ctl: testController{}, 41 podLabels: nil, 42 expected: labels.Instance{}, 43 }, 44 { 45 name: "region only", 46 ctl: testController{ 47 locality: "myregion", 48 }, 49 podLabels: labels.Instance{ 50 "k1": "v1", 51 label.TopologyNetwork.Name: "mynetwork", 52 }, 53 expected: labels.Instance{ 54 "k1": "v1", 55 NodeRegionLabelGA: "myregion", 56 label.TopologyNetwork.Name: "mynetwork", 57 }, 58 }, 59 { 60 name: "region and zone", 61 ctl: testController{ 62 locality: "myregion/myzone", 63 }, 64 podLabels: labels.Instance{ 65 "k1": "v1", 66 label.TopologyNetwork.Name: "mynetwork", 67 }, 68 expected: labels.Instance{ 69 "k1": "v1", 70 NodeRegionLabelGA: "myregion", 71 NodeZoneLabelGA: "myzone", 72 label.TopologyNetwork.Name: "mynetwork", 73 }, 74 }, 75 { 76 name: "network only ", 77 ctl: testController{ 78 network: "mynetwork", 79 }, 80 podLabels: labels.Instance{ 81 "k1": "v1", 82 }, 83 expected: labels.Instance{ 84 "k1": "v1", 85 label.TopologyNetwork.Name: "mynetwork", 86 }, 87 }, 88 { 89 name: "network priority", 90 ctl: testController{ 91 network: "ns-network", 92 }, 93 podLabels: labels.Instance{ 94 label.TopologyNetwork.Name: "pod-network", 95 }, 96 expected: labels.Instance{ 97 label.TopologyNetwork.Name: "pod-network", 98 }, 99 }, 100 { 101 name: "all values", 102 ctl: testController{ 103 locality: "myregion/myzone/mysubzone", 104 cluster: "mycluster", 105 network: "mynetwork", 106 }, 107 podLabels: labels.Instance{ 108 "k1": "v1", 109 label.TopologyNetwork.Name: "mynetwork", 110 }, 111 expected: labels.Instance{ 112 "k1": "v1", 113 NodeRegionLabelGA: "myregion", 114 NodeZoneLabelGA: "myzone", 115 label.TopologySubzone.Name: "mysubzone", 116 label.TopologyCluster.Name: "mycluster", 117 label.TopologyNetwork.Name: "mynetwork", 118 }, 119 }, 120 } 121 122 for _, c := range cases { 123 t.Run(c.name, func(t *testing.T) { 124 pod := v1.Pod{} 125 pod.Name = "testpod" 126 pod.Namespace = "testns" 127 pod.Spec.ServiceAccountName = "testsan" 128 pod.Labels = c.podLabels 129 130 eb := NewEndpointBuilder(c.ctl, &pod) 131 132 assert.Equal(t, eb.labels, c.expected) 133 }) 134 } 135 } 136 137 func TestNewEndpointBuilderFromMetadataTopologyLabels(t *testing.T) { 138 cases := []struct { 139 name string 140 ctl testController 141 proxy *model.Proxy 142 expected labels.Instance 143 }{ 144 { 145 name: "empty", 146 ctl: testController{}, 147 proxy: &model.Proxy{ 148 Metadata: &model.NodeMetadata{}, 149 }, 150 expected: labels.Instance{}, 151 }, 152 { 153 name: "region only", 154 ctl: testController{}, 155 proxy: &model.Proxy{ 156 Labels: labels.Instance{ 157 "k1": "v1", 158 label.TopologyNetwork.Name: "mynetwork", 159 }, 160 Metadata: &model.NodeMetadata{ 161 Labels: labels.Instance{ 162 "k1": "v1", 163 label.TopologyNetwork.Name: "mynetwork", 164 }, 165 }, 166 Locality: &core.Locality{ 167 Region: "myregion", 168 }, 169 }, 170 expected: labels.Instance{ 171 "k1": "v1", 172 NodeRegionLabelGA: "myregion", 173 label.TopologyNetwork.Name: "mynetwork", 174 }, 175 }, 176 { 177 name: "region and zone", 178 ctl: testController{}, 179 proxy: &model.Proxy{ 180 Labels: labels.Instance{ 181 "k1": "v1", 182 label.TopologyNetwork.Name: "mynetwork", 183 }, 184 Metadata: &model.NodeMetadata{ 185 Labels: labels.Instance{ 186 "k1": "v1", 187 label.TopologyNetwork.Name: "mynetwork", 188 }, 189 }, 190 Locality: &core.Locality{ 191 Region: "myregion", 192 Zone: "myzone", 193 }, 194 }, 195 expected: labels.Instance{ 196 "k1": "v1", 197 NodeRegionLabelGA: "myregion", 198 NodeZoneLabelGA: "myzone", 199 label.TopologyNetwork.Name: "mynetwork", 200 }, 201 }, 202 { 203 name: "all values set", 204 ctl: testController{ 205 cluster: "mycluster", 206 }, 207 proxy: &model.Proxy{ 208 Labels: labels.Instance{ 209 "k1": "v1", 210 label.TopologyNetwork.Name: "mynetwork", 211 }, 212 Metadata: &model.NodeMetadata{ 213 Labels: labels.Instance{ 214 "k1": "v1", 215 label.TopologyNetwork.Name: "mynetwork", 216 }, 217 }, 218 Locality: &core.Locality{ 219 Region: "myregion", 220 Zone: "myzone", 221 SubZone: "mysubzone", 222 }, 223 }, 224 expected: labels.Instance{ 225 "k1": "v1", 226 NodeRegionLabelGA: "myregion", 227 NodeZoneLabelGA: "myzone", 228 label.TopologySubzone.Name: "mysubzone", 229 label.TopologyCluster.Name: "mycluster", 230 label.TopologyNetwork.Name: "mynetwork", 231 }, 232 }, 233 } 234 235 for _, c := range cases { 236 t.Run(c.name, func(t *testing.T) { 237 eb := NewEndpointBuilderFromMetadata(c.ctl, c.proxy) 238 239 assert.Equal(t, eb.labels, c.expected) 240 }) 241 } 242 } 243 244 var _ controllerInterface = testController{} 245 246 type testController struct { 247 locality string 248 cluster cluster2.ID 249 network network.ID 250 } 251 252 func (c testController) getPodLocality(*v1.Pod) string { 253 return c.locality 254 } 255 256 func (c testController) Network(ip string, instance labels.Instance) network.ID { 257 if n := instance[label.TopologyNetwork.Name]; n != "" { 258 return network.ID(n) 259 } 260 return c.network 261 } 262 263 func (c testController) Cluster() cluster2.ID { 264 return c.cluster 265 }