#! /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 getopt
import sys
import requests
import json
import logging
import yaml

# import json
# import tarfile
from time import sleep
from random import randint
import os
from sys import stderr
from uuid import uuid4
import re

__author__ = "Alfonso Tierno, alfonso.tiernosepulveda@telefonica.com"
__date__ = "$2018-03-01$"
__version__ = "0.3"
version_date = "Oct 2018"


def usage():
    print("Usage: ", sys.argv[0], "[options]")
    print(
        "      Performs system tests over running NBI. It can be used for real OSM test using option '--test-osm'"
    )
    print(
        "      If this is the case env variables 'OSMNBITEST_VIM_NAME' must be supplied to create a VIM if not exist "
        "where deployment is done"
    )
    print("OPTIONS")
    print("      -h|--help: shows this help")
    print("      --insecure: Allows non trusted https NBI server")
    print("      --list: list available tests")
    print(
        "      --manual-check: Deployment tests stop after deployed to allow manual inspection. Only make sense with "
        "'--test-osm'"
    )
    print("      -p|--password PASSWORD: NBI access password. 'admin' by default")
    print("      ---project PROJECT: NBI access project. 'admin' by default")
    print(
        "      --test TEST[,...]: Execute only a test or a comma separated list of tests"
    )
    print(
        "      --params key=val: params to the previous test. key can be vnfd-files, nsd-file, ns-name, ns-config"
    )
    print(
        "      --test-osm: If missing this test is intended for NBI only, no other OSM components are expected. Use "
        "this flag to test the system. LCM and RO components are expected to be up and running"
    )
    print(
        "      --timeout TIMEOUT: General NBI timeout, by default {}s".format(timeout)
    )
    print(
        "      --timeout-deploy TIMEOUT: Timeout used for getting NS deployed, by default {}s".format(
            timeout_deploy
        )
    )
    print(
        "      --timeout-configure TIMEOUT: Timeout used for getting NS deployed and configured,"
        " by default {}s".format(timeout_configure)
    )
    print("      -u|--user USERNAME: NBI access username. 'admin' by default")
    print(
        "      --url URL: complete NBI server URL. 'https//localhost:9999/osm' by default"
    )
    print("      -v|--verbose print debug information, can be used several times")
    print("      --no-verbose remove verbosity")
    print("      --version: prints current version")
    print("ENV variables used for real deployment tests with option osm-test.")
    print("      export OSMNBITEST_VIM_NAME=vim-name")
    print("      export OSMNBITEST_VIM_URL=vim-url")
    print("      export OSMNBITEST_VIM_TYPE=vim-type")
    print("      export OSMNBITEST_VIM_TENANT=vim-tenant")
    print("      export OSMNBITEST_VIM_USER=vim-user")
    print("      export OSMNBITEST_VIM_PASSWORD=vim-password")
    print('      export OSMNBITEST_VIM_CONFIG="vim-config"')
    print('      export OSMNBITEST_NS_NAME="vim-config"')
    return


r_header_json = {"Content-type": "application/json"}
headers_json = {"Content-type": "application/json", "Accept": "application/json"}
r_header_yaml = {"Content-type": "application/yaml"}
headers_yaml = {"Content-type": "application/yaml", "Accept": "application/yaml"}
r_header_text = {"Content-type": "text/plain"}
r_header_octect = {"Content-type": "application/octet-stream"}
headers_text = {"Accept": "text/plain,application/yaml"}
r_header_zip = {"Content-type": "application/zip"}
headers_zip = {"Accept": "application/zip,application/yaml"}
headers_zip_yaml = {"Accept": "application/yaml", "Content-type": "application/zip"}
headers_zip_json = {"Accept": "application/json", "Content-type": "application/zip"}
headers_txt_json = {"Accept": "application/json", "Content-type": "text/plain"}
r_headers_yaml_location_vnfd = {
    "Location": "/vnfpkgm/v1/vnf_packages_content/",
    "Content-Type": "application/yaml",
}
r_headers_yaml_location_nsd = {
    "Location": "/nsd/v1/ns_descriptors_content/",
    "Content-Type": "application/yaml",
}
r_headers_yaml_location_nst = {
    "Location": "/nst/v1/netslice_templates_content",
    "Content-Type": "application/yaml",
}
r_headers_yaml_location_nslcmop = {
    "Location": "nslcm/v1/ns_lcm_op_occs/",
    "Content-Type": "application/yaml",
}
r_headers_yaml_location_nsilcmop = {
    "Location": "/osm/nsilcm/v1/nsi_lcm_op_occs/",
    "Content-Type": "application/yaml",
}

# test ones authorized
test_authorized_list = (
    (
        "AU1",
        "Invalid vnfd id",
        "GET",
        "/vnfpkgm/v1/vnf_packages/non-existing-id",
        headers_json,
        None,
        404,
        r_header_json,
        "json",
    ),
    (
        "AU2",
        "Invalid nsd id",
        "GET",
        "/nsd/v1/ns_descriptors/non-existing-id",
        headers_yaml,
        None,
        404,
        r_header_yaml,
        "yaml",
    ),
    (
        "AU3",
        "Invalid nsd id",
        "DELETE",
        "/nsd/v1/ns_descriptors_content/non-existing-id",
        headers_yaml,
        None,
        404,
        r_header_yaml,
        "yaml",
    ),
)
timeout = 120  # general timeout
timeout_deploy = 60 * 10  # timeout for NS deploying without charms
timeout_configure = 60 * 20  # timeout for NS deploying and configuring


class TestException(Exception):
    pass


class TestRest:
    def __init__(
        self,
        url_base,
        header_base=None,
        verify=False,
        user="admin",
        password="admin",
        project="admin",
    ):
        self.url_base = url_base
        if header_base is None:
            self.header_base = {}
        else:
            self.header_base = header_base.copy()
        self.s = requests.session()
        self.s.headers = self.header_base
        self.verify = verify
        self.token = False
        self.user = user
        self.password = password
        self.project = project
        self.vim_id = None
        # contains ID of tests obtained from Location response header. "" key contains last obtained id
        self.last_id = ""
        self.test_name = None
        self.step = 0  # number of subtest under test
        self.passed_tests = 0
        self.failed_tests = 0

    def set_test_name(self, test_name):
        self.test_name = test_name
        self.step = 0
        self.last_id = ""

    def set_header(self, header):
        self.s.headers.update(header)

    def set_tet_name(self, test_name):
        self.test_name = test_name

    def unset_header(self, key):
        if key in self.s.headers:
            del self.s.headers[key]

    def test(
        self,
        description,
        method,
        url,
        headers,
        payload,
        expected_codes,
        expected_headers,
        expected_payload,
        store_file=None,
        pooling=False,
    ):
        """
        Performs an http request and check http code response. Exit if different than allowed. It get the returned id
        that can be used by following test in the URL with {name} where name is the name of the test
        :param description:  description of the test
        :param method: HTTP method: GET,PUT,POST,DELETE,...
        :param url: complete URL or relative URL
        :param headers: request headers to add to the base headers
        :param payload: Can be a dict, transformed to json, a text or a file if starts with '@'
        :param expected_codes: expected response codes, can be int, int tuple or int range
        :param expected_headers: expected response headers, dict with key values
        :param expected_payload: expected payload, 0 if empty, 'yaml', 'json', 'text', 'zip', 'octet-stream'
        :param store_file: filename to store content
        :param pooling: if True do not count neither log this test. Because a pooling is done with many equal requests
        :return: requests response
        """
        r = None
        try:
            if not self.s:
                self.s = requests.session()
            # URL
            if not url:
                url = self.url_base
            elif not url.startswith("http"):
                url = self.url_base + url

            # replace url <> with the last ID
            url = url.replace("<>", self.last_id)
            if payload:
                if isinstance(payload, str):
                    if payload.startswith("@"):
                        mode = "r"
                        file_name = payload[1:]
                        if payload.startswith("@b"):
                            mode = "rb"
                            file_name = payload[2:]
                        with open(file_name, mode) as f:
                            payload = f.read()
                elif isinstance(payload, dict):
                    payload = json.dumps(payload)

            if not pooling:
                test_description = "Test {}{} {} {} {}".format(
                    self.test_name, self.step, description, method, url
                )
                logger.warning(test_description)
                self.step += 1
            stream = False
            if expected_payload in ("zip", "octet-string") or store_file:
                stream = True
            __retry = 0
            while True:
                try:
                    r = getattr(self.s, method.lower())(
                        url,
                        data=payload,
                        headers=headers,
                        verify=self.verify,
                        stream=stream,
                    )
                    break
                except requests.exceptions.ConnectionError as e:
                    if __retry == 2:
                        raise
                    logger.error("Exception {}. Retrying".format(e))
                    __retry += 1

            if expected_payload in ("zip", "octet-string") or store_file:
                logger.debug("RX {}".format(r.status_code))
            else:
                logger.debug("RX {}: {}".format(r.status_code, r.text))

            # check response
            if expected_codes:
                if isinstance(expected_codes, int):
                    expected_codes = (expected_codes,)
                if r.status_code not in expected_codes:
                    raise TestException(
                        "Got status {}. Expected {}. {}".format(
                            r.status_code, expected_codes, r.text
                        )
                    )

            if expected_headers:
                for header_key, header_val in expected_headers.items():
                    if header_key.lower() not in r.headers:
                        raise TestException("Header {} not present".format(header_key))
                    if header_val and header_val.lower() not in r.headers[header_key]:
                        raise TestException(
                            "Header {} does not contain {} but {}".format(
                                header_key, header_val, r.headers[header_key]
                            )
                        )

            if expected_payload is not None:
                if expected_payload == 0 and len(r.content) > 0:
                    raise TestException("Expected empty payload")
                elif expected_payload == "json":
                    try:
                        r.json()
                    except Exception as e:
                        raise TestException(
                            "Expected json response payload, but got Exception {}".format(
                                e
                            )
                        )
                elif expected_payload == "yaml":
                    try:
                        yaml.safe_load(r.text)
                    except Exception as e:
                        raise TestException(
                            "Expected yaml response payload, but got Exception {}".format(
                                e
                            )
                        )
                elif expected_payload in ("zip", "octet-string"):
                    if len(r.content) == 0:
                        raise TestException(
                            "Expected some response payload, but got empty"
                        )
                    # try:
                    #     tar = tarfile.open(None, 'r:gz', fileobj=r.raw)
                    #     for tarinfo in tar:
                    #         tarname = tarinfo.name
                    #         print(tarname)
                    # except Exception as e:
                    #     raise TestException("Expected zip response payload, but got Exception {}".format(e))
                elif expected_payload == "text":
                    if len(r.content) == 0:
                        raise TestException(
                            "Expected some response payload, but got empty"
                        )
                    # r.text
            if store_file:
                with open(store_file, "wb") as fd:
                    for chunk in r.iter_content(chunk_size=128):
                        fd.write(chunk)

            location = r.headers.get("Location")
            if location:
                _id = location[location.rfind("/") + 1 :]
                if _id:
                    self.last_id = str(_id)
            if not pooling:
                self.passed_tests += 1
            return r
        except TestException as e:
            self.failed_tests += 1
            r_status_code = None
            r_text = None
            if r:
                r_status_code = r.status_code
                r_text = r.text
            logger.error("{} \nRX code{}: {}".format(e, r_status_code, r_text))
            return None
            # exit(1)
        except IOError as e:
            if store_file:
                logger.error("Cannot open file {}: {}".format(store_file, e))
            else:
                logger.error("Exception: {}".format(e), exc_info=True)
            self.failed_tests += 1
            return None
            # exit(1)
        except requests.exceptions.RequestException as e:
            logger.error("Exception: {}".format(e))

    def get_autorization(self):  # user=None, password=None, project=None):
        if (
            self.token
        ):  # and self.user == user and self.password == password and self.project == project:
            return
        # self.user = user
        # self.password = password
        # self.project = project
        r = self.test(
            "Obtain token",
            "POST",
            "/admin/v1/tokens",
            headers_json,
            {
                "username": self.user,
                "password": self.password,
                "project_id": self.project,
            },
            (200, 201),
            r_header_json,
            "json",
        )
        if not r:
            return
        response = r.json()
        self.token = response["id"]
        self.set_header({"Authorization": "Bearer {}".format(self.token)})

    def remove_authorization(self):
        if self.token:
            self.test(
                "Delete token",
                "DELETE",
                "/admin/v1/tokens/{}".format(self.token),
                headers_json,
                None,
                (200, 201, 204),
                None,
                None,
            )
        self.token = None
        self.unset_header("Authorization")

    def get_create_vim(self, test_osm):
        if self.vim_id:
            return self.vim_id
        self.get_autorization()
        if test_osm:
            vim_name = os.environ.get("OSMNBITEST_VIM_NAME")
            if not vim_name:
                raise TestException(
                    "Needed to define OSMNBITEST_VIM_XXX variables to create a real VIM for deployment"
                )
        else:
            vim_name = "fakeVim"
        # Get VIM
        r = self.test(
            "Get VIM ID",
            "GET",
            "/admin/v1/vim_accounts?name={}".format(vim_name),
            headers_json,
            None,
            200,
            r_header_json,
            "json",
        )
        if not r:
            return
        vims = r.json()
        if vims:
            return vims[0]["_id"]
        # Add VIM
        if test_osm:
            # check needed environ parameters:
            if not os.environ.get("OSMNBITEST_VIM_URL") or not os.environ.get(
                "OSMNBITEST_VIM_TENANT"
            ):
                raise TestException(
                    "Env OSMNBITEST_VIM_URL and OSMNBITEST_VIM_TENANT are needed for create a real VIM"
                    " to deploy on whit the --test-osm option"
                )
            vim_data = (
                "{{schema_version: '1.0', name: '{}', vim_type: {}, vim_url: '{}',"
                "vim_tenant_name: '{}', "
                "vim_user: {}, vim_password: {}"
            ).format(
                vim_name,
                os.environ.get("OSMNBITEST_VIM_TYPE", "openstack"),
                os.environ.get("OSMNBITEST_VIM_URL"),
                os.environ.get("OSMNBITEST_VIM_TENANT"),
                os.environ.get("OSMNBITEST_VIM_USER"),
                os.environ.get("OSMNBITEST_VIM_PASSWORD"),
            )
            if os.environ.get("OSMNBITEST_VIM_CONFIG"):
                vim_data += " ,config: {}".format(
                    os.environ.get("OSMNBITEST_VIM_CONFIG")
                )
            vim_data += "}"
        else:
            vim_data = (
                "{schema_version: '1.0', name: fakeVim, vim_type: openstack, vim_url: 'http://10.11.12.13/fake'"
                ", vim_tenant_name: 'vimtenant', vim_user: vimuser, vim_password: vimpassword}"
            )
        self.test(
            "Create VIM",
            "POST",
            "/admin/v1/vim_accounts",
            headers_yaml,
            vim_data,
            (201, 202),
            {"Location": "/admin/v1/vim_accounts/", "Content-Type": "application/yaml"},
            "yaml",
        )
        return self.last_id

    def print_results(self):
        print("\n\n\n--------------------------------------------")
        print(
            "TEST RESULTS: Total: {}, Passed: {}, Failed: {}".format(
                self.passed_tests + self.failed_tests,
                self.passed_tests,
                self.failed_tests,
            )
        )
        print("--------------------------------------------")

    def wait_until_delete(self, url_op, timeout_delete):
        """
        Make a pooling until topic is not present, because of deleted
        :param url_op:
        :param timeout_delete:
        :return:
        """
        description = "Wait to topic being deleted"
        test_description = "Test {}{} {} {} {}".format(
            self.test_name, self.step, description, "GET", url_op
        )
        logger.warning(test_description)
        self.step += 1

        wait = timeout_delete
        while wait >= 0:
            r = self.test(
                description,
                "GET",
                url_op,
                headers_yaml,
                None,
                (200, 404),
                None,
                r_header_yaml,
                "yaml",
                pooling=True,
            )
            if not r:
                return
            if r.status_code == 404:
                self.passed_tests += 1
                break
            elif r.status_code == 200:
                wait -= 5
                sleep(5)
        else:
            raise TestException(
                "Topic is not deleted after {} seconds".format(timeout_delete)
            )
            self.failed_tests += 1

    def wait_operation_ready(self, ns_nsi, opp_id, timeout, expected_fail=False):
        """
        Wait until nslcmop or nsilcmop finished
        :param ns_nsi: "ns" o "nsi"
        :param opp_id: Id o fthe operation
        :param timeout:
        :param expected_fail:
        :return: None. Updates passed/failed_tests
        """
        if ns_nsi == "ns":
            url_op = "/nslcm/v1/ns_lcm_op_occs/{}".format(opp_id)
        else:
            url_op = "/nsilcm/v1/nsi_lcm_op_occs/{}".format(opp_id)
        description = "Wait to {} lcm operation complete".format(ns_nsi)
        test_description = "Test {}{} {} {} {}".format(
            self.test_name, self.step, description, "GET", url_op
        )
        logger.warning(test_description)
        self.step += 1
        wait = timeout
        while wait >= 0:
            r = self.test(
                description,
                "GET",
                url_op,
                headers_json,
                None,
                200,
                r_header_json,
                "json",
                pooling=True,
            )
            if not r:
                return
            nslcmop = r.json()
            if "COMPLETED" in nslcmop["operationState"]:
                if expected_fail:
                    logger.error(
                        "NS terminate has success, expecting failing: {}".format(
                            nslcmop["detailed-status"]
                        )
                    )
                    self.failed_tests += 1
                else:
                    self.passed_tests += 1
                break
            elif "FAILED" in nslcmop["operationState"]:
                if not expected_fail:
                    logger.error(
                        "NS terminate has failed: {}".format(nslcmop["detailed-status"])
                    )
                    self.failed_tests += 1
                else:
                    self.passed_tests += 1
                break

            print(".", end="", file=stderr)
            wait -= 10
            sleep(10)
        else:
            self.failed_tests += 1
            logger.error(
                "NS instantiate is not terminate after {} seconds".format(timeout)
            )
            return
        print("", file=stderr)


class TestNonAuthorized:
    description = "Test invalid URLs. methods and no authorization"

    @staticmethod
    def run(engine, test_osm, manual_check, test_params=None):
        engine.set_test_name("NonAuth")
        engine.remove_authorization()
        test_not_authorized_list = (
            (
                "Invalid token",
                "GET",
                "/admin/v1/users",
                headers_json,
                None,
                401,
                r_header_json,
                "json",
            ),
            (
                "Invalid URL",
                "POST",
                "/admin/v1/nonexist",
                headers_yaml,
                None,
                405,
                r_header_yaml,
                "yaml",
            ),
            (
                "Invalid version",
                "DELETE",
                "/admin/v2/users",
                headers_yaml,
                None,
                405,
                r_header_yaml,
                "yaml",
            ),
        )
        for t in test_not_authorized_list:
            engine.test(*t)


