#!/usr/bin/python3
# -*- 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 cherrypy
import time
import json
import yaml
import osm_nbi.html_out as html
import logging
import logging.handlers
import getopt
import sys

from osm_nbi.authconn import AuthException, AuthconnException
from osm_nbi.auth import Authenticator
from osm_nbi.engine import Engine, EngineException
from osm_nbi.subscriptions import SubscriptionThread
from osm_nbi.validation import ValidationError
from osm_common.dbbase import DbException
from osm_common.fsbase import FsException
from osm_common.msgbase import MsgException
from http import HTTPStatus
from codecs import getreader
from os import environ, path
from osm_nbi import version as nbi_version, version_date as nbi_version_date

__author__ = "Alfonso Tierno <alfonso.tiernosepulveda@telefonica.com>"

__version__ = "0.1.3"  # file version, not NBI version
version_date = "Aug 2019"

database_version = "1.2"
auth_database_version = "1.0"
nbi_server = None  # instance of Server class
subscription_thread = None  # instance of SubscriptionThread class

"""
North Bound Interface  (O: OSM specific; 5,X: SOL005 not implemented yet; O5: SOL005 implemented)
URL: /osm                                                       GET     POST    PUT     DELETE  PATCH
        /nsd/v1
            /ns_descriptors_content                             O       O
                /<nsdInfoId>                                    O       O       O       O
            /ns_descriptors                                     O5      O5
                /<nsdInfoId>                                    O5                      O5      5
                    /nsd_content                                O5              O5
                    /nsd                                        O
                    /artifacts[/<artifactPath>]                 O
            /pnf_descriptors                                    5       5
                /<pnfdInfoId>                                   5                       5       5
                    /pnfd_content                               5               5
            /subscriptions                                      5       5
                /<subscriptionId>                               5                       X

        /vnfpkgm/v1
            /vnf_packages_content                               O       O
                /<vnfPkgId>                                     O                       O
            /vnf_packages                                       O5      O5
                /<vnfPkgId>                                     O5                      O5      5
                    /package_content                            O5               O5
                        /upload_from_uri                                X
                    /vnfd                                       O5
                    /artifacts[/<artifactPath>]                 O5
            /subscriptions                                      X       X
                /<subscriptionId>                               X                       X

        /nslcm/v1
            /ns_instances_content                               O       O
                /<nsInstanceId>                                 O                       O
            /ns_instances                                       5       5
                /<nsInstanceId>                                 O5                      O5
                    instantiate                                         O5
                    terminate                                           O5
                    action                                              O
                    scale                                               O5
                    heal                                                5
            /ns_lcm_op_occs                                     5       5
                /<nsLcmOpOccId>                                 5                       5       5
                    TO BE COMPLETED                             5               5
            /vnf_instances  (also vnfrs for compatibility)      O
                /<vnfInstanceId>                                O
            /subscriptions                                      5       5
                /<subscriptionId>                               5                       X

        /pdu/v1
            /pdu_descriptors                                    O       O
                /<id>                                           O               O       O       O

        /admin/v1
            /tokens                                             O       O
                /<id>                                           O                       O
            /users                                              O       O
                /<id>                                           O               O       O       O
            /projects                                           O       O
                /<id>                                           O                       O
            /vim_accounts  (also vims for compatibility)        O       O
                /<id>                                           O                       O       O
            /wim_accounts                                       O       O
                /<id>                                           O                       O       O
            /sdns                                               O       O
                /<id>                                           O                       O       O
            /k8sclusters                                        O       O
                /<id>                                           O                       O       O
            /k8srepos                                           O       O
                /<id>                                           O                               O
            /osmrepos                                           O       O
                /<id>                                           O                               O

        /nst/v1                                                 O       O
            /netslice_templates_content                         O       O
                /<nstInfoId>                                    O       O       O       O
            /netslice_templates                                 O       O
                /<nstInfoId>                                    O                       O       O
                    /nst_content                                O               O
                    /nst                                        O
                    /artifacts[/<artifactPath>]                 O
            /subscriptions                                      X       X
                /<subscriptionId>                               X                       X

        /nsilcm/v1
            /netslice_instances_content                         O       O
                /<SliceInstanceId>                              O                       O
            /netslice_instances                                 O       O
                /<SliceInstanceId>                              O                       O
                    instantiate                                         O
                    terminate                                           O
                    action                                              O
            /nsi_lcm_op_occs                                    O       O
                /<nsiLcmOpOccId>                                O                       O       O
            /subscriptions                                      X       X
                /<subscriptionId>                               X                       X

query string:
    Follows SOL005 section 4.3.2 It contains extra METHOD to override http method, FORCE to force.
        simpleFilterExpr := <attrName>["."<attrName>]*["."<op>]"="<value>[","<value>]*
        filterExpr := <simpleFilterExpr>["&"<simpleFilterExpr>]*
        op := "eq" | "neq" (or "ne") | "gt" | "lt" | "gte" | "lte" | "cont" | "ncont"
        attrName := string
    For filtering inside array, it must select the element of the array, or add ANYINDEX to apply the filtering over any
    item of the array, that is, pass if any item of the array pass the filter.
    It allows both ne and neq for not equal
    TODO: 4.3.3 Attribute selectors
        all_fields, fields=x,y,.., exclude_default, exclude_fields=x,y,...
        (none)	… same as “exclude_default”
        all_fields	… all attributes.
        fields=<list>	… all attributes except all complex attributes with minimum cardinality of zero that are not
        conditionally mandatory, and that are not provided in <list>.
        exclude_fields=<list>	… all attributes except those complex attributes with a minimum cardinality of zero that
        are not conditionally mandatory, and that are provided in <list>.
        exclude_default	… all attributes except those complex attributes with a minimum cardinality of zero that are not
        conditionally mandatory, and that are part of the "default exclude set" defined in the present specification for
        the particular resource
        exclude_default and include=<list>	… all attributes except those complex attributes with a minimum cardinality
        of zero that are not conditionally mandatory and that are part of the "default exclude set" defined in the
        present specification for the particular resource, but that are not part of <list>
    Additionally it admits some administrator values:
        FORCE: To force operations skipping dependency checkings
        ADMIN: To act as an administrator or a different project
        PUBLIC: To get public descriptors or set a descriptor as public
        SET_PROJECT: To make a descriptor available for other project
        
Header field name	Reference	Example	Descriptions
    Accept	IETF RFC 7231 [19]	application/json	Content-Types that are acceptable for the response.
    This header field shall be present if the response is expected to have a non-empty message body.
    Content-Type	IETF RFC 7231 [19]	application/json	The MIME type of the body of the request.
    This header field shall be present if the request has a non-empty message body.
    Authorization	IETF RFC 7235 [22]	Bearer mF_9.B5f-4.1JqM 	The authorization token for the request.
    Details are specified in clause 4.5.3.
    Range	IETF RFC 7233 [21]	1000-2000	Requested range of bytes from a file
Header field name	Reference	Example	Descriptions
    Content-Type	IETF RFC 7231 [19]	application/json	The MIME type of the body of the response.
    This header field shall be present if the response has a non-empty message body.
    Location	IETF RFC 7231 [19]	http://www.example.com/vnflcm/v1/vnf_instances/123	Used in redirection, or when a
    new resource has been created.
    This header field shall be present if the response status code is 201 or 3xx.
    In the present document this header field is also used if the response status code is 202 and a new resource was
    created.
    WWW-Authenticate	IETF RFC 7235 [22]	Bearer realm="example"	Challenge if the corresponding HTTP request has not
    provided authorization, or error details if the corresponding HTTP request has provided an invalid authorization
    token.
    Accept-Ranges	IETF RFC 7233 [21]	bytes	Used by the Server to signal whether or not it supports ranges for
    certain resources.
    Content-Range	IETF RFC 7233 [21]	bytes 21010-47021/ 47022	Signals the byte range that is contained in the
    response, and the total length of the file.
    Retry-After	IETF RFC 7231 [19]	Fri, 31 Dec 1999 23:59:59 GMT
"""

valid_query_string = ("ADMIN", "SET_PROJECT", "FORCE", "PUBLIC")
# ^ Contains possible administrative query string words:
#     ADMIN=True(by default)|Project|Project-list:  See all elements, or elements of a project
#           (not owned by my session project).
#     PUBLIC=True(by default)|False: See/hide public elements. Set/Unset a topic to be public
#     FORCE=True(by default)|False: Force edition/deletion operations
#     SET_PROJECT=Project|Project-list: Add/Delete the topic to the projects portfolio

