VDU scaling
[osm/NBI.git] / osm_nbi / validation.py
index ba78c55..cb249ba 100644 (file)
@@ -15,11 +15,14 @@ patern_name = "^[ -~]+$"
 passwd_schema = {"type": "string", "minLength": 1, "maxLength": 60}
 nameshort_schema = {"type": "string", "minLength": 1, "maxLength": 60, "pattern": "^[^,;()'\"]+$"}
 name_schema = {"type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[^,;()'\"]+$"}
 passwd_schema = {"type": "string", "minLength": 1, "maxLength": 60}
 nameshort_schema = {"type": "string", "minLength": 1, "maxLength": 60, "pattern": "^[^,;()'\"]+$"}
 name_schema = {"type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[^,;()'\"]+$"}
+string_schema = {"type": "string", "minLength": 1, "maxLength": 255}
 xml_text_schema = {"type": "string", "minLength": 1, "maxLength": 1000, "pattern": "^[^']+$"}
 description_schema = {"type": ["string", "null"], "maxLength": 255, "pattern": "^[^'\"]+$"}
 id_schema_fake = {"type": "string", "minLength": 2,
 xml_text_schema = {"type": "string", "minLength": 1, "maxLength": 1000, "pattern": "^[^']+$"}
 description_schema = {"type": ["string", "null"], "maxLength": 255, "pattern": "^[^'\"]+$"}
 id_schema_fake = {"type": "string", "minLength": 2,
-                  "maxLength": 36}  # "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$"
+                  "maxLength": 36}
+# "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$"
 id_schema = {"type": "string", "pattern": "^[a-fA-F0-9]{8}(-[a-fA-F0-9]{4}){3}-[a-fA-F0-9]{12}$"}
 id_schema = {"type": "string", "pattern": "^[a-fA-F0-9]{8}(-[a-fA-F0-9]{4}){3}-[a-fA-F0-9]{12}$"}
+time_schema = {"type": "string", "pattern": "^[0-9]{4}-[0-1][0-9]-[0-3][0-9]T[0-2][0-9]([0-5]:){2}"}
 pci_schema = {"type": "string", "pattern": "^[0-9a-fA-F]{4}(:[0-9a-fA-F]{2}){2}\.[0-9a-fA-F]$"}
 http_schema = {"type": "string", "pattern": "^https?://[^'\"=]+$"}
 bandwidth_schema = {"type": "string", "pattern": "^[0-9]+ *([MG]bps)?$"}
 pci_schema = {"type": "string", "pattern": "^[0-9a-fA-F]{4}(:[0-9a-fA-F]{2}){2}\.[0-9a-fA-F]$"}
 http_schema = {"type": "string", "pattern": "^https?://[^'\"=]+$"}
 bandwidth_schema = {"type": "string", "pattern": "^[0-9]+ *([MG]bps)?$"}
@@ -35,7 +38,8 @@ mac_schema = {"type": "string",
 ip_schema = {"type": "string",
              "pattern": "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"}
 ip_prefix_schema = {"type": "string",
 ip_schema = {"type": "string",
              "pattern": "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"}
 ip_prefix_schema = {"type": "string",
-                    "pattern": "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/(30|[12]?[0-9])$"}
+                    "pattern": "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}"
+                               "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/(30|[12]?[0-9])$"}
 port_schema = {"type": "integer", "minimum": 1, "maximum": 65534}
 object_schema = {"type": "object"}
 schema_version_2 = {"type": "integer", "minimum": 2, "maximum": 2}
 port_schema = {"type": "integer", "minimum": 1, "maximum": 65534}
 object_schema = {"type": "object"}
 schema_version_2 = {"type": "integer", "minimum": 2, "maximum": 2}
@@ -49,17 +53,82 @@ ns_instantiate = {
     "title": "ns action instantiate input schema",
     "$schema": "http://json-schema.org/draft-04/schema#",
     "type": "object",
     "title": "ns action instantiate input schema",
     "$schema": "http://json-schema.org/draft-04/schema#",
     "type": "object",
+    "properties": {
+        "nsName": name_schema,
+        "nsDescription": description_schema,
+        "nsdId": id_schema,
+        "vimAccountId": id_schema,
+        "ssh_keys": {"type": "string"},
+        "vnf": {
+            "type": "array",
+            "minItems": 1,
+            "items": {
+                "type": "object",
+                "properties": {
+                    "member-vnf-index": name_schema,
+                    "vimAccountId": id_schema,
+                },
+                "required": ["member-vnf-index"]
+            }
+        },
+        "vld": {
+            "type": "array",
+            "minItems": 1,
+            "items": {
+                "type": "object",
+                "properties": {
+                    "name": string_schema,
+                    "vim-network-name": {"OneOf": [string_schema, object_schema]},
+                    "ip-profile": object_schema,
+                },
+                "required": ["name"]
+            }
+        },
+    },
+    "required": ["nsName", "nsdId", "vimAccountId"]
 }
 }
