1 # Copyright 2021 K Sai Kiran (Tata Elxsi)
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
7 # http://www.apache.org/licenses/LICENSE-2.0
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
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
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$"
19 from copy
import deepcopy
20 from osm_nbi
.descriptor_topics
import NsdTopic
21 from .base_methods
import BaseMethod
23 from osm_nbi
.instance_topics
import NsrTopic
, VnfrTopic
26 class VnfInstances2NsInstances
:
27 def __init__(self
, db
, fs
, msg
, auth
):
29 Constructor of Vnf Instances to Ns Instances
31 self
.new_vnf_instance
= NewVnfInstance(db
, fs
, msg
, auth
)
32 self
.list_vnf_instance
= ListVnfInstance(db
, fs
, msg
, auth
)
33 self
.show_vnf_instance
= ShowVnfInstance(db
, fs
, msg
, auth
)
34 self
.delete_vnf_instance
= DeleteVnfInstance(db
, fs
, msg
, auth
)
36 def new(self
, rollback
, session
, indata
=None, kwargs
=None, headers
=None):
38 Creates a new entry into database.
39 :param rollback: list to append created items at database in case a rollback may have to be done
40 :param session: contains "username", "admin", "force", "public", "project_id", "set_project"
41 :param indata: data to be inserted
42 :param kwargs: used to override the indata descriptor
43 :param headers: http request headers
45 _id: identity of the inserted data.
46 op_id: operation id if this is asynchronous, None otherwise
48 return self
.new_vnf_instance
.action(rollback
, session
, indata
, kwargs
, headers
)
50 def list(self
, session
, filter_q
=None, api_req
=False):
52 Get a list of the Vnfs that match a filter
53 :param session: contains the used login username and working project
54 :param filter_q: filter of data to be applied
55 :param api_req: True if this call is serving an external API request. False if serving internal request.
56 :return: The list, it can be empty if no one match the filter.
58 return self
.list_vnf_instance
.action(session
, filter_q
, api_req
)
60 def show(self
, session
, _id
, api_req
=False):
62 Get complete information on an Vnf
63 :param session: contains "username", "admin", "force", "public", "project_id", "set_project"
64 :param _id: server internal id
65 :param api_req: True if this call is serving an external API request. False if serving internal request.
66 :return: dictionary, raise exception if not found.
68 return self
.show_vnf_instance
.action(session
, _id
, api_req
)
70 def delete(self
, session
, _id
, dry_run
=False, not_send_msg
=None):
72 Delete item by its internal _id
73 :param session: contains "username", "admin", "force", "public", "project_id", "set_project"
74 :param _id: server internal id
75 :param dry_run: make checking but do not delete
76 :param not_send_msg: To not send message (False) or store content (list) instead
77 :return: operation id (None if there is not operation), raise exception if error or not found, conflict, ...
79 return self
.delete_vnf_instance
.action(session
, _id
, dry_run
, not_send_msg
)
82 class NewVnfInstance(BaseMethod
):
84 # sample ns descriptor
95 "virtual-link-connectivity": [
97 "constituent-cpd-id": [
99 "constituent-base-element-id": 1,
100 "constituent-cpd-id": "eth0-ext",
103 "virtual-link-profile-id": "mgmtnet",
106 "vnfd-id": "cirros_vnfd",
111 "vnfd-id": ["cirros_vnfd"],
112 "description": "Generated by OSM pacakage generator",
113 "id": "cirros_2vnf_nsd",
114 "name": "cirros_2vnf_ns",
115 "short-name": "cirros_2vnf_ns",
124 def __get_formatted_indata(indata
, nsd_id
):
126 Create indata for nsd_id
127 :param indata: Contains unformatted data for new vnf instance
128 :param nsd_id: Id of nsd
129 :return: formatted indata for nsd_id
131 formatted_indata
= deepcopy(indata
)
132 formatted_indata
["nsdId"] = nsd_id
133 formatted_indata
["nsName"] = indata
["vnfInstanceName"] + "-ns"
137 "vnfInstanceDescription",
140 formatted_indata
.pop(invalid_key
)
141 return formatted_indata
143 def __init__(self
, db
, fs
, msg
, auth
):
145 Constructor for new vnf instance
149 self
.nsdtopic
= NsdTopic(db
, fs
, msg
, auth
)
150 self
.nsrtopic
= NsrTopic(db
, fs
, msg
, auth
)
152 def __get_vnfd(self
):
156 def __onboard_vnfd(self
):
160 def __create_nsd(self
, rollback
, session
, indata
=None, kwargs
=None, headers
=None):
162 Creates new ns descriptor from a vnfd.
163 :param rollback: list to append the created items at database in case a rollback must be done
164 :param session: contains "username", "admin", "force", "public", "project_id", "set_project"
165 :param indata: params to be used for the nsr
166 :param kwargs: used to override the indata
167 :param headers: http request headers
168 :return: id of new nsd created
170 _id
, *others
= self
.nsdtopic
.new(rollback
, session
, {}, None, headers
)
171 new_nsd
= deepcopy(NewVnfInstance
.sample_nsd
)
177 "virtual-link-connectivity": [
179 "constituent-cpd-id": [
181 "constituent-base-element-id": "1",
182 "constituent-cpd-id": indata
["additionalParams"][
187 "virtual-link-profile-id": indata
["additionalParams"][
188 "virtual-link-profile-id"
192 "vnfd-id": indata
["vnfdId"],
196 new_nsd
["nsd"]["nsd"][0] = {
197 "description": indata
["vnfInstanceDescription"],
199 "id": indata
["vnfdId"] + "-ns",
200 "name": indata
["vnfdId"] + "-ns",
205 "virtual-link-desc": indata
["additionalParams"]["virtual-link-desc"],
206 "vnfd-id": [indata
["vnfdId"]],
210 def __create_nsr(self
, rollback
, session
, indata
=None, kwargs
=None, headers
=None):
212 Creates an new ns record in database
213 :param rollback: list to append the created items at database in case a rollback must be done
214 :param session: contains "username", "admin", "force", "public", "project_id", "set_project"
215 :param indata: params to be used for the nsr
216 :param kwargs: used to override the indata
217 :param headers: http request headers
218 :return: id of new nsr
220 return self
.nsrtopic
.new(rollback
, session
, indata
, kwargs
, headers
)
222 def __action_pre_processing(
223 self
, rollback
, session
, indata
=None, kwargs
=None, headers
=None
226 Pre process for creating new vnf instance
227 :param rollback: list to append the created items at database in case a rollback must be done
228 :param session: contains "username", "admin", "force", "public", "project_id", "set_project"
229 :param indata: params to be used for the nsr
230 :param kwargs: used to override the indata
231 :param headers: http request headers
234 self
.__onboard
_vnfd
()
235 nsd_id
, nsd
= self
.__create
_nsd
(rollback
, session
, indata
, kwargs
, headers
)
236 self
.nsdtopic
.upload_content(session
, nsd_id
, nsd
, kwargs
, headers
)
237 formatted_indata
= NewVnfInstance
.__get
_formatted
_indata
(indata
, nsd_id
)
238 nsr_id
, _
= self
.__create
_nsr
(
239 rollback
, session
, formatted_indata
, kwargs
, headers
241 nsr
= self
.nsrtopic
.show(session
, nsr_id
)
242 vnfr_id
= nsr
["constituent-vnfr-ref"][0]
244 links
= {"vnfInstance": "/osm/vnflcm/v1/vnf_instances/" + vnfr_id
}
245 indata
["vnfInstanceId"] = vnfr_id
246 indata
["_links"] = links
247 self
.msg
.write("vnf", "create", indata
)
250 def action(self
, rollback
, session
, indata
=None, kwargs
=None, headers
=None):
252 Creates an new vnf instance
253 :param rollback: list to append the created items at database in case a rollback must be done
254 :param session: contains "username", "admin", "force", "public", "project_id", "set_project"
255 :param indata: params to be used for the nsr
256 :param kwargs: used to override the indata
257 :param headers: http request headers
258 :return: id of new vnf instance
260 return self
.__action
_pre
_processing
(rollback
, session
, indata
, kwargs
, headers
)
263 class ListVnfInstance(BaseMethod
):
264 def __init__(self
, db
, fs
, msg
, auth
):
266 Constructor call for listing vnfs
269 self
.vnfrtopic
= VnfrTopic(db
, fs
, msg
, auth
)
271 def action(self
, session
, filter_q
=None, api_req
=False):
273 To get list of vnfs that matches a filter
274 :param session: contains the used login username and working project
275 :param filter_q: filter of data to be applied
276 :param api_req: True if this call is serving an external API request. False if serving internal request.
277 :return: The list, it can be empty if no one match the filter.
279 return self
.vnfrtopic
.list(session
, filter_q
, api_req
)
282 class ShowVnfInstance(BaseMethod
):
283 def __init__(self
, db
, fs
, msg
, auth
):
285 Constructor call for showing vnf lcm operation
288 self
.vnfrtopic
= VnfrTopic(db
, fs
, msg
, auth
)
290 def action(self
, session
, _id
, api_req
=False):
292 Get complete information on an Vnf Lcm Operation.
293 :param session: contains "username", "admin", "force", "public", "project_id", "set_project"
294 :param _id: Vnf Lcm operation id
295 :param api_req: True if this call is serving an external API request. False if serving internal request.
296 :return: dictionary, raise exception if not found.
298 return self
.vnfrtopic
.show(session
, _id
, api_req
)
301 class DeleteVnfInstance(BaseMethod
):
302 def __init__(self
, db
, fs
, msg
, auth
):
304 Constructor call for deleting vnf
308 self
.nsrtopic
= NsrTopic(db
, fs
, msg
, auth
)
309 self
.nsdtopic
= NsdTopic(db
, fs
, msg
, auth
)
310 self
.vnfrtopic
= VnfrTopic(db
, fs
, msg
, auth
)
312 def action(self
, session
, _id
, dry_run
=False, not_send_msg
=None):
314 Delete vnf instance by its internal _id
315 :param session: contains "username", "admin", "force", "public", "project_id", "set_project"
316 :param _id: server internal id
317 :param dry_run: make checking but do not delete
318 :param not_send_msg: To not send message (False) or store content (list) instead
319 :return: operation id (None if there is not operation), raise exception if error or not found, conflict, ...
322 vnfr
= self
.vnfrtopic
.show(session
, vnfInstanceId
)
323 ns_id
= vnfr
.get("nsr-id-ref")
324 nsr
= self
.nsrtopic
.show(session
, ns_id
)
325 nsd_to_del
= nsr
["nsd"]["_id"]
326 links
= {"vnfInstance": "/osm/vnflcm/v1/vnf_instances/" + _id
}
327 params
= {"vnfdId": vnfr
["vnfd-ref"], "vnfInstanceId": _id
, "_links": links
}
328 self
.msg
.write("vnf", "delete", params
)
329 self
.nsrtopic
.delete(session
, ns_id
, dry_run
, not_send_msg
)
330 return self
.nsdtopic
.delete(session
, nsd_to_del
, dry_run
, not_send_msg
)