class TestUsersProjects:
    description = "test project and user creation"

    @staticmethod
    def run(engine, test_osm, manual_check, test_params=None):
        engine.set_test_name("UserProject")
        # backend = test_params.get("backend") if test_params else None   # UNUSED

        # Initialisation
        p1 = p2 = p3 = None
        padmin = pbad = None
        u1 = u2 = u3 = u4 = None

        engine.get_autorization()

        res = engine.test(
            "Create project non admin 1",
            "POST",
            "/admin/v1/projects",
            headers_json,
            {"name": "P1"},
            (201, 204),
            {"Location": "/admin/v1/projects/", "Content-Type": "application/json"},
            "json",
        )
        p1 = engine.last_id if res else None

        res = engine.test(
            "Create project admin",
            "POST",
            "/admin/v1/projects",
            headers_json,
            {"name": "Padmin", "admin": True},
            (201, 204),
            {"Location": "/admin/v1/projects/", "Content-Type": "application/json"},
            "json",
        )
        padmin = engine.last_id if res else None

        res = engine.test(
            "Create project bad format",
            "POST",
            "/admin/v1/projects",
            headers_json,
            {"name": 1},
            (400, 422),
            r_header_json,
            "json",
        )
        pbad = engine.last_id if res else None

        res = engine.test(
            "Get project admin role",
            "GET",
            "/admin/v1/roles?name=project_admin",
            headers_json,
            {},
            (200),
            {"Content-Type": "application/json"},
            "json",
        )
        rpa = res.json()[0]["_id"] if res else None
        res = engine.test(
            "Get project user role",
            "GET",
            "/admin/v1/roles?name=project_user",
            headers_json,
            {},
            (200),
            {"Content-Type": "application/json"},
            "json",
        )
        rpu = res.json()[0]["_id"] if res else None
        res = engine.test(
            "Get system admin role",
            "GET",
            "/admin/v1/roles?name=system_admin",
            headers_json,
            {},
            (200),
            {"Content-Type": "application/json"},
            "json",
        )
        rsa = res.json()[0]["_id"] if res else None

        data = {"username": "U1", "password": "pw1"}
        p2 = uuid4().hex
        data["project_role_mappings"] = [
            {"project": p1, "role": rpa},
            {"project": p2, "role": rpa},
            {"project": padmin, "role": rpu},
        ]
        rc = 201
        xhd = {"Location": "/admin/v1/users/", "Content-Type": "application/json"}
        res = engine.test(
            "Create user with bad project and force",
            "POST",
            "/admin/v1/users?FORCE=True",
            headers_json,
            data,
            rc,
            xhd,
            "json",
        )
        if res:
            u1 = engine.last_id
        else:
            # User is created sometimes even though an exception is raised
            res = engine.test(
                "Get user U1",
                "GET",
                "/admin/v1/users?username=U1",
                headers_json,
                {},
                (200),
                {"Content-Type": "application/json"},
                "json",
            )
            u1 = res.json()[0]["_id"] if res else None

        data = {"username": "U2", "password": "pw2"}
        data["project_role_mappings"] = [
            {"project": p1, "role": rpa},
            {"project": padmin, "role": rsa},
        ]
        res = engine.test(
            "Create user 2",
            "POST",
            "/admin/v1/users",
            headers_json,
            data,
            201,
            {"Location": "/admin/v1/users/", "Content-Type": "application/json"},
            "json",
        )
        u2 = engine.last_id if res else None

        if u1:
            ftt = "project_role_mappings"
            xpr = [{"project": p1, "role": rpa}, {"project": padmin, "role": rpu}]
            data = {ftt: xpr}
            engine.test(
                "Edit user U1, delete  P2 project",
                "PATCH",
                "/admin/v1/users/" + u1,
                headers_json,
                data,
                204,
                None,
                None,
            )
            res = engine.test(
                "Check user U1, contains the right projects",
                "GET",
                "/admin/v1/users/" + u1,
                headers_json,
                None,
                200,
                None,
                json,
            )
            if res:
                rj = res.json()
                xpr[0]["project_name"] = "P1"
                xpr[0]["role_name"] = "project_admin"
                xpr[1]["project_name"] = "Padmin"
                xpr[1]["role_name"] = "project_user"
                ok = True
                for pr in rj[ftt]:
                    if pr not in xpr:
                        ok = False
                for pr in xpr:
                    if pr not in rj[ftt]:
                        ok = False
                if not ok:
                    logger.error(
                        "User {} '{}' are different than expected '{}'. Edition was not done properly".format(
                            ftt, rj[ftt], xpr
                        )
                    )
                    engine.failed_tests += 1

        p2 = None  # To prevent deletion attempts

        # Add a test of 'default project' for Keystone?

        if u2:
            engine.test(
                "Edit user U2, change password",
                "PUT",
                "/admin/v1/users/" + u2,
                headers_json,
                {"password": "pw2_new"},
                204,
                None,
                None,
            )

        if p1:
            engine.test(
                "Change to project P1 non existing",
                "POST",
                "/admin/v1/tokens/",
                headers_json,
                {"project_id": p1},
                401,
                r_header_json,
                "json",
            )

        if u2 and p1:
            res = engine.test(
                "Change to user U2 project P1",
                "POST",
                "/admin/v1/tokens",
                headers_json,
                {"username": "U2", "password": "pw2_new", "project_id": "P1"},
                (200, 201),
                r_header_json,
                "json",
            )
            if res:
                rj = res.json()
                engine.set_header({"Authorization": "Bearer {}".format(rj["id"])})

                engine.test(
                    "Edit user projects non admin",
                    "PUT",
                    "/admin/v1/users/U1",
                    headers_json,
                    {"remove_project_role_mappings": [{"project": "P1", "role": None}]},
                    401,
                    r_header_json,
                    "json",
                )

                res = engine.test(
                    "Add new project non admin",
                    "POST",
                    "/admin/v1/projects",
                    headers_json,
                    {"name": "P2"},
                    401,
                    r_header_json,
                    "json",
                )
                if res is None or res.status_code == 201:
                    # The project has been created even though it shouldn't
                    res = engine.test(
                        "Get project P2",
                        "GET",
                        "/admin/v1/projects/P2",
                        headers_json,
                        None,
                        200,
                        r_header_json,
                        "json",
                    )
                    p2 = res.json()["_id"] if res else None

                if p1:
                    data = {"username": "U3", "password": "pw3"}
                    data["project_role_mappings"] = [{"project": p1, "role": rpu}]
                    res = engine.test(
                        "Add new user non admin",
                        "POST",
                        "/admin/v1/users",
                        headers_json,
                        data,
                        401,
                        r_header_json,
                        "json",
                    )
                    if res is None or res.status_code == 201:
                        # The user has been created even though it shouldn't
                        res = engine.test(
                            "Get user U3",
                            "GET",
                            "/admin/v1/users/U3",
                            headers_json,
                            None,
                            200,
                            r_header_json,
                            "json",
                        )
                        u3 = res.json()["_id"] if res else None
                else:
                    u3 = None

                if padmin:
                    res = engine.test(
                        "Change to user U2 project Padmin",
                        "POST",
                        "/admin/v1/tokens",
                        headers_json,
                        {
                            "project_id": "Padmin"
                        },  # Caused a Keystone authentication error
                        # {"username": "U2", "password": "pw2_new", "project_id": "Padmin"},
                        (200, 201),
                        r_header_json,
                        "json",
                    )
                    if res:
                        rj = res.json()
                        engine.set_header(
                            {"Authorization": "Bearer {}".format(rj["id"])}
                        )

                        res = engine.test(
                            "Add new project admin",
                            "POST",
                            "/admin/v1/projects",
                            headers_json,
                            {"name": "P3"},
                            (201, 204),
                            {
                                "Location": "/admin/v1/projects/",
                                "Content-Type": "application/json",
                            },
                            "json",
                        )
                        p3 = engine.last_id if res else None

                        if p1:
                            data = {"username": "U4", "password": "pw4"}
                            data["project_role_mappings"] = [
                                {"project": p1, "role": rpa}
                            ]
                            res = engine.test(
                                "Add new user admin",
                                "POST",
                                "/admin/v1/users",
                                headers_json,
                                data,
                                (201, 204),
                                {
                                    "Location": "/admin/v1/users/",
                                    "Content-Type": "application/json",
                                },
                                "json",
                            )
                            u4 = engine.last_id if res else None
                        else:
                            u4 = None

                        if u4 and p3:
                            data = {
                                "project_role_mappings": [{"project": p3, "role": rpa}]
                            }
                            engine.test(
                                "Edit user projects admin",
                                "PUT",
                                "/admin/v1/users/U4",
                                headers_json,
                                data,
                                204,
                                None,
                                None,
                            )
                            # Project is deleted even though it shouldn't - PROVISIONAL?
                            res = engine.test(
                                "Delete project P3 conflict",
                                "DELETE",
                                "/admin/v1/projects/" + p3,
                                headers_json,
                                None,
                                409,
                                None,
                                None,
                            )
                            if res and res.status_code in (200, 204):
                                p3 = None
                            if p3:
                                res = engine.test(
                                    "Delete project P3 forcing",
                                    "DELETE",
                                    "/admin/v1/projects/" + p3 + "?FORCE=True",
                                    headers_json,
                                    None,
                                    204,
                                    None,
                                    None,
                                )
                                if res and res.status_code in (200, 204):
                                    p3 = None

                        if u2:
                            res = engine.test(
                                "Delete user U2. Conflict deleting own user",
                                "DELETE",
                                "/admin/v1/users/" + u2,
                                headers_json,
                                None,
                                409,
                                r_header_json,
                                "json",
                            )
                            if res is None or res.status_code in (200, 204):
                                u2 = None
                        if u4:
                            res = engine.test(
                                "Delete user U4",
                                "DELETE",
                                "/admin/v1/users/" + u4,
                                headers_json,
                                None,
                                204,
                                None,
                                None,
                            )
                            if res and res.status_code in (200, 204):
                                u4 = None
                        if p3:
                            res = engine.test(
                                "Delete project P3",
                                "DELETE",
                                "/admin/v1/projects/" + p3,
                                headers_json,
                                None,
                                204,
                                None,
                                None,
                            )
                            if res and res.status_code in (200, 204):
                                p3 = None

                if u3:
                    res = engine.test(
                        "Delete user U3",
                        "DELETE",
                        "/admin/v1/users/" + u3,
                        headers_json,
                        None,
                        204,
                        None,
                        None,
                    )
                    if res:
                        u3 = None

        # change to admin
        engine.remove_authorization()  # To force get authorization
        engine.get_autorization()
        if u1:
            engine.test(
                "Delete user U1",
                "DELETE",
                "/admin/v1/users/" + u1,
                headers_json,
                None,
                204,
                None,
                None,
            )
        if u2:
            engine.test(
                "Delete user U2",
                "DELETE",
                "/admin/v1/users/" + u2,
                headers_json,
                None,
                204,
                None,
                None,
            )
        if u3:
            engine.test(
                "Delete user U3",
                "DELETE",
                "/admin/v1/users/" + u3,
                headers_json,
                None,
                204,
                None,
                None,
            )
        if u4:
            engine.test(
                "Delete user U4",
                "DELETE",
                "/admin/v1/users/" + u4,
                headers_json,
                None,
                204,
                None,
                None,
            )
        if p1:
            engine.test(
                "Delete project P1",
                "DELETE",
                "/admin/v1/projects/" + p1,
                headers_json,
                None,
                204,
                None,
                None,
            )
        if p2:
            engine.test(
                "Delete project P2",
                "DELETE",
                "/admin/v1/projects/" + p2,
                headers_json,
                None,
                204,
                None,
                None,
            )
        if p3:
            engine.test(
                "Delete project P3",
                "DELETE",
                "/admin/v1/projects/" + p3,
                headers_json,
                None,
                204,
                None,
                None,
            )
        if padmin:
            engine.test(
                "Delete project Padmin",
                "DELETE",
                "/admin/v1/projects/" + padmin,
                headers_json,
                None,
                204,
                None,
                None,
            )
        if pbad:
            engine.test(
                "Delete bad project",
                "DELETE",
                "/admin/v1/projects/" + pbad,
                headers_json,
                None,
                204,
                None,
                None,
            )

        # BEGIN New Tests - Addressing Projects/Users by Name/ID
        pid1 = pid2 = None
        uid1 = uid2 = None
        res = engine.test(
            "Create new project P1",
            "POST",
            "/admin/v1/projects",
            headers_json,
            {"name": "P1"},
            201,
            {"Location": "/admin/v1/projects/", "Content-Type": "application/json"},
            "json",
        )
        if res:
            pid1 = res.json()["id"]
            # print("# pid =", pid1)
        res = engine.test(
            "Create new project P2",
            "POST",
            "/admin/v1/projects",
            headers_json,
            {"name": "P2"},
            201,
            {"Location": "/admin/v1/projects/", "Content-Type": "application/json"},
            "json",
        )
        if res:
            pid2 = res.json()["id"]
            # print("# pid =", pid2)
        data = {"username": "U1", "password": "pw1"}
        data["project_role_mappings"] = [{"project": pid1, "role": rpu}]
        res = engine.test(
            "Create new user U1",
            "POST",
            "/admin/v1/users",
            headers_json,
            data,
            201,
            {"Location": "/admin/v1/users/", "Content-Type": "application/json"},
            "json",
        )
        if res:
            uid1 = res.json()["id"]
            # print("# uid =", uid1)
        data = {"username": "U2", "password": "pw2"}
        data["project_role_mappings"] = [{"project": pid2, "role": rpu}]
        res = engine.test(
            "Create new user U2",
            "POST",
            "/admin/v1/users",
            headers_json,
            data,
            201,
            {"Location": "/admin/v1/users/", "Content-Type": "application/json"},
            "json",
        )
        if res:
            uid2 = res.json()["id"]
            # print("# uid =", uid2)
        if pid1:
            engine.test(
                "Get Project P1 by Name",
                "GET",
                "/admin/v1/projects/P1",
                headers_json,
                None,
                200,
                None,
                "json",
            )
            engine.test(
                "Get Project P1 by ID",
                "GET",
                "/admin/v1/projects/" + pid1,
                headers_json,
                None,
                200,
                None,
                "json",
            )
        if uid1:
            engine.test(
                "Get User U1 by Name",
                "GET",
                "/admin/v1/users/U1",
                headers_json,
                None,
                200,
                None,
                "json",
            )
            engine.test(
                "Get User U1 by ID",
                "GET",
                "/admin/v1/users/" + uid1,
                headers_json,
                None,
                200,
                None,
                "json",
            )
        if pid1:
            res = engine.test(
                "Rename Project P1 by Name",
                "PUT",
                "/admin/v1/projects/P1",
                headers_json,
                {"name": "P3"},
                204,
                None,
                None,
            )
            if res:
                engine.test(
                    "Get Project P1 by new Name",
                    "GET",
                    "/admin/v1/projects/P3",
                    headers_json,
                    None,
                    200,
                    None,
                    "json",
                )
        if pid2:
            res = engine.test(
                "Rename Project P2 by ID",
                "PUT",
                "/admin/v1/projects/" + pid2,
                headers_json,
                {"name": "P4"},
                204,
                None,
                None,
            )
            if res:
                engine.test(
                    "Get Project P2 by new Name",
                    "GET",
                    "/admin/v1/projects/P4",
                    headers_json,
                    None,
                    200,
                    None,
                    "json",
                )

        if uid1:
            res = engine.test(
                "Rename User U1 by Name",
                "PUT",
                "/admin/v1/users/U1",
                headers_json,
                {"username": "U3"},
                204,
                None,
                None,
            )
            if res:
                engine.test(
                    "Get User U1 by new Name",
                    "GET",
                    "/admin/v1/users/U3",
                    headers_json,
                    None,
                    200,
                    None,
                    "json",
                )

        if uid2:
            res = engine.test(
                "Rename User U2 by ID",
                "PUT",
                "/admin/v1/users/" + uid2,
                headers_json,
                {"username": "U4"},
                204,
                None,
                None,
            )
            if res:
                engine.test(
                    "Get User U2 by new Name",
                    "GET",
                    "/admin/v1/users/U4",
                    headers_json,
                    None,
                    200,
                    None,
                    "json",
                )
        if uid1:
            res = engine.test(
                "Delete User U1 by Name",
                "DELETE",
                "/admin/v1/users/U3",
                headers_json,
                None,
                204,
                None,
                None,
            )
            if res:
                uid1 = None

        if uid2:
            res = engine.test(
                "Delete User U2 by ID",
                "DELETE",
                "/admin/v1/users/" + uid2,
                headers_json,
                None,
                204,
                None,
                None,
            )
            if res:
                uid2 = None

        if pid1:
            res = engine.test(
                "Delete Project P1 by Name",
                "DELETE",
                "/admin/v1/projects/P3",
                headers_json,
                None,
                204,
                None,
                None,
            )
            if res:
                pid1 = None

        if pid2:
            res = engine.test(
                "Delete Project P2 by ID",
                "DELETE",
                "/admin/v1/projects/" + pid2,
                headers_json,
                None,
                204,
                None,
                None,
            )
            if res:
                pid2 = None

        # END New Tests - Addressing Projects/Users by Name

        # CLEANUP
        if pid1:
            engine.test(
                "Delete Project P1",
                "DELETE",
                "/admin/v1/projects/" + pid1,
                headers_json,
                None,
                204,
                None,
                None,
            )
        if pid2:
            engine.test(
                "Delete Project P2",
                "DELETE",
                "/admin/v1/projects/" + pid2,
                headers_json,
                None,
                204,
                None,
                None,
            )
        if uid1:
            engine.test(
                "Delete User U1",
                "DELETE",
                "/admin/v1/users/" + uid1,
                headers_json,
                None,
                204,
                None,
                None,
            )
        if uid2:
            engine.test(
                "Delete User U2",
                "DELETE",
                "/admin/v1/users/" + uid2,
                headers_json,
                None,
                204,
                None,
                None,
            )

        engine.remove_authorization()  # To finish


