github.phpd.cn/cilium/cilium@v1.6.12/pkg/aws/eni/instances_test.go (about) 1 // Copyright 2019 Authors of Cilium 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 // +build !privileged_tests 16 17 package eni 18 19 import ( 20 metricsmock "github.com/cilium/cilium/pkg/aws/eni/metrics/mock" 21 "github.com/cilium/cilium/pkg/aws/types" 22 "github.com/cilium/cilium/pkg/k8s/apis/cilium.io/v2" 23 24 "gopkg.in/check.v1" 25 ) 26 27 type instancesApiMock struct { 28 instancesIteration int 29 subnetsIteration int 30 } 31 32 func (i *instancesApiMock) GetInstances(vpcs types.VpcMap, subnets types.SubnetMap) (m types.InstanceMap, err error) { 33 i.instancesIteration++ 34 35 m = types.InstanceMap{} 36 37 m.Add("i-1", &v2.ENI{ 38 ID: "eni-1", 39 IP: "1.1.1.1", 40 Number: 0, 41 SecurityGroups: []string{"sg1", "sg2"}, 42 Addresses: []string{}, 43 Subnet: v2.AwsSubnet{ID: "subnet-1"}, 44 VPC: v2.AwsVPC{ID: "vpc-1"}, 45 }) 46 47 if i.instancesIteration > 1 { 48 m.Add("i-1", &v2.ENI{ 49 ID: "eni-2", 50 IP: "2.2.2.2", 51 Number: 1, 52 SecurityGroups: []string{"sg3", "sg4"}, 53 Addresses: []string{}, 54 Subnet: v2.AwsSubnet{ID: "subnet-1"}, 55 VPC: v2.AwsVPC{ID: "vpc-1"}, 56 }) 57 } 58 59 m.Add("i-2", &v2.ENI{ 60 ID: "eni-3", 61 IP: "3.3.3.3", 62 Number: 0, 63 SecurityGroups: []string{"sg3", "sg4"}, 64 Addresses: []string{}, 65 Subnet: v2.AwsSubnet{ID: "subnet-2"}, 66 VPC: v2.AwsVPC{ID: "vpc-2"}, 67 }) 68 69 return 70 } 71 72 func (i *instancesApiMock) GetVpcs() (v types.VpcMap, err error) { 73 v = types.VpcMap{} 74 75 v["vpc-0"] = &types.Vpc{ 76 ID: "vpc-0", 77 PrimaryCIDR: "1.1.0.0/16", 78 } 79 80 v["vpc-1"] = &types.Vpc{ 81 ID: "vpc-1", 82 PrimaryCIDR: "2.2.0.0/16", 83 } 84 85 return 86 } 87 88 func (i *instancesApiMock) GetSubnets() (s types.SubnetMap, err error) { 89 i.subnetsIteration++ 90 91 s = types.SubnetMap{} 92 93 s["subnet-1"] = &types.Subnet{ 94 ID: "subnet-1", 95 CIDR: "", 96 AvailableAddresses: 10, 97 VpcID: "vpc-1", 98 AvailabilityZone: "us-west-1", 99 Tags: map[string]string{ 100 "tag1": "tag1", 101 }, 102 } 103 104 s["subnet-2"] = &types.Subnet{ 105 ID: "subnet-2", 106 CIDR: "", 107 AvailableAddresses: 20, 108 VpcID: "vpc-2", 109 AvailabilityZone: "us-east-1", 110 Tags: map[string]string{ 111 "tag1": "tag1", 112 }, 113 } 114 115 if i.subnetsIteration > 1 { 116 s["subnet-3"] = &types.Subnet{ 117 ID: "subnet-3", 118 CIDR: "", 119 AvailableAddresses: 0, 120 VpcID: "vpc-1", 121 AvailabilityZone: "us-west-1", 122 Tags: map[string]string{ 123 "tag2": "tag2", 124 }, 125 } 126 } 127 128 return 129 } 130 131 func (e *ENISuite) TestGetSubnet(c *check.C) { 132 mngr := NewInstancesManager(&instancesApiMock{}, metricsmock.NewMockMetrics()) 133 c.Assert(mngr, check.Not(check.IsNil)) 134 135 c.Assert(mngr.GetSubnet("subnet-1"), check.IsNil) 136 c.Assert(mngr.GetSubnet("subnet-2"), check.IsNil) 137 c.Assert(mngr.GetSubnet("subnet-3"), check.IsNil) 138 139 // iteration 1 140 mngr.Resync() 141 142 subnet1 := mngr.GetSubnet("subnet-1") 143 c.Assert(subnet1, check.Not(check.IsNil)) 144 c.Assert(subnet1.ID, check.Equals, "subnet-1") 145 146 subnet2 := mngr.GetSubnet("subnet-2") 147 c.Assert(subnet2, check.Not(check.IsNil)) 148 c.Assert(subnet2.ID, check.Equals, "subnet-2") 149 150 c.Assert(mngr.GetSubnet("subnet-3"), check.IsNil) 151 152 // iteration 2 153 mngr.Resync() 154 155 subnet1 = mngr.GetSubnet("subnet-1") 156 c.Assert(subnet1, check.Not(check.IsNil)) 157 c.Assert(subnet1.ID, check.Equals, "subnet-1") 158 159 subnet2 = mngr.GetSubnet("subnet-2") 160 c.Assert(subnet2, check.Not(check.IsNil)) 161 c.Assert(subnet2.ID, check.Equals, "subnet-2") 162 163 subnet3 := mngr.GetSubnet("subnet-3") 164 c.Assert(subnet3, check.Not(check.IsNil)) 165 c.Assert(subnet3.ID, check.Equals, "subnet-3") 166 } 167 168 func (e *ENISuite) TestFindSubnetByTags(c *check.C) { 169 mngr := NewInstancesManager(&instancesApiMock{}, metricsmock.NewMockMetrics()) 170 c.Assert(mngr, check.Not(check.IsNil)) 171 172 // iteration 1 + 2 173 mngr.Resync() 174 mngr.Resync() 175 176 // exact match subnet-1 177 s := mngr.FindSubnetByTags("vpc-1", "us-west-1", types.Tags{"tag1": "tag1"}) 178 c.Assert(s.ID, check.Equals, "subnet-1") 179 180 // exact match subnet-2 181 s = mngr.FindSubnetByTags("vpc-2", "us-east-1", types.Tags{"tag1": "tag1"}) 182 c.Assert(s.ID, check.Equals, "subnet-2") 183 184 // exact match subnet-3 185 s = mngr.FindSubnetByTags("vpc-1", "us-west-1", types.Tags{"tag2": "tag2"}) 186 c.Assert(s.ID, check.Equals, "subnet-3") 187 188 // both subnet-1 and subnet-3 match, subnet-1 has more addresses 189 s = mngr.FindSubnetByTags("vpc-1", "us-west-1", types.Tags{}) 190 c.Assert(s.ID, check.Equals, "subnet-1") 191 192 // invalid vpc, no match 193 c.Assert(mngr.FindSubnetByTags("vpc-unknown", "us-west-1", types.Tags{"tag1": "tag1"}), check.IsNil) 194 195 // invalid AZ, no match 196 c.Assert(mngr.FindSubnetByTags("vpc-1", "us-west-unknown", types.Tags{"tag1": "tag1"}), check.IsNil) 197 198 // invalid tags, no match 199 c.Assert(mngr.FindSubnetByTags("vpc-1", "us-west-1", types.Tags{"tag1": "unknown value"}), check.IsNil) 200 } 201 202 func (e *ENISuite) TestGetENIs(c *check.C) { 203 mngr := NewInstancesManager(&instancesApiMock{}, metricsmock.NewMockMetrics()) 204 c.Assert(mngr, check.Not(check.IsNil)) 205 206 // iteration 1 207 mngr.Resync() 208 c.Assert(len(mngr.GetENIs("i-1")), check.Equals, 1) 209 c.Assert(len(mngr.GetENIs("i-2")), check.Equals, 1) 210 c.Assert(len(mngr.GetENIs("i-unknown")), check.Equals, 0) 211 212 // iteration 2 213 mngr.Resync() 214 c.Assert(len(mngr.GetENIs("i-1")), check.Equals, 2) 215 c.Assert(len(mngr.GetENIs("i-2")), check.Equals, 1) 216 c.Assert(len(mngr.GetENIs("i-unknown")), check.Equals, 0) 217 } 218 219 func (e *ENISuite) TestGetENI(c *check.C) { 220 mngr := NewInstancesManager(&instancesApiMock{}, metricsmock.NewMockMetrics()) 221 c.Assert(mngr, check.Not(check.IsNil)) 222 223 // iteration 1 224 mngr.Resync() 225 c.Assert(mngr.GetENI("i-1", 0), check.Not(check.IsNil)) 226 c.Assert(mngr.GetENI("i-1", 1), check.IsNil) 227 c.Assert(mngr.GetENI("i-2", 0), check.Not(check.IsNil)) 228 229 // iteration 2 230 mngr.Resync() 231 c.Assert(mngr.GetENI("i-1", 0), check.Not(check.IsNil)) 232 c.Assert(mngr.GetENI("i-1", 1), check.Not(check.IsNil)) 233 c.Assert(mngr.GetENI("i-2", 0), check.Not(check.IsNil)) 234 }