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)
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:]
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)
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:]
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)
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
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)
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:]
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
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}