Nodes query rewritten to generic rest client 85/63485/5
authorgolabek <tomasz.golabek@nokia.com>
Wed, 29 Aug 2018 13:29:56 +0000 (15:29 +0200)
committergolabek <tomasz.golabek@nokia.com>
Wed, 26 Sep 2018 07:32:01 +0000 (09:32 +0200)
Added AAI Rest Client based on new generic client

Change-Id: I561f8a5d95ec35fdddc648b24965dd9dac03c9a4
Issue-ID: VID-269
Signed-off-by: golabek <tomasz.golabek@nokia.com>
vid-app-common/src/main/java/org/onap/vid/aai/AaiOverTLSClient.java [new file with mode: 0644]
vid-app-common/src/main/java/org/onap/vid/aai/AaiOverTLSClientInterface.java [new file with mode: 0644]
vid-app-common/src/main/java/org/onap/vid/aai/AaiOverTLSPropertySupplier.java [new file with mode: 0644]
vid-app-common/src/main/java/org/onap/vid/aai/exceptions/InvalidAAIResponseException.java
vid-app-common/src/main/java/org/onap/vid/controllers/WebConfig.java
vid-app-common/src/main/java/org/onap/vid/services/AsyncInstantiationBusinessLogicImpl.java
vid-app-common/src/test/java/org/onap/vid/aai/AaiOverTLSClientServerTest.java [new file with mode: 0644]
vid-app-common/src/test/java/org/onap/vid/aai/AaiOverTLSClientTest.java [new file with mode: 0644]
vid-app-common/src/test/java/org/onap/vid/config/JobCommandsConfigWithMockedMso.java

diff --git a/vid-app-common/src/main/java/org/onap/vid/aai/AaiOverTLSClient.java b/vid-app-common/src/main/java/org/onap/vid/aai/AaiOverTLSClient.java
new file mode 100644 (file)
index 0000000..58bf3f3
--- /dev/null
@@ -0,0 +1,95 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2018 Nokia Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.vid.aai;
+
+import static org.onap.vid.aai.AaiOverTLSClientInterface.HEADERS.ACCEPT;
+import static org.onap.vid.aai.AaiOverTLSClientInterface.HEADERS.CONTENT_TYPE;
+import static org.onap.vid.aai.AaiOverTLSClientInterface.HEADERS.FROM_APP_ID_HEADER;
+import static org.onap.vid.aai.AaiOverTLSClientInterface.HEADERS.REQUEST_ID;
+import static org.onap.vid.aai.AaiOverTLSClientInterface.HEADERS.TRANSACTION_ID_HEADER;
+
+import io.joshworks.restclient.http.HttpResponse;
+import io.vavr.collection.HashMap;
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+import java.util.Collections;
+import java.util.Map;
+import javax.ws.rs.core.MediaType;
+import lombok.val;
+import org.onap.portalsdk.core.util.SystemProperties;
+import org.onap.vid.aai.model.AaiNodeQueryResponse;
+import org.onap.vid.aai.model.ResourceType;
+import org.onap.vid.aai.util.AAIProperties;
+import org.onap.vid.client.SyncRestClientInterface;
+
+public class AaiOverTLSClient implements AaiOverTLSClientInterface {
+
+    private final AaiOverTLSPropertySupplier propertySupplier;
+    private SyncRestClientInterface syncRestClient;
+    private boolean useClientCert;
+    private static String CALLER_APP_ID = "VidAaiController";
+    private String urlBase;
+
+    public AaiOverTLSClient(SyncRestClientInterface syncRestClient, AaiOverTLSPropertySupplier propertySupplier) {
+        this(syncRestClient, propertySupplier, SystemProperties.getProperty(AAIProperties.AAI_SERVER_URL));
+    }
+
+    AaiOverTLSClient(SyncRestClientInterface syncRestClient, AaiOverTLSPropertySupplier propertySupplier, String baseUrl) {
+        this.syncRestClient = syncRestClient;
+        this.propertySupplier = propertySupplier;
+        this.urlBase = baseUrl;
+    }
+
+    @Override
+    public void setUseClientCert(boolean useClientCert) {
+        this.useClientCert = useClientCert;
+    }
+
+    @Override
+    public HttpResponse<AaiNodeQueryResponse> searchNodeTypeByName(String name, ResourceType type) {
+        val uri = urlBase + String.format(URIS.NODE_TYPE_BY_NAME, type.getAaiFormat(), type.getNameFilter(), name);
+        return syncRestClient.get(uri, getRequestHeaders(), Collections.emptyMap(), AaiNodeQueryResponse.class);
+    }
+
+    private Map<String, String> getRequestHeaders() {
+        val result = HashMap.of(
+            TRANSACTION_ID_HEADER, propertySupplier.getRandomUUID(),
+            FROM_APP_ID_HEADER, CALLER_APP_ID,
+            CONTENT_TYPE, MediaType.APPLICATION_JSON,
+            REQUEST_ID, propertySupplier.getRequestId(),
+            ACCEPT, MediaType.APPLICATION_JSON)
+            .toJavaMap();
+        result.putAll(getAuthorizationHeader());
+        return result;
+    }
+
+    private Map<String, String> getAuthorizationHeader() {
+        if (!useClientCert) {
+            val vidUsername = propertySupplier.getUsername();
+            val vidPassword = propertySupplier.getPassword();
+            val encoded = Base64.getEncoder()
+                .encodeToString((vidUsername + ":" + vidPassword).getBytes(StandardCharsets.UTF_8));
+            return HashMap.of("Authorization", "Basic " + encoded).toJavaMap();
+        }
+        return HashMap.<String, String>empty().toJavaMap();
+    }
+
+}
diff --git a/vid-app-common/src/main/java/org/onap/vid/aai/AaiOverTLSClientInterface.java b/vid-app-common/src/main/java/org/onap/vid/aai/AaiOverTLSClientInterface.java
new file mode 100644 (file)
index 0000000..252fed8
--- /dev/null
@@ -0,0 +1,46 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.vid.aai;
+
+import io.joshworks.restclient.http.HttpResponse;
+import org.onap.portalsdk.core.util.SystemProperties;
+import org.onap.vid.aai.model.AaiNodeQueryResponse;
+import org.onap.vid.aai.model.ResourceType;
+
+public interface AaiOverTLSClientInterface {
+
+    class URIS {
+        static final String NODE_TYPE_BY_NAME = "search/nodes-query?search-node-type=%s&filter=%s:EQUALS:%s";
+    }
+
+    class HEADERS {
+        static final String TRANSACTION_ID_HEADER = "X-TransactionId";
+        static final String FROM_APP_ID_HEADER = "X-FromAppId";
+        static final String CONTENT_TYPE = "Content-Type";
+        static final String REQUEST_ID = SystemProperties.ECOMP_REQUEST_ID;
+        static final String ACCEPT = "Accept";
+    }
+
+    void setUseClientCert(boolean useClientCert);
+
+    HttpResponse<AaiNodeQueryResponse> searchNodeTypeByName(String name, ResourceType type);
+
+}
diff --git a/vid-app-common/src/main/java/org/onap/vid/aai/AaiOverTLSPropertySupplier.java b/vid-app-common/src/main/java/org/onap/vid/aai/AaiOverTLSPropertySupplier.java
new file mode 100644 (file)
index 0000000..33b44b1
--- /dev/null
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2018 Nokia Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.vid.aai;
+
+import java.util.UUID;
+import org.eclipse.jetty.util.security.Password;
+import org.onap.portalsdk.core.util.SystemProperties;
+import org.onap.vid.aai.util.AAIProperties;
+import org.onap.vid.utils.Logging;
+
+public class AaiOverTLSPropertySupplier {
+
+    public String getUsername() {
+        return SystemProperties.getProperty(AAIProperties.AAI_VID_USERNAME);
+    }
+
+    public String getPassword() {
+        return Password.deobfuscate(SystemProperties.getProperty(AAIProperties.AAI_VID_PASSWD_X));
+    }
+
+    public String getRequestId() {
+        return Logging.extractOrGenerateRequestId();
+    }
+
+    public String getRandomUUID(){
+       return UUID.randomUUID().toString();
+    }
+
+}
index f80cae5..0e40369 100644 (file)
@@ -1,3 +1,24 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2018 Nokia. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
 package org.onap.vid.aai.exceptions;
 
 import org.onap.vid.aai.AaiResponse;
