Feature 8840 Notify without auth and typo fixes
[osm/NBI.git] / osm_nbi / validation.py
index ac0dcd9..beea575 100644 (file)
@@ -43,7 +43,7 @@ time_schema = {"type": "string", "pattern": "^[0-9]{4}-[0-1][0-9]-[0-3][0-9]T[0-
 pci_schema = {"type": "string", "pattern": "^[0-9a-fA-F]{4}(:[0-9a-fA-F]{2}){2}\\.[0-9a-fA-F]$"}
 # allows [] for wildcards. For that reason huge length limit is set
 pci_extended_schema = {"type": "string", "pattern": "^[0-9a-fA-F.:-\\[\\]]{12,40}$"}
-http_schema = {"type": "string", "pattern": "^https?://[^'\"=]+$"}
+http_schema = {"type": "string", "pattern": "^(https?|http)://[^'\"=]+$"}
 bandwidth_schema = {"type": "string", "pattern": "^[0-9]+ *([MG]bps)?$"}
 memory_schema = {"type": "string", "pattern": "^[0-9]+ *([MG]i?[Bb])?$"}
 integer0_schema = {"type": "integer", "minimum": 0}
@@ -145,7 +145,7 @@ ip_profile_dhcp_schema = {
 }
 
 ip_profile_schema = {
-    "title": "ip profile validation schame",
+    "title": "ip profile validation schema",
     "$schema": "http://json-schema.org/draft-04/schema#",
     "type": "object",
     "properties": {
@@ -158,7 +158,7 @@ ip_profile_schema = {
 }
 
 ip_profile_update_schema = {
-    "title": "ip profile validation schame",
+    "title": "ip profile validation schema",
     "$schema": "http://json-schema.org/draft-04/schema#",
     "type": "object",
     "properties": {
@@ -173,14 +173,28 @@ ip_profile_update_schema = {
 }
 
 provider_network_schema = {
-    "title": "provider network validation schame",
+    "title": "provider network validation schema",
     "$schema": "http://json-schema.org/draft-04/schema#",
     "type": "object",
     "properties": {
         "physical-network": name_schema,
         "segmentation-id": name_schema,
+        "sdn-ports": {  # external ports to append to the SDN-assist network
+            "type": "array",
+            "items": {
+                "type": "object",
+                "properties": {
+                    "switch_id": shortname_schema,
+                    "switch_port": shortname_schema,
+                    "mac_address": mac_schema,
+                    "vlan": vlan_schema,
+                },
+                "additionalProperties": True
+            }
+        },
+        "network-type": shortname_schema,
     },
-    "additionalProperties": False
+    "additionalProperties": True
 }
 
 ns_instantiate_internal_vld = {
@@ -221,6 +235,8 @@ additional_params_for_vnf = {
         "properties": {
             "member-vnf-index": name_schema,
             "additionalParams": object_schema,
+            "k8s-namespace": name_schema,
+            "config-units": integer1_schema,  # number of configuration units of this vnf, by default 1
             "additionalParamsForVdu": {
                 "type": "array",
                 "items": {
@@ -228,8 +244,10 @@ additional_params_for_vnf = {
                     "properties": {
                         "vdu_id": name_schema,
                         "additionalParams": object_schema,
+                        "config-units": integer1_schema,   # number of configuration units of this vdu, by default 1
                     },
-                    "required": ["vdu_id", "additionalParams"],
+                    "required": ["vdu_id"],
+                    "minProperties": 2,
                     "additionalProperties": False,
                 },
             },
@@ -240,8 +258,12 @@ additional_params_for_vnf = {
                     "properties": {
                         "kdu_name": name_schema,
                         "additionalParams": object_schema,
+                        "kdu_model": name_schema,
+                        "k8s-namespace": name_schema,
+                        "config-units": integer1_schema,    # number of configuration units of this knf, by default 1
                     },
-                    "required": ["kdu_name", "additionalParams"],
+                    "required": ["kdu_name"],
+                    "minProperties": 2,
                     "additionalProperties": False,
                 },
             },
@@ -269,6 +291,8 @@ ns_instantiate = {
         "placement-constraints": object_schema,
         "additionalParamsForNs": object_schema,
         "additionalParamsForVnf": additional_params_for_vnf,
+        "config-units": integer1_schema,    # number of configuration units of this ns, by default 1
+        "k8s-namespace": name_schema,
         "ssh_keys": {"type": "array", "items": {"type": "string"}},
         "timeout_ns_deploy": integer1_schema,
         "nsr_id": id_schema,
@@ -336,6 +360,21 @@ ns_instantiate = {
     "additionalProperties": False
 }
 
+ns_terminate = {
+    "title": "ns terminate input schema",
+    "$schema": "http://json-schema.org/draft-04/schema#",
+    "type": "object",
+    "properties": {
+        "lcmOperationType": string_schema,
+        "nsInstanceId": id_schema,
+        "autoremove": bool_schema,
+        "timeout_ns_terminate": integer1_schema,
+        "skip_terminate_primitives": bool_schema,
+        "netsliceInstanceId": id_schema,
+    },
+    "additionalProperties": False
+}
+
 ns_action = {   # TODO for the moment it is only contemplated the vnfd primitive execution
     "title": "ns action input schema",
     "$schema": "http://json-schema.org/draft-04/schema#",
@@ -349,6 +388,7 @@ ns_action = {   # TODO for the moment it is only contemplated the vnfd primitive
         "vdu_count_index": integer0_schema,
         "kdu_name": name_schema,
         "primitive": name_schema,
+        "timeout_ns_action": integer1_schema,
         "primitive_params": {"type": "object"},
     },
     "required": ["primitive", "primitive_params"],   # TODO add member_vnf_index
@@ -362,6 +402,7 @@ ns_scale = {   # TODO for the moment it is only VDU-scaling
         "lcmOperationType": string_schema,
         "nsInstanceId": id_schema,
         "scaleType": {"enum": ["SCALE_VNF"]},
+        "timeout_ns_scale": integer1_schema,
         "scaleVnfData": {
             "type": "object",
             "properties": {
@@ -616,6 +657,32 @@ k8srepo_edit_schema = {
     "additionalProperties": False
 }
 
+# OSM Repos
+osmrepo_types = {"enum": ["osm"]}
+osmrepo_properties = {
+    "name": name_schema,
+    "description": description_schema,
+    "type": osmrepo_types,
+    "url": description_schema
+    # "user": shortname_schema,
+    # "password": passwd_schema
+}
+osmrepo_new_schema = {
+    "title": "osm repo creation input schema",
+    "$schema": "http://json-schema.org/draft-04/schema#",
+    "type": "object",
+    "properties": osmrepo_properties,
+    "required": ["name", "type", "url"],
+    "additionalProperties": False
+}
+osmrepo_edit_schema = {
+    "title": "osm repo edit input schema",
+    "$schema": "http://json-schema.org/draft-04/schema#",
+    "type": "object",
+    "properties": osmrepo_properties,
+    "additionalProperties": False
+}
+
 # PDUs
 pdu_interface = {
     "type": "object",
@@ -657,7 +724,6 @@ pdu_new_schema = {
     "required": ["name", "type", "interfaces"],
     "additionalProperties": False
 }
-
 pdu_edit_schema = {
     "title": "pdu edit input schema",
     "$schema": "http://json-schema.org/draft-04/schema#",
@@ -682,6 +748,22 @@ pdu_edit_schema = {
     "minProperties": 1
 }
 
+# VNF PKG OPERATIONS
+vnfpkgop_new_schema = {
+    "title": "VNF PKG operation creation input schema",
+    "$schema": "http://json-schema.org/draft-04/schema#",
+    "type": "object",
+    "properties": {
+        "lcmOperationType": string_schema,
+        "vnfPkgId": id_schema,
+        "kdu_name": name_schema,
+        "primitive": name_schema,
+        "primitive_params": {"type": "object"},
+    },
+    "required": ["lcmOperationType", "vnfPkgId", "kdu_name", "primitive", "primitive_params"],
+    "additionalProperties": False
+}
+
 # USERS
 project_role_mappings = {
     "title": "list pf projects/roles",
@@ -719,6 +801,7 @@ user_new_schema = {
     "type": "object",
     "properties": {
         "username": shortname_schema,
+        "domain_name": shortname_schema,
         "password": passwd_schema,
         "projects": nameshort_list_schema,
         "project_role_mappings": project_role_mappings,
@@ -748,8 +831,8 @@ user_edit_schema = {
 }
 
 # PROJECTS
-topics_with_quota = ["vnfds", "nsds", "nsts", "pdus", "nsrs", "nsis", "vim_accounts", "wim_accounts", "sdns",
-                     "k8sclusters", "k8srepos"]
+topics_with_quota = ["vnfds", "nsds", "slice_templates", "pduds", "ns_instances", "slice_instances", "vim_accounts",
+                     "wim_accounts", "sdn_controllers", "k8sclusters", "k8srepos", "osmrepos", "ns_subscriptions"]
 project_new_schema = {
     "$schema": "http://json-schema.org/draft-04/schema#",
     "title": "New project schema for administrators",
@@ -757,6 +840,7 @@ project_new_schema = {
     "properties": {
         "name": shortname_schema,
         "admin": bool_schema,
+        "domain_name": shortname_schema,
         "quotas": {
             "type": "object",
             "properties": {topic: integer0_schema for topic in topics_with_quota},
@@ -874,7 +958,7 @@ nsi_instantiate = {
         "nstId": string_schema,
         "vimAccountId": id_schema,
         "timeout_nsi_deploy": integer1_schema,
-        "ssh_keys": {"type": "string"},
+        "ssh_keys": {"type": "array", "items": {"type": "string"}},
         "nsi_id": id_schema,
         "additionalParamsForNsi": object_schema,
         "netslice-subnet": {
@@ -900,6 +984,129 @@ nsi_terminate = {
 
 }
 
+nsinstancesubscriptionfilter_schema = {
+    "title": "instance identifier schema",
+    "$schema": "http://json-schema.org/draft-07/schema#",
+    "type": "object",
+    "properties": {
+        "nsdIds": {"type": "array"},
+        "vnfdIds": {"type": "array"},
+        "pnfdIds": {"type": "array"},
+        "nsInstanceIds": {"type": "array"},
+        "nsInstanceNames": {"type": "array"},
+    },
+}
+
+nslcmsub_schema = {
+    "title": "nslcmsubscription input schema",
+    "$schema": "http://json-schema.org/draft-07/schema#",
+    "type": "object",
+    "properties": {
+        "nsInstanceSubscriptionFilter": nsinstancesubscriptionfilter_schema,
+        "notificationTypes": {
+            "type": "array",
+            "items": {
+                "enum": ['NsLcmOperationOccurrenceNotification', 'NsChangeNotification',
+                         'NsIdentifierCreationNotification', 'NsIdentifierDeletionNotification']
+            }
+        },
+        "operationTypes": {
+            "type": "array",
+            "items": {
+                "enum": ['INSTANTIATE', 'SCALE', 'TERMINATE', 'UPDATE', 'HEAL']
+            }
+        },
+        "operationStates": {
+            "type": "array",
+            "items": {
+                "enum": ['PROCESSING', 'COMPLETED', 'PARTIALLY_COMPLETED', 'FAILED',
+                         'FAILED_TEMP', 'ROLLING_BACK', 'ROLLED_BACK']
+            }
+        },
+        "nsComponentTypes": {
+            "type": "array",
+            "items": {
+                "enum": ['VNF', 'NS', 'PNF']
+            }
+        },
+        "lcmOpNameImpactingNsComponent": {
+            "type": "array",
+            "items": {
+                "enum": ['VNF_INSTANTIATE', 'VNF_SCALE', 'VNF_SCALE_TO_LEVEL', 'VNF_CHANGE_FLAVOUR',
+                         'VNF_TERMINATE', 'VNF_HEAL', 'VNF_OPERATE', 'VNF_CHANGE_EXT_CONN', 'VNF_MODIFY_INFO',
+                         'NS_INSTANTIATE', 'NS_SCALE', 'NS_UPDATE', 'NS_TERMINATE', 'NS_HEAL']
+            }
+        },
+        "lcmOpOccStatusImpactingNsComponent": {
+            "type": "array",
+            "items": {
+                "enum": ['START', 'COMPLETED', 'PARTIALLY_COMPLETED', 'FAILED', 'ROLLED_BACK']
+            }
+        },
+    },
+    "allOf": [
+        {
+            "if": {
+                "properties": {
+                    "notificationTypes": {
+                        "contains": {"const": "NsLcmOperationOccurrenceNotification"}
+                    }
+                },
+            },
+            "then": {
+                "anyOf": [
+                    {"required": ["operationTypes"]},
+                    {"required": ["operationStates"]},
+                ]
+            } 
+        },
+        {
+            "if": {
+                "properties": {
+                    "notificationTypes": {
+                        "contains": {"const": "NsChangeNotification"}
+                    }
+                },
+            },
+            "then": {
+                "anyOf": [
+                    {"required": ["nsComponentTypes"]},
+                    {"required": ["lcmOpNameImpactingNsComponent"]},
+                    {"required": ["lcmOpOccStatusImpactingNsComponent"]},
+                ]
+            }
+        }
+    ]
+}
+
+authentication_schema = {
+    "title": "authentication schema for subscription",
+    "$schema": "http://json-schema.org/draft-07/schema#",
+    "type": "object",
+    "properties": {
+        "authType": {"enum": ["basic"]},
+        "paramsBasic": {
+            "type": "object",
+            "properties": {
+                "userName": shortname_schema,
+                "password": passwd_schema,
+            },
+        },
+    },
+}
+
+subscription = {
+    "title": "subscription input schema",
+    "$schema": "http://json-schema.org/draft-07/schema#",
+    "type": "object",
+    "properties": {
+        "filter": nslcmsub_schema,
+        "CallbackUri": description_schema,
+        "authentication": authentication_schema
+    },
+    "required": ["CallbackUri"],
+}
+
 
 class ValidationError(Exception):
     def __init__(self, message, http_code=HTTPStatus.UNPROCESSABLE_ENTITY):