From 6654b8acd592da3d47d3dca18a8a891be19afa86 Mon Sep 17 00:00:00 2001
From: hammad zafar <hammad.zafar@xflowresearch.com>
Date: Wed, 24 Mar 2021 13:44:16 +0500
Subject: [PATCH] NotificationEndpoint resource updated

---
 .../NotificationEndpoint.robot                | 115 +++++-------
 .../environment/variables.txt                 |   3 +
 .../jsons/VrQuotaAvailNotification.json       |   1 -
 .../VrQuotaAvailNotification.schema.json      |   8 +
 .../VrQuotaAvailSubscription.schema.json      |  84 ++++++++-
 .../VrQuotaAvailSubscriptions.schema.json     | 168 +++++++++---------
 .../vrQuotaAvailNotification.schema.json      |   0
 7 files changed, 225 insertions(+), 154 deletions(-)
 create mode 100644 SOL003/VirtualisedResourcesQuotaAvailableNotification-API/schemas/VrQuotaAvailNotification.schema.json
 delete mode 100644 SOL003/VirtualisedResourcesQuotaAvailableNotification-API/schemas/vrQuotaAvailNotification.schema.json

diff --git a/SOL003/VirtualisedResourcesQuotaAvailableNotification-API/NotificationEndpoint.robot b/SOL003/VirtualisedResourcesQuotaAvailableNotification-API/NotificationEndpoint.robot
index 220225ff..918c54a8 100644
--- a/SOL003/VirtualisedResourcesQuotaAvailableNotification-API/NotificationEndpoint.robot
+++ b/SOL003/VirtualisedResourcesQuotaAvailableNotification-API/NotificationEndpoint.robot
@@ -1,83 +1,62 @@
 *** Settings ***
 Resource    environment/variables.txt 
-Resource    VRQANOperationKeywords.robot 
 Suite Setup    Create Sessions
 Suite Teardown    Terminate All Processes    kill=true
 Library    MockServerLibrary
 Library    Process
 Library    OperatingSystem
-
-*** Variables ***
-
+Library    Collections
 
 *** Test Cases ***
-Deliver a notification - Vr Quota Availibility
-    [Documentation]    Test ID: 11.4.4.1
-    ...    Test title: Deliver a notification - Vr Quota Availibility
-    ...    Test objective: The objective is to notify related to the availability of the virtualised resources quota.
-    ...    Pre-conditions: The VNF has subscribed to the Vr Quota Availibility resource
-    ...    Reference: Clause 11.4.4 - ETSI GS NFV-SOL 003 [1] v3.3.1
+Virtual Quota Available Notification
+    [Documentation]    Test ID: 7.3.7.5.1
+    ...    Test title: Virtual Quota Available Notification
+    ...    Test objective: The objective is to test the dispatch of Virtual Quota Available Notification, and perform a JSON schema and content validation of the delivered notification. The action that triggers the notification under test is an explicit test step, but it is not performed by the test system.
+    ...    Pre-conditions: A subscription for Virtual Quota Available Notification is available in the VNFM.
+    ...    Reference: Clause 11.4.4.3.1 - ETSI GS NFV-SOL 003 [1] v3.3.1
     ...    Config ID: Config_prod_VNFM