valid_url_methods = {
    # contains allowed URL and methods, and the role_permission name
    "admin": {
        "v1": {
            "tokens": {
                "METHODS": ("GET", "POST", "DELETE"),
                "ROLE_PERMISSION": "tokens:",
                "<ID>": {"METHODS": ("GET", "DELETE"), "ROLE_PERMISSION": "tokens:id:"},
            },
            "users": {
                "METHODS": ("GET", "POST"),
                "ROLE_PERMISSION": "users:",
                "<ID>": {
                    "METHODS": ("GET", "DELETE", "PATCH"),
                    "ROLE_PERMISSION": "users:id:",
                },
            },
            "projects": {
                "METHODS": ("GET", "POST"),
                "ROLE_PERMISSION": "projects:",
                "<ID>": {
                    "METHODS": ("GET", "DELETE", "PATCH"),
                    "ROLE_PERMISSION": "projects:id:",
                },
            },
            "roles": {
                "METHODS": ("GET", "POST"),
                "ROLE_PERMISSION": "roles:",
                "<ID>": {
                    "METHODS": ("GET", "DELETE", "PATCH"),
                    "ROLE_PERMISSION": "roles:id:",
                },
            },
            "vims": {
                "METHODS": ("GET", "POST"),
                "ROLE_PERMISSION": "vims:",
                "<ID>": {
                    "METHODS": ("GET", "DELETE", "PATCH"),
                    "ROLE_PERMISSION": "vims:id:",
                },
            },
            "vim_accounts": {
                "METHODS": ("GET", "POST"),
                "ROLE_PERMISSION": "vim_accounts:",
                "<ID>": {
                    "METHODS": ("GET", "DELETE", "PATCH"),
                    "ROLE_PERMISSION": "vim_accounts:id:",
                },
            },
            "wim_accounts": {
                "METHODS": ("GET", "POST"),
                "ROLE_PERMISSION": "wim_accounts:",
                "<ID>": {
                    "METHODS": ("GET", "DELETE", "PATCH"),
                    "ROLE_PERMISSION": "wim_accounts:id:",
                },
            },
            "sdns": {
                "METHODS": ("GET", "POST"),
                "ROLE_PERMISSION": "sdn_controllers:",
                "<ID>": {
                    "METHODS": ("GET", "DELETE", "PATCH"),
                    "ROLE_PERMISSION": "sdn_controllers:id:",
                },
            },
            "k8sclusters": {
                "METHODS": ("GET", "POST"),
                "ROLE_PERMISSION": "k8sclusters:",
                "<ID>": {
                    "METHODS": ("GET", "DELETE", "PATCH"),
                    "ROLE_PERMISSION": "k8sclusters:id:",
                },
            },
            "vca": {
                "METHODS": ("GET", "POST"),
                "ROLE_PERMISSION": "vca:",
                "<ID>": {
                    "METHODS": ("GET", "DELETE", "PATCH"),
                    "ROLE_PERMISSION": "vca:id:",
                },
            },
            "k8srepos": {
                "METHODS": ("GET", "POST"),
                "ROLE_PERMISSION": "k8srepos:",
                "<ID>": {
                    "METHODS": ("GET", "DELETE"),
                    "ROLE_PERMISSION": "k8srepos:id:",
                },
            },
            "osmrepos": {
                "METHODS": ("GET", "POST"),
                "ROLE_PERMISSION": "osmrepos:",
                "<ID>": {
                    "METHODS": ("GET", "DELETE", "PATCH"),
                    "ROLE_PERMISSION": "osmrepos:id:",
                },
            },
            "domains": {
                "METHODS": ("GET",),
                "ROLE_PERMISSION": "domains:",
            },
        }
    },
    "pdu": {
        "v1": {
            "pdu_descriptors": {
                "METHODS": ("GET", "POST"),
                "ROLE_PERMISSION": "pduds:",
                "<ID>": {
                    "METHODS": ("GET", "POST", "DELETE", "PATCH", "PUT"),
                    "ROLE_PERMISSION": "pduds:id:",
                },
            },
        }
    },
    "nsd": {
        "v1": {
            "ns_descriptors_content": {
                "METHODS": ("GET", "POST"),
                "ROLE_PERMISSION": "nsds:",
                "<ID>": {
                    "METHODS": ("GET", "PUT", "DELETE"),
                    "ROLE_PERMISSION": "nsds:id:",
                },
            },
            "ns_descriptors": {
                "METHODS": ("GET", "POST"),
                "ROLE_PERMISSION": "nsds:",
                "<ID>": {
                    "METHODS": ("GET", "DELETE", "PATCH"),
                    "ROLE_PERMISSION": "nsds:id:",
                    "nsd_content": {
                        "METHODS": ("GET", "PUT"),
                        "ROLE_PERMISSION": "nsds:id:content:",
                    },
                    "nsd": {
                        "METHODS": ("GET",),  # descriptor inside package
                        "ROLE_PERMISSION": "nsds:id:content:",
                    },
                    "artifacts": {
                        "METHODS": ("GET",),
                        "ROLE_PERMISSION": "nsds:id:nsd_artifact:",
                        "*": None,
                    },
                },
            },
            "pnf_descriptors": {
                "TODO": ("GET", "POST"),
                "<ID>": {
                    "TODO": ("GET", "DELETE", "PATCH"),
                    "pnfd_content": {"TODO": ("GET", "PUT")},
                },
            },
            "subscriptions": {
                "TODO": ("GET", "POST"),
                "<ID>": {"TODO": ("GET", "DELETE")},
            },
        }
    },
    "vnfpkgm": {
        "v1": {
            "vnf_packages_content": {
                "METHODS": ("GET", "POST"),
                "ROLE_PERMISSION": "vnfds:",
                "<ID>": {
                    "METHODS": ("GET", "PUT", "DELETE"),
                    "ROLE_PERMISSION": "vnfds:id:",
                },
            },
            "vnf_packages": {
                "METHODS": ("GET", "POST"),
                "ROLE_PERMISSION": "vnfds:",
                "<ID>": {
                    "METHODS": ("GET", "DELETE", "PATCH"),  # GET: vnfPkgInfo
                    "ROLE_PERMISSION": "vnfds:id:",
                    "package_content": {
                        "METHODS": ("GET", "PUT"),  # package
                        "ROLE_PERMISSION": "vnfds:id:",
                        "upload_from_uri": {
                            "METHODS": (),
                            "TODO": ("POST",),
                            "ROLE_PERMISSION": "vnfds:id:upload:",
                        },
                    },
                    "vnfd": {
                        "METHODS": ("GET",),  # descriptor inside package
                        "ROLE_PERMISSION": "vnfds:id:content:",
                    },
                    "artifacts": {
                        "METHODS": ("GET",),
                        "ROLE_PERMISSION": "vnfds:id:vnfd_artifact:",
                        "*": None,
                    },
                    "action": {
                        "METHODS": ("POST",),
                        "ROLE_PERMISSION": "vnfds:id:action:",
                    },
                },
            },
            "subscriptions": {
                "TODO": ("GET", "POST"),
                "<ID>": {"TODO": ("GET", "DELETE")},
            },
            "vnfpkg_op_occs": {
                "METHODS": ("GET",),
                "ROLE_PERMISSION": "vnfds:vnfpkgops:",
                "<ID>": {"METHODS": ("GET",), "ROLE_PERMISSION": "vnfds:vnfpkgops:id:"},
            },
        }
    },
    "nslcm": {
        "v1": {
            "ns_instances_content": {
                "METHODS": ("GET", "POST"),
                "ROLE_PERMISSION": "ns_instances:",
                "<ID>": {
                    "METHODS": ("GET", "DELETE"),
                    "ROLE_PERMISSION": "ns_instances:id:",
                },
            },
            "ns_instances": {
                "METHODS": ("GET", "POST"),
                "ROLE_PERMISSION": "ns_instances:",
                "<ID>": {
                    "METHODS": ("GET", "DELETE"),
                    "ROLE_PERMISSION": "ns_instances:id:",
                    "scale": {
                        "METHODS": ("POST",),
                        "ROLE_PERMISSION": "ns_instances:id:scale:",
                    },
                    "terminate": {
                        "METHODS": ("POST",),
                        "ROLE_PERMISSION": "ns_instances:id:terminate:",
                    },
                    "instantiate": {
                        "METHODS": ("POST",),
                        "ROLE_PERMISSION": "ns_instances:id:instantiate:",
                    },
                    "action": {
                        "METHODS": ("POST",),
                        "ROLE_PERMISSION": "ns_instances:id:action:",
                    },
                },
            },
            "ns_lcm_op_occs": {
                "METHODS": ("GET",),
                "ROLE_PERMISSION": "ns_instances:opps:",
                "<ID>": {
                    "METHODS": ("GET",),
                    "ROLE_PERMISSION": "ns_instances:opps:id:",
                },
            },
            "vnfrs": {
                "METHODS": ("GET",),
                "ROLE_PERMISSION": "vnf_instances:",
                "<ID>": {"METHODS": ("GET",), "ROLE_PERMISSION": "vnf_instances:id:"},
            },
            "vnf_instances": {
                "METHODS": ("GET",),
                "ROLE_PERMISSION": "vnf_instances:",
                "<ID>": {"METHODS": ("GET",), "ROLE_PERMISSION": "vnf_instances:id:"},
            },
            "subscriptions": {
                "METHODS": ("GET", "POST"),
                "ROLE_PERMISSION": "ns_subscriptions:",
                "<ID>": {
                    "METHODS": ("GET", "DELETE"),
                    "ROLE_PERMISSION": "ns_subscriptions:id:",
                },
            },
        }
    },
    "nst": {
        "v1": {
            "netslice_templates_content": {
                "METHODS": ("GET", "POST"),
                "ROLE_PERMISSION": "slice_templates:",
                "<ID>": {
                    "METHODS": ("GET", "PUT", "DELETE"),
                    "ROLE_PERMISSION": "slice_templates:id:",
                },
            },
            "netslice_templates": {
                "METHODS": ("GET", "POST"),
                "ROLE_PERMISSION": "slice_templates:",
                "<ID>": {
                    "METHODS": ("GET", "DELETE"),
                    "TODO": ("PATCH",),
                    "ROLE_PERMISSION": "slice_templates:id:",
                    "nst_content": {
                        "METHODS": ("GET", "PUT"),
                        "ROLE_PERMISSION": "slice_templates:id:content:",
                    },
                    "nst": {
                        "METHODS": ("GET",),  # descriptor inside package
                        "ROLE_PERMISSION": "slice_templates:id:content:",
                    },
                    "artifacts": {
                        "METHODS": ("GET",),
                        "ROLE_PERMISSION": "slice_templates:id:content:",
                        "*": None,
                    },
                },
            },
            "subscriptions": {
                "TODO": ("GET", "POST"),
                "<ID>": {"TODO": ("GET", "DELETE")},
            },
        }
    },
    "nsilcm": {
        "v1": {
            "netslice_instances_content": {
                "METHODS": ("GET", "POST"),
                "ROLE_PERMISSION": "slice_instances:",
                "<ID>": {
                    "METHODS": ("GET", "DELETE"),
                    "ROLE_PERMISSION": "slice_instances:id:",
                },
            },
            "netslice_instances": {
                "METHODS": ("GET", "POST"),
                "ROLE_PERMISSION": "slice_instances:",
                "<ID>": {
                    "METHODS": ("GET", "DELETE"),
                    "ROLE_PERMISSION": "slice_instances:id:",
                    "terminate": {
                        "METHODS": ("POST",),
                        "ROLE_PERMISSION": "slice_instances:id:terminate:",
                    },
                    "instantiate": {
                        "METHODS": ("POST",),
                        "ROLE_PERMISSION": "slice_instances:id:instantiate:",
                    },
                    "action": {
                        "METHODS": ("POST",),
                        "ROLE_PERMISSION": "slice_instances:id:action:",
                    },
                },
            },
            "nsi_lcm_op_occs": {
                "METHODS": ("GET",),
                "ROLE_PERMISSION": "slice_instances:opps:",
                "<ID>": {
                    "METHODS": ("GET",),
                    "ROLE_PERMISSION": "slice_instances:opps:id:",
                },
            },
        }
    },
    "nspm": {
        "v1": {
            "pm_jobs": {
                "<ID>": {
                    "reports": {
                        "<ID>": {
                            "METHODS": ("GET",),
                            "ROLE_PERMISSION": "reports:id:",
                        }
                    }
                },
            },
        },
    },
    "nsfm": {
        "v1": {
            "alarms": {"METHODS": ("GET", "PATCH"),
                       "ROLE_PERMISSION": "alarms:",
                       "<ID>": {"METHODS": ("GET", "PATCH"),
                                "ROLE_PERMISSION": "alarms:id:",
                                },
                       }
        },
    },
}


