Initial checkin of updates for vf module replace 04/88004/2
authorSmokowski, Steven <steve.smokowski@att.com>
Fri, 17 May 2019 14:31:27 +0000 (10:31 -0400)
committerBenjamin, Max (mb388a) <mb388a@us.att.com>
Fri, 17 May 2019 20:05:13 +0000 (16:05 -0400)
fix toString method and add unit tests for new code
Fix Null pointer issue in UT, extra chars
Initial checkin of updates for vf module replace

Change-Id: I2d62f5c2077cd022ccf796d126494e526ad48c54
Issue-ID: SO-1893
Signed-off-by: Benjamin, Max (mb388a) <mb388a@us.att.com>
common/src/main/java/org/onap/so/serviceinstancebeans/RequestParameters.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/Action.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ServiceInstances.java
mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/ServiceInstancesTest.java
mso-api-handlers/mso-api-handler-infra/src/test/resources/ServiceInstanceTest/ReplaceVfModuleRetainAssignments.json [new file with mode: 0644]

index 1df2c10..9fceed1 100644 (file)
 
 package org.onap.so.serviceinstancebeans;
 
-import java.beans.Transient;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import org.apache.commons.lang3.builder.ToStringBuilder;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.annotation.JsonInclude.Include;
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -52,9 +52,21 @@ public class RequestParameters implements Serializable {
     private Boolean cascadeDelete;
     @JsonProperty("testApi")
     private String testApi; // usePreload would always be true for Update
+    @JsonProperty("retainAssignments")
+    private Boolean retainAssignments; // usePreload would always be true for Update
     @JsonProperty("rebuildVolumeGroups")
     private Boolean rebuildVolumeGroups;
 
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this).append("subscriptionServiceType", subscriptionServiceType)
+                .append("userParams", userParams).append("aLaCarte", aLaCarte).append("payload", payload)
+                .append("usePreload", usePreload).append("autoBuildVfModules", autoBuildVfModules)
+                .append("cascadeDelete", cascadeDelete).append("testApi", testApi)
+                .append("retainAssignments", retainAssignments).append("rebuildVolumeGroups", rebuildVolumeGroups)
+                .toString();
+    }
+
     public String getSubscriptionServiceType() {
         return subscriptionServiceType;
     }
@@ -150,11 +162,13 @@ public class RequestParameters implements Serializable {
         this.rebuildVolumeGroups = rebuildVolumeGroups;
     }
 
-    @Override
-    public String toString() {
-        return "RequestParameters [subscriptionServiceType=" + subscriptionServiceType + ", userParams=" + userParams
-                + ", aLaCarte=" + aLaCarte + ", testApi= " + testApi + ", autoBuildVfModules=" + autoBuildVfModules
-                + ", usePreload=" + usePreload + ", rebuildVolumeGroups=" + rebuildVolumeGroups + ", payload=" + payload
-                + "]";
+    public Boolean getRetainAssignments() {
+        return retainAssignments;
+    }
+
+    public void setRetainAssignments(Boolean retainAssignments) {
+        this.retainAssignments = retainAssignments;
     }
+
+
 }
index 77dbff9..974d025 100644 (file)
@@ -20,9 +20,7 @@
 
 package org.onap.so.apihandlerinfra;
 
-/*
- * Enum for Status values returned by API Handler to Tail-F
- */
+
 public enum Action implements Actions {
-    createInstance, updateInstance, deleteInstance, configureInstance, replaceInstance, activateInstance, deactivateInstance, enablePort, disablePort, addRelationships, removeRelationships, inPlaceSoftwareUpdate, applyUpdatedConfig, completeTask, assignInstance, unassignInstance, compareModel, scaleInstance, deactivateAndCloudDelete, scaleOut, recreateInstance, addMembers, removeMembers
+    createInstance, updateInstance, deleteInstance, configureInstance, replaceInstance, replaceInstanceRetainAssignments, activateInstance, deactivateInstance, enablePort, disablePort, addRelationships, removeRelationships, inPlaceSoftwareUpdate, applyUpdatedConfig, completeTask, assignInstance, unassignInstance, compareModel, scaleInstance, deactivateAndCloudDelete, scaleOut, recreateInstance, addMembers, removeMembers
 }
