def _parse_pod_info(self, pods): """Parse pods and retrieve memory and cpu details about each pod :param pods: The output of k8s_api.list_namespaced_pod() For example: { 'items': [{ 'status': { 'container_statuses': None, 'pod_ip': None, 'phase': 'Pending', 'message': None, 'conditions': None, }, 'spec': { 'containers': [{ 'image': 'nginx', 'resources': {'requests': None, 'limits': "{u'cpu': u'500m', u'memory': u'1280e3'}"}, }], }, 'api_version': None, }], 'kind': 'PodList', } The above output is the dict form of: k8sclient.client.models.v1_pod_list. V1PodList object :return: Memory size of each pod. Example: [{'Memory': 1280000.0, cpu: 0.5}, {'Memory': 1280000.0, cpu: 0.5}] """ pods = pods.items parsed_containers = [] for pod in pods: containers = pod.spec.containers for container in containers: memory = 0 cpu = 0 resources = container.resources limits = resources.limits if limits is not None: # Output of resources.limits is string # for example: # limits = "{cpu': '500m': 'memory': '1000Ki'}" limits = ast.literal_eval(limits) if limits.get('memory', ''): memory = utils.get_k8s_quantity(limits['memory']) if limits.get('cpu', ''): cpu = utils.get_k8s_quantity(limits['cpu']) container_dict = { 'Memory': memory, 'Cpu': cpu, } parsed_containers.append(container_dict) return parsed_containers
def _parse_pod_info(self, pods): """Parse pods and retrieve memory and cpu details about each pod :param pods: The output of k8s_api.list_namespaced_pod() For example: { 'items': [{ 'status': { 'container_statuses': None, 'pod_ip': None, 'phase': 'Pending', 'message': None, 'conditions': None, }, 'spec': { 'containers': [{ 'image': 'nginx', 'resources': {'requests': None, 'limits': "{u'cpu': u'500m', u'memory': u'1280e3'}"}, }], }, 'api_version': None, }], 'kind': 'PodList', } The above output is the dict form of: k8sclient.client.models.v1_pod_list. V1PodList object :return: Memory size of each pod. Example: [{'Memory': 1280000.0, cpu: 0.5}, {'Memory': 1280000.0, cpu: 0.5}] """ pods = pods.items parsed_containers = [] for pod in pods: containers = pod.spec.containers for container in containers: memory = 0 cpu = 0 resources = container.resources limits = resources.limits if limits is not None: # Output of resources.limits is string # for example: # limits = "{cpu': '500m': 'memory': '1000Ki'}" limits = ast.literal_eval(limits) if limits.get('memory', ''): memory = utils.get_k8s_quantity(limits['memory']) if limits.get('cpu', ''): cpu = utils.get_k8s_quantity(limits['cpu']) container_dict = { 'Memory': memory, 'Cpu': cpu, } parsed_containers.append(container_dict) return parsed_containers
def test_get_k8s_quantity(self): self.assertEqual(1024000.0, utils.get_k8s_quantity('1000Ki')) self.assertEqual(0.001, utils.get_k8s_quantity('1E-3')) self.assertEqual(0.5, utils.get_k8s_quantity('0.0005k')) self.assertEqual(0.5, utils.get_k8s_quantity('500m')) self.assertEqual(1300000.0, utils.get_k8s_quantity('1.3E+6')) self.assertEqual(1300000.0, utils.get_k8s_quantity('1.3E6')) self.assertRaises(exception.UnsupportedK8sQuantityFormat, utils.get_k8s_quantity, '1E1E')
def test_get_k8s_quantity(self): self.assertEqual(1024000.0, utils.get_k8s_quantity('1000Ki')) self.assertEqual(0.001, utils.get_k8s_quantity('1E-3')) self.assertEqual(0.5, utils.get_k8s_quantity('0.0005k')) self.assertEqual(0.5, utils.get_k8s_quantity('500m')) self.assertEqual(1300000.0, utils.get_k8s_quantity('1.3E+6')) self.assertEqual(1300000.0, utils.get_k8s_quantity('1.3E6')) self.assertRaises(exception.UnsupportedK8sQuantityFormat, utils.get_k8s_quantity, '1E1E')
def _parse_node_info(self, nodes): """Parse nodes to retrieve memory and cpu of each node :param nodes: The output of k8s_api.list_namespaced_node() For example: { 'items': [{ 'status': { 'phase': None, 'capacity': "{u'cpu': u'1', u'memory': u'2049852Ki'}", }, }, 'api_version': None, }], 'kind': 'NodeList', 'api_version': 'v1', } The above output is the dict form of: k8sclient.client.models.v1_node_list. V1NodeList object :return: CPU core number and Memory size of each node. Example: [{'cpu': 1, 'Memory': 1024.0}, {'cpu': 1, 'Memory': 1024.0}] """ nodes = nodes.items parsed_nodes = [] for node in nodes: # Output of node.status.capacity is strong # for example: # capacity = "{'cpu': '1', 'memory': '1000Ki'}" capacity = ast.literal_eval(node.status.capacity) memory = utils.get_k8s_quantity(capacity['memory']) cpu = int(capacity['cpu']) parsed_nodes.append({'Memory': memory, 'Cpu': cpu}) return parsed_nodes