def destroy_service(self, service_id): session = get_session() with session.begin(): query = model_query(models.Service, session=session) query = add_identity_filter(query, service_id) count = query.delete() if count != 1: raise exception.ServiceNotFound(service_id)
def get_service_by_uuid(self, context, service_uuid): query = model_query(models.Service) query = self._add_tenant_filters(context, query) query = query.filter_by(uuid=service_uuid) try: return query.one() except NoResultFound: raise exception.ServiceNotFound(service=service_uuid)
def get_services_by_bay_uuid(self, context, bay_uuid): # First verify whether the Bay exists self.get_bay_by_uuid(context, bay_uuid) query = model_query(models.Service).filter_by(bay_uuid=bay_uuid) try: return query.all() except NoResultFound: raise exception.ServiceNotFound(bay=bay_uuid)
def get_service_by_name(self, context, service_name): query = model_query(models.Service) query = self._add_tenant_filters(context, query) query = query.filter_by(name=service_name) try: return query.one() except MultipleResultsFound: raise exception.Conflict('Multiple services exist with same name.' ' Please use the service uuid instead.') except NoResultFound: raise exception.ServiceNotFound(service=service_name)
def _do_update_service(self, service_id, values): session = get_session() with session.begin(): query = model_query(models.Service, session=session) query = add_identity_filter(query, service_id) try: ref = query.with_lockmode('update').one() except NoResultFound: raise exception.ServiceNotFound(service=service_id) if 'provision_state' in values: values['provision_updated_at'] = timeutils.utcnow() ref.update(values) return ref
def get_by_uuid(cls, context, uuid, bay_uuid, k8s_api): """Find a service based on service uuid and UUID of the Bay :param context: Security context :param uuid: the uuid of a service. :param bay_uuid: the UUID of the Bay :param k8s_api: k8s API object :returns: a :class:`Service` object. """ try: resp = 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) service = {} for service_entry in resp.items: if service_entry.metadata.uid == uuid: 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 = Service(context, **service) return service_obj raise exception.ServiceNotFound(service=uuid)
def service_update(self, context, service_ident, bay_ident, manifest): LOG.debug("service_update %s", service_ident) # Since bay identifier is specified verify whether its a UUID # or Name. If name is specified as bay identifier need to extract # the bay uuid since its needed to get the k8s_api object. bay_uuid = conductor_utils.retrieve_bay_uuid(context, bay_ident) self.k8s_api = k8s.create_k8s_api(context, bay_uuid) 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 get_services_by_bay_uuid(self, bay_uuid): query = model_query(models.Service).filter_by(bay_uuid=bay_uuid) try: return query.all() except NoResultFound: raise exception.ServiceNotFound(bay=bay_uuid)
def test_ServiceNotFound(self): self.assertRaises(exception.ServiceNotFound, lambda: self.raise_(exception.ServiceNotFound()))