index 7c8d247..45319de 100644 (file)
 
 package org.onap.so.apihandlerinfra;
 
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonMappingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import javax.transaction.Transactional;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 import org.apache.commons.lang.StringUtils;
 import org.apache.http.HttpStatus;
 import org.onap.so.apihandler.common.CommonConstants;
@@ -74,24 +86,12 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Component;
-import javax.transaction.Transactional;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.container.ContainerRequestContext;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 
 @Component
 @Path("/onap/so/infra/serviceInstantiation")
@@ -766,6 +766,7 @@ public class ServiceInstances {
         String apiVersion = version.substring(1);
 
         sir = requestHandlerUtils.convertJsonToServiceInstanceRequest(requestJSON, action, requestId, requestUri);
+        action = handleReplaceInstance(action, sir);
         String requestScope = requestHandlerUtils.deriveRequestScope(action, sir, requestUri);
         InfraActiveRequests currentActiveReq =
                 msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
@@ -939,6 +940,20 @@ public class ServiceInstances {
                 recipeLookupResult.getOrchestrationURI(), requestScope);
     }
 
+    /**
+     * @param action
+     * @param sir
+     * @return
+     */
+    protected Actions handleReplaceInstance(Actions action, ServiceInstancesRequest sir) {
+        if (action != null && action.equals(Action.replaceInstance)
+                && sir.getRequestDetails().getRequestParameters().getRetainAssignments() != null
+                && sir.getRequestDetails().getRequestParameters().getRetainAssignments()) {
+            action = Action.replaceInstanceRetainAssignments;
+        }
+        return action;
+    }
+
     public Response deleteInstanceGroups(Actions action, HashMap<String, String> instanceIdMap, String version,
             String requestId, String requestUri, ContainerRequestContext requestContext) throws ApiException {
         String instanceGroupId = instanceIdMap.get(CommonConstants.INSTANCE_GROUP_INSTANCE_ID);
index db6273d..ea43a54 100644 (file)
@@ -28,11 +28,14 @@ import static com.github.tomakehurst.wiremock.client.WireMock.urlMatching;
 import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;
 import static com.shazam.shazamcrest.matcher.Matchers.sameBeanAs;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 import static org.onap.so.logger.HttpHeadersConstants.ONAP_REQUEST_ID;
 import static org.onap.so.logger.HttpHeadersConstants.REQUESTOR_ID;
+import static org.onap.so.logger.HttpHeadersConstants.TRANSACTION_ID;
 import static org.onap.so.logger.MdcConstants.CLIENT_ID;
 import static org.onap.so.logger.MdcConstants.ENDTIME;
 import static org.onap.so.logger.MdcConstants.INVOCATION_ID;
@@ -41,7 +44,6 @@ import static org.onap.so.logger.MdcConstants.RESPONSECODE;
 import static org.onap.so.logger.MdcConstants.RESPONSEDESC;
 import static org.onap.so.logger.MdcConstants.SERVICE_NAME;
 import static org.onap.so.logger.MdcConstants.STATUSCODE;
-import static org.onap.so.logger.HttpHeadersConstants.TRANSACTION_ID;
 import java.io.File;
 import java.io.IOException;
 import java.net.MalformedURLException;
@@ -57,12 +59,17 @@ import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mockito;
 import org.onap.logging.ref.slf4j.ONAPLogConstants;
+import org.onap.so.apihandlerinfra.exceptions.ContactCamundaException;
+import org.onap.so.apihandlerinfra.exceptions.RequestDbFailureException;
 import org.onap.so.db.catalog.beans.Service;
 import org.onap.so.db.catalog.beans.ServiceRecipe;
 import org.onap.so.db.request.beans.InfraActiveRequests;
 import org.onap.so.logger.HttpHeadersConstants;
 import org.onap.so.serviceinstancebeans.CloudConfiguration;
+import org.onap.so.serviceinstancebeans.ModelInfo;
+import org.onap.so.serviceinstancebeans.RequestDetails;
 import org.onap.so.serviceinstancebeans.RequestError;
+import org.onap.so.serviceinstancebeans.RequestInfo;
 import org.onap.so.serviceinstancebeans.RequestParameters;
 import org.onap.so.serviceinstancebeans.RequestReferences;
 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
@@ -75,7 +82,6 @@ import org.springframework.http.HttpMethod;
 import org.springframework.http.ResponseEntity;
 import org.springframework.util.ResourceUtils;
 import org.springframework.web.util.UriComponentsBuilder;
-import com.fasterxml.jackson.annotation.JsonInclude.Include;
 import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.DeserializationFeature;
@@ -93,6 +99,9 @@ public class ServiceInstancesTest extends BaseTest {
     @Autowired
     private ServiceInstances servInstances;
 
+    @Autowired
+    private RequestHandlerUtils requestHandlerUtils;
+
     @Value("${wiremock.server.port}")
     private String wiremockPort;
 
@@ -2748,5 +2757,194 @@ public class ServiceInstancesTest extends BaseTest {
                 "No valid modelCustomizationId for networkResourceCustomization lookup is specified");
     }
 
+    @Test
+    public void setServiceTypeTestALaCarte() throws JsonProcessingException {
+        String requestScope = ModelType.service.toString();
+        Boolean aLaCarteFlag = true;
+        ServiceInstancesRequest sir = new ServiceInstancesRequest();
+        RequestDetails requestDetails = new RequestDetails();
+        RequestInfo requestInfo = new RequestInfo();
+        requestInfo.setSource("VID");
+        requestDetails.setRequestInfo(requestInfo);
+        sir.setRequestDetails(requestDetails);
+        Service defaultService = new Service();
+        defaultService.setServiceType("testServiceTypeALaCarte");
+
+        wireMockServer.stubFor(get(urlMatching(".*/service/search/.*"))
+                .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                        .withBody(mapper.writeValueAsString(defaultService)).withStatus(HttpStatus.SC_OK)));
+
+        String serviceType = requestHandlerUtils.getServiceType(requestScope, sir, aLaCarteFlag);
+        assertEquals(serviceType, "testServiceTypeALaCarte");
+    }
+
+    @Test
+    public void setServiceTypeTest() throws JsonProcessingException {
+        String requestScope = ModelType.service.toString();
+        Boolean aLaCarteFlag = false;
+        ServiceInstancesRequest sir = new ServiceInstancesRequest();
+        RequestDetails requestDetails = new RequestDetails();
+        RequestInfo requestInfo = new RequestInfo();
+        ModelInfo modelInfo = new ModelInfo();
+        modelInfo.setModelVersionId("0dd91181-49da-446b-b839-cd959a96f04a");
+        requestInfo.setSource("VID");
+        requestDetails.setModelInfo(modelInfo);
+        requestDetails.setRequestInfo(requestInfo);
+        sir.setRequestDetails(requestDetails);
+        Service defaultService = new Service();
+        defaultService.setServiceType("testServiceType");
+
+        wireMockServer.stubFor(get(urlMatching(".*/service/0dd91181-49da-446b-b839-cd959a96f04a"))
+                .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                        .withBody(mapper.writeValueAsString(defaultService)).withStatus(HttpStatus.SC_OK)));
+
+        String serviceType = requestHandlerUtils.getServiceType(requestScope, sir, aLaCarteFlag);
+        assertEquals(serviceType, "testServiceType");
+    }
+
+    @Test
+    public void setServiceTypeTestDefault() throws JsonProcessingException {
+        String requestScope = ModelType.service.toString();
+        Boolean aLaCarteFlag = false;
+        ServiceInstancesRequest sir = new ServiceInstancesRequest();
+        RequestDetails requestDetails = new RequestDetails();
+        RequestInfo requestInfo = new RequestInfo();
+        ModelInfo modelInfo = new ModelInfo();
+        modelInfo.setModelVersionId("0dd91181-49da-446b-b839-cd959a96f04a");
+        requestInfo.setSource("VID");
+        requestDetails.setModelInfo(modelInfo);
+        requestDetails.setRequestInfo(requestInfo);
+        sir.setRequestDetails(requestDetails);
+        Service defaultService = new Service();
+        defaultService.setServiceType("testServiceType");
+
+        wireMockServer.stubFor(get(urlMatching(".*/service/0dd91181-49da-446b-b839-cd959a96f04a"))
+                .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                        .withStatus(HttpStatus.SC_NOT_FOUND)));
+        wireMockServer.stubFor(get(urlMatching(".*/service/search/.*"))
+                .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                        .withBody(mapper.writeValueAsString(defaultService)).withStatus(HttpStatus.SC_OK)));
+
+        String serviceType = requestHandlerUtils.getServiceType(requestScope, sir, aLaCarteFlag);
+        assertEquals(serviceType, "testServiceType");
+    }
+
+    @Test
+    public void setServiceTypeTestNetwork() throws JsonProcessingException {
+        String requestScope = ModelType.network.toString();
+        Boolean aLaCarteFlag = null;
+        ServiceInstancesRequest sir = new ServiceInstancesRequest();
+        RequestDetails requestDetails = new RequestDetails();
+        RequestInfo requestInfo = new RequestInfo();
+        ModelInfo modelInfo = new ModelInfo();
+        modelInfo.setModelName("networkModelName");
+        requestInfo.setSource("VID");
+        requestDetails.setModelInfo(modelInfo);
+        requestDetails.setRequestInfo(requestInfo);
+        sir.setRequestDetails(requestDetails);
+
+        String serviceType = requestHandlerUtils.getServiceType(requestScope, sir, aLaCarteFlag);
+        assertEquals(serviceType, "networkModelName");
+    }
+
+    @Test
+    public void setServiceInstanceIdInstanceGroupTest() throws JsonParseException, JsonMappingException, IOException {
+        String requestScope = "instanceGroup";
+        ServiceInstancesRequest sir =
+                mapper.readValue(inputStream("/CreateInstanceGroup.json"), ServiceInstancesRequest.class);
+        assertEquals("ddcbbf3d-f2c1-4ca0-8852-76a807285efc",
+                requestHandlerUtils.setServiceInstanceId(requestScope, sir));
+    }
+
+    @Test
+    public void setServiceInstanceIdTest() {
+        String requestScope = "vnf";
+        ServiceInstancesRequest sir = new ServiceInstancesRequest();
+        sir.setServiceInstanceId("f0a35706-efc4-4e27-80ea-a995d7a2a40f");
+        assertEquals("f0a35706-efc4-4e27-80ea-a995d7a2a40f",
+                requestHandlerUtils.setServiceInstanceId(requestScope, sir));
+    }
+
+    @Test
+    public void setServiceInstanceIdReturnNullTest() {
+        String requestScope = "vnf";
+        ServiceInstancesRequest sir = new ServiceInstancesRequest();
+        assertNull(requestHandlerUtils.setServiceInstanceId(requestScope, sir));
+    }
+
+    @Test
+    public void camundaHistoryCheckTest() throws ContactCamundaException, RequestDbFailureException {
+        wireMockServer.stubFor(get(
+                ("/sobpmnengine/history/process-instance?variables=mso-request-id_eq_f0a35706-efc4-4e27-80ea-a995d7a2a40f"))
+                        .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                                .withBodyFile("Camunda/HistoryCheckResponse.json")
+                                .withStatus(org.apache.http.HttpStatus.SC_OK)));
+
+        InfraActiveRequests duplicateRecord = new InfraActiveRequests();
+        duplicateRecord.setRequestId("f0a35706-efc4-4e27-80ea-a995d7a2a40f");
+        boolean inProgress = false;
+        inProgress = requestHandlerUtils.camundaHistoryCheck(duplicateRecord, null);
+        assertTrue(inProgress);
+    }
+
+    @Test
+    public void camundaHistoryCheckNoneFoundTest() throws ContactCamundaException, RequestDbFailureException {
+        wireMockServer.stubFor(get(
+                ("/sobpmnengine/history/process-instance?variables=mso-request-id_eq_f0a35706-efc4-4e27-80ea-a995d7a2a40f"))
+                        .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                                .withBody("[]").withStatus(org.apache.http.HttpStatus.SC_OK)));
 
