2 ************************************************************************************
5 ************************************************************************************
7 ************************************************************************************
8 Allow intuitive and extensible framework for mocking REST calls towards VID external peers,
9 both for dev and testing purposes.
13 ************************************************************************************
15 ************************************************************************************
17 MockServer (Apache License 2.0)
18 http://www.mock-server.com
22 ************************************************************************************
23 High-level description:
24 ************************************************************************************
26 The Simulator uses MockServer instance running "under the hood" listening to its own HTTP port.
27 the Simulator allows to register the expected request and response to the MockServer instance
28 with an exposed REST call (see details below), and all other requests are automatically redirected to MockServer.
29 If a request was properly registered, the MockServer will reply with an expected response, which will be in turn
30 returned by the Simulator to the caller.
32 The Simulator supports both dynamic and preset (static) registration, looking for JSON files in correct registration format and
33 registrating them on startup - see details below under "Preset registration"
35 Note that the behaviour is generic, and no additional code is expected to be added when there are new
36 MSO/AAI/any other component APIs to be mocked. They will just need to be properly registered using the existing API.
39 Simulator can be used in both test and dev modes. You can change the server root of any of VID external REST peers
40 to the one of the simulator (see details in "Usage"), and either register the expected request/response dynamically or preset it
41 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.
44 ***********************************************************************************
45 Simulator configuration:
46 ************************************************************************************
48 Under src/main/resources/:
50 1) simulator.properties - currently allows to configure the connection details of MockServer, preset registration mode, and other simulator-related props.
52 2) mockserver.properties - TBD (MockServer logging, SSL etc.)
55 ************************************************************************************
57 ************************************************************************************
59 If enabled in the properties, the Simulator will also run preset registration, looking for JSON files in correct registration format and
60 registrating them on startup.
62 The files must be placed under src/main/resources/preset_registration.
64 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.
67 get_scheduler_details_short.json:
72 "path": "/scheduler/v1/ChangeManagement/schedules/scheduleDetails"
74 "simulatorResponse": {
76 "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}]"
81 ************************************************************************************
83 *************************************************************************************
84 If you need dynamic registration, register API for dynamic registration:
86 POST {protocol}://{Tomcat host}:{Tomcat port}/vidSimulator/registerToVidSimulator
88 To unregister and clear *all* expectations, use DELETE action:
90 DELETE {protocol}://{Tomcat host}:{Tomcat port}/vidSimulator/registerToVidSimulator
93 ***********************************************************************************
94 Registration body JSON specification (see and copy/paste examples below):
95 ***************************************************************************************
98 "simulatorRequest" - request wrapper.
100 Note that from the below fields, it's mandatory to populate at least one.
101 No field is mandatory by itself.
103 "id" - String, will be expected as a value in an X-header with a key "x-simulator-id"
104 "method" - String, HTTP method of the request.
105 "path" - String, relative path of the request, MUST be WITH leading slash and WITHOUT trailing slash.
106 "queryParams" - Map<String, List<String>>, query params of key-->list of values.
107 "body" - String, body of the request in case of POST/PUT.
108 Note that JSON String should be properly escaped.
110 "simulatorResponse" - response wrapper.
112 Note that from the below fields, it's mandatory to populate at least "responseCode".
114 "responseCode" - integer, HTTP response code.
115 "responseHeaders" - Dictionary Object with HTTP headers and values.
116 "body" - String, body of the response.
117 Note that JSON String should be properly escaped.
118 "file" - String, a filename of the file sitting in "vid-ext-services-simulator\src\main\resources\download_files"
119 Used for simulating file download requests.
121 "misc" - optional configurations.
122 "numberOfTimes" - Integer. Limit this expectation to fire only a
123 given amount of times. Values like -1 or less are
124 treated as "unlimited". Default is unlimited.
125 "replace" - Boolean. If there is already a registered expectation with
126 same simulatorRequest, remove the old registered expectation.
127 If set to 'False' -- the result will be appended to fire
128 after the old registered expectation(s) will fulfill their
129 numberOfTimes. Default is 'True'.
131 ************************************************************************************
133 ************************************************************************************
135 1) In system.properties, change the API you want to mock - set server root to be
136 {protocol}://{Tomcat host}:{Tomcat port}/vidSimulator (for example http://localhost:7080/vidSimulator)
138 Example of mocking the scheduler:
140 #scheduler.server.url=http://mtanjv9sdlg10.aic.cip.att.com:8989/scheduler
141 scheduler.server.url=http://localhost:7080/vidSimulator/scheduler
144 2) Check the simulator.properties file under /resources to verify the desired properties of the inner MockServer instance.
145 * Default MockServer URI is http://localhost:1080
147 3) Build VID and VID Simulator WARs
149 4) Deploy the Simulator WAR under Tomcat, either same as VID or another instance.
150 * Application context path of the Simulator is /vidSimulator
154 ********************************************************************************
155 Some more examples of usage with demo requests/responses:
156 ********************************************************************************
159 ********************************************************************************
160 1) Getting a response by "id" (method and path are insignificant in this case)
162 ********************************************************************************
168 POST /vidSimulator/registerToVidSimulator HTTP/1.1
170 Content-Type: application/json
171 Cache-Control: no-cache
173 "simulatorRequest": {
176 "simulatorResponse": {
179 "Content-Type": "application/json"
181 "body": "{\"value1\": \"kuku\",\"value2\": \"shmuku\"}"
189 Registration successful!
198 GET /vidSimulator/scheduler/testApi HTTP/1.1
200 Content-Type: application/json
201 X-Simulator-Id: pavelId
202 Cache-Control: no-cache
213 ********************************************************************************
214 2) Getting a response by "id", "method" and "path" - sunny and rainy flows
215 ********************************************************************************
221 POST /vidSimulator/registerToVidSimulator HTTP/1.1
223 Content-Type: application/json
224 Cache-Control: no-cache
227 "simulatorRequest": {
230 "path": "/scheduler/testApiGet"
232 "simulatorResponse": {
235 "Content-Type": "application/json"
237 "body": "{\"value1\": \"kukuResponse\",\"value2\": \"shmukuResponse\"}"
245 Registration successful!
248 Running - sunny flow:
249 ---------------------
254 GET /vidSimulator/scheduler/testApiGet HTTP/1.1
256 Content-Type: application/json
257 X-Simulator-Id: pavelIdGet
258 Cache-Control: no-cache
264 "value1": "kukuResponse",
265 "value2": "shmukuResponse"
269 Running POST - will return 404 since GET method was explicitly registered:
270 --------------------------------------------------------------------------
274 POST /vidSimulator/scheduler/testApiGet HTTP/1.1
276 Content-Type: application/json
277 X-Simulator-Id: pavelIdGet
278 Cache-Control: no-cache
293 ********************************************************************************
294 3) Getting an error HTTP response (based on "id" in this example)
295 ********************************************************************************
302 POST /vidSimulator/registerToVidSimulator HTTP/1.1
304 Content-Type: application/json
305 Cache-Control: no-cache
308 "simulatorRequest": {
311 "simulatorResponse": {
319 Registration successful!
326 GET /vidSimulator/scheduler/anyApi HTTP/1.1
328 Content-Type: application/json
329 X-Simulator-Id: pavelIdError
330 Cache-Control: no-cache
335 417 Expectation Failed.
338 ********************************************************************************
340 ********************************************************************************
347 POST /vidSimulator/registerToVidSimulator HTTP/1.1
349 Content-Type: application/json
350 Cache-Control: no-cache
351 Postman-Token: 0bbfeb0f-b8b6-368e-6fbd-38a90fc544b4
354 "simulatorRequest": {
356 "path": "/cloudResourcesRequests/v1",
358 "requestId" : ["3212b08c-0dcd-4d20-8c84-51e4f325c14a", "3212b08c-0dcd-4d20-8c84-51e4f325c14b"]
361 "simulatorResponse": {
363 "body": "{\"requestId1\": \"3212b08c-0dcd-4d20-8c84-51e4f325c14a\",\"requestId2\": \"3212b08c-0dcd-4d20-8c84-51e4f325c14b\"}"
370 Registration successful!
377 GET /vidSimulator/cloudResourcesRequests/v1?requestId=3212b08c-0dcd-4d20-8c84-51e4f325c14b&requestId=3212b08c-0dcd-4d20-8c84-51e4f325c14a HTTP/1.1
379 Accept: application/json
380 Cache-Control: no-cache
381 Postman-Token: 9ef5d9d2-77f4-7631-7e9f-4404df10acb6
387 {"requestId1": "3212b08c-0dcd-4d20-8c84-51e4f325c14a","requestId2": "3212b08c-0dcd-4d20-8c84-51e4f325c14b"}
391 ********************************************************************************
393 ********************************************************************************
400 POST /vidSimulator/registerToVidSimulator HTTP/1.1
402 Content-Type: application/json
403 Cache-Control: no-cache
404 Postman-Token: 0bbfeb0f-b8b6-368e-6fbd-38a90fc544b4
407 "simulatorRequest": {
409 "path": "/vidSimulator/getSomeFile"
411 "simulatorResponse": {
413 "file": "csar3933948645405128424.zip"
420 Registration successful!
427 GET /vidSimulator/getSomeFile HTTP/1.1
429 Cache-Control: no-cache
430 Postman-Token: 9ef5d9d2-77f4-7631-7e9f-4404df10acb6