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)
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)
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_))
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_))
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)
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'])
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'])
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'])
def test_delete_non_existing_datasource(self): self.assertFalse(datasources.delete_datasource("no_id"))
def test_delete_non_existing_datasource(self): self.assertFalse(datasources.delete_datasource('no_id'))