+
 ns_action = {   # TODO for the moment it is only contemplated the vnfd primitive execution
 ns_action = {   # TODO for the moment it is only contemplated the vnfd primitive execution
-    "title": "ns action update input schema",
+    "title": "ns action input schema",
     "$schema": "http://json-schema.org/draft-04/schema#",
     "type": "object",
     "properties": {
     "$schema": "http://json-schema.org/draft-04/schema#",
     "type": "object",
     "properties": {
-        "vnf_member_index": name_schema,
+        "member_vnf_index": name_schema,
+        "vnf_member_index": name_schema,  # TODO for backward compatibility. To remove in future
         "primitive": name_schema,
         "primitive_params": {"type": "object"},
     },
         "primitive": name_schema,
         "primitive_params": {"type": "object"},
     },
-    "required": ["vnf_member_index", "primitive", "primitive_params"],
+    "required": ["primitive", "primitive_params"],   # TODO add member_vnf_index
+    "additionalProperties": False
+}
+ns_scale = {   # TODO for the moment it is only VDU-scaling
+    "title": "ns scale input schema",
+    "$schema": "http://json-schema.org/draft-04/schema#",
+    "type": "object",
+    "properties": {
+        "scaleType": {"enum": ["SCALE_VNF"]},
+        "scaleVnfData": {
+            "type": "object",
+            "properties": {
+                "vnfInstanceId": name_schema,
+                "scaleVnfType": {"enum": ["SCALE_OUT", 'SCALE_IN']},
+                "scaleByStepData": {
+                    "type": "object",
+                    "properties": {
+                        "scaling-group-descriptor": name_schema,
+                        "member-vnf-index": name_schema,
+                        "scaling-policy": name_schema,
+                    },
+                    "required": ["scaling-group-descriptor", "member-vnf-index"],
+                    "additionalProperties": False
+                },
+            },
+            "required": ["scaleVnfType", "scaleByStepData"],  # vnfInstanceId
+            "additionalProperties": False
+        },
+        "scaleTime": time_schema,
+    },
+    "required": ["scaleType", "scaleVnfData"],
     "additionalProperties": False
 }
 
     "additionalProperties": False
 }
 
@@ -181,6 +250,7 @@ nbi_new_input_schemas = {
     "sdns": sdn_new_schema,
     "ns_instantiate": ns_instantiate,
     "ns_action": ns_action,
     "sdns": sdn_new_schema,
     "ns_instantiate": ns_instantiate,
     "ns_action": ns_action,
+    "ns_scale": ns_scale
 }
 
 nbi_edit_input_schemas = {
 }
 
 nbi_edit_input_schemas = {
@@ -211,7 +281,7 @@ def validate_input(indata, item, new=True):
         return None
     except js_e.ValidationError as e:
         if e.path:
         return None
     except js_e.ValidationError as e:
         if e.path:
-            error_pos = "at '" + ":".join(e.path) + "'"
+            error_pos = "at '" + ":".join(map(str, e.path)) + "'"
         else:
             error_pos = ""
         raise ValidationError("Format error {} '{}' ".format(error_pos, e))
         else:
             error_pos = ""
         raise ValidationError("Format error {} '{}' ".format(error_pos, e))