-    ...    Applicability: 
-    ...    Post-Conditions:  
-    log    The POST method delivers a notification from the server to the client.
-    ${json}=	Get File	schemas/VrQuotaAvailNotification.schema.json
-    ${BODY}=	evaluate	json.loads('''${json}''')	json
-    Log  Creating mock request and response to handle Vr Quota AvailibilityNotification
-    &{req}=  Create Mock Request Matcher	POST  ${callback_endpoint}  body_type="JSON_SCHEMA"    body=${BODY}
-    &{rsp}=  Create Mock Response	headers="Content-Type: application/json"  status_code=204
-    Create Mock Expectation  ${req}  ${rsp}
-    Sleep  ${sleep_interval}
-    Log  Verifying results
-    Verify Mock Expectation  ${req}
-    Log  Cleaning the endpoint
-    Clear Requests  ${callback_endpoint}
-
-Test a notification end point
-    log    The GET method allows the server to test the notification endpoint
-    &{req}=  Create Mock Request Matcher	GET  ${callback_endpoint}    
-    &{rsp}=  Create Mock Response	headers="Content-Type: application/json"  status_code=204
-    Create Mock Expectation  ${req}  ${rsp}
-    Sleep  ${sleep_interval}
-    Verify Mock Expectation  ${req}
-    Clear Requests  ${callback_endpoint}
-
-PUT notification - Method not implemented
-    Log  PUT Method not implemented
-    &{req}=  Create Mock Request Matcher	PUT  ${callback_endpoint}
-    &{rsp}=  Create Mock Response  status_code=405
-    Create Mock Expectation  ${req}  ${rsp}
-    Sleep  ${sleep_interval}
-    Log  Verifying results
-    Verify Mock Expectation  ${req}
-    Log  Cleaning the endpoint
-    Clear Requests  ${callback_endpoint}
-
-PATCH subscriptions - Method not implemented
-    Log  PATCH Method not implemented
-    &{req}=  Create Mock Request Matcher	PATCH  ${callback_endpoint}
-    &{rsp}=  Create Mock Response  status_code=405
-    Create Mock Expectation  ${req}  ${rsp}
-    Sleep  ${sleep_interval}
-    Log  Verifying results
-    Verify Mock Expectation  ${req}
-    Log  Cleaning the endpoint
-    Clear Requests  ${callback_endpoint}
+    ...    Applicability: none
+    ...    Post-Conditions: none 
+    Trigger a dispatch of virtual quota available notification (external action) 
+    Check Virtual Quota Available Notification Http POST Request Body Json Schema Is    VrQuotaAvailNotification
+    Check Virtual Quota Available Notification Http POST Request Body notificationType attribute Is    VrQuotaAvailNotification
+   
+*** Keywords ***
 
-DELETE subscriptions - Method not implemented
-    Log  DELETE Method not implemented
-    &{req}=  Create Mock Request Matcher	DELETE  ${callback_endpoint}
-    &{rsp}=  Create Mock Response  status_code=405
-    Create Mock Expectation  ${req}  ${rsp}
-    Sleep  ${sleep_interval}
-    Log  Verifying results
-    Verify Mock Expectation  ${req}
-    Log  Cleaning the endpoint
-    Clear Requests  ${callback_endpoint}
+Trigger a dispatch of virtual quota available notification (external action) 
+    #do nothing
+    Log    do nothing  
+    
+Check Virtual Quota Available Notification Http POST Request Body Json Schema Is  
+    [Arguments]    ${element}
+    ${schema}=	Get File	schemas/${element}.schema.json
+    Configure Notification Forward    ${schema}    ${callback_endpoint}    ${callback_endpoint_fwd}
+
+Check Virtual Quota Available Notification Http POST Request Body notificationType attribute Is
+    [Arguments]    ${type}
+    Configure Virtual Quota Available Notification Handler    ${callback_endpoint_fwd}    ${type}
+    Wait Until Keyword Succeeds    2 min   10 sec   Verify Mock Expectation    ${notification_request}
+    Clear Requests    ${callback_endpoint}
+    Clear Requests    ${callback_endpoint_fwd}
+    
+Configure Virtual Quota Available Notification Handler
+    [Arguments]    ${endpoint}    ${type}
+    ${json}=    evaluate    {}
+    set to dictionary   ${json}    notificationType    ${type}
+    ${BODY}=    evaluate    json.dumps(${json})    json
+    Log  Creating mock request and response to handle status notification
+    &{notification_request}=  Create Mock Request Matcher	POST  ${endpoint}  body_type="JSON"    body=${BODY}
+    &{notification_response}=  Create Mock Response	headers="Content-Type: application/json"  status_code=204
+    Create Mock Expectation  ${notification_request}  ${notification_response}
+    
+Configure Notification Forward
+    [Arguments]    ${schema}    ${endpoint}    ${endpoint_fwd}    
+    Log  Creating mock Http POST forward to handle ${schema}
+    &{notification_tmp}=  Create Mock Request Matcher	POST  ${endpoint}  body_type="JSON_SCHEMA"    body=${schema}
+    &{notification_fwd}=  Create Mock Http Forward	${endpoint_fwd}
+    Create Mock Expectation With Http Forward  ${notification_tmp}  ${notification_fwd}
 
