Merge "Begin release notes for El Alto Early Drop"
authorAmichai Hemli <ah0398@intl.att.com>
Thu, 22 Aug 2019 18:27:02 +0000 (18:27 +0000)
committerGerrit Code Review <gerrit@onap.org>
Thu, 22 Aug 2019 18:27:02 +0000 (18:27 +0000)
19 files changed:
vid-app-common/src/main/java/org/onap/vid/changeManagement/UpdateRequestInfo.java
vid-app-common/src/main/java/org/onap/vid/controller/MsoController.java
vid-app-common/src/main/java/org/onap/vid/model/RequestReferencesContainer.java
vid-app-common/src/main/java/org/onap/vid/model/aaiTree/RelatedVnf.java
vid-app-common/src/main/java/org/onap/vid/model/probes/HttpRequestMetadata.java
vid-app-common/src/main/java/org/onap/vid/mso/MsoBusinessLogicImpl.java
vid-app-common/src/main/java/org/onap/vid/mso/MsoInterface.java
vid-app-common/src/main/java/org/onap/vid/mso/rest/MsoRestClientNew.java
vid-app-common/src/main/java/org/onap/vid/mso/rest/TaskList.java
vid-app-common/src/main/java/org/onap/vid/scheduler/SchedulerRestInterface.java
vid-app-common/src/main/java/org/onap/vid/utils/Logging.java
vid-app-common/src/main/webapp/app/vid/scripts/controller/aaiSubscriberController.js
vid-app-common/src/test/java/org/onap/vid/asdc/rest/SdcRestClientITTest.java
vid-app-common/src/test/java/org/onap/vid/controller/MsoControllerTest.java
vid-app-common/src/test/java/org/onap/vid/mso/MsoBusinessLogicImplTest.java
vid-app-common/src/test/java/org/onap/vid/mso/rest/MsoRestClientNewTest.java
vid-app-common/src/test/java/org/onap/vid/mso/rest/MsoRestClientTest.java
vid-app-common/src/test/java/org/onap/vid/testUtils/StubServerUtil.java
vid-automation/src/test/java/org/onap/vid/api/ProbeApiTest.java

index ff8516e..dc6e56f 100644 (file)
@@ -3,6 +3,7 @@
  * VID
  * ================================================================================
  * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2018 IBM.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,6 +27,12 @@ import org.onap.vid.mso.model.RequestInfo;
  * Created by Oren on 9/5/17.
  */
 public class UpdateRequestInfo {
+       
+    public String source;
+
+    public  Boolean suppressRollback;
+
+    public String requestorId;
 
     public UpdateRequestInfo() {
     }
@@ -36,11 +43,6 @@ public class UpdateRequestInfo {
         this.suppressRollback = requestInfo.getSuppressRollback();
         this.source = requestInfo.getSource();
     }
-    public String source;
-
-    public  Boolean suppressRollback;
-
-    public String requestorId;
-
+    
 
 }
