from jsonschema import validate as js_v, exceptions as js_e
from http import HTTPStatus
from copy import deepcopy
+from uuid import UUID # To test for valid UUID
__author__ = "Alfonso Tierno <alfonso.tiernosepulveda@telefonica.com>"
__version__ = "0.1"
"name": string_schema,
"vim-network-name": {"OneOf": [string_schema, object_schema]},
"vim-network-id": {"OneOf": [string_schema, object_schema]},
+ "ns-net": object_schema,
"wimAccountId": {"OneOf": [id_schema, bool_schema, null_schema]},
"ip-profile": object_schema,
"vnfd-connection-point-ref": {
"description": description_schema,
"vim": name_schema,
"datacenter": name_schema,
- "vim_type": {"enum": ["openstack", "openvim", "vmware", "opennebula", "aws"]},
+ "vim_type": {"enum": ["openstack", "openvim", "vmware", "opennebula", "aws", "azure", "fos"]},
"vim_url": description_schema,
# "vim_url_admin": description_schema,
# "vim_tenant": name_schema,
"name": name_schema,
"description": description_schema,
"wim": name_schema,
- "wim_type": {"enum": ["tapi", "onos", "odl", "dynpac"]},
+ "wim_type": {"enum": ["tapi", "onos", "odl", "dynpac", "fake"]},
"wim_url": description_schema,
"user": shortname_schema,
"password": passwd_schema,
}
# USERS
+project_role_mappings = {
+ "title": "list pf projects/roles",
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "project": shortname_schema,
+ "role": shortname_schema
+ },
+ "required": ["project", "role"],
+ "additionalProperties": False
+ },
+ "minItems": 1
+}
+project_role_mappings_optional = {
+ "title": "list of projects/roles or projects only",
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "project": shortname_schema,
+ "role": shortname_schema
+ },
+ "required": ["project"],
+ "additionalProperties": False
+ },
+ "minItems": 1
+}
user_new_schema = {
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "New user schema",
"username": shortname_schema,
"password": passwd_schema,
"projects": nameshort_list_schema,
+ "project_role_mappings": project_role_mappings,
},
- "required": ["username", "password", "projects"],
+ "required": ["username", "password"],
"additionalProperties": False
}
user_edit_schema = {
"type": "object",
"properties": {
"password": passwd_schema,
+ "username": shortname_schema, # To allow User Name modification
"projects": {
"oneOf": [
nameshort_list_schema,
array_edition_schema
]
},
+ "project_role_mappings": project_role_mappings,
+ "add_project_role_mappings": project_role_mappings,
+ "remove_project_role_mappings": project_role_mappings_optional,
},
"minProperties": 1,
"additionalProperties": False
}
# PROJECTS
+topics_with_quota = ["vnfds", "nsds", "nsts", "pdus", "nsrs", "nsis", "vim_accounts", "wim_accounts", "sdns"]
project_new_schema = {
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "New project schema for administrators",
"properties": {
"name": shortname_schema,
"admin": bool_schema,
+ "quotas": {
+ "type": "object",
+ "properties": {topic: integer0_schema for topic in topics_with_quota},
+ "additionalProperties": False
+ },
},
"required": ["name"],
"additionalProperties": False
"type": "object",
"properties": {
"admin": bool_schema,
+ "name": shortname_schema, # To allow Project Name modification
+ "quotas": {
+ "type": "object",
+ "properties": {topic: {"oneOf": [integer0_schema, null_schema]} for topic in topics_with_quota},
+ "additionalProperties": False
+ },
+ },
+ "additionalProperties": False,
+ "minProperties": 1
+}
+
+# ROLES
+roles_new_schema = {
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "New role schema for administrators",
+ "type": "object",
+ "properties": {
+ "name": shortname_schema,
+ "permissions": {
+ "type": "object",
+ "patternProperties": {
+ ".": bool_schema,
+ },
+ # "minProperties": 1,
+ }
+ },
+ "required": ["name"],
+ "additionalProperties": False
+}
+roles_edit_schema = {
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Roles edit schema for administrators",
+ "type": "object",
+ "properties": {
+ "name": shortname_schema,
+ "permissions": {
+ "type": "object",
+ "patternProperties": {
+ ".": {
+ "oneOf": [bool_schema, null_schema]
+ }
+ },
+ # "minProperties": 1,
+ }
},
"additionalProperties": False,
"minProperties": 1
"vim-network-id": {"OneOf": [string_schema, object_schema]},
"ip-profile": object_schema,
},
- "required": ["name"],
+ "required": ["name"],
"additionalProperties": False
}
"type": "object",
"properties": {
"lcmOperationType": string_schema,
- "nsiInstanceId": id_schema,
+ "netsliceInstanceId": id_schema,
"nsiName": name_schema,
"nsiDescription": {"oneOf": [description_schema, null_schema]},
"nstId": string_schema,
}
nsi_terminate = {
-
+
}
raise ValidationError("Format error {} '{}' ".format(error_pos, e.message))
except js_e.SchemaError:
raise ValidationError("Bad json schema {}".format(schema_to_use), http_code=HTTPStatus.INTERNAL_SERVER_ERROR)
+
+
+def is_valid_uuid(x):
+ """
+ Test for a valid UUID
+ :param x: string to test
+ :return: True if x is a valid uuid, False otherwise
+ """
+ try:
+ if UUID(x):
+ return True
+ except (TypeError, ValueError, AttributeError):
+ return False