X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FNBI.git;a=blobdiff_plain;f=osm_nbi%2Fengine.py;h=38cc08e0b327600f062a06e7f180a4de404a2d57;hp=19461895c4504b5f93445acc60b2bb85087d548f;hb=e86317875d395c37b3ded147b554ced8a8115358;hpb=870060400cacf0aaa511fca035937544173237f0 diff --git a/osm_nbi/engine.py b/osm_nbi/engine.py index 1946189..38cc08e 100644 --- a/osm_nbi/engine.py +++ b/osm_nbi/engine.py @@ -1,5 +1,18 @@ # -*- coding: utf-8 -*- +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +# implied. +# See the License for the specific language governing permissions and +# limitations under the License. + import logging from osm_common import dbmongo, dbmemory, fslocal, msglocal, msgkafka, version as common_version from osm_common.dbbase import DbException @@ -7,9 +20,11 @@ from osm_common.fsbase import FsException from osm_common.msgbase import MsgException from http import HTTPStatus 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 admin_topics import UserTopic, ProjectTopic, VimAccountTopic, WimAccountTopic, SdnTopic +from descriptor_topics import VnfdTopic, NsdTopic, PduTopic, NstTopic +from instance_topics import NsrTopic, VnfrTopic, NsLcmOpTopic, NsiTopic, NsiLcmOpTopic +from base64 import b64encode +from os import urandom __author__ = "Alfonso Tierno " min_common_version = "0.1.8" @@ -19,14 +34,18 @@ class Engine(object): map_from_topic_to_class = { "vnfds": VnfdTopic, "nsds": NsdTopic, + "nsts": NstTopic, "pdus": PduTopic, "nsrs": NsrTopic, "vnfrs": VnfrTopic, "nslcmops": NsLcmOpTopic, "vim_accounts": VimAccountTopic, + "wim_accounts": WimAccountTopic, "sdns": SdnTopic, "users": UserTopic, "projects": ProjectTopic, + "nsis": NsiTopic, + "nsilcmops": NsiLcmOpTopic # [NEW_TOPIC]: add an entry here } @@ -207,13 +226,6 @@ class Engine(object): raise EngineException("Unknown topic {}!!!".format(topic), HTTPStatus.INTERNAL_SERVER_ERROR) return self.map_topic[topic].edit(session, _id, indata, kwargs, force) - def prune(self): - """ - Prune database not needed content - :return: None - """ - return self.db.del_list("nsrs", {"_admin.to_delete": True}) - def create_admin(self): """ Creates a new user admin/admin into database if database is empty. Useful for initialization @@ -229,30 +241,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