package cni_upgrade_downgrade import ( "fmt" "testing" "github.com/aws/amazon-vpc-cni-k8s/test/framework" k8sUtils "github.com/aws/amazon-vpc-cni-k8s/test/framework/resources/k8s/utils" "github.com/aws/amazon-vpc-cni-k8s/test/framework/utils" "github.com/pkg/errors" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" v1 "k8s.io/api/core/v1" ) const ( InstanceTypeNodeLabelKey = "beta.kubernetes.io/instance-type" DefaultManifestfile = "https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/master/config/master/aws-k8s-cni.yaml" ) var f *framework.Framework var maxIPPerInterface int var primaryNode v1.Node var secondaryNode v1.Node var instanceSecurityGroupID string var vpcCIDRs []string var initialManifest string var targetManifest string func TestCNIPodNetworking(t *testing.T) { RegisterFailHandler(Fail) RunSpecs(t, "CNI Pod Networking Suite") } var _ = BeforeSuite(func() { f = framework.New(framework.GlobalOptions) By("creating test namespace") f.K8sResourceManagers.NamespaceManager(). CreateNamespace(utils.DefaultTestNamespace) By(fmt.Sprintf("getting the node with the node label key %s and value %s", f.Options.NgNameLabelKey, f.Options.NgNameLabelVal)) nodes, err := f.K8sResourceManagers.NodeManager().GetNodes(f.Options.NgNameLabelKey, f.Options.NgNameLabelVal) Expect(err).ToNot(HaveOccurred()) By("verifying more than 1 nodes are present for the test") Expect(len(nodes.Items)).Should(BeNumerically(">", 1)) // Set the primary and secondary node for testing primaryNode = nodes.Items[0] secondaryNode = nodes.Items[1] // Get the node security group instanceID := k8sUtils.GetInstanceIDFromNode(primaryNode) primaryInstance, err := f.CloudServices.EC2().DescribeInstance(instanceID) Expect(err).ToNot(HaveOccurred()) // This won't work if the first SG is only associated with the primary instance. // Need a robust substring in the SGP name to identify node SGP instanceSecurityGroupID = *primaryInstance.NetworkInterfaces[0].Groups[0].GroupId By("getting the instance type from node label " + InstanceTypeNodeLabelKey) instanceType := primaryNode.Labels[InstanceTypeNodeLabelKey] By("getting the network interface details from ec2") instanceOutput, err := f.CloudServices.EC2().DescribeInstanceType(instanceType) Expect(err).ToNot(HaveOccurred()) // Subtract 2 for coredns pods if present, and both could be on same ENI maxIPPerInterface = int(*instanceOutput[0].NetworkInfo.Ipv4AddressesPerInterface) - 2 By("describing the VPC to get the VPC CIDRs") describeVPCOutput, err := f.CloudServices.EC2().DescribeVPC(f.Options.AWSVPCID) Expect(err).ToNot(HaveOccurred()) for _, cidrBlockAssociationSet := range describeVPCOutput.Vpcs[0].CidrBlockAssociationSet { vpcCIDRs = append(vpcCIDRs, *cidrBlockAssociationSet.CidrBlock) } initialManifest = f.Options.InitialManifest targetManifest = f.Options.TargetManifest if len(targetManifest) == 0 { err = errors.Errorf("Target Manifest file must be specified") } Expect(err).NotTo(HaveOccurred()) if len(initialManifest) == 0 { initialManifest = DefaultManifestfile } initialManifestStr := fmt.Sprintf("using initial cni manifest: %s", initialManifest) targetManifestStr := fmt.Sprintf("using target cni manifest: %s", targetManifest) By(initialManifestStr) By(targetManifestStr) // Set the WARM_ENI_TARGET to 0 to prevent all pods being scheduled on secondary ENI k8sUtils.AddEnvVarToDaemonSetAndWaitTillUpdated(f, "aws-node", "kube-system", "aws-node", map[string]string{"WARM_IP_TARGET": "3", "WARM_ENI_TARGET": "0"}) }) var _ = AfterSuite(func() { By("deleting test namespace") f.K8sResourceManagers.NamespaceManager(). DeleteAndWaitTillNamespaceDeleted(utils.DefaultTestNamespace) k8sUtils.UpdateEnvVarOnDaemonSetAndWaitUntilReady(f, "aws-node", "kube-system", "aws-node", nil, map[string]struct{}{ "WARM_IP_TARGET": {}, "WARM_ENI_TARGET": {}, }) })