org.onap migration
[vid.git] / vid-ext-services-simulator / README.txt
diff --git a/vid-ext-services-simulator/README.txt b/vid-ext-services-simulator/README.txt
new file mode 100644 (file)
index 0000000..71a4e35
--- /dev/null
@@ -0,0 +1,436 @@
+VID Simulator
+************************************************************************************
+
+
+************************************************************************************
+Motivation:
+************************************************************************************
+Allow intuitive and extensible framework for mocking REST calls towards VID external peers,
+both for dev and testing purposes.
+
+
+
+************************************************************************************
+Technologies:
+************************************************************************************
+Spring MVC
+MockServer (Apache License 2.0)
+http://www.mock-server.com
+
+
+
+************************************************************************************
+High-level description:
+************************************************************************************
+
+The Simulator uses MockServer instance running "under the hood" listening to its own HTTP port.
+the Simulator allows to register the expected request and response to the MockServer instance
+with an exposed REST call (see details below), and all other requests are automatically redirected to MockServer.
+If a request was properly registered, the MockServer will reply with an expected response, which will be in turn
+returned by the Simulator to the caller.
+
+The Simulator supports both dynamic and preset (static) registration, looking for JSON files in correct registration format and
+registrating them on startup - see details below under "Preset registration"
+
+Note that the behaviour is generic, and no additional code is expected to be added when there are new
+MSO/AAI/any other component APIs to be mocked. They will just need to be properly registered using the existing API.
+
+
+Simulator can be used in both test and dev modes. You can change the server root of any of VID external REST peers 
+to the one of the simulator (see details in "Usage"), and either register the expected request/response dynamically or preset it
+to be loaded during startup. That's it - you're ready to use the simulator either in dev mode, or in test mode by running integration tests vs VID.
+
+
+***********************************************************************************
+Simulator configuration:
+************************************************************************************
+
+Under src/main/resources/:
+
+1) simulator.properties - currently allows to configure the connection details of MockServer, preset registration mode, and other simulator-related props.
+
+2) mockserver.properties - TBD (MockServer logging, SSL etc.)
+
+
+************************************************************************************
+Preset registration:
+************************************************************************************
+
+If enabled in the properties, the Simulator will also run preset registration, looking for JSON files in correct registration format and
+registrating them on startup. 
+
+The files must be placed under src/main/resources/preset_registration.
+
+If preset registration is enabled, the simulator will run the scheduler "schedulerDetails" API registration, and any other JSON file which it will find under the folder.
+
+
+get_scheduler_details_short.json:
+
+{
+  "simulatorRequest": {
+    "method": "GET",
+    "path": "/scheduler/v1/ChangeManagement/schedules/scheduleDetails"
+  } ,
+  "simulatorResponse": {
+    "responseCode": 200,
+  "body": "[{\"vnfName\":\"ZRDM1MMSC04c53a\",\"status\":\"Pending Schedule\",\"groupId\":\"\",\"policyId\":\"SNIRO.Config_MS_Demo_TimeLimitAndVerticalTopology_zone\",\"scheduleRequest\":{\"id\":1,\"createDateTime\":\"2017-09-06T13:29:43Z\",\"optimizerDateTime\":\"2017-09-06T13:29:55Z\",\"optimizerMessage\":\"\\n{\\n  \\\"requestError\\\": {\\n     \\\"serviceException\\\": {\\n        \\\"messageId\\\": \\\"SVC0001\\\",\\n        \\\"requestId\\\": \\\"CM-c098bd33-a51e-461b-8fd2-6c4d2666c706\\\",\\n        \\\"text\\\": \\\"sniro.operation.exceptions.PolicyNotFoundException: Cannot fetch policy SNIRO.Config_MS_Demo_TimeLimitAndVerticalTopology_zone: : HTTPSConnectionPool(host='policypdp-conexus-ist.ecomp.cci.att.com', port=8081): Max retries exceeded with url: \/pdp\/getConfig (Caused by ConnectTimeoutError(<urllib3.connection.VerifiedHTTPSConnection object at 0x7f0ecc00d6d8>, 'Connection to policypdp-conexus-ist.ecomp.cci.att.com timed out. (connect timeout=6.5)'))\\\",\\n        \\\"variables\\\": [\\\"severity\\\", 400]\\n     }\\n  }\\n}\",\"optimizerStatus\":\"HTTP Status: 400\",\"optimizerAttemptsToSchedule\":1,\"optimizerTransactionId\":\"08fb4c32-ecb4-4d72-b618-a6156d3fc53a\",\"scheduleId\":\"08fb4c32-ecb4-4d72-b618-a6156d3fc53a\",\"scheduleName\":\"08fb4c32-ecb4-4d72-b618-a6156d3fc53a\",\"status\":\"Schedule Failed\",\"userId\":\"su7376\",\"domain\":\"ChangeManagement\",\"domainData\":[{\"id\":1,\"name\":\"CallbackData\",\"value\":\"{\\\"requestDetails\\\": [{\\\"vnfInstanceId\\\": \\\"Test\\\", \\\"relatedInstanceList\\\": [{\\\"relatedInstance\\\": {\\\"instanceId\\\": \\\"{serviceInstanceId}\\\", \\\"modelInfo\\\": {\\\"modelName\\\": \\\"{parent service model name}\\\", \\\"modelVersion\\\": \\\"2.0\\\", \\\"modelType\\\": \\\"service\\\", \\\"modelInvariantId\\\": \\\"ff3514e3-5a33-55df-13ab-12abad84e7ff\\\", \\\"modelCustomizationName\\\": \\\"vSAMP12 1\\\", \\\"modelVersionId\\\": \\\"9ebb1521-2e74-47a4-aac7-e71a79f73a79\\\", \\\"modelCustomizationId\\\": \\\"c539433a-84a6-4082-a12e-5c9b00c3b960\\\"}}}], \\\"requestParameters\\\": {\\\"usePreload\\\": \\\"True\\\"}, \\\"requestInfo\\\": {\\\"source\\\": \\\"VID\\\", \\\"requestorId\\\": \\\"az2016\\\", \\\"suppressRollback\\\": \\\"False\\\"}, \\\"vnfName\\\": \\\"Name\\\", \\\"modelInfo\\\": {\\\"modelName\\\": \\\"vSAMP12\\\", \\\"modelVersion\\\": \\\"2.0\\\", \\\"modelType\\\": \\\"vnf\\\", \\\"modelInvariantId\\\": \\\"ff5256d1-5a33-55df-13ab-12abad84e7ff\\\", \\\"modelCustomizationName\\\": \\\"vSAMP12 1\\\", \\\"modelVersionId\\\": \\\"254583ad-b38c-498b-bdbd-b8de5e07541b\\\", \\\"modelCustomizationId\\\": \\\"c539433a-84a6-4082-a12e-5c9b00c3b960\\\"}, \\\"cloudConfiguration\\\": {\\\"lcpCloudRegionId\\\": \\\"mdt1\\\", \\\"tenantId\\\": \\\"88a6ca3ee0394ade9403f075db23167e\\\"}}]}\"},{\"id\":2,\"name\":\"WorkflowName\",\"value\":\"Build Software Upgrade for vNFs\"},{\"id\":3,\"name\":\"CallbackUrl\",\"value\":\"http:\/\/127.0.0.1:8989\/scheduler\/v1\/loopbacktest\/vid\"}],\"scheduleApprovals\":[]},\"schedulesId\":0}]"
+  }
+}
+
+
+************************************************************************************
+Dynamic registration:
+*************************************************************************************
+If you need dynamic registration, register API for dynamic registration:
+
+POST {protocol}://{Tomcat host}:{Tomcat port}/vidSimulator/registerToVidSimulator
+
+To unregister and clear *all* expectations, use DELETE action:
+
+DELETE {protocol}://{Tomcat host}:{Tomcat port}/vidSimulator/registerToVidSimulator
+
+
+***********************************************************************************
+Registration body JSON specification (see and copy/paste examples below):
+***************************************************************************************
+
+
+   "simulatorRequest" - request wrapper.
+
+          Note that from the below fields, it's mandatory to populate at least one.
+          No field is mandatory by itself.
+
+            "id" - String, will be expected as a value in an X-header with a key "x-simulator-id"
+            "method" - String, HTTP method of the request.
+            "path" - String, relative path of the request, MUST be WITH leading slash and WITHOUT trailing slash.
+            "queryParams" - Map<String, List<String>>, query params of key-->list of values.
+            "body" - String, body of the request in case of POST/PUT.
+                     Note that JSON String should be properly escaped.
+
+    "simulatorResponse" - response wrapper.
+
+           Note that from the below fields, it's mandatory to populate at least "responseCode".
+
+              "responseCode" - integer, HTTP response code.
+              "responseHeaders" - Dictionary Object with HTTP headers and values.
+              "body" - String, body of the response.
+                               Note that JSON String should be properly escaped.
+              "file" - String, a filename of the file sitting in "vid-ext-services-simulator\src\main\resources\download_files"
+                                Used for simulating file download requests.
+
+    "misc" - optional configurations.
+              "numberOfTimes" - Integer. Limit this expectation to fire only a
+                                given amount of times. Values like -1 or less are
+                                treated as "unlimited". Default is unlimited.
+              "replace" - Boolean. If there is already a registered expectation with
+                          same simulatorRequest, remove the old registered expectation.
+                          If set to 'False' -- the result will be appended to fire
+                          after the old registered expectation(s) will fulfill their
+                          numberOfTimes. Default is 'True'.
+
+************************************************************************************
+Usage:
+************************************************************************************
+
+1) In system.properties, change the API you want to mock - set server root to be 
+{protocol}://{Tomcat host}:{Tomcat port}/vidSimulator (for example http://localhost:7080/vidSimulator)
+
+Example of mocking the scheduler: 
+
+#scheduler.server.url=http://mtanjv9sdlg10.aic.cip.att.com:8989/scheduler
+scheduler.server.url=http://localhost:7080/vidSimulator/scheduler
+
+
+2) Check the simulator.properties file under /resources to verify the desired properties of the inner MockServer instance.
+    * Default MockServer URI is http://localhost:1080
+
+3) Build VID and VID Simulator WARs
+
+4) Deploy the Simulator WAR under Tomcat, either same as VID or another instance.
+    * Application context path of the Simulator is /vidSimulator
+
+
+
+********************************************************************************
+Some more examples of usage with demo requests/responses:
+********************************************************************************
+
+
+********************************************************************************
+1) Getting a response by "id" (method and path are insignificant in this case)
+
+********************************************************************************
+Registration:
+-----------------
+
+    Request:
+
+    POST /vidSimulator/registerToVidSimulator HTTP/1.1
+    Host: localhost:7080
+    Content-Type: application/json
+    Cache-Control: no-cache
+    {
+      "simulatorRequest": {
+            "id": "pavelId"
+      } ,
+      "simulatorResponse": {
+            "responseCode": 200,
+            "responseHeaders": {
+              "Content-Type": "application/json"
+            },
+            "body": "{\"value1\": \"kuku\",\"value2\": \"shmuku\"}"
+      }
+    }
+
+
+    Response:
+
+    200 OK
+    Registration successful!
+
+
+Running:
+--------
+
+
+    Request:
+
+    GET /vidSimulator/scheduler/testApi HTTP/1.1
+    Host: localhost:7080
+    Content-Type: application/json
+    X-Simulator-Id: pavelId
+    Cache-Control: no-cache
+
+    Response:
+
+    200 OK
+    {
+        "value1": "kuku",
+        "value2": "shmuku"
+    }
+
+
+********************************************************************************
+2) Getting a response by "id", "method" and "path" - sunny and rainy flows
+********************************************************************************
+Registration:
+-------------
+
+    Request:
+
+    POST /vidSimulator/registerToVidSimulator HTTP/1.1
+    Host: localhost:7080
+    Content-Type: application/json
+    Cache-Control: no-cache
+
+    {
+      "simulatorRequest": {
+               "id": "pavelIdGet",
+               "method": "GET",
+               "path": "/scheduler/testApiGet"
+      } ,
+      "simulatorResponse": {
+               "responseCode": 200,
+            "responseHeaders": {
+              "Content-Type": "application/json"
+            },
+               "body": "{\"value1\": \"kukuResponse\",\"value2\": \"shmukuResponse\"}"
+      }
+    }
+
+
+    Response:
+
+    200 OK
+    Registration successful!
+
+
+Running - sunny flow:
+---------------------
+
+
+    Request:
+
+    GET /vidSimulator/scheduler/testApiGet HTTP/1.1
+    Host: localhost:7080
+    Content-Type: application/json
+    X-Simulator-Id: pavelId
+    Cache-Control: no-cache
+
+    Response:
+
+    200 OK
+    {
+         "value1": "kukuResponse",
+         "value2": "shmukuResponse"
+    }
+
+
+Running POST - will return 404 since GET method was explicitly registered:
+--------------------------------------------------------------------------
+
+    Request:
+
+    POST /vidSimulator/scheduler/testApiGet HTTP/1.1
+    Host: localhost:7080
+    Content-Type: application/json
+    X-Simulator-Id: pavelIdGet
+    Cache-Control: no-cache
+    {
+      "id": "pavelId",
+      "responseCode": 200,
+      "body": {
+        "value1": "kuku",
+        "value2": "shmuku"
+      }
+    }
+
+    Response:
+
+    404 Not Found
+
+
+********************************************************************************
+3) Getting an error HTTP response (based on "id" in this example)
+********************************************************************************
+
+Registration:
+-------------
+
+    Request:
+
+    POST /vidSimulator/registerToVidSimulator HTTP/1.1
+    Host: localhost:7080
+    Content-Type: application/json
+    Cache-Control: no-cache
+
+    {
+      "simulatorRequest": {
+            "id": "pavelIdError"
+      } ,
+      "simulatorResponse": {
+            "responseCode": 417
+      }
+    }
+
+    Response:
+
+    200 OK
+    Registration successful!
+
+Running:
+-----------
+
+   Request:
+
+   GET /vidSimulator/scheduler/anyApi HTTP/1.1
+   Host: localhost:7080
+   Content-Type: application/json
+   X-Simulator-Id: pavelIdError
+   Cache-Control: no-cache
+
+
+   Response:
+
+   417 Expectation Failed.
+
+
+********************************************************************************
+4) Query params
+********************************************************************************
+
+Registration:
+-------------
+
+    Request:
+
+    POST /vidSimulator/registerToVidSimulator HTTP/1.1
+    Host: localhost:7080
+    Content-Type: application/json
+    Cache-Control: no-cache
+    Postman-Token: 0bbfeb0f-b8b6-368e-6fbd-38a90fc544b4
+
+    {
+      "simulatorRequest": {
+           "method": "GET",
+               "path": "/cloudResourcesRequests/v1",
+               "queryParams": {
+                       "requestId" : ["3212b08c-0dcd-4d20-8c84-51e4f325c14a", "3212b08c-0dcd-4d20-8c84-51e4f325c14b"]
+               }
+      } ,
+      "simulatorResponse": {
+               "responseCode": 200,
+               "body": "{\"requestId1\": \"3212b08c-0dcd-4d20-8c84-51e4f325c14a\",\"requestId2\": \"3212b08c-0dcd-4d20-8c84-51e4f325c14b\"}"
+      }
+    }
+
+    Response:
+
+    200 OK
+    Registration successful!
+
+Running:
+-----------
+
+   Request:
+
+  GET /vidSimulator/cloudResourcesRequests/v1?requestId=3212b08c-0dcd-4d20-8c84-51e4f325c14b&amp;requestId=3212b08c-0dcd-4d20-8c84-51e4f325c14a HTTP/1.1
+  Host: 127.0.0.1:7080
+  Accept: application/json
+  Cache-Control: no-cache
+  Postman-Token: 9ef5d9d2-77f4-7631-7e9f-4404df10acb6
+
+
+   Response:
+
+    200 OK
+   {"requestId1": "3212b08c-0dcd-4d20-8c84-51e4f325c14a","requestId2": "3212b08c-0dcd-4d20-8c84-51e4f325c14b"}
+
+
+
+********************************************************************************
+5) File Download
+********************************************************************************
+
+Registration:
+-------------
+
+    Request:
+
+    POST /vidSimulator/registerToVidSimulator HTTP/1.1
+    Host: localhost:7080
+    Content-Type: application/json
+    Cache-Control: no-cache
+    Postman-Token: 0bbfeb0f-b8b6-368e-6fbd-38a90fc544b4
+
+    {
+      "simulatorRequest": {
+        "method": "GET",
+        "path": "/vidSimulator/getSomeFile"
+    } ,
+      "simulatorResponse": {
+        "responseCode": 200,
+        "file": "csar3933948645405128424.zip"
+      }
+    }
+
+    Response:
+
+    200 OK
+    Registration successful!
+
+Running:
+-----------
+
+   Request:
+
+  GET /vidSimulator/getSomeFile HTTP/1.1
+  Host: 127.0.0.1:7080
+  Cache-Control: no-cache
+  Postman-Token: 9ef5d9d2-77f4-7631-7e9f-4404df10acb6
+
+
+   Response:
+
+    200 OK
+    File for download.