class TestProjectsDescriptors:
    description = "test descriptors visibility among projects"

    @staticmethod
    def run(engine, test_osm, manual_check, test_params=None):
        vnfd_ids = []
        engine.set_test_name("ProjectDescriptors")
        engine.get_autorization()

        project_admin_id = None
        res = engine.test(
            "Get my project Padmin",
            "GET",
            "/admin/v1/projects/{}".format(engine.project),
            headers_json,
            None,
            200,
            r_header_json,
            "json",
        )
        if res:
            response = res.json()
            project_admin_id = response["_id"]
        engine.test(
            "Create project Padmin",
            "POST",
            "/admin/v1/projects",
            headers_json,
            {"name": "Padmin", "admin": True},
            (201, 204),
            {"Location": "/admin/v1/projects/", "Content-Type": "application/json"},
            "json",
        )
        engine.test(
            "Create project P2",
            "POST",
            "/admin/v1/projects",
            headers_json,
            {"name": "P2"},
            (201, 204),
            {"Location": "/admin/v1/projects/", "Content-Type": "application/json"},
            "json",
        )
        engine.test(
            "Create project P3",
            "POST",
            "/admin/v1/projects",
            headers_json,
            {"name": "P3"},
            (201, 204),
            {"Location": "/admin/v1/projects/", "Content-Type": "application/json"},
            "json",
        )

        engine.test(
            "Create user U1",
            "POST",
            "/admin/v1/users",
            headers_json,
            {
                "username": "U1",
                "password": "pw1",
                "project_role_mappings": [
                    {"project": "Padmin", "role": "system_admin"},
                    {"project": "P2", "role": "project_admin"},
                    {"project": "P3", "role": "project_admin"},
                ],
            },
            201,
            {"Location": "/admin/v1/users/", "Content-Type": "application/json"},
            "json",
        )

        engine.test(
            "Onboard VNFD id1",
            "POST",
            "/vnfpkgm/v1/vnf_packages_content?id=id1",
            headers_yaml,
            TestDescriptors.vnfd_empty,
            201,
            r_headers_yaml_location_vnfd,
            "yaml",
        )
        vnfd_ids.append(engine.last_id)
        engine.test(
            "Onboard VNFD id2 PUBLIC",
            "POST",
            "/vnfpkgm/v1/vnf_packages_content?id=id2&PUBLIC=TRUE",
            headers_yaml,
            TestDescriptors.vnfd_empty,
            201,
            r_headers_yaml_location_vnfd,
            "yaml",
        )
        vnfd_ids.append(engine.last_id)
        engine.test(
            "Onboard VNFD id3",
            "POST",
            "/vnfpkgm/v1/vnf_packages_content?id=id3&PUBLIC=FALSE",
            headers_yaml,
            TestDescriptors.vnfd_empty,
            201,
            r_headers_yaml_location_vnfd,
            "yaml",
        )
        vnfd_ids.append(engine.last_id)

        res = engine.test(
            "Get VNFD descriptors",
            "GET",
            "/vnfpkgm/v1/vnf_packages?id=id1,id2,id3",
            headers_json,
            None,
            200,
            r_header_json,
            "json",
        )
        response = res.json()
        if len(response) != 3:
            logger.error(
                "Only 3 vnfds should be present for project admin. {} listed".format(
                    len(response)
                )
            )
            engine.failed_tests += 1

        # Change to other project Padmin
        res = engine.test(
            "Change to user U1 project Padmin",
            "POST",
            "/admin/v1/tokens",
            headers_json,
            {"username": "U1", "password": "pw1", "project_id": "Padmin"},
            (200, 201),
            r_header_json,
            "json",
        )
        if res:
            response = res.json()
            engine.set_header({"Authorization": "Bearer {}".format(response["id"])})

        # list vnfds
        res = engine.test(
            "List VNFD descriptors for Padmin",
            "GET",
            "/vnfpkgm/v1/vnf_packages",
            headers_json,
            None,
            200,
            r_header_json,
            "json",
        )
        response = res.json()
        if len(response) != 0:
            logger.error(
                "Only 0 vnfds should be present for project Padmin. {} listed".format(
                    len(response)
                )
            )
            engine.failed_tests += 1

        # list Public vnfds
        res = engine.test(
            "List VNFD public descriptors",
            "GET",
            "/vnfpkgm/v1/vnf_packages?PUBLIC=True",
            headers_json,
            None,
            200,
            r_header_json,
            "json",
        )
        response = res.json()
        if len(response) != 1:
            logger.error(
                "Only 1 vnfds should be present for project Padmin. {} listed".format(
                    len(response)
                )
            )
            engine.failed_tests += 1

        # list vnfds belonging to project "admin"
        res = engine.test(
            "List VNFD of admin project",
            "GET",
            "/vnfpkgm/v1/vnf_packages?ADMIN={}".format(project_admin_id),
            headers_json,
            None,
            200,
            r_header_json,
            "json",
        )
        if res:
            response = res.json()
            if len(response) != 3:
                logger.error(
                    "Only 3 vnfds should be present for project Padmin. {} listed".format(
                        len(response)
                    )
                )
                engine.failed_tests += 1

        # Get Public vnfds
        engine.test(
            "Get VNFD public descriptors",
            "GET",
            "/vnfpkgm/v1/vnf_packages/{}".format(vnfd_ids[1]),
            headers_json,
            None,
            200,
            r_header_json,
            "json",
        )
        # Edit not owned vnfd
        engine.test(
            "Edit VNFD ",
            "PATCH",
            "/vnfpkgm/v1/vnf_packages/{}".format(vnfd_ids[0]),
            headers_yaml,
            "{name: pepe}",
            404,
            r_header_yaml,
            "yaml",
        )

        # Add to my catalog
        engine.test(
            "Add VNFD id2 to my catalog",
            "PATCH",
            "/vnfpkgm/v1/vnf_packages/{}?SET_PROJECT".format(vnfd_ids[1]),
            headers_json,
            None,
            204,
            None,
            0,
        )

        # Add a new vnfd
        engine.test(
            "Onboard VNFD id4",
            "POST",
            "/vnfpkgm/v1/vnf_packages_content?id=id4",
            headers_yaml,
            TestDescriptors.vnfd_empty,
            201,
            r_headers_yaml_location_vnfd,
            "yaml",
        )
        vnfd_ids.append(engine.last_id)

        # list vnfds
        res = engine.test(
            "List VNFD public descriptors",
            "GET",
            "/vnfpkgm/v1/vnf_packages",
            headers_json,
            None,
            200,
            r_header_json,
            "json",
        )
        response = res.json()
        if len(response) != 2:
            logger.error(
                "Only 2 vnfds should be present for project Padmin. {} listed".format(
                    len(response)
                )
            )
            engine.failed_tests += 1

        if manual_check:
            input(
                "VNFDs have been omboarded. Perform manual check and press enter to resume"
            )

        test_rest.test(
            "Delete VNFD id2",
            "DELETE",
            "/vnfpkgm/v1/vnf_packages/{}".format(vnfd_ids[1]),
            headers_yaml,
            None,
            204,
            None,
            0,
        )

        # change to admin project
        engine.remove_authorization()  # To force get authorization
        engine.get_autorization()
        test_rest.test(
            "Delete VNFD id1",
            "DELETE",
            "/vnfpkgm/v1/vnf_packages/{}".format(vnfd_ids[0]),
            headers_yaml,
            None,
            204,
            None,
            0,
        )
        test_rest.test(
            "Delete VNFD id2",
            "DELETE",
            "/vnfpkgm/v1/vnf_packages/{}".format(vnfd_ids[1]),
            headers_yaml,
            None,
            204,
            None,
            0,
        )
        test_rest.test(
            "Delete VNFD id3",
            "DELETE",
            "/vnfpkgm/v1/vnf_packages/{}".format(vnfd_ids[2]),
            headers_yaml,
            None,
            204,
            None,
            0,
        )
        test_rest.test(
            "Delete VNFD id4",
            "DELETE",
            "/vnfpkgm/v1/vnf_packages/{}".format(vnfd_ids[3]),
            headers_yaml,
            None,
            404,
            r_header_yaml,
            "yaml",
        )
        test_rest.test(
            "Delete VNFD id4",
            "DELETE",
            "/vnfpkgm/v1/vnf_packages/{}?ADMIN".format(vnfd_ids[3]),
            headers_yaml,
            None,
            204,
            None,
            0,
        )
        # Get Public vnfds
        engine.test(
            "Get VNFD deleted id1",
            "GET",
            "/vnfpkgm/v1/vnf_packages/{}?ADMIN".format(vnfd_ids[0]),
            headers_json,
            None,
            404,
            r_header_json,
            "json",
        )
        engine.test(
            "Get VNFD deleted id2",
            "GET",
            "/vnfpkgm/v1/vnf_packages/{}?ADMIN".format(vnfd_ids[1]),
            headers_json,
            None,
            404,
            r_header_json,
            "json",
        )
        engine.test(
            "Get VNFD deleted id3",
            "GET",
            "/vnfpkgm/v1/vnf_packages/{}?ADMIN".format(vnfd_ids[2]),
            headers_json,
            None,
            404,
            r_header_json,
            "json",
        )
        engine.test(
            "Get VNFD deleted id4",
            "GET",
            "/vnfpkgm/v1/vnf_packages/{}?ADMIN".format(vnfd_ids[3]),
            headers_json,
            None,
            404,
            r_header_json,
            "json",
        )

        engine.test(
            "Delete user U1",
            "DELETE",
            "/admin/v1/users/U1",
            headers_json,
            None,
            204,
            None,
            None,
        )
        engine.test(
            "Delete project Padmin",
            "DELETE",
            "/admin/v1/projects/Padmin",
            headers_json,
            None,
            204,
            None,
            None,
        )
        engine.test(
            "Delete project P2",
            "DELETE",
            "/admin/v1/projects/P2",
            headers_json,
            None,
            204,
            None,
            None,
        )
        engine.test(
            "Delete project P3",
            "DELETE",
            "/admin/v1/projects/P3",
            headers_json,
            None,
            204,
            None,
            None,
        )


class TestFakeVim:
    description = "Creates/edit/delete fake VIMs and SDN controllers"

    def __init__(self):
        self.vim = {
            "schema_version": "1.0",
            "schema_type": "No idea",
            "name": "myVim",
            "description": "Descriptor name",
            "vim_type": "openstack",
            "vim_url": "http://localhost:/vim",
            "vim_tenant_name": "vimTenant",
            "vim_user": "user",
            "vim_password": "password",
            "config": {"config_param": 1},
        }
        self.sdn = {
            "name": "sdn-name",
            "description": "sdn-description",
            "dpid": "50:50:52:54:00:94:21:21",
            "ip": "192.168.15.17",
            "port": 8080,
            "type": "opendaylight",
            "version": "3.5.6",
            "user": "user",
            "password": "passwd",
        }
        self.port_mapping = [
            {
                "compute_node": "compute node 1",
                "ports": [
                    {
                        "pci": "0000:81:00.0",
                        "switch_port": "port-2/1",
                        "switch_mac": "52:54:00:94:21:21",
                    },
                    {
                        "pci": "0000:81:00.1",
                        "switch_port": "port-2/2",
                        "switch_mac": "52:54:00:94:21:22",
                    },
                ],
            },
            {
                "compute_node": "compute node 2",
                "ports": [
                    {
                        "pci": "0000:81:00.0",
                        "switch_port": "port-2/3",
                        "switch_mac": "52:54:00:94:21:23",
                    },
                    {
                        "pci": "0000:81:00.1",
                        "switch_port": "port-2/4",
                        "switch_mac": "52:54:00:94:21:24",
                    },
                ],
            },
        ]

    def run(self, engine, test_osm, manual_check, test_params=None):
        vim_bad = self.vim.copy()
        vim_bad.pop("name")

        engine.set_test_name("FakeVim")
        engine.get_autorization()
        engine.test(
            "Create VIM",
            "POST",
            "/admin/v1/vim_accounts",
            headers_json,
            self.vim,
            (201, 202),
            {"Location": "/admin/v1/vim_accounts/", "Content-Type": "application/json"},
            "json",
        )
        vim_id = engine.last_id
        engine.test(
            "Create VIM without name, bad schema",
            "POST",
            "/admin/v1/vim_accounts",
            headers_json,
            vim_bad,
            422,
            None,
            headers_json,
        )
        engine.test(
            "Create VIM name repeated",
            "POST",
            "/admin/v1/vim_accounts",
            headers_json,
            self.vim,
            409,
            None,
            headers_json,
        )
        engine.test(
            "Show VIMs",
            "GET",
            "/admin/v1/vim_accounts",
            headers_yaml,
            None,
            200,
            r_header_yaml,
            "yaml",
        )
        engine.test(
            "Show VIM",
            "GET",
            "/admin/v1/vim_accounts/{}".format(vim_id),
            headers_yaml,
            None,
            200,
            r_header_yaml,
            "yaml",
        )
        if not test_osm:
            # delete with FORCE
            engine.test(
                "Delete VIM",
                "DELETE",
                "/admin/v1/vim_accounts/{}?FORCE=True".format(vim_id),
                headers_yaml,
                None,
                202,
                None,
                0,
            )
            engine.test(
                "Check VIM is deleted",
                "GET",
                "/admin/v1/vim_accounts/{}".format(vim_id),
                headers_yaml,
                None,
                404,
                r_header_yaml,
                "yaml",
            )
        else:
            # delete and wait until is really deleted
            engine.test(
                "Delete VIM",
                "DELETE",
                "/admin/v1/vim_accounts/{}".format(vim_id),
                headers_yaml,
                None,
                202,
                None,
                0,
            )
            engine.wait_until_delete(
                "/admin/v1/vim_accounts/{}".format(vim_id), timeout
            )


class TestVIMSDN(TestFakeVim):
    description = "Creates VIM with SDN editing SDN controllers and port_mapping"

    def __init__(self):
        TestFakeVim.__init__(self)
        self.wim = {
            "schema_version": "1.0",
            "schema_type": "No idea",
            "name": "myWim",
            "description": "Descriptor name",
            "wim_type": "odl",
            "wim_url": "http://localhost:/wim",
            "user": "user",
            "password": "password",
            "config": {"config_param": 1},
        }

    def run(self, engine, test_osm, manual_check, test_params=None):
        engine.set_test_name("VimSdn")
        engine.get_autorization()
        # Added SDN
        engine.test(
            "Create SDN",
            "POST",
            "/admin/v1/sdns",
            headers_json,
            self.sdn,
            (201, 202),
            {"Location": "/admin/v1/sdns/", "Content-Type": "application/json"},
            "json",
        )
        sdnc_id = engine.last_id
        # sleep(5)
        # Edit SDN
        engine.test(
            "Edit SDN",
            "PATCH",
            "/admin/v1/sdns/{}".format(sdnc_id),
            headers_json,
            {"name": "new_sdn_name"},
            (202, 204),
            None,
            None,
        )
        # sleep(5)
        # VIM with SDN
        self.vim["config"]["sdn-controller"] = sdnc_id
        self.vim["config"]["sdn-port-mapping"] = self.port_mapping
        engine.test(
            "Create VIM",
            "POST",
            "/admin/v1/vim_accounts",
            headers_json,
            self.vim,
            (200, 202, 201),
            {"Location": "/admin/v1/vim_accounts/", "Content-Type": "application/json"},
            "json",
        ),

        vim_id = engine.last_id
        self.port_mapping[0]["compute_node"] = "compute node XX"
        engine.test(
            "Edit VIM change port-mapping",
            "PUT",
            "/admin/v1/vim_accounts/{}".format(vim_id),
            headers_json,
            {"config": {"sdn-port-mapping": self.port_mapping}},
            (202, 204),
            None,
            None,
        )
        engine.test(
            "Edit VIM remove port-mapping",
            "PUT",
            "/admin/v1/vim_accounts/{}".format(vim_id),
            headers_json,
            {"config": {"sdn-port-mapping": None}},
            (202, 204),
            None,
            None,
        )

        engine.test(
            "Create WIM",
            "POST",
            "/admin/v1/wim_accounts",
            headers_json,
            self.wim,
            (200, 202, 201),
            {"Location": "/admin/v1/wim_accounts/", "Content-Type": "application/json"},
            "json",
        ),
        wim_id = engine.last_id

        if not test_osm:
            # delete with FORCE
            engine.test(
                "Delete VIM remove port-mapping",
                "DELETE",
                "/admin/v1/vim_accounts/{}?FORCE=True".format(vim_id),
                headers_json,
                None,
                202,
                None,
                0,
            )
            engine.test(
                "Delete SDNC",
                "DELETE",
                "/admin/v1/sdns/{}?FORCE=True".format(sdnc_id),
                headers_json,
                None,
                202,
                None,
                0,
            )

            engine.test(
                "Delete WIM",
                "DELETE",
                "/admin/v1/wim_accounts/{}?FORCE=True".format(wim_id),
                headers_json,
                None,
                202,
                None,
                0,
            )
            engine.test(
                "Check VIM is deleted",
                "GET",
                "/admin/v1/vim_accounts/{}".format(vim_id),
                headers_yaml,
                None,
                404,
                r_header_yaml,
                "yaml",
            )
            engine.test(
                "Check SDN is deleted",
                "GET",
                "/admin/v1/sdns/{}".format(sdnc_id),
                headers_yaml,
                None,
                404,
                r_header_yaml,
                "yaml",
            )
            engine.test(
                "Check WIM is deleted",
                "GET",
                "/admin/v1/wim_accounts/{}".format(wim_id),
                headers_yaml,
                None,
                404,
                r_header_yaml,
                "yaml",
            )
        else:
            if manual_check:
                input(
                    "VIM, SDN, WIM has been deployed. Perform manual check and press enter to resume"
                )
            # delete and wait until is really deleted
            engine.test(
                "Delete VIM remove port-mapping",
                "DELETE",
                "/admin/v1/vim_accounts/{}".format(vim_id),
                headers_json,
                None,
                (202, 201, 204),
                None,
                0,
            )
            engine.test(
                "Delete SDN",
                "DELETE",
                "/admin/v1/sdns/{}".format(sdnc_id),
                headers_json,
                None,
                (202, 201, 204),
                None,
                0,
            )
            engine.test(
                "Delete VIM",
                "DELETE",
                "/admin/v1/wim_accounts/{}".format(wim_id),
                headers_json,
                None,
                (202, 201, 204),
                None,
                0,
            )
            engine.wait_until_delete(
                "/admin/v1/vim_accounts/{}".format(vim_id), timeout
            )
            engine.wait_until_delete("/admin/v1/sdns/{}".format(sdnc_id), timeout)
            engine.wait_until_delete(
                "/admin/v1/wim_accounts/{}".format(wim_id), timeout
            )


