コード例 #1
0
ファイル: manager.py プロジェクト: Kryndex/qinling
    def delete_pool(self, name, labels=None):
        """Delete all resources belong to the deployment."""
        LOG.info("Deleting deployment %s", name)

        selector = common.convert_dict_to_string(labels)

        self.v1extention.delete_collection_namespaced_replica_set(
            self.conf.kubernetes.namespace, label_selector=selector)
        LOG.info("ReplicaSets in deployment %s deleted.", name)

        ret = self.v1.list_namespaced_service(self.conf.kubernetes.namespace,
                                              label_selector=selector)
        names = [i.metadata.name for i in ret.items]
        for svc_name in names:
            self.v1.delete_namespaced_service(
                svc_name,
                self.conf.kubernetes.namespace,
            )
        LOG.info("Services in deployment %s deleted.", name)

        self.v1extention.delete_collection_namespaced_deployment(
            self.conf.kubernetes.namespace,
            label_selector=selector,
            field_selector='metadata.name=%s' % name)
        # Should delete pods after deleting deployment to avoid pods are
        # recreated by k8s.
        self.v1.delete_collection_namespaced_pod(
            self.conf.kubernetes.namespace, label_selector=selector)
        LOG.info("Pods in deployment %s deleted.", name)
        LOG.info("Deployment %s deleted.", name)
コード例 #2
0
    def _choose_available_pods(self,
                               labels,
                               count=1,
                               function_id=None,
                               function_version=0):
        # If there is already a pod for function, reuse it.
        if function_id:
            ret = self.v1.list_namespaced_pod(
                self.conf.kubernetes.namespace,
                label_selector='function_id=%s,function_version=%s' %
                (function_id, function_version))
            if len(ret.items) >= count:
                LOG.debug(
                    "Function %s(version %s) already associates to a pod with "
                    "at least %d worker(s). ", function_id, function_version,
                    count)
                return ret.items[:count]

        selector = common.convert_dict_to_string(labels)
        ret = self.v1.list_namespaced_pod(self.conf.kubernetes.namespace,
                                          label_selector='!function_id,%s' %
                                          selector)

        if len(ret.items) < count:
            return []

        return ret.items[-count:]
コード例 #3
0
    def delete_function(self, function_id, version, labels=None):
        """Delete related resources for function.

        - Delete service
        - Delete pods
        """
        pre_label = {
            'function_id': function_id,
            'function_version': str(version)
        }
        labels = labels or pre_label
        selector = common.convert_dict_to_string(labels)

        ret = self.v1.list_namespaced_service(self.conf.kubernetes.namespace,
                                              label_selector=selector)
        names = [i.metadata.name for i in ret.items]
        for svc_name in names:
            self.v1.delete_namespaced_service(
                svc_name,
                self.conf.kubernetes.namespace,
                V1DeleteOptions(),
            )

        self.v1.delete_collection_namespaced_pod(
            self.conf.kubernetes.namespace, label_selector=selector)
コード例 #4
0
ファイル: manager.py プロジェクト: huzhengchuan/qinling
    def _choose_available_pod(self, labels, count=1):
        selector = common.convert_dict_to_string(labels)

        ret = self.v1.list_namespaced_pod(self.conf.kubernetes.namespace,
                                          label_selector='!function_id,%s' %
                                          selector)

        if len(ret.items) == 0:
            return None

        return ret.items[-count:]
コード例 #5
0
ファイル: manager.py プロジェクト: Kryndex/qinling
    def delete_function(self, function_id, labels=None):
        selector = common.convert_dict_to_string(labels)

        ret = self.v1.list_namespaced_service(self.conf.kubernetes.namespace,
                                              label_selector=selector)
        names = [i.metadata.name for i in ret.items]
        for svc_name in names:
            self.v1.delete_namespaced_service(
                svc_name,
                self.conf.kubernetes.namespace,
            )

        self.v1.delete_collection_namespaced_pod(
            self.conf.kubernetes.namespace, label_selector=selector)