index fc718f0..535c97c 100644 (file)
@@ -302,7 +302,6 @@ public class MsoController extends RestrictedBaseController {
      * @throws Exception the exception
      */
     @RequestMapping(value = "/mso_delete_vnf_instance/{serviceInstanceId}/vnfs/{vnfInstanceId}", method = RequestMethod.POST)
-
     public ResponseEntity<String> deleteVnf(@PathVariable("serviceInstanceId") String serviceInstanceId,
         @PathVariable("vnfInstanceId") String vnfInstanceId,
         HttpServletRequest request, @RequestBody RequestDetails msoRequest) {
@@ -449,7 +448,6 @@ public class MsoController extends RestrictedBaseController {
      * @return the response entity
      * @throws Exception the exception
      */
-    //mso_delete_vf_module/bc305d54-75b4-431b-adb2-eb6b9e546014/vnfs/fe9000-0009-9999/vfmodules/abeeee-abeeee-abeeee
     @RequestMapping(value = "/mso_delete_vfmodule_instance/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfModuleId}", method = RequestMethod.POST)
     public ResponseEntity<String> deleteVfModule(
         @PathVariable("serviceInstanceId") String serviceInstanceId,
index cc8fff6..cd6942e 100644 (file)
@@ -3,6 +3,7 @@
  * VID
  * ================================================================================
  * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 IBM.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -33,7 +34,11 @@ public class RequestReferencesContainer {
 
     @JsonIgnore
     private Map<String, Object> additionalProperties = new HashMap<>();
-
+    
+    public RequestReferencesContainer(@JsonProperty("requestReferences") RequestReferences requestReferences) {
+        this.requestReferences = requestReferences;
+    }
+    
     @JsonAnyGetter
     public Map<String, Object> getAdditionalProperties() {
         return this.additionalProperties;
@@ -44,10 +49,6 @@ public class RequestReferencesContainer {
         this.additionalProperties.put(name, value);
     }
 
-    public RequestReferencesContainer(@JsonProperty("requestReferences") RequestReferences requestReferences) {
-        this.requestReferences = requestReferences;
-    }
-
     public RequestReferences getRequestReferences() {
         return requestReferences;
     }
index febd8e0..f5c1428 100644 (file)
@@ -3,6 +3,7 @@
  * VID
  * ================================================================================
  * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 IBM.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -30,6 +31,10 @@ public class RelatedVnf extends Node {
     private String serviceInstanceName;
     private String tenantName;
 
+    public RelatedVnf(AAITreeNode node) {
+        super(node);
+    }
+    
     public String getServiceInstanceId() {
         return serviceInstanceId;
     }
@@ -54,10 +59,6 @@ public class RelatedVnf extends Node {
         this.tenantName = tenantName;
     }
 
-    public RelatedVnf(AAITreeNode node) {
-        super(node);
-    }
-
     public static RelatedVnf from(AAITreeNode node) {
         RelatedVnf vnf = new RelatedVnf(node);
         if (node.getParent() != null && node.getParent().getType() == NodeType.SERVICE_INSTANCE) {
index b284b01..984c0d7 100644 (file)
@@ -21,6 +21,8 @@
 
 package org.onap.vid.model.probes;
 
+import static org.apache.commons.lang3.ObjectUtils.defaultIfNull;
+
 import com.google.common.base.MoreObjects;
 import java.nio.charset.StandardCharsets;
 import org.apache.commons.io.IOUtils;
@@ -32,8 +34,6 @@ import org.onap.vid.mso.RestObjectWithRequestInfo;
 import org.onap.vid.utils.Logging;
 import org.springframework.http.HttpMethod;
 
-import static org.apache.commons.lang3.ObjectUtils.defaultIfNull;
-
 public class HttpRequestMetadata extends StatusMetadata {
     private final HttpMethod httpMethod;
     private final int httpCode;
@@ -90,6 +90,7 @@ public class HttpRequestMetadata extends StatusMetadata {
         this.httpCode = response.getResponse().getStatus();
         if (readRawData) {
             try {
+                response.getResponse().getRawBody().reset();
                 this.rawData = IOUtils.toString(response.getResponse().getRawBody(), StandardCharsets.UTF_8.name());
             } catch (Exception e) {
                 //Nothing to do here
index 9146e8f..4d0d4ee 100644 (file)
@@ -60,6 +60,8 @@ import javax.ws.rs.BadRequestException;
 import org.apache.commons.collections4.ListUtils;
 import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
 import org.onap.portalsdk.core.util.SystemProperties;
+import org.onap.vid.aai.ExceptionWithRequestInfo;
+import org.onap.vid.aai.HttpResponseWithRequestInfo;
 import org.onap.vid.changeManagement.ChangeManagementRequest;
 import org.onap.vid.changeManagement.RequestDetailsWrapper;
 import org.onap.vid.changeManagement.WorkflowRequestDetail;
@@ -67,6 +69,7 @@ import org.onap.vid.controller.OperationalEnvironmentController;
 import org.onap.vid.exceptions.GenericUncheckedException;
 import org.onap.vid.model.SOWorkflowList;
 import org.onap.vid.model.SoftDeleteRequest;
+import org.onap.vid.model.probes.ErrorMetadata;
 import org.onap.vid.model.probes.ExternalComponentStatus;
 import org.onap.vid.model.probes.HttpRequestMetadata;
 import org.onap.vid.model.probes.StatusMetadata;
@@ -84,8 +87,8 @@ import org.onap.vid.mso.rest.RequestList;
 import org.onap.vid.mso.rest.RequestWrapper;
 import org.onap.vid.mso.rest.Task;
 import org.onap.vid.mso.rest.TaskList;
+import org.onap.vid.utils.Logging;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpMethod;
 import org.springframework.http.HttpStatus;
 
 public class MsoBusinessLogicImpl implements MsoBusinessLogic {
@@ -383,12 +386,13 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
     }
 
     private List<RequestWrapper> getOrchestrationRequestsByFilter(String filterName, String filterValue) {
+        HttpResponseWithRequestInfo<String> msoResponseWrapper = getRawOrchestrationRequestsByFilter(filterName, filterValue);
+        return deserializeOrchestrationRequestsJson(msoResponseWrapper.getResponse().getBody());
+    }
+
+    private HttpResponseWithRequestInfo<String> getRawOrchestrationRequestsByFilter(String filterName, String filterValue) {
         String orchestrationReqPath = constructOrchestrationRequestFilter(filterName, filterValue);
-        RestObject<String> restObjStr = new RestObject<>();
-        String str = new String();
-        restObjStr.set(str);
-        MsoResponseWrapper msoResponseWrapper = msoClientInterface.getOrchestrationRequest(str, "", orchestrationReqPath, restObjStr, true);
-        return deserializeOrchestrationRequestsJson(msoResponseWrapper.getEntity());
+        return msoClientInterface.getOrchestrationRequest(orchestrationReqPath, true);
     }
 
     private List<RequestWrapper> deserializeOrchestrationRequestsJson(String orchestrationRequestsJson) {
@@ -837,22 +841,38 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
 
     @Override
     public ExternalComponentStatus probeComponent() {
-        String url = SystemProperties.getProperty(
-                MsoProperties.MSO_SERVER_URL) + "/" + SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQS);
-        long startTime = System.currentTimeMillis();
-        ExternalComponentStatus externalComponentStatus;
-
+        final long startTime = System.currentTimeMillis();
+        HttpResponseWithRequestInfo<String> responseWithRequestInfo = null;
         try {
-            String rawBody = objectMapper.writeValueAsString(getOrchestrationRequestsForDashboard());
-            StatusMetadata statusMetadata=new HttpRequestMetadata(HttpMethod.GET,200,url,rawBody,"VID-SO",System.currentTimeMillis() - startTime);
+            responseWithRequestInfo = getRawOrchestrationRequestsByFilter("requestExecutionDate", "01-01-2100" );
+            int httpCode = responseWithRequestInfo.getResponse().getStatus();
+            boolean isAvailable = httpCode == 200 || httpCode == 202;
+            if (isAvailable) {
+                //make sure response can be parsed to RequestList.class
+                JACKSON_OBJECT_MAPPER.readValue(responseWithRequestInfo.getResponse().getBody(), RequestList.class);
+            }
+
+            HttpRequestMetadata metadata = new HttpRequestMetadata(responseWithRequestInfo,
+                isAvailable ? "OK" : "MSO returned no orchestration requests",
+                System.currentTimeMillis() - startTime, true);
+            return new ExternalComponentStatus(ExternalComponentStatus.Component.MSO, isAvailable, metadata);
 
-            externalComponentStatus = new ExternalComponentStatus(ExternalComponentStatus.Component.MSO, true, statusMetadata);
+        } catch (ExceptionWithRequestInfo e) {
+            long duration = System.currentTimeMillis() - startTime;
+            return new ExternalComponentStatus(ExternalComponentStatus.Component.MSO, false,
+                new HttpRequestMetadata(e, duration));
         } catch (Exception e) {
-            StatusMetadata statusMetadata = new HttpRequestMetadata(HttpMethod.GET, HttpStatus.INTERNAL_SERVER_ERROR.value(), url, "", e.getMessage(), System.currentTimeMillis() - startTime);
-            externalComponentStatus = new ExternalComponentStatus(ExternalComponentStatus.Component.MSO, false, statusMetadata);
-        }
+            StatusMetadata metadata;
+            long duration = System.currentTimeMillis() - startTime;
 
-        return externalComponentStatus;
+            if (responseWithRequestInfo == null) {
+                metadata = new ErrorMetadata(Logging.exceptionToDescription(e), duration);
+            } else {
+                metadata = new HttpRequestMetadata(responseWithRequestInfo, Logging.exceptionToDescription(e), duration, true);
+            }
+
+            return new ExternalComponentStatus(ExternalComponentStatus.Component.MSO, false, metadata);
+        }
     }
 
     private void validateUpdateVnfConfig(RequestDetails requestDetails) {
index 46bd273..d1cb3a3 100644 (file)
@@ -21,6 +21,7 @@
 package org.onap.vid.mso;
 
 import io.joshworks.restclient.http.HttpResponse;
+import org.onap.vid.aai.HttpResponseWithRequestInfo;
 import org.onap.vid.changeManagement.RequestDetailsWrapper;
 import org.onap.vid.model.SOWorkflowList;
 import org.onap.vid.changeManagement.WorkflowRequestDetail;
@@ -89,7 +90,7 @@ public interface MsoInterface {
 
     MsoResponseWrapper deleteNwInstance(RequestDetails requestDetails, String endpoint);
 
-    MsoResponseWrapper getOrchestrationRequest(String t, String sourceId, String endpoint, RestObject restObject, boolean warpException);
+    HttpResponseWithRequestInfo<String> getOrchestrationRequest(String endpoint, boolean warpException);
 
     MsoResponseWrapper getOrchestrationRequest(String endpoint);
 
index df8034b..cc6d612 100644 (file)
@@ -35,6 +35,7 @@ import org.apache.commons.codec.binary.Base64;
 import org.eclipse.jetty.util.security.Password;
 import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
 import org.onap.portalsdk.core.util.SystemProperties;
+import org.onap.vid.aai.HttpResponseWithRequestInfo;
 import org.onap.vid.aai.util.HttpsAuthClient;
 import org.onap.vid.changeManagement.MsoRequestDetails;
 import org.onap.vid.changeManagement.RequestDetailsWrapper;
@@ -51,6 +52,7 @@ import org.onap.vid.mso.RestMsoImplementation;
 import org.onap.vid.mso.RestObject;
 import org.onap.vid.utils.Logging;
 import org.onap.vid.utils.SystemPropertiesWrapper;
+import org.springframework.http.HttpMethod;
 
 
 /**
@@ -216,11 +218,11 @@ public class MsoRestClientNew extends RestMsoImplementation implements MsoInterf
     }
 
     @Override
-    public MsoResponseWrapper getOrchestrationRequest(String t, String sourceId, String endpoint, RestObject restObject, boolean warpException) {
+    public HttpResponseWithRequestInfo<String> getOrchestrationRequest(String endpoint, boolean warpException) {
         String path = baseUrl + endpoint;
 
         HttpResponse<String> response = client.get(path, commonHeaders, new HashMap<>(), String.class);
-        return MsoUtil.wrapResponse(response);
+        return new HttpResponseWithRequestInfo<>(response, path, HttpMethod.GET);
     }
 
     @Override
index 90e3a21..cfde4c9 100644 (file)
@@ -3,6 +3,7 @@
  * VID
  * ================================================================================
  * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 IBM.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,6 +24,8 @@ package org.onap.vid.mso.rest;
 import java.util.List;
 
 public class TaskList {
+       
+    private List<Task> taskList;
 
     public List<Task> getTaskList() {
         return taskList;
@@ -32,5 +35,4 @@ public class TaskList {
         this.taskList = taskList;
     }
 
-    private List<Task> taskList;
 }
index 78b3e97..7878c2f 100644 (file)
@@ -21,6 +21,7 @@
 package org.onap.vid.scheduler;
 
 import com.att.eelf.configuration.EELFLogger;
+import com.fasterxml.jackson.core.type.TypeReference;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
 import io.joshworks.restclient.http.HttpResponse;
@@ -43,6 +44,7 @@ import java.util.Collections;
 import java.util.Map;
 import java.util.function.Function;
 
+import static org.onap.vid.utils.KotlinUtilsKt.JACKSON_OBJECT_MAPPER;
 import static org.onap.vid.utils.Logging.REQUEST_ID_HEADER_KEY;
 
 @Service
@@ -90,15 +92,19 @@ public class SchedulerRestInterface implements SchedulerRestInterfaceIfc {
                     .putAll(commonHeaders)
                     .put(REQUEST_ID_HEADER_KEY, Logging.extractOrGenerateRequestId())
                     .build();
-            final HttpResponse<T> response = ((HttpResponse<T>) syncRestClient.get(url, requestHeaders,
-                    Collections.emptyMap(), t.getClass()));
+            final HttpResponse<String> response = syncRestClient.get(url, requestHeaders,
+                    Collections.emptyMap(), String.class);
             Logging.logResponse(outgoingRequestsLogger, HttpMethod.GET, url, response);
             status = response.getStatus();
             restObject.setStatusCode(status);
-
+            rawData = response.getBody();
             if (status == 200) {
-                t = response.getBody();
-                restObject.set(t);
+                if (t instanceof String) {
+                    restObject.set((T)rawData);
+                }
+                else {
+                    restObject.set(JACKSON_OBJECT_MAPPER.readValue(rawData, new TypeReference<T>() {}));
+                }
                 logger.debug(EELFLoggerDelegate.debugLogger, "<== " + methodName + SUCCESSFUL_API_MESSAGE);
                 logger.info(EELFLoggerDelegate.errorLogger, "<== " + methodName + SUCCESSFUL_API_MESSAGE);
             } else {
@@ -106,7 +112,7 @@ public class SchedulerRestInterface implements SchedulerRestInterfaceIfc {
             }
             return new RestObjectWithRequestInfo<>(HttpMethod.GET, url, restObject, status, rawData);
         }
-        catch (RuntimeException e) {
+        catch (Exception e) {
             throw new ExceptionWithRequestInfo(HttpMethod.GET, url, rawData, status, e);
         }
     }
index df7f20e..71478fc 100644 (file)
@@ -119,7 +119,7 @@ public class Logging {
             response.bufferEntity();
             logger.debug("Received {} {} Status: {} . Body: {}", method.name(), url, response.getStatus(), response.readEntity(entityClass));
         }
-        catch (ProcessingException | IllegalStateException e) {
+        catch (Exception e) {
             logger.debug("Received {} {} Status: {} . Failed to read response as {}", method.name(), url, response.getStatus(), entityClass.getName());
         }
     }
@@ -128,7 +128,7 @@ public class Logging {
         try {
             logger.debug("Received {} {} Status: {} . Body: {}", method.name(), url, response.getStatus(), response.getBody());
         }
-        catch (ProcessingException | IllegalStateException e) {
+        catch (Exception e) {
             logger.debug("Received {} {} Status: {} . Failed to read response", method.name(), url, response.getStatus());
         }
     }
index e66b8ff..bf3d54a 100755 (executable)
@@ -55,7 +55,7 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
                 componentId: COMPONENT.VNF,\r
                 callbackFunction: callbackFunction\r
             });\r
-        }\r
+        };\r
         $scope.popup = new Object();\r
 \r
 \r
@@ -85,18 +85,18 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
 \r
         $scope.getServiceTypes = function (globalCustomerId) {\r
             DataService.setGlobalCustomerId(globalCustomerId);\r
-            DataService.setServiceIdList($scope.customerList)\r
+            DataService.setServiceIdList($scope.customerList);\r
 \r
             if (globalCustomerId !== "" && globalCustomerId !== undefined) {\r
                 window.location.href = COMPONENT.SERVICE_TYPE_LIST_PATH + $scope.serviceTypeList;\r
             }\r
-        }\r
+        };\r
 \r
         $scope.refreshServiceTypes = function (globalCustomerId) {\r
             DataService.setGlobalCustomerId(globalCustomerId);\r
 \r
             $scope.getServiceTypesList();\r
-        }\r
+        };\r
 \r
         $scope.subId = "";\r
         $scope.createSubscriberName = "";\r
@@ -138,7 +138,7 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
         $scope.subList = [];\r
         $scope.getAaiServiceModels = function (selectedServicetype, subName) {\r
             DataService.setGlobalCustomerId(selectedServicetype);\r
-            DataService.setServiceIdList($scope.serviceTypeList)\r
+            DataService.setServiceIdList($scope.serviceTypeList);\r
             DataService.setSubscriberName(subName);\r
 \r
             DataService.setSubscribers($scope.custSubList);\r
@@ -347,12 +347,12 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
                 callbackFunction: function (response) {\r
                 }\r
             });\r
-        }\r
+        };\r
         $scope.cancelCreateSIType = function () {\r
 \r
             window.location.href = COMPONENT.SERVICE_MODLES_INSTANCES_SUBSCRIBERS_PATH;\r
 \r
-        }\r
+        };\r
 \r
         $scope.fetchServices = function () {\r
             var serviceIdList = [];\r
@@ -395,12 +395,12 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
                 $scope.errorMsg = FIELD.ERROR.AAI_FETCHING_CUST_DATA + response.status;\r
                 $scope.errorDetails = response.data;\r
             });\r
-        }\r
+        };\r
 \r
         $scope.getPermitted = function (item) {\r
             return item.isPermitted || item[FIELD.ID.IS_PERMITTED];\r
 \r
-        }\r
+        };\r
 \r
 \r
         $scope.getSubDetails = function () {\r
@@ -482,7 +482,7 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
             $scope.enableCloseButton(false);\r
             $scope.resetProgress();\r
             $scope.setProgress(2); // Show "a little" progress\r
-        }\r
+        };\r
 \r
         function getRelatedInstanceGroupsByVnfId(genericVnf) {\r
             var model = vidService.getModel();\r
@@ -503,7 +503,7 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
                             )\r
                         }\r
                     }\r
-                })\r
+                });\r
             }\r
         }\r
 \r
@@ -516,7 +516,7 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
                 return resolveIfIsPermitted()\r
                     .then(function() {\r
                         return getAsdcModelByVersionId(modelVersionId);\r
-                    })\r
+                    });\r
             }\r
         }\r
 \r
@@ -689,7 +689,7 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
                     // the response is erroneous\r
                     console.log("aaiSubscriber getAsdcModel BAD RESPONSE");\r
                     errorCallback(response);\r
-                    return $q.reject()\r
+                    return $q.reject();\r
                 }\r
             }, errorCallback);\r
 \r
@@ -706,9 +706,9 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
                 if (item[FIELD.ID.SERVICE_INSTANCES] != null) {\r
                     item[FIELD.ID.SERVICE_INSTANCES][FIELD.ID.SERVICE_INSTANCE].forEach(function (service) {\r
                         if (service[FIELD.ID.SERVICE_INSTANCE_ID] === serviceId) {\r
-                            orchStatus = service['orchestration-status']\r
+                            orchStatus = service['orchestration-status'];\r
                         }\r
-                    })\r
+                    });\r
                 }\r
             });\r
             return orchStatus;\r
@@ -722,7 +722,7 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
                 }, function (response) {\r
                     //TODO\r
                 });\r
-        }\r
+        };\r
 \r
         $scope.isConfigurationDataAvailiable = function (configuration) {\r
             $log.debug(configuration);\r
index 126f300..589874d 100644 (file)
@@ -85,7 +85,7 @@ public class SdcRestClientITTest {
         String expectedEndpoint = String.format("/sdc/v1/catalog/services/%s/toscaModel", uuid);
 
         stubServer.prepareGetCall(
-                expectedEndpoint, stringContent("sampleFileContent"), "sampleFileContent", ok(), "application/octet-stream");
+                expectedEndpoint, stringContent("sampleFileContent"), ok(), "application/octet-stream");
 
 
         Path serviceToscaModel = sdcRestClient.getServiceToscaModel(uuid);
index a1b4559..a2f86f4 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.onap.vid.controller;
 
+import static java.lang.String.format;
 import static org.mockito.ArgumentMatchers.argThat;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.BDDMockito.given;
@@ -44,11 +45,14 @@ import org.jeasy.random.randomizers.misc.BooleanRandomizer;
 import org.jeasy.random.randomizers.text.StringRandomizer;
 import org.junit.Before;
 import org.junit.Test;
+import org.onap.vid.model.RequestReferencesContainer;
 import org.onap.vid.mso.MsoBusinessLogic;
 import org.onap.vid.mso.MsoResponseWrapper;
+import org.onap.vid.mso.RestObject;
 import org.onap.vid.mso.rest.MsoRestClientNew;
 import org.onap.vid.mso.rest.Request;
 import org.onap.vid.mso.rest.RequestDetails;
+import org.onap.vid.mso.rest.RequestDetailsWrapper;
 import org.onap.vid.mso.rest.Task;
 import org.onap.vid.services.CloudOwnerService;
 import org.springframework.test.web.servlet.MockMvc;
@@ -79,6 +83,27 @@ public class MsoControllerTest {
         mockMvc = MockMvcBuilders.standaloneSetup(msoController).build();
     }
 
+    @Test
+    public void shouldGetOrchestrationRequest() throws Exception {
+        // given
+        RequestDetails requestDetails = modelGenerator.nextObject(RequestDetails.class);
+        String requestId = "bc305d54-75b4-431b-adb2-eb6b9e546014";
+
+        MsoResponseWrapper expectedResponse = new MsoResponseWrapper(200, "test");
+        given(msoBusinessLogic
+            .getOrchestrationRequest(requestId))
+            .willReturn(expectedResponse);
+
+        // when & then
+        mockMvc.perform(get(format("/mso/mso_get_orch_req/%s", requestId))
+            .content(asJson(requestDetails))
+            .contentType(APPLICATION_JSON))
+            .andExpect(status().isOk())
+            .andExpect(content().json(asJson(expectedResponse)));
+
+        then(cloudService).shouldHaveZeroInteractions();
+    }
+
     @Test
     public void shouldDelegateNewServiceInstantiation() throws Exception {
         // given
@@ -99,6 +124,28 @@ public class MsoControllerTest {
         then(cloudService).should(only()).enrichRequestWithCloudOwner(objectEqualTo(requestDetails));
     }
 
+    @Test
+    public void shouldCreateVolumeInstance() throws Exception {
+        // given
+        RequestDetails requestDetails = modelGenerator.nextObject(RequestDetails.class);
+        String serviceInstanceId = "bc305d54-75b4-431b-adb2-eb6b9e546014";
+        String vnfInstanceId = "fe9000-0009-9999";
+
+        MsoResponseWrapper expectedResponse = new MsoResponseWrapper(200, "test");
+        given(msoBusinessLogic
+            .createVolumeGroupInstance(objectEqualTo(requestDetails), eq(serviceInstanceId), eq(vnfInstanceId)))
+            .willReturn(expectedResponse);
+
+        // when & then
+        mockMvc.perform(post(format("/mso/mso_create_volumegroup_instance/%s/vnfs/%s", serviceInstanceId, vnfInstanceId))
+            .content(asJson(requestDetails))
+            .contentType(APPLICATION_JSON))
+            .andExpect(status().isOk())
+            .andExpect(content().json(asJson(expectedResponse)));
+
+        then(cloudService).should(only()).enrichRequestWithCloudOwner(objectEqualTo(requestDetails));
+    }
+
     @Test
     public void shouldReturnOrchestrationRequestsForDashboard() throws Exception {
         // given
@@ -194,6 +241,135 @@ public class MsoControllerTest {
         then(cloudService).should(only()).enrichRequestWithCloudOwner(objectEqualTo(requestDetails));
     }
 
+    @Test
+    public void shouldDeleteVfModuleInstance() throws Exception {
+        // given
+        RequestDetails requestDetails = modelGenerator.nextObject(RequestDetails.class);
+        String serviceInstanceId = "bc305d54-75b4-431b-adb2-eb6b9e546014";
+        String vnfInstanceId = "fe9000-0009-9999";
+        String vfModuleId = "abeeee-abeeee-abeeee";
+
+        MsoResponseWrapper wrapper = mock(MsoResponseWrapper.class);
+        given(wrapper.getResponse()).willReturn("some response");
+        given(msoBusinessLogic.deleteVfModule(objectEqualTo(requestDetails), eq(serviceInstanceId), eq(vnfInstanceId), eq(vfModuleId))).willReturn(wrapper);
+
+        // when & then
+        mockMvc.perform(post(format("/mso/mso_delete_vfmodule_instance/%s/vnfs/%s/vfModules/%s", serviceInstanceId, vnfInstanceId, vfModuleId))
+            .content(asJson(requestDetails))
+            .contentType(APPLICATION_JSON))
+            .andExpect(status().isOk())
+            .andExpect(content().string("some response"));
+
+        then(cloudService).should(only()).enrichRequestWithCloudOwner(objectEqualTo(requestDetails));
+    }
+
+    @Test
+    public void shouldDeleteVolumeGroup() throws Exception {
+        // given
+        RequestDetails requestDetails = modelGenerator.nextObject(RequestDetails.class);
+        String serviceInstanceId = "bc305d54-75b4-431b-adb2-eb6b9e546014";
+        String vnfInstanceId = "fe9000-0009-9999";
+        String volumeGroupId = "abeeee-abeeee-abeeee";
+
+        MsoResponseWrapper wrapper = mock(MsoResponseWrapper.class);
+        given(wrapper.getResponse()).willReturn("some response");
+        given(msoBusinessLogic.deleteVolumeGroupInstance(objectEqualTo(requestDetails), eq(serviceInstanceId), eq(vnfInstanceId), eq(volumeGroupId))).willReturn(wrapper);
+
+        // when & then
+        mockMvc.perform(post(format("/mso/mso_delete_volumegroup_instance/%s/vnfs/%s/volumeGroups/%s", serviceInstanceId, vnfInstanceId, volumeGroupId))
+            .content(asJson(requestDetails))
+            .contentType(APPLICATION_JSON))
+            .andExpect(status().isOk())
+            .andExpect(content().string("some response"));
+
+        then(cloudService).should(only()).enrichRequestWithCloudOwner(objectEqualTo(requestDetails));
+    }
+
+    @Test
+    public void shouldDeleteInstance() throws Exception {
+        // given
+        RequestDetails requestDetails = modelGenerator.nextObject(RequestDetails.class);
+        String serviceInstanceId = "bc305d54-75b4-431b-adb2-eb6b9e546014";
+        String networkInstanceId = "fe9000-0009-9999";
+
+        MsoResponseWrapper wrapper = mock(MsoResponseWrapper.class);
+        given(wrapper.getResponse()).willReturn("some response");
+        given(msoBusinessLogic.deleteNwInstance(objectEqualTo(requestDetails), eq(serviceInstanceId), eq(networkInstanceId))).willReturn(wrapper);
+
+        // when & then
+        mockMvc.perform(post(format("/mso/mso_delete_nw_instance/%s/networks/%s", serviceInstanceId, networkInstanceId))
+            .content(asJson(requestDetails))
+            .contentType(APPLICATION_JSON))
+            .andExpect(status().isOk())
+            .andExpect(content().string("some response"));
+
+        then(cloudService).should(only()).enrichRequestWithCloudOwner(objectEqualTo(requestDetails));
+    }
+
+    @Test
+    public void shouldDeleteServiceInstance() throws Exception {
+        // given
+        RequestDetails requestDetails = modelGenerator.nextObject(RequestDetails.class);
+        String serviceInstanceId = "bc305d54-75b4-431b-adb2-eb6b9e546014";
+        String serviceStatus = "ACTIVE";
+
+        MsoResponseWrapper wrapper = mock(MsoResponseWrapper.class);
+        given(wrapper.getResponse()).willReturn("some response");
+        given(msoBusinessLogic.deleteSvcInstance(objectEqualTo(requestDetails), eq(serviceInstanceId), eq(serviceStatus))).willReturn(wrapper);
+
+        // when & then
+        mockMvc.perform(post(format("/mso/mso_delete_svc_instance/%s", serviceInstanceId))
+            .param("serviceStatus", serviceStatus)
+            .content(asJson(requestDetails))
+            .contentType(APPLICATION_JSON))
+            .andExpect(status().isOk())
+            .andExpect(content().string("some response"));
+
+        then(cloudService).shouldHaveZeroInteractions();
+    }
+
+    @Test
+    public void shouldDeleteVnf() throws Exception {
+        // given
+        RequestDetails requestDetails = modelGenerator.nextObject(RequestDetails.class);
+        String serviceInstanceId = "bc305d54-75b4-431b-adb2-eb6b9e546014";
+        String vnfInstanceId = "fe9000-0009-9999";
+
+        MsoResponseWrapper wrapper = mock(MsoResponseWrapper.class);
+        given(wrapper.getResponse()).willReturn("some response");
+        given(msoBusinessLogic.deleteVnf(objectEqualTo(requestDetails), eq(serviceInstanceId), eq(vnfInstanceId))).willReturn(wrapper);
+
+        // when & then
+        mockMvc.perform(post(format("/mso/mso_delete_vnf_instance/%s/vnfs/%s", serviceInstanceId, vnfInstanceId))
+            .content(asJson(requestDetails))
+            .contentType(APPLICATION_JSON))
+            .andExpect(status().isOk())
+            .andExpect(content().string("some response"));
+
+        then(cloudService).should(only()).enrichRequestWithCloudOwner(objectEqualTo(requestDetails));
+    }
+
+    @Test
+    public void shouldDeleteConfiguration() throws Exception {
+        // given
+        RequestDetailsWrapper requestDetails = modelGenerator.nextObject(RequestDetailsWrapper.class);
+        String serviceInstanceId = "bc305d54-75b4-431b-adb2-eb6b9e546014";
+        String configurationId = "fe9000-0009-9999";
+
+        MsoResponseWrapper wrapper = mock(MsoResponseWrapper.class);
+        given(wrapper.getResponse()).willReturn("some response");
+        given(msoBusinessLogic.deleteConfiguration(objectEqualTo(requestDetails), eq(serviceInstanceId), eq(configurationId))).willReturn(wrapper);
+
+        // when & then
+        mockMvc.perform(post(format("/mso/mso_delete_configuration/%s/configurations/%s", serviceInstanceId, configurationId))
+            .content(asJson(requestDetails))
+            .contentType(APPLICATION_JSON))
+            .andExpect(status().isOk())
+            .andExpect(content().string("some response"));
+
+        then(cloudService).should(only()).enrichRequestWithCloudOwner(objectEqualTo(requestDetails.getRequestDetails()));
+    }
+
     @Test
     public void shouldDelegateNewInstanceCreation() throws Exception {
         // given
@@ -234,6 +410,32 @@ public class MsoControllerTest {
         then(cloudService).shouldHaveZeroInteractions();
     }
 
+    @Test
+    public void shouldActivateFabricConfiguration() throws Exception {
+        // given
+        RequestDetails requestDetails = modelGenerator.nextObject(RequestDetails.class);
+        String serviceInstanceId = "bc305d54-75b4-431b-adb2-eb6b9e546014";
+
+        String path = "/mso/path";
+        given(msoBusinessLogic.getActivateFabricConfigurationPath(eq(serviceInstanceId))).willReturn(path);
+
+        RestObject<RequestReferencesContainer> response = new RestObject<>();
+        response.set(mock(RequestReferencesContainer.class));
+        response.setRaw("some response");
+        response.setStatusCode(200);
+
+        given(msoRestClient.PostForObject(objectEqualTo(requestDetails), eq(path), eq(RequestReferencesContainer.class))).willReturn(response);
+
+        // when & then
+        mockMvc.perform(post(format("/mso/mso_activate_fabric_configuration/%s", serviceInstanceId))
+            .content(asJson(requestDetails))
+            .contentType(APPLICATION_JSON))
+            .andExpect(status().isOk())
+            .andExpect(content().string("{\"status\":200,\"entity\":{}}"));
+
+        then(cloudService).shouldHaveZeroInteractions();
+    }
+
     private <T> String asJson(T value) {
         try {
             return objectMapper.writeValueAsString(value);
index 4ddbc0f..ffabc18 100644 (file)
@@ -25,7 +25,12 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
 import static org.assertj.core.api.Assertions.tuple;
 import static org.hamcrest.Matchers.allOf;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.hasEntry;
+import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.startsWith;
 import static org.junit.Assert.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
@@ -37,19 +42,20 @@ import static org.mockito.ArgumentMatchers.isA;
 import static org.mockito.BDDMockito.given;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 import static org.onap.vid.controller.MsoController.CONFIGURATION_ID;
 import static org.onap.vid.controller.MsoController.REQUEST_TYPE;
 import static org.onap.vid.controller.MsoController.SVC_INSTANCE_ID;
 import static org.onap.vid.controller.MsoController.VNF_INSTANCE_ID;
+import static org.onap.vid.model.probes.ExternalComponentStatus.Component.MSO;
 import static org.onap.vid.mso.MsoBusinessLogicImpl.validateEndpointPath;
 
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.common.collect.Lists;
-import com.google.gson.Gson;
 import io.joshworks.restclient.http.HttpResponse;
 import java.io.IOException;
 import java.net.URL;
+import java.nio.charset.StandardCharsets;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
@@ -60,19 +66,26 @@ import java.util.UUID;
 import java.util.stream.Collectors;
 import javax.ws.rs.BadRequestException;
 import org.apache.commons.io.IOUtils;
+import org.apache.http.HttpException;
+import org.hamcrest.Matcher;
+import org.hamcrest.MatcherAssert;
 import org.jetbrains.annotations.NotNull;
 import org.mockito.ArgumentMatcher;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.mockito.hamcrest.MockitoHamcrest;
 import org.onap.portalsdk.core.util.SystemProperties;
+import org.onap.vid.aai.ExceptionWithRequestInfo;
+import org.onap.vid.aai.HttpResponseWithRequestInfo;
 import org.onap.vid.changeManagement.ChangeManagementRequest;
 import org.onap.vid.changeManagement.WorkflowRequestDetail;
 import org.onap.vid.controller.OperationalEnvironmentController;
 import org.onap.vid.exceptions.GenericUncheckedException;
 import org.onap.vid.model.SOWorkflowList;
 import org.onap.vid.model.SoftDeleteRequest;
+import org.onap.vid.model.probes.ErrorMetadata;
 import org.onap.vid.model.probes.ExternalComponentStatus;
+import org.onap.vid.model.probes.HttpRequestMetadata;
 import org.onap.vid.mso.model.CloudConfiguration;
 import org.onap.vid.mso.model.ModelInfo;
 import org.onap.vid.mso.model.OperationalEnvironmentActivateInfo;
@@ -83,9 +96,8 @@ import org.onap.vid.mso.rest.OperationalEnvironment.OperationEnvironmentRequestD
 import org.onap.vid.mso.rest.Request;
 import org.onap.vid.mso.rest.RequestDetails;
 import org.onap.vid.mso.rest.RequestDetailsWrapper;
-import org.onap.vid.mso.rest.RequestList;
-import org.onap.vid.mso.rest.RequestWrapper;
 import org.onap.vid.mso.rest.Task;
+import org.springframework.http.HttpMethod;
 import org.springframework.http.HttpStatus;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
@@ -97,6 +109,7 @@ import org.testng.annotations.Test;
 public class MsoBusinessLogicImplTest extends AbstractTestNGSpringContextTests {
 
     private static final ObjectMapper objectMapper = new ObjectMapper();
+    private static final String MY_PRETTY_URL = "my pretty url";
 
     @Mock
     private MsoInterface msoInterface;
@@ -496,12 +509,8 @@ public class MsoBusinessLogicImplTest extends AbstractTestNGSpringContextTests {
         String vnfModelTypeOrchestrationRequests = getFileContentAsString("mso_model_info_sample_response.json");
         String scaleOutActionOrchestrationRequests = getFileContentAsString("mso_action_scaleout_sample_response.json");
 
-        MsoResponseWrapper msoResponseWrapperMock = mock(MsoResponseWrapper.class);
-        given(msoInterface
-                .getOrchestrationRequest(any(String.class), any(String.class), any(String.class),
-                        any(RestObject.class), anyBoolean()))
-                .willReturn(msoResponseWrapperMock);
-        given(msoResponseWrapperMock.getEntity())
+        HttpResponse<String> httpResponse = mockForGetOrchestrationRequest();
+        given(httpResponse.getBody())
                 .willReturn(vnfModelTypeOrchestrationRequests, scaleOutActionOrchestrationRequests);
 
         //when
@@ -523,13 +532,7 @@ public class MsoBusinessLogicImplTest extends AbstractTestNGSpringContextTests {
         //given
         String vnfModelTypeOrchestrationRequests = getFileContentAsString("mso_model_info_sample_wrong_response.json");
 
-        MsoResponseWrapper msoResponseWrapperMock = mock(MsoResponseWrapper.class);
-        given(msoInterface
-                .getOrchestrationRequest(any(String.class), any(String.class), any(String.class),
-                        any(RestObject.class), anyBoolean()))
-                .willReturn(msoResponseWrapperMock);
-        given(msoResponseWrapperMock.getEntity())
-                .willReturn(vnfModelTypeOrchestrationRequests);
+        mockForGetOrchestrationRequest(200, vnfModelTypeOrchestrationRequests);
 
         //when
         msoBusinessLogic.getOrchestrationRequestsForDashboard();
@@ -1318,9 +1321,15 @@ public class MsoBusinessLogicImplTest extends AbstractTestNGSpringContextTests {
 
     @Test
     public void probeShouldReturnOrchestrationRequestsAndConnectionStatus(){
-        MsoResponseWrapper wrapper = getMsoResponseWrapper();
-        given(msoInterface.getOrchestrationRequest(anyString(),anyString(),
-                anyString(),any(RestObject.class),anyBoolean())).willReturn(wrapper);
+        String body =
+                "{"
+                + "  \"requestList\":"
+                + "  [{"
+                + "      \"request\": {}"
+                + "    }"
+                + "  ]"
+                + "}";
+        mockForGetOrchestrationRequest(200, body);
 
         ExternalComponentStatus externalComponentStatus = msoBusinessLogic.probeComponent();
 
@@ -1328,18 +1337,6 @@ public class MsoBusinessLogicImplTest extends AbstractTestNGSpringContextTests {
         assertThat(externalComponentStatus.getComponent()).isEqualTo(ExternalComponentStatus.Component.MSO);
     }
 
-    @NotNull
-    private MsoResponseWrapper getMsoResponseWrapper() {
-        MsoResponseWrapper wrapper=new MsoResponseWrapper();
-        RequestWrapper requestWrapper = new RequestWrapper();
-        requestWrapper.setRequest(new Request());
-        RequestList requestList = new RequestList();
-        List<RequestWrapper> response = Lists.newArrayList(requestWrapper);
-        requestList.setRequestList(response);
-        wrapper.setEntity(new Gson().toJson(requestList));
-        return wrapper;
-    }
-
     private WorkflowRequestDetail createWorkflowRequestDetail() {
         WorkflowRequestDetail workflowRequestDetail = new WorkflowRequestDetail();
         org.onap.vid.changeManagement.RequestParameters requestParameters = new org.onap.vid.changeManagement.RequestParameters();
@@ -1429,5 +1426,193 @@ public class MsoBusinessLogicImplTest extends AbstractTestNGSpringContextTests {
             super(testException);
         }
     }
+
+    //you need to add mocks to httpResponse
+    private HttpResponse<String> mockForGetOrchestrationRequest() {
+
+        HttpResponse<String> httpResponse = mock(HttpResponse.class);
+        HttpResponseWithRequestInfo<String> httpResponseWithRequestInfo = new HttpResponseWithRequestInfo<>(httpResponse, MY_PRETTY_URL, HttpMethod.GET);
+        when(msoInterface.getOrchestrationRequest(any(String.class),anyBoolean()))
+            .thenReturn(httpResponseWithRequestInfo);
+        return httpResponse;
+    }
+
+    private HttpResponse<String> mockForGetOrchestrationRequest(int statusCode, String body) {
+
+        HttpResponse<String> httpResponse = mockForGetOrchestrationRequest();
+        when(httpResponse.getStatus()).thenReturn(statusCode);
+        when(httpResponse.getBody()).thenReturn(body);
+        try {
+            when(httpResponse.getRawBody()).thenReturn(IOUtils.toInputStream(body, StandardCharsets.UTF_8.name()));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return httpResponse;
+    }
+
+    @Test
+    public void probeComponent_verifyGoodRequest(){
+        String responseString = "" +
+            "{ " +
+            " \"requestList\": [{ " +
+            "   \"request\": { " +
+            "    \"requestDetails\": { " +
+            "     \"cloudConfiguration\": { " +
+            "      \"lcpCloudRegionId\": \"hvf6\", " +
+            "      \"cloudOwner\": \"irma-aic\", " +
+            "      \"tenantId\": \"ffdf52b5e5104b0e8f329b0b1637ee2e\" " +
+            "     }, " +
+            "     \"modelInfo\": { " +
+            "      \"modelCustomizationName\": \"VSP1710PID298109_vWINIFRED 0\", " +
+            "      \"modelCustomizationId\": \"24d43fdb-9aa6-4287-a68e-1e702ea89d13\", " +
+            "      \"modelInvariantId\": \"e7961100-cde6-4b5a-bcda-b8945086950a\", " +
+            "      \"modelVersionId\": \"959a7ba0-89ee-4984-9af6-65d5bdda4b0e\", " +
+            "      \"modelName\": \"VSP1710PID298109_vWINIFRED\", " +
+            "      \"modelType\": \"vnf\", " +
+            "      \"modelVersion\": \"1.0\" " +
+            "     }, " +
+            "     \"relatedModelList\": [{ " +
+            "       \"relatedInstance\": { " +
+            "        \"instanceId\": \"6dd0f8de-93c7-48a2-914b-1a8d58e0eb48\", " +
+            "        \"modelInfo\": { " +
+            "         \"modelInvariantId\": \"57e00952-0af7-4f0f-b19a-408a6f73c8df\", " +
+            "         \"modelType\": \"service\", " +
+            "         \"modelName\": \"ServicevWINIFREDPID298109\", " +
+            "         \"modelVersion\": \"1.0\", " +
+            "         \"modelVersionId\": \"fe6985cd-ea33-3346-ac12-ab121484a3fe\" " +
+            "        } " +
+            "       } " +
+            "      } " +
+            "     ], " +
+            "     \"requestInfo\": { " +
+            "      \"source\": \"VID\", " +
+            "      \"suppressRollback\": false, " +
+            "      \"requestorId\": \"ds828e\" " +
+            "     }, " +
+            "     \"requestParameters\": { " +
+            "      \"userParams\": [ " +
+            "      ], " +
+            "      \"aLaCarte\": false, " +
+            "      \"usePreload\": true, " +
+            "      \"rebuildVolumeGroups\": false, " +
+            "      \"autoBuildVfModules\": false, " +
+            "      \"cascadeDelete\": false " +
+            "     }, " +
+            "     \"relatedInstanceList\": [{ " +
+            "       \"relatedInstance\": { " +
+            "        \"instanceId\": \"6dd0f8de-93c7-48a2-914b-1a8d58e0eb48\", " +
+            "        \"modelInfo\": { " +
+            "         \"modelInvariantId\": \"57e00952-0af7-4f0f-b19a-408a6f73c8df\", " +
+            "         \"modelType\": \"service\", " +
+            "         \"modelName\": \"ServicevWINIFREDPID298109\", " +
+            "         \"modelVersion\": \"1.0\", " +
+            "         \"modelVersionId\": \"fe6985cd-ea33-3346-ac12-ab121484a3fe\" " +
+            "        } " +
+            "       } " +
+            "      } " +
+            "     ] " +
+            "    }, " +
+            "    \"requestId\": \"d352c70d-5ef8-4977-9ea8-4c8cbe860422\", " +
+            "    \"requestScope\": \"vnf\", " +
+            "    \"requestStatus\": { " +
+            "     \"percentProgress\": 100.0, " +
+            "     \"requestState\": \"Some Unknown Value\", " +
+            "     \"statusMessage\": \"Update Is In Progress\", " +
+            "     \"finishTime\": \"Fri, 08 Sep 2017 19:34:33 GMT\" " +
+            "    }, " +
+            "    \"requestType\": \"updateInstance\", " +
+            "    \"startTime\": \"<IN_PROGRESS_DATE>\", " +
+            "    \"instanceReferences\": { " +
+            "     \"serviceInstanceId\": \"6dd0f8de-93c7-48a2-914b-1a8d58e0eb48\", " +
+            "     \"vnfInstanceId\": \"7c00cc1e-6425-4fc3-afc3-0289db288d4c\", " +
+            "     \"requestorId\": \"ds828e\" " +
+            "    } " +
+            "   } " +
+            "  } " +
+            " ] " +
+            "} ";
+
+        mockForGetOrchestrationRequest(200, responseString);
+
+        final ExternalComponentStatus msoStatus = msoBusinessLogic.probeComponent();
+
+        assertMsoStatus(msoStatus, true);
+        assertMetadata(msoStatus, 200, startsWith(responseString.substring(0, 400)), MY_PRETTY_URL, equalTo("OK"));
+    }
+
+    @Test
+    public void probeComponent_response200OkButEmptyPayload_shouldDescribeCorrectly() {
+        String responseString = "" +
+            "{ " +
+            " \"requestList\": []" +
+            "}";
+
+        mockForGetOrchestrationRequest(200, responseString);
+
+        final ExternalComponentStatus msoStatus = msoBusinessLogic.probeComponent();
+
+        assertMsoStatus(msoStatus, true);
+
+        assertMetadata(msoStatus, 200, equalTo(responseString), MY_PRETTY_URL, containsString("OK"));
+    }
+
+    @Test
+    public void probeComponent_response200OkButInvalidPayload_shouldDescribeCorrectly() {
+        String responseString = "this payload is an invalid json";
+
+        mockForGetOrchestrationRequest(200, responseString);
+
+        final ExternalComponentStatus msoStatus = msoBusinessLogic.probeComponent();
+
+        assertMsoStatus(msoStatus, false);
+
+        assertMetadata(msoStatus, 200, equalTo(responseString), MY_PRETTY_URL, containsString("JsonParseException: Unrecognized token"));
+    }
+
+    @Test
+    public void probeComponent_verifyResponse406() {
+        String responseString = "my raw data";
+
+        when(msoInterface.getOrchestrationRequest(any(), eq(true))).thenThrow(
+            new ExceptionWithRequestInfo(HttpMethod.GET, MY_PRETTY_URL, responseString, 406,
+                new GenericUncheckedException(
+                    new HttpException("Simulating as 406 was returned (200 or 202 expected)"))));
+
+        final ExternalComponentStatus msoStatus = msoBusinessLogic.probeComponent();
+
+        assertMsoStatus(msoStatus, false);
+
+        assertMetadata(msoStatus, 406, equalTo(responseString), MY_PRETTY_URL, containsString("HttpException: Simulating as 406 was returned"));
+    }
+
+
+    @Test
+    public void probeComponent_throwNullPointerException_resultIsWithErrorMetadata() {
+        when(msoInterface.getOrchestrationRequest(any(), eq(true))).thenThrow(new NullPointerException());
+
+        final ExternalComponentStatus msoStatus = msoBusinessLogic.probeComponent();
+
+        MatcherAssert.assertThat(msoStatus.isAvailable(), is(false));
+        MatcherAssert.assertThat(msoStatus.getComponent(), is(MSO));
+        MatcherAssert.assertThat(msoStatus.getMetadata(), instanceOf(ErrorMetadata.class));
+
+        final ErrorMetadata metadata = ((ErrorMetadata) msoStatus.getMetadata());
+        org.junit.Assert.assertThat(metadata.getDescription(), containsString("NullPointerException"));
+    }
+
+    private void assertMsoStatus(ExternalComponentStatus msoStatus, boolean isAvailable) {
+        MatcherAssert.assertThat(msoStatus.isAvailable(), is(isAvailable));
+        MatcherAssert.assertThat(msoStatus.getComponent(), is(MSO));
+        MatcherAssert.assertThat(msoStatus.getMetadata(), instanceOf(HttpRequestMetadata.class));
+    }
+
+    private void assertMetadata(ExternalComponentStatus msoStatus, int httpCode, Matcher<String> rawData, String url, Matcher<String> descriptionMatcher) {
+        final HttpRequestMetadata metadata = ((HttpRequestMetadata) msoStatus.getMetadata());
+        org.junit.Assert.assertThat(metadata.getHttpMethod(), equalTo(HttpMethod.GET));
+        org.junit.Assert.assertThat(metadata.getHttpCode(), equalTo(httpCode));
+        org.junit.Assert.assertThat(metadata.getUrl(), equalTo(url));
+        org.junit.Assert.assertThat(metadata.getRawData(), rawData);
+        org.junit.Assert.assertThat(metadata.getDescription(), descriptionMatcher);
+    }
 }
 
index 6cf7d48..c47e7ce 100644 (file)
@@ -46,6 +46,7 @@ import org.junit.BeforeClass;
 import org.junit.Ignore;
 import org.junit.Test;
 import org.onap.portalsdk.core.util.SystemProperties;
+import org.onap.vid.aai.HttpResponseWithRequestInfo;
 import org.onap.vid.client.SyncRestClient;
 import org.onap.vid.controller.MsoController;
 import org.onap.vid.controller.WebConfig;
@@ -324,23 +325,6 @@ public class MsoRestClientNewTest {
         }
     }
 
-    @Test
-    public void testGetOrchestrationRequestsForDashboard() throws Exception {
-        MsoRestClientNew testSubject;
-        String t = "";
-        String sourceId = "";
-        String endpoint = "";
-        RestObject restObject = null;
-        MsoResponseWrapper result;
-
-        // default test
-        try {
-            testSubject = createTestSubject();
-            result = testSubject.getOrchestrationRequest(t, sourceId, endpoint, restObject, true);
-        } catch (Exception e) {
-        }
-    }
-
     @Test
     public void testCompleteManualTask() throws Exception {
         MsoRestClientNew testSubject;
index e4e699d..c91e88b 100644 (file)
@@ -38,6 +38,7 @@ import org.apache.http.message.BasicHttpResponse;
 import org.apache.http.message.BasicStatusLine;
 import org.mockito.Mock;
 import org.onap.portalsdk.core.util.SystemProperties;
+import org.onap.vid.aai.HttpResponseWithRequestInfo;
 import org.onap.vid.changeManagement.RequestDetailsWrapper;
 import org.onap.vid.changeManagement.WorkflowRequestDetail;
 import org.onap.vid.client.SyncRestClient;
@@ -50,6 +51,7 @@ import org.onap.vid.mso.MsoUtil;
 import org.onap.vid.mso.RestObject;
 import org.onap.vid.mso.model.RequestReferences;
 import org.onap.vid.utils.SystemPropertiesWrapper;
+import org.springframework.http.HttpMethod;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.web.WebAppConfiguration;
 import org.testng.annotations.BeforeClass;
@@ -375,17 +377,15 @@ public class MsoRestClientTest {
 
     @Test
     public void shouldProperlyGetOrchestrationRequest() {
-        //  given
-        RestObject restObject = generateMockMsoRestObject();
-
         String endpoint = "testEndpoint";
         HttpResponse<String> httpResponse = HttpResponse.fallback("testOkResponse");
-        MsoResponseWrapper expectedResponse = MsoUtil.wrapResponse(httpResponse);
+        String expectedPath = baseUrl+endpoint;
+        HttpResponseWithRequestInfo<String> expectedResponse = new HttpResponseWithRequestInfo<>(httpResponse, expectedPath, HttpMethod.GET);
 
-        when( client.get( eq(baseUrl+endpoint),anyMap(),anyMap(),eq(String.class) )  ).thenReturn(httpResponse);
+        when( client.get( eq(expectedPath), anyMap(), anyMap(), eq(String.class) )).thenReturn(httpResponse);
 
         //  when
-        MsoResponseWrapper response = restClient.getOrchestrationRequest(null,null,endpoint,restObject,true);
+        HttpResponseWithRequestInfo<String> response = restClient.getOrchestrationRequest(endpoint, true);
 
         //  then
         assertThat(response).isEqualToComparingFieldByField(expectedResponse);
index 3f5bf81..848f80b 100644 (file)
@@ -64,7 +64,7 @@ public class StubServerUtil {
         return String.format("%s://localhost:%s/%s", protocol, stubServer.getPort(), relativePath);
     }
 
-    public void prepareGetCall(String path, Action actionToReturn,Object returnObj, Action expectedAction, String contentType) throws JsonProcessingException {
+    public void prepareGetCall(String path, Action actionToReturn, Action expectedAction, String contentType) throws JsonProcessingException {
         whenHttp(stubServer)
                 .match(Condition.get(path))
                 .then(expectedAction, actionToReturn, contentType(contentType));
@@ -72,7 +72,7 @@ public class StubServerUtil {
 
 
     public void prepareGetCall(String path, Object returnObj, Action expectedAction) throws JsonProcessingException {
-        prepareGetCall(path, jsonContent(returnObj),returnObj, expectedAction, APPLICATION_JSON);
+        prepareGetCall(path, jsonContent(returnObj), expectedAction, APPLICATION_JSON);
     }
 
     public void prepareDeleteCall(String path, Object returnObj, Action expectedAction) throws JsonProcessingException {
index 5248f70..5ed3024 100644 (file)
@@ -142,7 +142,7 @@ public class ProbeApiTest extends BaseApiTest {
                                         200,
                                         SCHEDULER_PATH,
                                         "this payload is an invalid json",
-                                        "javax.ws.rs.ProcessingException"
+                                        "com.fasterxml.jackson.core.JsonParseException"
                                 )
                         ))
                 },
@@ -168,7 +168,7 @@ public class ProbeApiTest extends BaseApiTest {
                                         406,
                                         MSO_QUERY_PARAMS,
                                         "this payload is an invalid json",
-                                        "org.apache.http.HttpException: Get with status=406 (200 or 202 expected), url= http"
+                                        "MSO returned no orchestration requests"
                                 )
                         ), new ExternalComponentStatus(ExternalComponentStatus.Component.SDC,
                                 false,
@@ -185,7 +185,7 @@ public class ProbeApiTest extends BaseApiTest {
                                         400,
                                         SCHEDULER_PATH,
                                         "this payload is an invalid json",
-                                        "org.apache.http.HttpException: Get with status = 400, url = " + SCHEDULER_PATH
+                                        "org.apache.http.HttpException"
                                 )
                         ))
                 }