def __init__(self, pod): self.original = pod metadata = pod.obj['metadata'] self.name = metadata['name'] self.namespace = metadata['namespace'] self.node_name = pod.obj['spec'].get('nodeName') self.status = pod.obj['status']['phase'] self.uid = metadata['uid'] self.selectors = pod.obj['spec'].get('nodeSelector', {}) self.labels = metadata.get('labels', {}) self.annotations = metadata.get('annotations', {}) self.owner = self.labels.get('owner', None) self.creation_time = dateutil_parse(metadata['creationTimestamp']) self.start_time = dateutil_parse( pod.obj['status'] ['startTime']) if 'startTime' in pod.obj['status'] else None # TODO: refactor requests = list( map(lambda c: c.get('resources', {}).get('requests', {}), pod.obj['spec']['containers'])) resource_requests = {} for d in requests: for k, v in d.items(): unitless_v = utils.parse_SI(v) resource_requests[k] = resource_requests.get(k, 0.0) + unitless_v self.resources = KubeResource(pods=1, **resource_requests)
def __init__(self, pod): self.original = pod metadata = pod.obj['metadata'] self.name = metadata['name'] self.namespace = metadata['namespace'] self.node_name = pod.obj['spec'].get('nodeName') self.status = pod.obj['status']['phase'] self.uid = metadata['uid'] self.selectors = pod.obj['spec'].get('nodeSelector', {}) self.labels = metadata.get('labels', {}) self.annotations = metadata.get('annotations', {}) self.owner_references = metadata.get('ownerReferences', []) self.owner = self.labels.get('owner', None) self.creation_time = dateutil_parse(metadata['creationTimestamp']) self.start_time = dateutil_parse(pod.obj['status']['startTime']) if 'startTime' in pod.obj['status'] else None self.scheduled_time = None for condition in pod.obj['status'].get('conditions', []): if condition['type'] == 'PodScheduled' and condition['status'] == 'True': self.scheduled_time = dateutil_parse(condition['lastTransitionTime']) # TODO: refactor requests = [c.get('resources', {}).get('requests', {}) for c in pod.obj['spec']['containers']] resource_requests = {} for d in requests: for k, v in d.items(): unitless_v = utils.parse_SI(v) resource_requests[k] = resource_requests.get(k, 0.0) + unitless_v self.resources = KubeResource(pods=1, **resource_requests) self.no_schedule_wildcard_toleration = False self.no_execute_wildcard_toleration = False self.no_schedule_existential_tolerations = set() self.no_execute_existential_tolerations = set() for toleration in pod.obj['spec'].get('tolerations', []): if toleration.get('operator', 'Equal') == 'Exists': effect = toleration.get('effect') if effect is None or effect == 'NoSchedule': if 'key' not in toleration: self.no_schedule_wildcard_toleration = True else: self.no_schedule_existential_tolerations.add(toleration['key']) if effect is None or effect == 'NoExecute': if 'key' not in toleration: self.no_execute_wildcard_toleration = True else: self.no_execute_existential_tolerations.add(toleration['key']) else: logger.warn("Equality tolerations not implemented. Pod {} has an equality toleration".format(pod)) self.required_pod_anti_affinity_expressions = [] anti_affinity_spec = pod.obj['spec'].get('affinity', {}).get('podAntiAffinity', {}) required_anti_affinity_expressions = anti_affinity_spec.get('requiredDuringSchedulingIgnoredDuringExecution', []) +\ anti_affinity_spec.get('requiredDuringSchedulingRequiredDuringExecution', []) for expression in required_anti_affinity_expressions: if expression.get('topologyKey') != 'kubernetes.io/hostname': logger.debug("Pod {} has non-hostname anti-affinity topology. Ignoring".format(pod)) continue self.required_pod_anti_affinity_expressions.append(expression['labelSelector']['matchExpressions'])
def __init__(self, pod): self.original = pod metadata = pod.obj['metadata'] self.name = metadata['name'] self.namespace = metadata['namespace'] self.node_name = pod.obj['spec'].get('nodeName') self.status = pod.obj['status']['phase'] self.uid = metadata['uid'] self.selectors = pod.obj['spec'].get('nodeSelector', {}) self.labels = metadata.get('labels', {}) self.annotations = metadata.get('annotations', {}) self.owner = self.labels.get('owner', None) self.creation_time = dateutil_parse(metadata['creationTimestamp']) # TODO: refactor requests = map(lambda c: c.get('resources', {}).get('requests', {}), pod.obj['spec']['containers']) resource_requests = {} for d in requests: for k, v in d.items(): unitless_v = utils.parse_SI(v) resource_requests[k] = resource_requests.get(k, 0.0) + unitless_v self.resources = KubeResource(pods=1, **resource_requests)
def __init__(self, pod): self.original = pod metadata = pod.obj['metadata'] self.name = metadata['name'] self.namespace = metadata['namespace'] self.node_name = pod.obj['spec'].get('nodeName') self.status = pod.obj['status']['phase'] self.uid = metadata['uid'] self.selectors = pod.obj['spec'].get('nodeSelector', {}) # TODO: Remove this, after everyone has migrated off reservations if 'openai.org/reservation-id' in self.selectors: del self.selectors['openai.org/reservation-id'] self.labels = metadata.get('labels', {}) self.annotations = metadata.get('annotations', {}) self.owner = self.labels.get('owner', None) self.creation_time = dateutil_parse(metadata['creationTimestamp']) self.start_time = dateutil_parse( pod.obj['status'] ['startTime']) if 'startTime' in pod.obj['status'] else None self.scheduled_time = None for condition in pod.obj['status'].get('conditions', []): if condition['type'] == 'PodScheduled' and condition[ 'status'] == 'True': self.scheduled_time = dateutil_parse( condition['lastTransitionTime']) # TODO: refactor requests = [ c.get('resources', {}).get('requests', {}) for c in pod.obj['spec']['containers'] ] resource_requests = {} for d in requests: for k, v in d.items(): unitless_v = utils.parse_SI(v) resource_requests[k] = resource_requests.get(k, 0.0) + unitless_v self.resources = KubeResource(pods=1, **resource_requests) self.no_schedule_wildcard_toleration = False self.no_execute_wildcard_toleration = False self.no_schedule_existential_tolerations = set() self.no_execute_existential_tolerations = set() for toleration in pod.obj['spec'].get('tolerations', []): if toleration.get('operator', 'Equal') == 'Exists': effect = toleration.get('effect') if effect is None or effect == 'NoSchedule': if 'key' not in toleration: self.no_schedule_wildcard_toleration = True else: self.no_schedule_existential_tolerations.add( toleration['key']) if effect is None or effect == 'NoExecute': if 'key' not in toleration: self.no_execute_wildcard_toleration = True else: self.no_execute_existential_tolerations.add( toleration['key']) else: logger.warn( "Equality tolerations not implemented. Pod {} has an equality toleration" .format(pod))