+        InfraActiveRequests duplicateRecord = new InfraActiveRequests();
+        duplicateRecord.setRequestId("f0a35706-efc4-4e27-80ea-a995d7a2a40f");
+        boolean inProgress = false;
+        inProgress = requestHandlerUtils.camundaHistoryCheck(duplicateRecord, null);
+        assertFalse(inProgress);
+    }
+
+    @Test
+    public void camundaHistoryCheckNotInProgressTest() throws ContactCamundaException, RequestDbFailureException {
+        wireMockServer.stubFor(get(
+                ("/sobpmnengine/history/process-instance?variables=mso-request-id_eq_f0a35706-efc4-4e27-80ea-a995d7a2a40f"))
+                        .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                                .withBodyFile("Camunda/HistoryCheckResponseCompleted.json")
+                                .withStatus(org.apache.http.HttpStatus.SC_OK)));
+
+        InfraActiveRequests duplicateRecord = new InfraActiveRequests();
+        duplicateRecord.setRequestId("f0a35706-efc4-4e27-80ea-a995d7a2a40f");
+        boolean inProgress = false;
+        inProgress = requestHandlerUtils.camundaHistoryCheck(duplicateRecord, null);
+        assertFalse(inProgress);
+    }
+
+    @Test
+    public void setCamundaHeadersTest() throws ContactCamundaException, RequestDbFailureException {
+        String encryptedAuth = "015E7ACF706C6BBF85F2079378BDD2896E226E09D13DC2784BA309E27D59AB9FAD3A5E039DF0BB8408"; // user:password
+        String key = "07a7159d3bf51a0e53be7a8f89699be7";
+        HttpHeaders headers = requestHandlerUtils.setCamundaHeaders(encryptedAuth, key);
+        List<org.springframework.http.MediaType> acceptedType = headers.getAccept();
+        String expectedAcceptedType = "application/json";
+        assertEquals(expectedAcceptedType, acceptedType.get(0).toString());
+        String basicAuth = headers.getFirst(HttpHeaders.AUTHORIZATION);
+        String expectedBasicAuth = "Basic dXNlcjpwYXNzd29yZA==";
+        assertEquals(expectedBasicAuth, basicAuth);
+    }
+
+    @Test
+    public void handleReplaceInstance_Test() throws JsonParseException, JsonMappingException, IOException {
+        String replaceVfModule = inputStream("/ReplaceVfModule.json");
+        ObjectMapper mapper = new ObjectMapper();
+        ServiceInstancesRequest sir = mapper.readValue(replaceVfModule, ServiceInstancesRequest.class);
+        Actions action = servInstances.handleReplaceInstance(Action.replaceInstance, sir);
+        assertEquals(Action.replaceInstance, action);
+    }
+
+    @Test
+    public void handleReplaceInstance_retainAssignments_Test()
+            throws JsonParseException, JsonMappingException, IOException {
+        String replaceVfModule = inputStream("/ReplaceVfModuleRetainAssignments.json");
+        ObjectMapper mapper = new ObjectMapper();
+        ServiceInstancesRequest sir = mapper.readValue(replaceVfModule, ServiceInstancesRequest.class);
+        Actions action = servInstances.handleReplaceInstance(Action.replaceInstance, sir);
+        assertEquals(Action.replaceInstanceRetainAssignments, action);
+    }
 }
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/resources/ServiceInstanceTest/ReplaceVfModuleRetainAssignments.json b/mso-api-handlers/mso-api-handler-infra/src/test/resources/ServiceInstanceTest/ReplaceVfModuleRetainAssignments.json
new file mode 100644 (file)
index 0000000..166f7cc
--- /dev/null
@@ -0,0 +1,33 @@
+{
+       "requestDetails": {
+               "requestInfo": { 
+                       "source": "VID", 
+                       "requestorId": "xxxxxx",
+                       "instanceName": "testService60"
+               },
+               "requestParameters": {
+                       "aLaCarte": true, 
+                       "autoBuildVfModules": false,
+                       "retainAssignments": true,
+                       "subscriptionServiceType": "test"
+               },
+               "cloudConfiguration": {
+                       "lcpCloudRegionId": "mdt1",
+                       "tenantId": "88a6ca3ee0394ade9403f075db23167e"
+               },
+               "modelInfo":{
+                       "modelInvariantId": "f7ce78bb-423b-11e7-93f8-0050569a7968",
+                       "modelVersion":"2", 
+                       "modelVersionId":"78ca26d0-246d-11e7-93ae-92361f002671", 
+                       "modelType":"vfModule",
+                       "modelName":"serviceModel",
+                       "modelCustomizationId": "a7f1d08e-b02d-11e6-80f5-76304dec7eb7"
+               },
+               "subscriberInfo": {
+               "globalSubscriberId": "MSO_1610_dev", 
+               "subscriberName": "MSO_1610_dev"
+       }
+       }
+}
+       
+       
\ No newline at end of file