class TestDeploy:
    description = "Base class for downloading descriptors from ETSI, onboard and deploy in real VIM"

    def __init__(self):
        self.test_name = "DEPLOY"
        self.nsd_id = None
        self.vim_id = None
        self.ns_id = None
        self.vnfds_id = []
        self.descriptor_url = (
            "https://osm-download.etsi.org/ftp/osm-3.0-three/2nd-hackfest/packages/"
        )
        self.vnfd_filenames = ("cirros_vnf.tar.gz",)
        self.nsd_filename = "cirros_2vnf_ns.tar.gz"
        self.descriptor_edit = None
        self.uses_configuration = False
        self.users = {}
        self.passwords = {}
        self.commands = {}
        self.keys = {}
        self.timeout = 120
        self.qforce = ""
        self.ns_params = None
        self.vnfr_ip_list = {}

    def create_descriptors(self, engine):
        temp_dir = os.path.dirname(os.path.abspath(__file__)) + "/temp/"
        if not os.path.exists(temp_dir):
            os.makedirs(temp_dir)
        for vnfd_index, vnfd_filename in enumerate(self.vnfd_filenames):
            if "/" in vnfd_filename:
                vnfd_filename_path = vnfd_filename
                if not os.path.exists(vnfd_filename_path):
                    raise TestException(
                        "File '{}' does not exist".format(vnfd_filename_path)
                    )
            else:
                vnfd_filename_path = temp_dir + vnfd_filename
                if not os.path.exists(vnfd_filename_path):
                    with open(vnfd_filename_path, "wb") as file:
                        response = requests.get(self.descriptor_url + vnfd_filename)
                        if response.status_code >= 300:
                            raise TestException(
                                "Error downloading descriptor from '{}': {}".format(
                                    self.descriptor_url + vnfd_filename,
                                    response.status_code,
                                )
                            )
                        file.write(response.content)
            if vnfd_filename_path.endswith(".yaml"):
                headers = headers_yaml
            else:
                headers = headers_zip_yaml
            if randint(0, 1) == 0:
                # vnfd CREATE AND UPLOAD in one step:
                engine.test(
                    "Onboard VNFD in one step",
                    "POST",
                    "/vnfpkgm/v1/vnf_packages_content" + self.qforce,
                    headers,
                    "@b" + vnfd_filename_path,
                    201,
                    r_headers_yaml_location_vnfd,
                    "yaml",
                )
                self.vnfds_id.append(engine.last_id)
            else:
                # vnfd CREATE AND UPLOAD ZIP
                engine.test(
                    "Onboard VNFD step 1",
                    "POST",
                    "/vnfpkgm/v1/vnf_packages",
                    headers_json,
                    None,
                    201,
                    {
                        "Location": "/vnfpkgm/v1/vnf_packages/",
                        "Content-Type": "application/json",
                    },
                    "json",
                )
                self.vnfds_id.append(engine.last_id)
                engine.test(
                    "Onboard VNFD step 2 as ZIP",
                    "PUT",
                    "/vnfpkgm/v1/vnf_packages/<>/package_content" + self.qforce,
                    headers,
                    "@b" + vnfd_filename_path,
                    204,
                    None,
                    0,
                )

            if self.descriptor_edit:
                if "vnfd{}".format(vnfd_index) in self.descriptor_edit:
                    # Modify VNFD
                    engine.test(
                        "Edit VNFD ",
                        "PATCH",
                        "/vnfpkgm/v1/vnf_packages/{}".format(self.vnfds_id[-1]),
                        headers_yaml,
                        self.descriptor_edit["vnfd{}".format(vnfd_index)],
                        204,
                        None,
                        None,
                    )

        if "/" in self.nsd_filename:
            nsd_filename_path = self.nsd_filename
            if not os.path.exists(nsd_filename_path):
                raise TestException(
                    "File '{}' does not exist".format(nsd_filename_path)
                )
        else:
            nsd_filename_path = temp_dir + self.nsd_filename
            if not os.path.exists(nsd_filename_path):
                with open(nsd_filename_path, "wb") as file:
                    response = requests.get(self.descriptor_url + self.nsd_filename)
                    if response.status_code >= 300:
                        raise TestException(
                            "Error downloading descriptor from '{}': {}".format(
                                self.descriptor_url + self.nsd_filename,
                                response.status_code,
                            )
                        )
                    file.write(response.content)
        if nsd_filename_path.endswith(".yaml"):
            headers = headers_yaml
        else:
            headers = headers_zip_yaml

        if randint(0, 1) == 0:
            # nsd CREATE AND UPLOAD in one step:
            engine.test(
                "Onboard NSD in one step",
                "POST",
                "/nsd/v1/ns_descriptors_content" + self.qforce,
                headers,
                "@b" + nsd_filename_path,
                201,
                r_headers_yaml_location_nsd,
                yaml,
            )
            self.nsd_id = engine.last_id
        else:
            # nsd CREATE AND UPLOAD ZIP
            engine.test(
                "Onboard NSD step 1",
                "POST",
                "/nsd/v1/ns_descriptors",
                headers_json,
                None,
                201,
                {
                    "Location": "/nsd/v1/ns_descriptors/",
                    "Content-Type": "application/json",
                },
                "json",
            )
            self.nsd_id = engine.last_id
            engine.test(
                "Onboard NSD step 2 as ZIP",
                "PUT",
                "/nsd/v1/ns_descriptors/<>/nsd_content" + self.qforce,
                headers,
                "@b" + nsd_filename_path,
                204,
                None,
                0,
            )

        if self.descriptor_edit and "nsd" in self.descriptor_edit:
            # Modify NSD
            engine.test(
                "Edit NSD ",
                "PATCH",
                "/nsd/v1/ns_descriptors/{}".format(self.nsd_id),
                headers_yaml,
                self.descriptor_edit["nsd"],
                204,
                None,
                None,
            )

    def delete_descriptors(self, engine):
        # delete descriptors
        engine.test(
            "Delete NSSD SOL005",
            "DELETE",
            "/nsd/v1/ns_descriptors/{}".format(self.nsd_id),
            headers_yaml,
            None,
            204,
            None,
            0,
        )
        for vnfd_id in self.vnfds_id:
            engine.test(
                "Delete VNFD SOL005",
                "DELETE",
                "/vnfpkgm/v1/vnf_packages/{}".format(vnfd_id),
                headers_yaml,
                None,
                204,
                None,
                0,
            )

    def instantiate(self, engine, ns_data):
        ns_data_text = yaml.safe_dump(ns_data, default_flow_style=True, width=256)
        # create NS Two steps
        r = engine.test(
            "Create NS step 1",
            "POST",
            "/nslcm/v1/ns_instances",
            headers_yaml,
            ns_data_text,
            (201, 202),
            {"Location": "nslcm/v1/ns_instances/", "Content-Type": "application/yaml"},
            "yaml",
        )
        if not r:
            return
        self.ns_id = engine.last_id
        engine.test(
            "Instantiate NS step 2",
            "POST",
            "/nslcm/v1/ns_instances/{}/instantiate".format(self.ns_id),
            headers_yaml,
            ns_data_text,
            (201, 202),
            r_headers_yaml_location_nslcmop,
            "yaml",
        )
        nslcmop_id = engine.last_id

        if test_osm:
            # Wait until status is Ok
            timeout = timeout_configure if self.uses_configuration else timeout_deploy
            engine.wait_operation_ready("ns", nslcmop_id, timeout)

    def terminate(self, engine):
        # remove deployment
        if test_osm:
            engine.test(
                "Terminate NS",
                "POST",
                "/nslcm/v1/ns_instances/{}/terminate".format(self.ns_id),
                headers_yaml,
                None,
                (201, 202),
                r_headers_yaml_location_nslcmop,
                "yaml",
            )
            nslcmop2_id = engine.last_id
            # Wait until status is Ok
            engine.wait_operation_ready("ns", nslcmop2_id, timeout_deploy)

            engine.test(
                "Delete NS",
                "DELETE",
                "/nslcm/v1/ns_instances/{}".format(self.ns_id),
                headers_yaml,
                None,
                204,
                None,
                0,
            )
        else:
            engine.test(
                "Delete NS with FORCE",
                "DELETE",
                "/nslcm/v1/ns_instances/{}?FORCE=True".format(self.ns_id),
                headers_yaml,
                None,
                204,
                None,
                0,
            )

        # check all it is deleted
        engine.test(
            "Check NS is deleted",
            "GET",
            "/nslcm/v1/ns_instances/{}".format(self.ns_id),
            headers_yaml,
            None,
            404,
            None,
            "yaml",
        )
        r = engine.test(
            "Check NSLCMOPs are deleted",
            "GET",
            "/nslcm/v1/ns_lcm_op_occs?nsInstanceId={}".format(self.ns_id),
            headers_json,
            None,
            200,
            None,
            "json",
        )
        if not r:
            return
        nslcmops = r.json()
        if not isinstance(nslcmops, list) or nslcmops:
            raise TestException(
                "NS {} deleted but with ns_lcm_op_occ active: {}".format(
                    self.ns_id, nslcmops
                )
            )

    def test_ns(
        self,
        engine,
        test_osm,
        commands=None,
        users=None,
        passwds=None,
        keys=None,
        timeout=0,
    ):
        r = engine.test(
            "GET VNFR IDs",
            "GET",
            "/nslcm/v1/ns_instances/{}".format(self.ns_id),
            headers_json,
            None,
            200,
            r_header_json,
            "json",
        )
        if not r:
            return
        ns_data = r.json()

        vnfr_list = ns_data["constituent-vnfr-ref"]
        time = 0
        _commands = commands if commands is not None else self.commands
        _users = users if users is not None else self.users
        _passwds = passwds if passwds is not None else self.passwords
        _keys = keys if keys is not None else self.keys
        _timeout = timeout if timeout != 0 else self.timeout

        # vnfr_list=[d8272263-6bd3-4680-84ca-6a4be23b3f2d, 88b22e2f-994a-4b61-94fd-4a3c90de3dc4]
        for vnfr_id in vnfr_list:
            r = engine.test(
                "Get VNFR to get IP_ADDRESS",
                "GET",
                "/nslcm/v1/vnfrs/{}".format(vnfr_id),
                headers_json,
                None,
                200,
                r_header_json,
                "json",
            )
            if not r:
                continue
            vnfr_data = r.json()

            vnf_index = str(vnfr_data["member-vnf-index-ref"])

            ip_address = self.get_vnfr_ip(engine, vnf_index)
            description = "Exec command='{}' at VNFR={} IP={}".format(
                _commands.get(vnf_index)[0], vnf_index, ip_address
            )
            engine.step += 1
            test_description = "{}{} {}".format(
                engine.test_name, engine.step, description
            )
            logger.warning(test_description)
            while _timeout >= time:
                result, message = self.do_checks(
                    [ip_address],
                    vnf_index=vnfr_data["member-vnf-index-ref"],
                    commands=_commands.get(vnf_index),
                    user=_users.get(vnf_index),
                    passwd=_passwds.get(vnf_index),
                    key=_keys.get(vnf_index),
                )
                if result == 1:
                    engine.passed_tests += 1
                    logger.debug(message)
                    break
                elif result == 0:
                    time += 20
                    sleep(20)
                elif result == -1:
                    engine.failed_tests += 1
                    logger.error(message)
                    break
                else:
                    time -= 20
                    engine.failed_tests += 1
                    logger.error(message)
            else:
                engine.failed_tests += 1
                logger.error(
                    "VNFR {} has not mgmt address. Check failed".format(vnf_index)
                )

    def do_checks(self, ip, vnf_index, commands=[], user=None, passwd=None, key=None):
        try:
            import urllib3
            from pssh.clients import ParallelSSHClient
            from pssh.utils import load_private_key
            from ssh2 import exceptions as ssh2Exception
        except ImportError as e:
            logger.critical(
                "Package <pssh> or/and <urllib3> is not installed. Please add them with 'pip3 install "
                "parallel-ssh urllib3': {}".format(e)
            )
            return -1, "install needed packages 'pip3 install parallel-ssh urllib3'"
        urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
        try:
            p_host = os.environ.get("PROXY_HOST")
            p_user = os.environ.get("PROXY_USER")
            p_password = os.environ.get("PROXY_PASSWD")

            if key:
                pkey = load_private_key(key)
            else:
                pkey = None

            client = ParallelSSHClient(
                ip,
                user=user,
                password=passwd,
                pkey=pkey,
                proxy_host=p_host,
                proxy_user=p_user,
                proxy_password=p_password,
                timeout=10,
                num_retries=0,
            )
            for cmd in commands:
                output = client.run_command(cmd)
                client.join(output)
                if output[ip[0]].exit_code:
                    return -1, "VNFR {} command '{}' returns error: '{}'".format(
                        ip[0], cmd, "\n".join(output[ip[0]].stderr)
                    )
                else:
                    return 1, "VNFR {} command '{}' successful".format(ip[0], cmd)
        except (
            ssh2Exception.ChannelFailure,
            ssh2Exception.SocketDisconnectError,
            ssh2Exception.SocketTimeout,
            ssh2Exception.SocketRecvError,
        ) as e:
            return 0, "Timeout accessing the VNFR {}: {}".format(ip[0], str(e))
        except Exception as e:
            return -1, "ERROR checking the VNFR {}: {}".format(ip[0], str(e))

    def additional_operations(self, engine, test_osm, manual_check):
        pass

    def run(self, engine, test_osm, manual_check, test_params=None):
        engine.set_test_name(self.test_name)
        engine.get_autorization()
        nsname = os.environ.get("OSMNBITEST_NS_NAME", "OSMNBITEST")
        if test_params:
            if "vnfd-files" in test_params:
                self.vnfd_filenames = test_params["vnfd-files"].split(",")
            if "nsd-file" in test_params:
                self.nsd_filename = test_params["nsd-file"]
            if test_params.get("ns-name"):
                nsname = test_params["ns-name"]
        self.create_descriptors(engine)

        # create real VIM if not exist
        self.vim_id = engine.get_create_vim(test_osm)
        ns_data = {
            "nsDescription": "default description",
            "nsName": nsname,
            "nsdId": self.nsd_id,
            "vimAccountId": self.vim_id,
        }
        if self.ns_params:
            ns_data.update(self.ns_params)
        if test_params and test_params.get("ns-config"):
            if isinstance(test_params["ns-config"], str):
                ns_data.update(yaml.safe_load(test_params["ns-config"]))
            else:
                ns_data.update(test_params["ns-config"])
        self.instantiate(engine, ns_data)

        if manual_check:
            input(
                "NS has been deployed. Perform manual check and press enter to resume"
            )
        if test_osm and self.commands:
            self.test_ns(engine, test_osm)
        self.additional_operations(engine, test_osm, manual_check)
        self.terminate(engine)
        self.delete_descriptors(engine)

    def get_first_ip(self, ip_string):
        # When using a floating IP, the vnfr_data['ip-address'] contains a semicolon-separated list of IP:s.
        first_ip = ip_string.split(";")[0] if ip_string else ""
        return first_ip

    def get_vnfr_ip(self, engine, vnfr_index_wanted):
        # If the IP address list has been obtained before, it has been stored in 'vnfr_ip_list'
        ip = self.vnfr_ip_list.get(vnfr_index_wanted, "")
        if ip:
            return self.get_first_ip(ip)
        r = engine.test(
            "Get VNFR to get IP_ADDRESS",
            "GET",
            "/nslcm/v1/vnfrs?member-vnf-index-ref={}&nsr-id-ref={}".format(
                vnfr_index_wanted, self.ns_id
            ),
            headers_json,
            None,
            200,
            r_header_json,
            "json",
        )
        if not r:
            return ""
        vnfr_data = r.json()
        if not (vnfr_data and vnfr_data[0]):
            return ""
        # Store the IP (or list of IPs) in 'vnfr_ip_list'
        ip_list = vnfr_data[0].get("ip-address", "")
        if ip_list:
            self.vnfr_ip_list[vnfr_index_wanted] = ip_list
            ip = self.get_first_ip(ip_list)
        return ip


class TestDeployHackfestCirros(TestDeploy):
    description = "Load and deploy Hackfest cirros_2vnf_ns example"

    def __init__(self):
        super().__init__()
        self.test_name = "CIRROS"
        self.vnfd_filenames = ("cirros_vnf.tar.gz",)
        self.nsd_filename = "cirros_2vnf_ns.tar.gz"
        self.commands = {
            "1": [
                "ls -lrt",
            ],
            "2": [
                "ls -lrt",
            ],
        }
        self.users = {"1": "cirros", "2": "cirros"}
        self.passwords = {"1": "cubswin:)", "2": "cubswin:)"}

    def terminate(self, engine):
        # Make a delete in one step, overriding the normal two step of TestDeploy that launched terminate and delete
        if test_osm:
            engine.test(
                "Terminate and delete NS in one step",
                "DELETE",
                "/nslcm/v1/ns_instances_content/{}".format(self.ns_id),
                headers_yaml,
                None,
                202,
                None,
                "yaml",
            )

            engine.wait_until_delete(
                "/nslcm/v1/ns_instances/{}".format(self.ns_id), timeout_deploy
            )
        else:
            engine.test(
                "Delete NS with FORCE",
                "DELETE",
                "/nslcm/v1/ns_instances/{}?FORCE=True".format(self.ns_id),
                headers_yaml,
                None,
                204,
                None,
                0,
            )

        # check all it is deleted
        engine.test(
            "Check NS is deleted",
            "GET",
            "/nslcm/v1/ns_instances/{}".format(self.ns_id),
            headers_yaml,
            None,
            404,
            None,
            "yaml",
        )
        r = engine.test(
            "Check NSLCMOPs are deleted",
            "GET",
            "/nslcm/v1/ns_lcm_op_occs?nsInstanceId={}".format(self.ns_id),
            headers_json,
            None,
            200,
            None,
            "json",
        )
        if not r:
            return
        nslcmops = r.json()
        if not isinstance(nslcmops, list) or nslcmops:
            raise TestException(
                "NS {} deleted but with ns_lcm_op_occ active: {}".format(
                    self.ns_id, nslcmops
                )
            )


class TestDeployHackfest1(TestDeploy):
    description = "Load and deploy Hackfest_1_vnfd example"

    def __init__(self):
        super().__init__()
        self.test_name = "HACKFEST1-"
        self.vnfd_filenames = ("hackfest_1_vnfd.tar.gz",)
        self.nsd_filename = "hackfest_1_nsd.tar.gz"
        # self.commands = {'1': ['ls -lrt', ], '2': ['ls -lrt', ]}
        # self.users = {'1': "cirros", '2': "cirros"}
        # self.passwords = {'1': "cubswin:)", '2': "cubswin:)"}


class TestDeployHackfestCirrosScaling(TestDeploy):
    description = (
        "Load and deploy Hackfest cirros_2vnf_ns example with scaling modifications"
    )

    def __init__(self):
        super().__init__()
        self.test_name = "CIRROS-SCALE"
        self.vnfd_filenames = ("cirros_vnf.tar.gz",)
        self.nsd_filename = "cirros_2vnf_ns.tar.gz"
        # Modify VNFD to add scaling and count=2
        self.descriptor_edit = {
            "vnfd0": {
                "vdu": {"$id: 'cirros_vnfd-VM'": {"count": 2}},
                "scaling-group-descriptor": [
                    {
                        "name": "scale_cirros",
                        "max-instance-count": 2,
                        "vdu": [{"vdu-id-ref": "cirros_vnfd-VM", "count": 2}],
                    }
                ],
            }
        }

    def additional_operations(self, engine, test_osm, manual_check):
        if not test_osm:
            return
        # 2 perform scale out twice
        payload = (
            "{scaleType: SCALE_VNF, scaleVnfData: {scaleVnfType: SCALE_OUT, scaleByStepData: "
            '{scaling-group-descriptor: scale_cirros, member-vnf-index: "1"}}}'
        )
        for i in range(0, 2):
            engine.test(
                "Execute scale action over NS",
                "POST",
                "/nslcm/v1/ns_instances/{}/scale".format(self.ns_id),
                headers_yaml,
                payload,
                (201, 202),
                r_headers_yaml_location_nslcmop,
                "yaml",
            )
            nslcmop2_scale_out = engine.last_id
            engine.wait_operation_ready("ns", nslcmop2_scale_out, timeout_deploy)
            if manual_check:
                input("NS scale out done. Check that two more vdus are there")
            # TODO check automatic

        # 2 perform scale in
        payload = (
            "{scaleType: SCALE_VNF, scaleVnfData: {scaleVnfType: SCALE_IN, scaleByStepData: "
            '{scaling-group-descriptor: scale_cirros, member-vnf-index: "1"}}}'
        )
        for i in range(0, 2):
            engine.test(
                "Execute scale IN action over NS",
                "POST",
                "/nslcm/v1/ns_instances/{}/scale".format(self.ns_id),
                headers_yaml,
                payload,
                (201, 202),
                r_headers_yaml_location_nslcmop,
                "yaml",
            )
            nslcmop2_scale_in = engine.last_id
            engine.wait_operation_ready("ns", nslcmop2_scale_in, timeout_deploy)
            if manual_check:
                input("NS scale in done. Check that two less vdus are there")
            # TODO check automatic

        # perform scale in that must fail as reached limit
        engine.test(
            "Execute scale IN out of limit action over NS",
            "POST",
            "/nslcm/v1/ns_instances/{}/scale".format(self.ns_id),
            headers_yaml,
            payload,
            (201, 202),
            r_headers_yaml_location_nslcmop,
            "yaml",
        )
        nslcmop2_scale_in = engine.last_id
        engine.wait_operation_ready(
            "ns", nslcmop2_scale_in, timeout_deploy, expected_fail=True
        )


class TestDeployIpMac(TestDeploy):
    description = "Load and deploy descriptor examples setting mac, ip address at descriptor and instantiate params"

    def __init__(self):
        super().__init__()
        self.test_name = "SetIpMac"
        self.vnfd_filenames = (
            "vnfd_2vdu_set_ip_mac2.yaml",
            "vnfd_2vdu_set_ip_mac.yaml",
        )
        self.nsd_filename = "scenario_2vdu_set_ip_mac.yaml"
        self.descriptor_url = "https://osm.etsi.org/gitweb/?p=osm/RO.git;a=blob_plain;f=test/RO_tests/v3_2vdu_set_ip_mac/"
        self.commands = {
            "1": [
                "ls -lrt",
            ],
            "2": [
                "ls -lrt",
            ],
        }
        self.users = {"1": "osm", "2": "osm"}
        self.passwords = {"1": "osm4u", "2": "osm4u"}
        self.timeout = 360

    def run(self, engine, test_osm, manual_check, test_params=None):
        # super().run(engine, test_osm, manual_check, test_params)
        # run again setting IPs with instantiate parameters
        instantiation_params = {
            "vnf": [
                {
                    "member-vnf-index": "1",
                    "internal-vld": [
                        {
                            "name": "internal_vld1",  # net_internal
                            "ip-profile": {
                                "ip-version": "ipv4",
                                "subnet-address": "10.9.8.0/24",
                                "dhcp-params": {
                                    "count": 100,
                                    "start-address": "10.9.8.100",
                                },
                            },
                            "internal-connection-point": [
                                {
                                    "id-ref": "eth2",
                                    "ip-address": "10.9.8.2",
                                },
                                {
                                    "id-ref": "eth3",
                                    "ip-address": "10.9.8.3",
                                },
                            ],
                        },
                    ],
                    "vdu": [
                        {
                            "id": "VM1",
                            "interface": [
                                # {
                                #     "name": "iface11",
                                #     "floating-ip-required": True,
                                # },
                                {"name": "iface13", "mac-address": "52:33:44:55:66:13"},
                            ],
                        },
                        {
                            "id": "VM2",
                            "interface": [
                                {
                                    "name": "iface21",
                                    "ip-address": "10.31.31.22",
                                    "mac-address": "52:33:44:55:66:21",
                                },
                            ],
                        },
                    ],
                },
            ]
        }

        super().run(
            engine,
            test_osm,
            manual_check,
            test_params={"ns-config": instantiation_params},
        )