class NbiException(Exception):
    def __init__(self, message, http_code=HTTPStatus.METHOD_NOT_ALLOWED):
        Exception.__init__(self, message)
        self.http_code = http_code


class Server(object):
    instance = 0
    # to decode bytes to str
    reader = getreader("utf-8")

    def __init__(self):
        self.instance += 1
        self.authenticator = Authenticator(valid_url_methods, valid_query_string)
        self.engine = Engine(self.authenticator)

    def _format_in(self, kwargs):
        try:
            indata = None
            if cherrypy.request.body.length:
                error_text = "Invalid input format "

                if "Content-Type" in cherrypy.request.headers:
                    if "application/json" in cherrypy.request.headers["Content-Type"]:
                        error_text = "Invalid json format "
                        indata = json.load(self.reader(cherrypy.request.body))
                        cherrypy.request.headers.pop("Content-File-MD5", None)
                    elif "application/yaml" in cherrypy.request.headers["Content-Type"]:
                        error_text = "Invalid yaml format "
                        indata = yaml.load(
                            cherrypy.request.body, Loader=yaml.SafeLoader
                        )
                        cherrypy.request.headers.pop("Content-File-MD5", None)
                    elif (
                        "application/binary" in cherrypy.request.headers["Content-Type"]
                        or "application/gzip"
                        in cherrypy.request.headers["Content-Type"]
                        or "application/zip" in cherrypy.request.headers["Content-Type"]
                        or "text/plain" in cherrypy.request.headers["Content-Type"]
                    ):
                        indata = cherrypy.request.body  # .read()
                    elif (
                        "multipart/form-data"
                        in cherrypy.request.headers["Content-Type"]
                    ):
                        if "descriptor_file" in kwargs:
                            filecontent = kwargs.pop("descriptor_file")
                            if not filecontent.file:
                                raise NbiException(
                                    "empty file or content", HTTPStatus.BAD_REQUEST
                                )
                            indata = filecontent.file  # .read()
                            if filecontent.content_type.value:
                                cherrypy.request.headers[
                                    "Content-Type"
                                ] = filecontent.content_type.value
                    else:
                        # raise cherrypy.HTTPError(HTTPStatus.Not_Acceptable,
                        #                          "Only 'Content-Type' of type 'application/json' or
                        # 'application/yaml' for input format are available")
                        error_text = "Invalid yaml format "
                        indata = yaml.load(
                            cherrypy.request.body, Loader=yaml.SafeLoader
                        )
                        cherrypy.request.headers.pop("Content-File-MD5", None)
                else:
                    error_text = "Invalid yaml format "
                    indata = yaml.load(cherrypy.request.body, Loader=yaml.SafeLoader)
                    cherrypy.request.headers.pop("Content-File-MD5", None)
            if not indata:
                indata = {}

            format_yaml = False
            if cherrypy.request.headers.get("Query-String-Format") == "yaml":
                format_yaml = True

            for k, v in kwargs.items():
                if isinstance(v, str):
                    if v == "":
                        kwargs[k] = None
                    elif format_yaml:
                        try:
                            kwargs[k] = yaml.load(v, Loader=yaml.SafeLoader)
                        except Exception:
                            pass
                    elif (
                        k.endswith(".gt")
                        or k.endswith(".lt")
                        or k.endswith(".gte")
                        or k.endswith(".lte")
                    ):
                        try:
                            kwargs[k] = int(v)
                        except Exception:
                            try:
                                kwargs[k] = float(v)
                            except Exception:
                                pass
                    elif v.find(",") > 0:
                        kwargs[k] = v.split(",")
                elif isinstance(v, (list, tuple)):
                    for index in range(0, len(v)):
                        if v[index] == "":
                            v[index] = None
                        elif format_yaml:
                            try:
                                v[index] = yaml.load(v[index], Loader=yaml.SafeLoader)
                            except Exception:
                                pass

            return indata
        except (ValueError, yaml.YAMLError) as exc:
            raise NbiException(error_text + str(exc), HTTPStatus.BAD_REQUEST)
        except KeyError as exc:
            raise NbiException(
                "Query string error: " + str(exc), HTTPStatus.BAD_REQUEST
            )
        except Exception as exc:
            raise NbiException(error_text + str(exc), HTTPStatus.BAD_REQUEST)

    @staticmethod
    def _format_out(data, token_info=None, _format=None):
        """
        return string of dictionary data according to requested json, yaml, xml. By default json
        :param data: response to be sent. Can be a dict, text or file
        :param token_info: Contains among other username and project
        :param _format: The format to be set as Content-Type if data is a file
        :return: None
        """
        accept = cherrypy.request.headers.get("Accept")
        if data is None:
            if accept and "text/html" in accept:
                return html.format(
                    data, cherrypy.request, cherrypy.response, token_info
                )
            # cherrypy.response.status = HTTPStatus.NO_CONTENT.value
            return
        elif hasattr(data, "read"):  # file object
            if _format:
                cherrypy.response.headers["Content-Type"] = _format
            elif "b" in data.mode:  # binariy asssumig zip
                cherrypy.response.headers["Content-Type"] = "application/zip"
            else:
                cherrypy.response.headers["Content-Type"] = "text/plain"
            # TODO check that cherrypy close file. If not implement pending things to close  per thread next
            return data
        if accept:
            if "text/html" in accept:
                return html.format(
                    data, cherrypy.request, cherrypy.response, token_info
                )
            elif "application/yaml" in accept or "*/*" in accept:
                pass
            elif "application/json" in accept or (
                cherrypy.response.status and cherrypy.response.status >= 300
            ):
                cherrypy.response.headers[
                    "Content-Type"
                ] = "application/json; charset=utf-8"
                a = json.dumps(data, indent=4) + "\n"
                return a.encode("utf8")
        cherrypy.response.headers["Content-Type"] = "application/yaml"
        return yaml.safe_dump(
            data,
            explicit_start=True,
            indent=4,
            default_flow_style=False,
            tags=False,
            encoding="utf-8",
            allow_unicode=True,
        )  # , canonical=True, default_style='"'

    @cherrypy.expose
    def index(self, *args, **kwargs):
        token_info = None
        try:
            if cherrypy.request.method == "GET":
                token_info = self.authenticator.authorize()
                outdata = token_info  # Home page
            else:
                raise cherrypy.HTTPError(
                    HTTPStatus.METHOD_NOT_ALLOWED.value,
                    "Method {} not allowed for tokens".format(cherrypy.request.method),
                )

            return self._format_out(outdata, token_info)

        except (EngineException, AuthException) as e:
            # cherrypy.log("index Exception {}".format(e))
            cherrypy.response.status = e.http_code.value
            return self._format_out("Welcome to OSM!", token_info)

    @cherrypy.expose
    def version(self, *args, **kwargs):
        # TODO consider to remove and provide version using the static version file
        try:
            if cherrypy.request.method != "GET":
                raise NbiException(
                    "Only method GET is allowed", HTTPStatus.METHOD_NOT_ALLOWED
                )
            elif args or kwargs:
                raise NbiException(
                    "Invalid URL or query string for version",
                    HTTPStatus.METHOD_NOT_ALLOWED,
                )
            # TODO include version of other modules, pick up from some kafka admin message
            osm_nbi_version = {"version": nbi_version, "date": nbi_version_date}
            return self._format_out(osm_nbi_version)
        except NbiException as e:
            cherrypy.response.status = e.http_code.value
            problem_details = {
                "code": e.http_code.name,
                "status": e.http_code.value,
                "detail": str(e),
            }
            return self._format_out(problem_details, None)

    def domain(self):
        try:
            domains = {
                "user_domain_name": cherrypy.tree.apps["/osm"]
                .config["authentication"]
                .get("user_domain_name"),
                "project_domain_name": cherrypy.tree.apps["/osm"]
                .config["authentication"]
                .get("project_domain_name"),
            }
            return self._format_out(domains)
        except NbiException as e:
            cherrypy.response.status = e.http_code.value
            problem_details = {
                "code": e.http_code.name,
                "status": e.http_code.value,
                "detail": str(e),
            }
            return self._format_out(problem_details, None)

    @staticmethod
    def _format_login(token_info):
        """
        Changes cherrypy.request.login to include username/project_name;session so that cherrypy access log will
        log this information
        :param token_info: Dictionary with token content
        :return: None
        """
        cherrypy.request.login = token_info.get("username", "-")
        if token_info.get("project_name"):
            cherrypy.request.login += "/" + token_info["project_name"]
        if token_info.get("id"):
            cherrypy.request.login += ";session=" + token_info["id"][0:12]

    # NS Fault Management
    @cherrypy.expose
    def nsfm(self, version=None, topic=None, uuid=None, project_name=None, ns_id=None, *args, **kwargs):
        if topic == 'alarms':
            try:
                method = cherrypy.request.method
                role_permission = self._check_valid_url_method(method, "nsfm", version, topic, None, None, *args)
                query_string_operations = self._extract_query_string_operations(kwargs, method)

                self.authenticator.authorize(role_permission, query_string_operations, None)

                # to handle get request
                if cherrypy.request.method == 'GET':
                    # if request is on basis of uuid
                    if uuid and uuid != 'None':
                        try:
                            alarm = self.engine.db.get_one("alarms", {"uuid": uuid})
                            alarm_action = self.engine.db.get_one("alarms_action", {"uuid": uuid})
                            alarm.update(alarm_action)
                            vnf = self.engine.db.get_one("vnfrs", {"nsr-id-ref": alarm["tags"]["ns_id"]})
                            alarm["vnf-id"] = vnf["_id"]
                            return self._format_out(str(alarm))
                        except Exception:
                            return self._format_out("Please provide valid alarm uuid")
                    elif ns_id and ns_id != 'None':
                        # if request is on basis of ns_id
                        try:
                            alarms = self.engine.db.get_list("alarms", {"tags.ns_id": ns_id})
                            for alarm in alarms:
                                alarm_action = self.engine.db.get_one("alarms_action", {"uuid": alarm['uuid']})
                                alarm.update(alarm_action)
                            return self._format_out(str(alarms))
                        except Exception:
                            return self._format_out("Please provide valid ns id")
                    else:
                        # to return only alarm which are related to given project
                        project = self.engine.db.get_one("projects", {"name": project_name})
                        project_id = project.get('_id')
                        ns_list = self.engine.db.get_list("nsrs", {"_admin.projects_read": project_id})
                        ns_ids = []
                        for ns in ns_list:
                            ns_ids.append(ns.get("_id"))
                        alarms = self.engine.db.get_list("alarms")
                        alarm_list = [alarm for alarm in alarms if alarm["tags"]["ns_id"] in ns_ids]
                        for alrm in alarm_list:
                            action = self.engine.db.get_one("alarms_action", {"uuid": alrm.get("uuid")})
                            alrm.update(action)
                        return self._format_out(str(alarm_list))
                # to handle patch request for alarm update
                elif cherrypy.request.method == 'PATCH':
                    data = yaml.load(cherrypy.request.body, Loader=yaml.SafeLoader)
                    try:
                        # check if uuid is valid
                        self.engine.db.get_one("alarms", {"uuid": data.get("uuid")})
                    except Exception:
                        return self._format_out("Please provide valid alarm uuid.")
                    if data.get("is_enable") is not None:
                        if data.get("is_enable"):
                            alarm_status = 'ok'
                        else:
                            alarm_status = 'disabled'
                        self.engine.db.set_one("alarms", {"uuid": data.get("uuid")},
                                               {"alarm_status": alarm_status})
                    else:
                        self.engine.db.set_one("alarms", {"uuid": data.get("uuid")},
                                               {"threshold": data.get("threshold")})
                    return self._format_out("Alarm updated")
            except Exception as e:
                cherrypy.response.status = e.http_code.value
                if isinstance(e, (NbiException, EngineException, DbException, FsException, MsgException, AuthException,
                              ValidationError, AuthconnException)):
                    http_code_value = cherrypy.response.status = e.http_code.value
                    http_code_name = e.http_code.name
                    cherrypy.log("Exception {}".format(e))
                else:
                    http_code_value = cherrypy.response.status = HTTPStatus.BAD_REQUEST.value  # INTERNAL_SERVER_ERROR
                    cherrypy.log("CRITICAL: Exception {}".format(e), traceback=True)
                    http_code_name = HTTPStatus.BAD_REQUEST.name
                problem_details = {
                    "code": http_code_name,
                    "status": http_code_value,
                    "detail": str(e),
                }
                return self._format_out(problem_details)

    @cherrypy.expose
    def token(self, method, token_id=None, kwargs=None):
        token_info = None
        # self.engine.load_dbase(cherrypy.request.app.config)
        indata = self._format_in(kwargs)
        if not isinstance(indata, dict):
            raise NbiException(
                "Expected application/yaml or application/json Content-Type",
                HTTPStatus.BAD_REQUEST,
            )

        if method == "GET":
            token_info = self.authenticator.authorize()
            # for logging
            self._format_login(token_info)
            if token_id:
                outdata = self.authenticator.get_token(token_info, token_id)
            else:
                outdata = self.authenticator.get_token_list(token_info)
        elif method == "POST":
            try:
                token_info = self.authenticator.authorize()
            except Exception:
                token_info = None
            if kwargs:
                indata.update(kwargs)
            # This is needed to log the user when authentication fails
            cherrypy.request.login = "{}".format(indata.get("username", "-"))
            outdata = token_info = self.authenticator.new_token(
                token_info, indata, cherrypy.request.remote
            )
            cherrypy.session["Authorization"] = outdata["_id"]
            self._set_location_header("admin", "v1", "tokens", outdata["_id"])
            # for logging
            self._format_login(token_info)

            # cherrypy.response.cookie["Authorization"] = outdata["id"]
            # cherrypy.response.cookie["Authorization"]['expires'] = 3600
        elif method == "DELETE":
            if not token_id and "id" in kwargs:
                token_id = kwargs["id"]
            elif not token_id:
                token_info = self.authenticator.authorize()
                # for logging
                self._format_login(token_info)
                token_id = token_info["_id"]
            outdata = self.authenticator.del_token(token_id)
            token_info = None
            cherrypy.session["Authorization"] = "logout"
            # cherrypy.response.cookie["Authorization"] = token_id
            # cherrypy.response.cookie["Authorization"]['expires'] = 0
        else:
            raise NbiException(
                "Method {} not allowed for token".format(method),
                HTTPStatus.METHOD_NOT_ALLOWED,
            )
        return self._format_out(outdata, token_info)

    @cherrypy.expose
    def test(self, *args, **kwargs):
        if not cherrypy.config.get("server.enable_test") or (
            isinstance(cherrypy.config["server.enable_test"], str)
            and cherrypy.config["server.enable_test"].lower() == "false"
        ):
            cherrypy.response.status = HTTPStatus.METHOD_NOT_ALLOWED.value
            return "test URL is disabled"
        thread_info = None
        if args and args[0] == "help":
            return (
                "<html><pre>\ninit\nfile/<name>  download file\ndb-clear/table\nfs-clear[/folder]\nlogin\nlogin2\n"
                "sleep/<time>\nmessage/topic\n</pre></html>"
            )

        elif args and args[0] == "init":
            try:
                # self.engine.load_dbase(cherrypy.request.app.config)
                self.engine.create_admin()
                return "Done. User 'admin', password 'admin' created"
            except Exception:
                cherrypy.response.status = HTTPStatus.FORBIDDEN.value
                return self._format_out("Database already initialized")
        elif args and args[0] == "file":
            return cherrypy.lib.static.serve_file(
                cherrypy.tree.apps["/osm"].config["storage"]["path"] + "/" + args[1],
                "text/plain",
                "attachment",
            )
        elif args and args[0] == "file2":
            f_path = (
                cherrypy.tree.apps["/osm"].config["storage"]["path"] + "/" + args[1]
            )
            f = open(f_path, "r")
            cherrypy.response.headers["Content-type"] = "text/plain"
            return f

        elif len(args) == 2 and args[0] == "db-clear":
            deleted_info = self.engine.db.del_list(args[1], kwargs)
            return "{} {} deleted\n".format(deleted_info["deleted"], args[1])
        elif len(args) and args[0] == "fs-clear":
            if len(args) >= 2:
                folders = (args[1],)
            else:
                folders = self.engine.fs.dir_ls(".")
            for folder in folders:
                self.engine.fs.file_delete(folder)
            return ",".join(folders) + " folders deleted\n"
        elif args and args[0] == "login":
            if not cherrypy.request.headers.get("Authorization"):
                cherrypy.response.headers[
                    "WWW-Authenticate"
                ] = 'Basic realm="Access to OSM site", charset="UTF-8"'
                cherrypy.response.status = HTTPStatus.UNAUTHORIZED.value
        elif args and args[0] == "login2":
            if not cherrypy.request.headers.get("Authorization"):
                cherrypy.response.headers[
                    "WWW-Authenticate"
                ] = 'Bearer realm="Access to OSM site"'
                cherrypy.response.status = HTTPStatus.UNAUTHORIZED.value
        elif args and args[0] == "sleep":
            sleep_time = 5
            try:
                sleep_time = int(args[1])
            except Exception:
                cherrypy.response.status = HTTPStatus.FORBIDDEN.value
                return self._format_out("Database already initialized")
            thread_info = cherrypy.thread_data
            print(thread_info)
            time.sleep(sleep_time)
            # thread_info
        elif len(args) >= 2 and args[0] == "message":
            main_topic = args[1]
            return_text = "<html><pre>{} ->\n".format(main_topic)
            try:
                if cherrypy.request.method == "POST":
                    to_send = yaml.load(cherrypy.request.body, Loader=yaml.SafeLoader)
                    for k, v in to_send.items():
                        self.engine.msg.write(main_topic, k, v)
                        return_text += "  {}: {}\n".format(k, v)
                elif cherrypy.request.method == "GET":
                    for k, v in kwargs.items():
                        v_dict = yaml.load(v, Loader=yaml.SafeLoader)
                        self.engine.msg.write(main_topic, k, v_dict)
                        return_text += "  {}: {}\n".format(k, v_dict)
            except Exception as e:
                return_text += "Error: " + str(e)
            return_text += "</pre></html>\n"
            return return_text

        return_text = (
            "<html><pre>\nheaders:\n  args: {}\n".format(args)
            + "  kwargs: {}\n".format(kwargs)
            + "  headers: {}\n".format(cherrypy.request.headers)
            + "  path_info: {}\n".format(cherrypy.request.path_info)
            + "  query_string: {}\n".format(cherrypy.request.query_string)
            + "  session: {}\n".format(cherrypy.session)
            + "  cookie: {}\n".format(cherrypy.request.cookie)
            + "  method: {}\n".format(cherrypy.request.method)
            + "  session: {}\n".format(cherrypy.session.get("fieldname"))
            + "  body:\n"
        )
        return_text += "    length: {}\n".format(cherrypy.request.body.length)
        if cherrypy.request.body.length:
            return_text += "    content: {}\n".format(
                str(
                    cherrypy.request.body.read(
                        int(cherrypy.request.headers.get("Content-Length", 0))
                    )
                )
            )
        if thread_info:
            return_text += "thread: {}\n".format(thread_info)
        return_text += "</pre></html>"
        return return_text

    @staticmethod
    def _check_valid_url_method(method, *args):
        if len(args) < 3:
            raise NbiException(
                "URL must contain at least 'main_topic/version/topic'",
                HTTPStatus.METHOD_NOT_ALLOWED,
            )

        reference = valid_url_methods
        for arg in args:
            if arg is None:
                break
            if not isinstance(reference, dict):
                raise NbiException(
                    "URL contains unexpected extra items '{}'".format(arg),
                    HTTPStatus.METHOD_NOT_ALLOWED,
                )

            if arg in reference:
                reference = reference[arg]
            elif "<ID>" in reference:
                reference = reference["<ID>"]
            elif "*" in reference:
                # if there is content
                if reference["*"]:
                    reference = reference["*"]
                break
            else:
                raise NbiException(
                    "Unexpected URL item {}".format(arg), HTTPStatus.METHOD_NOT_ALLOWED
                )
        if "TODO" in reference and method in reference["TODO"]:
            raise NbiException(
                "Method {} not supported yet for this URL".format(method),
                HTTPStatus.NOT_IMPLEMENTED,
            )
        elif "METHODS" in reference and method not in reference["METHODS"]:
            raise NbiException(
                "Method {} not supported for this URL".format(method),
                HTTPStatus.METHOD_NOT_ALLOWED,
            )
        return reference["ROLE_PERMISSION"] + method.lower()

    @staticmethod
    def _set_location_header(main_topic, version, topic, id):
        """
        Insert response header Location with the URL of created item base on URL params
        :param main_topic:
        :param version:
        :param topic:
        :param id:
        :return: None
        """
        # Use cherrypy.request.base for absoluted path and make use of request.header HOST just in case behind aNAT
        cherrypy.response.headers["Location"] = "/osm/{}/{}/{}/{}".format(
            main_topic, version, topic, id
        )
        return

    @staticmethod
    def _extract_query_string_operations(kwargs, method):
        """

        :param kwargs:
        :return:
        """
        query_string_operations = []
        if kwargs:
            for qs in ("FORCE", "PUBLIC", "ADMIN", "SET_PROJECT"):
                if qs in kwargs and kwargs[qs].lower() != "false":
                    query_string_operations.append(qs.lower() + ":" + method.lower())
        return query_string_operations

    @staticmethod
    def _manage_admin_query(token_info, kwargs, method, _id):
        """
        Processes the administrator query inputs (if any) of FORCE, ADMIN, PUBLIC, SET_PROJECT
        Check that users has rights to use them and returs the admin_query
        :param token_info: token_info rights obtained by token
        :param kwargs: query string input.
        :param method: http method: GET, POSST, PUT, ...
        :param _id:
        :return: admin_query dictionary with keys:
            public: True, False or None
            force: True or False
            project_id: tuple with projects used for accessing an element
            set_project: tuple with projects that a created element will belong to
            method: show, list, delete, write
        """
        admin_query = {
            "force": False,
            "project_id": (token_info["project_id"],),
            "username": token_info["username"],
            "admin": token_info["admin"],
            "public": None,
            "allow_show_user_project_role": token_info["allow_show_user_project_role"],
        }
        if kwargs:
            # FORCE
            if "FORCE" in kwargs:
                if (
                    kwargs["FORCE"].lower() != "false"
                ):  # if None or True set force to True
                    admin_query["force"] = True
                del kwargs["FORCE"]
            # PUBLIC
            if "PUBLIC" in kwargs:
                if (
                    kwargs["PUBLIC"].lower() != "false"
                ):  # if None or True set public to True
                    admin_query["public"] = True
                else:
                    admin_query["public"] = False
                del kwargs["PUBLIC"]
            # ADMIN
            if "ADMIN" in kwargs:
                behave_as = kwargs.pop("ADMIN")
                if behave_as.lower() != "false":
                    if not token_info["admin"]:
                        raise NbiException(
                            "Only admin projects can use 'ADMIN' query string",
                            HTTPStatus.UNAUTHORIZED,
                        )
                    if (
                        not behave_as or behave_as.lower() == "true"
                    ):  # convert True, None to empty list
                        admin_query["project_id"] = ()
                    elif isinstance(behave_as, (list, tuple)):
                        admin_query["project_id"] = behave_as
                    else:  # isinstance(behave_as, str)
                        admin_query["project_id"] = (behave_as,)
            if "SET_PROJECT" in kwargs:
                set_project = kwargs.pop("SET_PROJECT")
                if not set_project:
                    admin_query["set_project"] = list(admin_query["project_id"])
                else:
                    if isinstance(set_project, str):
                        set_project = (set_project,)
                    if admin_query["project_id"]:
                        for p in set_project:
                            if p not in admin_query["project_id"]:
                                raise NbiException(
                                    "Unauthorized for 'SET_PROJECT={p}'. Try with 'ADMIN=True' or "
                                    "'ADMIN='{p}'".format(p=p),
                                    HTTPStatus.UNAUTHORIZED,
                                )
                    admin_query["set_project"] = set_project

            # PROJECT_READ
            # if "PROJECT_READ" in kwargs:
            #     admin_query["project"] = kwargs.pop("project")
            #     if admin_query["project"] == token_info["project_id"]:
        if method == "GET":
            if _id:
                admin_query["method"] = "show"
            else:
                admin_query["method"] = "list"
        elif method == "DELETE":
            admin_query["method"] = "delete"
        else:
            admin_query["method"] = "write"
        return admin_query

    @cherrypy.expose
    def default(
        self,
        main_topic=None,
        version=None,
        topic=None,
        _id=None,
        item=None,
        *args,
        **kwargs
    ):
        token_info = None
        outdata = None
        _format = None
        method = "DONE"
        engine_topic = None
        rollback = []
        engine_session = None
        try:
            if not main_topic or not version or not topic:
                raise NbiException(
                    "URL must contain at least 'main_topic/version/topic'",
                    HTTPStatus.METHOD_NOT_ALLOWED,
                )
            if main_topic not in (
                "admin",
                "vnfpkgm",
                "nsd",
                "nslcm",
                "pdu",
                "nst",
                "nsilcm",
                "nspm",
            ):
                raise NbiException(
                    "URL main_topic '{}' not supported".format(main_topic),
                    HTTPStatus.METHOD_NOT_ALLOWED,
                )
            if version != "v1":
                raise NbiException(
                    "URL version '{}' not supported".format(version),
                    HTTPStatus.METHOD_NOT_ALLOWED,
                )

            if (
                kwargs
                and "METHOD" in kwargs
                and kwargs["METHOD"] in ("PUT", "POST", "DELETE", "GET", "PATCH")
            ):
                method = kwargs.pop("METHOD")
            else:
                method = cherrypy.request.method

            role_permission = self._check_valid_url_method(
                method, main_topic, version, topic, _id, item, *args
            )
            query_string_operations = self._extract_query_string_operations(
                kwargs, method
            )
            if main_topic == "admin" and topic == "tokens":
                return self.token(method, _id, kwargs)
            token_info = self.authenticator.authorize(
                role_permission, query_string_operations, _id
            )
            if main_topic == "admin" and topic == "domains":
                return self.domain()
            engine_session = self._manage_admin_query(token_info, kwargs, method, _id)
            indata = self._format_in(kwargs)
            engine_topic = topic

            if item and topic != "pm_jobs":
                engine_topic = item

            if main_topic == "nsd":
                engine_topic = "nsds"
            elif main_topic == "vnfpkgm":
                engine_topic = "vnfds"
                if topic == "vnfpkg_op_occs":
                    engine_topic = "vnfpkgops"
                if topic == "vnf_packages" and item == "action":
                    engine_topic = "vnfpkgops"
            elif main_topic == "nslcm":
                engine_topic = "nsrs"
                if topic == "ns_lcm_op_occs":
                    engine_topic = "nslcmops"
                if topic == "vnfrs" or topic == "vnf_instances":
                    engine_topic = "vnfrs"
            elif main_topic == "nst":
                engine_topic = "nsts"
            elif main_topic == "nsilcm":
                engine_topic = "nsis"
                if topic == "nsi_lcm_op_occs":
                    engine_topic = "nsilcmops"
            elif main_topic == "pdu":
                engine_topic = "pdus"
            if (
                engine_topic == "vims"
            ):  # TODO this is for backward compatibility, it will be removed in the future
                engine_topic = "vim_accounts"

            if topic == "subscriptions":
                engine_topic = main_topic + "_" + topic

            if method == "GET":
                if item in (
                    "nsd_content",
                    "package_content",
                    "artifacts",
                    "vnfd",
                    "nsd",
                    "nst",
                    "nst_content",
                ):
                    if item in ("vnfd", "nsd", "nst"):
                        path = "$DESCRIPTOR"
                    elif args:
                        path = args
                    elif item == "artifacts":
                        path = ()
                    else:
                        path = None
                    file, _format = self.engine.get_file(
                        engine_session,
                        engine_topic,
                        _id,
                        path,
                        cherrypy.request.headers.get("Accept"),
                    )
                    outdata = file
                elif not _id:
                    outdata = self.engine.get_item_list(
                        engine_session, engine_topic, kwargs, api_req=True
                    )
                else:
                    if item == "reports":
                        # TODO check that project_id (_id in this context) has permissions
                        _id = args[0]
                    filter_q = None
                    if "vcaStatusRefresh" in kwargs:
                        filter_q = {"vcaStatusRefresh": kwargs["vcaStatusRefresh"]}
                    outdata = self.engine.get_item(engine_session, engine_topic, _id, filter_q, True)

            elif method == "POST":
                cherrypy.response.status = HTTPStatus.CREATED.value
                if topic in (
                    "ns_descriptors_content",
                    "vnf_packages_content",
                    "netslice_templates_content",
                ):
                    _id = cherrypy.request.headers.get("Transaction-Id")
                    if not _id:
                        _id, _ = self.engine.new_item(
                            rollback,
                            engine_session,
                            engine_topic,
                            {},
                            None,
                            cherrypy.request.headers,
                        )
                    completed = self.engine.upload_content(
                        engine_session,
                        engine_topic,
                        _id,
                        indata,
                        kwargs,
                        cherrypy.request.headers,
                    )
                    if completed:
                        self._set_location_header(main_topic, version, topic, _id)
                    else:
                        cherrypy.response.headers["Transaction-Id"] = _id
                    outdata = {"id": _id}
                elif topic == "ns_instances_content":
                    # creates NSR
                    _id, _ = self.engine.new_item(
                        rollback, engine_session, engine_topic, indata, kwargs
                    )
                    # creates nslcmop
                    indata["lcmOperationType"] = "instantiate"
                    indata["nsInstanceId"] = _id
                    nslcmop_id, _ = self.engine.new_item(
                        rollback, engine_session, "nslcmops", indata, None
                    )
                    self._set_location_header(main_topic, version, topic, _id)
                    outdata = {"id": _id, "nslcmop_id": nslcmop_id}
                elif topic == "ns_instances" and item:
                    indata["lcmOperationType"] = item
                    indata["nsInstanceId"] = _id
                    _id, _ = self.engine.new_item(
                        rollback, engine_session, "nslcmops", indata, kwargs
                    )
                    self._set_location_header(
                        main_topic, version, "ns_lcm_op_occs", _id
                    )
                    outdata = {"id": _id}
                    cherrypy.response.status = HTTPStatus.ACCEPTED.value
                elif topic == "netslice_instances_content":
                    # creates NetSlice_Instance_record (NSIR)
                    _id, _ = self.engine.new_item(
                        rollback, engine_session, engine_topic, indata, kwargs
                    )
                    self._set_location_header(main_topic, version, topic, _id)
                    indata["lcmOperationType"] = "instantiate"
                    indata["netsliceInstanceId"] = _id
                    nsilcmop_id, _ = self.engine.new_item(
                        rollback, engine_session, "nsilcmops", indata, kwargs
                    )
                    outdata = {"id": _id, "nsilcmop_id": nsilcmop_id}
                elif topic == "netslice_instances" and item:
                    indata["lcmOperationType"] = item
                    indata["netsliceInstanceId"] = _id
                    _id, _ = self.engine.new_item(
                        rollback, engine_session, "nsilcmops", indata, kwargs
                    )
                    self._set_location_header(
                        main_topic, version, "nsi_lcm_op_occs", _id
                    )
                    outdata = {"id": _id}
                    cherrypy.response.status = HTTPStatus.ACCEPTED.value
                elif topic == "vnf_packages" and item == "action":
                    indata["lcmOperationType"] = item
                    indata["vnfPkgId"] = _id
                    _id, _ = self.engine.new_item(
                        rollback, engine_session, "vnfpkgops", indata, kwargs
                    )
                    self._set_location_header(
                        main_topic, version, "vnfpkg_op_occs", _id
                    )
                    outdata = {"id": _id}
                    cherrypy.response.status = HTTPStatus.ACCEPTED.value
                elif topic == "subscriptions":
                    _id, _ = self.engine.new_item(
                        rollback, engine_session, engine_topic, indata, kwargs
                    )
                    self._set_location_header(main_topic, version, topic, _id)
                    link = {}
                    link["self"] = cherrypy.response.headers["Location"]
                    outdata = {
                        "id": _id,
                        "filter": indata["filter"],
                        "callbackUri": indata["CallbackUri"],
                        "_links": link,
                    }
                    cherrypy.response.status = HTTPStatus.CREATED.value
                else:
                    _id, op_id = self.engine.new_item(
                        rollback,
                        engine_session,
                        engine_topic,
                        indata,
                        kwargs,
                        cherrypy.request.headers,
                    )
                    self._set_location_header(main_topic, version, topic, _id)
                    outdata = {"id": _id}
                    if op_id:
                        outdata["op_id"] = op_id
                        cherrypy.response.status = HTTPStatus.ACCEPTED.value
                    # TODO form NsdInfo when topic in ("ns_descriptors", "vnf_packages")

            elif method == "DELETE":
                if not _id:
                    outdata = self.engine.del_item_list(
                        engine_session, engine_topic, kwargs
                    )
                    cherrypy.response.status = HTTPStatus.OK.value
                else:  # len(args) > 1
                    # for NS NSI generate an operation
                    op_id = None
                    if topic == "ns_instances_content" and not engine_session["force"]:
                        nslcmop_desc = {
                            "lcmOperationType": "terminate",
                            "nsInstanceId": _id,
                            "autoremove": True,
                        }
                        op_id, _ = self.engine.new_item(
                            rollback, engine_session, "nslcmops", nslcmop_desc, kwargs
                        )
                        if op_id:
                            outdata = {"_id": op_id}
                    elif (
                        topic == "netslice_instances_content"
                        and not engine_session["force"]
                    ):
                        nsilcmop_desc = {
                            "lcmOperationType": "terminate",
                            "netsliceInstanceId": _id,
                            "autoremove": True,
                        }
                        op_id, _ = self.engine.new_item(
                            rollback, engine_session, "nsilcmops", nsilcmop_desc, None
                        )
                        if op_id:
                            outdata = {"_id": op_id}
                    # if there is not any deletion in process, delete
                    if not op_id:
                        op_id = self.engine.del_item(engine_session, engine_topic, _id)
                        if op_id:
                            outdata = {"op_id": op_id}
                    cherrypy.response.status = (
                        HTTPStatus.ACCEPTED.value
                        if op_id
                        else HTTPStatus.NO_CONTENT.value
                    )

            elif method in ("PUT", "PATCH"):
                op_id = None
                if not indata and not kwargs and not engine_session.get("set_project"):
                    raise NbiException(
                        "Nothing to update. Provide payload and/or query string",
                        HTTPStatus.BAD_REQUEST,
                    )
                if (
                    item in ("nsd_content", "package_content", "nst_content")
                    and method == "PUT"
                ):
                    completed = self.engine.upload_content(
                        engine_session,
                        engine_topic,
                        _id,
                        indata,
                        kwargs,
                        cherrypy.request.headers,
                    )
                    if not completed:
                        cherrypy.response.headers["Transaction-Id"] = id
                else:
                    op_id = self.engine.edit_item(
                        engine_session, engine_topic, _id, indata, kwargs
                    )

                if op_id:
                    cherrypy.response.status = HTTPStatus.ACCEPTED.value
                    outdata = {"op_id": op_id}
                else:
                    cherrypy.response.status = HTTPStatus.NO_CONTENT.value
                    outdata = None
            else:
                raise NbiException(
                    "Method {} not allowed".format(method),
                    HTTPStatus.METHOD_NOT_ALLOWED,
                )

            # if Role information changes, it is needed to reload the information of roles
            if topic == "roles" and method != "GET":
                self.authenticator.load_operation_to_allowed_roles()

            if (
                topic == "projects"
                and method == "DELETE"
                or topic in ["users", "roles"]
                and method in ["PUT", "PATCH", "DELETE"]
            ):
                self.authenticator.remove_token_from_cache()

            return self._format_out(outdata, token_info, _format)
        except Exception as e:
            if isinstance(
                e,
                (
                    NbiException,
                    EngineException,
                    DbException,
                    FsException,
                    MsgException,
                    AuthException,
                    ValidationError,
                    AuthconnException,
                ),
            ):
                http_code_value = cherrypy.response.status = e.http_code.value
                http_code_name = e.http_code.name
                cherrypy.log("Exception {}".format(e))
            else:
                http_code_value = (
                    cherrypy.response.status
                ) = HTTPStatus.BAD_REQUEST.value  # INTERNAL_SERVER_ERROR
                cherrypy.log("CRITICAL: Exception {}".format(e), traceback=True)
                http_code_name = HTTPStatus.BAD_REQUEST.name
            if hasattr(outdata, "close"):  # is an open file
                outdata.close()
            error_text = str(e)
            rollback.reverse()
            for rollback_item in rollback:
                try:
                    if rollback_item.get("operation") == "set":
                        self.engine.db.set_one(
                            rollback_item["topic"],
                            {"_id": rollback_item["_id"]},
                            rollback_item["content"],
                            fail_on_empty=False,
                        )
                    elif rollback_item.get("operation") == "del_list":
                        self.engine.db.del_list(
                            rollback_item["topic"],
                            rollback_item["filter"],
                            fail_on_empty=False,
                        )
                    else:
                        self.engine.db.del_one(
                            rollback_item["topic"],
                            {"_id": rollback_item["_id"]},
                            fail_on_empty=False,
                        )
                except Exception as e2:
                    rollback_error_text = "Rollback Exception {}: {}".format(
                        rollback_item, e2
                    )
                    cherrypy.log(rollback_error_text)
                    error_text += ". " + rollback_error_text
            # if isinstance(e, MsgException):
            #     error_text = "{} has been '{}' but other modules cannot be informed because an error on bus".format(
            #         engine_topic[:-1], method, error_text)
            problem_details = {
                "code": http_code_name,
                "status": http_code_value,
                "detail": error_text,
            }
            return self._format_out(problem_details, token_info)
            # raise cherrypy.HTTPError(e.http_code.value, str(e))
        finally:
            if token_info:
                self._format_login(token_info)
                if method in ("PUT", "PATCH", "POST") and isinstance(outdata, dict):
                    for logging_id in ("id", "op_id", "nsilcmop_id", "nslcmop_id"):
                        if outdata.get(logging_id):
                            cherrypy.request.login += ";{}={}".format(
                                logging_id, outdata[logging_id][:36]
                            )


