aboutsummaryrefslogtreecommitdiffstats
path: root/src/ncm
diff options
context:
space:
mode:
Diffstat (limited to 'src/ncm')
-rw-r--r--src/ncm/api/networkhandler.go9
-rw-r--r--src/ncm/api/providernethandler.go8
-rw-r--r--src/ncm/json-schemas/provider-network.json122
-rw-r--r--src/ncm/json-schemas/virtual-network.json75
4 files changed, 214 insertions, 0 deletions
diff --git a/src/ncm/api/networkhandler.go b/src/ncm/api/networkhandler.go
index ed266697..6f305be1 100644
--- a/src/ncm/api/networkhandler.go
+++ b/src/ncm/api/networkhandler.go
@@ -30,6 +30,9 @@ import (
"github.com/gorilla/mux"
)
+var vnJSONFile string = "json-schemas/virtual-network.json"
+
+
// Used to store backend implementations objects
// Also simplifies mocking for unit testing purposes
type networkHandler struct {
@@ -86,6 +89,12 @@ func (h networkHandler) createNetworkHandler(w http.ResponseWriter, r *http.Requ
return
}
+ err, httpError := validation.ValidateJsonSchemaData(vnJSONFile, p)
+if err != nil {
+ http.Error(w, err.Error(), httpError)
+ return
+}
+
// Name is required.
if p.Metadata.Name == "" {
http.Error(w, "Missing name in POST request", http.StatusBadRequest)
diff --git a/src/ncm/api/providernethandler.go b/src/ncm/api/providernethandler.go
index 66a41a4d..48d5d7ea 100644
--- a/src/ncm/api/providernethandler.go
+++ b/src/ncm/api/providernethandler.go
@@ -31,6 +31,8 @@ import (
"github.com/gorilla/mux"
)
+var pnetJSONFile string = "json-schemas/provider-network.json"
+
// Used to store backend implementations objects
// Also simplifies mocking for unit testing purposes
type providernetHandler struct {
@@ -139,6 +141,12 @@ func (h providernetHandler) createProviderNetHandler(w http.ResponseWriter, r *h
return
}
+ err, httpError := validation.ValidateJsonSchemaData(pnetJSONFile, p)
+if err != nil {
+ http.Error(w, err.Error(), httpError)
+ return
+}
+
// Name is required.
if p.Metadata.Name == "" {
http.Error(w, "Missing name in POST request", http.StatusBadRequest)
diff --git a/src/ncm/json-schemas/provider-network.json b/src/ncm/json-schemas/provider-network.json
new file mode 100644
index 00000000..0aef0304
--- /dev/null
+++ b/src/ncm/json-schemas/provider-network.json
@@ -0,0 +1,122 @@
+{
+ "$schema": "http://json-schema.org/schema#",
+ "type": "object",
+ "properties": {
+ "spec": {
+ "required": [
+ "cniType",
+ "ipv4Subnets",
+ "providerNetType",
+ "vlan"
+ ],
+ "type": "object",
+ "properties": {
+ "ipv4Subnets": {
+ "items": {
+ "required": [
+ "name",
+ "subnet"
+ ],
+ "type": "object",
+ "properties": {
+ "subnet": {
+ "type": "string",
+ "maxLength": 128,
+ "pattern": "[-_0-9a-zA-Z]+$"
+ },
+ "excludeIps": {
+ "type": "string",
+ "maxLength": 128
+ },
+ "gateway": {
+ "type": "string",
+ "maxLength": 128
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 128,
+ "pattern": "[-_0-9a-zA-Z]+$"
+ }
+ }
+ },
+ "type": "array"
+ },
+ "cniType": {
+ "type": "string",
+ "maxLength": 128,
+ "pattern": "[-_0-9a-zA-Z]+$"
+ },
+ "vlan": {
+ "required": [
+ "logicalInterfaceName",
+ "nodeLabelList",
+ "providerInterfaceName",
+ "vlanID",
+ "vlanNodeSelector"
+ ],
+ "type": "object",
+ "properties": {
+ "vlanNodeSelector": {
+ "type": "string",
+ "maxLength": 128
+ },
+ "nodeLabelList": {
+ "items": {
+ "type": "string",
+ "maxLength": 128
+ },
+ "type": "array"
+ },
+ "providerInterfaceName": {
+ "type": "string",
+ "maxLength": 128
+ },
+ "vlanID": {
+ "type": "string",
+ "maxLength": 128
+ },
+ "logicalInterfaceName": {
+ "type": "string",
+ "maxLength": 128
+ }
+ }
+ },
+ "providerNetType": {
+ "type": "string",
+ "maxLength": 128,
+ "pattern": "[-_0-9a-zA-Z]+$"
+ }
+ }
+ },
+ "metadata": {
+ "required": ["name"],
+ "properties": {
+ "userData2": {
+ "description": "User relevant data for the resource",
+ "type": "string",
+ "example": "Some more data",
+ "maxLength": 512
+ },
+ "userData1": {
+ "description": "User relevant data for the resource",
+ "type": "string",
+ "example": "Some data",
+ "maxLength": 512
+ },
+ "name": {
+ "description": "Name of the resource",
+ "type": "string",
+ "example": "ResName",
+ "maxLength": 128,
+ "pattern": "[-_0-9a-zA-Z]+$"
+ },
+ "description": {
+ "description": "Description for the resource",
+ "type": "string",
+ "example": "Resource description",
+ "maxLength": 1024
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/src/ncm/json-schemas/virtual-network.json b/src/ncm/json-schemas/virtual-network.json
new file mode 100644
index 00000000..f2bc9d3d
--- /dev/null
+++ b/src/ncm/json-schemas/virtual-network.json
@@ -0,0 +1,75 @@
+{
+ "$schema": "http://json-schema.org/schema#",
+ "type": "object",
+ "properties": {
+ "spec": {
+ "properties": {
+ "ipv4Subnets": {
+ "items": {
+ "required": [
+ "name",
+ "subnet"
+ ],
+ "type": "object",
+ "properties": {
+ "subnet": {
+ "type": "string",
+ "maxLength": 128,
+ "pattern": "[-_0-9a-zA-Z]+$"
+ },
+ "excludeIps": {
+ "type": "string",
+ "maxLength": 1024
+ },
+ "gateway": {
+ "type": "string",
+ "maxLength": 128
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 128,
+ "pattern": "[-_0-9a-zA-Z]+$"
+ }
+ }
+ },
+ "type": "array"
+ },
+ "cniType": {
+ "type": "string",
+ "maxLength": 128,
+ "pattern": "[-_0-9a-zA-Z]+$"
+ }
+ }
+ },
+ "metadata": {
+ "required": ["name"],
+ "properties": {
+ "userData2": {
+ "description": "User relevant data for the resource",
+ "type": "string",
+ "example": "Some more data",
+ "maxLength": 512
+ },
+ "userData1": {
+ "description": "User relevant data for the resource",
+ "type": "string",
+ "example": "Some data",
+ "maxLength": 512
+ },
+ "name": {
+ "description": "Name of the resource",
+ "type": "string",
+ "example": "ResName",
+ "maxLength": 128,
+ "pattern": "[-_0-9a-zA-Z]+$"
+ },
+ "description": {
+ "description": "Description for the resource",
+ "type": "string",
+ "example": "Resource description",
+ "maxLength": 1024
+ }
+ }
+ }
+ }
+} \ No newline at end of file