class TestDeployHackfest4(TestDeploy):
    description = "Load and deploy Hackfest 4 example."

    def __init__(self):
        super().__init__()
        self.test_name = "HACKFEST4-"
        self.vnfd_filenames = ("hackfest_4_vnfd.tar.gz",)
        self.nsd_filename = "hackfest_4_nsd.tar.gz"
        self.uses_configuration = True
        self.commands = {
            "1": [
                "ls -lrt",
            ],
            "2": [
                "ls -lrt",
            ],
        }
        self.users = {"1": "ubuntu", "2": "ubuntu"}
        self.passwords = {"1": "osm4u", "2": "osm4u"}
        # Modify VNFD to add scaling
        # self.descriptor_edit = {
        #     "vnfd0": {
        #         'vnf-configuration': {
        #             'config-primitive': [{
        #                 'name': 'touch',
        #                 'parameter': [{
        #                     'name': 'filename',
        #                     'data-type': 'STRING',
        #                     'default-value': '/home/ubuntu/touched'
        #                 }]
        #             }]
        #         },
        #         'scaling-group-descriptor': [{
        #             'name': 'scale_dataVM',
        #             'scaling-policy': [{
        #                 'threshold-time': 0,
        #                 'name': 'auto_cpu_util_above_threshold',
        #                 'scaling-type': 'automatic',
        #                 'scaling-criteria': [{
        #                     'name': 'cpu_util_above_threshold',
        #                     'vnf-monitoring-param-ref': 'all_aaa_cpu_util',
        #                     'scale-out-relational-operation': 'GE',
        #                     'scale-in-threshold': 15,
        #                     'scale-out-threshold': 60,
        #                     'scale-in-relational-operation': 'LE'
        #                 }],
        #                 'cooldown-time': 60
        #             }],
        #             'max-instance-count': 10,
        #             'scaling-config-action': [
        #                 {'vnf-config-primitive-name-ref': 'touch',
        #                  'trigger': 'post-scale-out'},
        #                 {'vnf-config-primitive-name-ref': 'touch',
        #                  'trigger': 'pre-scale-in'}
        #             ],
        #             'vdu': [{
        #                 'vdu-id-ref': 'dataVM',
        #                 'count': 1
        #             }]
        #         }]
        #     }
        # }


class TestDeployHackfest3Charmed(TestDeploy):
    description = "Load and deploy Hackfest 3charmed_ns example"

    def __init__(self):
        super().__init__()
        self.test_name = "HACKFEST3-"
        self.vnfd_filenames = ("hackfest_3charmed_vnfd.tar.gz",)
        self.nsd_filename = "hackfest_3charmed_nsd.tar.gz"
        self.uses_configuration = True
        self.commands = {
            "1": ["ls -lrt /home/ubuntu/first-touch"],
            "2": ["ls -lrt /home/ubuntu/first-touch"],
        }
        self.users = {"1": "ubuntu", "2": "ubuntu"}
        self.passwords = {"1": "osm4u", "2": "osm4u"}
        self.descriptor_edit = {
            "vnfd0": yaml.safe_load(
                """
                vnf-configuration:
                    terminate-config-primitive:
                    -   seq: '1'
                        name: touch
                        parameter:
                        -   name: filename
                            value: '/home/ubuntu/last-touch1'
                    -   seq: '3'
                        name: touch
                        parameter:
                        -   name: filename
                            value: '/home/ubuntu/last-touch3'
                    -   seq: '2'
                        name: touch
                        parameter:
                        -   name: filename
                            value: '/home/ubuntu/last-touch2'
                """
            )
        }

    def additional_operations(self, engine, test_osm, manual_check):
        if not test_osm:
            return
        # 1 perform action
        vnfr_index_selected = "2"
        payload = '{member_vnf_index: "2", primitive: touch, primitive_params: { filename: /home/ubuntu/OSMTESTNBI }}'
        engine.test(
            "Exec service primitive over NS",
            "POST",
            "/nslcm/v1/ns_instances/{}/action".format(self.ns_id),
            headers_yaml,
            payload,
            (201, 202),
            r_headers_yaml_location_nslcmop,
            "yaml",
        )
        nslcmop2_action = engine.last_id
        # Wait until status is Ok
        engine.wait_operation_ready("ns", nslcmop2_action, timeout_deploy)
        vnfr_ip = self.get_vnfr_ip(engine, vnfr_index_selected)
        if manual_check:
            input(
                "NS service primitive has been executed."
                "Check that file /home/ubuntu/OSMTESTNBI is present at {}".format(
                    vnfr_ip
                )
            )
        if test_osm:
            commands = {
                "1": [""],
                "2": [
                    "ls -lrt /home/ubuntu/OSMTESTNBI",
                ],
            }
            self.test_ns(engine, test_osm, commands=commands)

        # # 2 perform scale out
        # payload = '{scaleType: SCALE_VNF, scaleVnfData: {scaleVnfType: SCALE_OUT, scaleByStepData: ' \
        #           '{scaling-group-descriptor: scale_dataVM, member-vnf-index: "1"}}}'
        # engine.test("Execute scale action over NS", "POST",
        #             "/nslcm/v1/ns_instances/{}/scale".format(self.ns_id), headers_yaml, payload,
        #             (201, 202), r_headers_yaml_location_nslcmop, "yaml")
        # nslcmop2_scale_out = engine.last_id
        # engine.wait_operation_ready("ns", nslcmop2_scale_out, timeout_deploy)
        # if manual_check:
        #     input('NS scale out done. Check that file /home/ubuntu/touched is present and new VM is created')
        # # TODO check automatic
        #
        # # 2 perform scale in
        # payload = '{scaleType: SCALE_VNF, scaleVnfData: {scaleVnfType: SCALE_IN, scaleByStepData: ' \
        #           '{scaling-group-descriptor: scale_dataVM, member-vnf-index: "1"}}}'
        # engine.test("Execute scale action over NS", "POST",
        #             "/nslcm/v1/ns_instances/{}/scale".format(self.ns_id), headers_yaml, payload,
        #             (201, 202), r_headers_yaml_location_nslcmop, "yaml")
        # nslcmop2_scale_in = engine.last_id
        # engine.wait_operation_ready("ns", nslcmop2_scale_in, timeout_deploy)
        # if manual_check:
        #     input('NS scale in done. Check that file /home/ubuntu/touched is updated and new VM is deleted')
        # # TODO check automatic


class TestDeployHackfest3Charmed2(TestDeployHackfest3Charmed):
    description = (
        "Load and deploy Hackfest 3charmed_ns example modified version of descriptors to have dots in "
        "ids and member-vnf-index."
    )

    def __init__(self):
        super().__init__()
        self.test_name = "HACKFEST3v2-"
        self.qforce = "?FORCE=True"
        self.descriptor_edit = {
            "vnfd0": {
                "vdu": {
                    "$[0]": {
                        "interface": {
                            "$[0]": {"external-connection-point-ref": "pdu-mgmt"}
                        }
                    },
                    "$[1]": None,
                },
                "vnf-configuration": None,
                "connection-point": {
                    "$[0]": {
                        "id": "pdu-mgmt",
                        "name": "pdu-mgmt",
                        "short-name": "pdu-mgmt",
                    },
                    "$[1]": None,
                },
                "mgmt-interface": {"cp": "pdu-mgmt"},
                "description": "A vnf single vdu to be used as PDU",
                "id": "vdu-as-pdu",
                "internal-vld": {
                    "$[0]": {
                        "id": "pdu_internal",
                        "name": "pdu_internal",
                        "internal-connection-point": {"$[1]": None},
                        "short-name": "pdu_internal",
                        "type": "ELAN",
                    }
                },
            },
            # Modify NSD accordingly
            "nsd": {
                "constituent-vnfd": {
                    "$[0]": {"vnfd-id-ref": "vdu-as-pdu"},
                    "$[1]": None,
                },
                "description": "A nsd to deploy the vnf to act as as PDU",
                "id": "nsd-as-pdu",
                "name": "nsd-as-pdu",
                "short-name": "nsd-as-pdu",
                "vld": {
                    "$[0]": {
                        "id": "mgmt_pdu",
                        "name": "mgmt_pdu",
                        "short-name": "mgmt_pdu",
                        "vnfd-connection-point-ref": {
                            "$[0]": {
                                "vnfd-connection-point-ref": "pdu-mgmt",
                                "vnfd-id-ref": "vdu-as-pdu",
                            },
                            "$[1]": None,
                        },
                        "type": "ELAN",
                    },
                    "$[1]": None,
                },
            },
        }


class TestDeployHackfest3Charmed3(TestDeployHackfest3Charmed):
    description = "Load and deploy Hackfest 3charmed_ns example modified version to test scaling and NS parameters"

    def __init__(self):
        super().__init__()
        self.test_name = "HACKFEST3v3-"
        self.commands = {
            "1": ["ls -lrt /home/ubuntu/first-touch-1"],
            "2": ["ls -lrt /home/ubuntu/first-touch-2"],
        }
        self.descriptor_edit = {
            "vnfd0": yaml.safe_load(
                """
                scaling-group-descriptor:
                    -   name: "scale_dataVM"
                        max-instance-count: 10
                        scaling-policy:
                        -   name: "auto_cpu_util_above_threshold"
                            scaling-type: "automatic"
                            threshold-time: 0
                            cooldown-time: 60
                            scaling-criteria:
                            -   name: "cpu_util_above_threshold"
                                scale-in-threshold: 15
                                scale-in-relational-operation: "LE"
                                scale-out-threshold: 60
                                scale-out-relational-operation: "GE"
                                vnf-monitoring-param-ref: "monitor1"
                        vdu:
                        -   vdu-id-ref: dataVM
                            count: 1
                        scaling-config-action:
                        -   trigger: post-scale-out
                            vnf-config-primitive-name-ref: touch
                        -   trigger: pre-scale-in
                            vnf-config-primitive-name-ref: touch
                vdu:
                    "$id: dataVM":
                        monitoring-param:
                        -   id: "dataVM_cpu_util"
                            nfvi-metric: "cpu_utilization"

                monitoring-param:
                -   id: "monitor1"
                    name: "monitor1"
                    aggregation-type: AVERAGE
                    vdu-monitoring-param:
                      vdu-ref: "dataVM"
                      vdu-monitoring-param-ref: "dataVM_cpu_util"
                vnf-configuration:
                    initial-config-primitive:
                        "$[1]":
                            parameter:
                                "$[0]":
                                    value: "<touch_filename>"   # default-value: /home/ubuntu/first-touch
                    config-primitive:
                        "$[0]":
                            parameter:
                                "$[0]":
                                    default-value: "<touch_filename2>"
                """,
            )
        }
        self.ns_params = {
            "additionalParamsForVnf": [
                {
                    "member-vnf-index": "1",
                    "additionalParams": {
                        "touch_filename": "/home/ubuntu/first-touch-1",
                        "touch_filename2": "/home/ubuntu/second-touch-1",
                    },
                },
                {
                    "member-vnf-index": "2",
                    "additionalParams": {
                        "touch_filename": "/home/ubuntu/first-touch-2",
                        "touch_filename2": "/home/ubuntu/second-touch-2",
                    },
                },
            ]
        }

    def additional_operations(self, engine, test_osm, manual_check):
        super().additional_operations(engine, test_osm, manual_check)
        if not test_osm:
            return

        # 2 perform scale out
        payload = (
            "{scaleType: SCALE_VNF, scaleVnfData: {scaleVnfType: SCALE_OUT, scaleByStepData: "
            '{scaling-group-descriptor: scale_dataVM, member-vnf-index: "1"}}}'
        )
        engine.test(
            "Execute scale action over NS",
            "POST",
            "/nslcm/v1/ns_instances/{}/scale".format(self.ns_id),
            headers_yaml,
            payload,
            (201, 202),
            r_headers_yaml_location_nslcmop,
            "yaml",
        )
        nslcmop2_scale_out = engine.last_id
        engine.wait_operation_ready("ns", nslcmop2_scale_out, timeout_deploy)
        if manual_check:
            input(
                "NS scale out done. Check that file /home/ubuntu/second-touch-1 is present and new VM is created"
            )
        if test_osm:
            commands = {
                "1": [
                    "ls -lrt /home/ubuntu/second-touch-1",
                ]
            }
            self.test_ns(engine, test_osm, commands=commands)
            # TODO check automatic connection to scaled VM

        # 2 perform scale in
        payload = (
            "{scaleType: SCALE_VNF, scaleVnfData: {scaleVnfType: SCALE_IN, scaleByStepData: "
            '{scaling-group-descriptor: scale_dataVM, member-vnf-index: "1"}}}'
        )
        engine.test(
            "Execute scale action over NS",
            "POST",
            "/nslcm/v1/ns_instances/{}/scale".format(self.ns_id),
            headers_yaml,
            payload,
            (201, 202),
            r_headers_yaml_location_nslcmop,
            "yaml",
        )
        nslcmop2_scale_in = engine.last_id
        engine.wait_operation_ready("ns", nslcmop2_scale_in, timeout_deploy)
        if manual_check:
            input(
                "NS scale in done. Check that file /home/ubuntu/second-touch-1 is updated and new VM is deleted"
            )
        # TODO check automatic


class TestDeploySimpleCharm(TestDeploy):
    description = "Deploy hackfest-4 hackfest_simplecharm example"

    def __init__(self):
        super().__init__()
        self.test_name = "HACKFEST-SIMPLE"
        self.descriptor_url = (
            "https://osm-download.etsi.org/ftp/osm-4.0-four/4th-hackfest/packages/"
        )
        self.vnfd_filenames = ("hackfest_simplecharm_vnf.tar.gz",)
        self.nsd_filename = "hackfest_simplecharm_ns.tar.gz"
        self.uses_configuration = True
        self.commands = {
            "1": [""],
            "2": [
                "ls -lrt /home/ubuntu/first-touch",
            ],
        }
        self.users = {"1": "ubuntu", "2": "ubuntu"}
        self.passwords = {"1": "osm4u", "2": "osm4u"}


class TestDeploySimpleCharm2(TestDeploySimpleCharm):
    description = (
        "Deploy hackfest-4 hackfest_simplecharm example changing naming to contain dots on ids and "
        "vnf-member-index"
    )

    def __init__(self):
        super().__init__()
        self.test_name = "HACKFEST-SIMPLE2-"
        self.qforce = "?FORCE=True"
        self.descriptor_edit = {
            "vnfd0": {"id": "hackfest.simplecharm.vnf"},
            "nsd": {
                "id": "hackfest.simplecharm.ns",
                "constituent-vnfd": {
                    "$[0]": {
                        "vnfd-id-ref": "hackfest.simplecharm.vnf",
                        "member-vnf-index": "$1",
                    },
                    "$[1]": {
                        "vnfd-id-ref": "hackfest.simplecharm.vnf",
                        "member-vnf-index": "$2",
                    },
                },
                "vld": {
                    "$[0]": {
                        "vnfd-connection-point-ref": {
                            "$[0]": {
                                "member-vnf-index-ref": "$1",
                                "vnfd-id-ref": "hackfest.simplecharm.vnf",
                            },
                            "$[1]": {
                                "member-vnf-index-ref": "$2",
                                "vnfd-id-ref": "hackfest.simplecharm.vnf",
                            },
                        },
                    },
                    "$[1]": {
                        "vnfd-connection-point-ref": {
                            "$[0]": {
                                "member-vnf-index-ref": "$1",
                                "vnfd-id-ref": "hackfest.simplecharm.vnf",
                            },
                            "$[1]": {
                                "member-vnf-index-ref": "$2",
                                "vnfd-id-ref": "hackfest.simplecharm.vnf",
                            },
                        },
                    },
                },
            },
        }


class TestDeploySingleVdu(TestDeployHackfest3Charmed):
    description = (
        "Generate a single VDU base on editing Hackfest3Charmed descriptors and deploy"
    )

    def __init__(self):
        super().__init__()
        self.test_name = "SingleVDU"
        self.qforce = "?FORCE=True"
        self.descriptor_edit = {
            # Modify VNFD to remove one VDU
            "vnfd0": {
                "vdu": {
                    "$[0]": {
                        "interface": {
                            "$[0]": {"external-connection-point-ref": "pdu-mgmt"}
                        }
                    },
                    "$[1]": None,
                },
                "vnf-configuration": None,
                "connection-point": {
                    "$[0]": {
                        "id": "pdu-mgmt",
                        "name": "pdu-mgmt",
                        "short-name": "pdu-mgmt",
                    },
                    "$[1]": None,
                },
                "mgmt-interface": {"cp": "pdu-mgmt"},
                "description": "A vnf single vdu to be used as PDU",
                "id": "vdu-as-pdu",
                "internal-vld": {
                    "$[0]": {
                        "id": "pdu_internal",
                        "name": "pdu_internal",
                        "internal-connection-point": {"$[1]": None},
                        "short-name": "pdu_internal",
                        "type": "ELAN",
                    }
                },
            },
            # Modify NSD accordingly
            "nsd": {
                "constituent-vnfd": {
                    "$[0]": {"vnfd-id-ref": "vdu-as-pdu"},
                    "$[1]": None,
                },
                "description": "A nsd to deploy the vnf to act as as PDU",
                "id": "nsd-as-pdu",
                "name": "nsd-as-pdu",
                "short-name": "nsd-as-pdu",
                "vld": {
                    "$[0]": {
                        "id": "mgmt_pdu",
                        "name": "mgmt_pdu",
                        "short-name": "mgmt_pdu",
                        "vnfd-connection-point-ref": {
                            "$[0]": {
                                "vnfd-connection-point-ref": "pdu-mgmt",
                                "vnfd-id-ref": "vdu-as-pdu",
                            },
                            "$[1]": None,
                        },
                        "type": "ELAN",
                    },
                    "$[1]": None,
                },
            },
        }


