Feature 10915: SOL003 STD Support for OSM
[osm/NBI.git] / osm_nbi / osm_vnfm / vnf_instance_actions.py
1 # Copyright 2021 K Sai Kiran (Tata Elxsi)
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
12 # implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15
16 __author__ = "K Sai Kiran <saikiran.k@tataelxsi.co.in>, Selvi Jayaraman <selvi.j@tataelxsi.co.in>"
17 __date__ = "$12-June-2021 8:30:59$"
18
19 from osm_nbi.instance_topics import NsrTopic, NsLcmOpTopic, VnfrTopic
20 from .base_methods import BaseMethod
21
22
23 class VnfLcmOp2NsLcmOp:
24
25 def __init__(self, db, fs, msg, auth):
26 """
27 Constructor of Vnf lcm op to Ns lcm op
28 """
29 self.new_vnf_lcmop = NewVnfLcmOp(db, fs, msg, auth)
30 self.list_vnf_lcmop = ListVnfLcmOp(db, fs, msg, auth)
31 self.show_vnf_lcmop = ShowVnfLcmOp(db, fs, msg, auth)
32
33 def new(self, rollback, session, indata=None, kwargs=None, headers=None):
34 """
35 Creates a new entry into database.
36 :param rollback: list to append created items at database in case a rollback may to be done
37 :param session: contains "username", "admin", "force", "public", "project_id", "set_project"
38 :param indata: data to be inserted
39 :param kwargs: used to override the indata descriptor
40 :param headers: http request headers
41 :return: _id, op_id:
42 _id: identity of the inserted data.
43 op_id: operation id if this is asynchronous, None otherwise
44 """
45 return self.new_vnf_lcmop.action(rollback, session, indata, kwargs, headers)
46
47 def list(self, session, filter_q=None, api_req=False):
48 """
49 Get a list of the Vnf Lcm Operation that matches a filter
50 :param session: contains the used login username and working project
51 :param filter_q: filter of data to be applied
52 :param api_req: True if this call is serving an external API request. False if serving internal request.
53 :return: The list, it can be empty if no one match the filter.
54 """
55 return self.list_vnf_lcmop.action(session, filter_q, api_req)
56
57 def show(self, session, _id, api_req=False):
58 """
59 Get complete information on an Vnf Lcm Operation
60 :param session: contains "username", "admin", "force", "public", "project_id", "set_project"
61 :param _id: server internal id
62 :param api_req: True if this call is serving an external API request. False if serving internal request.
63 :return: dictionary, raise exception if not found.
64 """
65 return self.show_vnf_lcmop.action(session, _id, api_req)
66
67
68 class NewVnfLcmOp(BaseMethod):
69
70 def __init__(self, db, fs, msg, auth):
71 """
72 Constructor of new Vnf Lcm Op
73 """
74 super().__init__()
75 self.msg = msg
76 self.nslcmoptopic = NsLcmOpTopic(db, fs, msg, auth)
77 self.nsrtopic = NsrTopic(db, fs, msg, auth)
78 self.vnfrtopic = VnfrTopic(db, fs, msg, auth)
79
80 def __get_nsdid(self, session, vnf_instance_id):
81 """
82 Returns a nsd id from vnf instance id.
83 :param session: contains the used login username and working project
84 :param vnf_instance_id: id of vnf instance
85 :return: id of nsd id
86 """
87 nsr = self.nsrtopic.show(session, vnf_instance_id)
88 return nsr['nsd']['_id']
89
90 def __get_formatted_indata(self, session, indata):
91 """
92 Returns formatted data for new vnf lcm op
93 :param session: contains the used login username and working project
94 :param indata: contains information for new lcm operation.
95 :return: formatted indata for new lcm op.
96 """
97 formatted_indata = {}
98 if indata["lcmOperationType"] == "instantiate":
99 formatted_indata = {
100 "nsName": indata["vnfName"],
101 "nsDescription": indata["vnfDescription"],
102 "nsdId": self.__get_nsdid(session, indata["vnfInstanceId"]),
103 "vimAccountId": indata["vimAccountId"],
104 "nsr_id": indata["vnfInstanceId"],
105 "lcmOperationType": indata["lcmOperationType"],
106 "nsInstanceId": indata["vnfInstanceId"]
107 }
108 elif indata["lcmOperationType"] == "terminate":
109 formatted_indata = {
110 "lcmOperationType": indata["lcmOperationType"],
111 "nsInstanceId": indata["vnfInstanceId"]
112 }
113 elif indata["lcmOperationType"] == "scale":
114 formatted_indata = {
115 "lcmOperationType": indata["lcmOperationType"],
116 "nsInstanceId": indata["vnfInstanceId"],
117 "scaleType": "SCALE_VNF",
118 "scaleVnfData": {
119 "scaleVnfType": indata["type"],
120 "scaleByStepData": {
121 "scaling-group-descriptor": indata["aspectId"],
122 "member-vnf-index": indata["additionalParams"]["member-vnf-index"]
123 }
124 }
125 }
126 elif indata["lcmOperationType"] == "action":
127 formatted_indata = {
128 "lcmOperationType": indata["lcmOperationType"],
129 "nsInstanceId": indata["vnfInstanceId"],
130 "member_vnf_index": indata["member_vnf_index"],
131 "primitive": indata["primitive"],
132 "primitive_params": indata["primitive_params"]
133 }
134 return formatted_indata
135
136 def action(self, rollback, session, indata=None, kwargs=None, headers=None):
137 """
138 Creates an new lcm operation.
139 :param rollback: list to append the created items at database in case a rollback must be done
140 :param session: contains "username", "admin", "force", "public", "project_id", "set_project"
141 :param indata: params to be used for the nsr
142 :param kwargs: used to override the indata
143 :param headers: http request headers
144 :return: id of new lcm operation.
145 """
146 vnfInstanceId = indata["vnfInstanceId"]
147 lcm_operation = indata["lcmOperationType"]
148 vnfr = self.vnfrtopic.show(session, vnfInstanceId)
149 indata["vnfInstanceId"] = vnfr.get("nsr-id-ref")
150 indata = self.__get_formatted_indata(session, indata)
151 op_id, _ = self.nslcmoptopic.new(rollback, session, indata, kwargs, headers)
152 return op_id, _
153
154
155 class ListVnfLcmOp(BaseMethod):
156
157 def __init__(self, db, fs, msg, auth):
158 """
159 Constructor call for listing vnf lcm operations
160 """
161 super().__init__()
162 self.nslcmoptopic = NsLcmOpTopic(db, fs, msg, auth)
163 self.nsrtopic = NsrTopic(db, fs, msg, auth)
164
165 def action(self, session, filter_q=None, api_req=False):
166 """
167 To get list of vnf lcm operations that matches a filter
168 :param session: contains the used login username and working project
169 :param filter_q: filter of data to be applied
170 :param api_req: True if this call is serving an external API request. False if serving internal request.
171 :return: The list, it can be empty if no one match the filter.
172 """
173 list = []
174 records = self.nslcmoptopic.list(session, filter_q, api_req)
175 for record in records:
176 ns_id = record.get("nsInstanceId")
177 nsr = self.nsrtopic.show(session, ns_id)
178 vnfInstance_id = nsr['constituent-vnfr-ref'][0]
179 outdata = sol003_projection(record, vnfInstance_id)
180 list.append(outdata)
181 return list
182
183
184 class ShowVnfLcmOp(BaseMethod):
185
186 def __init__(self, db, fs, msg, auth):
187 """
188 Constructor call for showing vnf lcm operation
189 """
190 super().__init__()
191 self.nslcmoptopic = NsLcmOpTopic(db, fs, msg, auth)
192 self.nsrtopic = NsrTopic(db, fs, msg, auth)
193
194 def action(self, session, _id, api_req=False):
195 """
196 Get complete information on an Vnf Lcm Operation.
197 :param session: contains "username", "admin", "force", "public", "project_id", "set_project"
198 :param _id: Vnf Lcm operation id
199 :param api_req: True if this call is serving an external API request. False if serving internal request.
200 :return: dictionary, raise exception if not found.
201 """
202 record = self.nslcmoptopic.show(session, _id, api_req)
203 ns_id = record.get("nsInstanceId")
204 nsr = self.nsrtopic.show(session, ns_id)
205 vnfinstance_id = nsr['constituent-vnfr-ref'][0]
206 outdata = sol003_projection(record, vnfinstance_id)
207 return outdata
208
209
210 def sol003_projection(data, vnfinstance_id):
211 """
212 Returns SOL003 formatted data
213 :param data: contains Lcm Operation information
214 :param vnfinstance_id: id of vnf_instance
215 :return: SOL003 formatted data of vnf lcm op
216 """
217 data.pop("nsInstanceId")
218 data.pop("operationParams")
219 data.pop("links")
220 links = {
221 "self": "/osm/vnflcm/v1/vnf_lcm_op_occs/" + data["_id"],
222 "vnfInstance": "/osm/vnflcm/v1/vnf_instances/" + vnfinstance_id,
223 }
224 data["_links"] = links
225 data["vnfInstanceId"] = vnfinstance_id
226 return data