Update valid_url methods and schemas to support app instance update 55/15655/9 v19.0 v19.0.0
authorgarciadeblas <gerardo.garciadeblas@telefonica.com>
Fri, 16 Jan 2026 01:51:15 +0000 (02:51 +0100)
committergarciadeblas <gerardo.garciadeblas@telefonica.com>
Thu, 29 Jan 2026 21:58:54 +0000 (22:58 +0100)
Change-Id: Idf27c858f4b5dd5ee6281f541ad8d2ce89d6bff0
Signed-off-by: garciadeblas <gerardo.garciadeblas@telefonica.com>
osm_nbi/engine.py
osm_nbi/k8s_topics.py
osm_nbi/nbi.py
osm_nbi/validation.py

index 101167c..129f709 100644 (file)
@@ -379,13 +379,6 @@ class Engine(object):
                 session, _id, indata, not_send_msg=None
             )
 
-    def update_appinstance(self, session, topic, _id, item, indata):
-        if topic not in self.map_topic:
-            raise EngineException(
-                "Unknown topic {}!!!".format(topic), HTTPStatus.INTERNAL_SERVER_ERROR
-            )
-        return self.map_topic[topic].update_appinstance(session, _id, item, indata)
-
     def get_item_list(self, session, topic, filter_q=None, api_req=False):
         """
         Get a list of items
index 9b5b84d..a17c293 100644 (file)
@@ -42,6 +42,8 @@ from osm_nbi.validation import (
     attach_dettach_profile_schema,
     ksu_schema,
     app_instance_schema,
+    app_instance_edit_schema,
+    app_instance_update_schema,
     oka_schema,
     node_create_new_schema,
     node_edit_schema,
@@ -1412,7 +1414,7 @@ class AppInstanceTopic(ACMTopic):
     okapkg_topic = "okas"
     topic_msg = "appinstance"
     schema_new = app_instance_schema
-    schema_edit = app_instance_schema
+    schema_edit = app_instance_edit_schema
 
     def __init__(self, db, fs, msg, auth):
         super().__init__(db, fs, msg, auth)
@@ -1526,26 +1528,30 @@ class AppInstanceTopic(ACMTopic):
         except ValidationError as e:
             raise EngineException(e, HTTPStatus.UNPROCESSABLE_ENTITY)
 
-    def update_appinstance(self, session, _id, item, indata):
+    def update_item(self, session, _id, item, indata):
         if not self.multiproject:
             filter_db = {}
         else:
             filter_db = self._get_project_filter(session)
         # To allow project&user addressing by name AS WELL AS _id
         filter_db[BaseTopic.id_field(self.topic, _id)] = _id
-        validate_input(indata, app_instance_schema)
+        self.logger.info(f"Item: {item}")
+        self.logger.info(f"Indata before validation: {indata}")
+        validate_input(indata, app_instance_update_schema)
+        self.logger.info(f"Indata after validation: {indata}")
         data = self.db.get_one(self.topic, filter_db)
         operation_params = {}
         data["operatingState"] = "PROCESSING"
         data["resourceState"] = "IN_PROGRESS"
         operation_params = indata
+        self.logger.info(f"Operation params: {operation_params}")
         op_id = self.format_on_operation(
             data,
-            item,
+            "update",
             operation_params,
         )
         self.db.set_one(self.topic, {"_id": _id}, data)
-        self._send_msg(item, {"appinstance": _id, "operation_id": op_id})
+        self._send_msg("update", {"appinstance": _id, "operation_id": op_id})
         return op_id
 
     def delete(self, session, _id, not_send_msg=None):
index f723ff5..22e6105 100644 (file)
@@ -823,10 +823,10 @@ valid_url_methods = {
                 "<ID>": {
                     "METHODS": ("GET", "PATCH", "DELETE"),
                     "ROLE_PERMISSION": "appinstance:id:",
-                },
-                "update": {
-                    "METHODS": ("POST",),
-                    "ROLE_PERMISSION": "appinstance:",
+                    "update": {
+                        "METHODS": ("POST",),
+                        "ROLE_PERMISSION": "appinstance:id:update:",
+                    },
                 },
             },
         }
@@ -2100,8 +2100,8 @@ class Server(object):
                     )
                     outdata = {"op_id": op_id}
                 elif topic == "appinstances" and item == "update":
-                    op_id = self.engine.update_appinstance(
-                        engine_session, engine_topic, _id, indata, kwargs
+                    op_id = self.engine.update_item(
+                        engine_session, engine_topic, _id, item, indata
                     )
                     outdata = {"op_id": op_id}
                 elif topic == "clusters" and item in ("upgrade", "scale"):
index 2c2972d..1a82a1a 100644 (file)
@@ -1849,6 +1849,29 @@ app_instance_schema = {
     "required": ["name", "profile", "profile_type"],
 }
 
+app_instance_edit_schema = {
+    "title": "app instance edit schema",
+    "$schema": "http://json-schema.org/draft-04/schema#",
+    "type": "object",
+    "properties": {
+        "name": name_schema,
+        "description": string_schema,
+    },
+    "additionalProperties": False,
+}
+
+app_instance_update_schema = {
+    "title": "app instance update schema",
+    "$schema": "http://json-schema.org/draft-04/schema#",
+    "type": "object",
+    "properties": {
+        "model": object_schema,
+        "params": object_schema,
+        "secret_params": object_schema,
+    },
+    "additionalProperties": True,
+}
+
 
 class ValidationError(Exception):
     def __init__(self, message, http_code=HTTPStatus.UNPROCESSABLE_ENTITY):