class TestDeployHnfd(TestDeployHackfest3Charmed):
    description = (
        "Generate a HNFD base on editing Hackfest3Charmed descriptors and deploy"
    )

    def __init__(self):
        super().__init__()
        self.test_name = "HNFD"
        self.pduDeploy = TestDeploySingleVdu()
        self.pdu_interface_0 = {}
        self.pdu_interface_1 = {}

        self.pdu_id = None
        # self.vnf_to_pdu = """
        #     vdu:
        #         "$[0]":
        #             pdu-type: PDU-TYPE-1
        #             interface:
        #                 "$[0]":
        #                     name: mgmt-iface
        #                 "$[1]":
        #                     name: pdu-iface-internal
        #     id: hfn1
        #     description: HFND, one PDU + One VDU
        #     name: hfn1
        #     short-name: hfn1
        #
        # """

        self.pdu_descriptor = {
            "name": "my-PDU",
            "type": "PDU-TYPE-1",
            "vim_accounts": "to-override",
            "interfaces": [
                {
                    "name": "mgmt-iface",
                    "mgmt": True,
                    "type": "overlay",
                    "ip-address": "to override",
                    "mac-address": "mac_address",
                    "vim-network-name": "mgmt",
                },
                {
                    "name": "pdu-iface-internal",
                    "mgmt": False,
                    "type": "overlay",
                    "ip-address": "to override",
                    "mac-address": "mac_address",
                    "vim-network-name": "pdu_internal",  # OSMNBITEST-PDU-pdu_internal
                },
            ],
        }
        self.vnfd_filenames = (
            "hackfest_3charmed_vnfd.tar.gz",
            "hackfest_3charmed_vnfd.tar.gz",
        )

        self.descriptor_edit = {
            "vnfd0": {
                "id": "hfnd1",
                "name": "hfn1",
                "short-name": "hfn1",
                "vdu": {
                    "$[0]": {
                        "pdu-type": "PDU-TYPE-1",
                        "interface": {
                            "$[0]": {"name": "mgmt-iface"},
                            "$[1]": {"name": "pdu-iface-internal"},
                        },
                    }
                },
            },
            "nsd": {
                "constituent-vnfd": {"$[1]": {"vnfd-id-ref": "hfnd1"}},
                "vld": {
                    "$[0]": {
                        "vnfd-connection-point-ref": {"$[1]": {"vnfd-id-ref": "hfnd1"}}
                    },
                    "$[1]": {
                        "vnfd-connection-point-ref": {"$[1]": {"vnfd-id-ref": "hfnd1"}}
                    },
                },
            },
        }

    def create_descriptors(self, engine):
        super().create_descriptors(engine)

        # Create PDU
        self.pdu_descriptor["interfaces"][0].update(self.pdu_interface_0)
        self.pdu_descriptor["interfaces"][1].update(self.pdu_interface_1)
        self.pdu_descriptor["vim_accounts"] = [self.vim_id]
        # TODO get vim-network-name from vnfr.vld.name
        self.pdu_descriptor["interfaces"][1]["vim-network-name"] = "{}-{}-{}".format(
            os.environ.get("OSMNBITEST_NS_NAME", "OSMNBITEST"),
            "PDU",
            self.pdu_descriptor["interfaces"][1]["vim-network-name"],
        )
        engine.test(
            "Onboard PDU descriptor",
            "POST",
            "/pdu/v1/pdu_descriptors",
            {
                "Location": "/pdu/v1/pdu_descriptors/",
                "Content-Type": "application/yaml",
            },
            self.pdu_descriptor,
            201,
            r_header_yaml,
            "yaml",
        )
        self.pdu_id = engine.last_id

    def run(self, engine, test_osm, manual_check, test_params=None):
        engine.get_autorization()
        engine.set_test_name(self.test_name)
        nsname = os.environ.get("OSMNBITEST_NS_NAME", "OSMNBITEST")

        # create real VIM if not exist
        self.vim_id = engine.get_create_vim(test_osm)
        # instantiate PDU
        self.pduDeploy.create_descriptors(engine)
        self.pduDeploy.instantiate(
            engine,
            {
                "nsDescription": "to be used as PDU",
                "nsName": nsname + "-PDU",
                "nsdId": self.pduDeploy.nsd_id,
                "vimAccountId": self.vim_id,
            },
        )
        if manual_check:
            input(
                "VNF to be used as PDU has been deployed. Perform manual check and press enter to resume"
            )
        if test_osm:
            self.pduDeploy.test_ns(engine, test_osm)

        if test_osm:
            r = engine.test(
                "Get VNFR to obtain IP_ADDRESS",
                "GET",
                "/nslcm/v1/vnfrs?nsr-id-ref={}".format(self.pduDeploy.ns_id),
                headers_json,
                None,
                200,
                r_header_json,
                "json",
            )
            if not r:
                return
            vnfr_data = r.json()
            # print(vnfr_data)

            self.pdu_interface_0["ip-address"] = vnfr_data[0]["vdur"][0]["interfaces"][
                0
            ].get("ip-address")
            self.pdu_interface_1["ip-address"] = vnfr_data[0]["vdur"][0]["interfaces"][
                1
            ].get("ip-address")
            self.pdu_interface_0["mac-address"] = vnfr_data[0]["vdur"][0]["interfaces"][
                0
            ].get("mac-address")
            self.pdu_interface_1["mac-address"] = vnfr_data[0]["vdur"][0]["interfaces"][
                1
            ].get("mac-address")
            if not self.pdu_interface_0["ip-address"]:
                raise TestException("Vnfr has not managment ip address")
        else:
            self.pdu_interface_0["ip-address"] = "192.168.10.10"
            self.pdu_interface_1["ip-address"] = "192.168.11.10"
            self.pdu_interface_0["mac-address"] = "52:33:44:55:66:13"
            self.pdu_interface_1["mac-address"] = "52:33:44:55:66:14"

        self.create_descriptors(engine)

        ns_data = {
            "nsDescription": "default description",
            "nsName": nsname,
            "nsdId": self.nsd_id,
            "vimAccountId": self.vim_id,
        }
        if test_params and test_params.get("ns-config"):
            if isinstance(test_params["ns-config"], str):
                ns_data.update(yaml.safe_load(test_params["ns-config"]))
            else:
                ns_data.update(test_params["ns-config"])

        self.instantiate(engine, ns_data)
        if manual_check:
            input(
                "NS has been deployed. Perform manual check and press enter to resume"
            )
        if test_osm:
            self.test_ns(engine, test_osm)
        self.additional_operations(engine, test_osm, manual_check)
        self.terminate(engine)
        self.pduDeploy.terminate(engine)
        self.delete_descriptors(engine)
        self.pduDeploy.delete_descriptors(engine)

    def delete_descriptors(self, engine):
        super().delete_descriptors(engine)
        # delete pdu
        engine.test(
            "Delete PDU SOL005",
            "DELETE",
            "/pdu/v1/pdu_descriptors/{}".format(self.pdu_id),
            headers_yaml,
            None,
            204,
            None,
            0,
        )


class TestDescriptors:
    description = "Test VNFD, NSD, PDU descriptors CRUD and dependencies"
    vnfd_empty = """vnfd:vnfd-catalog:
        vnfd:
        -   name: prova
            short-name: prova
            id: prova
    """
    vnfd_prova = """vnfd:vnfd-catalog:
        vnfd:
        -   connection-point:
            -   name: cp_0h8m
                type: VPORT
            id: prova
            name: prova
            short-name: prova
            vdu:
            -   id: vdu_z4bm
                image: ubuntu
                interface:
                -   external-connection-point-ref: cp_0h8m
                    name: eth0
                    virtual-interface:
                    type: VIRTIO
                name: vdu_z4bm
            version: '1.0'
    """

    def __init__(self):
        self.vnfd_filename = "hackfest_3charmed_vnfd.tar.gz"
        self.nsd_filename = "hackfest_3charmed_nsd.tar.gz"
        self.descriptor_url = (
            "https://osm-download.etsi.org/ftp/osm-3.0-three/2nd-hackfest/packages/"
        )
        self.vnfd_id = None
        self.nsd_id = None

    def run(self, engine, test_osm, manual_check, test_params=None):
        engine.set_test_name("Descriptors")
        engine.get_autorization()
        temp_dir = os.path.dirname(os.path.abspath(__file__)) + "/temp/"
        if not os.path.exists(temp_dir):
            os.makedirs(temp_dir)

        # download files
        for filename in (self.vnfd_filename, self.nsd_filename):
            filename_path = temp_dir + filename
            if not os.path.exists(filename_path):
                with open(filename_path, "wb") as file:
                    response = requests.get(self.descriptor_url + filename)
                    if response.status_code >= 300:
                        raise TestException(
                            "Error downloading descriptor from '{}': {}".format(
                                self.descriptor_url + filename, response.status_code
                            )
                        )
                    file.write(response.content)

        vnfd_filename_path = temp_dir + self.vnfd_filename
        nsd_filename_path = temp_dir + self.nsd_filename

        engine.test(
            "Onboard empty VNFD in one step",
            "POST",
            "/vnfpkgm/v1/vnf_packages_content",
            headers_yaml,
            self.vnfd_empty,
            201,
            r_headers_yaml_location_vnfd,
            "yaml",
        )
        self.vnfd_id = engine.last_id

        # test bug 605
        engine.test(
            "Upload invalid VNFD ",
            "PUT",
            "/vnfpkgm/v1/vnf_packages/{}/package_content".format(self.vnfd_id),
            headers_yaml,
            self.vnfd_prova,
            422,
            r_header_yaml,
            "yaml",
        )

        engine.test(
            "Upload VNFD {}".format(self.vnfd_filename),
            "PUT",
            "/vnfpkgm/v1/vnf_packages/{}/package_content".format(self.vnfd_id),
            headers_zip_yaml,
            "@b" + vnfd_filename_path,
            204,
            None,
            0,
        )

        queries = [
            "mgmt-interface.cp=mgmt",
            "vdu.0.interface.0.external-connection-point-ref=mgmt",
            "vdu.0.interface.1.internal-connection-point-ref=internal",
            "internal-vld.0.internal-connection-point.0.id-ref=internal",
            # Detection of duplicated VLD names in VNF Descriptors
            # URL: internal-vld=[
            #        {id: internal1, name: internal, type:ELAN,
            #            internal-connection-point: [{id-ref: mgmtVM-internal}, {id-ref: dataVM-internal}]},
            #        {id: internal2, name: internal, type:ELAN,
            #            internal-connection-point: [{id-ref: mgmtVM-internal}, {id-ref: dataVM-internal}]}
            #        ]
            "internal-vld=%5B%7Bid%3A%20internal1%2C%20name%3A%20internal%2C%20type%3A%20ELAN%2C%20"
            "internal-connection-point%3A%20%5B%7Bid-ref%3A%20mgmtVM-internal%7D%2C%20%7Bid-ref%3A%20"
            "dataVM-internal%7D%5D%7D%2C%20%7Bid%3A%20internal2%2C%20name%3A%20internal%2C%20type%3A%20"
            "ELAN%2C%20internal-connection-point%3A%20%5B%7Bid-ref%3A%20mgmtVM-internal%7D%2C%20%7B"
            "id-ref%3A%20dataVM-internal%7D%5D%7D%5D",
        ]
        for query in queries:
            engine.test(
                "Upload invalid VNFD ",
                "PUT",
                "/vnfpkgm/v1/vnf_packages/{}/package_content?{}".format(
                    self.vnfd_id, query
                ),
                headers_zip_yaml,
                "@b" + vnfd_filename_path,
                422,
                r_header_yaml,
                "yaml",
            )

        # test bug 605
        engine.test(
            "Upload invalid VNFD ",
            "PUT",
            "/vnfpkgm/v1/vnf_packages/{}/package_content".format(self.vnfd_id),
            headers_yaml,
            self.vnfd_prova,
            422,
            r_header_yaml,
            "yaml",
        )

        # get vnfd descriptor
        engine.test(
            "Get VNFD descriptor",
            "GET",
            "/vnfpkgm/v1/vnf_packages/{}".format(self.vnfd_id),
            headers_yaml,
            None,
            200,
            r_header_yaml,
            "yaml",
        )

        # get vnfd file descriptor
        engine.test(
            "Get VNFD file descriptor",
            "GET",
            "/vnfpkgm/v1/vnf_packages/{}/vnfd".format(self.vnfd_id),
            headers_text,
            None,
            200,
            r_header_text,
            "text",
            temp_dir + "vnfd-yaml",
        )
        # TODO compare files: diff vnfd-yaml hackfest_3charmed_vnfd/hackfest_3charmed_vnfd.yaml

        # get vnfd zip file package
        engine.test(
            "Get VNFD zip package",
            "GET",
            "/vnfpkgm/v1/vnf_packages/{}/package_content".format(self.vnfd_id),
            headers_zip,
            None,
            200,
            r_header_zip,
            "zip",
            temp_dir + "vnfd-zip",
        )
        # TODO compare files: diff vnfd-zip hackfest_3charmed_vnfd.tar.gz

        # get vnfd artifact
        engine.test(
            "Get VNFD artifact package",
            "GET",
            "/vnfpkgm/v1/vnf_packages/{}/artifacts/icons/osm.png".format(self.vnfd_id),
            headers_zip,
            None,
            200,
            r_header_octect,
            "octet-string",
            temp_dir + "vnfd-icon",
        )
        # TODO compare files: diff vnfd-icon hackfest_3charmed_vnfd/icons/osm.png

        # nsd CREATE AND UPLOAD in one step:
        engine.test(
            "Onboard NSD in one step",
            "POST",
            "/nsd/v1/ns_descriptors_content",
            headers_zip_yaml,
            "@b" + nsd_filename_path,
            201,
            r_headers_yaml_location_nsd,
            "yaml",
        )
        self.nsd_id = engine.last_id

        queries = ["vld.0.vnfd-connection-point-ref.0.vnfd-id-ref=hf"]
        for query in queries:
            engine.test(
                "Upload invalid NSD ",
                "PUT",
                "/nsd/v1/ns_descriptors/{}/nsd_content?{}".format(self.nsd_id, query),
                headers_zip_yaml,
                "@b" + nsd_filename_path,
                422,
                r_header_yaml,
                "yaml",
            )

        # get nsd descriptor
        engine.test(
            "Get NSD descriptor",
            "GET",
            "/nsd/v1/ns_descriptors/{}".format(self.nsd_id),
            headers_yaml,
            None,
            200,
            r_header_yaml,
            "yaml",
        )

        # get nsd file descriptor
        engine.test(
            "Get NSD file descriptor",
            "GET",
            "/nsd/v1/ns_descriptors/{}/nsd".format(self.nsd_id),
            headers_text,
            None,
            200,
            r_header_text,
            "text",
            temp_dir + "nsd-yaml",
        )
        # TODO compare files: diff nsd-yaml hackfest_3charmed_nsd/hackfest_3charmed_nsd.yaml

        # get nsd zip file package
        engine.test(
            "Get NSD zip package",
            "GET",
            "/nsd/v1/ns_descriptors/{}/nsd_content".format(self.nsd_id),
            headers_zip,
            None,
            200,
            r_header_zip,
            "zip",
            temp_dir + "nsd-zip",
        )
        # TODO compare files: diff nsd-zip hackfest_3charmed_nsd.tar.gz

        # get nsd artifact
        engine.test(
            "Get NSD artifact package",
            "GET",
            "/nsd/v1/ns_descriptors/{}/artifacts/icons/osm.png".format(self.nsd_id),
            headers_zip,
            None,
            200,
            r_header_octect,
            "octet-string",
            temp_dir + "nsd-icon",
        )
        # TODO compare files: diff nsd-icon hackfest_3charmed_nsd/icons/osm.png

        # vnfd DELETE
        test_rest.test(
            "Delete VNFD conflict",
            "DELETE",
            "/vnfpkgm/v1/vnf_packages/{}".format(self.vnfd_id),
            headers_yaml,
            None,
            409,
            None,
            None,
        )

        test_rest.test(
            "Delete VNFD force",
            "DELETE",
            "/vnfpkgm/v1/vnf_packages/{}?FORCE=TRUE".format(self.vnfd_id),
            headers_yaml,
            None,
            204,
            None,
            0,
        )

        # nsd DELETE
        test_rest.test(
            "Delete NSD",
            "DELETE",
            "/nsd/v1/ns_descriptors/{}".format(self.nsd_id),
            headers_yaml,
            None,
            204,
            None,
            0,
        )


class TestNetSliceTemplates:
    description = "Upload a NST to OSM"

    def __init__(self):
        self.vnfd_filename = "@./slice_shared/vnfd/slice_shared_vnfd.yaml"
        self.vnfd_filename_middle = "@./slice_shared/vnfd/slice_shared_middle_vnfd.yaml"
        self.nsd_filename = "@./slice_shared/nsd/slice_shared_nsd.yaml"
        self.nsd_filename_middle = "@./slice_shared/nsd/slice_shared_middle_nsd.yaml"
        self.nst_filenames = "@./slice_shared/slice_shared_nstd.yaml"

    def run(self, engine, test_osm, manual_check, test_params=None):
        # nst CREATE
        engine.set_test_name("NST step ")
        engine.get_autorization()
        temp_dir = os.path.dirname(os.path.abspath(__file__)) + "/temp/"
        if not os.path.exists(temp_dir):
            os.makedirs(temp_dir)

        # Onboard VNFDs
        engine.test(
            "Onboard edge VNFD",
            "POST",
            "/vnfpkgm/v1/vnf_packages_content",
            headers_yaml,
            self.vnfd_filename,
            201,
            r_headers_yaml_location_vnfd,
            "yaml",
        )
        self.vnfd_edge_id = engine.last_id

        engine.test(
            "Onboard middle VNFD",
            "POST",
            "/vnfpkgm/v1/vnf_packages_content",
            headers_yaml,
            self.vnfd_filename_middle,
            201,
            r_headers_yaml_location_vnfd,
            "yaml",
        )
        self.vnfd_middle_id = engine.last_id

        # Onboard NSDs
        engine.test(
            "Onboard NSD edge",
            "POST",
            "/nsd/v1/ns_descriptors_content",
            headers_yaml,
            self.nsd_filename,
            201,
            r_headers_yaml_location_nsd,
            "yaml",
        )
        self.nsd_edge_id = engine.last_id

        engine.test(
            "Onboard NSD middle",
            "POST",
            "/nsd/v1/ns_descriptors_content",
            headers_yaml,
            self.nsd_filename_middle,
            201,
            r_headers_yaml_location_nsd,
            "yaml",
        )
        self.nsd_middle_id = engine.last_id

        # Onboard NST
        engine.test(
            "Onboard NST",
            "POST",
            "/nst/v1/netslice_templates_content",
            headers_yaml,
            self.nst_filenames,
            201,
            r_headers_yaml_location_nst,
            "yaml",
        )
        nst_id = engine.last_id

        # nstd SHOW OSM format
        engine.test(
            "Show NSTD OSM format",
            "GET",
            "/nst/v1/netslice_templates/{}".format(nst_id),
            headers_json,
            None,
            200,
            r_header_json,
            "json",
        )

        # nstd DELETE
        engine.test(
            "Delete NSTD",
            "DELETE",
            "/nst/v1/netslice_templates/{}".format(nst_id),
            headers_json,
            None,
            204,
            None,
            0,
        )

        # NSDs DELETE
        test_rest.test(
            "Delete NSD middle",
            "DELETE",
            "/nsd/v1/ns_descriptors/{}".format(self.nsd_middle_id),
            headers_json,
            None,
            204,
            None,
            0,
        )

        test_rest.test(
            "Delete NSD edge",
            "DELETE",
            "/nsd/v1/ns_descriptors/{}".format(self.nsd_edge_id),
            headers_json,
            None,
            204,
            None,
            0,
        )

        # VNFDs DELETE
        test_rest.test(
            "Delete VNFD edge",
            "DELETE",
            "/vnfpkgm/v1/vnf_packages/{}".format(self.vnfd_edge_id),
            headers_yaml,
            None,
            204,
            None,
            0,
        )

        test_rest.test(
            "Delete VNFD middle",
            "DELETE",
            "/vnfpkgm/v1/vnf_packages/{}".format(self.vnfd_middle_id),
            headers_yaml,
            None,
            204,
            None,
            0,
        )


