def get_datastore(self, ds_name, profile=DataStore.DS_PROFILE.BASIC, config=None): """ Factory method to get a datastore instance from given name, profile and config. This is the central point to cache these instances, to decide persistent or mock and to force clean the store on first use. @param ds_name Logical name of datastore (will be scoped with sysname) @param profile One of known constants determining the use of the store @param config Override config to use """ assert ds_name, "Must provide ds_name" if ds_name in self._datastores: log.debug("get_datastore(): Found instance of store '%s'" % ds_name) return self._datastores[ds_name] scoped_name = ("%s_%s" % (get_sys_name(), ds_name)).lower() # Imports here to prevent cyclic module dependency from pyon.core.bootstrap import CFG config = config or CFG persistent = not bool(get_safe(config, "system.mockdb")) force_clean = bool(get_safe(config, "system.force_clean")) log.info( "get_datastore(): Create instance of store '%s' {persistent=%s, force_clean=%s, scoped_name=%s}" % (ds_name, persistent, force_clean, scoped_name) ) # Persistent (CouchDB) or MockDB? if persistent: # Use inline import to prevent circular import dependency from pyon.datastore.couchdb.couchdb_datastore import CouchDB_DataStore new_ds = CouchDB_DataStore(datastore_name=scoped_name, profile=profile) else: # Use inline import to prevent circular import dependency from pyon.datastore.mockdb.mockdb_datastore import MockDB_DataStore new_ds = MockDB_DataStore(datastore_name=scoped_name) # , profile=profile) # Clean the store instance if force_clean: try: new_ds.delete_datastore(scoped_name) except NotFound as nf: pass # Create store if not existing if not new_ds.datastore_exists(scoped_name): new_ds.create_datastore(scoped_name) # Set a few standard datastore instance fields new_ds.local_name = ds_name new_ds.ds_profile = profile self._datastores[ds_name] = new_ds return new_ds