Example #1
0
    def add_datasource(cls, item, deleted=False, update_db=True):
        req = cls.make_datasource_dict(item)

        # check the request has valid infomation
        cls.validate_create_datasource(req)
        # If update_db is True, new_id will get a new value from the db.
        new_id = req['id']
        LOG.debug("adding datasource %s", req['name'])
        if update_db:
            LOG.debug("updating db")
            try:
                datasource = datasources_db.add_datasource(
                    id_=req['id'],
                    name=req['name'],
                    driver=req['driver'],
                    config=req['config'],
                    description=req['description'],
                    enabled=req['enabled'])
                new_id = datasource['id']
                req['id'] = new_id
            except db_exc.DBDuplicateEntry:
                raise exception.DatasourceNameInUse(value=req['name'])

        try:
            cls._add_datasource_service(req, item)
        except exception.DatasourceNameInUse:
            LOG.info('the datasource service is created by synchronizer.')
        except Exception:
            if update_db:
                datasources_db.delete_datasource(new_id)
            raise

        new_item = dict(item)
        new_item['id'] = new_id
        return cls.make_datasource_dict(new_item)
Example #2
0
    def add_datasource(self, item, deleted=False, update_db=True):
        req = self.make_datasource_dict(item)

        # check the request has valid information
        self.node.validate_create_datasource(req)
        if (len(req['name']) == 0 or req['name'][0] == '_'):
            raise exception.InvalidDatasourceName(value=req['name'])

        new_id = req['id']
        LOG.debug("adding datasource %s", req['name'])
        if update_db:
            LOG.debug("updating db")
            try:
                driver_info = self.node.get_driver_info(req['driver'])
                # Note(thread-safety): blocking call
                datasource = datasources_db.add_datasource(
                    id_=req['id'],
                    name=req['name'],
                    driver=req['driver'],
                    config=req['config'],
                    description=req['description'],
                    enabled=req['enabled'],
                    secret_config_fields=driver_info.get('secret', []))
            except db_exc.DBDuplicateEntry:
                raise exception.DatasourceNameInUse(value=req['name'])
            except db_exc.DBError:
                LOG.exception('Creating a new datasource failed due to '
                              'database backend error.')
                raise exception.DatasourceCreationError(value=req['name'])

        new_id = datasource['id']
        try:
            self.synchronizer.sync_datasource(req['name'])
            # immediate synch policies on local PE if present
            # otherwise wait for regularly scheduled synch
            engine = self.node.service_object(api_base.ENGINE_SERVICE_ID)
            if engine is not None:
                engine.synchronizer.sync_one_policy(req['name'])
            # TODO(dse2): also broadcast to all PE nodes to synch
        except exception.DataServiceError:
            LOG.debug('the datasource service is already '
                      'created in the node')
        except Exception:
            LOG.exception(
                'Unexpected exception encountered while registering '
                'new datasource %s.', req['name'])
            if update_db:
                datasources_db.delete_datasource(req['id'])
            msg = ("Datasource service: %s creation fails." % req['name'])
            raise exception.DatasourceCreationError(message=msg)

        new_item = dict(item)
        new_item['id'] = new_id
        return self.node.make_datasource_dict(new_item)
Example #3
0
 def test_delete_datasource(self):
     id_ = uuidutils.generate_uuid()
     datasources.add_datasource(
         id_=id_, name="hiya", driver="foo", config="{user: foo}", description="hello", enabled=True
     )
     self.assertTrue(datasources.delete_datasource(id_))
     self.assertIsNone(datasources.get_datasource(id_))
Example #4
0
 def test_delete_datasource(self):
     id_ = uuidutils.generate_uuid()
     datasources.add_datasource(id_=id_,
                                name="hiya",
                                driver="foo",
                                config='{user: foo}',
                                description="hello",
                                enabled=True)
     self.assertTrue(datasources.delete_datasource(id_))
Example #5
0
    def add_datasource(self, item, deleted=False, update_db=True):
        req = self.make_datasource_dict(item)

        # check the request has valid information
        self.validate_create_datasource(req)
        if self.is_valid_service(req['name']):
            raise exception.DatasourceNameInUse(value=req['name'])

        new_id = req['id']
        driver_info = self.get_driver_info(item['driver'])
        LOG.debug("adding datasource %s", req['name'])
        if update_db:
            LOG.debug("updating db")
            try:
                datasource = datasources_db.add_datasource(
                    id_=req['id'],
                    name=req['name'],
                    driver=req['driver'],
                    config=req['config'],
                    description=req['description'],
                    enabled=req['enabled'])
            except db_exc.DBDuplicateEntry:
                raise exception.DatasourceNameInUse(value=req['name'])

        new_id = datasource['id']
        try:
            # TODO(dse2): Call synchronizer to create datasource service after
            # implementing synchronizer for dse2.
            # https://bugs.launchpad.net/congress/+bug/1588167
            service = self.create_service(
                class_path=driver_info['module'],
                kwargs={'name': req['name'], 'args': item['config']})
            self.register_service(service)
        except exception.DataServiceError:
            LOG.exception('the datasource service is already'
                          'created in the node')
        except Exception:
            if update_db:
                datasources_db.delete_datasource(new_id)
            raise exception.DatasourceCreationError(value=req['name'])

        new_item = dict(item)
        new_item['id'] = new_id
        return self.make_datasource_dict(new_item)
Example #6
0
 def delete_datasource(self, datasource_id, update_db=True):
     datasource = self.get_datasource(datasource_id)
     session = db.get_session()
     with session.begin(subtransactions=True):
         if update_db:
             result = datasources_db.delete_datasource(
                 datasource_id, session)
             if not result:
                 raise DatasourceNotFound(id=datasource_id)
         self.unregister_service(datasource['name'])
Example #7
0
 def delete_datasource(cls, datasource_id):
     datasource = cls.get_datasource(datasource_id)
     session = db.get_session()
     with session.begin(subtransactions=True):
         cage = d6cage.d6Cage()
         engine = cage.service_object('engine')
         try:
             engine.delete_policy(datasource['name'],
                                  disallow_dangling_refs=True)
         except exception.DanglingReference as e:
             raise e
         except KeyError:
             raise DatasourceNotFound(id=datasource_id)
         result = datasources_db.delete_datasource(
             datasource_id, session)
         if not result:
             raise DatasourceNotFound(id=datasource_id)
         cage.deleteservice(datasource['name'])
Example #8
0
 def delete_datasource(cls, datasource_id, update_db=True):
     datasource = cls.get_datasource(datasource_id)
     session = db.get_session()
     with session.begin(subtransactions=True):
         cage = d6cage.d6Cage()
         engine = cage.service_object('engine')
         try:
             engine.delete_policy(datasource['name'],
                                  disallow_dangling_refs=True)
         except exception.DanglingReference as e:
             raise e
         except KeyError:
             raise DatasourceNotFound(id=datasource_id)
         if update_db:
             result = datasources_db.delete_datasource(
                 datasource_id, session)
             if not result:
                 raise DatasourceNotFound(id=datasource_id)
         cage.deleteservice(datasource['name'])
Example #9
0
 def test_delete_non_existing_datasource(self):
     self.assertFalse(datasources.delete_datasource("no_id"))
Example #10
0
 def test_delete_non_existing_datasource(self):
     self.assertFalse(datasources.delete_datasource('no_id'))