def _start_service():
    """
    Callback function called when cherrypy.engine starts
    Override configuration with env variables
    Set database, storage, message configuration
    Init database with admin/admin user password
    """
    global nbi_server
    global subscription_thread
    cherrypy.log.error("Starting osm_nbi")
    # update general cherrypy configuration
    update_dict = {}

    engine_config = cherrypy.tree.apps["/osm"].config
    for k, v in environ.items():
        if not k.startswith("OSMNBI_"):
            continue
        k1, _, k2 = k[7:].lower().partition("_")
        if not k2:
            continue
        try:
            # update static configuration
            if k == "OSMNBI_STATIC_DIR":
                engine_config["/static"]["tools.staticdir.dir"] = v
                engine_config["/static"]["tools.staticdir.on"] = True
            elif k == "OSMNBI_SOCKET_PORT" or k == "OSMNBI_SERVER_PORT":
                update_dict["server.socket_port"] = int(v)
            elif k == "OSMNBI_SOCKET_HOST" or k == "OSMNBI_SERVER_HOST":
                update_dict["server.socket_host"] = v
            elif k1 in ("server", "test", "auth", "log"):
                update_dict[k1 + "." + k2] = v
            elif k1 in ("message", "database", "storage", "authentication"):
                # k2 = k2.replace('_', '.')
                if k2 in ("port", "db_port"):
                    engine_config[k1][k2] = int(v)
                else:
                    engine_config[k1][k2] = v

        except ValueError as e:
            cherrypy.log.error("Ignoring environ '{}': " + str(e))
        except Exception as e:
            cherrypy.log.warn("skipping environ '{}' on exception '{}'".format(k, e))

    if update_dict:
        cherrypy.config.update(update_dict)
        engine_config["global"].update(update_dict)

    # logging cherrypy
    log_format_simple = (
        "%(asctime)s %(levelname)s %(name)s %(filename)s:%(lineno)s %(message)s"
    )
    log_formatter_simple = logging.Formatter(
        log_format_simple, datefmt="%Y-%m-%dT%H:%M:%S"
    )
    logger_server = logging.getLogger("cherrypy.error")
    logger_access = logging.getLogger("cherrypy.access")
    logger_cherry = logging.getLogger("cherrypy")
    logger_nbi = logging.getLogger("nbi")

    if "log.file" in engine_config["global"]:
        file_handler = logging.handlers.RotatingFileHandler(
            engine_config["global"]["log.file"], maxBytes=100e6, backupCount=9, delay=0
        )
        file_handler.setFormatter(log_formatter_simple)
        logger_cherry.addHandler(file_handler)
        logger_nbi.addHandler(file_handler)
    # log always to standard output
    for format_, logger in {
        "nbi.server %(filename)s:%(lineno)s": logger_server,
        "nbi.access %(filename)s:%(lineno)s": logger_access,
        "%(name)s %(filename)s:%(lineno)s": logger_nbi,
    }.items():
        log_format_cherry = "%(asctime)s %(levelname)s {} %(message)s".format(format_)
        log_formatter_cherry = logging.Formatter(
            log_format_cherry, datefmt="%Y-%m-%dT%H:%M:%S"
        )
        str_handler = logging.StreamHandler()
        str_handler.setFormatter(log_formatter_cherry)
        logger.addHandler(str_handler)

    if engine_config["global"].get("log.level"):
        logger_cherry.setLevel(engine_config["global"]["log.level"])
        logger_nbi.setLevel(engine_config["global"]["log.level"])

    # logging other modules
    for k1, logname in {
        "message": "nbi.msg",
        "database": "nbi.db",
        "storage": "nbi.fs",
    }.items():
        engine_config[k1]["logger_name"] = logname
        logger_module = logging.getLogger(logname)
        if "logfile" in engine_config[k1]:
            file_handler = logging.handlers.RotatingFileHandler(
                engine_config[k1]["logfile"], maxBytes=100e6, backupCount=9, delay=0
            )
            file_handler.setFormatter(log_formatter_simple)
            logger_module.addHandler(file_handler)
        if "loglevel" in engine_config[k1]:
            logger_module.setLevel(engine_config[k1]["loglevel"])
    # 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)
    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
    )

    # start subscriptions thread:
    subscription_thread = SubscriptionThread(
        config=engine_config, engine=nbi_server.engine
    )
    subscription_thread.start()
    # Do not capture except SubscriptionException

    backend = engine_config["authentication"]["backend"]
    cherrypy.log.error(
        "Starting OSM NBI Version '{} {}' with '{}' authentication backend".format(
            nbi_version, nbi_version_date, backend
        )
    )


