blob: c2dc1e20fa952eaeecfec36cf38bc0f9e9af80e3 [file] [log] [blame]
# -*- coding: utf-8 -*-
##
# Copyright 2015 Telefónica Investigación y Desarrollo, S.A.U.
# This file is part of openvim
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# For those usages not covered by the Apache License, Version 2.0 please
# contact with: nfvlabs@tid.es
##
''' Definition of dictionaries schemas used by validating input
These dictionaries are validated using jsonschema library
'''
__author__="Alfonso Tierno"
__date__ ="$10-jul-2014 12:07:15$"
#
# SCHEMAS to validate input data
#
path_schema={"type":"string", "pattern":"^(\.){0,2}(/[^/\"':{}\(\)]+)+$"}
http_schema={"type":"string", "pattern":"^https?://[^'\"=]+$"}
port_schema={"type":"integer","minimum":1,"maximun":65534}
ip_schema={"type":"string","pattern":"^([0-9]{1,3}.){3}[0-9]{1,3}$"}
cidr_schema={"type":"string","pattern":"^([0-9]{1,3}.){3}[0-9]{1,3}/[0-9]{1,2}$"}
name_schema={"type" : "string", "minLength":1, "maxLength":255, "pattern" : "^[^,;()'\"]+$"}
nameshort_schema={"type" : "string", "minLength":1, "maxLength":64, "pattern" : "^[^,;()'\"]+$"}
nametiny_schema={"type" : "string", "minLength":1, "maxLength":12, "pattern" : "^[^,;()'\"]+$"}
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}$"
id_schema = {"type" : "string", "pattern": "^[a-fA-F0-9]{8}(-[a-fA-F0-9]{4}){3}-[a-fA-F0-9]{12}$"}
pci_schema={"type":"string", "pattern":"^[0-9a-fA-F]{4}(:[0-9a-fA-F]{2}){2}\.[0-9a-fA-F]$"}
bandwidth_schema={"type":"string", "pattern" : "^[0-9]+ *([MG]bps)?$"}
integer0_schema={"type":"integer","minimum":0}
integer1_schema={"type":"integer","minimum":1}
vlan_schema={"type":"integer","minimum":1,"maximun":4095}
vlan1000_schema={"type":"integer","minimum":1000,"maximun":4095}
mac_schema={"type":"string", "pattern":"^[0-9a-fA-F][02468aceACE](:[0-9a-fA-F]{2}){5}$"} #must be unicast LSB bit of MSB byte ==0
net_bind_schema={"oneOf":[{"type":"null"},{"type":"string", "pattern":"^(default|((bridge|macvtap):[0-9a-zA-Z\.\-]{1,50})|openflow:[/0-9a-zA-Z\.\-]{1,50}(:vlan)?)$"}]}
yes_no_schema={"type":"string", "enum":["yes", "no"]}
log_level_schema={"type":"string", "enum":["DEBUG", "INFO", "WARNING","ERROR","CRITICAL"]}
config_schema = {
"title":"main configuration information schema",
"$schema": "http://json-schema.org/draft-04/schema#",
"type":"object",
"properties":{
"http_port": port_schema,
"http_admin_port": port_schema,
"http_host": nameshort_schema,
"http_url_prefix": path_schema, # it does not work yet; it's supposed to be the base path to be used by bottle, but it must be explicitly declared
"db_host": nameshort_schema,
"db_user": nameshort_schema,
"db_passwd": {"type":"string"},
"db_name": nameshort_schema,
"of_controller_ip": ip_schema,
"of_controller_port": port_schema,
"of_controller_dpid": nameshort_schema,
"of_controller_nets_with_same_vlan": {"type" : "boolean"},
"of_controller": nameshort_schema, #{"type":"string", "enum":["floodlight", "opendaylight"]},
"of_controller_module": {"type":"string"},
"of_user": nameshort_schema,
"of_password": nameshort_schema,
"test_mode": {"type": "boolean"}, #leave for backward compatibility
"mode": {"type":"string", "enum":["normal", "host only", "OF only", "development", "test"] },
"development_bridge": {"type":"string"},
"tenant_id": {"type" : "string"},
"image_path": path_schema,
"network_vlan_range_start": vlan_schema,
"network_vlan_range_end": vlan_schema,
"bridge_ifaces": {
"type": "object",
"patternProperties": {
"." : {
"type": "array",
"items": integer0_schema,
"minItems":2,
"maxItems":2,
},
},
"minProperties": 2
},
"dhcp_server": {
"type": "object",
"properties": {
"host" : name_schema,
"port" : port_schema,
"provider" : {"type": "string", "enum": ["isc-dhcp-server"]},
"user" : nameshort_schema,
"password" : {"type": "string"},
"key" : {"type": "string"},
"bridge_ifaces" :{
"type": "array",
"items": nameshort_schema,
},
"nets" :{
"type": "array",
"items": name_schema,
},
},
"required": ['host', 'provider', 'user']
},
"log_level": log_level_schema,
"log_level_db": log_level_schema,
"log_level_of": log_level_schema,
"network_type": {"type": "string", "enum": ["ovs", "bridge"]},
"ovs_controller_file_path": path_schema,
"ovs_controller_user": nameshort_schema,
"ovs_controller_ip": nameshort_schema
},
"patternProperties": {
"of_*" : {"type": ["string", "integer", "boolean"]}
},
"required": ['db_host', 'db_user', 'db_passwd', 'db_name'],
"additionalProperties": False
}
metadata_schema={
"type":"object",
"properties":{
"architecture": {"type":"string"},
"use_incremental": yes_no_schema,
"vpci": pci_schema,
"os_distro": {"type":"string"},
"os_type": {"type":"string"},
"os_version": {"type":"string"},
"bus": {"type":"string"},
"topology": {"type":"string", "enum": ["oneSocket"]}
}
}
tenant_new_schema = {
"title":"tenant creation information schema",
"$schema": "http://json-schema.org/draft-04/schema#",
"type":"object",
"properties":{
"tenant":{
"type":"object",
"properties":{
"id":id_schema,
"name": nameshort_schema,
"description":description_schema,
"enabled":{"type" : "boolean"}
},
"required": ["name"]
}
},
"required": ["tenant"],
"additionalProperties": False
}
tenant_edit_schema = {
"title":"tenant edition information schema",
"$schema": "http://json-schema.org/draft-04/schema#",
"type":"object",
"properties":{
"tenant":{
"type":"object",
"minProperties":1,
"properties":{
"name":nameshort_schema,
"description":description_schema,
"enabled":{"type" : "boolean"}
},
"additionalProperties": False,
}
},
"required": ["tenant"],
"additionalProperties": False
}
interfaces_schema={
"type":"array",
"minItems":0,
"items":{
"type":"object",
"properties":{
"name":name_schema,
"dedicated":{"type":"string","enum":["yes","no","yes:sriov"]},
"bandwidth":bandwidth_schema,
"vpci":pci_schema,
"uuid":id_schema,
"mac_address":mac_schema
},
"additionalProperties": False,
"required": ["dedicated", "bandwidth"]
}
}
extended_schema={
"type":"object",
"properties":{
"processor_ranking":integer0_schema,
"devices":{
"type": "array",
"items":{
"type": "object",
"properties":{
"type":{"type":"string", "enum":["usb","disk","cdrom","xml"]},
"vpci":pci_schema,
"imageRef":id_schema,
"xml":xml_text_schema,
"dev":nameshort_schema
},
"additionalProperties": False,
"required": ["type"]
}
},
"numas":{
"type": "array",
"items":{
"type": "object",
"properties":{
"memory":integer1_schema,
"cores":integer1_schema,
"paired-threads":integer1_schema,
"threads":integer1_schema,
"cores-id":{"type":"array","items":integer0_schema},
"paired-threads-id":{"type":"array","items":{"type":"array","minItems":2,"maxItems":2,"items":integer0_schema}},
"threads-id":{"type":"array","items":integer0_schema},
"interfaces":interfaces_schema
},
"additionalProperties": False,
"minProperties": 1,
#"required": ["memory"]
}
}
},
#"additionalProperties": False,
#"required": ["processor_ranking"]
}
host_data_schema={
"title":"hosts manual insertion information schema",
"type":"object",
"properties":{
"ip_name":nameshort_schema,
"name": name_schema,
"description":description_schema,
"user":nameshort_schema,
"password":nameshort_schema,
"features":description_schema,
"ranking":integer0_schema,
"devices":{
"type": "array",
"items":{
"type": "object",
"properties":{
"type":{"type":"string", "enum":["usb","disk"]},
"vpci":pci_schema
},
"additionalProperties": False,
"required": ["type"]
}
},
"numas":{
"type": "array",
"minItems":1,
"items":{
"type": "object",
"properties":{
"admin_state_up":{"type":"boolean"},
"hugepages":integer0_schema,
"cores":{
"type": "array",
"minItems":2,
"items":{
"type": "object",
"properties":{
"core_id":integer0_schema,
"thread_id":integer0_schema,
"status": {"type":"string", "enum":["noteligible"]}
},
"additionalProperties": False,
"required": ["core_id","thread_id"]
}
},
"interfaces":{
"type": "array",
"minItems":1,
"items":{
"type": "object",
"properties":{
"source_name":nameshort_schema,
"mac":mac_schema,
"Mbps":integer0_schema,
"pci":pci_schema,
"sriovs":{
"type": "array",
"minItems":1,
"items":{
"type": "object",
"properties":{
"source_name":{"oneOf":[integer0_schema, nameshort_schema]},
"mac":mac_schema,
"vlan":integer0_schema,
"pci":pci_schema,
},
"additionalProperties": False,
"required": ["source_name","mac","pci"]
}
},
"switch_port": nameshort_schema,
"switch_dpid": nameshort_schema,
},
"additionalProperties": False,
"required": ["source_name","mac","Mbps","pci"]
}
},
"numa_socket":integer0_schema,
"memory":integer1_schema
},
"additionalProperties": False,
"required": ["cores","numa_socket"]
}
}
},
"additionalProperties": False,
"required": ["ranking", "numas","ip_name","user"]
}
host_edit_schema={
"title":"hosts creation information schema",
"$schema": "http://json-schema.org/draft-04/schema#",
"type":"object",
"properties":{
"host":{
"type":"object",
"properties":{
"ip_name":nameshort_schema,
"name": name_schema,
"description":description_schema,
"user":nameshort_schema,
"password":nameshort_schema,
"admin_state_up":{"type":"boolean"},
"numas":{
"type":"array",
"items":{
"type": "object",
"properties":{
"numa_socket": integer0_schema,
"admin_state_up":{"type":"boolean"},
"interfaces":{
"type":"array",
"items":{
"type": "object",
"properties":{
"source_name": nameshort_schema,
"switch_dpid": nameshort_schema,
"switch_port": nameshort_schema,
},
"required": ["source_name"],
}
}
},
"required": ["numa_socket"],
"additionalProperties": False,
}
}
},
"minProperties": 1,
"additionalProperties": False
},
},
"required": ["host"],
"minProperties": 1,
"additionalProperties": False
}
host_new_schema = {
"title":"hosts creation information schema",
"$schema": "http://json-schema.org/draft-04/schema#",
"type":"object",
"properties":{
"host":{
"type":"object",
"properties":{
"id":id_schema,
"ip_name":nameshort_schema,
"name": name_schema,
"description":description_schema,
"user":nameshort_schema,
"password":nameshort_schema,
"admin_state_up":{"type":"boolean"},
},
"required": ["name","ip_name","user"]
},
"host-data":host_data_schema
},
"required": ["host"],
"minProperties": 1,
"maxProperties": 2,
"additionalProperties": False
}
flavor_new_schema = {
"title":"flavor creation information schema",
"$schema": "http://json-schema.org/draft-04/schema#",
"type":"object",
"properties":{
"flavor":{
"type":"object",
"properties":{
"id":id_schema,
"name":name_schema,
"description":description_schema,
"ram":integer0_schema,
"vcpus":integer0_schema,
"extended": extended_schema,
"public": yes_no_schema
},
"required": ["name"]
}
},
"required": ["flavor"],
"additionalProperties": False
}
flavor_update_schema = {
"title":"flavor update information schema",
"$schema": "http://json-schema.org/draft-04/schema#",
"type":"object",
"properties":{
"flavor":{
"type":"object",
"properties":{
"name":name_schema,
"description":description_schema,
"ram":integer0_schema,
"vcpus":integer0_schema,
"extended": extended_schema,
"public": yes_no_schema
},
"minProperties": 1,
"additionalProperties": False
}
},
"required": ["flavor"],
"additionalProperties": False
}
image_new_schema = {
"title":"image creation information schema",
"$schema": "http://json-schema.org/draft-04/schema#",
"type":"object",
"properties":{
"image":{
"type":"object",
"properties":{
"id":id_schema,
"path": {"oneOf": [path_schema, http_schema]},
"description":description_schema,
"name":name_schema,
"metadata":metadata_schema,
"public": yes_no_schema
},
"required": ["name","path"]
}
},
"required": ["image"],
"additionalProperties": False
}
image_update_schema = {
"title":"image update information schema",
"$schema": "http://json-schema.org/draft-04/schema#",
"type":"object",
"properties":{
"image":{
"type":"object",
"properties":{
"path":{"oneOf": [path_schema, http_schema]},
"description":description_schema,
"name":name_schema,
"metadata":metadata_schema,
"public": yes_no_schema
},
"minProperties": 1,
"additionalProperties": False
}
},
"required": ["image"],
"additionalProperties": False
}
networks_schema={
"type":"array",
"items":{
"type":"object",
"properties":{
"name":name_schema,
"bandwidth":bandwidth_schema,
"vpci":pci_schema,
"uuid":id_schema,
"mac_address": mac_schema,
"model": {"type":"string", "enum":["virtio","e1000","ne2k_pci","pcnet","rtl8139"]},
"type": {"type":"string", "enum":["virtual","PF","VF","VFnotShared"]}
},
"additionalProperties": False,
"required": ["uuid"]
}
}
server_new_schema = {
"title":"server creation information schema",
"$schema": "http://json-schema.org/draft-04/schema#",
"type":"object",
"properties":{
"server":{
"type":"object",
"properties":{
"id":id_schema,
"name":name_schema,
"description":description_schema,
"start":{"type":"string", "enum":["yes","no","paused"]},
"hostId":id_schema,
"flavorRef":id_schema,
"imageRef":id_schema,
"extended": extended_schema,
"networks":networks_schema
},
"required": ["name","flavorRef","imageRef"]
}
},
"required": ["server"],
"additionalProperties": False
}
server_action_schema = {
"title":"server action information schema",
"$schema": "http://json-schema.org/draft-04/schema#",
"type":"object",
"properties":{
"start":{"oneOf":[{"type": "null"}, {"type":"string", "enum":["rebuild","null"] }]},
"pause":{"type": "null"},
"resume":{"type": "null"},
"shutoff":{"type": "null"},
"shutdown":{"type": "null"},
"forceOff":{"type": "null"},
"terminate":{"type": "null"},
"createImage":{
"type":"object",
"properties":{
"path":path_schema,
"description":description_schema,
"name":name_schema,
"metadata":metadata_schema,
"imageRef": id_schema,
"disk": {"oneOf":[{"type": "null"}, {"type":"string"}] },
},
"required": ["name"]
},
"rebuild":{"type": ["object","null"]},
"reboot":{
"type": ["object","null"],
# "properties": {
# "type":{"type":"string", "enum":["SOFT"] }
# },
# "minProperties": 1,
# "maxProperties": 1,
# "additionalProperties": False
}
},
"minProperties": 1,
"maxProperties": 1,
"additionalProperties": False
}
network_new_schema = {
"title":"network creation information schema",
"$schema": "http://json-schema.org/draft-04/schema#",
"type":"object",
"properties":{
"network":{
"type":"object",
"properties":{
"id":id_schema,
"name":name_schema,
"type":{"type":"string", "enum":["bridge_man","bridge_data","data", "ptp"]},
"shared":{"type":"boolean"},
"tenant_id":id_schema,
"admin_state_up":{"type":"boolean"},
"provider:vlan":vlan_schema,
"provider:physical":net_bind_schema,
"cidr":cidr_schema,
"enable_dhcp": {"type":"boolean"},
"dhcp_first_ip": ip_schema,
"dhcp_last_ip": ip_schema,
"bind_net":name_schema, #can be name, or uuid
"bind_type":{"oneOf":[{"type":"null"},{"type":"string", "pattern":"^vlan:[0-9]{1,4}$"}]}
},
"required": ["name"]
}
},
"required": ["network"],
"additionalProperties": False
}
network_update_schema = {
"title":"network update information schema",
"$schema": "http://json-schema.org/draft-04/schema#",
"type":"object",
"properties":{
"network":{
"type":"object",
"properties":{
"name":name_schema,
"type":{"type":"string", "enum":["bridge_man","bridge_data","data", "ptp"]},
"shared":{"type":"boolean"},
"tenant_id":id_schema,
"admin_state_up":{"type":"boolean"},
"provider:vlan":vlan_schema,
"provider:physical":net_bind_schema,
"cidr":cidr_schema,
"enable_dhcp": {"type":"boolean"},
# "dhcp_first_ip": ip_schema,
# "dhcp_last_ip": ip_schema,
"bind_net":name_schema, #can be name, or uuid
"bind_type":{"oneOf":[{"type":"null"},{"type":"string", "pattern":"^vlan:[0-9]{1,4}$"}]}
},
"minProperties": 1,
"additionalProperties": False
}
},
"required": ["network"],
"additionalProperties": False
}
port_new_schema = {
"title":"port creation information schema",
"$schema": "http://json-schema.org/draft-04/schema#",
"type":"object",
"properties":{
"port":{
"type":"object",
"properties":{
"id":id_schema,
"name":nameshort_schema,
"network_id":{"oneOf":[{"type": "null"}, id_schema ]},
"tenant_id":id_schema,
"mac_address": {"oneOf":[{"type": "null"}, mac_schema] },
"admin_state_up":{"type":"boolean"},
"bandwidth":bandwidth_schema,
"binding:switch_port":nameshort_schema,
"binding:vlan": {"oneOf":[{"type": "null"}, vlan_schema ]}
},
"required": ["name"]
}
},
"required": ["port"],
"additionalProperties": False
}
port_update_schema = {
"title":"port update information schema",
"$schema": "http://json-schema.org/draft-04/schema#",
"type":"object",
"properties":{
"port":{
"type":"object",
"properties":{
"name":nameshort_schema,
"network_id":{"anyOf":[{"type":"null"}, id_schema ] }
},
"minProperties": 1,
"additionalProperties": False
}
},
"required": ["port"],
"additionalProperties": False
}
localinfo_schema = {
"title":"localinfo information schema",
"$schema": "http://json-schema.org/draft-04/schema#",
"type":"object",
"properties":{
"files":{ "type": "object"},
"inc_files":{ "type": "object"},
"server_files":{ "type": "object"}
},
"required": ["files"]
}
hostinfo_schema = {
"title":"host information schema",
"$schema": "http://json-schema.org/draft-04/schema#",
"type":"object",
"properties":{
"iface_names":{
"type":"object",
"patternProperties":{
".":{ "type": "string"}
},
"minProperties": 1
}
},
"required": ["iface_names"]
}
openflow_controller_schema = {
"title": "network creation information schema",
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"ofc": {
"type": "object",
"properties": {
"name": name_schema,
"dpid": nameshort_schema,
"ip": nameshort_schema,
"port": port_schema,
"type": nameshort_schema,
"version": nametiny_schema,
"user": nameshort_schema,
"password": nameshort_schema
},
"required": ["dpid", "type", "ip", "port", "name"]
}
},
"required": ["ofc"],
"additionalProperties": False
}
of_port_new_schema = {
"title": "OF port mapping",
"type": "object",
"properties": {
"ofc_id": id_schema,
"region": nameshort_schema,
"compute_node": nameshort_schema,
"pci": pci_schema,
"switch_dpid": nameshort_schema,
"switch_port": nameshort_schema,
"switch_mac": mac_schema
},
"required": ["region", "compute_node", "pci", "switch_dpid"]
}
of_port_map_new_schema = {
"title": "OF port mapping",
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"of_port_mapings": {"type": "array", "items": of_port_new_schema, "minLenght":1},
},
"required": ["of_port_mapings"],
"additionalProperties": False
}