コード例 #6
0
    def _choose_available_pod(self, labels):
        selector = common.convert_dict_to_string(labels)

        ret = self.v1.list_namespaced_pod(self.conf.kubernetes.namespace,
                                          label_selector='!function_id,%s' %
                                          selector)

        if len(ret.items) == 0:
            return None

        # Choose the last available one by default.
        pod = ret.items[-1]

        return pod
コード例 #7
0
ファイル: test_manager.py プロジェクト: heychirag/qinling
    def test_delete_function_with_labels(self):
        services = mock.Mock()
        services.items = []
        labels = {'key1': 'value1', 'key2': 'value2'}
        selector = common.convert_dict_to_string(labels)
        self.k8s_v1_api.list_namespaced_service.return_value = services
        function_id = common.generate_unicode_uuid()

        self.manager.delete_function(function_id, 0, labels=labels)

        self.k8s_v1_api.list_namespaced_service.assert_called_once_with(
            self.fake_namespace, label_selector=selector)
        self.k8s_v1_api.delete_namespaced_service.assert_not_called()
        delete_pod = self.k8s_v1_api.delete_collection_namespaced_pod
        delete_pod.assert_called_once_with(self.fake_namespace,
                                           label_selector=selector)
コード例 #8
0
ファイル: manager.py プロジェクト: Kryndex/qinling
    def _choose_available_pod(self, labels, count=1, function_id=None):
        selector = common.convert_dict_to_string(labels)

        # If there is already a pod for function, reuse it.
        if function_id:
            ret = self.v1.list_namespaced_pod(self.conf.kubernetes.namespace,
                                              label_selector='function_id=%s' %
                                              function_id)
            if len(ret.items) > 0:
                LOG.debug("Function %s already associates to a pod.",
                          function_id)
                return ret.items[:count]

        ret = self.v1.list_namespaced_pod(self.conf.kubernetes.namespace,
                                          label_selector='!function_id,%s' %
                                          selector)

        if len(ret.items) == 0:
            return None

        return ret.items[-count:]
コード例 #9
0
ファイル: manager.py プロジェクト: huzhengchuan/qinling
    def scaleup_function(self,
                         function_id,
                         identifier=None,
                         entry='main.main',
                         count=1):
        pod_names = []
        labels = {'runtime_id': identifier}
        pods = self._choose_available_pod(labels, count=count)

        if not pods:
            raise exc.OrchestratorException('Not enough pods available.')

        temp_function = '%s-temp' % function_id
        for pod in pods:
            self._prepare_pod(pod,
                              identifier,
                              temp_function,
                              labels,
                              entry,
                              actual_function=function_id)

            # Delete temporary service
            selector = common.convert_dict_to_string(
                {'function_id': temp_function})
            ret = self.v1.list_namespaced_service(
                self.conf.kubernetes.namespace, label_selector=selector)
            svc_names = [i.metadata.name for i in ret.items]
            for svc_name in svc_names:
                self.v1.delete_namespaced_service(
                    svc_name,
                    self.conf.kubernetes.namespace,
                )

            # Modify pod labels to fit into correct service
            self._update_pod_label(pod, {'function_id': function_id})

            pod_names.append(pod.metadata.name)

        LOG.info('Pods scaled up for function %s: %s', function_id, pod_names)
        return pod_names
コード例 #10
0
    def get_pool(self, name):
        total = 0
        available = 0

        try:
            ret = self.v1extension.read_namespaced_deployment(
                name, namespace=self.conf.kubernetes.namespace)
        except Exception:
            raise exc.RuntimeNotFoundException()

        if not ret.status.replicas:
            return {"total": total, "available": available}

        total = ret.status.replicas

        labels = {'runtime_id': name}
        selector = common.convert_dict_to_string(labels)
        ret = self.v1.list_namespaced_pod(self.conf.kubernetes.namespace,
                                          label_selector='!function_id,%s' %
                                          selector)
        available = len(ret.items)

        return {"total": total, "available": available}