# -*- 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 asyncio
import logging
import logging.handlers
import traceback
from osm_lcm import ROclient
from osm_lcm.lcm_utils import (
    LcmException,
    LcmBase,
    populate_dict,
    get_iterable,
    deep_get,
)
from osm_common.dbbase import DbException
from time import time
from copy import deepcopy


__author__ = "Felipe Vicens, Pol Alemany, Alfonso Tierno"


class NetsliceLcm(LcmBase):
    def __init__(self, msg, lcm_tasks, config, loop, ns):
        """
        Init, Connect to database, filesystem storage, and messaging
        :param config: two level dictionary with configuration. Top level should contain 'database', 'storage',
        :return: None
        """
        # logging
        self.logger = logging.getLogger("lcm.netslice")
        self.loop = loop
        self.lcm_tasks = lcm_tasks
        self.ns = ns
        self.ro_config = config["RO"]
        self.timeout = config["timeout"]

        super().__init__(msg, self.logger)

    def nsi_update_nsir(self, nsi_update_nsir, db_nsir, nsir_desc_RO):
        """
        Updates database nsir with the RO info for the created vld
        :param nsi_update_nsir: dictionary to be filled with the updated info
        :param db_nsir: content of db_nsir. This is also modified
        :param nsir_desc_RO: nsir descriptor from RO
        :return: Nothing, LcmException is raised on errors
        """

        for vld_index, vld in enumerate(get_iterable(db_nsir, "vld")):
            for net_RO in get_iterable(nsir_desc_RO, "nets"):
                if vld["id"] != net_RO.get("ns_net_osm_id"):
                    continue
                vld["vim-id"] = net_RO.get("vim_net_id")
                vld["name"] = net_RO.get("vim_name")
                vld["status"] = net_RO.get("status")
                vld["status-detailed"] = net_RO.get("error_msg")
                nsi_update_nsir["vld.{}".format(vld_index)] = vld
                break
            else:
                raise LcmException(
                    "ns_update_nsir: Not found vld={} at RO info".format(vld["id"])
                )

    async def instantiate(self, nsir_id, nsilcmop_id):
        # Try to lock HA task here
        task_is_locked_by_me = self.lcm_tasks.lock_HA("nsi", "nsilcmops", nsilcmop_id)
        if not task_is_locked_by_me:
            return

        logging_text = "Task netslice={} instantiate={} ".format(nsir_id, nsilcmop_id)
        self.logger.debug(logging_text + "Enter")
        # get all needed from database
        exc = None
        db_nsir = None
        db_nsilcmop = None
        db_nsir_update = {"_admin.nsilcmop": nsilcmop_id}
        db_nsilcmop_update = {}
        nsilcmop_operation_state = None
        vim_2_RO = {}
        RO = ROclient.ROClient(self.loop, **self.ro_config)
        nsi_vld_instantiationi_params = {}

        def ip_profile_2_RO(ip_profile):
            RO_ip_profile = deepcopy((ip_profile))
            if "dns-server" in RO_ip_profile:
                if isinstance(RO_ip_profile["dns-server"], list):
                    RO_ip_profile["dns-address"] = []
                    for ds in RO_ip_profile.pop("dns-server"):
                        RO_ip_profile["dns-address"].append(ds["address"])
                else:
                    RO_ip_profile["dns-address"] = RO_ip_profile.pop("dns-server")
            if RO_ip_profile.get("ip-version") == "ipv4":
                RO_ip_profile["ip-version"] = "IPv4"
            if RO_ip_profile.get("ip-version") == "ipv6":
                RO_ip_profile["ip-version"] = "IPv6"
            if "dhcp-params" in RO_ip_profile:
                RO_ip_profile["dhcp"] = RO_ip_profile.pop("dhcp-params")
            return RO_ip_profile

        def vim_account_2_RO(vim_account):
            """
            Translate a RO vim_account from OSM vim_account params
            :param ns_params: OSM instantiate params
            :return: The RO ns descriptor
            """
            if vim_account in vim_2_RO:
                return vim_2_RO[vim_account]

            db_vim = self.db.get_one("vim_accounts", {"_id": vim_account})
            if db_vim["_admin"]["operationalState"] != "ENABLED":
                raise LcmException(
                    "VIM={} is not available. operationalState={}".format(
                        vim_account, db_vim["_admin"]["operationalState"]
                    )
                )
            RO_vim_id = db_vim["_admin"]["deployed"]["RO"]
            vim_2_RO[vim_account] = RO_vim_id
            return RO_vim_id

        async def netslice_scenario_create(
            self, vld_item, nsir_id, db_nsir, db_nsir_admin, db_nsir_update
        ):
            """
            Create a network slice VLD through RO Scenario
            :param vld_id The VLD id inside nsir to be created
            :param nsir_id The nsir id
            """
            nonlocal nsi_vld_instantiationi_params
            ip_vld = None
            mgmt_network = False
            RO_vld_sites = []
            vld_id = vld_item["id"]
            netslice_vld = vld_item
            # logging_text = "Task netslice={} instantiate_vld={} ".format(nsir_id, vld_id)
            # self.logger.debug(logging_text + "Enter")

            vld_shared = None
            for shared_nsrs_item in get_iterable(vld_item, "shared-nsrs-list"):
                _filter = {
                    "_id.ne": nsir_id,
                    "_admin.nsrs-detailed-list.ANYINDEX.nsrId": shared_nsrs_item,
                }
                shared_nsi = self.db.get_one(
                    "nsis", _filter, fail_on_empty=False, fail_on_more=False
                )
                if shared_nsi:
                    for vlds in get_iterable(shared_nsi["_admin"]["deployed"], "RO"):
                        if vld_id == vlds["vld_id"]:
                            vld_shared = {
                                "instance_scenario_id": vlds["netslice_scenario_id"],
                                "osm_id": vld_id,
                            }
                            break
                    break

            # Creating netslice-vld at RO
            RO_nsir = deep_get(db_nsir, ("_admin", "deployed", "RO"), [])

            if vld_id in RO_nsir:
                db_nsir_update["_admin.deployed.RO"] = RO_nsir

            # If netslice-vld doesn't exists then create it
            else:
                # TODO: Check VDU type in all descriptors finding SRIOV / PT
                # Updating network names and datacenters from instantiation parameters for each VLD
                for instantiation_params_vld in get_iterable(
                    db_nsir["instantiation_parameters"], "netslice-vld"
                ):
                    if instantiation_params_vld.get("name") == netslice_vld["name"]:
                        ip_vld = deepcopy(instantiation_params_vld)
                        ip_vld.pop("name")
                        nsi_vld_instantiationi_params[netslice_vld["name"]] = ip_vld

                db_nsir_update_RO = {}
                db_nsir_update_RO["vld_id"] = netslice_vld["name"]
                if self.ro_config["ng"]:
                    db_nsir_update_RO["netslice_scenario_id"] = (
                        vld_shared.get("instance_scenario_id")
                        if vld_shared
                        else "nsir:{}:vld.{}".format(nsir_id, netslice_vld["name"])
                    )
                else:  # if not self.ro_config["ng"]:
                    if netslice_vld.get("mgmt-network"):
                        mgmt_network = True
                    RO_ns_params = {}
                    RO_ns_params["name"] = netslice_vld["name"]
                    RO_ns_params["datacenter"] = vim_account_2_RO(
                        db_nsir["instantiation_parameters"]["vimAccountId"]
                    )

                    # Creating scenario if vim-network-name / vim-network-id are present as instantiation parameter
                    # Use vim-network-id instantiation parameter
                    vim_network_option = None
                    if ip_vld:
                        if ip_vld.get("vim-network-id"):
                            vim_network_option = "vim-network-id"
                        elif ip_vld.get("vim-network-name"):
                            vim_network_option = "vim-network-name"
                        if ip_vld.get("ip-profile"):
                            populate_dict(
                                RO_ns_params,
                                ("networks", netslice_vld["name"], "ip-profile"),
                                ip_profile_2_RO(ip_vld["ip-profile"]),
                            )

                    if vim_network_option:
                        if ip_vld.get(vim_network_option):
                            if isinstance(ip_vld.get(vim_network_option), list):
                                for vim_net_id in ip_vld.get(vim_network_option):
                                    for vim_account, vim_net in vim_net_id.items():
                                        RO_vld_sites.append(
                                            {
                                                "netmap-use": vim_net,
                                                "datacenter": vim_account_2_RO(
                                                    vim_account
                                                ),
                                            }
                                        )
                            elif isinstance(ip_vld.get(vim_network_option), dict):
                                for vim_account, vim_net in ip_vld.get(
                                    vim_network_option
                                ).items():
                                    RO_vld_sites.append(
                                        {
                                            "netmap-use": vim_net,
                                            "datacenter": vim_account_2_RO(vim_account),
                                        }
                                    )
                            else:
                                RO_vld_sites.append(
                                    {
                                        "netmap-use": ip_vld[vim_network_option],
                                        "datacenter": vim_account_2_RO(
                                            netslice_vld["vimAccountId"]
                                        ),
                                    }
                                )

                    # Use default netslice vim-network-name from template
                    else:
                        for nss_conn_point_ref in get_iterable(
                            netslice_vld, "nss-connection-point-ref"
                        ):
                            if nss_conn_point_ref.get("vimAccountId"):
                                if (
                                    nss_conn_point_ref["vimAccountId"]
                                    != netslice_vld["vimAccountId"]
                                ):
                                    RO_vld_sites.append(
                                        {
                                            "netmap-create": None,
                                            "datacenter": vim_account_2_RO(
                                                nss_conn_point_ref["vimAccountId"]
                                            ),
                                        }
                                    )

                    if vld_shared:
                        populate_dict(
                            RO_ns_params,
                            ("networks", netslice_vld["name"], "use-network"),
                            vld_shared,
                        )

                    if RO_vld_sites:
                        populate_dict(
                            RO_ns_params,
                            ("networks", netslice_vld["name"], "sites"),
                            RO_vld_sites,
                        )

                    RO_ns_params["scenario"] = {
                        "nets": [
                            {
                                "name": netslice_vld["name"],
                                "external": mgmt_network,
                                "type": "bridge",
                            }
                        ]
                    }

                    # self.logger.debug(logging_text + step)
                    desc = await RO.create("ns", descriptor=RO_ns_params)
                    db_nsir_update_RO["netslice_scenario_id"] = desc["uuid"]
                db_nsir_update["_admin.deployed.RO"].append(db_nsir_update_RO)

        def overwrite_nsd_params(self, db_nsir, nslcmop):
            nonlocal nsi_vld_instantiationi_params
            nonlocal db_nsir_update
            vld_op_list = []
            vld = None
            nsr_id = nslcmop.get("nsInstanceId")
            # Overwrite instantiation parameters in netslice runtime
            RO_list = db_nsir_admin["deployed"]["RO"]

            for ro_item_index, RO_item in enumerate(RO_list):
                netslice_vld = next(
                    (
                        n
                        for n in get_iterable(db_nsir["_admin"], "netslice-vld")
                        if RO_item.get("vld_id") == n.get("id")
                    ),
                    None,
                )
                if not netslice_vld:
                    continue
                # if is equal vld of _admin with vld of netslice-vld then go for the CPs
                # Search the cp of netslice-vld that match with nst:netslice-subnet
                for nss_cp_item in get_iterable(
                    netslice_vld, "nss-connection-point-ref"
                ):
                    # Search the netslice-subnet of nst that match
                    nss = next(
                        (
                            nss
                            for nss in get_iterable(
                                db_nsir["_admin"], "netslice-subnet"
                            )
                            if nss_cp_item["nss-ref"] == nss["nss-id"]
                        ),
                        None,
                    )
                    # Compare nss-ref equal nss from nst
                    if not nss:
                        continue
                    db_nsds = self.db.get_one("nsds", {"_id": nss["nsdId"]})
                    # Go for nsd, and search the CP that match with nst:CP to get vld-id-ref
                    for cp_nsd in db_nsds.get("sapd", ()):
                        if cp_nsd["id"] == nss_cp_item["nsd-connection-point-ref"]:
                            if nslcmop.get("operationParams"):
                                if (
                                    nslcmop["operationParams"].get("nsName")
                                    == nss["nsName"]
                                ):
                                    vld_id = RO_item["vld_id"]
                                    netslice_scenario_id = RO_item[
                                        "netslice_scenario_id"
                                    ]
                                    nslcmop_vld = {}
                                    nslcmop_vld["name"] = cp_nsd["virtual-link-desc"]
                                    for vld in get_iterable(
                                        nslcmop["operationParams"], "vld"
                                    ):
                                        if vld["name"] == cp_nsd["virtual-link-desc"]:
                                            nslcmop_vld.update(vld)
                                    if self.ro_config["ng"]:
                                        nslcmop_vld["common_id"] = netslice_scenario_id
                                        nslcmop_vld.update(
                                            nsi_vld_instantiationi_params.get(
                                                RO_item["vld_id"], {}
                                            )
                                        )
                                    else:
                                        nslcmop_vld["ns-net"] = {
                                            vld_id: netslice_scenario_id
                                        }
                                    vld_op_list.append(nslcmop_vld)
            nslcmop["operationParams"]["vld"] = vld_op_list
            self.update_db_2(
                "nslcmops", nslcmop["_id"], {"operationParams.vld": vld_op_list}
            )
            return nsr_id, nslcmop

        try:
            # wait for any previous tasks in process
            await self.lcm_tasks.waitfor_related_HA("nsi", "nsilcmops", nsilcmop_id)

            step = "Getting nsir={} from db".format(nsir_id)
            db_nsir = self.db.get_one("nsis", {"_id": nsir_id})
            step = "Getting nsilcmop={} from db".format(nsilcmop_id)
            db_nsilcmop = self.db.get_one("nsilcmops", {"_id": nsilcmop_id})

            start_deploy = time()
            nsi_params = db_nsilcmop.get("operationParams")
            if nsi_params and nsi_params.get("timeout_nsi_deploy"):
                timeout_nsi_deploy = nsi_params["timeout_nsi_deploy"]
            else:
                timeout_nsi_deploy = self.timeout.get("nsi_deploy")

            # Empty list to keep track of network service records status in the netslice
            nsir_admin = db_nsir_admin = db_nsir.get("_admin")

            step = "Creating slice operational-status init"
            # Slice status Creating
            db_nsir_update["detailed-status"] = "creating"
            db_nsir_update["operational-status"] = "init"
            db_nsir_update["_admin.nsiState"] = "INSTANTIATED"

            step = "Instantiating netslice VLDs before NS instantiation"
            # Creating netslice VLDs networking before NS instantiation
            db_nsir_update["detailed-status"] = step
            self.update_db_2("nsis", nsir_id, db_nsir_update)
            db_nsir_update["_admin.deployed.RO"] = db_nsir_admin["deployed"]["RO"]
            for vld_item in get_iterable(nsir_admin, "netslice-vld"):
                await netslice_scenario_create(
                    self, vld_item, nsir_id, db_nsir, db_nsir_admin, db_nsir_update
                )

            step = "Instantiating netslice subnets"
            db_nsir_update["detailed-status"] = step
            self.update_db_2("nsis", nsir_id, db_nsir_update)

            db_nsir = self.db.get_one("nsis", {"_id": nsir_id})

            # Check status of the VLDs and wait for creation
            # netslice_scenarios = db_nsir["_admin"]["deployed"]["RO"]
            # db_nsir_update_RO = deepcopy(netslice_scenarios)
            # for netslice_scenario in netslice_scenarios:
            #    await netslice_scenario_check(self, netslice_scenario["netslice_scenario_id"],
            #                                  nsir_id, db_nsir_update_RO)

            # db_nsir_update["_admin.deployed.RO"] = db_nsir_update_RO
            # self.update_db_2("nsis", nsir_id, db_nsir_update)

            # Iterate over the network services operation ids to instantiate NSs
            step = "Instantiating Netslice Subnets"
            db_nsir = self.db.get_one("nsis", {"_id": nsir_id})
            nslcmop_ids = db_nsilcmop["operationParams"].get("nslcmops_ids")
            for nslcmop_id in nslcmop_ids:
                nslcmop = self.db.get_one("nslcmops", {"_id": nslcmop_id})
                # Overwriting netslice-vld vim-net-id to ns
                nsr_id, nslcmop = overwrite_nsd_params(self, db_nsir, nslcmop)
                step = "Launching ns={} instantiate={} task".format(nsr_id, nslcmop_id)
                task = asyncio.ensure_future(self.ns.instantiate(nsr_id, nslcmop_id))
                self.lcm_tasks.register(
                    "ns", nsr_id, nslcmop_id, "ns_instantiate", task
                )

            # Wait until Network Slice is ready
            step = " Waiting nsi ready."
            nsrs_detailed_list_old = None
            self.logger.debug(logging_text + step)

            # For HA, it is checked from database, as the ns operation may be managed by other LCM worker
            while time() <= start_deploy + timeout_nsi_deploy:
                # Check ns instantiation status
                nsi_ready = True
                nsir = self.db.get_one("nsis", {"_id": nsir_id})
                nsrs_detailed_list = nsir["_admin"]["nsrs-detailed-list"]
                nsrs_detailed_list_new = []
                for nslcmop_item in nslcmop_ids:
                    nslcmop = self.db.get_one("nslcmops", {"_id": nslcmop_item})
                    status = nslcmop.get("operationState")
                    # TODO: (future improvement) other possible status: ROLLING_BACK,ROLLED_BACK
                    for nss in nsrs_detailed_list:
                        if nss["nsrId"] == nslcmop["nsInstanceId"]:
                            nss.update(
                                {
                                    "nsrId": nslcmop["nsInstanceId"],
                                    "status": nslcmop["operationState"],
                                    "detailed-status": nslcmop.get("detailed-status"),
                                    "instantiated": True,
                                }
                            )
                            nsrs_detailed_list_new.append(nss)
                    if status not in [
                        "COMPLETED",
                        "PARTIALLY_COMPLETED",
                        "FAILED",
                        "FAILED_TEMP",
                    ]:
                        nsi_ready = False

                if nsrs_detailed_list_new != nsrs_detailed_list_old:
                    nsrs_detailed_list_old = nsrs_detailed_list_new
                    self.update_db_2(
                        "nsis",
                        nsir_id,
                        {"_admin.nsrs-detailed-list": nsrs_detailed_list_new},
                    )

                if nsi_ready:
                    error_list = []
                    step = "Network Slice Instance instantiated"
                    for nss in nsrs_detailed_list:
                        if nss["status"] in ("FAILED", "FAILED_TEMP"):
                            error_list.append(
                                "NS {} {}: {}".format(
                                    nss["nsrId"], nss["status"], nss["detailed-status"]
                                )
                            )
                    if error_list:
                        step = "instantiating"
                        raise LcmException("; ".join(error_list))
                    break

                # TODO: future improvement due to synchronism -> await asyncio.wait(vca_task_list, timeout=300)
                await asyncio.sleep(5, loop=self.loop)

            else:  # timeout_nsi_deploy reached:
                raise LcmException("Timeout waiting nsi to be ready.")

            db_nsir_update["operational-status"] = "running"
            db_nsir_update["detailed-status"] = "done"
            db_nsir_update["config-status"] = "configured"
            db_nsilcmop_update[
                "operationState"
            ] = nsilcmop_operation_state = "COMPLETED"
            db_nsilcmop_update["statusEnteredTime"] = time()
            db_nsilcmop_update["detailed-status"] = "done"
            return

        except (LcmException, DbException) as e:
            self.logger.error(
                logging_text + "Exit Exception while '{}': {}".format(step, e)
            )
            exc = e
        except asyncio.CancelledError:
            self.logger.error(
                logging_text + "Cancelled Exception while '{}'".format(step)
            )
            exc = "Operation was cancelled"
        except Exception as e:
            exc = traceback.format_exc()
            self.logger.critical(
                logging_text
                + "Exit Exception {} while '{}': {}".format(type(e).__name__, step, e),
                exc_info=True,
            )
        finally:
            if exc:
                if db_nsir:
                    db_nsir_update["detailed-status"] = "ERROR {}: {}".format(step, exc)
                    db_nsir_update["operational-status"] = "failed"
                    db_nsir_update["config-status"] = "configured"
                if db_nsilcmop:
                    db_nsilcmop_update["detailed-status"] = "FAILED {}: {}".format(
                        step, exc
                    )
                    db_nsilcmop_update[
                        "operationState"
                    ] = nsilcmop_operation_state = "FAILED"
                    db_nsilcmop_update["statusEnteredTime"] = time()
            try:
                if db_nsir:
                    db_nsir_update["_admin.nsilcmop"] = None
                    self.update_db_2("nsis", nsir_id, db_nsir_update)
                if db_nsilcmop:
                    self.update_db_2("nsilcmops", nsilcmop_id, db_nsilcmop_update)
            except DbException as e:
                self.logger.error(logging_text + "Cannot update database: {}".format(e))
            if nsilcmop_operation_state:
                try:
                    await self.msg.aiowrite(
                        "nsi",
                        "instantiated",
                        {
                            "nsir_id": nsir_id,
                            "nsilcmop_id": nsilcmop_id,
                            "operationState": nsilcmop_operation_state,
                        },
                    )
                except Exception as e:
                    self.logger.error(
                        logging_text + "kafka_write notification Exception {}".format(e)
                    )
            self.logger.debug(logging_text + "Exit")
            self.lcm_tasks.remove("nsi", nsir_id, nsilcmop_id, "nsi_instantiate")

    async def terminate(self, nsir_id, nsilcmop_id):
        # Try to lock HA task here
        task_is_locked_by_me = self.lcm_tasks.lock_HA("nsi", "nsilcmops", nsilcmop_id)
        if not task_is_locked_by_me:
            return

        logging_text = "Task nsi={} terminate={} ".format(nsir_id, nsilcmop_id)
        self.logger.debug(logging_text + "Enter")
        exc = None
        db_nsir = None
        db_nsilcmop = None
        db_nsir_update = {"_admin.nsilcmop": nsilcmop_id}
        db_nsilcmop_update = {}
        RO = ROclient.ROClient(self.loop, **self.ro_config)
        nsir_deployed = None
        failed_detail = []  # annotates all failed error messages
        nsilcmop_operation_state = None
        autoremove = False  # autoremove after terminated
        try:
            # wait for any previous tasks in process
            await self.lcm_tasks.waitfor_related_HA("nsi", "nsilcmops", nsilcmop_id)

            step = "Getting nsir={} from db".format(nsir_id)
            db_nsir = self.db.get_one("nsis", {"_id": nsir_id})
            nsir_deployed = deepcopy(db_nsir["_admin"].get("deployed"))
            step = "Getting nsilcmop={} from db".format(nsilcmop_id)
            db_nsilcmop = self.db.get_one("nsilcmops", {"_id": nsilcmop_id})

            # TODO: Check if makes sense check the nsiState=NOT_INSTANTIATED when terminate
            # CASE: Instance was terminated but there is a second request to terminate the instance
            if db_nsir["_admin"]["nsiState"] == "NOT_INSTANTIATED":
                return

            # Slice status Terminating
            db_nsir_update["operational-status"] = "terminating"
            db_nsir_update["config-status"] = "terminating"
            db_nsir_update["detailed-status"] = "Terminating Netslice subnets"
            self.update_db_2("nsis", nsir_id, db_nsir_update)

            # Gets the list to keep track of network service records status in the netslice
            nsrs_detailed_list = []

            # Iterate over the network services operation ids to terminate NSs
            # TODO: (future improvement) look another way check the tasks instead of keep asking
            # -> https://docs.python.org/3/library/asyncio-task.html#waiting-primitives
            # steps: declare ns_tasks, add task when terminate is called, await asyncio.wait(vca_task_list, timeout=300)
            step = "Terminating Netslice Subnets"
            nslcmop_ids = db_nsilcmop["operationParams"].get("nslcmops_ids")
            nslcmop_new = []
            for nslcmop_id in nslcmop_ids:
                nslcmop = self.db.get_one("nslcmops", {"_id": nslcmop_id})
                nsr_id = nslcmop["operationParams"].get("nsInstanceId")
                nss_in_use = self.db.get_list(
                    "nsis",
                    {
                        "_admin.netslice-vld.ANYINDEX.shared-nsrs-list": nsr_id,
                        "operational-status": {"$nin": ["terminated", "failed"]},
                    },
                )
                if len(nss_in_use) < 2:
                    task = asyncio.ensure_future(self.ns.terminate(nsr_id, nslcmop_id))
                    self.lcm_tasks.register(
                        "ns", nsr_id, nslcmop_id, "ns_instantiate", task
                    )
                    nslcmop_new.append(nslcmop_id)
                else:
                    # Update shared nslcmop shared with active nsi
                    netsliceInstanceId = db_nsir["_id"]
                    for nsis_item in nss_in_use:
                        if db_nsir["_id"] != nsis_item["_id"]:
                            netsliceInstanceId = nsis_item["_id"]
                            break
                    self.db.set_one(
                        "nslcmops",
                        {"_id": nslcmop_id},
                        {"operationParams.netsliceInstanceId": netsliceInstanceId},
                    )
            self.db.set_one(
                "nsilcmops",
                {"_id": nsilcmop_id},
                {"operationParams.nslcmops_ids": nslcmop_new},
            )

            # Wait until Network Slice is terminated
            step = nsir_status_detailed = " Waiting nsi terminated. nsi_id={}".format(
                nsir_id
            )
            nsrs_detailed_list_old = None
            self.logger.debug(logging_text + step)

            termination_timeout = 2 * 3600  # Two hours
            while termination_timeout > 0:
                # Check ns termination status
                nsi_ready = True
                db_nsir = self.db.get_one("nsis", {"_id": nsir_id})
                nsrs_detailed_list = db_nsir["_admin"].get("nsrs-detailed-list")
                nsrs_detailed_list_new = []
                for nslcmop_item in nslcmop_ids:
                    nslcmop = self.db.get_one("nslcmops", {"_id": nslcmop_item})
                    status = nslcmop["operationState"]
                    # TODO: (future improvement) other possible status: ROLLING_BACK,ROLLED_BACK
                    for nss in nsrs_detailed_list:
                        if nss["nsrId"] == nslcmop["nsInstanceId"]:
                            nss.update(
                                {
                                    "nsrId": nslcmop["nsInstanceId"],
                                    "status": nslcmop["operationState"],
                                    "detailed-status": nsir_status_detailed
                                    + "; {}".format(nslcmop.get("detailed-status")),
                                }
                            )
                            nsrs_detailed_list_new.append(nss)
                    if status not in [
                        "COMPLETED",
                        "PARTIALLY_COMPLETED",
                        "FAILED",
                        "FAILED_TEMP",
                    ]:
                        nsi_ready = False

                if nsrs_detailed_list_new != nsrs_detailed_list_old:
                    nsrs_detailed_list_old = nsrs_detailed_list_new
                    self.update_db_2(
                        "nsis",
                        nsir_id,
                        {"_admin.nsrs-detailed-list": nsrs_detailed_list_new},
                    )

                if nsi_ready:
                    # Check if it is the last used nss and mark isinstantiate: False
                    db_nsir = self.db.get_one("nsis", {"_id": nsir_id})
                    nsrs_detailed_list = db_nsir["_admin"].get("nsrs-detailed-list")
                    for nss in nsrs_detailed_list:
                        _filter = {
                            "_admin.nsrs-detailed-list.ANYINDEX.nsrId": nss["nsrId"],
                            "operational-status.ne": "terminated",
                            "_id.ne": nsir_id,
                        }
                        nsis_list = self.db.get_one(
                            "nsis", _filter, fail_on_empty=False, fail_on_more=False
                        )
                        if not nsis_list:
                            nss.update({"instantiated": False})

                    step = "Network Slice Instance is terminated. nsi_id={}".format(
                        nsir_id
                    )
                    for items in nsrs_detailed_list:
                        if "FAILED" in items.values():
                            raise LcmException(
                                "Error terminating NSI: {}".format(nsir_id)
                            )
                    break

                await asyncio.sleep(5, loop=self.loop)
                termination_timeout -= 5

            if termination_timeout <= 0:
                raise LcmException(
                    "Timeout waiting nsi to be terminated. nsi_id={}".format(nsir_id)
                )

            # Delete netslice-vlds
            RO_nsir_id = RO_delete_action = None
            for nsir_deployed_RO in get_iterable(nsir_deployed, "RO"):
                RO_nsir_id = nsir_deployed_RO.get("netslice_scenario_id")
                try:
                    if not self.ro_config["ng"]:
                        step = db_nsir_update[
                            "detailed-status"
                        ] = "Deleting netslice-vld at RO"
                        db_nsilcmop_update[
                            "detailed-status"
                        ] = "Deleting netslice-vld at RO"
                        self.logger.debug(logging_text + step)
                        desc = await RO.delete("ns", RO_nsir_id)
                        RO_delete_action = desc["action_id"]
                        nsir_deployed_RO["vld_delete_action_id"] = RO_delete_action
                        nsir_deployed_RO["vld_status"] = "DELETING"
                        db_nsir_update["_admin.deployed"] = nsir_deployed
                        self.update_db_2("nsis", nsir_id, db_nsir_update)
                        if RO_delete_action:
                            # wait until NS is deleted from VIM
                            step = "Waiting ns deleted from VIM. RO_id={}".format(
                                RO_nsir_id
                            )
                            self.logger.debug(logging_text + step)
                except ROclient.ROClientException as e:
                    if e.http_code == 404:  # not found
                        nsir_deployed_RO["vld_id"] = None
                        nsir_deployed_RO["vld_status"] = "DELETED"
                        self.logger.debug(
                            logging_text
                            + "RO_ns_id={} already deleted".format(RO_nsir_id)
                        )
                    elif e.http_code == 409:  # conflict
                        failed_detail.append(
                            "RO_ns_id={} delete conflict: {}".format(RO_nsir_id, e)
                        )
                        self.logger.debug(logging_text + failed_detail[-1])
                    else:
                        failed_detail.append(
                            "RO_ns_id={} delete error: {}".format(RO_nsir_id, e)
                        )
                        self.logger.error(logging_text + failed_detail[-1])

                if failed_detail:
                    self.logger.error(logging_text + " ;".join(failed_detail))
                    db_nsir_update["operational-status"] = "failed"
                    db_nsir_update["detailed-status"] = "Deletion errors " + "; ".join(
                        failed_detail
                    )
                    db_nsilcmop_update["detailed-status"] = "; ".join(failed_detail)
                    db_nsilcmop_update[
                        "operationState"
                    ] = nsilcmop_operation_state = "FAILED"
                    db_nsilcmop_update["statusEnteredTime"] = time()
                else:
                    db_nsir_update["operational-status"] = "terminating"
                    db_nsir_update["config-status"] = "terminating"
                    db_nsir_update["_admin.nsiState"] = "NOT_INSTANTIATED"
                    db_nsilcmop_update[
                        "operationState"
                    ] = nsilcmop_operation_state = "COMPLETED"
                    db_nsilcmop_update["statusEnteredTime"] = time()
                    if db_nsilcmop["operationParams"].get("autoremove"):
                        autoremove = True

            db_nsir_update["detailed-status"] = "done"
            db_nsir_update["operational-status"] = "terminated"
            db_nsir_update["config-status"] = "terminated"
            db_nsilcmop_update["statusEnteredTime"] = time()
            db_nsilcmop_update["detailed-status"] = "done"
            return

        except (LcmException, DbException) as e:
            self.logger.error(
                logging_text + "Exit Exception while '{}': {}".format(step, e)
            )
            exc = e
        except asyncio.CancelledError:
            self.logger.error(
                logging_text + "Cancelled Exception while '{}'".format(step)
            )
            exc = "Operation was cancelled"
        except Exception as e:
            exc = traceback.format_exc()
            self.logger.critical(
                logging_text
                + "Exit Exception {} while '{}': {}".format(type(e).__name__, step, e),
                exc_info=True,
            )
        finally:
            if exc:
                if db_nsir:
                    db_nsir_update["_admin.deployed"] = nsir_deployed
                    db_nsir_update["detailed-status"] = "ERROR {}: {}".format(step, exc)
                    db_nsir_update["operational-status"] = "failed"
                if db_nsilcmop:
                    db_nsilcmop_update["detailed-status"] = "FAILED {}: {}".format(
                        step, exc
                    )
                    db_nsilcmop_update[
                        "operationState"
                    ] = nsilcmop_operation_state = "FAILED"
                    db_nsilcmop_update["statusEnteredTime"] = time()
            try:
                if db_nsir:
                    db_nsir_update["_admin.deployed"] = nsir_deployed
                    db_nsir_update["_admin.nsilcmop"] = None
                    self.update_db_2("nsis", nsir_id, db_nsir_update)
                if db_nsilcmop:
                    self.update_db_2("nsilcmops", nsilcmop_id, db_nsilcmop_update)
            except DbException as e:
                self.logger.error(logging_text + "Cannot update database: {}".format(e))

            if nsilcmop_operation_state:
                try:
                    await self.msg.aiowrite(
                        "nsi",
                        "terminated",
                        {
                            "nsir_id": nsir_id,
                            "nsilcmop_id": nsilcmop_id,
                            "operationState": nsilcmop_operation_state,
                            "autoremove": autoremove,
                        },
                        loop=self.loop,
                    )
                except Exception as e:
                    self.logger.error(
                        logging_text + "kafka_write notification Exception {}".format(e)
                    )
            self.logger.debug(logging_text + "Exit")
            self.lcm_tasks.remove("nsi", nsir_id, nsilcmop_id, "nsi_terminate")
