Beispiel #1
0
 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)
Beispiel #2
0
 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)
Beispiel #3
0
 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)
Beispiel #4
0
 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)
Beispiel #5
0
    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
Beispiel #6
0
    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)
Beispiel #7
0
    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
Beispiel #8
0
 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)
Beispiel #9
0
 def test_ServiceNotFound(self):
     self.assertRaises(exception.ServiceNotFound,
                       lambda: self.raise_(exception.ServiceNotFound()))