X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FNBI.git;a=blobdiff_plain;f=osm_nbi%2Fosm_vnfm%2Fvnf_instance_actions.py;fp=osm_nbi%2Fosm_vnfm%2Fvnf_instance_actions.py;h=93c91c5569a041ae0c529b9a52a84eedaa921d41;hp=0000000000000000000000000000000000000000;hb=59e9d88971c2f513c85ca7095a1e8493f9ebb513;hpb=a9a1fc8427db17f47ea7ff782e35d24be4094f95 diff --git a/osm_nbi/osm_vnfm/vnf_instance_actions.py b/osm_nbi/osm_vnfm/vnf_instance_actions.py new file mode 100644 index 0000000..93c91c5 --- /dev/null +++ b/osm_nbi/osm_vnfm/vnf_instance_actions.py @@ -0,0 +1,226 @@ +# Copyright 2021 K Sai Kiran (Tata Elxsi) +# +# 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. + +__author__ = "K Sai Kiran , Selvi Jayaraman " +__date__ = "$12-June-2021 8:30:59$" + +from osm_nbi.instance_topics import NsrTopic, NsLcmOpTopic, VnfrTopic +from .base_methods import BaseMethod + + +class VnfLcmOp2NsLcmOp: + + def __init__(self, db, fs, msg, auth): + """ + Constructor of Vnf lcm op to Ns lcm op + """ + self.new_vnf_lcmop = NewVnfLcmOp(db, fs, msg, auth) + self.list_vnf_lcmop = ListVnfLcmOp(db, fs, msg, auth) + self.show_vnf_lcmop = ShowVnfLcmOp(db, fs, msg, auth) + + def new(self, rollback, session, indata=None, kwargs=None, headers=None): + """ + Creates a new entry into database. + :param rollback: list to append created items at database in case a rollback may to be done + :param session: contains "username", "admin", "force", "public", "project_id", "set_project" + :param indata: data to be inserted + :param kwargs: used to override the indata descriptor + :param headers: http request headers + :return: _id, op_id: + _id: identity of the inserted data. + op_id: operation id if this is asynchronous, None otherwise + """ + return self.new_vnf_lcmop.action(rollback, session, indata, kwargs, headers) + + def list(self, session, filter_q=None, api_req=False): + """ + Get a list of the Vnf Lcm Operation that matches a filter + :param session: contains the used login username and working project + :param filter_q: filter of data to be applied + :param api_req: True if this call is serving an external API request. False if serving internal request. + :return: The list, it can be empty if no one match the filter. + """ + return self.list_vnf_lcmop.action(session, filter_q, api_req) + + def show(self, session, _id, api_req=False): + """ + Get complete information on an Vnf Lcm Operation + :param session: contains "username", "admin", "force", "public", "project_id", "set_project" + :param _id: server internal id + :param api_req: True if this call is serving an external API request. False if serving internal request. + :return: dictionary, raise exception if not found. + """ + return self.show_vnf_lcmop.action(session, _id, api_req) + + +class NewVnfLcmOp(BaseMethod): + + def __init__(self, db, fs, msg, auth): + """ + Constructor of new Vnf Lcm Op + """ + super().__init__() + self.msg = msg + self.nslcmoptopic = NsLcmOpTopic(db, fs, msg, auth) + self.nsrtopic = NsrTopic(db, fs, msg, auth) + self.vnfrtopic = VnfrTopic(db, fs, msg, auth) + + def __get_nsdid(self, session, vnf_instance_id): + """ + Returns a nsd id from vnf instance id. + :param session: contains the used login username and working project + :param vnf_instance_id: id of vnf instance + :return: id of nsd id + """ + nsr = self.nsrtopic.show(session, vnf_instance_id) + return nsr['nsd']['_id'] + + def __get_formatted_indata(self, session, indata): + """ + Returns formatted data for new vnf lcm op + :param session: contains the used login username and working project + :param indata: contains information for new lcm operation. + :return: formatted indata for new lcm op. + """ + formatted_indata = {} + if indata["lcmOperationType"] == "instantiate": + formatted_indata = { + "nsName": indata["vnfName"], + "nsDescription": indata["vnfDescription"], + "nsdId": self.__get_nsdid(session, indata["vnfInstanceId"]), + "vimAccountId": indata["vimAccountId"], + "nsr_id": indata["vnfInstanceId"], + "lcmOperationType": indata["lcmOperationType"], + "nsInstanceId": indata["vnfInstanceId"] + } + elif indata["lcmOperationType"] == "terminate": + formatted_indata = { + "lcmOperationType": indata["lcmOperationType"], + "nsInstanceId": indata["vnfInstanceId"] + } + elif indata["lcmOperationType"] == "scale": + formatted_indata = { + "lcmOperationType": indata["lcmOperationType"], + "nsInstanceId": indata["vnfInstanceId"], + "scaleType": "SCALE_VNF", + "scaleVnfData": { + "scaleVnfType": indata["type"], + "scaleByStepData": { + "scaling-group-descriptor": indata["aspectId"], + "member-vnf-index": indata["additionalParams"]["member-vnf-index"] + } + } + } + elif indata["lcmOperationType"] == "action": + formatted_indata = { + "lcmOperationType": indata["lcmOperationType"], + "nsInstanceId": indata["vnfInstanceId"], + "member_vnf_index": indata["member_vnf_index"], + "primitive": indata["primitive"], + "primitive_params": indata["primitive_params"] + } + return formatted_indata + + def action(self, rollback, session, indata=None, kwargs=None, headers=None): + """ + Creates an new lcm operation. + :param rollback: list to append the created items at database in case a rollback must be done + :param session: contains "username", "admin", "force", "public", "project_id", "set_project" + :param indata: params to be used for the nsr + :param kwargs: used to override the indata + :param headers: http request headers + :return: id of new lcm operation. + """ + vnfInstanceId = indata["vnfInstanceId"] + lcm_operation = indata["lcmOperationType"] + vnfr = self.vnfrtopic.show(session, vnfInstanceId) + indata["vnfInstanceId"] = vnfr.get("nsr-id-ref") + indata = self.__get_formatted_indata(session, indata) + op_id, _ = self.nslcmoptopic.new(rollback, session, indata, kwargs, headers) + return op_id, _ + + +class ListVnfLcmOp(BaseMethod): + + def __init__(self, db, fs, msg, auth): + """ + Constructor call for listing vnf lcm operations + """ + super().__init__() + self.nslcmoptopic = NsLcmOpTopic(db, fs, msg, auth) + self.nsrtopic = NsrTopic(db, fs, msg, auth) + + def action(self, session, filter_q=None, api_req=False): + """ + To get list of vnf lcm operations that matches a filter + :param session: contains the used login username and working project + :param filter_q: filter of data to be applied + :param api_req: True if this call is serving an external API request. False if serving internal request. + :return: The list, it can be empty if no one match the filter. + """ + list = [] + records = self.nslcmoptopic.list(session, filter_q, api_req) + for record in records: + ns_id = record.get("nsInstanceId") + nsr = self.nsrtopic.show(session, ns_id) + vnfInstance_id = nsr['constituent-vnfr-ref'][0] + outdata = sol003_projection(record, vnfInstance_id) + list.append(outdata) + return list + + +class ShowVnfLcmOp(BaseMethod): + + def __init__(self, db, fs, msg, auth): + """ + Constructor call for showing vnf lcm operation + """ + super().__init__() + self.nslcmoptopic = NsLcmOpTopic(db, fs, msg, auth) + self.nsrtopic = NsrTopic(db, fs, msg, auth) + + def action(self, session, _id, api_req=False): + """ + Get complete information on an Vnf Lcm Operation. + :param session: contains "username", "admin", "force", "public", "project_id", "set_project" + :param _id: Vnf Lcm operation id + :param api_req: True if this call is serving an external API request. False if serving internal request. + :return: dictionary, raise exception if not found. + """ + record = self.nslcmoptopic.show(session, _id, api_req) + ns_id = record.get("nsInstanceId") + nsr = self.nsrtopic.show(session, ns_id) + vnfinstance_id = nsr['constituent-vnfr-ref'][0] + outdata = sol003_projection(record, vnfinstance_id) + return outdata + + +def sol003_projection(data, vnfinstance_id): + """ + Returns SOL003 formatted data + :param data: contains Lcm Operation information + :param vnfinstance_id: id of vnf_instance + :return: SOL003 formatted data of vnf lcm op + """ + data.pop("nsInstanceId") + data.pop("operationParams") + data.pop("links") + links = { + "self": "/osm/vnflcm/v1/vnf_lcm_op_occs/" + data["_id"], + "vnfInstance": "/osm/vnflcm/v1/vnf_instances/" + vnfinstance_id, + } + data["_links"] = links + data["vnfInstanceId"] = vnfinstance_id + return data