-*** Keywords ***
 Create Sessions
     Start Process  java  -jar  ${MOCK_SERVER_JAR}  -serverPort  ${callback_port}  alias=mockInstance
     Wait For Process  handle=mockInstance  timeout=5s  on_timeout=continue
-    Create Mock Session  ${callback_uri}:${callback_port} 
-
+    Create Mock Session  ${callback_uri}:${callback_port}
diff --git a/SOL003/VirtualisedResourcesQuotaAvailableNotification-API/environment/variables.txt b/SOL003/VirtualisedResourcesQuotaAvailableNotification-API/environment/variables.txt
index a705ad75..3a90362a 100644
--- a/SOL003/VirtualisedResourcesQuotaAvailableNotification-API/environment/variables.txt
+++ b/SOL003/VirtualisedResourcesQuotaAvailableNotification-API/environment/variables.txt
@@ -15,11 +15,14 @@ ${sub_filter}    filter
 ${sub_filter_invalid}    filter_invalid
 
 ${callback_endpoint}    /notification
+${callback_endpoint_fwd}    /endpoint/check
 ${callback_subscribe}    /subscribe
 ${callback_port}    9091
 ${callback_uri}     http://localhost
 ${sleep_interval}    20s
 
+${notification_request}    []
+${notification_response}    []
 
 ${apiRoot}        /
 ${apiName}        vrqan