class TestNetSliceInstances:
    """
    Test procedure:
    1. Populate databases with VNFD, NSD, NST with the following scenario
       +-----------------management-----------------+
       |                     |                      |
    +--+---+            +----+----+             +---+--+
    |      |            |         |             |      |
    | edge +---data1----+  middle +---data2-----+ edge |
    |      |            |         |             |      |
    +------+            +---------+             +------+
                        shared-nss
    2. Create NSI-1
    3. Instantiate NSI-1
    4. Create NSI-2
    5. Instantiate NSI-2
        Manual check - Are 2 slices instantiated correctly?
        NSI-1 3 nss (2 nss-edges + 1 nss-middle)
        NSI-2 2 nss (2 nss-edge sharing nss-middle)
    6. Terminate NSI-1
    7. Delete NSI-1
        Manual check - Is slice NSI-1 deleted correctly?
        NSI-2 with 2 nss-edge + 1 nss-middle (The one from NSI-1)
    8. Create NSI-3
    9. Instantiate NSI-3
        Manual check - Is slice NSI-3 instantiated correctly?
        NSI-3 reuse nss-middle. NSI-3 only create 2 nss-edge
    10. Delete NSI-2
    11. Terminate NSI-2
    12. Delete NSI-3
    13. Terminate NSI-3
        Manual check - All cleaned correctly?
        NSI-2 and NSI-3 were terminated and deleted
    14. Cleanup database
    """

    description = "Upload a NST to OSM"

    def __init__(self):
        self.vim_id = None
        self.vnfd_filename = "@./slice_shared/vnfd/slice_shared_vnfd.yaml"
        self.vnfd_filename_middle = "@./slice_shared/vnfd/slice_shared_middle_vnfd.yaml"
        self.nsd_filename = "@./slice_shared/nsd/slice_shared_nsd.yaml"
        self.nsd_filename_middle = "@./slice_shared/nsd/slice_shared_middle_nsd.yaml"
        self.nst_filenames = "@./slice_shared/slice_shared_nstd.yaml"

    def create_slice(self, engine, nsi_data, name):
        ns_data_text = yaml.safe_dump(nsi_data, default_flow_style=True, width=256)
        r = engine.test(
            name,
            "POST",
            "/nsilcm/v1/netslice_instances",
            headers_yaml,
            ns_data_text,
            (201, 202),
            {
                "Location": "nsilcm/v1/netslice_instances/",
                "Content-Type": "application/yaml",
            },
            "yaml",
        )
        return r

    def instantiate_slice(self, engine, nsi_data, nsi_id, name):
        ns_data_text = yaml.safe_dump(nsi_data, default_flow_style=True, width=256)
        engine.test(
            name,
            "POST",
            "/nsilcm/v1/netslice_instances/{}/instantiate".format(nsi_id),
            headers_yaml,
            ns_data_text,
            (201, 202),
            r_headers_yaml_location_nsilcmop,
            "yaml",
        )

    def terminate_slice(self, engine, nsi_id, name):
        engine.test(
            name,
            "POST",
            "/nsilcm/v1/netslice_instances/{}/terminate".format(nsi_id),
            headers_yaml,
            None,
            (201, 202),
            r_headers_yaml_location_nsilcmop,
            "yaml",
        )

    def delete_slice(self, engine, nsi_id, name):
        engine.test(
            name,
            "DELETE",
            "/nsilcm/v1/netslice_instances/{}".format(nsi_id),
            headers_yaml,
            None,
            204,
            None,
            0,
        )

    def run(self, engine, test_osm, manual_check, test_params=None):
        # nst CREATE
        engine.set_test_name("NSI")
        engine.get_autorization()

        # Onboard VNFDs
        engine.test(
            "Onboard edge VNFD",
            "POST",
            "/vnfpkgm/v1/vnf_packages_content",
            headers_yaml,
            self.vnfd_filename,
            201,
            r_headers_yaml_location_vnfd,
            "yaml",
        )
        self.vnfd_edge_id = engine.last_id

        engine.test(
            "Onboard middle VNFD",
            "POST",
            "/vnfpkgm/v1/vnf_packages_content",
            headers_yaml,
            self.vnfd_filename_middle,
            201,
            r_headers_yaml_location_vnfd,
            "yaml",
        )
        self.vnfd_middle_id = engine.last_id

        # Onboard NSDs
        engine.test(
            "Onboard NSD edge",
            "POST",
            "/nsd/v1/ns_descriptors_content",
            headers_yaml,
            self.nsd_filename,
            201,
            r_headers_yaml_location_nsd,
            "yaml",
        )
        self.nsd_edge_id = engine.last_id

        engine.test(
            "Onboard NSD middle",
            "POST",
            "/nsd/v1/ns_descriptors_content",
            headers_yaml,
            self.nsd_filename_middle,
            201,
            r_headers_yaml_location_nsd,
            "yaml",
        )
        self.nsd_middle_id = engine.last_id

        # Onboard NST
        engine.test(
            "Onboard NST",
            "POST",
            "/nst/v1/netslice_templates_content",
            headers_yaml,
            self.nst_filenames,
            201,
            r_headers_yaml_location_nst,
            "yaml",
        )
        nst_id = engine.last_id

        self.vim_id = engine.get_create_vim(test_osm)

        # CREATE NSI-1
        ns_data = {
            "nsiName": "Deploy-NSI-1",
            "vimAccountId": self.vim_id,
            "nstId": nst_id,
            "nsiDescription": "default",
        }
        r = self.create_slice(engine, ns_data, "Create NSI-1 step 1")
        if not r:
            return
        self.nsi_id1 = engine.last_id

        # INSTANTIATE NSI-1
        self.instantiate_slice(
            engine, ns_data, self.nsi_id1, "Instantiate NSI-1 step 2"
        )
        nsilcmop_id1 = engine.last_id

        # Waiting for NSI-1
        if test_osm:
            engine.wait_operation_ready("nsi", nsilcmop_id1, timeout_deploy)

        # CREATE NSI-2
        ns_data = {
            "nsiName": "Deploy-NSI-2",
            "vimAccountId": self.vim_id,
            "nstId": nst_id,
            "nsiDescription": "default",
        }
        r = self.create_slice(engine, ns_data, "Create NSI-2 step 1")
        if not r:
            return
        self.nsi_id2 = engine.last_id

        # INSTANTIATE NSI-2
        self.instantiate_slice(
            engine, ns_data, self.nsi_id2, "Instantiate NSI-2 step 2"
        )
        nsilcmop_id2 = engine.last_id

        # Waiting for NSI-2
        if test_osm:
            engine.wait_operation_ready("nsi", nsilcmop_id2, timeout_deploy)

        if manual_check:
            input(
                "NSI-1 AND NSI-2 has been deployed. Perform manual check and press enter to resume"
            )

        # TERMINATE NSI-1
        if test_osm:
            self.terminate_slice(engine, self.nsi_id1, "Terminate NSI-1")
            nsilcmop1_id = engine.last_id

            # Wait terminate NSI-1
            engine.wait_operation_ready("nsi", nsilcmop1_id, timeout_deploy)

        # DELETE NSI-1
        self.delete_slice(engine, self.nsi_id1, "Delete NS")

        if manual_check:
            input(
                "NSI-1 has been deleted. Perform manual check and press enter to resume"
            )

        # CREATE NSI-3
        ns_data = {
            "nsiName": "Deploy-NSI-3",
            "vimAccountId": self.vim_id,
            "nstId": nst_id,
            "nsiDescription": "default",
        }
        r = self.create_slice(engine, ns_data, "Create NSI-3 step 1")

        if not r:
            return
        self.nsi_id3 = engine.last_id

        # INSTANTIATE NSI-3
        self.instantiate_slice(
            engine, ns_data, self.nsi_id3, "Instantiate NSI-3 step 2"
        )
        nsilcmop_id3 = engine.last_id

        # Wait Instantiate NSI-3
        if test_osm:
            engine.wait_operation_ready("nsi", nsilcmop_id3, timeout_deploy)

        if manual_check:
            input(
                "NSI-3 has been deployed. Perform manual check and press enter to resume"
            )

        # TERMINATE NSI-2
        if test_osm:
            self.terminate_slice(engine, self.nsi_id2, "Terminate NSI-2")
            nsilcmop2_id = engine.last_id

            # Wait terminate NSI-2
            engine.wait_operation_ready("nsi", nsilcmop2_id, timeout_deploy)

        # DELETE NSI-2
        self.delete_slice(engine, self.nsi_id2, "DELETE NSI-2")

        # TERMINATE NSI-3
        if test_osm:
            self.terminate_slice(engine, self.nsi_id3, "Terminate NSI-3")
            nsilcmop3_id = engine.last_id

            # Wait terminate NSI-3
            engine.wait_operation_ready("nsi", nsilcmop3_id, timeout_deploy)

        # DELETE NSI-3
        self.delete_slice(engine, self.nsi_id3, "DELETE NSI-3")

        if manual_check:
            input(
                "NSI-2 and NSI-3 has been deleted. Perform manual check and press enter to resume"
            )

        # nstd DELETE
        engine.test(
            "Delete NSTD",
            "DELETE",
            "/nst/v1/netslice_templates/{}".format(nst_id),
            headers_json,
            None,
            204,
            None,
            0,
        )

        # NSDs DELETE
        test_rest.test(
            "Delete NSD middle",
            "DELETE",
            "/nsd/v1/ns_descriptors/{}".format(self.nsd_middle_id),
            headers_json,
            None,
            204,
            None,
            0,
        )

        test_rest.test(
            "Delete NSD edge",
            "DELETE",
            "/nsd/v1/ns_descriptors/{}".format(self.nsd_edge_id),
            headers_json,
            None,
            204,
            None,
            0,
        )

        # VNFDs DELETE
        test_rest.test(
            "Delete VNFD edge",
            "DELETE",
            "/vnfpkgm/v1/vnf_packages/{}".format(self.vnfd_edge_id),
            headers_yaml,
            None,
            204,
            None,
            0,
        )

        test_rest.test(
            "Delete VNFD middle",
            "DELETE",
            "/vnfpkgm/v1/vnf_packages/{}".format(self.vnfd_middle_id),
            headers_yaml,
            None,
            204,
            None,
            0,
        )


class TestAuthentication:
    description = "Test Authentication"

    @staticmethod
    def run(engine, test_osm, manual_check, test_params=None):
        engine.set_test_name("Authentication")
        # backend = test_params.get("backend") if test_params else None   # UNUSED

        admin_project_id = test_project_id = None
        project_admin_role_id = project_user_role_id = None
        test_user_id = empty_user_id = None
        default_role_id = empty_role_id = token_role_id = None

        engine.get_autorization()

        # GET
        engine.test(
            "Get tokens",
            "GET",
            "/admin/v1/tokens",
            headers_json,
            {},
            (200),
            {"Content-Type": "application/json"},
            "json",
        )
        engine.test(
            "Get projects",
            "GET",
            "/admin/v1/projects",
            headers_json,
            {},
            (200),
            {"Content-Type": "application/json"},
            "json",
        )
        engine.test(
            "Get users",
            "GET",
            "/admin/v1/users",
            headers_json,
            {},
            (200),
            {"Content-Type": "application/json"},
            "json",
        )
        engine.test(
            "Get roles",
            "GET",
            "/admin/v1/roles",
            headers_json,
            {},
            (200),
            {"Content-Type": "application/json"},
            "json",
        )
        res = engine.test(
            "Get admin project",
            "GET",
            "/admin/v1/projects?name=admin",
            headers_json,
            {},
            (200),
            {"Content-Type": "application/json"},
            "json",
        )
        admin_project_id = res.json()[0]["_id"] if res else None
        res = engine.test(
            "Get project admin role",
            "GET",
            "/admin/v1/roles?name=project_admin",
            headers_json,
            {},
            (200),
            {"Content-Type": "application/json"},
            "json",
        )
        project_admin_role_id = res.json()[0]["_id"] if res else None
        res = engine.test(
            "Get project user role",
            "GET",
            "/admin/v1/roles?name=project_user",
            headers_json,
            {},
            (200),
            {"Content-Type": "application/json"},
            "json",
        )
        project_user_role_id = res.json()[0]["_id"] if res else None

        # POST
        res = engine.test(
            "Create test project",
            "POST",
            "/admin/v1/projects",
            headers_json,
            {"name": "test"},
            (201),
            {"Location": "/admin/v1/projects/", "Content-Type": "application/json"},
            "json",
        )
        test_project_id = engine.last_id if res else None
        res = engine.test(
            "Create role without permissions",
            "POST",
            "/admin/v1/roles",
            headers_json,
            {"name": "empty"},
            (201),
            {"Content-Type": "application/json"},
            "json",
        )
        empty_role_id = engine.last_id if res else None
        res = engine.test(
            "Create role with default permissions",
            "POST",
            "/admin/v1/roles",
            headers_json,
            {"name": "default", "permissions": {"default": True}},
            (201),
            {"Location": "/admin/v1/roles/", "Content-Type": "application/json"},
            "json",
        )
        default_role_id = engine.last_id if res else None
        res = engine.test(
            "Create role with token permissions",
            "POST",
            "/admin/v1/roles",
            headers_json,
            {
                "name": "tokens",
                "permissions": {"tokens": True},
            },  # is default required ?
            (201),
            {"Location": "/admin/v1/roles/", "Content-Type": "application/json"},
            "json",
        )
        token_role_id = engine.last_id if res else None
        pr = "project-role mappings"
        res = engine.test(
            "Create user without " + pr,
            "POST",
            "/admin/v1/users",
            headers_json,
            {"username": "empty", "password": "empty"},
            201,
            {"Content-Type": "application/json"},
            "json",
        )
        empty_user_id = engine.last_id if res else None
        if (
            admin_project_id
            and test_project_id
            and project_admin_role_id
            and project_user_role_id
        ):
            data = {"username": "test", "password": "test"}
            data["project_role_mappings"] = [
                {"project": test_project_id, "role": project_admin_role_id},
                {"project": admin_project_id, "role": project_user_role_id},
            ]
            res = engine.test(
                "Create user with " + pr,
                "POST",
                "/admin/v1/users",
                headers_json,
                data,
                (201),
                {"Content-Type": "application/json"},
                "json",
            )
            test_user_id = engine.last_id if res else None

        # PUT
        if test_user_id:
            engine.test(
                "Modify test user's password",
                "PUT",
                "/admin/v1/users/" + test_user_id,
                headers_json,
                {"password": "password"},
                (204),
                {},
                0,
            )
        if (
            empty_user_id
            and admin_project_id
            and test_project_id
            and project_admin_role_id
            and project_user_role_id
        ):
            data = {
                "project_role_mappings": [
                    {"project": test_project_id, "role": project_admin_role_id},
                    {"project": admin_project_id, "role": project_user_role_id},
                ]
            }
            engine.test(
                "Modify empty user's " + pr,
                "PUT",
                "/admin/v1/users/" + empty_user_id,
                headers_json,
                data,
                (204),
                {},
                0,
            )

        # DELETE
        if empty_user_id:
            engine.test(
                "Delete empty user",
                "DELETE",
                "/admin/v1/users/" + empty_user_id,
                headers_json,
                {},
                (204),
                {},
                0,
            )
        if test_user_id:
            engine.test(
                "Delete test user",
                "DELETE",
                "/admin/v1/users/" + test_user_id,
                headers_json,
                {},
                (204),
                {},
                0,
            )
        if empty_role_id:
            engine.test(
                "Delete empty role",
                "DELETE",
                "/admin/v1/roles/" + empty_role_id,
                headers_json,
                {},
                (204),
                {},
                0,
            )
        if default_role_id:
            engine.test(
                "Delete default role",
                "DELETE",
                "/admin/v1/roles/" + default_role_id,
                headers_json,
                {},
                (204),
                {},
                0,
            )
        if token_role_id:
            engine.test(
                "Delete token role",
                "DELETE",
                "/admin/v1/roles/" + token_role_id,
                headers_json,
                {},
                (204),
                {},
                0,
            )
        if test_project_id:
            engine.test(
                "Delete test project",
                "DELETE",
                "/admin/v1/projects/" + test_project_id,
                headers_json,
                {},
                (204),
                {},
                0,
            )

        # END Tests

        engine.remove_authorization()  # To finish


