def _test_retrieve_bay(self, obj, mock_bay_get_by_uuid): expected_context = 'context' expected_bay_uuid = 'bay_uuid' obj.bay_uuid = expected_bay_uuid utils.retrieve_bay(expected_context, obj) mock_bay_get_by_uuid.assert_called_once_with(expected_context, expected_bay_uuid)
def pod_list(self, context, bay_ident): bay = conductor_utils.retrieve_bay(context, bay_ident) self.k8s_api = k8s.create_k8s_api(context, bay) try: resp = self.k8s_api.list_namespaced_pod(namespace='default') except rest.ApiException as err: raise exception.KubernetesAPIFailed(err=err) if resp is None: raise exception.PodListNotFound(bay_uuid=bay.uuid) pods = [] for pod_entry in resp.items: pod = {} pod['uuid'] = pod_entry.metadata.uid pod['name'] = pod_entry.metadata.name pod['project_id'] = context.project_id pod['user_id'] = context.user_id pod['bay_uuid'] = bay.uuid pod['images'] = [c.image for c in pod_entry.spec.containers] if not pod_entry.metadata.labels: pod['labels'] = {} else: pod['labels'] = ast.literal_eval(pod_entry.metadata.labels) pod['status'] = pod_entry.status.phase pod['host'] = pod_entry.spec.node_name pod_obj = objects.Pod(context, **pod) pods.append(pod_obj) return pods
def rc_update(self, context, rc_ident, bay_ident, manifest): LOG.debug("rc_update %s", rc_ident) bay = conductor_utils.retrieve_bay(context, bay_ident) self.k8s_api = k8s.create_k8s_api(context, bay) if uuidutils.is_uuid_like(rc_ident): rc = objects.ReplicationController.get_by_uuid(context, rc_ident, bay.uuid, self.k8s_api) else: rc = objects.ReplicationController.get_by_name(context, rc_ident, bay.uuid, self.k8s_api) try: resp = self.k8s_api.replace_namespaced_replication_controller( name=str(rc.name), body=manifest, namespace='default') except rest.ApiException as err: raise exception.KubernetesAPIFailed(err=err) if resp is None: raise exception.ReplicationControllerNotFound(rc=rc.uuid) rc['uuid'] = resp.metadata.uid rc['name'] = resp.metadata.name rc['project_id'] = context.project_id rc['user_id'] = context.user_id rc['images'] = [c.image for c in resp.spec.template.spec.containers] rc['bay_uuid'] = bay.uuid rc['labels'] = ast.literal_eval(resp.metadata.labels) rc['replicas'] = resp.status.replicas return rc
def pod_update(self, context, pod_ident, bay_ident, manifest): LOG.debug("pod_update %s", pod_ident) bay = conductor_utils.retrieve_bay(context, bay_ident) self.k8s_api = k8s.create_k8s_api(context, bay) if utils.is_uuid_like(pod_ident): pod = objects.Pod.get_by_uuid(context, pod_ident, bay.uuid, self.k8s_api) else: pod = objects.Pod.get_by_name(context, pod_ident, bay.uuid, self.k8s_api) pod_ident = pod.name try: resp = self.k8s_api.replace_namespaced_pod(name=str(pod_ident), body=manifest, namespace='default') except rest.ApiException as err: raise exception.KubernetesAPIFailed(err=err) if resp is None: raise exception.PodNotFound(pod=pod.uuid) pod['uuid'] = resp.metadata.uid pod['name'] = resp.metadata.name pod['project_id'] = context.project_id pod['user_id'] = context.user_id pod['bay_uuid'] = bay.uuid pod['images'] = [c.image for c in resp.spec.containers] if not resp.metadata.labels: pod['labels'] = {} else: pod['labels'] = ast.literal_eval(resp.metadata.labels) pod['status'] = resp.status.phase pod['host'] = resp.spec.node_name return pod
def rc_update(self, context, rc_ident, bay_ident, manifest): LOG.debug("rc_update %s", rc_ident) bay = conductor_utils.retrieve_bay(context, bay_ident) self.k8s_api = k8s.create_k8s_api(context, bay) if utils.is_uuid_like(rc_ident): rc = objects.ReplicationController.get_by_uuid(context, rc_ident, bay.uuid, self.k8s_api) else: rc = objects.ReplicationController.get_by_name(context, rc_ident, bay.uuid, self.k8s_api) try: resp = self.k8s_api.replace_namespaced_replication_controller( name=str(rc.name), body=manifest, namespace='default') except rest.ApiException as err: raise exception.KubernetesAPIFailed(err=err) if resp is None: raise exception.ReplicationControllerNotFound(rc=rc.uuid) rc['uuid'] = resp.metadata.uid rc['name'] = resp.metadata.name rc['project_id'] = context.project_id rc['user_id'] = context.user_id rc['images'] = [c.image for c in resp.spec.template.spec.containers] rc['bay_uuid'] = bay.uuid rc['labels'] = ast.literal_eval(resp.metadata.labels) rc['replicas'] = resp.status.replicas return rc
def service_create(self, context, service): LOG.debug("service_create") bay = conductor_utils.retrieve_bay(context, service.bay_uuid) self.k8s_api = k8s.create_k8s_api(context, bay) manifest = k8s_manifest.parse(service.manifest) try: resp = self.k8s_api.create_namespaced_service(body=manifest, namespace='default') except rest.ApiException as err: raise exception.KubernetesAPIFailed(err=err) if resp is None: raise exception.ServiceCreationFailed(bay_uuid=service.bay_uuid) service['uuid'] = resp.metadata.uid service['name'] = resp.metadata.name service['labels'] = ast.literal_eval(resp.metadata.labels) service['selector'] = ast.literal_eval(resp.spec.selector) service['ip'] = resp.spec.cluster_ip service_value = [] for p in resp.spec.ports: ports = p.to_dict() if not ports['name']: ports['name'] = 'k8s-service' service_value.append(ports) service['ports'] = service_value return service
def rc_list(self, context, bay_ident): bay = conductor_utils.retrieve_bay(context, bay_ident) self.k8s_api = k8s.create_k8s_api(context, bay) try: resp = self.k8s_api.list_namespaced_replication_controller( namespace='default') except rest.ApiException as err: raise exception.KubernetesAPIFailed(err=err) if resp is None: raise exception.ReplicationControllerListNotFound( bay_uuid=bay.uuid) rcs = [] for entry in resp._items: rc = {} rc['uuid'] = entry.metadata.uid rc['name'] = entry.metadata.name rc['project_id'] = context.project_id rc['user_id'] = context.user_id rc['images'] = [ c.image for c in entry.spec.template.spec.containers] rc['bay_uuid'] = bay.uuid # Convert string to dictionary rc['labels'] = ast.literal_eval(entry.metadata.labels) rc['replicas'] = entry.status.replicas rc_obj = objects.ReplicationController(context, **rc) rcs.append(rc_obj) return rcs
def _retrieve_k8s_api_endpoint(context, obj): if hasattr(obj, 'bay_uuid'): obj = utils.retrieve_bay(context, obj) params = { 'k8s_protocol': cfg.CONF.kubernetes.k8s_protocol, 'api_address': obj.api_address } return "%(k8s_protocol)s://%(api_address)s" % params
def pod_show(self, context, pod_ident, bay_ident): LOG.debug("pod_show %s", pod_ident) bay = conductor_utils.retrieve_bay(context, bay_ident) self.k8s_api = k8s.create_k8s_api(context, bay) if utils.is_uuid_like(pod_ident): pod = objects.Pod.get_by_uuid(context, pod_ident, bay.uuid, self.k8s_api) else: pod = objects.Pod.get_by_name(context, pod_ident, bay.uuid, self.k8s_api) return pod
def service_show(self, context, service_ident, bay_ident): LOG.debug("service_show %s", service_ident) bay = conductor_utils.retrieve_bay(context, bay_ident) self.k8s_api = k8s.create_k8s_api(context, bay) if utils.is_uuid_like(service_ident): service = objects.Service.get_by_uuid(context, service_ident, bay.uuid, self.k8s_api) else: service = objects.Service.get_by_name(context, service_ident, bay.uuid, self.k8s_api) return service
def rc_show(self, context, rc_ident, bay_ident): LOG.debug("rc_show %s", rc_ident) bay = conductor_utils.retrieve_bay(context, bay_ident) self.k8s_api = k8s.create_k8s_api(context, bay) if utils.is_uuid_like(rc_ident): rc = objects.ReplicationController.get_by_uuid( context, rc_ident, bay.uuid, self.k8s_api) else: rc = objects.ReplicationController.get_by_name( context, rc_ident, bay.uuid, self.k8s_api) return rc
def rc_show(self, context, rc_ident, bay_ident): LOG.debug("rc_show %s", rc_ident) bay = conductor_utils.retrieve_bay(context, bay_ident) self.k8s_api = k8s.create_k8s_api(context, bay) if utils.is_uuid_like(rc_ident): rc = objects.ReplicationController.get_by_uuid(context, rc_ident, bay.uuid, self.k8s_api) else: rc = objects.ReplicationController.get_by_name(context, rc_ident, bay.uuid, self.k8s_api) return rc
def __init__(self, context, bay_uuid): self.ca_file = None self.cert_file = None self.key_file = None bay = utils.retrieve_bay(context, bay_uuid) if bay.magnum_cert_ref: self._create_certificate_files(bay) # build a connection with Kubernetes master client = api_client.ApiClient(bay.api_address, key_file=self.key_file.name, cert_file=self.cert_file.name, ca_certs=self.ca_file.name) super(K8sAPI_RC, self).__init__(client)
def __init__(self, context, bay_uuid): self.ca_file = None self.cert_file = None self.key_file = None bay = utils.retrieve_bay(context, bay_uuid) if bay.magnum_cert_ref: self._create_certificate_files(bay) # build a connection with Kubernetes master client = api_client.ApiClient(bay.api_address, key_file=self.key_file.name, cert_file=self.cert_file.name, ca_certs=self.ca_file.name) super(K8sAPI, self).__init__(client)
def service_update(self, context, service_ident, bay_ident, manifest): LOG.debug("service_update %s", service_ident) bay = conductor_utils.retrieve_bay(context, bay_ident) self.k8s_api = k8s.create_k8s_api(context, bay) if utils.is_uuid_like(service_ident): service = objects.Service.get_by_uuid(context, service_ident, bay.uuid, self.k8s_api) else: service = objects.Service.get_by_name(context, service_ident, bay.uuid, self.k8s_api) service_ident = service.name try: resp = self.k8s_api.replace_namespaced_service( name=str(service_ident), body=manifest, namespace='default') except rest.ApiException as err: raise exception.KubernetesAPIFailed(err=err) if resp is None: raise exception.ServiceNotFound(service=service.uuid) service['uuid'] = resp.metadata.uid service['name'] = resp.metadata.name service['project_id'] = context.project_id service['user_id'] = context.user_id service['bay_uuid'] = bay.uuid service['labels'] = ast.literal_eval(resp.metadata.labels) if not resp.spec.selector: service['selector'] = {} else: service['selector'] = ast.literal_eval(resp.spec.selector) service['ip'] = resp.spec.cluster_ip service_value = [] for p in resp.spec.ports: ports = p.to_dict() if not ports['name']: ports['name'] = 'k8s-service' service_value.append(ports) service['ports'] = service_value return service
def rc_delete(self, context, rc_ident, bay_ident): LOG.debug("rc_delete %s", rc_ident) bay = conductor_utils.retrieve_bay(context, bay_ident) self.k8s_api = k8s.create_k8s_api(context, bay) if utils.is_uuid_like(rc_ident): rc = objects.ReplicationController.get_by_uuid( context, rc_ident, bay.uuid, self.k8s_api) rc_name = rc.name else: rc_name = rc_ident if conductor_utils.object_has_stack(context, bay.uuid): try: self.k8s_api.delete_namespaced_replication_controller( name=str(rc_name), body={}, namespace='default') except rest.ApiException as err: if err.status == 404: pass else: raise exception.KubernetesAPIFailed(err=err)
def pod_delete(self, context, pod_ident, bay_ident): LOG.debug("pod_delete %s", pod_ident) bay = conductor_utils.retrieve_bay(context, bay_ident) self.k8s_api = k8s.create_k8s_api(context, bay) if utils.is_uuid_like(pod_ident): pod = objects.Pod.get_by_uuid(context, pod_ident, bay.uuid, self.k8s_api) pod_name = pod.name else: pod_name = pod_ident if conductor_utils.object_has_stack(context, bay.uuid): try: self.k8s_api.delete_namespaced_pod(name=str(pod_name), body={}, namespace='default') except rest.ApiException as err: if err.status == 404: pass else: raise exception.KubernetesAPIFailed(err=err)
def __init__(self, context, obj): self.ca_file = None self.cert_file = None self.key_file = None # If the obj is already a Bay we need not retrieve a Bay. if isinstance(obj, Bay): bay = obj else: bay = utils.retrieve_bay(context, obj.bay_uuid) if bay.magnum_cert_ref: self._create_certificate_files(bay) # build a connection with Kubernetes master client = api_client.ApiClient(bay.api_address, key_file=self.key_file.name, cert_file=self.cert_file.name, ca_certs=self.ca_file.name) super(K8sAPI, self).__init__(client)
def service_delete(self, context, service_ident, bay_ident): LOG.debug("service_delete %s", service_ident) bay = conductor_utils.retrieve_bay(context, bay_ident) self.k8s_api = k8s.create_k8s_api(context, bay) if utils.is_uuid_like(service_ident): service = objects.Service.get_by_uuid(context, service_ident, bay.uuid, self.k8s_api) service_name = service.name else: service_name = service_ident if conductor_utils.object_has_stack(context, bay.uuid): try: self.k8s_api.delete_namespaced_service(name=str(service_name), namespace='default') except rest.ApiException as err: if err.status == 404: pass else: raise exception.KubernetesAPIFailed(err=err)
def rc_create(self, context, rc): LOG.debug("rc_create") bay = conductor_utils.retrieve_bay(context, rc.bay_uuid) self.k8s_api = k8s.create_k8s_api(context, bay) manifest = k8s_manifest.parse(rc.manifest) try: resp = self.k8s_api.create_namespaced_replication_controller( body=manifest, namespace='default') except rest.ApiException as err: raise exception.KubernetesAPIFailed(err=err) if resp is None: raise exception.ReplicationControllerCreationFailed( bay_uuid=rc.bay_uuid) rc['uuid'] = resp.metadata.uid rc['name'] = resp.metadata.name rc['images'] = [c.image for c in resp.spec.template.spec.containers] rc['labels'] = ast.literal_eval(resp.metadata.labels) rc['replicas'] = resp.status.replicas return rc
def service_list(self, context, bay_ident): bay = conductor_utils.retrieve_bay(context, bay_ident) self.k8s_api = k8s.create_k8s_api(context, bay) try: resp = self.k8s_api.list_namespaced_service(namespace='default') except rest.ApiException as err: raise exception.KubernetesAPIFailed(err=err) if resp is None: raise exception.ServiceListNotFound(bay_uuid=bay.uuid) services = [] for service_entry in resp.items: service = {} service['uuid'] = service_entry.metadata.uid service['name'] = service_entry.metadata.name service['project_id'] = context.project_id service['user_id'] = context.user_id service['bay_uuid'] = bay.uuid service['labels'] = ast.literal_eval( service_entry.metadata.labels) if not service_entry.spec.selector: service['selector'] = {} else: service['selector'] = ast.literal_eval( service_entry.spec.selector) service['ip'] = service_entry.spec.cluster_ip service_value = [] for p in service_entry.spec.ports: ports = p.to_dict() if not ports['name']: ports['name'] = 'k8s-service' service_value.append(ports) service['ports'] = service_value service_obj = objects.Service(context, **service) services.append(service_obj) return services
def rc_delete(self, context, rc_ident, bay_ident): LOG.debug("rc_delete %s", rc_ident) bay = conductor_utils.retrieve_bay(context, bay_ident) self.k8s_api = k8s.create_k8s_api(context, bay) if utils.is_uuid_like(rc_ident): rc = objects.ReplicationController.get_by_uuid(context, rc_ident, bay.uuid, self.k8s_api) rc_name = rc.name else: rc_name = rc_ident if conductor_utils.object_has_stack(context, bay.uuid): try: self.k8s_api.delete_namespaced_replication_controller( name=str(rc_name), body={}, namespace='default') except rest.ApiException as err: if err.status == 404: pass else: raise exception.KubernetesAPIFailed(err=err)
def service_list(self, context, bay_ident): bay = conductor_utils.retrieve_bay(context, bay_ident) self.k8s_api = k8s.create_k8s_api(context, bay) try: resp = self.k8s_api.list_namespaced_service(namespace='default') except rest.ApiException as err: raise exception.KubernetesAPIFailed(err=err) if resp is None: raise exception.ServiceListNotFound(bay_uuid=bay.uuid) services = [] for service_entry in resp.items: service = {} service['uuid'] = service_entry.metadata.uid service['name'] = service_entry.metadata.name service['project_id'] = context.project_id service['user_id'] = context.user_id service['bay_uuid'] = bay.uuid service['labels'] = ast.literal_eval(service_entry.metadata.labels) if not service_entry.spec.selector: service['selector'] = {} else: service['selector'] = ast.literal_eval( service_entry.spec.selector) service['ip'] = service_entry.spec.cluster_ip service_value = [] for p in service_entry.spec.ports: ports = p.to_dict() if not ports['name']: ports['name'] = 'k8s-service' service_value.append(ports) service['ports'] = service_value service_obj = objects.Service(context, **service) services.append(service_obj) return services
def pod_create(self, context, pod): LOG.debug("pod_create") bay = conductor_utils.retrieve_bay(context, pod.bay_uuid) self.k8s_api = k8s.create_k8s_api(context, bay) manifest = k8s_manifest.parse(pod.manifest) try: resp = self.k8s_api.create_namespaced_pod(body=manifest, namespace='default') except rest.ApiException as err: pod.status = 'failed' raise exception.KubernetesAPIFailed(err=err) if resp is None: raise exception.PodCreationFailed(bay_uuid=pod.bay_uuid) pod['uuid'] = resp.metadata.uid pod['name'] = resp.metadata.name pod['images'] = [c.image for c in resp.spec.containers] pod['labels'] = ast.literal_eval(resp.metadata.labels) pod['status'] = resp.status.phase pod['host'] = resp.spec.node_name return pod
def _test_retrieve_bay(self, expected_bay_uuid, mock_bay_get_by_uuid): expected_context = 'context' utils.retrieve_bay(expected_context, expected_bay_uuid) mock_bay_get_by_uuid.assert_called_once_with(expected_context, expected_bay_uuid)
def test_retrieve_bay_uuid(self, mock_get_by_uuid): mock_get_by_uuid.return_value = True utils.retrieve_bay('context', '5d12f6fd-a196-4bf0-ae4c-1f639a523a52') self.assertTrue(mock_get_by_uuid.called)
def test_retrieve_bay_name(self, mock_get_by_name): mock_get_by_name.return_value = mock.MagicMock() utils.retrieve_bay('context', '1') self.assertTrue(mock_get_by_name.called)
def docker_for_container(context, container): if magnum_utils.is_uuid_like(container): container = objects.Container.get_by_uuid(context, container) bay = conductor_utils.retrieve_bay(context, container.bay_uuid) with docker_for_bay(context, bay) as docker: yield docker
def _docker_for_container(cls, context, container): bay = conductor_utils.retrieve_bay(context, container) return cls._docker_for_bay(bay)
def docker_for_container(context, container): if uuidutils.is_uuid_like(container): container = objects.Container.get_by_uuid(context, container) bay = conductor_utils.retrieve_bay(context, container.bay_uuid) with docker_for_bay(context, bay) as docker: yield docker