diff --git a/SOL003/VirtualisedResourcesQuotaAvailableNotification-API/jsons/VrQuotaAvailNotification.json b/SOL003/VirtualisedResourcesQuotaAvailableNotification-API/jsons/VrQuotaAvailNotification.json
index e24fb810..7cab6f28 100644
--- a/SOL003/VirtualisedResourcesQuotaAvailableNotification-API/jsons/VrQuotaAvailNotification.json
+++ b/SOL003/VirtualisedResourcesQuotaAvailableNotification-API/jsons/VrQuotaAvailNotification.json
@@ -1,4 +1,3 @@
- 
 {{
 	"id":"",
 	"notificationType":"VrQuotaAvailNotification",
diff --git a/SOL003/VirtualisedResourcesQuotaAvailableNotification-API/schemas/VrQuotaAvailNotification.schema.json b/SOL003/VirtualisedResourcesQuotaAvailableNotification-API/schemas/VrQuotaAvailNotification.schema.json
new file mode 100644
index 00000000..31a1800b
--- /dev/null
+++ b/SOL003/VirtualisedResourcesQuotaAvailableNotification-API/schemas/VrQuotaAvailNotification.schema.json
@@ -0,0 +1,8 @@
+{
+	"id":"",
+	"notificationType":"VrQuotaAvailNotification",
+	"subscriptionId": "",
+	"timeStamp":"",
+	"resourceGroupId":"",
+	"_links": ""
+}
\ No newline at end of file
diff --git a/SOL003/VirtualisedResourcesQuotaAvailableNotification-API/schemas/VrQuotaAvailSubscription.schema.json b/SOL003/VirtualisedResourcesQuotaAvailableNotification-API/schemas/VrQuotaAvailSubscription.schema.json
index aaa9c540..8f37c51c 100644
--- a/SOL003/VirtualisedResourcesQuotaAvailableNotification-API/schemas/VrQuotaAvailSubscription.schema.json
+++ b/SOL003/VirtualisedResourcesQuotaAvailableNotification-API/schemas/VrQuotaAvailSubscription.schema.json
@@ -1 +1,83 @@
-{  "description": "This type represents a subscription related to notifications related to the availability of the virtualised resources quotas.\n",  "type": "object",  "required": [    "id",    "callbackUri",    "_links"  ],  "properties": {    "id": {      "description": "An identifier with the intention of being globally unique.\n",      "type": "string"    },    "filter": {      "description": "This type represents a subscription filter related to notifications about the availability of the virtualised resources quotas. At a particular nesting level in the filter structure, the following applies: All attributes shall match in order for the filter to match (logical \"and\" between different filter attributes). If an attribute is an array, the attribute shall match if at least one of the values in the array matches (logical \"or\" between the values of one filter attribute).\n",      "type": "object",      "properties": {        "vimIds": {          "description": "Match VIMs that were created the quota for a consumer of the virtualised resources. This attribute shall only be supported when VNF-related Resource Management in direct mode is applicable.\n",          "type": "array",          "items": {            "description": "An identifier with the intention of being globally unique.\n",            "type": "string"          }        },        "resourceProviderIds": {          "description": "Match the entities responsible for the management of the virtualised resources that were allocated by the NFVO. This attribute shall only be supported when VNF-related Resource Management in indirect mode is applicable. The identification scheme is outside the scope of the present document.\n",          "type": "array",          "items": {            "description": "An identifier with the intention of being globally unique.\n",            "type": "string"          }        },        "resourceTypes": {          "description": "Match particular resource types.\n",          "type": "array",          "items": {            "type": "string",            "enum": [              "COMPUTE",              "STORAGE",              "NETWORK"            ]          }        },        "resourceGroupIds": {          "description": "Match the \"infrastructure resource groups\" that are logical groupings of the virtualised resources assigned to a tenant within an infrastructure Domain.\n",          "type": "array",          "items": {            "description": "An identifier maintained by the VIM or other resource provider. It is expected to be unique within the VIM instance.\n",            "type": "string"          }        }      }    },    "callbackUri": {      "description": "String formatted according to IETF RFC 3986.\n",      "type": "string"    },    "_links": {      "description": "Links for this resource\n",      "type": "object",      "required": [        "self"      ],      "properties": {        "self": {          "description": "This type represents a link to a resource.\n",          "type": "object",          "required": [            "href"          ],          "properties": {            "href": {              "description": "URI of the referenced resource.\n",              "type": "string",              "format": "url"            }          }        }      }    }  }}
\ No newline at end of file
+{
+	"description": "This type represents a subscription related to notifications related to the availability of the virtualised resources quotas.\n",
+	"type": "object",
+	"required": [
+		"id",
+		"callbackUri",
+		"_links"
+	],
+	"properties": {
+		"id": {
+			"description": "An identifier with the intention of being globally unique.\n",
+			"type": "string"
+		},
+		"filter": {
+			"description": "This type represents a subscription filter related to notifications about the availability of the virtualised resources quotas. At a particular nesting level in the filter structure, the following applies: All attributes shall match in order for the filter to match (logical \"and\" between different filter attributes). If an attribute is an array, the attribute shall match if at least one of the values in the array matches (logical \"or\" between the values of one filter attribute).\n",
+			"type": "object",
+			"properties": {
+				"vimIds": {
+					"description": "Match VIMs that were created the quota for a consumer of the virtualised resources. This attribute shall only be supported when VNF-related Resource Management in direct mode is applicable.\n",
+					"type": "array",
+					"items": {
+						"description": "An identifier with the intention of being globally unique.\n",
+						"type": "string"
+					}
+				},
+				"resourceProviderIds": {
+					"description": "Match the entities responsible for the management of the virtualised resources that were allocated by the NFVO. This attribute shall only be supported when VNF-related Resource Management in indirect mode is applicable. The identification scheme is outside the scope of the present document.\n",
+					"type": "array",
+					"items": {
+						"description": "An identifier with the intention of being globally unique.\n",
+						"type": "string"
+					}
+				},
+				"resourceTypes": {
+					"description": "Match particular resource types.\n",
+					"type": "array",
+					"items": {
+						"type": "string",
+						"enum": [
+							"COMPUTE",
+							"STORAGE",
+							"NETWORK"
+						]
+					}
+				},
+				"resourceGroupIds": {
+					"description": "Match the \"infrastructure resource groups\" that are logical groupings of the virtualised resources assigned to a tenant within an infrastructure Domain.\n",
+					"type": "array",
+					"items": {
+						"description": "An identifier maintained by the VIM or other resource provider. It is expected to be unique within the VIM instance.\n",
+						"type": "string"
+					}
+				}
+			}
+		},
+		"callbackUri": {
+			"description": "String formatted according to IETF RFC 3986.\n",
+			"type": "string"
+		},
+		"_links": {
+			"description": "Links for this resource\n",
+			"type": "object",
+			"required": [
+				"self"
+			],
+			"properties": {
+				"self": {
+					"description": "This type represents a link to a resource using an absolute URI.\n",
+					"type": "object",
+					"required": [
+						"href"
+					],
+					"properties": {
+						"href": {
+							"description": "String formatted according to IETF RFC 3986.\n",
+							"type": "string"
+						}
+					}
+				}
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/SOL003/VirtualisedResourcesQuotaAvailableNotification-API/schemas/VrQuotaAvailSubscriptions.schema.json b/SOL003/VirtualisedResourcesQuotaAvailableNotification-API/schemas/VrQuotaAvailSubscriptions.schema.json
index 8bab3d15..9ad57bc2 100644
--- a/SOL003/VirtualisedResourcesQuotaAvailableNotification-API/schemas/VrQuotaAvailSubscriptions.schema.json
+++ b/SOL003/VirtualisedResourcesQuotaAvailableNotification-API/schemas/VrQuotaAvailSubscriptions.schema.json
@@ -1,87 +1,87 @@
 {
   "type": "array",
-  "items": {
-    "description": "This type represents a subscription related to notifications related to the availability of the virtualised resources quotas.\n",
-    "type": "object",
-    "required": [
-      "id",
-      "callbackUri",
-      "_links"
-    ],
-    "properties": {
-      "id": {
-        "description": "An identifier with the intention of being globally unique.\n",
-        "type": "string"
-      },
-      "filter": {
-        "description": "This type represents a subscription filter related to notifications about the availability of the virtualised resources quotas. At a particular nesting level in the filter structure, the following applies: All attributes shall match in order for the filter to match (logical \"and\" between different filter attributes). If an attribute is an array, the attribute shall match if at least one of the values in the array matches (logical \"or\" between the values of one filter attribute).\n",
-        "type": "object",
-        "properties": {
-          "vimIds": {
-            "description": "Match VIMs that were created the quota for a consumer of the virtualised resources. This attribute shall only be supported when VNF-related Resource Management in direct mode is applicable.\n",
-            "type": "array",
-            "items": {
-              "description": "An identifier with the intention of being globally unique.\n",
-              "type": "string"
-            }
-          },
-          "resourceProviderIds": {
-            "description": "Match the entities responsible for the management of the virtualised resources that were allocated by the NFVO. This attribute shall only be supported when VNF-related Resource Management in indirect mode is applicable. The identification scheme is outside the scope of the present document.\n",
-            "type": "array",
-            "items": {
-              "description": "An identifier with the intention of being globally unique.\n",
-              "type": "string"
-            }
-          },
-          "resourceTypes": {
-            "description": "Match particular resource types.\n",
-            "type": "array",
-            "items": {
-              "type": "string",
-              "enum": [
-                "COMPUTE",
-                "STORAGE",
-                "NETWORK"
-              ]
-            }
-          },
-          "resourceGroupIds": {
-            "description": "Match the \"infrastructure resource groups\" that are logical groupings of the virtualised resources assigned to a tenant within an infrastructure Domain.\n",
-            "type": "array",
-            "items": {
-              "description": "An identifier maintained by the VIM or other resource provider. It is expected to be unique within the VIM instance.\n",
-              "type": "string"
-            }
-          }
-        }
-      },
-      "callbackUri": {
-        "description": "String formatted according to IETF RFC 3986.\n",
-        "type": "string"
-      },
-      "_links": {
-        "description": "Links for this resource\n",
-        "type": "object",
-        "required": [
-          "self"
-        ],
-        "properties": {
-          "self": {
-            "description": "This type represents a link to a resource.\n",
-            "type": "object",
-            "required": [
-              "href"
-            ],
-            "properties": {
-              "href": {
-                "description": "URI of the referenced resource.\n",
-                "type": "string",
-                "format": "url"
-              }
-            }
-          }
-        }
-      }
-    }
+  "items":
+  {
+	"description": "This type represents a subscription related to notifications related to the availability of the virtualised resources quotas.\n",
+	"type": "object",
+	"required": [
+		"id",
+		"callbackUri",
+		"_links"
+	],
+	"properties": {
+		"id": {
+			"description": "An identifier with the intention of being globally unique.\n",
+			"type": "string"
+		},
+		"filter": {
+			"description": "This type represents a subscription filter related to notifications about the availability of the virtualised resources quotas. At a particular nesting level in the filter structure, the following applies: All attributes shall match in order for the filter to match (logical \"and\" between different filter attributes). If an attribute is an array, the attribute shall match if at least one of the values in the array matches (logical \"or\" between the values of one filter attribute).\n",
+			"type": "object",
+			"properties": {
+				"vimIds": {
+					"description": "Match VIMs that were created the quota for a consumer of the virtualised resources. This attribute shall only be supported when VNF-related Resource Management in direct mode is applicable.\n",
+					"type": "array",
+					"items": {
+						"description": "An identifier with the intention of being globally unique.\n",
+						"type": "string"
+					}
+				},
+				"resourceProviderIds": {
+					"description": "Match the entities responsible for the management of the virtualised resources that were allocated by the NFVO. This attribute shall only be supported when VNF-related Resource Management in indirect mode is applicable. The identification scheme is outside the scope of the present document.\n",
+					"type": "array",
+					"items": {
+						"description": "An identifier with the intention of being globally unique.\n",
+						"type": "string"
+					}
+				},
+				"resourceTypes": {
+					"description": "Match particular resource types.\n",
+					"type": "array",
+					"items": {
+						"type": "string",
+						"enum": [
+							"COMPUTE",
+							"STORAGE",
+							"NETWORK"
+						]
+					}
+				},
+				"resourceGroupIds": {
+					"description": "Match the \"infrastructure resource groups\" that are logical groupings of the virtualised resources assigned to a tenant within an infrastructure Domain.\n",
+					"type": "array",
+					"items": {
+						"description": "An identifier maintained by the VIM or other resource provider. It is expected to be unique within the VIM instance.\n",
+						"type": "string"
+					}
+				}
+			}
+		},
+		"callbackUri": {
+			"description": "String formatted according to IETF RFC 3986.\n",
+			"type": "string"
+		},
+		"_links": {
+			"description": "Links for this resource\n",
+			"type": "object",
+			"required": [
+				"self"
+			],
+			"properties": {
+				"self": {
+					"description": "This type represents a link to a resource using an absolute URI.\n",
+					"type": "object",
+					"required": [
+						"href"
+					],
+					"properties": {
+						"href": {
+							"description": "String formatted according to IETF RFC 3986.\n",
+							"type": "string"
+						}
+					}
+				}
+			}
+		}
+	}
   }
-}
+}
\ No newline at end of file
diff --git a/SOL003/VirtualisedResourcesQuotaAvailableNotification-API/schemas/vrQuotaAvailNotification.schema.json b/SOL003/VirtualisedResourcesQuotaAvailableNotification-API/schemas/vrQuotaAvailNotification.schema.json
deleted file mode 100644
index e69de29b..00000000
-- 
GitLab