From ac4884a0d6ee30245d97062eecdf6394aca95105 Mon Sep 17 00:00:00 2001 From: Fawad Khaliq Date: Thu, 6 Aug 2020 22:17:52 +0000 Subject: [PATCH 1/2] Use docker/CRI to discover pods at node init --- .gitignore | 1 + Makefile | 2 + cmd/aws-k8s-agent/main.go | 5 +- .../driver/driver_test.go | 2 +- go.sum | 1 + pkg/cri/cri.go | 39 +++++++-- pkg/ipamd/datastore/data_store.go | 46 +++++------ pkg/ipamd/datastore/data_store_test.go | 30 +++---- pkg/ipamd/ipamd.go | 80 ++++--------------- pkg/ipamd/ipamd_test.go | 51 +++++------- pkg/ipamd/rpc_handler.go | 12 +-- pkg/k8sapi/mocks/k8sapi_mocks.go | 3 +- 12 files changed, 123 insertions(+), 149 deletions(-) diff --git a/.gitignore b/.gitignore index 8ccf2dc3c3..4086409319 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ aws-k8s-agent aws-cni verify-aws verify-network +coverage.txt *~ *.swp .idea/ diff --git a/Makefile b/Makefile index cc46fbfa60..eac6577f8a 100644 --- a/Makefile +++ b/Makefile @@ -114,10 +114,12 @@ docker-func-test: docker "$(IMAGE_NAME)" # Run unit tests +unit-test: export AWS_VPC_K8S_CNI_LOG_FILE=stdout unit-test: go test -v -coverprofile=coverage.txt -covermode=atomic $(ALLPKGS) # Run unit tests with race detection (can only be run natively) +unit-test-race: export AWS_VPC_K8S_CNI_LOG_FILE=stdout unit-test-race: CGO_ENABLED=1 unit-test-race: GOARCH= unit-test-race: diff --git a/cmd/aws-k8s-agent/main.go b/cmd/aws-k8s-agent/main.go index e0da594491..c6b731d543 100644 --- a/cmd/aws-k8s-agent/main.go +++ b/cmd/aws-k8s-agent/main.go @@ -45,15 +45,12 @@ func _main() int { return 1 } - discoverController := k8sapi.NewController(kubeClient) - go discoverController.DiscoverLocalK8SPods() - eniConfigController := eniconfig.NewENIConfigController() if ipamd.UseCustomNetworkCfg() { go eniConfigController.Start() } - ipamContext, err := ipamd.New(discoverController, eniConfigController) + ipamContext, err := ipamd.New(kubeClient, eniConfigController) if err != nil { log.Errorf("Initialization failure: %v", err) diff --git a/cmd/routed-eni-cni-plugin/driver/driver_test.go b/cmd/routed-eni-cni-plugin/driver/driver_test.go index ab613e2ec4..6e375b1482 100644 --- a/cmd/routed-eni-cni-plugin/driver/driver_test.go +++ b/cmd/routed-eni-cni-plugin/driver/driver_test.go @@ -48,7 +48,7 @@ const ( var logConfig = logger.Configuration{ BinaryName: "aws-cni", LogLevel: "Debug", - LogLocation: "/var/log/test.log", + LogLocation: "stdout", } var log = logger.New(&logConfig) diff --git a/go.sum b/go.sum index 6d306cc148..8847d86cc9 100644 --- a/go.sum +++ b/go.sum @@ -237,6 +237,7 @@ google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.28.0 h1:bO/TA4OxCOummhSf10siHuG7vJOiwh7SpRpFZDkOgl4= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.0 h1:2pJjwYOdkZ9HlN4sWRYBg9ttH5bCOlsueaM+b/oYjwo= google.golang.org/grpc v1.29.0/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/pkg/cri/cri.go b/pkg/cri/cri.go index b50e7b05c7..fd3e5173dc 100644 --- a/pkg/cri/cri.go +++ b/pkg/cri/cri.go @@ -30,10 +30,16 @@ const ( // SandboxInfo provides container information type SandboxInfo struct { - ID string + // ID of the PodSandbox + ID string + // IP address of the PodSandbox + IP string + // Pod namespace of the sandbox Namespace string - Name string - K8SUID string + // Pod name of the sandbox + Name string + // Pod UID of the sandbox + K8SUID string } type APIs interface { @@ -48,6 +54,8 @@ func New() *Client { //GetRunningPodSandboxes get running sandboxIDs func (c *Client) GetRunningPodSandboxes(log logger.Logger) (map[string]*SandboxInfo, error) { + ctx := context.TODO() + socketPath := dockerSocketPath if info, err := os.Stat("/var/run/cri.sock"); err == nil && !info.IsDir() { socketPath = criSocketPath @@ -67,18 +75,35 @@ func (c *Client) GetRunningPodSandboxes(log logger.Logger) (map[string]*SandboxI State: runtimeapi.PodSandboxState_SANDBOX_READY, }, } - sandboxes, err := client.ListPodSandbox(context.Background(), &runtimeapi.ListPodSandboxRequest{Filter: filter}) + sandboxes, err := client.ListPodSandbox(ctx, &runtimeapi.ListPodSandboxRequest{Filter: filter}) if err != nil { return nil, err } sandboxInfos := make(map[string]*SandboxInfo) - for _, sandbox := range sandboxes.Items { + for _, sandbox := range sandboxes.GetItems() { if sandbox.Metadata == nil { continue } uid := sandbox.Metadata.Uid + status, err := client.PodSandboxStatus(ctx, &runtimeapi.PodSandboxStatusRequest{ + PodSandboxId: sandbox.GetId(), + }) + if err != nil { + return nil, err + } + + if state := status.GetStatus().GetState(); state != runtimeapi.PodSandboxState_SANDBOX_READY { + log.Debugf("Ignoring sandbox %s in unready state %s", sandbox.Id, state) + continue + } + + if netmode := status.GetStatus().GetLinux().GetNamespaces().GetOptions().GetNetwork(); netmode != runtimeapi.NamespaceMode_POD { + log.Debugf("Ignoring sandbox %s with non-pod netns mode %s", sandbox.Id, netmode) + continue + } + // Verify each pod only has one active sandbox. Kubelet will clean this // up if it happens, so we should abort and wait until it does. if other, ok := sandboxInfos[uid]; ok { @@ -88,8 +113,12 @@ func (c *Client) GetRunningPodSandboxes(log logger.Logger) (map[string]*SandboxI return nil, errors.New("UID conflict in container runtime") } + // no dual-stack support here so we only get the IPv4 address + ip := status.GetStatus().GetNetwork().GetIp() + sandboxInfos[uid] = &SandboxInfo{ ID: sandbox.Id, + IP: ip, Namespace: sandbox.Metadata.Namespace, Name: sandbox.Metadata.Name, K8SUID: uid} diff --git a/pkg/ipamd/datastore/data_store.go b/pkg/ipamd/datastore/data_store.go index 4a2bda2941..89e6bd2465 100644 --- a/pkg/ipamd/datastore/data_store.go +++ b/pkg/ipamd/datastore/data_store.go @@ -18,7 +18,7 @@ import ( "sync" "time" - "github.com/aws/amazon-vpc-cni-k8s/pkg/k8sapi" + "github.com/aws/amazon-vpc-cni-k8s/pkg/cri" "github.com/aws/amazon-vpc-cni-k8s/pkg/utils/logger" "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" @@ -263,55 +263,55 @@ func (ds *DataStore) DelIPv4AddressFromStore(eniID string, ipv4 string, force bo // AssignPodIPv4Address assigns an IPv4 address to pod // It returns the assigned IPv4 address, device number, error -func (ds *DataStore) AssignPodIPv4Address(k8sPod *k8sapi.K8SPodInfo) (ip string, deviceNumber int, err error) { +func (ds *DataStore) AssignPodIPv4Address(sandbox *cri.SandboxInfo) (ip string, deviceNumber int, err error) { ds.lock.Lock() defer ds.lock.Unlock() ds.log.Debugf("AssignIPv4Address: IP address pool stats: total: %d, assigned %d", ds.total, ds.assigned) podKey := PodKey{ - name: k8sPod.Name, - namespace: k8sPod.Namespace, - sandbox: k8sPod.Sandbox, + name: sandbox.Name, + namespace: sandbox.Namespace, + sandbox: sandbox.ID, } ipAddr, ok := ds.podsIP[podKey] if ok { - if ipAddr.IP == k8sPod.IP && k8sPod.IP != "" { + if ipAddr.IP == sandbox.IP && sandbox.IP != "" { // The caller invoke multiple times to assign(PodName/NameSpace --> same IPAddress). It is not a error, but not very efficient. ds.log.Infof("AssignPodIPv4Address: duplicate pod assign for IP %s, name %s, namespace %s, sandbox %s", - k8sPod.IP, k8sPod.Name, k8sPod.Namespace, k8sPod.Sandbox) + sandbox.IP, sandbox.Name, sandbox.Namespace, sandbox.ID) return ipAddr.IP, ipAddr.DeviceNumber, nil } ds.log.Errorf("AssignPodIPv4Address: current IP %s is changed to IP %s for pod(name %s, namespace %s, sandbox %s)", - ipAddr, k8sPod.IP, k8sPod.Name, k8sPod.Namespace, k8sPod.Sandbox) + ipAddr, sandbox.IP, sandbox.Name, sandbox.Namespace, sandbox.ID) return "", 0, errors.New("AssignPodIPv4Address: invalid pod with multiple IP addresses") } - return ds.assignPodIPv4AddressUnsafe(podKey, k8sPod) + return ds.assignPodIPv4AddressUnsafe(podKey, sandbox) } // It returns the assigned IPv4 address, device number, error -func (ds *DataStore) assignPodIPv4AddressUnsafe(podKey PodKey, k8sPod *k8sapi.K8SPodInfo) (ip string, deviceNumber int, err error) { +func (ds *DataStore) assignPodIPv4AddressUnsafe(podKey PodKey, sandbox *cri.SandboxInfo) (ip string, deviceNumber int, err error) { for _, eni := range ds.eniIPPools { - if (k8sPod.IP == "") && (len(eni.IPv4Addresses) == eni.AssignedIPv4Addresses) { + if (sandbox.IP == "") && (len(eni.IPv4Addresses) == eni.AssignedIPv4Addresses) { // Skip this ENI, since it has no available IP addresses ds.log.Debugf("AssignPodIPv4Address: Skip ENI %s that does not have available addresses", eni.ID) continue } for _, addr := range eni.IPv4Addresses { - if k8sPod.IP == addr.Address { + if sandbox.IP == addr.Address { // After L-IPAM restart and built IP warm-pool, it needs to take the existing running pod IP out of the pool. if !addr.Assigned { incrementAssignedCount(ds, eni, addr) } ds.log.Infof("AssignPodIPv4Address: Reassign IP %v to pod (name %s, namespace %s)", - addr.Address, k8sPod.Name, k8sPod.Namespace) + addr.Address, sandbox.Name, sandbox.Namespace) ds.podsIP[podKey] = PodIPInfo{IP: addr.Address, DeviceNumber: eni.DeviceNumber} return addr.Address, eni.DeviceNumber, nil } - if !addr.Assigned && k8sPod.IP == "" && !addr.inCoolingPeriod() { + if !addr.Assigned && sandbox.IP == "" && !addr.inCoolingPeriod() { // This is triggered by a pod's Add Network command from CNI plugin incrementAssignedCount(ds, eni, addr) ds.log.Infof("AssignPodIPv4Address: Assign IP %v to pod (name %s, namespace %s sandbox %s)", - addr.Address, k8sPod.Name, k8sPod.Namespace, k8sPod.Sandbox) + addr.Address, sandbox.Name, sandbox.Namespace, sandbox.ID) ds.podsIP[podKey] = PodIPInfo{IP: addr.Address, DeviceNumber: eni.DeviceNumber} return addr.Address, eni.DeviceNumber, nil } @@ -517,21 +517,21 @@ func (ds *DataStore) RemoveENIFromDataStore(eni string, force bool) error { // UnassignPodIPv4Address a) find out the IP address based on PodName and PodNameSpace // b) mark IP address as unassigned c) returns IP address, ENI's device number, error -func (ds *DataStore) UnassignPodIPv4Address(k8sPod *k8sapi.K8SPodInfo) (ip string, deviceNumber int, err error) { +func (ds *DataStore) UnassignPodIPv4Address(sandbox *cri.SandboxInfo) (ip string, deviceNumber int, err error) { ds.lock.Lock() defer ds.lock.Unlock() ds.log.Debugf("UnassignPodIPv4Address: IP address pool stats: total:%d, assigned %d, pod(Name: %s, Namespace: %s, Sandbox %s)", - ds.total, ds.assigned, k8sPod.Name, k8sPod.Namespace, k8sPod.Sandbox) + ds.total, ds.assigned, sandbox.Name, sandbox.Namespace, sandbox.ID) podKey := PodKey{ - name: k8sPod.Name, - namespace: k8sPod.Namespace, - sandbox: k8sPod.Sandbox, + name: sandbox.Name, + namespace: sandbox.Namespace, + sandbox: sandbox.ID, } ipAddr, ok := ds.podsIP[podKey] if !ok { ds.log.Warnf("UnassignPodIPv4Address: Failed to find pod %s namespace %q, sandbox %q", - k8sPod.Name, k8sPod.Namespace, k8sPod.Sandbox) + sandbox.Name, sandbox.Namespace, sandbox.ID) return "", 0, ErrUnknownPod } @@ -540,14 +540,14 @@ func (ds *DataStore) UnassignPodIPv4Address(k8sPod *k8sapi.K8SPodInfo) (ip strin if ok && ip.Assigned { decrementAssignedCount(ds, eni, ip) ds.log.Infof("UnassignPodIPv4Address: pod (Name: %s, NameSpace %s Sandbox %s)'s ipAddr %s, DeviceNumber%d", - k8sPod.Name, k8sPod.Namespace, k8sPod.Sandbox, ip.Address, eni.DeviceNumber) + sandbox.Name, sandbox.Namespace, sandbox.ID, ip.Address, eni.DeviceNumber) delete(ds.podsIP, podKey) return ip.Address, eni.DeviceNumber, nil } } ds.log.Warnf("UnassignPodIPv4Address: Failed to find pod %s namespace %s sandbox %s using IP %s", - k8sPod.Name, k8sPod.Namespace, k8sPod.Sandbox, ipAddr.IP) + sandbox.Name, sandbox.Namespace, sandbox.ID, ipAddr.IP) return "", 0, ErrUnknownPodIP } diff --git a/pkg/ipamd/datastore/data_store_test.go b/pkg/ipamd/datastore/data_store_test.go index 310b66282d..84d698afad 100644 --- a/pkg/ipamd/datastore/data_store_test.go +++ b/pkg/ipamd/datastore/data_store_test.go @@ -19,14 +19,14 @@ import ( "github.com/aws/amazon-vpc-cni-k8s/pkg/utils/logger" - "github.com/aws/amazon-vpc-cni-k8s/pkg/k8sapi" + "github.com/aws/amazon-vpc-cni-k8s/pkg/cri" "github.com/stretchr/testify/assert" ) var logConfig = logger.Configuration{ BinaryName: "aws-cni", LogLevel: "Debug", - LogLocation: "/var/log/test.log", + LogLocation: "stdout", } var log = logger.New(&logConfig) @@ -79,7 +79,7 @@ func TestDeleteENI(t *testing.T) { // Add an IP and assign a pod. err = ds.AddIPv4AddressToStore("eni-1", "1.1.1.1") assert.NoError(t, err) - podInfo := &k8sapi.K8SPodInfo{ + podInfo := &cri.SandboxInfo{ Name: "pod-1", Namespace: "ns-1", IP: "1.1.1.1", @@ -200,7 +200,7 @@ func TestDelENIIPv4Address(t *testing.T) { assert.Equal(t, len(ds.eniIPPools["eni-1"].IPv4Addresses), 2) // Assign a pod. - podInfo := &k8sapi.K8SPodInfo{ + podInfo := &cri.SandboxInfo{ Name: "pod-1", Namespace: "ns-1", IP: "1.1.1.1", @@ -236,7 +236,7 @@ func TestPodIPv4Address(t *testing.T) { ds.AddIPv4AddressToStore("eni-2", "1.1.2.2") - podInfo := k8sapi.K8SPodInfo{ + podInfo := cri.SandboxInfo{ Name: "pod-1", Namespace: "ns-1", IP: "1.1.1.1", @@ -266,7 +266,7 @@ func TestPodIPv4Address(t *testing.T) { assert.Equal(t, ds.eniIPPools["eni-1"].AssignedIPv4Addresses, 1) // wrong ip address - podInfo = k8sapi.K8SPodInfo{ + podInfo = cri.SandboxInfo{ Name: "pod-1", Namespace: "ns-1", IP: "1.1.2.10", @@ -275,7 +275,7 @@ func TestPodIPv4Address(t *testing.T) { _, _, err = ds.AssignPodIPv4Address(&podInfo) assert.Error(t, err) - podInfo = k8sapi.K8SPodInfo{ + podInfo = cri.SandboxInfo{ Name: "pod-1", Namespace: "ns-2", IP: "1.1.2.2", @@ -292,10 +292,10 @@ func TestPodIPv4Address(t *testing.T) { podsInfos = ds.GetPodInfos() assert.Equal(t, len(*podsInfos), 2) - podInfo = k8sapi.K8SPodInfo{ + podInfo = cri.SandboxInfo{ Name: "pod-1", Namespace: "ns-3", - Sandbox: "container-1", + ID: "container-1", } ip, _, err = ds.AssignPodIPv4Address(&podInfo) @@ -307,7 +307,7 @@ func TestPodIPv4Address(t *testing.T) { assert.Equal(t, ds.eniIPPools["eni-1"].AssignedIPv4Addresses, 2) // no more IP addresses - podInfo = k8sapi.K8SPodInfo{ + podInfo = cri.SandboxInfo{ Name: "pod-2", Namespace: "ns-3", } @@ -319,15 +319,15 @@ func TestPodIPv4Address(t *testing.T) { assert.Error(t, err) // Unassign pod which have same name/namespace, but different container - podInfo = k8sapi.K8SPodInfo{ + podInfo = cri.SandboxInfo{ Name: "pod-1", Namespace: "ns-3", - Sandbox: "container-2", + ID: "container-2", } _, _, err = ds.UnassignPodIPv4Address(&podInfo) assert.Error(t, err) - podInfo = k8sapi.K8SPodInfo{ + podInfo = cri.SandboxInfo{ Name: "pod-1", Namespace: "ns-2", } @@ -368,7 +368,7 @@ func TestWarmENIInteractions(t *testing.T) { ds.AddIPv4AddressToStore("eni-2", "1.1.2.2") ds.AddIPv4AddressToStore("eni-3", "1.1.3.1") - podInfo := k8sapi.K8SPodInfo{ + podInfo := cri.SandboxInfo{ Name: "pod-1", Namespace: "ns-1", IP: "1.1.1.1", @@ -376,7 +376,7 @@ func TestWarmENIInteractions(t *testing.T) { _, _, err := ds.AssignPodIPv4Address(&podInfo) assert.NoError(t, err) - podInfo = k8sapi.K8SPodInfo{ + podInfo = cri.SandboxInfo{ Name: "pod-2", Namespace: "ns-2", IP: "1.1.1.2", diff --git a/pkg/ipamd/ipamd.go b/pkg/ipamd/ipamd.go index 0501e543cd..09a49f27d4 100644 --- a/pkg/ipamd/ipamd.go +++ b/pkg/ipamd/ipamd.go @@ -29,12 +29,12 @@ import ( "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/client-go/kubernetes" "github.com/aws/amazon-vpc-cni-k8s/pkg/awsutils" "github.com/aws/amazon-vpc-cni-k8s/pkg/cri" "github.com/aws/amazon-vpc-cni-k8s/pkg/eniconfig" "github.com/aws/amazon-vpc-cni-k8s/pkg/ipamd/datastore" - "github.com/aws/amazon-vpc-cni-k8s/pkg/k8sapi" "github.com/aws/amazon-vpc-cni-k8s/pkg/networkutils" ) @@ -167,7 +167,7 @@ var ( type IPAMContext struct { awsClient awsutils.APIs dataStore *datastore.DataStore - k8sClient k8sapi.K8SAPIs + k8sClient kubernetes.Interface useCustomNetworking bool eniConfig eniconfig.ENIConfig criClient cri.APIs @@ -283,7 +283,7 @@ func prometheusRegister() { // New retrieves IP address usage information from Instance MetaData service and Kubelet // then initializes IP address pool data store -func New(k8sapiClient k8sapi.K8SAPIs, eniConfig *eniconfig.ENIConfigController) (*IPAMContext, error) { +func New(k8sapiClient kubernetes.Interface, eniConfig *eniconfig.ENIConfigController) (*IPAMContext, error) { prometheusRegister() c := &IPAMContext{} @@ -386,9 +386,8 @@ func (c *IPAMContext) nodeInit() error { } localPods, err := c.getLocalPodsWithRetry() if err != nil { - log.Warnf("During ipamd init, failed to get Pod information from Kubernetes API Server %v", err) - ipamdErrInc("nodeInitK8SGetLocalPodIPsFailed") - // This can happens when L-IPAMD starts before kubelet. + log.Warnf("During ipamd init, failed to get Pod information from CRI %v", err) + ipamdErrInc("nodeInitGetRunningPodSandboxesFailed") return errors.Wrap(err, "failed to get running pods!") } log.Debugf("getLocalPodsWithRetry() found %d local pods", len(localPods)) @@ -399,28 +398,24 @@ func (c *IPAMContext) nodeInit() error { return nil } - for _, ip := range localPods { - if ip.Sandbox == "" { - log.Infof("Skipping Pod %s, Namespace %s, due to no matching sandbox", ip.Name, ip.Namespace) + for _, sandboxInfo := range localPods { + if sandboxInfo.IP == "" { + log.Infof("Skipping Pod %s, Namespace %s, due to no IP", sandboxInfo.Name, sandboxInfo.Namespace) continue } - if ip.IP == "" { - log.Infof("Skipping Pod %s, Namespace %s, due to no IP", ip.Name, ip.Namespace) - continue - } - log.Infof("Recovered AddNetwork for Pod %s, Namespace %s, Sandbox %s", ip.Name, ip.Namespace, ip.Sandbox) - _, _, err = c.dataStore.AssignPodIPv4Address(ip) + log.Infof("Recovered AddNetwork for Pod %s, Namespace %s, Sandbox %s", sandboxInfo.Name, sandboxInfo.Namespace, sandboxInfo.ID) + _, _, err = c.dataStore.AssignPodIPv4Address(sandboxInfo) if err != nil { ipamdErrInc("nodeInitAssignPodIPv4AddressFailed") - log.Warnf("During ipamd init, failed to use pod IP %s returned from Kubernetes API Server %v", ip.IP, err) + log.Warnf("During ipamd init, failed to use pod IP %s returned from CRI %v", sandboxInfo.IP, err) } // Update ip rules in case there is a change in VPC CIDRs, AWS_VPC_K8S_CNI_EXTERNALSNAT setting - srcIPNet := net.IPNet{IP: net.ParseIP(ip.IP), Mask: net.IPv4Mask(255, 255, 255, 255)} + srcIPNet := net.IPNet{IP: net.ParseIP(sandboxInfo.IP), Mask: net.IPv4Mask(255, 255, 255, 255)} err = c.networkClient.UpdateRuleListBySrc(rules, srcIPNet, pbVPCcidrs, !c.networkClient.UseExternalSNAT()) if err != nil { - log.Errorf("UpdateRuleListBySrc in nodeInit() failed for IP %s: %v", ip.IP, err) + log.Errorf("UpdateRuleListBySrc in nodeInit() failed for IP %s: %v", sandboxInfo.IP, err) } } // For a new node, attach IPs @@ -436,42 +431,10 @@ func (c *IPAMContext) updateIPStats(unmanaged int) { enisMax.Set(float64(c.maxENI - unmanaged)) } -func (c *IPAMContext) getLocalPodsWithRetry() ([]*k8sapi.K8SPodInfo, error) { - var pods []*k8sapi.K8SPodInfo +func (c *IPAMContext) getLocalPodsWithRetry() (map[string]*cri.SandboxInfo, error) { + var sandboxes map[string]*cri.SandboxInfo var err error - for retry := 1; retry <= maxK8SRetries; retry++ { - pods, err = c.k8sClient.K8SGetLocalPodIPs() - if err == nil { - // Check for pods with no IP since the API server might not have the latest state of the node. - allPodsHaveAnIP := true - for _, pod := range pods { - if pod.IP == "" { - log.Infof("Pod %s, Namespace %s, has no IP", pod.Name, pod.Namespace) - allPodsHaveAnIP = false - } - } - if allPodsHaveAnIP { - break - } - log.Warnf("Not all pods have an IP, trying again in %v seconds.", retryK8SInterval.Seconds()) - } - log.Infof("Not able to get local pods yet (attempt %d/%d): %v", retry, maxK8SRetries, err) - time.Sleep(retryK8SInterval) - } - - if err != nil { - return nil, errors.Wrap(err, "no pods because apiserver not running.") - } - - if pods == nil { - return nil, nil - } - // Ask the CRI for the set of running pod sandboxes. These sandboxes are - // what the CNI operates on, but the Kubernetes API doesn't expose any - // information about them. If we relied only on the Kubernetes API, we - // could leak IPs or unassign an IP from a still-running pod. - var sandboxes map[string]*cri.SandboxInfo for retry := 1; retry <= maxK8SRetries; retry++ { sandboxes, err = c.criClient.GetRunningPodSandboxes(log) if err == nil { @@ -484,18 +447,7 @@ func (c *IPAMContext) getLocalPodsWithRetry() ([]*k8sapi.K8SPodInfo, error) { return nil, errors.Wrap(err, "Unable to get local pod sandboxes") } - // TODO consider using map - for _, pod := range pods { - // Fill in the sandbox ID by matching against the pod's UID - for _, sandbox := range sandboxes { - if sandbox.K8SUID == pod.UID { - log.Debugf("Found pod(%v)'s sandbox ID: %v ", sandbox.Name, sandbox.ID) - pod.Sandbox = sandbox.ID - break - } - } - } - return pods, nil + return sandboxes, nil } // StartNodeIPPoolManager monitors the IP pool, add or del them when it is required. diff --git a/pkg/ipamd/ipamd_test.go b/pkg/ipamd/ipamd_test.go index 49f672999c..381ba1ce88 100644 --- a/pkg/ipamd/ipamd_test.go +++ b/pkg/ipamd/ipamd_test.go @@ -21,14 +21,13 @@ import ( mock_cri "github.com/aws/amazon-vpc-cni-k8s/pkg/cri/mocks" mock_eniconfig "github.com/aws/amazon-vpc-cni-k8s/pkg/eniconfig/mocks" "github.com/aws/amazon-vpc-cni-k8s/pkg/ipamd/datastore" - "github.com/aws/amazon-vpc-cni-k8s/pkg/k8sapi" - mock_k8sapi "github.com/aws/amazon-vpc-cni-k8s/pkg/k8sapi/mocks" mock_networkutils "github.com/aws/amazon-vpc-cni-k8s/pkg/networkutils/mocks" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/ec2" "github.com/golang/mock/gomock" "github.com/stretchr/testify/assert" "github.com/vishvananda/netlink" + k8s_fake "k8s.io/client-go/kubernetes/fake" "net" "os" "reflect" @@ -54,28 +53,25 @@ const ( func setup(t *testing.T) (*gomock.Controller, *mock_awsutils.MockAPIs, - *mock_k8sapi.MockK8SAPIs, + *k8s_fake.Clientset, *mock_cri.MockAPIs, *mock_networkutils.MockNetworkAPIs, *mock_eniconfig.MockENIConfig) { ctrl := gomock.NewController(t) return ctrl, mock_awsutils.NewMockAPIs(ctrl), - mock_k8sapi.NewMockK8SAPIs(ctrl), + k8s_fake.NewSimpleClientset(), mock_cri.NewMockAPIs(ctrl), mock_networkutils.NewMockNetworkAPIs(ctrl), mock_eniconfig.NewMockENIConfig(ctrl) } func TestNodeInit(t *testing.T) { - ctrl, mockAWS, mockK8S, mockCRI, mockNetwork, _ := setup(t) + ctrl, mockAWS, _, mockCRI, mockNetwork, _ := setup(t) defer ctrl.Finish() - - mockContext := &IPAMContext{ awsClient: mockAWS, - k8sClient: mockK8S, maxIPsPerENI: 14, maxENI: 4, warmENITarget: 1, @@ -106,13 +102,10 @@ func TestNodeInit(t *testing.T) { mockNetwork.EXPECT().SetupENINetwork(gomock.Any(), secMAC, secDevice, secSubnet) mockAWS.EXPECT().GetLocalIPv4().Return(ipaddr01) - k8sName := "/k8s_POD_" + "pod1" + "_" + "default" + "_" + "pod-uid" + "_0" - mockK8S.EXPECT().K8SGetLocalPodIPs().Return([]*k8sapi.K8SPodInfo{{Name: "pod1", - Namespace: "default", UID: "pod-uid", IP: ipaddr02}}, nil) var criList = make(map[string]*cri.SandboxInfo, 0) criList["pod-uid"] = &cri.SandboxInfo{ID: "sandbox-id", - Name: k8sName, K8SUID: "pod-uid"} + Name: "pod1", K8SUID: "pod-uid", IP: ipaddr02, Namespace: "default"} mockCRI.EXPECT().GetRunningPodSandboxes(gomock.Any()).Return(criList, nil) var rules []netlink.Rule @@ -177,12 +170,12 @@ func TestIncreaseIPPoolCustomENI(t *testing.T) { } func testIncreaseIPPool(t *testing.T, useENIConfig bool) { - ctrl, mockAWS, mockK8S, _, mockNetwork, mockENIConfig := setup(t) + ctrl, mockAWS, _, mockCRI, mockNetwork, mockENIConfig := setup(t) defer ctrl.Finish() mockContext := &IPAMContext{ awsClient: mockAWS, - k8sClient: mockK8S, + criClient: mockCRI, maxIPsPerENI: 14, maxENI: 4, warmENITarget: 1, @@ -262,7 +255,7 @@ func testIncreaseIPPool(t *testing.T, useENIConfig bool) { func TestTryAddIPToENI(t *testing.T) { _ = os.Unsetenv(envCustomNetworkCfg) - ctrl, mockAWS, mockK8S, _, mockNetwork, mockENIConfig := setup(t) + ctrl, mockAWS, _, mockCRI, mockNetwork, mockENIConfig := setup(t) defer ctrl.Finish() primary := true @@ -275,7 +268,7 @@ func TestTryAddIPToENI(t *testing.T) { warmIpTarget := 3 mockContext := &IPAMContext{ awsClient: mockAWS, - k8sClient: mockK8S, + criClient: mockCRI, maxIPsPerENI: 14, maxENI: 4, warmENITarget: 1, @@ -337,12 +330,12 @@ func TestTryAddIPToENI(t *testing.T) { } func TestNodeIPPoolReconcile(t *testing.T) { - ctrl, mockAWS, mockK8S, _, mockNetwork, _ := setup(t) + ctrl, mockAWS, _, mockCRI, mockNetwork, _ := setup(t) defer ctrl.Finish() mockContext := &IPAMContext{ awsClient: mockAWS, - k8sClient: mockK8S, + criClient: mockCRI, networkClient: mockNetwork, primaryIP: make(map[string]string), terminating: int32(0), @@ -428,12 +421,12 @@ func TestGetWarmENITarget(t *testing.T) { } func TestGetWarmIPTargetState(t *testing.T) { - ctrl, mockAWS, mockK8S, _, mockNetwork, _ := setup(t) + ctrl, mockAWS, _, mockCRI, mockNetwork, _ := setup(t) defer ctrl.Finish() mockContext := &IPAMContext{ awsClient: mockAWS, - k8sClient: mockK8S, + criClient: mockCRI, networkClient: mockNetwork, primaryIP: make(map[string]string), terminating: int32(0), @@ -472,7 +465,7 @@ func TestGetWarmIPTargetState(t *testing.T) { } func TestIPAMContext_nodeIPPoolTooLow(t *testing.T) { - ctrl, mockAWS, mockK8S, _, mockNetwork, mockENIConfig := setup(t) + ctrl, mockAWS, _, mockCRI, mockNetwork, mockENIConfig := setup(t) defer ctrl.Finish() type fields struct { @@ -501,7 +494,7 @@ func TestIPAMContext_nodeIPPoolTooLow(t *testing.T) { c := &IPAMContext{ awsClient: mockAWS, dataStore: tt.fields.datastore, - k8sClient: mockK8S, + criClient: mockCRI, useCustomNetworking: false, eniConfig: mockENIConfig, networkClient: mockNetwork, @@ -529,7 +522,7 @@ func datastoreWith3FreeIPs() *datastore.DataStore { func datastoreWith1Pod1() *datastore.DataStore { datastoreWith1Pod1 := datastoreWith3FreeIPs() - podInfo1 := k8sapi.K8SPodInfo{ + podInfo1 := cri.SandboxInfo{ Name: "pod-1", Namespace: "ns-1", IP: ipaddr01, @@ -541,21 +534,21 @@ func datastoreWith1Pod1() *datastore.DataStore { func datastoreWith3Pods() *datastore.DataStore { datastoreWith3Pods := datastoreWith3FreeIPs() - podInfo1 := k8sapi.K8SPodInfo{ + podInfo1 := cri.SandboxInfo{ Name: "pod-1", Namespace: "ns-1", IP: ipaddr01, } _, _, _ = datastoreWith3Pods.AssignPodIPv4Address(&podInfo1) - podInfo2 := k8sapi.K8SPodInfo{ + podInfo2 := cri.SandboxInfo{ Name: "pod-2", Namespace: "ns-1", IP: ipaddr02, } _, _, _ = datastoreWith3Pods.AssignPodIPv4Address(&podInfo2) - podInfo3 := k8sapi.K8SPodInfo{ + podInfo3 := cri.SandboxInfo{ Name: "pod-3", Namespace: "ns-1", IP: ipaddr03, @@ -577,10 +570,10 @@ func TestIPAMContext_filterUnmanagedENIs(t *testing.T) { mockAWSUtils.EXPECT().GetPrimaryENI().Times(2).Return(eni1.ENIID) tests := []struct { - name string + name string tagMap map[string]awsutils.TagMap - enis []awsutils.ENIMetadata - want []awsutils.ENIMetadata + enis []awsutils.ENIMetadata + want []awsutils.ENIMetadata }{ {"No tags at all", nil, allENIs, allENIs}, {"Primary ENI unmanaged", eni1TagMap, allENIs, allENIs}, diff --git a/pkg/ipamd/rpc_handler.go b/pkg/ipamd/rpc_handler.go index 3ee6dfca9a..49a30454f8 100644 --- a/pkg/ipamd/rpc_handler.go +++ b/pkg/ipamd/rpc_handler.go @@ -27,8 +27,8 @@ import ( healthpb "google.golang.org/grpc/health/grpc_health_v1" "google.golang.org/grpc/reflection" + "github.com/aws/amazon-vpc-cni-k8s/pkg/cri" "github.com/aws/amazon-vpc-cni-k8s/pkg/ipamd/datastore" - "github.com/aws/amazon-vpc-cni-k8s/pkg/k8sapi" "github.com/aws/amazon-vpc-cni-k8s/rpc" ) @@ -47,10 +47,10 @@ func (s *server) AddNetwork(ctx context.Context, in *rpc.AddNetworkRequest) (*rp log.Infof("Received AddNetwork for NS %s, Pod %s, NameSpace %s, Sandbox %s, ifname %s", in.Netns, in.K8S_POD_NAME, in.K8S_POD_NAMESPACE, in.K8S_POD_INFRA_CONTAINER_ID, in.IfName) - addr, deviceNumber, err := s.ipamContext.dataStore.AssignPodIPv4Address(&k8sapi.K8SPodInfo{ + addr, deviceNumber, err := s.ipamContext.dataStore.AssignPodIPv4Address(&cri.SandboxInfo{ Name: in.K8S_POD_NAME, Namespace: in.K8S_POD_NAMESPACE, - Sandbox: in.K8S_POD_INFRA_CONTAINER_ID}) + ID: in.K8S_POD_INFRA_CONTAINER_ID}) var pbVPCcidrs []string for _, cidr := range s.ipamContext.awsClient.GetVPCIPv4CIDRs() { @@ -85,14 +85,14 @@ func (s *server) DelNetwork(ctx context.Context, in *rpc.DelNetworkRequest) (*rp in.IPv4Addr, in.K8S_POD_NAME, in.K8S_POD_NAMESPACE, in.K8S_POD_INFRA_CONTAINER_ID) delIPCnt.With(prometheus.Labels{"reason": in.Reason}).Inc() - ip, deviceNumber, err := s.ipamContext.dataStore.UnassignPodIPv4Address(&k8sapi.K8SPodInfo{ + ip, deviceNumber, err := s.ipamContext.dataStore.UnassignPodIPv4Address(&cri.SandboxInfo{ Name: in.K8S_POD_NAME, Namespace: in.K8S_POD_NAMESPACE, - Sandbox: in.K8S_POD_INFRA_CONTAINER_ID}) + ID: in.K8S_POD_INFRA_CONTAINER_ID}) if err != nil && err == datastore.ErrUnknownPod { // If L-IPAMD restarts, the pod's IP address are assigned by only pod's name and namespace due to kubelet's introspection. - ip, deviceNumber, err = s.ipamContext.dataStore.UnassignPodIPv4Address(&k8sapi.K8SPodInfo{ + ip, deviceNumber, err = s.ipamContext.dataStore.UnassignPodIPv4Address(&cri.SandboxInfo{ Name: in.K8S_POD_NAME, Namespace: in.K8S_POD_NAMESPACE}) } diff --git a/pkg/k8sapi/mocks/k8sapi_mocks.go b/pkg/k8sapi/mocks/k8sapi_mocks.go index 7c09ec6f90..79282c5bfe 100644 --- a/pkg/k8sapi/mocks/k8sapi_mocks.go +++ b/pkg/k8sapi/mocks/k8sapi_mocks.go @@ -19,10 +19,9 @@ package mock_k8sapi import ( - reflect "reflect" - k8sapi "github.com/aws/amazon-vpc-cni-k8s/pkg/k8sapi" gomock "github.com/golang/mock/gomock" + reflect "reflect" ) // MockK8SAPIs is a mock of K8SAPIs interface From 3e1b69c5d83ef4859624079de7a3576b2ece53da Mon Sep 17 00:00:00 2001 From: Fawad Khaliq Date: Thu, 6 Aug 2020 22:30:53 +0000 Subject: [PATCH 2/2] Fixed the formatting --- go.mod | 6 +++--- go.sum | 13 +++++++++++++ pkg/awsutils/mocks/awsutils_mocks.go | 3 ++- pkg/ipamd/ipamd_test.go | 9 +++++---- pkg/k8sapi/mocks/k8sapi_mocks.go | 3 ++- 5 files changed, 25 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 6ba95824d4..55abc9d684 100644 --- a/go.mod +++ b/go.mod @@ -35,10 +35,10 @@ require ( github.com/stretchr/testify v1.5.1 github.com/vishvananda/netlink v1.1.0 go.uber.org/zap v1.13.0 - golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 // indirect - golang.org/x/net v0.0.0-20200202094626-16171245cfb2 - golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456 + golang.org/x/net v0.0.0-20200625001655-4c5254603344 + golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2 // indirect + golang.org/x/tools v0.0.0-20200806220301-41a9f6dc6634 // indirect google.golang.org/grpc v1.29.0 gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 diff --git a/go.sum b/go.sum index 8847d86cc9..f7f571c6f2 100644 --- a/go.sum +++ b/go.sum @@ -158,6 +158,7 @@ github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYp github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df h1:OviZH7qLw/7ZovXvuNyL3XQl8UFofeikI1NW1Gypu7k= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.uber.org/atomic v1.5.0 h1:OI5t8sDa1Or+q8AeE+yKeB/SDYioSHAgcVljj9JIETY= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/multierr v1.3.0 h1:sFPn2GLc3poCkfrpIXGhBD2X0CMIo4Q/zSULXrj/+uc= @@ -171,6 +172,7 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -178,6 +180,8 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -190,11 +194,13 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2 h1:CCH4IOTTfewWjGOlSp+zGcjutRKlBEZQ6wTn8ozI/nI= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -205,6 +211,7 @@ golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456 h1:ng0gs1AKnRRuEMZoTLLlbOd+C17zUDepwGQBb/n+JVg= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -224,7 +231,13 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200806220301-41a9f6dc6634 h1:rGls+PSC/BhqDogsee9h9PunIiBmvjJgdTv5ps5koBA= +golang.org/x/tools v0.0.0-20200806220301-41a9f6dc6634/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= diff --git a/pkg/awsutils/mocks/awsutils_mocks.go b/pkg/awsutils/mocks/awsutils_mocks.go index aed4fa8c96..fc1169cadc 100644 --- a/pkg/awsutils/mocks/awsutils_mocks.go +++ b/pkg/awsutils/mocks/awsutils_mocks.go @@ -19,10 +19,11 @@ package mock_awsutils import ( + reflect "reflect" + awsutils "github.com/aws/amazon-vpc-cni-k8s/pkg/awsutils" ec2 "github.com/aws/aws-sdk-go/service/ec2" gomock "github.com/golang/mock/gomock" - reflect "reflect" ) // MockAPIs is a mock of APIs interface diff --git a/pkg/ipamd/ipamd_test.go b/pkg/ipamd/ipamd_test.go index 381ba1ce88..3a7ef62fcd 100644 --- a/pkg/ipamd/ipamd_test.go +++ b/pkg/ipamd/ipamd_test.go @@ -14,6 +14,11 @@ package ipamd import ( + "net" + "os" + "reflect" + "testing" + "github.com/aws/amazon-vpc-cni-k8s/pkg/apis/crd/v1alpha1" "github.com/aws/amazon-vpc-cni-k8s/pkg/awsutils" mock_awsutils "github.com/aws/amazon-vpc-cni-k8s/pkg/awsutils/mocks" @@ -28,10 +33,6 @@ import ( "github.com/stretchr/testify/assert" "github.com/vishvananda/netlink" k8s_fake "k8s.io/client-go/kubernetes/fake" - "net" - "os" - "reflect" - "testing" ) const ( diff --git a/pkg/k8sapi/mocks/k8sapi_mocks.go b/pkg/k8sapi/mocks/k8sapi_mocks.go index 79282c5bfe..7c09ec6f90 100644 --- a/pkg/k8sapi/mocks/k8sapi_mocks.go +++ b/pkg/k8sapi/mocks/k8sapi_mocks.go @@ -19,9 +19,10 @@ package mock_k8sapi import ( + reflect "reflect" + k8sapi "github.com/aws/amazon-vpc-cni-k8s/pkg/k8sapi" gomock "github.com/golang/mock/gomock" - reflect "reflect" ) // MockK8SAPIs is a mock of K8SAPIs interface