From: tierno Date: Fri, 19 Oct 2018 12:12:28 +0000 (+0200) Subject: bug 559: generating database version 1.0 X-Git-Tag: v5.0.0~30 X-Git-Url: https://osm.etsi.org/gitweb/?a=commitdiff_plain;h=refs%2Fchanges%2F30%2F6730%2F4;p=osm%2FNBI.git bug 559: generating database version 1.0 Change-Id: Ie89335092d9733433b45de31ad7f5109a0643f53 Signed-off-by: tierno --- diff --git a/Dockerfile.local b/Dockerfile.local index f7dd01e..c76bc90 100644 --- a/Dockerfile.local +++ b/Dockerfile.local @@ -52,6 +52,9 @@ ENV OSMNBI_STORAGE_PATH /app/storage ENV OSMNBI_DATABASE_DRIVER mongo ENV OSMNBI_DATABASE_HOST mongo ENV OSMNBI_DATABASE_PORT 27017 +# ENV OSMNBI_DATABASE_USER xxx +# ENV OSMNBI_DATABASE_PASSWORD xxx +# ENV OSMNBI_DATABASE_MASTERPASSWORD xxx # web ENV OSMNBI_STATIC_DIR /app/osm_nbi/html_public # logs diff --git a/osm_nbi/auth.py b/osm_nbi/auth.py index 90fc1e2..a734b46 100644 --- a/osm_nbi/auth.py +++ b/osm_nbi/auth.py @@ -84,9 +84,9 @@ class Authenticator: except DbException as e: raise AuthException(str(e), http_code=e.http_code) - def init_db(self, target_version='1.0'): + def init_db(self, target_version='1.1'): """ - Check if the database has been initialized. If not, create the required tables + Check if the database has been initialized, with at least one user. If not, create an adthe required tables and insert the predefined mappings between roles and permissions. :param target_version: schema version that should be present in the database. diff --git a/osm_nbi/engine.py b/osm_nbi/engine.py index 1946189..3cdacd9 100644 --- a/osm_nbi/engine.py +++ b/osm_nbi/engine.py @@ -10,6 +10,8 @@ from base_topic import EngineException, versiontuple from admin_topics import UserTopic, ProjectTopic, VimAccountTopic, SdnTopic from descriptor_topics import VnfdTopic, NsdTopic, PduTopic from instance_topics import NsrTopic, VnfrTopic, NsLcmOpTopic +from base64 import b64encode +from os import urandom __author__ = "Alfonso Tierno " min_common_version = "0.1.8" @@ -229,30 +231,49 @@ class Engine(object): _id = self.map_topic["users"].new(roolback_list, fake_session, user_desc, force=True) return _id + def upgrade_db(self, current_version, target_version): + if not target_version or current_version == target_version: + return + if target_version == '1.0': + if not current_version: + # create database version + serial = urandom(32) + version_data = { + "_id": 'version', # Always 'version' + "version_int": 1000, # version number + "version": '1.0', # version text + "date": "2018-10-25", # version date + "description": "added serial", # changes in this version + 'status': 'ENABLED', # ENABLED, DISABLED (migration in process), ERROR, + 'serial': b64encode(serial) + } + self.db.create("admin", version_data) + self.db.set_secret_key(serial) + # TODO add future migrations here + + raise EngineException("Wrong database version '{}'. Expected '{}'" + ". It cannot be up/down-grade".format(current_version, target_version), + http_code=HTTPStatus.INTERNAL_SERVER_ERROR) + def init_db(self, target_version='1.0'): """ - Init database if empty. If not empty it checks that database version is ok. + Init database if empty. If not empty it checks that database version and migrates if needed If empty, it creates a new user admin/admin at 'users' and a new entry at 'version' + :param target_version: check desired database version. Migrate to it if possible or raises exception :return: None if ok, exception if error or if the version is different. """ - version = self.db.get_one("version", fail_on_empty=False, fail_on_more=False) - if not version: - # create user admin - self.create_admin() - # create database version - version_data = { - "_id": '1.0', # version text - "version": 1000, # version number - "date": "2018-04-12", # version date - "description": "initial design", # changes in this version - 'status': 'ENABLED' # ENABLED, DISABLED (migration in process), ERROR, - } - self.db.create("version", version_data) - elif version["_id"] != target_version: - # TODO implement migration process - raise EngineException("Wrong database version '{}'. Expected '{}'".format( - version["_id"], target_version), HTTPStatus.INTERNAL_SERVER_ERROR) - elif version["status"] != 'ENABLED': + + version_data = self.db.get_one("admin", {"_id": "version"}, fail_on_empty=False, fail_on_more=True) + # check database status is ok + if version_data and version_data.get("status") != 'ENABLED': raise EngineException("Wrong database status '{}'".format( - version["status"]), HTTPStatus.INTERNAL_SERVER_ERROR) + version_data["status"]), HTTPStatus.INTERNAL_SERVER_ERROR) + + # check version + db_version = None if not version_data else version_data.get("version") + if db_version != target_version: + self.upgrade_db(db_version, target_version) + + # create user admin if not exist + self.create_admin() return diff --git a/osm_nbi/nbi.cfg b/osm_nbi/nbi.cfg index 07956ed..215211d 100644 --- a/osm_nbi/nbi.cfg +++ b/osm_nbi/nbi.cfg @@ -48,8 +48,9 @@ driver: "mongo" # mongo or memory host: "mongo" # hostname or IP port: 27017 name: "osm" -user: "user" -password: "password" +# user: "user" +# password: "password" +# materpassword: "mpasswd" loglevel: "DEBUG" #logfile: /var/log/osm/nbi-database.log diff --git a/osm_nbi/nbi.py b/osm_nbi/nbi.py index 60a327e..4a5b0cc 100644 --- a/osm_nbi/nbi.py +++ b/osm_nbi/nbi.py @@ -858,11 +858,8 @@ def _start_service(): # TODO add more entries, e.g.: storage cherrypy.tree.apps['/osm'].root.engine.start(engine_config) cherrypy.tree.apps['/osm'].root.authenticator.start(engine_config) - try: - cherrypy.tree.apps['/osm'].root.engine.init_db(target_version=database_version) - cherrypy.tree.apps['/osm'].root.authenticator.init_db(target_version=auth_database_version) - except (EngineException, AuthException): - pass + cherrypy.tree.apps['/osm'].root.engine.init_db(target_version=database_version) + cherrypy.tree.apps['/osm'].root.authenticator.init_db(target_version=auth_database_version) # getenv('OSMOPENMANO_TENANT', None)