#!/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
                    migrate                                             O
                    heal                                                5
                    update                                              05
            /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:",
                    },
                    "migrate": {
                        "METHODS": ("POST",),
                        "ROLE_PERMISSION": "ns_instances:id:migrate:",
                    },
                    "action": {
                        "METHODS": ("POST",),
                        "ROLE_PERMISSION": "ns_instances:id:action:",
                    },
                    "update": {
                        "METHODS": ("POST",),
                        "ROLE_PERMISSION": "ns_instances:id:update:",
                    },
                },
            },
            "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:",
                },
            },
        }
    },
    "vnflcm": {
        "v1": {
            "vnf_instances": {"METHODS": ("GET", "POST"),
                              "ROLE_PERMISSION": "vnflcm_instances:",
                              "<ID>": {"METHODS": ("GET", "DELETE"),
                                       "ROLE_PERMISSION": "vnflcm_instances:id:",
                                       "scale": {"METHODS": ("POST",),
                                                 "ROLE_PERMISSION": "vnflcm_instances:id:scale:"
                                                },
                                       "terminate": {"METHODS": ("POST",),
                                                     "ROLE_PERMISSION": "vnflcm_instances:id:terminate:"
                                                    },
                                       "instantiate": {"METHODS": ("POST",),
                                                       "ROLE_PERMISSION": "vnflcm_instances:id:instantiate:"
                                                      },
                                       }
                            },
            "vnf_lcm_op_occs": {"METHODS": ("GET",),
                               "ROLE_PERMISSION": "vnf_instances:opps:",
                               "<ID>": {"METHODS": ("GET",),
                                        "ROLE_PERMISSION": "vnf_instances:opps:id:"
                                        },
                               },
            "subscriptions": {"METHODS": ("GET", "POST"),
                              "ROLE_PERMISSION": "vnflcm_subscriptions:",
                              "<ID>": {"METHODS": ("GET", "DELETE"),
                                       "ROLE_PERMISSION": "vnflcm_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)
            # password expiry check
            if self.authenticator.check_password_expiry(outdata):
                outdata = {"id": outdata["id"],
                           "message": "change_password",
                           "user_id": outdata["user_id"]
                           }
            # 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",
                "vnflcm",
            ):
                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 == "vnflcm":
                if topic == "vnf_lcm_op_occs":
                    engine_topic = "vnflcmops"
            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
                elif topic == "vnf_instances" and item:
                    indata["lcmOperationType"] = item
                    indata["vnfInstanceId"] = _id
                    _id, _ = self.engine.new_item(rollback, engine_session, "vnflcmops", indata, kwargs)
                    self._set_location_header(main_topic, version, "vnf_lcm_op_occs", _id)
                    outdata = {"id": _id}
                    cherrypy.response.status = HTTPStatus.ACCEPTED.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)