def _stop_service():
    """
    Callback function called when cherrypy.engine stops
    TODO: Ending database connections.
    """
    global subscription_thread
    if subscription_thread:
        subscription_thread.terminate()
    subscription_thread = None
    cherrypy.tree.apps["/osm"].root.engine.stop()
    cherrypy.log.error("Stopping osm_nbi")


def nbi(config_file):
    global nbi_server
    # conf = {
    #     '/': {
    #         #'request.dispatch': cherrypy.dispatch.MethodDispatcher(),
    #         'tools.sessions.on': True,
    #         'tools.response_headers.on': True,
    #         # 'tools.response_headers.headers': [('Content-Type', 'text/plain')],
    #     }
    # }
    # cherrypy.Server.ssl_module = 'builtin'
    # cherrypy.Server.ssl_certificate = "http/cert.pem"
    # cherrypy.Server.ssl_private_key = "http/privkey.pem"
    # cherrypy.Server.thread_pool = 10
    # cherrypy.config.update({'Server.socket_port': config["port"], 'Server.socket_host': config["host"]})

    # cherrypy.config.update({'tools.auth_basic.on': True,
    #    'tools.auth_basic.realm': 'localhost',
    #    'tools.auth_basic.checkpassword': validate_password})
    nbi_server = Server()
    cherrypy.engine.subscribe("start", _start_service)
    cherrypy.engine.subscribe("stop", _stop_service)
    cherrypy.quickstart(nbi_server, "/osm", config_file)