@@ -10,4 +31,8 @@ public class InvalidAAIResponseException extends GenericUncheckedException {
     public InvalidAAIResponseException(AaiResponse aaiResponse) {
         super(String.format("errorCode: %d, raw: %s", aaiResponse.getHttpCode(), aaiResponse.getErrorMessage()));
     }
+
+    public InvalidAAIResponseException(int statusCode, String message) {
+        super(String.format("errorCode: %d, raw: %s", statusCode, message));
+    }
 }
index 0f4b536..fb8b519 100644 (file)
 
 package org.onap.vid.controllers;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
 import org.onap.vid.aai.AaiClient;
 import org.onap.vid.aai.AaiClientInterface;
+import org.onap.vid.aai.AaiOverTLSClient;
+import org.onap.vid.aai.AaiOverTLSClientInterface;
+import org.onap.vid.aai.AaiOverTLSPropertySupplier;
 import org.onap.vid.aai.AaiResponseTranslator;
 import org.onap.vid.aai.PombaClientImpl;
 import org.onap.vid.aai.PombaClientInterface;
@@ -48,7 +53,6 @@ import org.onap.vid.services.VidService;
 import org.onap.vid.services.VidServiceImpl;
 import org.onap.vid.scheduler.SchedulerRestInterface;
 import org.onap.vid.scheduler.SchedulerRestInterfaceIfc;
-import org.onap.vid.services.*;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -161,4 +165,34 @@ public class WebConfig {
     public SchedulerRestInterfaceIfc getSchedulerRestInterface(){
         return new SchedulerRestInterface();
     }
+
+
+    @Bean
+    public AaiOverTLSClientInterface getAaiOverTLSClientInterface() {
+
+        io.joshworks.restclient.http.mapper.ObjectMapper objectMapper = new io.joshworks.restclient.http.mapper.ObjectMapper() {
+
+            ObjectMapper om = new ObjectMapper();
+
+            @Override
+            public <T> T readValue(String s, Class<T> aClass) {
+                try {
+                    return om.readValue(s, aClass);
+                } catch (IOException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+
+            @Override
+            public String writeValue(Object o) {
+                try {
+                    return om.writeValueAsString(o);
+                } catch (JsonProcessingException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        };
+
+        return new AaiOverTLSClient(new SyncRestClient(objectMapper), new AaiOverTLSPropertySupplier());
+    }
 }
index 7259301..871f564 100644 (file)
@@ -1,10 +1,35 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2018 Nokia. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
 package org.onap.vid.services;
 
 import com.google.common.collect.ImmutableMap;
+import io.joshworks.restclient.http.HttpResponse;
+import java.io.IOException;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.hibernate.SessionFactory;
 import org.onap.vid.aai.AaiClientInterface;
+import org.onap.vid.aai.AaiOverTLSClientInterface;
 import org.onap.vid.aai.AaiResponse;
 import org.onap.vid.aai.exceptions.InvalidAAIResponseException;
 import org.onap.vid.aai.model.AaiNodeQueryResponse;
@@ -50,7 +75,7 @@ public class AsyncInstantiationBusinessLogicImpl implements AsyncInstantiationBu
 
     private static final int MAX_RETRIES_GETTING_COUNTER = 100;
     private static final int MAX_RETRIES_GETTING_FREE_NAME_FROM_AAI = 10000;
-    public static final String NAME_FOR_CHECK_AAI_STATUS = "NAME_FOR_CHECK_AAI_STATUS";
+    private static final String NAME_FOR_CHECK_AAI_STATUS = "NAME_FOR_CHECK_AAI_STATUS";
 
     private final DataAccessService dataAccessService;
 
@@ -62,58 +87,64 @@ public class AsyncInstantiationBusinessLogicImpl implements AsyncInstantiationBu
 
     private AaiClientInterface aaiClient;
 
+    private AaiOverTLSClientInterface aaiOverTLSClient;
+
     private int maxRetriesGettingFreeNameFromAai = MAX_RETRIES_GETTING_FREE_NAME_FROM_AAI;
 
-    private static final EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(AsyncInstantiationBusinessLogicImpl.class);
+    private static final EELFLoggerDelegate logger = EELFLoggerDelegate
+        .getLogger(AsyncInstantiationBusinessLogicImpl.class);
     private Map<String, JobStatus> msoStateToJobStatusMap = ImmutableMap.<String, JobStatus>builder()
-            .put("inprogress", JobStatus.IN_PROGRESS)
-            .put("failed", JobStatus.FAILED)
-            .put("pause", JobStatus.PAUSE)
-            .put("paused", JobStatus.PAUSE)
-            .put("complete", JobStatus.COMPLETED)
-            .put("pending", JobStatus.IN_PROGRESS)
-            .put("pendingmanualtask", JobStatus.PAUSE)
-            .put("unlocked", JobStatus.IN_PROGRESS)
-            .build();
+        .put("inprogress", JobStatus.IN_PROGRESS)
+        .put("failed", JobStatus.FAILED)
+        .put("pause", JobStatus.PAUSE)
+        .put("paused", JobStatus.PAUSE)
+        .put("complete", JobStatus.COMPLETED)
+        .put("pending", JobStatus.IN_PROGRESS)
+        .put("pendingmanualtask", JobStatus.PAUSE)
+        .put("unlocked", JobStatus.IN_PROGRESS)
+        .build();
 
 
     @Autowired
     public AsyncInstantiationBusinessLogicImpl(DataAccessService dataAccessService,
-                                               JobAdapter jobAdapter,
-                                               JobsBrokerService jobService,
-                                               SessionFactory sessionFactory,
-                                               AaiClientInterface aaiClient) {
+        JobAdapter jobAdapter,
+        JobsBrokerService jobService,
+        SessionFactory sessionFactory,
+        AaiClientInterface aaiClient,
+        AaiOverTLSClientInterface aaiOverTLSClient) {
         this.dataAccessService = dataAccessService;
         this.jobAdapter = jobAdapter;
         this.jobService = jobService;
         this.sessionFactory = sessionFactory;
         this.aaiClient = aaiClient;
+        this.aaiOverTLSClient = aaiOverTLSClient;
     }
 
     @Override
     public List<ServiceInfo> getAllServicesInfo() {
-        return dataAccessService.getList(ServiceInfo.class, filterByCreationDateAndNotDeleted(), orderByCreatedDateAndStatus(), null);
+        return dataAccessService
+            .getList(ServiceInfo.class, filterByCreationDateAndNotDeleted(), orderByCreatedDateAndStatus(), null);
     }
 
     private String filterByCreationDateAndNotDeleted() {
         LocalDateTime minus3Months = LocalDateTime.now().minusMonths(3);
         Timestamp filterDate = Timestamp.valueOf(minus3Months);
         return " where" +
-                "   hidden = false" +
-                "   and deleted_at is null" +  // don't fetch deleted
-                "   and created >= '" + filterDate + "' ";
+            "   hidden = false" +
+            "   and deleted_at is null" +  // don't fetch deleted
+            "   and created >= '" + filterDate + "' ";
     }
 
     private String orderByCreatedDateAndStatus() {
         return " createdBulkDate DESC ,\n" +
-                "  (CASE jobStatus\n" +
-                "   WHEN 'COMPLETED' THEN 0\n" +
-                "   WHEN 'FAILED' THEN 0\n" +
-                "   WHEN 'IN_PROGRESS' THEN 1\n" +
-                "   WHEN 'PAUSE' THEN 2\n" +
-                "   WHEN 'PENDING' THEN 3\n" +
-                "   WHEN 'STOPPED' THEN 3 END),\n" +
-                "  statusModifiedDate ";
+            "  (CASE jobStatus\n" +
+            "   WHEN 'COMPLETED' THEN 0\n" +
+            "   WHEN 'FAILED' THEN 0\n" +
+            "   WHEN 'IN_PROGRESS' THEN 1\n" +
+            "   WHEN 'PAUSE' THEN 2\n" +
+            "   WHEN 'PENDING' THEN 3\n" +
+            "   WHEN 'STOPPED' THEN 3 END),\n" +
+            "  statusModifiedDate ";
     }
 
     @Override
@@ -125,77 +156,87 @@ public class AsyncInstantiationBusinessLogicImpl implements AsyncInstantiationBu
         for (int i = 0; i < bulkSize; i++) {
             Job job = jobAdapter.createJob(JobType.ServiceInstantiation, request, templateId, userId, i);
             UUID jobId = jobService.add(job);
-            auditVidStatus(jobId,job.getStatus());
+            auditVidStatus(jobId, job.getStatus());
             uuids.add(jobId);
-            dataAccessService.saveDomainObject(createServiceInfo(userId, request, jobId, templateId, createdBulkDate), DaoUtils.getPropsMap());
+            dataAccessService.saveDomainObject(createServiceInfo(userId, request, jobId, templateId, createdBulkDate),
+                DaoUtils.getPropsMap());
         }
         return uuids;
     }
 
-    private ServiceInfo createServiceInfo(String userId, ServiceInstantiation serviceInstantiation, UUID jobId, UUID templateId, Date createdBulkDate) {
+    private ServiceInfo createServiceInfo(String userId, ServiceInstantiation serviceInstantiation, UUID jobId,
+        UUID templateId, Date createdBulkDate) {
         return new ServiceInfo(
-                userId, Job.JobStatus.PENDING, serviceInstantiation.isPause(), jobId, templateId,
-                serviceInstantiation.getOwningEntityId(),
-                serviceInstantiation.getOwningEntityName(),
-                serviceInstantiation.getProjectName(),
-                serviceInstantiation.getAicZoneId(),
-                serviceInstantiation.getAicZoneName(),
-                serviceInstantiation.getTenantId(),
-                serviceInstantiation.getTenantName(),
-                serviceInstantiation.getLcpCloudRegionId(),
-                null,
-                serviceInstantiation.getSubscriptionServiceType(),
-                serviceInstantiation.getSubscriberName(),
-                null,
-                serviceInstantiation.getInstanceName(),
-                serviceInstantiation.getModelInfo().getModelInvariantId(),
-                serviceInstantiation.getModelInfo().getModelName(),
-                serviceInstantiation.getModelInfo().getModelVersion(),
-                createdBulkDate
+            userId, Job.JobStatus.PENDING, serviceInstantiation.isPause(), jobId, templateId,
+            serviceInstantiation.getOwningEntityId(),
+            serviceInstantiation.getOwningEntityName(),
+            serviceInstantiation.getProjectName(),
+            serviceInstantiation.getAicZoneId(),
+            serviceInstantiation.getAicZoneName(),
+            serviceInstantiation.getTenantId(),
+            serviceInstantiation.getTenantName(),
+            serviceInstantiation.getLcpCloudRegionId(),
+            null,
+            serviceInstantiation.getSubscriptionServiceType(),
+            serviceInstantiation.getSubscriberName(),
+            null,
+            serviceInstantiation.getInstanceName(),
+            serviceInstantiation.getModelInfo().getModelInvariantId(),
+            serviceInstantiation.getModelInfo().getModelName(),
+            serviceInstantiation.getModelInfo().getModelVersion(),
+            createdBulkDate
         );
     }
 
 
     @Override
-    public RequestDetailsWrapper<ServiceInstantiationRequestDetails> generateServiceInstantiationRequest(UUID jobId, ServiceInstantiation payload, String userId) {
+    public RequestDetailsWrapper<ServiceInstantiationRequestDetails> generateServiceInstantiationRequest(UUID jobId,
+        ServiceInstantiation payload, String userId) {
 
-           ServiceInstantiationRequestDetails.ServiceInstantiationOwningEntity owningEntity = new ServiceInstantiationRequestDetails.ServiceInstantiationOwningEntity(payload.getOwningEntityId(), payload.getOwningEntityName());
+        ServiceInstantiationRequestDetails.ServiceInstantiationOwningEntity owningEntity = new ServiceInstantiationRequestDetails.ServiceInstantiationOwningEntity(
+            payload.getOwningEntityId(), payload.getOwningEntityName());
 
         SubscriberInfo subscriberInfo = new SubscriberInfo();
         subscriberInfo.setGlobalSubscriberId(payload.getGlobalSubscriberId());
 
         String serviceInstanceName = null;
-        if(payload.isUserProvidedNaming()) {
+        if (payload.isUserProvidedNaming()) {
             serviceInstanceName = getUniqueName(payload.getInstanceName(), ResourceType.SERVICE_INSTANCE);
             String finalServiceInstanceName = serviceInstanceName;
             updateServiceInfo(jobId, x -> x.setServiceInstanceName(finalServiceInstanceName));
         }
         ServiceInstantiationRequestDetails.RequestInfo requestInfo = new ServiceInstantiationRequestDetails.RequestInfo(
-                serviceInstanceName,
-                payload.getProductFamilyId(),
-                "VID",
-                payload.isRollbackOnFailure(),
-                userId);
+            serviceInstanceName,
+            payload.getProductFamilyId(),
+            "VID",
+            payload.isRollbackOnFailure(),
+            userId);
 
         List<ServiceInstantiationRequestDetails.ServiceInstantiationService> serviceInstantiationService = new LinkedList<>();
-        List<Map<String, String>> unFilteredInstanceParams = payload.getInstanceParams() != null ? payload.getInstanceParams() : new LinkedList<>();
+        List<Map<String, String>> unFilteredInstanceParams =
+            payload.getInstanceParams() != null ? payload.getInstanceParams() : new LinkedList<>();
         List<Map<String, String>> filteredInstanceParams = removeUnNeededParams(unFilteredInstanceParams);
         ServiceInstantiationRequestDetails.ServiceInstantiationService serviceInstantiationService1 = new ServiceInstantiationRequestDetails.ServiceInstantiationService(
-                payload.getModelInfo(),
-                serviceInstanceName,
-                filteredInstanceParams,
-                createServiceInstantiationVnfList(payload)
+            payload.getModelInfo(),
+            serviceInstanceName,
+            filteredInstanceParams,
+            createServiceInstantiationVnfList(payload)
         );
         serviceInstantiationService.add(serviceInstantiationService1);
 
-        ServiceInstantiationRequestDetails.RequestParameters requestParameters = new ServiceInstantiationRequestDetails.RequestParameters(payload.getSubscriptionServiceType(), false, serviceInstantiationService);
+        ServiceInstantiationRequestDetails.RequestParameters requestParameters = new ServiceInstantiationRequestDetails.RequestParameters(
+            payload.getSubscriptionServiceType(), false, serviceInstantiationService);
 
-        ServiceInstantiationRequestDetails.Project project = payload.getProjectName() != null ?  new ServiceInstantiationRequestDetails.Project(payload.getProjectName()) : null;
+        ServiceInstantiationRequestDetails.Project project =
+            payload.getProjectName() != null ? new ServiceInstantiationRequestDetails.Project(payload.getProjectName())
+                : null;
 
-        ServiceInstantiationRequestDetails requestDetails = new ServiceInstantiationRequestDetails(payload.getModelInfo(), owningEntity, subscriberInfo,
-                project, requestInfo, requestParameters);
+        ServiceInstantiationRequestDetails requestDetails = new ServiceInstantiationRequestDetails(
+            payload.getModelInfo(), owningEntity, subscriberInfo,
+            project, requestInfo, requestParameters);
 
-        RequestDetailsWrapper<ServiceInstantiationRequestDetails> requestDetailsWrapper = new RequestDetailsWrapper(requestDetails);
+        RequestDetailsWrapper<ServiceInstantiationRequestDetails> requestDetailsWrapper = new RequestDetailsWrapper(
+            requestDetails);
         debugRequestDetails(requestDetailsWrapper, logger);
         return requestDetailsWrapper;
     }
@@ -204,10 +245,11 @@ public class AsyncInstantiationBusinessLogicImpl implements AsyncInstantiationBu
         List<String> keysToRemove = new ArrayList<>();
         if (instanceParams != null && !instanceParams.isEmpty()) {
             for (String key : instanceParams.get(0).keySet()) {
-                for (String paramToIgnore : PARAMS_TO_IGNORE)
+                for (String paramToIgnore : PARAMS_TO_IGNORE) {
                     if ((key.equalsIgnoreCase(paramToIgnore))) {
                         keysToRemove.add(key);
                     }
+                }
             }
             for (String key : keysToRemove) {
                 instanceParams.get(0).remove(key);
@@ -220,7 +262,8 @@ public class AsyncInstantiationBusinessLogicImpl implements AsyncInstantiationBu
         return instanceParams;
     }
 
-    private ServiceInstantiationRequestDetails.ServiceInstantiationVnfList createServiceInstantiationVnfList(ServiceInstantiation payload) {
+    private ServiceInstantiationRequestDetails.ServiceInstantiationVnfList createServiceInstantiationVnfList(
+        ServiceInstantiation payload) {
         CloudConfiguration cloudConfiguration = new CloudConfiguration();
         cloudConfiguration.setTenantId(payload.getTenantId());
         cloudConfiguration.setLcpCloudRegionId(payload.getLcpCloudRegionId());
@@ -230,16 +273,17 @@ public class AsyncInstantiationBusinessLogicImpl implements AsyncInstantiationBu
         for (Vnf vnf : vnfs.values()) {
             Map<String, Map<String, VfModule>> vfModules = vnf.getVfModules();
             List<VfModule> convertedUnFilteredVfModules = convertVfModuleMapToList(vfModules);
-            List<VfModule> filteredVfModules = filterInstanceParamsFromVfModuleAndUniqueNames(convertedUnFilteredVfModules, vnf.isUserProvidedNaming());
+            List<VfModule> filteredVfModules = filterInstanceParamsFromVfModuleAndUniqueNames(
+                convertedUnFilteredVfModules, vnf.isUserProvidedNaming());
             ServiceInstantiationRequestDetails.ServiceInstantiationVnf serviceInstantiationVnf = new ServiceInstantiationRequestDetails.ServiceInstantiationVnf(
-                    vnf.getModelInfo(),
-                    cloudConfiguration,
-                    vnf.getPlatformName(),
-                    vnf.getLineOfBusiness(),
-                    payload.getProductFamilyId(),
-                    removeUnNeededParams(vnf.getInstanceParams()),
-                    filteredVfModules,
-                    vnf.isUserProvidedNaming() ? getUniqueName(vnf.getInstanceName(), ResourceType.GENERIC_VNF) : null
+                vnf.getModelInfo(),
+                cloudConfiguration,
+                vnf.getPlatformName(),
+                vnf.getLineOfBusiness(),
+                payload.getProductFamilyId(),
+                removeUnNeededParams(vnf.getInstanceParams()),
+                filteredVfModules,
+                vnf.isUserProvidedNaming() ? getUniqueName(vnf.getInstanceName(), ResourceType.GENERIC_VNF) : null
             );
             vnfList.add(serviceInstantiationVnf);
         }
@@ -251,27 +295,29 @@ public class AsyncInstantiationBusinessLogicImpl implements AsyncInstantiationBu
         return vfModules.values().stream().flatMap(vfModule -> vfModule.values().stream()).collect(Collectors.toList());
     }
 
-    private List<VfModule> filterInstanceParamsFromVfModuleAndUniqueNames(List<VfModule> unFilteredVfModules, boolean isUserProvidedNaming) {
+    private List<VfModule> filterInstanceParamsFromVfModuleAndUniqueNames(List<VfModule> unFilteredVfModules,
+        boolean isUserProvidedNaming) {
         return unFilteredVfModules.stream().map(vfModule ->
-                new VfModule(
-                        vfModule.getModelInfo(),
-                        getUniqueNameIfNeeded(isUserProvidedNaming, vfModule.getInstanceName(), ResourceType.VF_MODULE),
-                        getUniqueNameIfNeeded(isUserProvidedNaming, vfModule.getVolumeGroupInstanceName(), ResourceType.VOLUME_GROUP),
-                        removeUnNeededParams(vfModule.getInstanceParams())))
-                .collect(Collectors.toList());
+            new VfModule(
+                vfModule.getModelInfo(),
+                getUniqueNameIfNeeded(isUserProvidedNaming, vfModule.getInstanceName(), ResourceType.VF_MODULE),
+                getUniqueNameIfNeeded(isUserProvidedNaming, vfModule.getVolumeGroupInstanceName(),
+                    ResourceType.VOLUME_GROUP),
+                removeUnNeededParams(vfModule.getInstanceParams())))
+            .collect(Collectors.toList());
     }
 
     private String getUniqueNameIfNeeded(boolean isUserProvidedNaming, String name, ResourceType resourceType) {
         return isUserProvidedNaming && !StringUtils.isEmpty(name) ?
-                getUniqueName(name, resourceType) : null;
+            getUniqueName(name, resourceType) : null;
     }
 
     @Override
     public String getServiceInstantiationPath(ServiceInstantiation serviceInstantiationRequest) {
         //in case pause flag is true - use assign , else - use create.
         return MsoBusinessLogicImpl.validateEndpointPath(
-                serviceInstantiationRequest.isPause() ?
-                        "mso.restapi.serviceInstanceAssign" : "mso.restapi.serviceInstanceCreate"
+            serviceInstantiationRequest.isPause() ?
+                "mso.restapi.serviceInstanceAssign" : "mso.restapi.serviceInstanceCreate"
         );
     }
 
@@ -290,7 +336,7 @@ public class AsyncInstantiationBusinessLogicImpl implements AsyncInstantiationBu
 
     @Override
     public ServiceInfo updateServiceInfoAndAuditStatus(UUID jobUuid, JobStatus jobStatus) {
-        auditVidStatus(jobUuid,jobStatus);
+        auditVidStatus(jobUuid, jobStatus);
         return updateServiceInfo(jobUuid, x -> setServiceInfoStatus(x, jobStatus));
     }
 
@@ -300,9 +346,12 @@ public class AsyncInstantiationBusinessLogicImpl implements AsyncInstantiationBu
     }
 
     public ServiceInfo getServiceInfoByJobId(UUID jobUUID) {
-        List<ServiceInfo> serviceInfoList = dataAccessService.getList(ServiceInfo.class, String.format(" where jobId = '%s' ", jobUUID), null, null);
+        List<ServiceInfo> serviceInfoList = dataAccessService
+            .getList(ServiceInfo.class, String.format(" where jobId = '%s' ", jobUUID), null, null);
         if (serviceInfoList.size() != 1) {
-            throw new GenericUncheckedException("Failed to retrieve job with uuid " + jobUUID + " from ServiceInfo table. Instances found: " + serviceInfoList.size());
+            throw new GenericUncheckedException(
+                "Failed to retrieve job with uuid " + jobUUID + " from ServiceInfo table. Instances found: "
+                    + serviceInfoList.size());
         }
         return serviceInfoList.get(0);
     }
@@ -310,43 +359,46 @@ public class AsyncInstantiationBusinessLogicImpl implements AsyncInstantiationBu
     public List<JobAuditStatus> getAuditStatuses(UUID jobUUID, JobAuditStatus.SourceStatus source) {
         return dataAccessService.getList(
             JobAuditStatus.class,
-            String.format(" where SOURCE = '%s' and JOB_ID = '%s'",source, jobUUID),
+            String.format(" where SOURCE = '%s' and JOB_ID = '%s'", source, jobUUID),
             " CREATED_DATE ", null);
     }
 
-    private JobAuditStatus getLatestAuditStatus(UUID jobUUID, JobAuditStatus.SourceStatus source){
-        List<JobAuditStatus> list = getAuditStatuses(jobUUID,source);
-        return !list.isEmpty() ? list.get(list.size()-1) : null;
+    private JobAuditStatus getLatestAuditStatus(UUID jobUUID, JobAuditStatus.SourceStatus source) {
+        List<JobAuditStatus> list = getAuditStatuses(jobUUID, source);
+        return !list.isEmpty() ? list.get(list.size() - 1) : null;
     }
 
     @Override
-    public void auditVidStatus(UUID jobUUID, JobStatus jobStatus){
+    public void auditVidStatus(UUID jobUUID, JobStatus jobStatus) {
         JobAuditStatus vidStatus = new JobAuditStatus(jobUUID, jobStatus.toString(), JobAuditStatus.SourceStatus.VID);
         auditStatus(vidStatus);
     }
 
     @Override
-    public void auditMsoStatus(UUID jobUUID, AsyncRequestStatus.Request msoRequestStatus){
-        auditMsoStatus(jobUUID, msoRequestStatus.requestStatus.getRequestState(), msoRequestStatus.requestId, msoRequestStatus.requestStatus.getStatusMessage());
+    public void auditMsoStatus(UUID jobUUID, AsyncRequestStatus.Request msoRequestStatus) {
+        auditMsoStatus(jobUUID, msoRequestStatus.requestStatus.getRequestState(), msoRequestStatus.requestId,
+            msoRequestStatus.requestStatus.getStatusMessage());
     }
 
     @Override
-    public void auditMsoStatus(UUID jobUUID, String jobStatus, String requestId, String additionalInfo){
+    public void auditMsoStatus(UUID jobUUID, String jobStatus, String requestId, String additionalInfo) {
         JobAuditStatus msoStatus = new JobAuditStatus(jobUUID, jobStatus, JobAuditStatus.SourceStatus.MSO,
-                requestId != null ? UUID.fromString(requestId) : null,
-                additionalInfo);
+            requestId != null ? UUID.fromString(requestId) : null,
+            additionalInfo);
         auditStatus(msoStatus);
     }
 
-    private void auditStatus(JobAuditStatus jobAuditStatus){
-        JobAuditStatus latestStatus = getLatestAuditStatus(jobAuditStatus.getJobId(),jobAuditStatus.getSource());
-        if (latestStatus == null || !latestStatus.equals(jobAuditStatus))
+    private void auditStatus(JobAuditStatus jobAuditStatus) {
+        JobAuditStatus latestStatus = getLatestAuditStatus(jobAuditStatus.getJobId(), jobAuditStatus.getSource());
+        if (latestStatus == null || !latestStatus.equals(jobAuditStatus)) {
             dataAccessService.saveDomainObject(jobAuditStatus, DaoUtils.getPropsMap());
+        }
 
     }
 
     public Job.JobStatus calcStatus(AsyncRequestStatus asyncRequestStatus) {
-        String msoRequestState = asyncRequestStatus.request.requestStatus.getRequestState().toLowerCase().replaceAll("[^a-z]+", "");
+        String msoRequestState = asyncRequestStatus.request.requestStatus.getRequestState().toLowerCase()
+            .replaceAll("[^a-z]+", "");
         JobStatus jobStatus = msoStateToJobStatusMap.get(msoRequestState);
         return (jobStatus != null ? jobStatus : JobStatus.IN_PROGRESS);
     }
@@ -355,11 +407,11 @@ public class AsyncInstantiationBusinessLogicImpl implements AsyncInstantiationBu
     public void handleFailedInstantiation(UUID jobUUID) {
         ServiceInfo serviceInfo = updateServiceInfoAndAuditStatus(jobUUID, JobStatus.FAILED);
         List<ServiceInfo> serviceInfoList = dataAccessService.getList(
-                ServiceInfo.class,
-                String.format(" where templateId = '%s' and jobStatus = '%s'",
-                        serviceInfo.getTemplateId(),
-                        JobStatus.PENDING),
-                null, null);
+            ServiceInfo.class,
+            String.format(" where templateId = '%s' and jobStatus = '%s'",
+                serviceInfo.getTemplateId(),
+                JobStatus.PENDING),
+            null, null);
         serviceInfoList.forEach(si -> updateServiceInfoAndAuditStatus(si.getJobId(), JobStatus.STOPPED));
     }
 
@@ -374,9 +426,9 @@ public class AsyncInstantiationBusinessLogicImpl implements AsyncInstantiationBu
     public void hideServiceInfo(UUID jobUUID) {
         ServiceInfo serviceInfo = getServiceInfoByJobId(jobUUID);
         if (!serviceInfo.getJobStatus().isFinal()) {
-            String message = String.format( "jobId %s: Service status does not allow hide service, status = %s",
-                    serviceInfo.getJobId(),
-                    serviceInfo.getJobStatus());
+            String message = String.format("jobId %s: Service status does not allow hide service, status = %s",
+                serviceInfo.getJobId(),
+                serviceInfo.getJobStatus());
             logger.error(EELFLoggerDelegate.errorLogger, message);
             throw new OperationNotAllowedException(message);
         }
@@ -387,31 +439,29 @@ public class AsyncInstantiationBusinessLogicImpl implements AsyncInstantiationBu
     @Override
     public int
 
-
     getCounterForName(String name) {
 
         String hqlSelectNC = "from NameCounter where name = :name";
         String hqlUpdateCounter = "update NameCounter set counter = :newCounter " +
-                "where name= :name " +
-                "and counter= :prevCounter";
+            "where name= :name " +
+            "and counter= :prevCounter";
 
         Integer counter = null;
         GenericUncheckedException lastException = null;
-        for (int i = 0; i< MAX_RETRIES_GETTING_COUNTER && counter==null; i++) {
+        for (int i = 0; i < MAX_RETRIES_GETTING_COUNTER && counter == null; i++) {
             try {
                 counter = calcCounter(name, hqlSelectNC, hqlUpdateCounter);
-            }
-            catch (GenericUncheckedException exception) {
+            } catch (GenericUncheckedException exception) {
                 lastException = exception; //do nothing, we will try again in the loop
             }
         }
 
-        if (counter!=null) {
+        if (counter != null) {
             return counter;
         }
 
-        throw lastException!=null ? new DbFailureUncheckedException(lastException) :
-                new DbFailureUncheckedException("Failed to get counter for "+name+" due to unknown error");
+        throw lastException != null ? new DbFailureUncheckedException(lastException) :
+            new DbFailureUncheckedException("Failed to get counter for " + name + " due to unknown error");
 
     }
 
@@ -419,14 +469,14 @@ public class AsyncInstantiationBusinessLogicImpl implements AsyncInstantiationBu
         Integer counter;
         counter = DaoUtils.tryWithSessionAndTransaction(sessionFactory, session -> {
             NameCounter nameCounter = (NameCounter) session.createQuery(hqlSelectNC)
-                    .setText("name", name)
-                    .uniqueResult();
+                .setText("name", name)
+                .uniqueResult();
             if (nameCounter != null) {
                 int updatedRows = session.createQuery(hqlUpdateCounter)
-                        .setText("name", nameCounter.getName())
-                        .setInteger("prevCounter", nameCounter.getCounter())
-                        .setInteger("newCounter", nameCounter.getCounter() + 1)
-                        .executeUpdate();
+                    .setText("name", nameCounter.getName())
+                    .setInteger("prevCounter", nameCounter.getCounter())
+                    .setInteger("newCounter", nameCounter.getCounter() + 1)
+                    .executeUpdate();
                 if (updatedRows == 1) {
                     return nameCounter.getCounter() + 1;
                 }
@@ -459,7 +509,7 @@ public class AsyncInstantiationBusinessLogicImpl implements AsyncInstantiationBu
         //Prevents unnecessary increasing of the counter while AAI doesn't response
         isNameFreeInAai(NAME_FOR_CHECK_AAI_STATUS, resourceType);
 
-        for (int i=0; i<getMaxRetriesGettingFreeNameFromAai(); i++) {
+        for (int i = 0; i < getMaxRetriesGettingFreeNameFromAai(); i++) {
             int counter = getCounterForName(name);
             String newName = formatNameAndCounter(name, counter);
             if (isNameFreeInAai(newName, resourceType)) {
@@ -467,7 +517,7 @@ public class AsyncInstantiationBusinessLogicImpl implements AsyncInstantiationBu
             }
         }
 
-        throw new MaxRetriesException("find unused name for "+name, getMaxRetriesGettingFreeNameFromAai());
+        throw new MaxRetriesException("find unused name for " + name, getMaxRetriesGettingFreeNameFromAai());
     }
 
     //the method is protected so we can call it in the UT
@@ -476,11 +526,17 @@ public class AsyncInstantiationBusinessLogicImpl implements AsyncInstantiationBu
     }
 
     private boolean isNameFreeInAai(String name, ResourceType resourceType) throws InvalidAAIResponseException {
-        AaiResponse<AaiNodeQueryResponse> aaiResponse = aaiClient.searchNodeTypeByName(name, resourceType);
-        if (aaiResponse.getHttpCode() > 399 || aaiResponse.getT() == null) {
-            throw new InvalidAAIResponseException(aaiResponse);
+        HttpResponse<AaiNodeQueryResponse> aaiResponse = aaiOverTLSClient
+            .searchNodeTypeByName(name, resourceType);
+        if (aaiResponse.getStatus() > 399 || aaiResponse.getBody() == null) {
+            try {
+                String message = IOUtils.toString(aaiResponse.getRawBody(), "UTF-8");
+                throw new InvalidAAIResponseException(aaiResponse.getStatus(), message);
+            } catch (IOException e) {
+                throw new InvalidAAIResponseException(aaiResponse.getStatus(), aaiResponse.getStatusText());
+            }
         }
-        return CollectionUtils.isEmpty(aaiResponse.getT().resultData);
+        return CollectionUtils.isEmpty(aaiResponse.getBody().resultData);
     }
 
 }
diff --git a/vid-app-common/src/test/java/org/onap/vid/aai/AaiOverTLSClientServerTest.java b/vid-app-common/src/test/java/org/onap/vid/aai/AaiOverTLSClientServerTest.java
new file mode 100644 (file)
index 0000000..f2b26a8
--- /dev/null
@@ -0,0 +1,210 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2018 Nokia Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.vid.aai;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.xebialabs.restito.semantics.Action;
+import io.joshworks.restclient.http.HttpResponse;
+import io.joshworks.restclient.http.mapper.ObjectMapper;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringWriter;
+import org.apache.commons.io.IOUtils;
+import org.assertj.core.api.Assertions;
+import org.glassfish.grizzly.http.util.HttpStatus;
+import org.json.simple.parser.JSONParser;
+import org.json.simple.parser.ParseException;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.onap.vid.aai.model.AaiNodeQueryResponse;
+import org.onap.vid.aai.model.ResourceType;
+import org.onap.vid.client.SyncRestClient;
+import org.onap.vid.testUtils.StubServerUtil;
+
+@RunWith(MockitoJUnitRunner.class)
+public class AaiOverTLSClientServerTest {
+
+    @Mock
+    private AaiOverTLSPropertySupplier propertySupplier;
+
+    private static StubServerUtil serverUtil;
+
+    private String responsePayload =
+        "{\n"
+            + "\"result-data\": [\n"
+            + "  {\n"
+            + "\"resource-type\": \"generic-vnf\",\n"
+            + "\"resource-link\": \"/aai/v13/network/generic-vnfs/generic-vnf/6eac8e69-c98d-4ac5-ab90-69fe0cabda76\"\n"
+            + "},\n"
+            + "  {\n"
+            + "\"resource-type\": \"generic-vnf\",\n"
+            + "\"resource-link\": \"/aai/v13/network/generic-vnfs/generic-vnf/35305ca7-ad59-4b9b-9d21-1dd2b5103968\"\n"
+            + "},\n"
+            + "  {\n"
+            + "\"resource-type\": \"generic-vnf\",\n"
+            + "\"resource-link\": \"/aai/v13/network/generic-vnfs/generic-vnf/1ed7a7ef-e9b8-4fad-8e10-92d0f714acc6\"\n"
+            + "},\n"
+            + "  {\n"
+            + "\"resource-type\": \"generic-vnf\",\n"
+            + "\"resource-link\": \"/aai/v13/network/generic-vnfs/generic-vnf/5054bf7f-7913-4307-8bcd-aecce8b7539c\"\n"
+            + "},\n"
+            + "  {\n"
+            + "\"resource-type\": \"generic-vnf\",\n"
+            + "\"resource-link\": \"/aai/v13/network/generic-vnfs/generic-vnf/7b484da9-8ac1-406c-9c3f-ffcf0437047d\"\n"
+            + "},\n"
+            + "  {\n"
+            + "\"resource-type\": \"generic-vnf\",\n"
+            + "\"resource-link\": \"/aai/v13/network/generic-vnfs/generic-vnf/8e4ac9cb-c1d3-4a4b-9b1b-3bc60dc4c22d\"\n"
+            + "},\n"
+            + "  {\n"
+            + "\"resource-type\": \"generic-vnf\",\n"
+            + "\"resource-link\": \"/aai/v13/network/generic-vnfs/generic-vnf/b04f78e2-2f09-4dd5-bd9d-c6045036966f\"\n"
+            + "},\n"
+            + "  {\n"
+            + "\"resource-type\": \"generic-vnf\",\n"
+            + "\"resource-link\": \"/aai/v13/network/generic-vnfs/generic-vnf/e1e44c20-8803-416d-a4ba-c665de36f1aa\"\n"
+            + "},\n"
+            + "  {\n"
+            + "\"resource-type\": \"generic-vnf\",\n"
+            + "\"resource-link\": \"/aai/v13/network/generic-vnfs/generic-vnf/823f40cc-683a-4591-b82a-d6457a18e1bb\"\n"
+            + "},\n"
+            + "  {\n"
+            + "\"resource-type\": \"generic-vnf\",\n"
+            + "\"resource-link\": \"/aai/v13/network/generic-vnfs/generic-vnf/76f8282a-6099-4d2c-9f8b-b636ba486c23\"\n"
+            + "},\n"
+            + "  {\n"
+            + "\"resource-type\": \"generic-vnf\",\n"
+            + "\"resource-link\": \"/aai/v13/network/generic-vnfs/generic-vnf/c6039a4b-54e8-40a5-817d-84d8e87387e8\"\n"
+            + "},\n"
+            + "  {\n"
+            + "\"resource-type\": \"generic-vnf\",\n"
+            + "\"resource-link\": \"/aai/v13/network/generic-vnfs/generic-vnf/5ba68684-1c61-48b9-872f-de483fdc5cdb\"\n"
+            + "},\n"
+            + "  {\n"
+            + "\"resource-type\": \"generic-vnf\",\n"
+            + "\"resource-link\": \"/aai/v13/network/generic-vnfs/generic-vnf/b0400a1f-4dad-434a-bb36-ac13ef6afbc3\"\n"
+            + "},\n"
+            + "  {\n"
+            + "\"resource-type\": \"generic-vnf\",\n"
+            + "\"resource-link\": \"/aai/v13/network/generic-vnfs/generic-vnf/1142a64e-dd13-425e-a218-bf562365dfc9\"\n"
+            + "},\n"
+            + "  {\n"
+            + "\"resource-type\": \"generic-vnf\",\n"
+            + "\"resource-link\": \"/aai/v13/network/generic-vnfs/generic-vnf/98c34cbf-da33-4659-9797-4729d2a481df\"\n"
+            + "},\n"
+            + "  {\n"
+            + "\"resource-type\": \"generic-vnf\",\n"
+            + "\"resource-link\": \"/aai/v13/network/generic-vnfs/generic-vnf/b043e61c-a73a-446b-83ee-4751cac700e3\"\n"
+            + "},\n"
+            + "  {\n"
+            + "\"resource-type\": \"generic-vnf\",\n"
+            + "\"resource-link\": \"/aai/v13/network/generic-vnfs/generic-vnf/82ae1189-c4b9-45e4-870b-95160be90dae\"\n"
+            + "},\n"
+            + "  {\n"
+            + "\"resource-type\": \"generic-vnf\",\n"
+            + "\"resource-link\": \"/aai/v13/network/generic-vnfs/generic-vnf/75ddc2c9-d61b-49d9-9d57-22473fd0b7fe\"\n"
+            + "},\n"
+            + "  {\n"
+            + "\"resource-type\": \"generic-vnf\",\n"
+            + "\"resource-link\": \"/aai/v13/network/generic-vnfs/generic-vnf/b4443ed1-cfb5-4cc0-aa78-598942354285\"\n"
+            + "},\n"
+            + "  {\n"
+            + "\"resource-type\": \"generic-vnf\",\n"
+            + "\"resource-link\": \"/aai/v13/network/generic-vnfs/generic-vnf/c72519e2-3b76-494f-b742-524abd82b6d0\"\n"
+            + "},\n"
+            + "  {\n"
+            + "\"resource-type\": \"generic-vnf\",\n"
+            + "\"resource-link\": \"/aai/v13/network/generic-vnfs/generic-vnf/f6561cb3-7a23-44cc-98e3-3a6275e5f340\"\n"
+            + "},\n"
+            + "  {\n"
+            + "\"resource-type\": \"generic-vnf\",\n"
+            + "\"resource-link\": \"/aai/v13/network/generic-vnfs/generic-vnf/e3766bc5-40a7-4dbe-9d4a-1d8c8f284913\"\n"
+            + "},\n"
+            + "  {\n"
+            + "\"resource-type\": \"generic-vnf\",\n"
+            + "\"resource-link\": \"/aai/v13/network/generic-vnfs/generic-vnf/6aa153ee-6637-4b49-beb5-a5e756e00393\"\n"
+            + "},\n"
+            + "  {\n"
+            + "\"resource-type\": \"generic-vnf\",\n"
+            + "\"resource-link\": \"/aai/v13/network/generic-vnfs/generic-vnf/5a981c30-de25-4ea9-98fa-ed398f13ea41\"\n"
+            + "},\n"
+            + "  {\n"
+            + "\"resource-type\": \"generic-vnf\",\n"
+            + "\"resource-link\": \"/aai/v13/network/generic-vnfs/generic-vnf/b0ef2271-8ac0-4268-b9a5-09cb50c20c85\"\n"
+            + "}\n"
+            + "],\n"
+            + "}";
+
+
+    @BeforeClass
+    public static void setUpClass(){
+        serverUtil = new StubServerUtil();
+        serverUtil.runServer();
+    }
+
+    @AfterClass
+    public static void tearDown(){
+        serverUtil.stopServer();
+    }
+
+    @Test
+    public void shouldSearchNodeTypeByName() throws IOException, ParseException {
+        ObjectMapper objectMapper = new ObjectMapper() {
+
+            com.fasterxml.jackson.databind.ObjectMapper om = new com.fasterxml.jackson.databind.ObjectMapper();
+
+            @Override
+            public <T> T readValue(String s, Class<T> aClass) {
+                try {
+                    return om.readValue(s, aClass);
+                } catch (IOException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+
+            @Override
+            public String writeValue(Object o) {
+                try {
+                    return om.writeValueAsString(o);
+                } catch (JsonProcessingException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        };
+        AaiOverTLSClient aaiOverTLSClient = new AaiOverTLSClient(new SyncRestClient(objectMapper),  propertySupplier, serverUtil.constructTargetUrl("http", ""));
+
+        serverUtil.prepareGetCall("/search/nodes-query", new JSONParser().parse(responsePayload), Action.status(HttpStatus.OK_200));
+
+        HttpResponse<AaiNodeQueryResponse> aaiNodeQueryResponseHttpResponse = aaiOverTLSClient
+            .searchNodeTypeByName("any", ResourceType.GENERIC_VNF);
+
+        AaiNodeQueryResponse body = aaiNodeQueryResponseHttpResponse.getBody();
+        Assertions.assertThat(body.resultData.size()).isEqualTo(25);
+        Assertions.assertThat(aaiNodeQueryResponseHttpResponse.getStatus()).isEqualTo(200);
+    }
+
+
+
+}
diff --git a/vid-app-common/src/test/java/org/onap/vid/aai/AaiOverTLSClientTest.java b/vid-app-common/src/test/java/org/onap/vid/aai/AaiOverTLSClientTest.java
new file mode 100644 (file)
index 0000000..5b631a6
--- /dev/null
@@ -0,0 +1,75 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2018 Nokia Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.vid.aai;
+
+import com.google.common.collect.ImmutableMap;
+import java.util.Collections;
+import java.util.Map;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Matchers;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.onap.vid.aai.model.AaiNodeQueryResponse;
+import org.onap.vid.aai.model.ResourceType;
+import org.onap.vid.client.SyncRestClient;
+
+@RunWith(MockitoJUnitRunner.class)
+public class AaiOverTLSClientTest {
+
+    public static final String SEARCH_NODES_QUERY_SEARCH_NODE_TYPE = "search/nodes-query?search-node-type=generic-vnf&filter=vnf-name:EQUALS:name";
+    private AaiOverTLSClient aaiRestClient;
+
+    @Mock
+    private SyncRestClient syncRestClient;
+    @Mock
+    private AaiOverTLSPropertySupplier propertySupplier;
+
+    @Before
+    public void setUp() {
+        aaiRestClient = new AaiOverTLSClient(syncRestClient,  propertySupplier);
+    }
+
+    @Test
+    public void searchNodeTypeByName() {
+        mockPropertyReader();
+
+        aaiRestClient.searchNodeTypeByName("name", ResourceType.GENERIC_VNF);
+        Mockito.verify(syncRestClient).get(Matchers.contains(SEARCH_NODES_QUERY_SEARCH_NODE_TYPE),
+            Matchers.eq(getHeaders()), Matchers.eq(Collections.emptyMap()), Matchers.eq(AaiNodeQueryResponse.class));
+    }
+
+    private void mockPropertyReader() {
+        Mockito.when(propertySupplier.getPassword()).thenReturn("Pass");
+        Mockito.when(propertySupplier.getUsername()).thenReturn("User");
+        Mockito.when(propertySupplier.getRequestId()).thenReturn("1");
+        Mockito.when(propertySupplier.getRandomUUID()).thenReturn("2");
+    }
+
+    private Map<String,String> getHeaders(){
+        return ImmutableMap.<String, String>builder().put("Authorization", "Basic VXNlcjpQYXNz").
+            put("X-FromAppId", "VidAaiController").put("Accept", "application/json").put("X-ECOMP-RequestID", "1").
+            put("X-TransactionId", "2").put("Content-Type", "application/json").build();
+    }
+
+}
\ No newline at end of file
index 56ac28d..e5b3c36 100644 (file)
 
 package org.onap.vid.config;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
 import org.hibernate.SessionFactory;
 import org.mockito.Mockito;
 import org.onap.portalsdk.core.service.DataAccessService;
 import org.onap.vid.aai.AaiClientInterface;
+import org.onap.vid.aai.AaiOverTLSClient;
+import org.onap.vid.aai.AaiOverTLSClientInterface;
+import org.onap.vid.aai.AaiOverTLSPropertySupplier;
 import org.onap.vid.aai.util.HttpsAuthClient;
 import org.onap.vid.aai.util.SSLContextProvider;
 import org.onap.vid.aai.util.SystemPropertyHelper;
+import org.onap.vid.client.SyncRestClient;
 import org.onap.vid.job.JobAdapter;
 import org.onap.vid.job.JobsBrokerService;
 import org.onap.vid.job.command.InProgressStatusCommand;
@@ -83,13 +90,42 @@ public class JobCommandsConfigWithMockedMso {
         return jobWorker;
     }
 
+    @Bean
+    public AaiOverTLSClientInterface AaiOverTLSClient(){
+        io.joshworks.restclient.http.mapper.ObjectMapper objectMapper = new io.joshworks.restclient.http.mapper.ObjectMapper() {
+
+            ObjectMapper om = new ObjectMapper();
+
+            @Override
+            public <T> T readValue(String s, Class<T> aClass) {
+                try {
+                    return om.readValue(s, aClass);
+                } catch (IOException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+
+            @Override
+            public String writeValue(Object o) {
+                try {
+                    return om.writeValueAsString(o);
+                } catch (JsonProcessingException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        };
+
+        return new AaiOverTLSClient(new SyncRestClient(objectMapper), new AaiOverTLSPropertySupplier());
+    }
+
     @Bean
     public AsyncInstantiationBusinessLogic asyncInstantiationBusinessLogic(DataAccessService dataAccessService,
                                                                            JobAdapter jobAdapter,
                                                                            JobsBrokerService jobsBrokerService,
                                                                            SessionFactory sessionFactory,
-                                                                           AaiClientInterface aaiClient) {
-        return new AsyncInstantiationBusinessLogicImpl(dataAccessService, jobAdapter, jobsBrokerService, sessionFactory, aaiClient);
+                                                                           AaiClientInterface aaiClient,
+                                                                           AaiOverTLSClientInterface aaiOverTLSClientInterface) {
+        return new AsyncInstantiationBusinessLogicImpl(dataAccessService, jobAdapter, jobsBrokerService, sessionFactory, aaiClient, aaiOverTLSClientInterface);
     }
 
     @Bean