X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FNBI.git;a=blobdiff_plain;f=osm_nbi%2Fnbi.py;h=1354f2cae797c6e7251703841285dc94e8cee4e7;hp=0414dba631f12e6dbb6ebfda57da85f065b8b027;hb=07f3172ef24dab2c7c47c9a8e726f1f9876f13b3;hpb=de4adfeade8cfe69c2ee6701f80a5421bd003236 diff --git a/osm_nbi/nbi.py b/osm_nbi/nbi.py index 0414dba..1354f2c 100644 --- a/osm_nbi/nbi.py +++ b/osm_nbi/nbi.py @@ -32,7 +32,7 @@ auth_database_version = '1.0' """ North Bound Interface (O: OSM specific; 5,X: SOL005 not implemented yet; O5: SOL005 implemented) URL: /osm GET POST PUT DELETE PATCH - /nsd/v1 O O + /nsd/v1 /ns_descriptors_content O O / O O O O /ns_descriptors O5 O5 @@ -75,9 +75,11 @@ URL: /osm GET POST / O /subscriptions 5 5 / 5 X + /pdu/v1 /pdu_descriptor O O / O O O O + /admin/v1 /tokens O O / O O @@ -90,6 +92,30 @@ URL: /osm GET POST /sdns O O / O O O + /nst/v1 O O + /netslice_templates_content O O + / O O O O + /netslice_templates O O + / O O O + /nst_content O O + /nst O + /artifacts[/] O + /subscriptions X X + / X X + + /nsilcm/v1 + /netslice_instances_content O O + / O O + /netslice_instances O O + / O O + instantiate O + terminate O + action O + /nsi_lcm_op_occs O O + / O O O + /subscriptions X X + / X X + query string: Follows SOL005 section 4.3.2 It contains extra METHOD to override http method, FORCE to force. For filtering inside array, it must select the element of the array, or add ANYINDEX to apply the filtering over any @@ -247,6 +273,40 @@ class Server(object): }, } }, + "nst": { + "v1": { + "netslice_templates_content": {"METHODS": ("GET", "POST"), + "": {"METHODS": ("GET", "PUT", "DELETE")} + }, + "netslice_templates": {"METHODS": ("GET", "POST"), + "": {"METHODS": ("GET", "DELETE"), "TODO": "PATCH", + "nst_content": {"METHODS": ("GET", "PUT")}, + "nst": {"METHODS": "GET"}, # descriptor inside package + "artifacts": {"*": {"METHODS": "GET"}} + } + }, + "subscriptions": {"TODO": ("GET", "POST"), + "": {"TODO": ("GET", "DELETE")} + }, + } + }, + "nsilcm": { + "v1": { + "netslice_instances_content": {"METHODS": ("GET", "POST"), + "": {"METHODS": ("GET", "DELETE")} + }, + "netslice_instances": {"METHODS": ("GET", "POST"), + "": {"METHODS": ("GET", "DELETE"), + "terminate": {"METHODS": "POST"}, + "instantiate": {"METHODS": "POST"}, + "action": {"METHODS": "POST"}, + } + }, + "nsi_lcm_op_occs": {"METHODS": "GET", + "": {"METHODS": "GET"}, + }, + } + }, } def _format_in(self, kwargs): @@ -601,7 +661,7 @@ class Server(object): if not main_topic or not version or not topic: raise NbiException("URL must contain at least 'main_topic/version/topic'", HTTPStatus.METHOD_NOT_ALLOWED) - if main_topic not in ("admin", "vnfpkgm", "nsd", "nslcm"): + if main_topic not in ("admin", "vnfpkgm", "nsd", "nslcm", "nst", "nsilcm"): raise NbiException("URL main_topic '{}' not supported".format(main_topic), HTTPStatus.METHOD_NOT_ALLOWED) if version != 'v1': @@ -615,9 +675,7 @@ class Server(object): force = kwargs.pop("FORCE") else: force = False - self._check_valid_url_method(method, main_topic, version, topic, _id, item, *args) - if main_topic == "admin" and topic == "tokens": return self.token(method, _id, kwargs) @@ -640,14 +698,20 @@ class Server(object): engine_topic = "nslcmops" if topic == "vnfrs" or topic == "vnf_instances": engine_topic = "vnfrs" + elif main_topic == "nst": + engine_topic = "nsts" + elif main_topic == "nsilcm": + engine_topic = "nsis" + if topic == "nsi_lcm_op_occs": + engine_topic = "nsilcmops" elif main_topic == "pdu": engine_topic = "pdus" if engine_topic == "vims": # TODO this is for backward compatibility, it will remove in the future engine_topic = "vim_accounts" if method == "GET": - if item in ("nsd_content", "package_content", "artifacts", "vnfd", "nsd"): - if item in ("vnfd", "nsd"): + if item in ("nsd_content", "package_content", "artifacts", "vnfd", "nsd", "nst", "nst_content"): + if item in ("vnfd", "nsd", "nst"): path = "$DESCRIPTOR" elif args: path = args @@ -663,7 +727,7 @@ class Server(object): else: outdata = self.engine.get_item(session, engine_topic, _id) elif method == "POST": - if topic in ("ns_descriptors_content", "vnf_packages_content"): + if topic in ("ns_descriptors_content", "vnf_packages_content", "netslice_templates_content"): _id = cherrypy.request.headers.get("Transaction-Id") if not _id: _id = self.engine.new_item(rollback, session, engine_topic, {}, None, cherrypy.request.headers, @@ -691,6 +755,22 @@ class Server(object): self._set_location_header(main_topic, version, "ns_lcm_op_occs", _id) outdata = {"id": _id} cherrypy.response.status = HTTPStatus.ACCEPTED.value + elif topic == "netslice_instances_content": + # creates NetSlice_Instance_record (NSIR) + _id = self.engine.new_item(rollback, session, engine_topic, indata, kwargs, force=force) + self._set_location_header(main_topic, version, topic, _id) + indata["lcmOperationType"] = "instantiate" + indata["nsiInstanceId"] = _id + self.engine.new_item(rollback, session, "nsilcmops", indata, kwargs) + outdata = {"id": _id} + + elif topic == "netslice_instances" and item: + indata["lcmOperationType"] = item + indata["nsiInstanceId"] = _id + _id = self.engine.new_item(rollback, session, "nsilcmops", indata, kwargs) + self._set_location_header(main_topic, version, "nsi_lcm_op_occs", _id) + outdata = {"id": _id} + cherrypy.response.status = HTTPStatus.ACCEPTED.value else: _id = self.engine.new_item(rollback, session, engine_topic, indata, kwargs, cherrypy.request.headers, force=force) @@ -713,6 +793,15 @@ class Server(object): opp_id = self.engine.new_item(rollback, session, "nslcmops", nslcmop_desc, None) outdata = {"_id": opp_id} cherrypy.response.status = HTTPStatus.ACCEPTED.value + elif topic == "netslice_instances_content" and not force: + nsilcmop_desc = { + "lcmOperationType": "terminate", + "nsiInstanceId": _id, + "autoremove": True + } + opp_id = self.engine.new_item(rollback, session, "nsilcmops", nsilcmop_desc, None) + outdata = {"_id": opp_id} + cherrypy.response.status = HTTPStatus.ACCEPTED.value else: self.engine.del_item(session, engine_topic, _id, force) cherrypy.response.status = HTTPStatus.NO_CONTENT.value @@ -724,7 +813,7 @@ class Server(object): if not indata and not kwargs: raise NbiException("Nothing to update. Provide payload and/or query string", HTTPStatus.BAD_REQUEST) - if item in ("nsd_content", "package_content") and method == "PUT": + if item in ("nsd_content", "package_content", "nst_content") and method == "PUT": completed = self.engine.upload_content(session, engine_topic, _id, indata, kwargs, cherrypy.request.headers, force=force) if not completed: @@ -750,7 +839,11 @@ class Server(object): rollback.reverse() for rollback_item in rollback: try: - self.engine.del_item(**rollback_item, session=session, force=True) + if rollback_item.get("operation") == "set": + self.engine.db.set_one(rollback_item["topic"], {"_id": rollback_item["_id"]}, + rollback_item["content"], fail_on_empty=False) + else: + self.engine.del_item(**rollback_item, session=session, force=True) except Exception as e2: rollback_error_text = "Rollback Exception {}: {}".format(rollback_item, e2) cherrypy.log(rollback_error_text)