def usage():
    print(
        """Usage: {} [options]
        -c|--config [configuration_file]: loads the configuration file (default: ./nbi.cfg)
        -h|--help: shows this help
        """.format(
            sys.argv[0]
        )
    )
    # --log-socket-host HOST: send logs to this host")
    # --log-socket-port PORT: send logs using this port (default: 9022)")


if __name__ == "__main__":
    try:
        # load parameters and configuration
        opts, args = getopt.getopt(sys.argv[1:], "hvc:", ["config=", "help"])
        # TODO add  "log-socket-host=", "log-socket-port=", "log-file="
        config_file = None
        for o, a in opts:
            if o in ("-h", "--help"):
                usage()
                sys.exit()
            elif o in ("-c", "--config"):
                config_file = a
            # elif o == "--log-socket-port":
            #     log_socket_port = a
            # elif o == "--log-socket-host":
            #     log_socket_host = a
            # elif o == "--log-file":
            #     log_file = a
            else:
                assert False, "Unhandled option"
        if config_file:
            if not path.isfile(config_file):
                print(
                    "configuration file '{}' that not exist".format(config_file),
                    file=sys.stderr,
                )
                exit(1)
        else:
            for config_file in (
                __file__[: __file__.rfind(".")] + ".cfg",
                "./nbi.cfg",
                "/etc/osm/nbi.cfg",
            ):
                if path.isfile(config_file):
                    break
            else:
                print(
                    "No configuration file 'nbi.cfg' found neither at local folder nor at /etc/osm/",
                    file=sys.stderr,
                )
                exit(1)
        nbi(config_file)
    except getopt.GetoptError as e:
        print(str(e), file=sys.stderr)
        # usage()
        exit(1)
