X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FNBI.git;a=blobdiff_plain;f=osm_nbi%2Fnbi.py;h=f8c564dd484e9553ab7b4686f1459fa2cf296bae;hp=ff8cd11bd8ab122b42f2825fa5e47bd6adb51516;hb=cd54a4add397e6f0921a77e97444d32c7a748975;hpb=e128118419c3bb413de4cff8445b9b6c5598a5ed diff --git a/osm_nbi/nbi.py b/osm_nbi/nbi.py index ff8cd11..f8c564d 100644 --- a/osm_nbi/nbi.py +++ b/osm_nbi/nbi.py @@ -59,7 +59,7 @@ URL: /osm GET POST /ns_instances_content O O / O O /ns_instances 5 5 - / 5 5 + / O5 O5 instantiate O5 terminate O5 action O @@ -68,15 +68,15 @@ URL: /osm GET POST /ns_lcm_op_occs 5 5 / 5 5 5 TO BE COMPLETED 5 5 - /vnfrs O - / O + /vnf_instances (also vnfrs for compatibility) O + / O /subscriptions 5 5 / 5 X /admin/v1 /tokens O O / O O /users O O - / O O + / O O O O /projects O O / O O /vims_accounts (also vims for compatibility) O O @@ -152,7 +152,7 @@ class Server(object): "": {"METHODS": ("GET", "DELETE")} }, "users": {"METHODS": ("GET", "POST"), - "": {"METHODS": ("GET", "POST", "DELETE")} + "": {"METHODS": ("GET", "POST", "DELETE", "PATCH", "PUT")} }, "projects": {"METHODS": ("GET", "POST"), "": {"METHODS": ("GET", "DELETE")} @@ -196,7 +196,7 @@ class Server(object): "": {"METHODS": ("GET", "PUT", "DELETE")} }, "vnf_packages": {"METHODS": ("GET", "POST"), - "": {"METHODS": ("GET", "DELETE"), "TODO": "PATCH", # GET: vnfPkgInfo + "": {"METHODS": ("GET", "DELETE", "PATCH"), # GET: vnfPkgInfo "package_content": {"METHODS": ("GET", "PUT"), # package "upload_from_uri": {"TODO": "POST"} }, @@ -215,8 +215,8 @@ class Server(object): "": {"METHODS": ("GET", "DELETE")} }, "ns_instances": {"METHODS": ("GET", "POST"), - "": {"TODO": ("GET", "DELETE"), - "scale": {"TODO": "POST"}, + "": {"METHODS": ("GET", "DELETE"), + "scale": {"METHODS": "POST"}, "terminate": {"METHODS": "POST"}, "instantiate": {"METHODS": "POST"}, "action": {"METHODS": "POST"}, @@ -228,6 +228,9 @@ class Server(object): "vnfrs": {"METHODS": ("GET"), "": {"METHODS": ("GET")} }, + "vnf_instances": {"METHODS": ("GET"), + "": {"METHODS": ("GET")} + }, } }, } @@ -508,7 +511,7 @@ class Server(object): return f elif len(args) == 2 and args[0] == "db-clear": - return self.engine.del_item_list({"project_id": "admin"}, args[1], {}) + return self.engine.del_item_list({"project_id": "admin", "admin": True}, args[1], kwargs) elif args and args[0] == "prune": return self.engine.prune() elif args and args[0] == "login": @@ -616,7 +619,8 @@ class Server(object): _format = None method = "DONE" engine_item = None - rollback = None + rollback = [] + session = None try: if not topic or not version or not item: raise NbiException("URL must contain at least 'topic/version/item'", HTTPStatus.METHOD_NOT_ALLOWED) @@ -656,7 +660,7 @@ class Server(object): engine_item = "nsrs" if item == "ns_lcm_op_occs": engine_item = "nslcmops" - if item == "vnfrs": + if item == "vnfrs" or item == "vnf_instances": engine_item = "vnfrs" if engine_item == "vims": # TODO this is for backward compatibility, it will remove in the future engine_item = "vim_accounts" @@ -682,9 +686,8 @@ class Server(object): if item in ("ns_descriptors_content", "vnf_packages_content"): _id = cherrypy.request.headers.get("Transaction-Id") if not _id: - _id = self.engine.new_item(session, engine_item, {}, None, cherrypy.request.headers, + _id = self.engine.new_item(rollback, session, engine_item, {}, None, cherrypy.request.headers, force=force) - rollback = {"session": session, "item": engine_item, "_id": _id, "force": True} completed = self.engine.upload_content(session, engine_item, _id, indata, kwargs, cherrypy.request.headers) if completed: @@ -693,18 +696,17 @@ class Server(object): cherrypy.response.headers["Transaction-Id"] = _id outdata = {"id": _id} elif item == "ns_instances_content": - _id = self.engine.new_item(session, engine_item, indata, kwargs, force=force) - rollback = {"session": session, "item": engine_item, "_id": _id, "force": True} - self.engine.ns_operation(session, _id, "instantiate", {}, None) + _id = self.engine.new_item(rollback, session, engine_item, indata, kwargs, force=force) + self.engine.ns_operation(rollback, session, _id, "instantiate", indata, None) self._set_location_header(topic, version, item, _id) outdata = {"id": _id} elif item == "ns_instances" and item2: - _id = self.engine.ns_operation(session, _id, item2, indata, kwargs) + _id = self.engine.ns_operation(rollback, session, _id, item2, indata, kwargs) self._set_location_header(topic, version, "ns_lcm_op_occs", _id) outdata = {"id": _id} cherrypy.response.status = HTTPStatus.ACCEPTED.value else: - _id = self.engine.new_item(session, engine_item, indata, kwargs, cherrypy.request.headers, + _id = self.engine.new_item(rollback, session, engine_item, indata, kwargs, cherrypy.request.headers, force=force) self._set_location_header(topic, version, item, _id) outdata = {"id": _id} @@ -716,8 +718,9 @@ class Server(object): outdata = self.engine.del_item_list(session, engine_item, kwargs) cherrypy.response.status = HTTPStatus.OK.value else: # len(args) > 1 - if item == "ns_instances_content": - opp_id = self.engine.ns_operation(session, _id, "terminate", {"autoremove": True}, None) + if item == "ns_instances_content" and not force: + opp_id = self.engine.ns_operation(rollback, session, _id, "terminate", {"autoremove": True}, + None) outdata = {"_id": opp_id} cherrypy.response.status = HTTPStatus.ACCEPTED.value else: @@ -727,6 +730,7 @@ class Server(object): cherrypy.response.status = HTTPStatus.ACCEPTED.value elif method in ("PUT", "PATCH"): + outdata = None if not indata and not kwargs: raise NbiException("Nothing to update. Provide payload and/or query string", HTTPStatus.BAD_REQUEST) @@ -735,10 +739,9 @@ class Server(object): cherrypy.request.headers) if not completed: cherrypy.response.headers["Transaction-Id"] = id - cherrypy.response.status = HTTPStatus.NO_CONTENT.value - outdata = None else: - outdata = {"id": self.engine.edit_item(session, engine_item, _id, indata, kwargs, force=force)} + self.engine.edit_item(session, engine_item, _id, indata, kwargs, force=force) + cherrypy.response.status = HTTPStatus.NO_CONTENT.value else: raise NbiException("Method {} not allowed".format(method), HTTPStatus.METHOD_NOT_ALLOWED) return self._format_out(outdata, session, _format) @@ -747,11 +750,11 @@ class Server(object): cherrypy.response.status = e.http_code.value if hasattr(outdata, "close"): # is an open file outdata.close() - if rollback: + for rollback_item in rollback: try: - self.engine.del_item(**rollback) + self.engine.del_item(**rollback_item, session=session, force=True) except Exception as e2: - cherrypy.log("Rollback Exception {}: {}".format(rollback, e2)) + cherrypy.log("Rollback Exception {}: {}".format(rollback_item, e2)) error_text = str(e) if isinstance(e, MsgException): error_text = "{} has been '{}' but other modules cannot be informed because an error on bus".format(