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  }