X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=openmanod;h=a4af12f3e07be8bf31b8fa39dcdfd85f644d734c;hb=9bdf25b0cb27696f2622e063976024de8d0e7cea;hp=94924bd720ef4ee93948a4d585baf3ba1ae98faf;hpb=07a88ed2e8985d3001766247baad258e264b5338;p=osm%2FRO.git diff --git a/openmanod b/openmanod index 94924bd7..a4af12f3 100755 --- a/openmanod +++ b/openmanod @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- ## -# Copyright 2015 Telefónica Investigación y Desarrollo, S.A.U. +# Copyright 2015 Telefonica Investigacion y Desarrollo, S.A.U. # This file is part of openmano # All Rights Reserved. # @@ -27,7 +27,7 @@ openmano server. Main program that implements a reference NFVO (Network Functions Virtualisation Orchestrator). It interfaces with an NFV VIM through its API and offers a northbound interface, based on REST (openmano API), where NFV services are offered including the creation and deletion of VNF templates, VNF instances, -network service templates and network service instances. +network service templates and network service instances. It loads the configuration file and launches the http_server thread that will listen requests using openmano API. """ @@ -36,7 +36,7 @@ import time import sys import getopt import yaml -import os.path +from os import environ, path as os_path from jsonschema import validate as js_v, exceptions as js_e import logging import logging.handlers as log_handlers @@ -44,13 +44,15 @@ import socket from osm_ro import httpserver, nfvo, nfvo_db from osm_ro.openmano_schemas import config_schema from osm_ro.db_base import db_base_Exception +from osm_ro.wim.engine import WimEngine +from osm_ro.wim.persistence import WimPersistence import osm_ro __author__ = "Alfonso Tierno, Gerardo Garcia, Pablo Montes" __date__ = "$26-aug-2014 11:09:29$" -__version__ = "0.5.21-r531" -version_date = "Aug 2017" -database_version = 24 # expected database schema version +__version__ = "0.6.04" +version_date = "Jan 2019" +database_version = 36 # expected database schema version global global_config global logger @@ -59,9 +61,10 @@ global logger class LoadConfigurationException(Exception): pass + def load_configuration(configuration_file): - default_tokens = {'http_port':9090, - 'http_host':'localhost', + default_tokens = {'http_port': 9090, + 'http_host': 'localhost', 'http_console_proxy': True, 'http_console_host': None, 'log_level': 'DEBUG', @@ -104,7 +107,7 @@ def load_configuration(configuration_file): def console_port_iterator(): - '''this iterator deals with the http_console_ports + '''this iterator deals with the http_console_ports returning the ports one by one ''' index = 0 @@ -125,15 +128,16 @@ def console_port_iterator(): def usage(): print("Usage: ", sys.argv[0], "[options]") - print( " -v|--version: prints current version") - print( " -c|--config [configuration_file]: loads the configuration file (default: openmanod.cfg)") - print( " -h|--help: shows this help") - print( " -p|--port [port_number]: changes port number and overrides the port number in the configuration file (default: 9090)") - print( " -P|--adminport [port_number]: changes admin port number and overrides the port number in the configuration file (default: 9095)") - #print( " -V|--vnf-repository: changes the path of the vnf-repository and overrides the path in the configuration file") - print( " --log-socket-host HOST: send logs to this host") - print( " --log-socket-port PORT: send logs using this port (default: 9022)") - print( " --log-file FILE: send logs to this file") + print(" -v|--version: prints current version") + print(" -c|--config [configuration_file]: loads the configuration file (default: openmanod.cfg)") + print(" -h|--help: shows this help") + print(" -p|--port [port_number]: changes port number and overrides the port number in the configuration file (default: 9090)") + print(" -P|--adminport [port_number]: changes admin port number and overrides the port number in the configuration file (default: 9095)") + # print( " -V|--vnf-repository: changes the path of the vnf-repository and overrides the path in the configuration file") + print(" --log-socket-host HOST: send logs to this host") + print(" --log-socket-port PORT: send logs using this port (default: 9022)") + print(" --log-file FILE: send logs to this file") + print(" --create-tenant NAME: Try to creates this tenant name before starting, ignoring any errors as e.g. conflict") return @@ -152,6 +156,22 @@ def set_logging_file(log_file): if __name__=="__main__": + # env2config contains envioron variable names and the correspondence with configuration file openmanod.cfg keys. + # If this environ is defined, this value is taken instead of the one at at configuration file + env2config = { + 'RO_DB_HOST': 'db_host', + 'RO_DB_NAME': 'db_name', + 'RO_DB_USER': 'db_user', + 'RO_DB_PASSWORD': 'db_passwd', + # 'RO_DB_PORT': 'db_port', + 'RO_DB_OVIM_HOST': 'db_ovim_host', + 'RO_DB_OVIM_NAME': 'db_ovim_name', + 'RO_DB_OVIM_USER': 'db_ovim_user', + 'RO_DB_OVIM_PASSWORD': 'db_ovim_passwd', + # 'RO_DB_OVIM_PORT': 'db_ovim_port', + 'RO_LOG_LEVEL': 'log_level', + 'RO_LOG_FILE': 'log_file', + } # Configure logging step 1 hostname = socket.gethostname() # streamformat = "%(levelname)s (%(module)s:%(lineno)d) %(message)s" @@ -160,7 +180,7 @@ if __name__=="__main__": 'severity:%(levelname)s logger:%(name)s log:%(message)s'.format( host=hostname), datefmt='%Y-%m-%dT%H:%M:%S') - log_format_simple = "%(asctime)s %(levelname)s %(name)s %(filename)s:%(lineno)s %(message)s" + log_format_simple = "%(asctime)s %(levelname)s %(name)s %(thread)d %(filename)s:%(lineno)s %(message)s" log_formatter_simple = logging.Formatter(log_format_simple, datefmt='%Y-%m-%dT%H:%M:%S') logging.basicConfig(format=log_format_simple, level= logging.DEBUG) logger = logging.getLogger('openmano') @@ -169,8 +189,10 @@ if __name__=="__main__": # Read parameters and configuration file httpthread = None try: - #load parameters and configuration - opts, args = getopt.getopt(sys.argv[1:], "hvc:V:p:P:", ["config=", "help", "version", "port=", "vnf-repository=", "adminport=", "log-socket-host=", "log-socket-port=", "log-file="]) + # load parameters and configuration + opts, args = getopt.getopt(sys.argv[1:], "hvc:V:p:P:", + ["config=", "help", "version", "port=", "vnf-repository=", "adminport=", + "log-socket-host=", "log-socket-port=", "log-file=", "create-tenant="]) port=None port_admin = None config_file = 'osm_ro/openmanod.cfg' @@ -178,6 +200,7 @@ if __name__=="__main__": log_file = None log_socket_host = None log_socket_port = None + create_tenant = None for o, a in opts: if o in ("-v", "--version"): @@ -201,6 +224,8 @@ if __name__=="__main__": log_socket_host = a elif o == "--log-file": log_file = a + elif o == "--create-tenant": + create_tenant = a else: assert False, "Unhandled option" if log_file: @@ -209,7 +234,7 @@ if __name__=="__main__": global_config["version"] = __version__ global_config["version_date"] = version_date #print global_config - # Override parameters obtained by command line + # Override parameters obtained by command line on ENV if port: global_config['http_port'] = port if port_admin: @@ -218,6 +243,18 @@ if __name__=="__main__": global_config['log_socket_host'] = log_socket_host if log_socket_port: global_config['log_socket_port'] = log_socket_port + + # override with ENV + for env_k, env_v in environ.items(): + try: + if not env_k.startswith("RO_") or env_k not in env2config or not env_v: + continue + global_config[env2config[env_k]] = env_v + if env_k.endswith("PORT"): # convert to int, skip if not possible + global_config[env2config[env_k]] = int(env_v) + except Exception as e: + logger.warn("skipping environ '{}={}' because exception '{}'".format(env_k, env_v, e)) + # if vnf_repository is not None: # global_config['vnf_repository'] = vnf_repository # else: @@ -260,7 +297,7 @@ if __name__=="__main__": logger.critical("Starting openmano server version: '%s %s' command: '%s'", __version__, version_date, " ".join(sys.argv)) - for log_module in ("nfvo", "http", "vim", "db", "console", "ovim"): + for log_module in ("nfvo", "http", "vim", "wim", "db", "console", "ovim"): log_level_module = "log_level_" + log_module log_file_module = "log_file_" + log_module logger_module = logging.getLogger('openmano.' + log_module) @@ -284,7 +321,7 @@ if __name__=="__main__": mydb = nfvo_db.nfvo_db(); mydb.connect(global_config['db_host'], global_config['db_user'], global_config['db_passwd'], global_config['db_name']) db_path = osm_ro.__path__[0] + "/database_utils" - if not os.path.exists(db_path + "/migrate_mano_db.sh"): + if not os_path.exists(db_path + "/migrate_mano_db.sh"): db_path = osm_ro.__path__[0] + "/../database_utils" try: r = mydb.get_db_version() @@ -299,9 +336,26 @@ if __name__=="__main__": exit(-1) nfvo.global_config=global_config - nfvo.start_service(mydb) - - httpthread = httpserver.httpserver(mydb, False, global_config['http_host'], global_config['http_port']) + if create_tenant: + try: + nfvo.new_tenant(mydb, {"name": create_tenant}) + except Exception as e: + if isinstance(e, nfvo.NfvoException) and e.http_code == 409: + pass # if tenant exist (NfvoException error 409), ignore + else: # otherwise print and error and continue + logger.error("Cannot create tenant '{}': {}".format(create_tenant, e)) + + # WIM module + wim_persistence = WimPersistence(mydb) + wim_engine = WimEngine(wim_persistence) + # --- + nfvo.start_service(mydb, wim_persistence, wim_engine) + + httpthread = httpserver.httpserver( + mydb, False, + global_config['http_host'], global_config['http_port'], + wim_persistence, wim_engine + ) httpthread.start() if 'http_admin_port' in global_config: