Improve nbi status 80/79880/2
authorromaingimbert <romain.gimbert@orange.com>
Thu, 7 Mar 2019 08:23:10 +0000 (09:23 +0100)
committerromaingimbert <romain.gimbert@orange.com>
Thu, 7 Mar 2019 15:35:45 +0000 (16:35 +0100)
-add components to check connectivity with onap (sdc, aai, so, dmaap)
-activate full status with ?fullStatus=true
-change test
-change mock tests folders

Change-Id: Iddcd7fce3c1b3b5abfea14c46b2f611f27057319
Issue-ID: EXTAPI-209
Signed-off-by: romaingimbert <romain.gimbert@orange.com>
48 files changed:
src/main/java/org/onap/nbi/OnapComponentsUrlPaths.java
src/main/java/org/onap/nbi/apis/hub/service/CheckDMaaPEventsManager.java
src/main/java/org/onap/nbi/apis/servicecatalog/SdcClient.java
src/main/java/org/onap/nbi/apis/serviceinventory/AaiClient.java
src/main/java/org/onap/nbi/apis/serviceinventory/BaseClient.java
src/main/java/org/onap/nbi/apis/serviceorder/SoClient.java
src/main/java/org/onap/nbi/apis/status/OnapClient.java [new file with mode: 0644]
src/main/java/org/onap/nbi/apis/status/StatusResource.java
src/main/java/org/onap/nbi/apis/status/StatusService.java
src/main/java/org/onap/nbi/apis/status/StatusServiceImpl.java
src/main/java/org/onap/nbi/apis/status/model/ApplicationStatus.java
src/main/java/org/onap/nbi/apis/status/model/OnapModuleType.java [new file with mode: 0644]
src/test/resources/karatetest/features/04--StatusRessourceTest.feature
src/test/resources/mappings/aai/aai_get_6490_service-subscriptions.json [moved from src/test/resources/mappings/aai_get_6490_service-subscriptions.json with 100% similarity]
src/test/resources/mappings/aai/aai_get_customer_6490.json [moved from src/test/resources/mappings/aai_get_customer_6490.json with 100% similarity]
src/test/resources/mappings/aai/aai_get_customer_generic.json [moved from src/test/resources/mappings/aai_get_customer_generic.json with 100% similarity]
src/test/resources/mappings/aai/aai_get_customers.json [new file with mode: 0644]
src/test/resources/mappings/aai/aai_get_generic_service-subscriptions.json [moved from src/test/resources/mappings/aai_get_generic_service-subscriptions.json with 100% similarity]
src/test/resources/mappings/aai/aai_get_service-subscription-Ansible-service.json [moved from src/test/resources/mappings/aai_get_service-subscription-Ansible-service.json with 100% similarity]
src/test/resources/mappings/aai/aai_get_service-subscription_vnf.json [moved from src/test/resources/mappings/aai_get_service-subscription_vnf.json with 100% similarity]
src/test/resources/mappings/aai/aai_get_service-subscriptionsVFW.json [moved from src/test/resources/mappings/aai_get_service-subscriptionsVFW.json with 100% similarity]
src/test/resources/mappings/aai/aai_get_service-subscriptionsvFW-service-2VF-based.json [moved from src/test/resources/mappings/aai_get_service-subscriptionsvFW-service-2VF-based.json with 100% similarity]
src/test/resources/mappings/aai/aai_get_service_3.json [moved from src/test/resources/mappings/aai_get_service_3.json with 100% similarity]
src/test/resources/mappings/aai/aai_get_service_3_format_resource_url.json [moved from src/test/resources/mappings/aai_get_service_3_format_resource_url.json with 100% similarity]
src/test/resources/mappings/aai/aai_get_service_instance.json [moved from src/test/resources/mappings/aai_get_service_instance.json with 100% similarity]
src/test/resources/mappings/aai/aai_get_service_instance_2.json [moved from src/test/resources/mappings/aai_get_service_instance_2.json with 100% similarity]
src/test/resources/mappings/aai/aai_get_service_instance_2_format_resource_url.json [moved from src/test/resources/mappings/aai_get_service_instance_2_format_resource_url.json with 100% similarity]
src/test/resources/mappings/aai/aai_get_service_instance_format_resource_url.json [moved from src/test/resources/mappings/aai_get_service_instance_format_resource_url.json with 100% similarity]
src/test/resources/mappings/aai/aai_get_tenants.json [moved from src/test/resources/mappings/aai_get_tenants.json with 100% similarity]
src/test/resources/mappings/aai/aai_put_customer.json [moved from src/test/resources/mappings/aai_put_customer.json with 100% similarity]
src/test/resources/mappings/aai/aai_put_customer_service.json [moved from src/test/resources/mappings/aai_put_customer_service.json with 100% similarity]
src/test/resources/mappings/dmaap/dmaap_get_aaievents.json [moved from src/test/resources/mappings/dmaap_get_aaievents.json with 100% similarity]
src/test/resources/mappings/sdc/sdc_find.json [moved from src/test/resources/mappings/sdc_find.json with 100% similarity]
src/test/resources/mappings/sdc/sdc_get_1e3feeb0-8e36-46c6-862c-236d9c626439.json [moved from src/test/resources/mappings/sdc_get_1e3feeb0-8e36-46c6-862c-236d9c626439.json with 100% similarity]
src/test/resources/mappings/sdc/sdc_get_1e3feeb0-8e36-46c6-862c-236d9c626439_tosca.json [moved from src/test/resources/mappings/sdc_get_1e3feeb0-8e36-46c6-862c-236d9c626439_tosca.json with 100% similarity]
src/test/resources/mappings/sdc/sdc_get_1e3feeb0-8e36-46c6-862c-236d9c626439_withoutTosca.json [moved from src/test/resources/mappings/sdc_get_1e3feeb0-8e36-46c6-862c-236d9c626439_withoutTosca.json with 100% similarity]
src/test/resources/mappings/sdc/sdc_get_462f84e5-f0e5-44c5-ab95-38fb4bf77064_toscafile.json [moved from src/test/resources/mappings/sdc_get_462f84e5-f0e5-44c5-ab95-38fb4bf77064_toscafile.json with 100% similarity]
src/test/resources/mappings/sdc/sdc_get_462f84e5-f0e5-44c5-ab95-38fb4bf77064_withTosca.json [moved from src/test/resources/mappings/sdc_get_462f84e5-f0e5-44c5-ab95-38fb4bf77064_withTosca.json with 100% similarity]
src/test/resources/mappings/sdc/sdc_get_artifactTypes.json [new file with mode: 0644]
src/test/resources/mappings/so/so_delete_service_instance.json [moved from src/test/resources/mappings/so_delete_service_instance.json with 100% similarity]
src/test/resources/mappings/so/so_e2e_delete_service_instance.json [moved from src/test/resources/mappings/so_e2e_delete_service_instance.json with 100% similarity]
src/test/resources/mappings/so/so_get_.json [moved from src/test/resources/mappings/so_get_.json with 100% similarity]
src/test/resources/mappings/so/so_get_e2e.json [moved from src/test/resources/mappings/so_get_e2e.json with 100% similarity]
src/test/resources/mappings/so/so_get_e2e_delete.json [moved from src/test/resources/mappings/so_get_e2e_delete.json with 100% similarity]
src/test/resources/mappings/so/so_get_healthcheck.json [new file with mode: 0644]
src/test/resources/mappings/so/so_healthcheck.xml [new file with mode: 0644]
src/test/resources/mappings/so/so_post_create_service_instance.json [moved from src/test/resources/mappings/so_post_create_service_instance.json with 100% similarity]
src/test/resources/mappings/so/so_post_e2e_create_service_instance.json [moved from src/test/resources/mappings/so_post_e2e_create_service_instance.json with 100% similarity]

index 80563d5..428788d 100644 (file)
@@ -27,6 +27,8 @@ public final class OnapComponentsUrlPaths {
     public static final String SDC_ROOT_URL = "/sdc/v1/catalog/services";
     public static final String SDC_GET_PATH = "/metadata";
     public static final String SDC_TOSCA_PATH = "/toscaModel";
+    public static final String SDC_HEALTH_CHECK = "/sdc/v1/artifactTypes";
+
 
     // AAI
     public static final String AAI_GET_TENANTS_PATH =
@@ -36,6 +38,8 @@ public final class OnapComponentsUrlPaths {
             "/aai/v14/business/customers/customer/$customerId/service-subscriptions";
     public static final String AAI_PUT_SERVICE_FOR_CUSTOMER_PATH =
             "/aai/v14/business/customers/customer/$customerId/service-subscriptions/service-subscription/";
+    public static final String AAI_HEALTH_CHECK =
+        "/aai/v14/business/customers";
     public static final String AAI_GET_SERVICE =
             "/aai/v14/nodes/service-instances/service-instance/$serviceId";
     public static final String AAI_GET_SERVICE_CUSTOMER =
@@ -43,6 +47,7 @@ public final class OnapComponentsUrlPaths {
     public static final String AAI_GET_SERVICE_INSTANCES_PATH =
             "/aai/v14/business/customers/customer/$customerId/service-subscriptions/service-subscription/$serviceSpecName/service-instances/";
 
+
     // MSO
     public static final String MSO_CREATE_SERVICE_INSTANCE_PATH = "/onap/so/infra/serviceInstantiation/v7/serviceInstances/";
     public static final String MSO_GET_REQUEST_STATUS_PATH = "/onap/so/infra/orchestrationRequests/v7/";
@@ -50,7 +55,8 @@ public final class OnapComponentsUrlPaths {
     public static final String MSO_CREATE_E2ESERVICE_INSTANCE_PATH = "/onap/so/infra/e2eServiceInstances/v3";
     public static final String MSO_DELETE_E2ESERVICE_INSTANCE_PATH = "/onap/so/infra/e2eServiceInstances/v3/";
     public static final String MSO_GET_E2EREQUEST_STATUS_PATH = "/onap/so/infra/e2eServiceInstances/v3/$serviceId/operations/$operationId";
-    
+    public static final String MSO_HEALTH_CHECK = "/globalhealthcheck";
+
     // DMaaP Message Router REST Client
     public static final String DMAAP_CONSUME_EVENTS =
             "/events/$topic/$consumergroup/$consumerid?timeout=$timeout";
index 6e2811f..7cd2287 100644 (file)
@@ -88,12 +88,8 @@ public class CheckDMaaPEventsManager {
     ObjectMapper mapper = new ObjectMapper();
 
 
-    String dmaapGetEventsUrlFormated = dmaapGetEventsUrl.replace("$topic", topic);
-    dmaapGetEventsUrlFormated = dmaapGetEventsUrlFormated.replace("$consumergroup", consumerGroup);
-    dmaapGetEventsUrlFormated = dmaapGetEventsUrlFormated.replace("$consumerid", consumerId);
-    dmaapGetEventsUrlFormated = dmaapGetEventsUrlFormated.replace("$timeout", timeout);
 
-    List<String> dmaapResponse = callDMaaPGetEvents(dmaapGetEventsUrlFormated);
+    List<String> dmaapResponse = callDMaaPGetEvents();
     if (!CollectionUtils.isEmpty(dmaapResponse)) {
       for (int i = 0; i < dmaapResponse.size(); i++) {
         String aaiEventString = dmaapResponse.get(i);
@@ -158,7 +154,13 @@ public class CheckDMaaPEventsManager {
     }
   }
 
-  public List<String> callDMaaPGetEvents(String dmaapGetEventsUrlFormated) {
+  public List<String> callDMaaPGetEvents() {
+
+    String dmaapGetEventsUrlFormated = dmaapGetEventsUrl.replace("$topic", topic);
+    dmaapGetEventsUrlFormated = dmaapGetEventsUrlFormated.replace("$consumergroup", consumerGroup);
+    dmaapGetEventsUrlFormated = dmaapGetEventsUrlFormated.replace("$consumerid", consumerId);
+    dmaapGetEventsUrlFormated = dmaapGetEventsUrlFormated.replace("$timeout", timeout);
+
 
     if (logger.isDebugEnabled()) {
       logger.debug("Calling DMaaP Url : " + dmaapGetEventsUrlFormated);
index e25ab4e..419a34a 100644 (file)
@@ -71,15 +71,19 @@ public class SdcClient {
 
     private String sdcGetUrl;
     private String sdcFindUrl;
+    private String sdcHealthCheck;
 
     @PostConstruct
     private void setUpAndLogSDCUrl() {
         sdcGetUrl= new StringBuilder().append(sdcHost).append(OnapComponentsUrlPaths.SDC_ROOT_URL+"/{id}"+OnapComponentsUrlPaths.SDC_GET_PATH).toString();
         sdcFindUrl = new StringBuilder().append(sdcHost).append(OnapComponentsUrlPaths.SDC_ROOT_URL).toString();
+        sdcHealthCheck = new StringBuilder().append(sdcHost).append(OnapComponentsUrlPaths.SDC_HEALTH_CHECK).toString();
+
 
 
         LOGGER.info("SDC GET url :  "+sdcGetUrl);
         LOGGER.info("SDC FIND url :  "+ sdcFindUrl);
+        LOGGER.info("SDC HealthCheck :  "+ sdcHealthCheck);
 
     }
 
@@ -111,6 +115,15 @@ public class SdcClient {
 
     }
 
+    public List<LinkedHashMap> callCheckConnectivity() {
+
+        UriComponentsBuilder callURI = UriComponentsBuilder.fromHttpUrl(sdcHealthCheck);
+        ResponseEntity<Object> response = callSdc(callURI.build().encode().toUri());
+        return (List<LinkedHashMap>) response.getBody();
+
+    }
+
+
 
     public File callGetWithAttachment(String toscaModelUrl) {
         StringBuilder urlBuilder = new StringBuilder().append(sdcHost).append(toscaModelUrl);
index 5424db5..0becb02 100644 (file)
@@ -1,15 +1,14 @@
 /**
  * Copyright (c) 2018 Orange
  *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
  *
  * http://www.apache.org/licenses/LICENSE-2.0
  *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
  */
 package org.onap.nbi.apis.serviceinventory;
 
@@ -24,134 +23,146 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
+import org.springframework.http.converter.StringHttpMessageConverter;
 import org.springframework.stereotype.Service;
 
 @Service
 public class AaiClient extends BaseClient {
 
-  public static final String CUSTOMER_ID = "$customerId";
+    public static final String CUSTOMER_ID = "$customerId";
 
-  @Value("${aai.host}")
-  private String aaiHost;
+    @Value("${aai.host}")
+    private String aaiHost;
 
-  @Value("${aai.header.authorization}")
-  private String aaiHeaderAuthorization;
+    @Value("${aai.header.authorization}")
+    private String aaiHeaderAuthorization;
 
-  @Value("${aai.api.id}")
-  private String aaiApiId;
+    @Value("${aai.api.id}")
+    private String aaiApiId;
 
-  @Value("${aai.header.transaction.id}")
-  private String aaiTransactionId;
+    @Value("${aai.header.transaction.id}")
+    private String aaiTransactionId;
 
-  private static final String HEADER_AUTHORIZATION = "Authorization";
-  private static final String X_FROM_APP_ID = "X-FromAppId";
-  private static final Logger LOGGER = LoggerFactory.getLogger(AaiClient.class);
-  private static final String X_TRANSACTION_ID = "X-TransactionId";
+    private static final String HEADER_AUTHORIZATION = "Authorization";
+    private static final String X_FROM_APP_ID = "X-FromAppId";
+    private static final Logger LOGGER = LoggerFactory.getLogger(AaiClient.class);
+    private static final String X_TRANSACTION_ID = "X-TransactionId";
 
 
-  private String aaiServiceUrl;
-  private String aaiServiceCustomerUrl;
-  private String aaiServicesUrl;
-  private String aaiServicesInstancesUrl;
+    private String aaiServiceUrl;
+    private String aaiServiceCustomerUrl;
+    private String aaiServicesUrl;
+    private String aaiServicesInstancesUrl;
+    private String aaiHealthCheckUrl;
 
-  @PostConstruct
-  private void setUpAndlogAAIUrl() {
-    aaiServiceUrl = new StringBuilder().append(aaiHost)
-        .append(OnapComponentsUrlPaths.AAI_GET_SERVICE).toString();
-    aaiServiceCustomerUrl = new StringBuilder().append(aaiHost)
-        .append(OnapComponentsUrlPaths.AAI_GET_SERVICE_CUSTOMER).toString();
-    aaiServicesUrl = new StringBuilder().append(aaiHost)
-        .append(OnapComponentsUrlPaths.AAI_GET_SERVICES_FOR_CUSTOMER_PATH).toString();
-    aaiServicesInstancesUrl = new StringBuilder().append(aaiHost)
-        .append(OnapComponentsUrlPaths.AAI_GET_SERVICE_INSTANCES_PATH).toString();
 
+    @PostConstruct
+    private void setUpAndlogAAIUrl() {
+        aaiServiceUrl = new StringBuilder().append(aaiHost)
+            .append(OnapComponentsUrlPaths.AAI_GET_SERVICE).toString();
+        aaiServiceCustomerUrl = new StringBuilder().append(aaiHost)
+            .append(OnapComponentsUrlPaths.AAI_GET_SERVICE_CUSTOMER).toString();
+        aaiServicesUrl = new StringBuilder().append(aaiHost)
+            .append(OnapComponentsUrlPaths.AAI_GET_SERVICES_FOR_CUSTOMER_PATH).toString();
+        aaiServicesInstancesUrl = new StringBuilder().append(aaiHost)
+            .append(OnapComponentsUrlPaths.AAI_GET_SERVICE_INSTANCES_PATH).toString();
+        aaiHealthCheckUrl = new StringBuilder().append(aaiHost)
+            .append(OnapComponentsUrlPaths.AAI_HEALTH_CHECK).toString();
 
-    LOGGER.info("AAI service url :  " + aaiServiceUrl);
-    LOGGER.info("AAI services url :  " + aaiServicesUrl);
-    LOGGER.info("AAI service instances url :  " + aaiServicesInstancesUrl);
+        LOGGER.info("AAI service url :  " + aaiServiceUrl);
+        LOGGER.info("AAI services url :  " + aaiServicesUrl);
+        LOGGER.info("AAI service instances url :  " + aaiServicesInstancesUrl);
+        LOGGER.info("AAI aaiHealthCheckUrl :  " + aaiHealthCheckUrl);
 
-  }
+    }
 
 
-  private HttpHeaders buildRequestHeaderForAAI() {
+    private HttpHeaders buildRequestHeaderForAAI() {
 
-    HttpHeaders httpHeaders = new HttpHeaders();
-    httpHeaders.add(HEADER_AUTHORIZATION, aaiHeaderAuthorization);
-    httpHeaders.add(X_FROM_APP_ID, aaiApiId);
-    httpHeaders.add("Accept", "application/json");
-    httpHeaders.add("Content-Type", "application/json");
-    httpHeaders.add(X_TRANSACTION_ID, aaiTransactionId);
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.add(HEADER_AUTHORIZATION, aaiHeaderAuthorization);
+        httpHeaders.add(X_FROM_APP_ID, aaiApiId);
+        httpHeaders.add("Accept", "application/json");
+        httpHeaders.add("Content-Type", "application/json");
+        httpHeaders.add(X_TRANSACTION_ID, aaiTransactionId);
 
-    return httpHeaders;
+        return httpHeaders;
 
-  }
+    }
 
-  public Map getCatalogService(String customerId, String serviceSpecName, String serviceId) {
+    public Map getCatalogService(String customerId, String serviceSpecName, String serviceId) {
 
-    String callUrlFormated = aaiServiceUrl.replace(CUSTOMER_ID, customerId);
-    callUrlFormated = callUrlFormated.replace("$serviceSpecName", serviceSpecName);
-    callUrlFormated = callUrlFormated.replace("$serviceId", serviceId);
+        String callUrlFormated = aaiServiceUrl.replace(CUSTOMER_ID, customerId);
+        callUrlFormated = callUrlFormated.replace("$serviceSpecName", serviceSpecName);
+        callUrlFormated = callUrlFormated.replace("$serviceId", serviceId);
 
-    ResponseEntity<Object> response = callApiGet(callUrlFormated, buildRequestHeaderForAAI());
-    if (response != null && response.getStatusCode().equals(HttpStatus.OK)) {
-      return (LinkedHashMap) response.getBody();
+        ResponseEntity<Object> response = callApiGet(callUrlFormated, buildRequestHeaderForAAI());
+        if (response != null && response.getStatusCode().equals(HttpStatus.OK)) {
+            return (LinkedHashMap) response.getBody();
+        }
+        return null;
     }
-    return null;
-  }
-
-  public Map getService(String serviceId) {
-    // Retrieve the Service Instance using AAI node query
-    String callUrlFormated = aaiServiceUrl.replace("$serviceId", serviceId);
-    ResponseEntity<Object> response = callApiGet(callUrlFormated, buildRequestHeaderForAAI());
-    if (response != null && response.getStatusCode().equals(HttpStatus.OK)) {
-      return (LinkedHashMap) response.getBody();
+
+    public Map getService(String serviceId) {
+        // Retrieve the Service Instance using AAI node query
+        String callUrlFormated = aaiServiceUrl.replace("$serviceId", serviceId);
+        ResponseEntity<Object> response = callApiGet(callUrlFormated, buildRequestHeaderForAAI());
+        if (response != null && response.getStatusCode().equals(HttpStatus.OK)) {
+            return (LinkedHashMap) response.getBody();
+        }
+        return null;
     }
-    return null;
-  }
 
-  public Map getServiceCustomer(String serviceId) {
+    public Map getServiceCustomer(String serviceId) {
 
-    String callUrlFormated = aaiServiceCustomerUrl.replace("$serviceId", serviceId);
-    ResponseEntity<Object> response = callApiGet(callUrlFormated, buildRequestHeaderForAAI());
-    if (response != null && response.getStatusCode().equals(HttpStatus.OK)) {
-      return (LinkedHashMap) response.getBody();
+        String callUrlFormated = aaiServiceCustomerUrl.replace("$serviceId", serviceId);
+        try {
+            ResponseEntity<Object> response = callApiGet(callUrlFormated, buildRequestHeaderForAAI());
+            return (LinkedHashMap) response.getBody();
+        } catch (BackendFunctionalException e) {
+            LOGGER.error("error on calling {} , {}", callUrlFormated.toString(), e);
+            return null;
+        }
     }
-    return null;
-  }
-
-  public Map getVNF(String relatedLink) {
-
-    StringBuilder callURL = new StringBuilder().append(aaiHost).append(relatedLink);
-    try {
-      ResponseEntity<Object> response = callApiGet(callURL.toString(), buildRequestHeaderForAAI());
-      return (LinkedHashMap) response.getBody();
-    } catch (BackendFunctionalException e) {
-      LOGGER.error("error on calling {} , {}", callURL.toString(), e);
-      return null;
+
+    public void callCheckConnectivity() {
+        String customersUrl = new StringBuilder().append(aaiHealthCheckUrl).toString();
+        ResponseEntity<String> response = callApiGetHealthCheck(customersUrl, buildRequestHeaderForAAI());
     }
-  }
-
-  public Map getServicesInAaiForCustomer(String customerId) {
-    String callUrlFormated = aaiServicesUrl.replace(CUSTOMER_ID, customerId);
-    try {
-      ResponseEntity<Object> response = callApiGet(callUrlFormated, buildRequestHeaderForAAI());
-      return (LinkedHashMap) response.getBody();
-    } catch (BackendFunctionalException e) {
-      LOGGER.error("error on calling {} , {}", callUrlFormated, e);
-      return null;
+
+    public Map getVNF(String relatedLink) {
+
+        StringBuilder callURL = new StringBuilder().append(aaiHost).append(relatedLink);
+        try {
+            ResponseEntity<Object> response = callApiGet(callURL.toString(), buildRequestHeaderForAAI());
+            return (LinkedHashMap) response.getBody();
+        } catch (BackendFunctionalException e) {
+            LOGGER.error("error on calling {} , {}", callURL.toString(), e);
+            return null;
+        }
+    }
+
+    public Map getServicesInAaiForCustomer(String customerId) {
+        String callUrlFormated = aaiServicesUrl.replace(CUSTOMER_ID, customerId);
+        try {
+            ResponseEntity<Object> response = callApiGet(callUrlFormated, buildRequestHeaderForAAI());
+            return (LinkedHashMap) response.getBody();
+        } catch (BackendFunctionalException e) {
+            LOGGER.error("error on calling {} , {}", callUrlFormated, e);
+            return null;
+        }
     }
-  }
-
-  public Map getServiceInstancesInAaiForCustomer(String customerId, String serviceType) {
-    String callUrlFormated = aaiServicesInstancesUrl.replace(CUSTOMER_ID, customerId);
-    callUrlFormated = callUrlFormated.replace("$serviceSpecName", serviceType);
-
-    try {
-      ResponseEntity<Object> response = callApiGet(callUrlFormated, buildRequestHeaderForAAI());
-      return (LinkedHashMap) response.getBody();
-    } catch (BackendFunctionalException e) {
-      LOGGER.error("error on calling {} , {}", callUrlFormated, e);
-      return null;
+
+    public Map getServiceInstancesInAaiForCustomer(String customerId, String serviceType) {
+        String callUrlFormated = aaiServicesInstancesUrl.replace(CUSTOMER_ID, customerId);
+        callUrlFormated = callUrlFormated.replace("$serviceSpecName", serviceType);
+
+        try {
+            ResponseEntity<Object> response = callApiGet(callUrlFormated, buildRequestHeaderForAAI());
+            return (LinkedHashMap) response.getBody();
+        } catch (BackendFunctionalException e) {
+            LOGGER.error("error on calling {} , {}", callUrlFormated, e);
+            return null;
+        }
     }
-  }
 }
index 72ee99e..adae4ec 100644 (file)
@@ -23,6 +23,7 @@ import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpMethod;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
+import org.springframework.http.converter.StringHttpMessageConverter;
 import org.springframework.web.client.RestTemplate;
 
 public abstract class BaseClient {
@@ -56,4 +57,26 @@ public abstract class BaseClient {
         return response;
     }
 
+
+    protected ResponseEntity<String> callApiGetHealthCheck(String callURL, HttpHeaders httpHeaders) {
+
+
+        if(LOGGER.isDebugEnabled()){
+            LOGGER.debug("log request : "+callURL+ " "+httpHeaders);
+        }
+
+        ResponseEntity<String> response = null;
+        response = restTemplate.exchange(callURL, HttpMethod.GET,
+            new HttpEntity<>("parameters", httpHeaders), String.class);
+
+        if(LOGGER.isDebugEnabled()){
+            LOGGER.debug("response body : {}",response.getBody().toString());
+        }
+        LOGGER.info("response status : {}", response.getStatusCodeValue());
+        if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.OK)) {
+            LOGGER.warn("HTTP call on {} returns {}, {}", callURL , response.getStatusCodeValue() ,response.getBody().toString());
+        }
+        return response;
+    }
+
 }
index 0d863d1..deb1443 100644 (file)
@@ -66,6 +66,7 @@ public class SoClient {
     private String getE2ESoStatus;
     private String deleteE2ESoUrl;
     private String deleteSoUrl;
+    private String SoHealthCheck;
 
 
     @PostConstruct
@@ -82,6 +83,8 @@ public class SoClient {
             .toString();
         getE2ESoStatus = new StringBuilder().append(soHostname)
             .append(OnapComponentsUrlPaths.MSO_GET_E2EREQUEST_STATUS_PATH).toString();
+        SoHealthCheck = new StringBuilder().append(soHostname)
+            .append(OnapComponentsUrlPaths.MSO_HEALTH_CHECK).toString();
 
         LOGGER.info("SO create service url :  " + createSoUrl);
         LOGGER.info("SO create e2e service url :  " + createE2ESoUrl);
@@ -89,6 +92,7 @@ public class SoClient {
         LOGGER.info("SO delete e2e service url :  " + deleteE2ESoUrl);
         LOGGER.info("SO get so status url :  " + getSoStatus);
         LOGGER.info("SO get e2e so status url :  " + getE2ESoStatus);
+        LOGGER.info("SO healthCheck :  " + SoHealthCheck);
 
     }
 
@@ -250,6 +254,14 @@ public class SoClient {
         }
     }
 
+
+    public void callCheckConnectivity() {
+        String url = SoHealthCheck;
+        restTemplate.exchange(url, HttpMethod.GET,
+            new HttpEntity<>(buildRequestHeader()), String.class);
+
+    }
+
     public GetE2ERequestStatusResponse callE2EGetRequestStatus(String operationId, String serviceId) {
 
         String callUrlFormated = getE2ESoStatus.replace("$serviceId", serviceId);
diff --git a/src/main/java/org/onap/nbi/apis/status/OnapClient.java b/src/main/java/org/onap/nbi/apis/status/OnapClient.java
new file mode 100644 (file)
index 0000000..d9bedc0
--- /dev/null
@@ -0,0 +1,81 @@
+/**
+ * Copyright (c) 2018 Orange
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package org.onap.nbi.apis.status;
+
+import java.text.MessageFormat;
+import org.onap.nbi.apis.hub.service.CheckDMaaPEventsManager;
+import org.onap.nbi.apis.servicecatalog.SdcClient;
+import org.onap.nbi.apis.serviceinventory.AaiClient;
+import org.onap.nbi.apis.serviceorder.SoClient;
+import org.onap.nbi.apis.status.model.ApplicationStatus;
+import org.onap.nbi.apis.status.model.OnapModuleType;
+import org.onap.nbi.apis.status.model.StatusType;
+import org.onap.nbi.exceptions.BackendFunctionalException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.ResourceAccessException;
+
+@Service
+public class OnapClient {
+
+    @Autowired
+    private SdcClient sdcClient;
+
+    @Autowired
+    private AaiClient aaiClient;
+
+    @Autowired
+    private SoClient soClient;
+
+    @Autowired
+    private CheckDMaaPEventsManager checkDMaaPEventsManager;
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(OnapClient.class);
+
+
+    public ApplicationStatus checkConnectivity(OnapModuleType onapModuleType) {
+        try {
+
+            switch (onapModuleType) {
+                case SDC:
+                    sdcClient.callCheckConnectivity();
+                    break;
+                case AAI:
+                    aaiClient.callCheckConnectivity();
+                    break;
+                case SO:
+                    soClient.callCheckConnectivity();
+                    break;
+                case DMAAP:
+                    checkDMaaPEventsManager.callDMaaPGetEvents();
+                    break;
+            }
+        } catch (BackendFunctionalException e) {
+            String message = MessageFormat
+                .format("backend exception for {0}, status code {1}, body response {2}", onapModuleType,
+                    e.getHttpStatus(), e.getBodyResponse());
+            LOGGER.error(message);
+            return new ApplicationStatus(onapModuleType.getValue() + " connectivity", StatusType.KO, null);
+        } catch (ResourceAccessException e) {
+            String message = MessageFormat
+                .format("resource access exception for {0}, response {1}", onapModuleType, e.getMessage());
+            LOGGER.error(message);
+            return new ApplicationStatus(onapModuleType.getValue() + " connectivity", StatusType.KO, null);
+        }
+        return new ApplicationStatus(onapModuleType.getValue() + " connectivity", StatusType.OK, null);
+    }
+
+
+}
\ No newline at end of file
index 4fead09..e1510cc 100644 (file)
@@ -1,21 +1,19 @@
 /**
- *     Copyright (c) 2018 Orange
+ * Copyright (c) 2018 Orange
  *
- *     Licensed under the Apache License, Version 2.0 (the "License");
- *     you may not use this file except in compliance with the License.
- *     You may obtain a copy of the License at
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
  *
- *         http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
  *
- *     Unless required by applicable law or agreed to in writing, software
- *     distributed under the License is distributed on an "AS IS" BASIS,
- *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *     See the License for the specific language governing permissions and
- *     limitations under the License.
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
  */
 package org.onap.nbi.apis.status;
 
 import org.onap.nbi.apis.status.model.ApplicationStatus;
+import org.onap.nbi.apis.status.model.OnapModuleType;
 import org.onap.nbi.apis.status.model.StatusType;
 import org.onap.nbi.commons.JsonRepresentation;
 import org.onap.nbi.commons.ResourceManagement;
@@ -24,8 +22,10 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
+import org.springframework.util.MultiValueMap;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import javax.servlet.http.HttpServletRequest;
 
@@ -44,30 +44,36 @@ public class StatusResource extends ResourceManagement {
         .add("components.name").add("components.status");
 
     @GetMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE)
-    public ResponseEntity<Object> status(HttpServletRequest request) {
+    public ResponseEntity<Object> status(HttpServletRequest request, @RequestParam MultiValueMap<String, String> params) {
 
         ResponseEntity<Object> responseEntity = null;
-
         final String[] splitPath = request.getRequestURI().split("/");
 
         final String applicationName = splitPath[1];
-
-        final ApplicationStatus applicationStatus = this.statusService.get(applicationName, version);
-
-        final boolean isServiceFullyFunctional =
-            StatusType.OK.equals(applicationStatus.getStatus()) ? applicationStatus.getComponents().stream()
-                .allMatch(componentStatus -> StatusType.OK.equals(componentStatus.getStatus())) : false;
+        boolean fullStatus = Boolean.valueOf(params.getFirst("fullStatus"));
+        final ApplicationStatus applicationStatus = buildNbiStatus(applicationName,fullStatus);
 
         // filter object
         Object response = this.getEntity(applicationStatus, fullRepresentation);
 
-        if (isServiceFullyFunctional) {
-            responseEntity = ResponseEntity.ok(response);
-        } else {
-            responseEntity = ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).body(response);
-        }
+        responseEntity = ResponseEntity.ok(response);
 
         return responseEntity;
     }
 
+    private ApplicationStatus buildNbiStatus(String applicationName, boolean fullStatus) {
+        final ApplicationStatus applicationStatus = this.statusService.get(applicationName, version);
+
+        if(fullStatus) {
+            final ApplicationStatus sdcConnectivityStatus = this.statusService.getOnapConnectivity(OnapModuleType.SDC);
+            final ApplicationStatus aaiConnectivityStatus = this.statusService.getOnapConnectivity(OnapModuleType.AAI);
+            final ApplicationStatus soConnectivityStatus = this.statusService.getOnapConnectivity(OnapModuleType.SO);
+            final ApplicationStatus dmaapConnectivityStatus = this.statusService.getOnapConnectivity(OnapModuleType.DMAAP);
+            applicationStatus.addComponent(sdcConnectivityStatus).addComponent(aaiConnectivityStatus)
+                .addComponent(soConnectivityStatus).addComponent(dmaapConnectivityStatus);
+        }
+
+        return applicationStatus;
+    }
+
 }
index 8f285bf..35eba3a 100644 (file)
 package org.onap.nbi.apis.status;
 
 import org.onap.nbi.apis.status.model.ApplicationStatus;
+import org.onap.nbi.apis.status.model.OnapModuleType;
 
 public interface StatusService {
 
     ApplicationStatus get(String serviceName, String serviceVersion);
 
+
+    ApplicationStatus getOnapConnectivity(OnapModuleType onapModuleType);
+
+
 }
index a55e113..1ee9fc6 100644 (file)
 package org.onap.nbi.apis.status;
 
 import org.onap.nbi.apis.status.model.ApplicationStatus;
+import org.onap.nbi.apis.status.model.OnapModuleType;
 import org.onap.nbi.apis.status.model.StatusType;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 @Service("statusService")
 public class StatusServiceImpl implements StatusService {
 
+    @Autowired
+    private OnapClient onapClient;
+
+
     @Override
     public ApplicationStatus get(final String serviceName, final String serviceVersion) {
 
@@ -29,9 +35,11 @@ public class StatusServiceImpl implements StatusService {
 
     }
 
+    @Override
+    public ApplicationStatus getOnapConnectivity(OnapModuleType onapModuleType) {
 
-    public boolean serviceIsUp() {
-        return true;
+        return onapClient.checkConnectivity(onapModuleType);
     }
 
+
 }
index 3e1a60f..6d8e0c1 100644 (file)
@@ -33,7 +33,7 @@ public class ApplicationStatus implements Resource {
      * Builds a new {@code ApplicationStatus} with the following attributes :
      *
      * @param name name of the service
-     * @param state state of the service ({@code OK} | {@code KO})
+     * @param status status of the service ({@code OK} | {@code KO})
      * @param version version of the service ({@code x.y.z})
      */
     public ApplicationStatus(final String name, final StatusType status, final String version) {
@@ -58,7 +58,7 @@ public class ApplicationStatus implements Resource {
         return this.components;
     }
 
-    public ApplicationStatus component(final ApplicationStatus componentStatus) {
+    public ApplicationStatus addComponent(final ApplicationStatus componentStatus) {
         this.components.add(componentStatus);
         return this;
     }
diff --git a/src/main/java/org/onap/nbi/apis/status/model/OnapModuleType.java b/src/main/java/org/onap/nbi/apis/status/model/OnapModuleType.java
new file mode 100644 (file)
index 0000000..2013147
--- /dev/null
@@ -0,0 +1,46 @@
+/**
+ *     Copyright (c) 2018 Orange
+ *
+ *     Licensed under the Apache License, Version 2.0 (the "License");
+ *     you may not use this file except in compliance with the License.
+ *     You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+ */
+package org.onap.nbi.apis.status.model;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+public enum OnapModuleType {
+
+    SDC("sdc"), AAI("aai"),SO("so"), DMAAP("dmaap");
+
+    private final String value;
+
+    OnapModuleType(String v) {
+        this.value = v;
+    }
+
+    @JsonValue
+    public String getValue() {
+        return this.value;
+    }
+
+    @JsonCreator
+    public static OnapModuleType fromValue(String v) {
+        for (OnapModuleType c : OnapModuleType.values()) {
+            if (c.value.equals(v)) {
+                return c;
+            }
+        }
+        throw new IllegalArgumentException(v);
+    }
+
+}
index f616e90..5db5c78 100644 (file)
@@ -9,9 +9,43 @@ Background:
 * call Context.startServers();
     
 Scenario: testHealthCheck
+Given path 'status'
+When method get
+Then status 200
+And match response.status == 'ok'
+And match response.name == 'nbi'
 
+Scenario: testFullHealthCheck
 Given path 'status'
+And params {fullStatus :true}
 When method get
 Then status 200
 And match response.status == 'ok'
-And match response.name == 'nbi'
\ No newline at end of file
+And match response.name == 'nbi'
+And assert response.components.length == 4
+And match each $.components contains {status :'ok'}
+
+
+Scenario: testFullHealthChecWithoutWiremock
+* call Context.stopWiremock();
+Given path 'status'
+And params {fullStatus :true}
+When method get
+Then status 200
+And match response.status == 'ok'
+And match response.name == 'nbi'
+And assert response.components.length == 4
+And match each response.components contains {  status: 'ko'}
+* call Context.startServers();
+
+Scenario: testFullHealthCheckWithSDCNotResponding
+* call Context.removeWireMockMapping("/sdc/v1/artifactTypes");
+Given path 'status'
+And params {fullStatus :true}
+When method get
+Then status 200
+And match response.status == 'ok'
+And match response.name == 'nbi'
+And assert response.components.length == 4
+And match response.components contains [{name:'sdc connectivity', status: 'ko'},{name:'so connectivity', status: 'ok'},{name:'aai connectivity', status: 'ok'},{name:'dmaap connectivity', status: 'ok'},]
+* call Context.startServers();
diff --git a/src/test/resources/mappings/aai/aai_get_customers.json b/src/test/resources/mappings/aai/aai_get_customers.json
new file mode 100644 (file)
index 0000000..4146b6a
--- /dev/null
@@ -0,0 +1,34 @@
+{
+  "request": {
+    "method": "GET",
+    "url": "/aai/v14/business/customers"
+  },
+  "response": {
+    "status": 200,
+    "jsonBody": {
+      "customer": [
+        {
+          "global-customer-id": "generic",
+          "subscriber-name": "generic",
+          "subscriber-type": "INFRA",
+          "resource-version": "1550238542827"
+        },
+        {
+          "global-customer-id": "Generic-Vendor",
+          "subscriber-name": "Generic-Vendor",
+          "subscriber-type": "INFRA",
+          "resource-version": "1550569650318"
+        },
+        {
+          "global-customer-id": "customerRG",
+          "subscriber-name": "customerRG",
+          "subscriber-type": "INFRA",
+          "resource-version": "1551445667218"
+        }
+      ]
+    },
+    "headers": {
+      "Content-Type": "application/xml"
+    }
+  }
+}
diff --git a/src/test/resources/mappings/sdc/sdc_get_artifactTypes.json b/src/test/resources/mappings/sdc/sdc_get_artifactTypes.json
new file mode 100644 (file)
index 0000000..2c7f635
--- /dev/null
@@ -0,0 +1,68 @@
+{
+    "request": {
+        "method": "GET",
+        "url": "/sdc/v1/artifactTypes"
+    },
+    "response": {
+        "status": 200,
+        "jsonBody":
+[
+    "CHEF",
+    "PUPPET",
+    "YANG",
+    "SHELL_SCRIPT",
+    "SHELL",
+    "ICON",
+    "UNKNOWN",
+    "HEAT",
+    "DG_XML",
+    "MURANO_PKG",
+    "HEAT_ENV",
+    "YANG_XML",
+    "HEAT_VOL",
+    "HEAT_NET",
+    "OTHER",
+    "WORKFLOW",
+    "NETWORK_CALL_FLOW",
+    "TOSCA_TEMPLATE",
+    "TOSCA_CSAR",
+    "VNF_CATALOG",
+    "VF_LICENSE",
+    "BPEL",
+    "VENDOR_LICENSE",
+    "MODEL_INVENTORY_PROFILE",
+    "MODEL_QUERY_SPEC",
+    "APPC_CONFIG",
+    "HEAT_NESTED",
+    "HEAT_ARTIFACT",
+    "VF_MODULES_METADATA",
+    "LIFECYCLE_OPERATIONS",
+    "VES_EVENTS",
+    "PERFORMANCE_COUNTER",
+    "UCPE_LAYER_2_CONFIGURATION",
+    "DCAE_TOSCA",
+    "DCAE_JSON",
+    "DCAE_POLICY",
+    "DCAE_DOC",
+    "DCAE_EVENT",
+    "DCAE_INVENTORY_TOSCA",
+    "DCAE_INVENTORY_JSON",
+    "DCAE_INVENTORY_POLICY",
+    "DCAE_INVENTORY_DOC",
+    "DCAE_INVENTORY_BLUEPRINT",
+    "DCAE_INVENTORY_EVENT",
+    "AAI_SERVICE_MODEL",
+    "AAI_VF_MODEL",
+    "AAI_VF_MODULE_MODEL",
+    "AAI_VF_INSTANCE_MODEL",
+    "SNMP_POLL",
+    "SNMP_TRAP",
+    "GUIDE",
+    "PLAN"
+]
+        ,
+        "headers": {
+            "Content-Type": "application/json"
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/test/resources/mappings/so/so_get_healthcheck.json b/src/test/resources/mappings/so/so_get_healthcheck.json
new file mode 100644 (file)
index 0000000..8f2171d
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "request": {
+        "method": "GET",
+        "url": "/globalhealthcheck"
+    },
+    "response": {
+        "status": 200,
+        "jsonBody": {
+            "bodyFileName": "so_healthcheck.xml"
+        }
+    }
+}
diff --git a/src/test/resources/mappings/so/so_healthcheck.xml b/src/test/resources/mappings/so/so_healthcheck.xml
new file mode 100644 (file)
index 0000000..d023c9f
--- /dev/null
@@ -0,0 +1,23 @@
+<!--
+     Copyright (c) 2019 Orange
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="ISO-8859-1">
+    <title>Health Check</title>
+  </head>
+  <body>Application ready</body>
+</html>
\ No newline at end of file