class TestNbiQuotas:
    description = "Test NBI Quotas"

    @staticmethod
    def run(engine, test_osm, manual_check, test_params=None):
        engine.set_test_name("NBI-Quotas_")
        # backend = test_params.get("backend") if test_params else None   # UNUSED

        test_username = "test-nbi-quotas"
        test_password = "test-nbi-quotas"
        test_project = "test-nbi-quotas"

        test_vim = "test-nbi-quotas"
        test_wim = "test-nbi-quotas"
        test_sdn = "test-nbi-quotas"

        test_user_id = None
        test_project_id = None

        test_vim_ids = []
        test_wim_ids = []
        test_sdn_ids = []
        test_vnfd_ids = []
        test_nsd_ids = []
        test_nst_ids = []
        test_pdu_ids = []
        test_nsr_ids = []
        test_nsi_ids = []

        # Save admin access data
        admin_username = engine.user
        admin_password = engine.password
        admin_project = engine.project

        # Get admin access
        engine.get_autorization()
        admin_token = engine.last_id

        # Check that test project,user do not exist
        res1 = engine.test(
            "Check that test project doesn't exist",
            "GET",
            "/admin/v1/projects/" + test_project,
            headers_json,
            {},
            (404),
            {},
            True,
        )
        res2 = engine.test(
            "Check that test user doesn't exist",
            "GET",
            "/admin/v1/users/" + test_username,
            headers_json,
            {},
            (404),
            {},
            True,
        )
        if None in [res1, res2]:
            engine.remove_authorization()
            logger.error("Test project and/or user already exist")
            return

        # Create test project&user
        res = engine.test(
            "Create test project",
            "POST",
            "/admin/v1/projects",
            headers_json,
            {
                "name": test_username,
                "quotas": {
                    "vnfds": 2,
                    "nsds": 2,
                    "nsts": 1,
                    "pdus": 1,
                    "nsrs": 2,
                    "nsis": 1,
                    "vim_accounts": 1,
                    "wim_accounts": 1,
                    "sdns": 1,
                },
            },
            (201),
            r_header_json,
            "json",
        )
        test_project_id = engine.last_id if res else None
        res = engine.test(
            "Create test user",
            "POST",
            "/admin/v1/users",
            headers_json,
            {
                "username": test_username,
                "password": test_password,
                "project_role_mappings": [
                    {"project": test_project, "role": "project_admin"}
                ],
            },
            (201),
            r_header_json,
            "json",
        )
        test_user_id = engine.last_id if res else None

        if test_project_id and test_user_id:
            # Get user access
            engine.token = None
            engine.user = test_username
            engine.password = test_password
            engine.project = test_project
            engine.get_autorization()
            user_token = engine.last_id

            # Create test VIM
            res = engine.test(
                "Create test VIM",
                "POST",
                "/admin/v1/vim_accounts",
                headers_json,
                {
                    "name": test_vim,
                    "vim_type": "openvim",
                    "vim_user": test_username,
                    "vim_password": test_password,
                    "vim_tenant_name": test_project,
                    "vim_url": "https://0.0.0.0:0/v0.0",
                },
                (202),
                r_header_json,
                "json",
            )
            test_vim_ids += [engine.last_id if res else None]

            res = engine.test(
                "Try to create second test VIM",
                "POST",
                "/admin/v1/vim_accounts",
                headers_json,
                {
                    "name": test_vim + "_2",
                    "vim_type": "openvim",
                    "vim_user": test_username,
                    "vim_password": test_password,
                    "vim_tenant_name": test_project,
                    "vim_url": "https://0.0.0.0:0/v0.0",
                },
                (422),
                r_header_json,
                "json",
            )
            test_vim_ids += [engine.last_id if res is None else None]

            res = engine.test(
                "Try to create second test VIM with FORCE",
                "POST",
                "/admin/v1/vim_accounts?FORCE",
                headers_json,
                {
                    "name": test_vim + "_3",
                    "vim_type": "openvim",
                    "vim_user": test_username,
                    "vim_password": test_password,
                    "vim_tenant_name": test_project,
                    "vim_url": "https://0.0.0.0:0/v0.0",
                },
                (202),
                r_header_json,
                "json",
            )
            test_vim_ids += [engine.last_id if res else None]

            if test_vim_ids[0]:
                # Download descriptor files (if required)
                test_dir = "/tmp/" + test_username + "/"
                test_url = "https://osm-download.etsi.org/ftp/osm-6.0-six/7th-hackfest/packages/"
                vnfd_filenames = [
                    "slice_hackfest_vnfd.tar.gz",
                    "slice_hackfest_middle_vnfd.tar.gz",
                ]
                nsd_filenames = [
                    "slice_hackfest_nsd.tar.gz",
                    "slice_hackfest_middle_nsd.tar.gz",
                ]
                nst_filenames = ["slice_hackfest_nstd.yaml"]
                pdu_filenames = ["PDU_router.yaml"]
                desc_filenames = (
                    vnfd_filenames + nsd_filenames + nst_filenames + pdu_filenames
                )
                if not os.path.exists(test_dir):
                    os.makedirs(test_dir)
                for filename in desc_filenames:
                    if not os.path.exists(test_dir + filename):
                        res = requests.get(test_url + filename)
                        if res.status_code < 300:
                            with open(test_dir + filename, "wb") as file:
                                file.write(res.content)

                if all([os.path.exists(test_dir + p) for p in desc_filenames]):
                    # Test VNFD Quotas
                    res = engine.test(
                        "Create test VNFD #1",
                        "POST",
                        "/vnfpkgm/v1/vnf_packages_content",
                        headers_zip_json,
                        "@b" + test_dir + vnfd_filenames[0],
                        (201),
                        r_header_json,
                        "json",
                    )
                    test_vnfd_ids += [engine.last_id if res else None]
                    res = engine.test(
                        "Create test VNFD #2",
                        "POST",
                        "/vnfpkgm/v1/vnf_packages_content",
                        headers_zip_json,
                        "@b" + test_dir + vnfd_filenames[1],
                        (201),
                        r_header_json,
                        "json",
                    )
                    test_vnfd_ids += [engine.last_id if res else None]
                    res = engine.test(
                        "Try to create extra test VNFD",
                        "POST",
                        "/vnfpkgm/v1/vnf_packages_content",
                        headers_zip_json,
                        "@b" + test_dir + vnfd_filenames[0],
                        (422),
                        r_header_json,
                        "json",
                    )
                    test_vnfd_ids += [engine.last_id if res is None else None]
                    res = engine.test(
                        "Try to create extra test VNFD with FORCE",
                        "POST",
                        "/vnfpkgm/v1/vnf_packages_content?FORCE",
                        headers_zip_json,
                        "@b" + test_dir + vnfd_filenames[0],
                        (201),
                        r_header_json,
                        "json",
                    )
                    test_vnfd_ids += [engine.last_id if res else None]

                    # Remove extra VNFDs to prevent further errors
                    for i in [2, 3]:
                        if test_vnfd_ids[i]:
                            res = engine.test(
                                "Delete test VNFD #" + str(i),
                                "DELETE",
                                "/vnfpkgm/v1/vnf_packages_content/"
                                + test_vnfd_ids[i]
                                + "?FORCE",
                                headers_json,
                                {},
                                (204),
                                {},
                                0,
                            )
                            if res:
                                test_vnfd_ids[i] = None

                    if test_vnfd_ids[0] and test_vnfd_ids[1]:
                        # Test NSD Quotas
                        res = engine.test(
                            "Create test NSD #1",
                            "POST",
                            "/nsd/v1/ns_descriptors_content",
                            headers_zip_json,
                            "@b" + test_dir + nsd_filenames[0],
                            (201),
                            r_header_json,
                            "json",
                        )
                        test_nsd_ids += [engine.last_id if res else None]
                        res = engine.test(
                            "Create test NSD #2",
                            "POST",
                            "/nsd/v1/ns_descriptors_content",
                            headers_zip_json,
                            "@b" + test_dir + nsd_filenames[1],
                            (201),
                            r_header_json,
                            "json",
                        )
                        test_nsd_ids += [engine.last_id if res else None]
                        res = engine.test(
                            "Try to create extra test NSD",
                            "POST",
                            "/nsd/v1/ns_descriptors_content",
                            headers_zip_json,
                            "@b" + test_dir + nsd_filenames[0],
                            (422),
                            r_header_json,
                            "json",
                        )
                        test_nsd_ids += [engine.last_id if res is None else None]
                        res = engine.test(
                            "Try to create extra test NSD with FORCE",
                            "POST",
                            "/nsd/v1/ns_descriptors_content?FORCE",
                            headers_zip_json,
                            "@b" + test_dir + nsd_filenames[0],
                            (201),
                            r_header_json,
                            "json",
                        )
                        test_nsd_ids += [engine.last_id if res else None]

                        # Remove extra NSDs to prevent further errors
                        for i in [2, 3]:
                            if test_nsd_ids[i]:
                                res = engine.test(
                                    "Delete test NSD #" + str(i),
                                    "DELETE",
                                    "/nsd/v1/ns_descriptors_content/"
                                    + test_nsd_ids[i]
                                    + "?FORCE",
                                    headers_json,
                                    {},
                                    (204),
                                    {},
                                    0,
                                )
                                if res:
                                    test_nsd_ids[i] = None

                        if test_nsd_ids[0] and test_nsd_ids[1]:
                            # Test NSR Quotas
                            res = engine.test(
                                "Create test NSR #1",
                                "POST",
                                "/nslcm/v1/ns_instances_content",
                                headers_json,
                                {
                                    "nsName": test_username + "_1",
                                    "nsdId": test_nsd_ids[0],
                                    "vimAccountId": test_vim_ids[0],
                                },
                                (201),
                                r_header_json,
                                "json",
                            )
                            test_nsr_ids += [engine.last_id if res else None]
                            res = engine.test(
                                "Create test NSR #2",
                                "POST",
                                "/nslcm/v1/ns_instances_content",
                                headers_json,
                                {
                                    "nsName": test_username + "_2",
                                    "nsdId": test_nsd_ids[1],
                                    "vimAccountId": test_vim_ids[0],
                                },
                                (201),
                                r_header_json,
                                "json",
                            )
                            test_nsr_ids += [engine.last_id if res else None]
                            res = engine.test(
                                "Try to create extra test NSR",
                                "POST",
                                "/nslcm/v1/ns_instances_content",
                                headers_json,
                                {
                                    "nsName": test_username + "_3",
                                    "nsdId": test_nsd_ids[0],
                                    "vimAccountId": test_vim_ids[0],
                                },
                                (422),
                                r_header_json,
                                "json",
                            )
                            test_nsr_ids += [engine.last_id if res is None else None]
                            res = engine.test(
                                "Try to create test NSR with FORCE",
                                "POST",
                                "/nslcm/v1/ns_instances_content?FORCE",
                                headers_json,
                                {
                                    "nsName": test_username + "_4",
                                    "nsdId": test_nsd_ids[0],
                                    "vimAccountId": test_vim_ids[0],
                                },
                                (201),
                                r_header_json,
                                "json",
                            )
                            test_nsr_ids += [engine.last_id if res else None]

                            # Test NST Quotas
                            res = engine.test(
                                "Create test NST",
                                "POST",
                                "/nst/v1/netslice_templates_content",
                                headers_txt_json,
                                "@b" + test_dir + nst_filenames[0],
                                (201),
                                r_header_json,
                                "json",
                            )
                            test_nst_ids += [engine.last_id if res else None]
                            res = engine.test(
                                "Try to create extra test NST",
                                "POST",
                                "/nst/v1/netslice_templates_content",
                                headers_txt_json,
                                "@b" + test_dir + nst_filenames[0],
                                (422),
                                r_header_json,
                                "json",
                            )
                            test_nst_ids += [engine.last_id if res is None else None]
                            res = engine.test(
                                "Try to create extra test NST with FORCE",
                                "POST",
                                "/nst/v1/netslice_templates_content?FORCE",
                                headers_txt_json,
                                "@b" + test_dir + nst_filenames[0],
                                (201),
                                r_header_json,
                                "json",
                            )
                            test_nst_ids += [engine.last_id if res else None]

                            if test_nst_ids[0]:
                                # Remove NSR Quota
                                engine.set_header(
                                    {"Authorization": "Bearer {}".format(admin_token)}
                                )
                                res = engine.test(
                                    "Remove NSR Quota",
                                    "PUT",
                                    "/admin/v1/projects/" + test_project_id,
                                    headers_json,
                                    {"quotas": {"nsrs": None}},
                                    (204),
                                    {},
                                    0,
                                )
                                engine.set_header(
                                    {"Authorization": "Bearer {}".format(user_token)}
                                )
                                if res:
                                    # Test NSI Quotas
                                    res = engine.test(
                                        "Create test NSI",
                                        "POST",
                                        "/nsilcm/v1/netslice_instances_content",
                                        headers_json,
                                        {
                                            "nsiName": test_username,
                                            "nstId": test_nst_ids[0],
                                            "vimAccountId": test_vim_ids[0],
                                        },
                                        (201),
                                        r_header_json,
                                        "json",
                                    )
                                    test_nsi_ids += [engine.last_id if res else None]
                                    res = engine.test(
                                        "Try to create extra test NSI",
                                        "POST",
                                        "/nsilcm/v1/netslice_instances_content",
                                        headers_json,
                                        {
                                            "nsiName": test_username,
                                            "nstId": test_nst_ids[0],
                                            "vimAccountId": test_vim_ids[0],
                                        },
                                        (400),
                                        r_header_json,
                                        "json",
                                    )
                                    test_nsi_ids += [
                                        engine.last_id if res is None else None
                                    ]
                                    res = engine.test(
                                        "Try to create extra test NSI with FORCE",
                                        "POST",
                                        "/nsilcm/v1/netslice_instances_content?FORCE",
                                        headers_json,
                                        {
                                            "nsiName": test_username,
                                            "nstId": test_nst_ids[0],
                                            "vimAccountId": test_vim_ids[0],
                                        },
                                        (201),
                                        r_header_json,
                                        "json",
                                    )
                                    test_nsi_ids += [engine.last_id if res else None]

                    # Test PDU Quotas
                    with open(test_dir + pdu_filenames[0], "rb") as file:
                        pdu_text = re.sub(
                            r"ip-address: *\[[^\]]*\]",
                            "ip-address: '0.0.0.0'",
                            file.read().decode("utf-8"),
                        )
                    with open(test_dir + pdu_filenames[0], "wb") as file:
                        file.write(pdu_text.encode("utf-8"))
                    res = engine.test(
                        "Create test PDU",
                        "POST",
                        "/pdu/v1/pdu_descriptors",
                        headers_yaml,
                        "@b" + test_dir + pdu_filenames[0],
                        (201),
                        r_header_yaml,
                        "yaml",
                    )
                    test_pdu_ids += [engine.last_id if res else None]
                    res = engine.test(
                        "Try to create extra test PDU",
                        "POST",
                        "/pdu/v1/pdu_descriptors",
                        headers_yaml,
                        "@b" + test_dir + pdu_filenames[0],
                        (422),
                        r_header_yaml,
                        "yaml",
                    )
                    test_pdu_ids += [engine.last_id if res is None else None]
                    res = engine.test(
                        "Try to create extra test PDU with FORCE",
                        "POST",
                        "/pdu/v1/pdu_descriptors?FORCE",
                        headers_yaml,
                        "@b" + test_dir + pdu_filenames[0],
                        (201),
                        r_header_yaml,
                        "yaml",
                    )
                    test_pdu_ids += [engine.last_id if res else None]

                    # Cleanup
                    for i, id in enumerate(test_nsi_ids):
                        if id:
                            engine.test(
                                "Delete test NSI #" + str(i),
                                "DELETE",
                                "/nsilcm/v1/netslice_instances_content/"
                                + id
                                + "?FORCE",
                                headers_json,
                                {},
                                (204),
                                {},
                                0,
                            )
                    for i, id in enumerate(test_nsr_ids):
                        if id:
                            engine.test(
                                "Delete test NSR #" + str(i),
                                "DELETE",
                                "/nslcm/v1/ns_instances_content/" + id + "?FORCE",
                                headers_json,
                                {},
                                (204),
                                {},
                                0,
                            )
                    for i, id in enumerate(test_nst_ids):
                        if id:
                            engine.test(
                                "Delete test NST #" + str(i),
                                "DELETE",
                                "/nst/v1/netslice_templates_content/" + id + "?FORCE",
                                headers_json,
                                {},
                                (204),
                                {},
                                0,
                            )
                    for i, id in enumerate(test_nsd_ids):
                        if id:
                            engine.test(
                                "Delete test NSD #" + str(i),
                                "DELETE",
                                "/nsd/v1/ns_descriptors_content/" + id + "?FORCE",
                                headers_json,
                                {},
                                (204),
                                {},
                                0,
                            )
                    for i, id in enumerate(test_vnfd_ids):
                        if id:
                            engine.test(
                                "Delete test VNFD #" + str(i),
                                "DELETE",
                                "/vnfpkgm/v1/vnf_packages_content/" + id + "?FORCE",
                                headers_json,
                                {},
                                (204),
                                {},
                                0,
                            )
                    for i, id in enumerate(test_pdu_ids):
                        if id:
                            engine.test(
                                "Delete test PDU #" + str(i),
                                "DELETE",
                                "/pdu/v1/pdu_descriptors/" + id + "?FORCE",
                                headers_json,
                                {},
                                (204),
                                {},
                                0,
                            )

                    # END Test NBI Quotas

            # Test WIM Quotas
            res = engine.test(
                "Create test WIM",
                "POST",
                "/admin/v1/wim_accounts",
                headers_json,
                {
                    "name": test_wim,
                    "wim_type": "onos",
                    "wim_url": "https://0.0.0.0:0/v0.0",
                },
                (202),
                r_header_json,
                "json",
            )
            test_wim_ids += [engine.last_id if res else None]
            res = engine.test(
                "Try to create second test WIM",
                "POST",
                "/admin/v1/wim_accounts",
                headers_json,
                {
                    "name": test_wim + "_2",
                    "wim_type": "onos",
                    "wim_url": "https://0.0.0.0:0/v0.0",
                },
                (422),
                r_header_json,
                "json",
            )
            test_wim_ids += [engine.last_id if res is None else None]
            res = engine.test(
                "Try to create second test WIM with FORCE",
                "POST",
                "/admin/v1/wim_accounts?FORCE",
                headers_json,
                {
                    "name": test_wim + "_3",
                    "wim_type": "onos",
                    "wim_url": "https://0.0.0.0:0/v0.0",
                },
                (202),
                r_header_json,
                "json",
            )
            test_wim_ids += [engine.last_id if res else None]

            # Test SDN Quotas
            res = engine.test(
                "Create test SDN",
                "POST",
                "/admin/v1/sdns",
                headers_json,
                {
                    "name": test_sdn,
                    "type": "onos",
                    "ip": "0.0.0.0",
                    "port": 9999,
                    "dpid": "00:00:00:00:00:00:00:00",
                },
                (202),
                r_header_json,
                "json",
            )
            test_sdn_ids += [engine.last_id if res else None]
            res = engine.test(
                "Try to create second test SDN",
                "POST",
                "/admin/v1/sdns",
                headers_json,
                {
                    "name": test_sdn + "_2",
                    "type": "onos",
                    "ip": "0.0.0.0",
                    "port": 9999,
                    "dpid": "00:00:00:00:00:00:00:00",
                },
                (422),
                r_header_json,
                "json",
            )
            test_sdn_ids += [engine.last_id if res is None else None]
            res = engine.test(
                "Try to create second test SDN with FORCE",
                "POST",
                "/admin/v1/sdns?FORCE",
                headers_json,
                {
                    "name": test_sdn + "_3",
                    "type": "onos",
                    "ip": "0.0.0.0",
                    "port": 9999,
                    "dpid": "00:00:00:00:00:00:00:00",
                },
                (202),
                r_header_json,
                "json",
            )
            test_sdn_ids += [engine.last_id if res else None]

            # Cleanup
            for i, id in enumerate(test_vim_ids):
                if id:
                    engine.test(
                        "Delete test VIM #" + str(i),
                        "DELETE",
                        "/admin/v1/vim_accounts/" + id + "?FORCE",
                        headers_json,
                        {},
                        (202),
                        {},
                        0,
                    )
            for i, id in enumerate(test_wim_ids):
                if id:
                    engine.test(
                        "Delete test WIM #" + str(i),
                        "DELETE",
                        "/admin/v1/wim_accounts/" + id + "?FORCE",
                        headers_json,
                        {},
                        (202),
                        {},
                        0,
                    )
            for i, id in enumerate(test_sdn_ids):
                if id:
                    engine.test(
                        "Delete test SDN #" + str(i),
                        "DELETE",
                        "/admin/v1/sdns/" + id + "?FORCE",
                        headers_json,
                        {},
                        (202),
                        {},
                        0,
                    )

            # Release user access
            engine.remove_authorization()

        # Cleanup
        engine.user = admin_username
        engine.password = admin_password
        engine.project = admin_project
        engine.get_autorization()
        if test_user_id:
            engine.test(
                "Delete test user",
                "DELETE",
                "/admin/v1/users/" + test_user_id + "?FORCE",
                headers_json,
                {},
                (204),
                {},
                0,
            )
        if test_project_id:
            engine.test(
                "Delete test project",
                "DELETE",
                "/admin/v1/projects/" + test_project_id + "?FORCE",
                headers_json,
                {},
                (204),
                {},
                0,
            )
        engine.remove_authorization()

    # END class TestNbiQuotas


if __name__ == "__main__":
    global logger
    test = ""

    # Disable warnings from self-signed certificates.
    requests.packages.urllib3.disable_warnings()
    try:
        logging.basicConfig(format="%(levelname)s %(message)s", level=logging.ERROR)
        logger = logging.getLogger("NBI")
        # load parameters and configuration
        opts, args = getopt.getopt(
            sys.argv[1:],
            "hvu:p:",
            [
                "url=",
                "user=",
                "password=",
                "help",
                "version",
                "verbose",
                "no-verbose",
                "project=",
                "insecure",
                "timeout",
                "timeout-deploy",
                "timeout-configure",
                "test=",
                "list",
                "test-osm",
                "manual-check",
                "params=",
                "fail-fast",
            ],
        )
        url = "https://localhost:9999/osm"
        user = password = project = "admin"
        test_osm = False
        manual_check = False
        verbose = 0
        verify = True
        fail_fast = False
        test_classes = {
            "NonAuthorized": TestNonAuthorized,
            "FakeVIM": TestFakeVim,
            "Users-Projects": TestUsersProjects,
            "Projects-Descriptors": TestProjectsDescriptors,
            "VIM-SDN": TestVIMSDN,
            "Deploy-Custom": TestDeploy,
            "Deploy-Hackfest-Cirros": TestDeployHackfestCirros,
            "Deploy-Hackfest-Cirros-Scaling": TestDeployHackfestCirrosScaling,
            "Deploy-Hackfest-3Charmed": TestDeployHackfest3Charmed,
            "Deploy-Hackfest-3Charmed2": TestDeployHackfest3Charmed2,
            "Deploy-Hackfest-3Charmed3": TestDeployHackfest3Charmed3,
            "Deploy-Hackfest-4": TestDeployHackfest4,
            "Deploy-CirrosMacIp": TestDeployIpMac,
            "Descriptors": TestDescriptors,
            "Deploy-Hackfest1": TestDeployHackfest1,
            # "Deploy-MultiVIM": TestDeployMultiVIM,
            "Deploy-SingleVdu": TestDeploySingleVdu,
            "Deploy-Hnfd": TestDeployHnfd,
            "Upload-Slice-Template": TestNetSliceTemplates,
            "Deploy-Slice-Instance": TestNetSliceInstances,
            "Deploy-SimpleCharm": TestDeploySimpleCharm,
            "Deploy-SimpleCharm2": TestDeploySimpleCharm2,
            "Authentication": TestAuthentication,
            "NBI-Quotas": TestNbiQuotas,
        }
        test_to_do = []
        test_params = {}

        for o, a in opts:
            # print("parameter:", o, a)
            if o == "--version":
                print("test version " + __version__ + " " + version_date)
                exit()
            elif o == "--list":
                for test, test_class in sorted(test_classes.items()):
                    print("{:32} {}".format(test + ":", test_class.description))
                exit()
            elif o in ("-v", "--verbose"):
                verbose += 1
            elif o == "no-verbose":
                verbose = -1
            elif o in ("-h", "--help"):
                usage()
                sys.exit()
            elif o == "--test-osm":
                test_osm = True
            elif o == "--manual-check":
                manual_check = True
            elif o == "--url":
                url = a
            elif o in ("-u", "--user"):
                user = a
            elif o in ("-p", "--password"):
                password = a
            elif o == "--project":
                project = a
            elif o == "--fail-fast":
                fail_fast = True
            elif o == "--test":
                for _test in a.split(","):
                    if _test not in test_classes:
                        print(
                            "Invalid test name '{}'. Use option '--list' to show available tests".format(
                                _test
                            ),
                            file=sys.stderr,
                        )
                        exit(1)
                    test_to_do.append(_test)
            elif o == "--params":
                param_key, _, param_value = a.partition("=")
                text_index = len(test_to_do)
                if text_index not in test_params:
                    test_params[text_index] = {}
                test_params[text_index][param_key] = param_value
            elif o == "--insecure":
                verify = False
            elif o == "--timeout":
                timeout = int(a)
            elif o == "--timeout-deploy":
                timeout_deploy = int(a)
            elif o == "--timeout-configure":
                timeout_configure = int(a)
            else:
                assert False, "Unhandled option"
        if verbose == 0:
            logger.setLevel(logging.WARNING)
        elif verbose > 1:
            logger.setLevel(logging.DEBUG)
        else:
            logger.setLevel(logging.ERROR)

        test_rest = TestRest(url, user=user, password=password, project=project)
        # print("tests to do:", test_to_do)
        if test_to_do:
            text_index = 0
            for test in test_to_do:
                if fail_fast and test_rest.failed_tests:
                    break
                text_index += 1
                test_class = test_classes[test]
                test_class().run(
                    test_rest, test_osm, manual_check, test_params.get(text_index)
                )
        else:
            for test, test_class in sorted(test_classes.items()):
                if fail_fast and test_rest.failed_tests:
                    break
                test_class().run(test_rest, test_osm, manual_check, test_params.get(0))
        test_rest.print_results()
        exit(1 if test_rest.failed_tests else 0)

    except TestException as e:
        logger.error(test + "Test {} Exception: {}".format(test, str(e)))
        exit(1)
    except getopt.GetoptError as e:
        logger.error(e)
        print(e, file=sys.stderr)
        exit(1)
    except Exception as e:
        logger.critical(test + " Exception: " + str(e), exc_info=True)
