Esempio n. 1
0
    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)
Esempio n. 2
0
    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'])
Esempio n. 3
0
    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)
Esempio n. 4
0
    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))