def setUp(self): """ Per-test setup method. """ self.container_id = "ff3afbd1-17ad-499d-b514-72438c009e81" self.network_config = { "name": "ut-network", "type": "calico", "ipam": { "type": "calico-ipam", ASSIGN_IPV4_KEY: "true", ASSIGN_IPV6_KEY: "true" } } self.env = { CNI_CONTAINERID_ENV: self.container_id, CNI_IFNAME_ENV: "eth0", CNI_ARGS_ENV: "", CNI_COMMAND_ENV: CNI_CMD_ADD, CNI_PATH_ENV: "/usr/bin/rkt/", CNI_NETNS_ENV: "netns", } # Create the CniPlugin to test. self.plugin = IpamPlugin(self.env, self.network_config["ipam"]) # Mock out the datastore client. self.m_datastore_client = MagicMock(spec=IPAMClient) self.plugin.datastore_client = self.m_datastore_client # Set expected values. self.expected_handle = self.container_id
def _call_ipam_plugin(self, env): """ Executes a CNI IPAM plugin. If `calico-ipam` is the provided IPAM type, then calls directly into ipam.py as a performance optimization. For all other types of IPAM, searches the CNI_PATH for the correct binary and executes it. :return: Tuple of return code, response from the IPAM plugin. """ if self.ipam_type == "calico-ipam": _log.info("Using Calico IPAM") try: response = IpamPlugin(env, self.network_config["ipam"]).execute() code = 0 except CniError as e: # We hit a CNI error - return the appropriate CNI formatted # error dictionary. response = json.dumps({ "code": e.code, "msg": e.msg, "details": e.details }) code = e.code elif self.ipam_type == "host-local": # We've been told to use the "host-local" IPAM plugin. # Check if we need to use the Kubernetes podCidr for this node, and # if so replace the subnet field with the correct value. if self.network_config["ipam"].get("subnet") == "usePodCidr": if not self.running_under_k8s: print_cni_error( ERR_CODE_GENERIC, "Invalid network config", "Must be running under Kubernetes to use 'subnet: usePodCidr'" ) sys.exit(ERR_CODE_GENERIC) _log.info("Using Kubernetes podCIDR for node: %s", self.k8s_node_name) pod_cidr = self._get_kubernetes_pod_cidr() self.network_config["ipam"]["subnet"] = str(pod_cidr) # Call the IPAM plugin. _log.debug("Calling host-local IPAM plugin") code, response = self._call_binary_ipam_plugin(env) else: # Using some other IPAM plugin - call it. _log.debug("Using binary plugin") code, response = self._call_binary_ipam_plugin(env) # Return the IPAM return code and output. _log.debug("IPAM response (rc=%s): %s", code, response) return code, response
def setUp(self): """ Per-test setup method. """ CniIpamTest.setUp(self) self.container_id = "ff3afbd1-17ad-499d-b514-72438c009e81" self.env = { CNI_CONTAINERID_ENV: self.container_id, CNI_IFNAME_ENV: "eth0", CNI_ARGS_ENV: "K8S_POD_NAME=podname;K8S_POD_NAMESPACE=k8sns", CNI_COMMAND_ENV: CNI_CMD_ADD, CNI_PATH_ENV: "/usr/bin/rkt/", CNI_NETNS_ENV: "netns", } # Create the CniPlugin to test. self.plugin = IpamPlugin(self.env, self.network_config["ipam"]) # Mock out the datastore client. self.m_datastore_client = MagicMock(spec=IPAMClient) self.plugin.datastore_client = self.m_datastore_client # Set expected values. self.expected_handle = "k8sns.podname"