aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPhillip Leigh <phillip.leigh@amdocs.com>2018-07-27 11:18:51 -0400
committerPhillip Leigh <phillip.leigh@amdocs.com>2018-08-15 11:11:37 -0400
commit08496f00787d418976354cb0aa02f0bf0f4b0294 (patch)
treec1f95eeb90264c3769169f8d7de7199c32aee373 /src
parent6dcf97a8e2160f9d54a3a155a36f4c4fa7e35f0d (diff)
Stitch btw NetworkDiscovery&ServiceDecomp& CtxAggr
Issue-ID: LOG-599 Change-Id: Ia96ee1f7e586f385a3dc9c4fe0c5ff3badfeeea3 Signed-off-by: Phillip Leigh <phillip.leigh@amdocs.com>
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/NdctxbConfiguration.java103
-rw-r--r--src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/exception/DiscoveryException.java21
-rw-r--r--src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/model/NetworkDiscoveryRspInfo.java93
-rw-r--r--src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/service/SpringService.java14
-rw-r--r--src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/service/SpringServiceImpl.java474
-rw-r--r--src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/service/rs/RestService.java46
-rw-r--r--src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/service/rs/RestServiceImpl.java37
-rw-r--r--src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/util/RestUtil.java13
-rw-r--r--src/test/java/org/onap/pomba/contextbuilder/networkdiscovery/test/NetworkDiscoveryRspInfoTest.java103
-rw-r--r--src/test/java/org/onap/pomba/contextbuilder/networkdiscovery/unittest/service/NetworkDiscoveryContextBuilderTest.java275
-rw-r--r--src/test/resources/junit/networkDiscovery-1.json83
-rw-r--r--src/test/resources/junit/networkDiscoveryResponse-1.json6
-rw-r--r--src/test/resources/junit/serviceDecomposition-1.json461
13 files changed, 1570 insertions, 159 deletions
diff --git a/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/NdctxbConfiguration.java b/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/NdctxbConfiguration.java
index d103411..fa4d95f 100644
--- a/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/NdctxbConfiguration.java
+++ b/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/NdctxbConfiguration.java
@@ -18,21 +18,27 @@
package org.onap.pomba.contextbuilder.networkdiscovery;
+import java.net.InetAddress;
import java.util.Base64;
+
import org.eclipse.jetty.util.security.Password;
+import org.onap.pomba.contextbuilder.networkdiscovery.exception.DiscoveryException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
@Component
public class NdctxbConfiguration {
+ private static Logger log = LoggerFactory.getLogger(NdctxbConfiguration.class);
// Network Discover Configuration values
@Value("${networkDiscoveryCtxBuilder.userId:admin}")
private String networkDiscoveryCtxBuilderUserId;
- @Value("${networkDiscoveryCtxBuilder.password:admin}")
+ @Value("${networkDiscoveryCtxBuilder.password:OBF:1u2a1toa1w8v1tok1u30}")
private String networkDiscoveryCtxBuilderPassword;
// Service Decomposition Configuration values
@@ -52,27 +58,102 @@ public class NdctxbConfiguration {
@Value("${serviceDecomposition.userId:admin}")
private String serviceDecompositionUserId;
- @Value("${serviceDecomposition.password:admin}")
+ @Value("${serviceDecomposition.password:OBF:1u2a1toa1w8v1tok1u30}")
private String serviceDecompositionPassword;
- @Bean(name="serviceDecompositionBaseUrl")
+ @Bean(name = "serviceDecompositionBaseUrl")
public String getURL() {
- String url = this.serviceDecompositionHttpProtocol + "://"
- + this.serviceDecompositionHost + ":"
- + this.serviceDecompositionPort
- + this.serviceDecompositionServiceInstancePath;
+ String url = this.serviceDecompositionHttpProtocol + "://" + this.serviceDecompositionHost + ":"
+ + this.serviceDecompositionPort + this.serviceDecompositionServiceInstancePath;
return url;
}
- @Bean(name="serviceDecompositionBasicAuthorization")
+ @Bean(name = "serviceDecompositionBasicAuthorization")
public String getSdBasicAuth() {
- String auth = new String(this.serviceDecompositionUserId + ":" + Password.deobfuscate(this.serviceDecompositionPassword));
+ String auth = this.serviceDecompositionUserId + ":" + Password.deobfuscate(this.serviceDecompositionPassword);
return ("Basic " + Base64.getEncoder().encodeToString(auth.getBytes()));
}
- @Bean(name="networkDiscoveryCtxBuilderBasicAuthorization")
+ @Bean(name = "networkDiscoveryCtxBuilderBasicAuthorization")
public String getNdBasicAuth() {
- String auth = this.networkDiscoveryCtxBuilderUserId + ":" + Password.deobfuscate(this.networkDiscoveryCtxBuilderPassword);
+ String auth = this.networkDiscoveryCtxBuilderUserId + ":"
+ + Password.deobfuscate(this.networkDiscoveryCtxBuilderPassword);
+ return ("Basic " + Base64.getEncoder().encodeToString(auth.getBytes()));
+ }
+
+ /* Network Discovery related */
+ @Value("${networkDiscoveryMicroService.host}")
+ private String networkDiscoveryMicroServiceHost;
+
+ @Value("${networkDiscoveryMicroService.port}")
+ private String networkDiscoveryMicroServicePort;
+
+ @Value("${networkDiscoveryMicroService.httpProtocol}")
+ private String httpNetworkDiscoveryMicroServiceProtocol;
+
+ @Value("${networkDiscoveryMicroService.networkDiscoveryPath}")
+ private String networkDiscoveryMicroServicePath;
+
+ @Value("${networkDiscoveryMicroService.responseTimeOutInMilliseconds}")
+ private String networkDiscoveryResponseTimeOutInMilliseconds;
+
+ @Bean(name = "networkDiscoveryMicroServiceBaseUrl")
+ public String getNetworkDiscoveryURL() {
+ String url = this.httpNetworkDiscoveryMicroServiceProtocol + "://" + this.networkDiscoveryMicroServiceHost + ":"
+ + this.networkDiscoveryMicroServicePort + this.networkDiscoveryMicroServicePath;
+ return url;
+ }
+
+ @Bean(name = "ndResponseTimeOutInMilliseconds")
+ public long getNdResponseTimeOutInMilliseconds() {
+ long timeoutV = Integer.parseUnsignedInt(this.networkDiscoveryResponseTimeOutInMilliseconds);
+ return timeoutV;
+ }
+
+ @Bean(name = "networkDiscoveryMicroServiceHostAndPort")
+ public String getNetworkDiscoveryMicroServiceHostAndPort() {
+ String hostNPort = this.networkDiscoveryMicroServiceHost + ":" + this.networkDiscoveryMicroServicePort;
+ return hostNPort;
+ }
+
+ /* Network Discovery Context Builder related */
+ @Value("${server.port:8080}")
+ private int networkDiscoveryCtxBuilderPort;
+
+ @Value("${networkDiscoveryCtxBuilder.httpProtocol}")
+ private String httpNetworkDiscoveryCtxBuilderProtocol;
+
+ @Bean(name = "networkDiscoveryCtxBuilderPort")
+ public String getNetworkDiscoveryCtxBuilderPort() {
+ return Integer.toString(networkDiscoveryCtxBuilderPort);
+ }
+
+ @Bean(name = "networkDiscoveryCtxBuilderBaseUrl")
+ public String getNetworkDiscoveryCtxBuilderBaseUrl() throws DiscoveryException {
+ String url = null;
+ try {
+ String localIp = InetAddress.getLocalHost().getHostAddress();
+ url = this.httpNetworkDiscoveryCtxBuilderProtocol + "://" + localIp + ":"
+ + getNetworkDiscoveryCtxBuilderPort();
+ } catch (Exception e) {
+ log.error("Unable to obtain localIp: " + e.getMessage());
+ throw new DiscoveryException(e.getMessage(), e);
+ }
+
+ return url;
+ }
+
+ // Network Discovery Configuration values
+ @Value("${networkDiscoveryMicroService.userId:admin}")
+ private String networkDiscoveryMicroServiceUserId;
+
+ @Value("${networkDiscoveryMicroService.password:OBF:1u2a1toa1w8v1tok1u30}")
+ private String networkDiscoveryMicroServicePassword;
+
+ @Bean(name = "networkDiscoveryMicroServiceBasicAuthorization")
+ public String getNetworkDiscoveryMicroServiceBasicAuth() {
+ String auth = this.networkDiscoveryMicroServiceUserId + ":"
+ + Password.deobfuscate(this.networkDiscoveryMicroServicePassword);
return ("Basic " + Base64.getEncoder().encodeToString(auth.getBytes()));
}
diff --git a/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/exception/DiscoveryException.java b/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/exception/DiscoveryException.java
index 3f46324..d2fd561 100644
--- a/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/exception/DiscoveryException.java
+++ b/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/exception/DiscoveryException.java
@@ -26,7 +26,8 @@ public class DiscoveryException extends Exception {
private final Status httpStatus;
public DiscoveryException(String message) {
- this(message, Status.INTERNAL_SERVER_ERROR);
+ super(message);
+ this.httpStatus = matchErrorCode(message);
}
public DiscoveryException(String message, Status httpStatus) {
@@ -39,11 +40,27 @@ public class DiscoveryException extends Exception {
public DiscoveryException(String message, Exception cause) {
super(message, cause);
- this.httpStatus = Status.INTERNAL_SERVER_ERROR;
+ this.httpStatus = matchErrorCode(cause.getMessage());
}
public Status getHttpStatus() {
return this.httpStatus;
}
+ private Status matchErrorCode(String errorMessage) {
+ if (errorMessage.toLowerCase().contains("auth")) {
+ return Status.UNAUTHORIZED;
+ }
+ if ((errorMessage.toLowerCase().contains("missing"))) {
+ return Status.BAD_REQUEST;
+ } else {
+ for (Status st : Status.values()) {
+
+ if (errorMessage.toLowerCase().contains(st.getReasonPhrase().toLowerCase())) {
+ return st;
+ }
+ }
+ }
+ return Status.INTERNAL_SERVER_ERROR;
+ }
}
diff --git a/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/model/NetworkDiscoveryRspInfo.java b/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/model/NetworkDiscoveryRspInfo.java
new file mode 100644
index 0000000..b371631
--- /dev/null
+++ b/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/model/NetworkDiscoveryRspInfo.java
@@ -0,0 +1,93 @@
+/*
+ * ============LICENSE_START===================================================
+ * Copyright (c) 2018 Amdocs
+ * ============================================================================
+ * 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.pomba.contextbuilder.networkdiscovery.model;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+
+import org.onap.sdnc.apps.pomba.networkdiscovery.datamodel.NetworkDiscoveryNotification;
+
+public class NetworkDiscoveryRspInfo {
+
+ private String requestId;
+ private String resourceId; // e.g.:
+ // vserverId
+ private String resourceType; // e.g.:
+ // vserver
+ private CountDownLatch latchSignal;
+
+ private List<NetworkDiscoveryNotification> networkDiscoveryNotificationList = Collections
+ .synchronizedList(new ArrayList<>());
+ private List<String> relatedRequestIdList;
+
+ public String getRequestId() {
+ return requestId;
+ }
+
+ public void setRequestId(String requestId) {
+ this.requestId = requestId;
+ }
+
+ public String getResourceType() {
+ return resourceType;
+ }
+
+ public void setResourceType(String resourceType) {
+ this.resourceType = resourceType;
+ }
+
+ public String getResourceId() {
+ return resourceId;
+ }
+
+ public void setResourceId(String resourceId) {
+ this.resourceId = resourceId;
+ }
+
+ public CountDownLatch getLatchSignal() {
+ return latchSignal;
+ }
+
+ public void setLatchSignal(CountDownLatch latchSignal) {
+ this.latchSignal = latchSignal;
+ }
+
+ public List<NetworkDiscoveryNotification> getNetworkDiscoveryNotificationList() {
+ return this.networkDiscoveryNotificationList;
+ }
+
+ public void setNetworkDiscoveryNotificationList(List<NetworkDiscoveryNotification> response) {
+ this.networkDiscoveryNotificationList = response;
+ }
+
+ public List<String> getRelatedRequestIdList() {
+ return this.relatedRequestIdList;
+ }
+
+ public void setRelatedRequestIdList(List<String> response) {
+ this.relatedRequestIdList = response;
+ }
+
+ @Override
+ public String toString() {
+ return "networkDiscoveryRspInfo [requestId=" + this.requestId + ", resourceId=" + this.resourceId
+ + ", resourceType=" + this.resourceType + "]";
+ }
+}
diff --git a/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/service/SpringService.java b/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/service/SpringService.java
index b103544..770f8a0 100644
--- a/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/service/SpringService.java
+++ b/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/service/SpringService.java
@@ -21,16 +21,16 @@ import javax.servlet.http.HttpServletRequest;
import org.onap.pomba.common.datatypes.ModelContext;
import org.onap.pomba.contextbuilder.networkdiscovery.exception.DiscoveryException;
+import org.onap.sdnc.apps.pomba.networkdiscovery.datamodel.NetworkDiscoveryNotification;
public interface SpringService {
- public ModelContext getContext(HttpServletRequest req,
- String partnerName,
- String authorization,
- String transactionId,
- String serviceInstanceId,
- String modelVersionId,
- String modelInvariantId) throws DiscoveryException;
+ public ModelContext getContext(HttpServletRequest req, String partnerName, String authorization,
+ String transactionId, String serviceInstanceId, String modelVersionId, String modelInvariantId)
+ throws DiscoveryException;
public void validateBasicAuth(String authorization) throws DiscoveryException;
+
+ public void networkDiscoveryNotification(NetworkDiscoveryNotification notification, String authorization)
+ throws DiscoveryException;
}
diff --git a/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/service/SpringServiceImpl.java b/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/service/SpringServiceImpl.java
index 0a7fc5d..a775c00 100644
--- a/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/service/SpringServiceImpl.java
+++ b/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/service/SpringServiceImpl.java
@@ -19,12 +19,23 @@ package org.onap.pomba.contextbuilder.networkdiscovery.service;
import java.net.InetAddress;
import java.text.SimpleDateFormat;
+import java.util.ArrayList;
import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
import java.util.UUID;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.locks.ReentrantLock;
+
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.client.Client;
+import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
+
import org.json.JSONArray;
import org.json.JSONObject;
import org.onap.pomba.common.datatypes.ModelContext;
@@ -33,14 +44,16 @@ import org.onap.pomba.common.datatypes.VF;
import org.onap.pomba.common.datatypes.VFModule;
import org.onap.pomba.common.datatypes.VNFC;
import org.onap.pomba.contextbuilder.networkdiscovery.exception.DiscoveryException;
+import org.onap.pomba.contextbuilder.networkdiscovery.model.NetworkDiscoveryRspInfo;
import org.onap.pomba.contextbuilder.networkdiscovery.service.rs.RestService;
import org.onap.pomba.contextbuilder.networkdiscovery.util.RestUtil;
+import org.onap.sdnc.apps.pomba.networkdiscovery.datamodel.NetworkDiscoveryNotification;
+import org.onap.sdnc.apps.pomba.networkdiscovery.datamodel.NetworkDiscoveryResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Autowired;
-
@org.springframework.stereotype.Service
public class SpringServiceImpl implements SpringService {
private static Logger log = LoggerFactory.getLogger(RestService.class);
@@ -58,8 +71,39 @@ public class SpringServiceImpl implements SpringService {
public static String MDC_RESPONSE_CODE = "ResponseCode";
public static String MDC_INSTANCE_UUID = "InstanceUUID";
+ public static String MDC_TO_NETWORK_DISCOVERY_MICRO_SERVICE_APP = "NetworkDiscoveryContextBuilder_TO_NetworkDiscoveryMicroService";
+ public static String MDC_TO_NETWORK_DISCOVERY_MICRO_SERVICE_MSG_NAME = "MsgName";
+ public static String MDC_TO_NETWORK_DISCOVERY_MICRO_SERVICE_FINDBYRESOURCEIDANDTYPE = "findbyResourceIdAndType";
+ public static String MDC_TO_NETWORK_DISCOVERY_MICRO_SERVICE_URL = "CallingURL";
+ public static String MDC_TO_NETWORK_DISCOVERY_MICRO_SERVICE_REQUEST_ID = "ChildRequestId";
+ public static String MDC_TO_NETWORK_DISCOVERY_MICRO_SERVICE_RESOURCE_TYPE = "ResourceType";
+ public static String MDC_TO_NETWORK_DISCOVERY_MICRO_SERVICE_RESOURCE_ID = "ResourceID";
+ public static String MDC_TO_NETWORK_DISCOVERY_MICRO_SERVICE_CALL_BACK_URL = "CallbackUrl";
+ public static String MDC_TO_NETWORK_DISCOVERY_MICRO_SERVICE_STATUS = "Status";
+ public static String MDC_TO_NETWORK_DISCOVERY_MICRO_SERVICE_STATUS_NO_MORE_CALL_BACK = "NoMoreCallBack";
+ public static String MDC_TO_NETWORK_DISCOVERY_MICRO_SERVICE_WAIT_FOR_NOTIFICATION_TIME_OUT = "NotificationTimeOut";
+
+ public static String NETWORK_DISCOVERY_RSP_STATE_REQUEST_SENT = "RequestSent";
+ public static String NETWORK_DISCOVERY_RSP_STATE_RSP_ALL_RECEIVED = "AllRspReceived";
+ public static String NETWORK_DISCOVERY_RSP_REQUESTID_SPLITTER = "___";
+ public static String NETWORK_DISCOVERY_CTX_BUILDER_NETWORK_DISCOVERY_NOTIFICATION_PATH = "/network-discovery/service/networkDiscoveryNotification";
+ public static String NETWORK_DISCOVERY_FIND_RESOURCE_BY_TYPE_REST_X_ONAP_PARTNER_NAME = "X-ONAP-PartnerName";
+ public static String NETWORK_DISCOVERY_FIND_RESOURCE_BY_TYPE_REST_X_ONAP_REQUEST_ID = "X-ONAP-RequestID";
+ public static String NETWORK_DISCOVERY_FIND_RESOURCE_BY_TYPE_REST_REQUEST_ID = "requestId";
+ public static String NETWORK_DISCOVERY_FIND_RESOURCE_BY_TYPE_REST_RESOURCE_TYPE = "resourceType";
+ public static String NETWORK_DISCOVERY_FIND_RESOURCE_BY_TYPE_REST_RESOURCE_ID = "resourceId";
+ public static String NETWORK_DISCOVERY_FIND_RESOURCE_BY_TYPE_REST_NOTIFICATION_URL = "notificationURL";
+ public static String MDC_FROM_NETWORK_DISCOVERY_MICRO_SERVICE_APP = "NetworkDiscoveryMicroService_TO_NetworkDiscoveryContextBuilder";
+ public static String MDC_FROM_NETWORK_DISCOVERY_MICRO_SERVICE_MSG_NAME = "MsgName";
+ public static String MDC_FROM_NETWORK_DISCOVERY_MICRO_SERVICE_NETWORKDISCOVERYNOTIFICATION = "NetworkDiscoveryNotification";
+ public static String MDC_FROM_NETWORK_DISCOVERY_MICRO_SERVICE_REQUEST_ID = "RequestId";
+ public static String MDC_FROM_NETWORK_DISCOVERY_MICRO_SERVICE_STATUS = "Status";
+ public static String MDC_FROM_NETWORK_DISCOVERY_MICRO_SERVICE_STATUS_UNKNOWN_REQ = "EntryRemoved_dueTo_timeOut_or_error_or_neverExisit";
+ public static String MDC_FROM_NETWORK_DISCOVERY_MICRO_SERVICE_STATUS_SUCCESS = "SUCCESS";
+
private static final String ENTITY_GENERIC_VNFS = "generic-vnfs";
private static final String ENTITY_L3_NETWORK = "l3-network";
+ private static final String ENTITY_L3_NETWORKS = "l3-networks";
private static final String ENTITY_MODEL_INVARIANT_ID = "model-invariant-id";
private static final String ENTITY_NETWORK_ID = "network-id";
private static final String ENTITY_NETWORK_NAME = "network-name";
@@ -72,31 +116,46 @@ public class SpringServiceImpl implements SpringService {
private static final String ENTITY_VNF_NAME = "vnf-name";
private static final String ENTITY_VNF_TYPE = "vnf-type";
private static final String ENTITY_VSERVER = "vserver";
+ private static final String ENTITY_VSERVERS = "vservers";
private static final String ENTITY_VSERVER_NAME = "vserver-name";
private static final String ENTITY_VSERVER_ID = "vserver-id";
private static UUID instanceUUID = UUID.randomUUID();
+ private static Map<String, NetworkDiscoveryRspInfo> networkDiscoveryInfoList = new HashMap<>();
+ private static final AtomicLong uniqueSeq = new AtomicLong();
@Autowired
private String serviceDecompositionBaseUrl;
@Autowired
+ private String networkDiscoveryMicroServiceBasicAuthorization;
+
+ @Autowired
private String networkDiscoveryCtxBuilderBasicAuthorization;
@Autowired
private String serviceDecompositionBasicAuthorization;
@Autowired
+ private String networkDiscoveryMicroServiceBaseUrl;
+
+ @Autowired
+ private String networkDiscoveryCtxBuilderBaseUrl;
+
+ @Autowired
+ private long ndResponseTimeOutInMilliseconds;
+
+ @Autowired
+ private String networkDiscoveryMicroServiceHostAndPort;
+
+ @Autowired
private Client jerseyClient;
+ private static final ReentrantLock lock = new ReentrantLock();
+
@Override
- public ModelContext getContext(HttpServletRequest req,
- String partnerName,
- String authorization,
- String requestId,
- String serviceInstanceId,
- String modelVersionId,
- String modelInvariantId) throws DiscoveryException {
+ public ModelContext getContext(HttpServletRequest req, String partnerName, String authorization, String requestId,
+ String serviceInstanceId, String modelVersionId, String modelInvariantId) throws DiscoveryException {
String remoteAddress = req.getRemoteAddr() != null ? req.getRemoteAddr() : null;
initMDC(requestId, partnerName, serviceInstanceId, remoteAddress);
@@ -105,18 +164,41 @@ public class SpringServiceImpl implements SpringService {
RestUtil.validateServiceInstanceId(serviceInstanceId);
RestUtil.validatePartnerName(partnerName);
validateBasicAuth(authorization);
- return getServiceDeomposition(serviceInstanceId, partnerName, requestId);
+ ModelContext serviceDecompCtx = getServiceDeomposition(serviceInstanceId, partnerName, requestId);
+
+ CountDownLatch latchSignal = createCountDownLatch(serviceDecompCtx);
+
+ if (latchSignal == null) {
+ // Nothing to send
+ return serviceDecompCtx;
+ }
+
+ List<String> sentRequestIdList = sendNetworkDiscoveryRequest(serviceDecompCtx, serviceInstanceId,
+ partnerName, latchSignal);
+
+ int numOfMsgSent = sentRequestIdList.size();
+ if ((numOfMsgSent > 0) && (latchSignal != null)) {
+ // The main task waits for four threads
+ if (false == latchSignal.await(ndResponseTimeOutInMilliseconds, TimeUnit.MILLISECONDS)) {
+ // When it comes here, it is due to time out.
+ log.info("Wait for Latch Signal time out " + serviceInstanceId);
+ }
+ return updateServiceDecompCtx_and_networkDiscoveryInfoList(serviceDecompCtx, sentRequestIdList);
+ } else {
+ return serviceDecompCtx;
+ }
+
} catch (Exception x) {
- MDC.put(MDC_RESPONSE_CODE, String.valueOf(Status.INTERNAL_SERVER_ERROR.getStatusCode()));
+ DiscoveryException exception = new DiscoveryException(x.getMessage(), x);
+ MDC.put(MDC_RESPONSE_CODE, String.valueOf(exception.getHttpStatus().getStatusCode()));
MDC.put(MDC_STATUS_CODE, "ERROR");
log.error(x.getMessage());
- throw new DiscoveryException(x.getMessage(), x);
+ throw exception;
} finally {
MDC.clear();
}
}
-
private void initMDC(String requestId, String partnerName, String serviceInstanceId, String remoteAddress) {
MDC.clear();
MDC.put(MDC_REQUEST_ID, requestId);
@@ -131,7 +213,8 @@ public class SpringServiceImpl implements SpringService {
try {
MDC.put(MDC_SERVER_FQDN, InetAddress.getLocalHost().getCanonicalHostName());
} catch (Exception e) {
- // If, for some reason we are unable to get the canonical host name, we
+ // If, for some reason we are unable to get the canonical host name,
+ // we
// just want to leave the field null.
}
}
@@ -139,7 +222,8 @@ public class SpringServiceImpl implements SpringService {
/**
* Given a service instance ID, GET the resources from Service Decompostion.
*/
- private ModelContext getServiceDeomposition(String serviceInstanceId, String partnerName, String requestId) throws DiscoveryException {
+ private ModelContext getServiceDeomposition(String serviceInstanceId, String partnerName, String requestId)
+ throws DiscoveryException {
if (serviceInstanceId == null) {
return null;
}
@@ -149,37 +233,35 @@ public class SpringServiceImpl implements SpringService {
String urlStr = getUrl(serviceInstanceId);
try {
- Response response =
- jerseyClient.target(urlStr)
- .request()
- .header("Accept", "application/json")
- .header("Authorization", getSdBasicAuthorization())
- .header("X-ONAP-PartnerName", partnerName)
- .header("X-ONAP-RequestID", requestId)
- .get();
+ Response response = jerseyClient.target(urlStr).request().header("Accept", "application/json")
+ .header("Authorization", getSdBasicAuthorization()).header("X-ONAP-PartnerName", partnerName)
+ .header("X-ONAP-RequestID", requestId).get();
String reply = null;
JSONObject jObject = null;
if (response.getStatus() != 200) {
MDC.put(MDC_RESPONSE_CODE, String.valueOf(response.getStatus()));
MDC.put(MDC_STATUS_CODE, "ERROR");
- throw new DiscoveryException(response.getStatusInfo().toString(), Response.Status.fromStatusCode(response.getStatus()));
- }
- else {
+ throw new DiscoveryException(response.getStatusInfo().toString(),
+ Response.Status.fromStatusCode(response.getStatus()));
+ } else {
MDC.put(MDC_RESPONSE_CODE, String.valueOf(response.getStatus()));
MDC.put(MDC_STATUS_CODE, "COMPLETE");
reply = response.readEntity(String.class);
- log.info("Response from GET " + urlStr + " " + reply);
+
+ log.info("GET Response from ServiceDecompositionMircoService GetContext for serviceInstanceId:"
+ + serviceInstanceId + ", message body: " + reply);
jObject = new JSONObject(reply);
}
return parseServiceDecomposition(jObject);
- } catch (Exception x) {
+ } catch (Exception x) {
throw new DiscoveryException(x.getMessage(), x);
}
}
- private String getUrl (String serviceInstanceId) throws DiscoveryException {
- return new String(serviceDecompositionBaseUrl + "?serviceInstanceId=" + serviceInstanceId);
+ private String getUrl(String serviceInstanceId) throws DiscoveryException {
+ String url = serviceDecompositionBaseUrl + "?serviceInstanceId=" + serviceInstanceId;
+ return url;
}
private String getSdBasicAuthorization() {
@@ -209,7 +291,7 @@ public class SpringServiceImpl implements SpringService {
// Find generic-vnfs
if (jObject.has(ENTITY_GENERIC_VNFS)) {
JSONArray genericVnfs = jObject.getJSONArray(ENTITY_GENERIC_VNFS);
- for (int i = 0; i < genericVnfs.length(); i++ ) {
+ for (int i = 0; i < genericVnfs.length(); i++) {
VF vf = new VF();
JSONObject genericVnfInst = genericVnfs.getJSONObject(i);
@@ -247,10 +329,10 @@ public class SpringServiceImpl implements SpringService {
}
// Find vservers
- if (genericVnfInst.has(ENTITY_VSERVER)) {
- JSONArray vservers = genericVnfInst.getJSONArray(ENTITY_VSERVER);
+ if (genericVnfInst.has(ENTITY_VSERVERS)) {
+ JSONArray vservers = genericVnfInst.getJSONArray(ENTITY_VSERVERS);
for (int j = 0; j < vservers.length(); j++) {
- VNFC vserver = new VNFC();
+ VNFC vserver = new VNFC();
JSONObject vserversInst = vservers.getJSONObject(j);
if (vserversInst.has(ENTITY_VSERVER_NAME)) {
vserver.setName(vserversInst.getString(ENTITY_VSERVER_NAME));
@@ -261,13 +343,15 @@ public class SpringServiceImpl implements SpringService {
if (vserversInst.has(ENTITY_MODEL_INVARIANT_ID)) {
vserver.setInvariantUuid(vserversInst.getString(ENTITY_MODEL_INVARIANT_ID));
}
+ // Store vserver type to NfcNameCode
+ vserver.setNfcNamingCode(ENTITY_VSERVER);
vf.addVnfc(vserver);
}
}
// Find l3 networks
- if (genericVnfInst.has(ENTITY_L3_NETWORK)) {
- JSONArray l3Networks = genericVnfInst.getJSONArray(ENTITY_L3_NETWORK);
+ if (genericVnfInst.has(ENTITY_L3_NETWORKS)) {
+ JSONArray l3Networks = genericVnfInst.getJSONArray(ENTITY_L3_NETWORKS);
for (int j = 0; j < l3Networks.length(); j++) {
VNFC l3Network = new VNFC();
JSONObject l3NetworkInst = l3Networks.getJSONObject(j);
@@ -280,6 +364,8 @@ public class SpringServiceImpl implements SpringService {
if (l3NetworkInst.has(ENTITY_MODEL_INVARIANT_ID)) {
l3Network.setInvariantUuid(l3NetworkInst.getString(ENTITY_MODEL_INVARIANT_ID));
}
+ // Store l3-network type to NfcNameCode
+ l3Network.setNfcNamingCode(ENTITY_L3_NETWORK);
vf.addVnfc(l3Network);
}
}
@@ -293,17 +379,329 @@ public class SpringServiceImpl implements SpringService {
/**
* Validates the Basic authorization header as admin:admin.
*
- * @throws DiscoveryException if there is missing parameter
+ * @throws DiscoveryException
+ * if there is missing parameter
*/
public void validateBasicAuth(String authorization) throws DiscoveryException {
if (authorization != null && !authorization.trim().isEmpty() && authorization.startsWith("Basic")) {
if (!authorization.equals(networkDiscoveryCtxBuilderBasicAuthorization)) {
throw new DiscoveryException("Authorization Failed", Status.UNAUTHORIZED);
- };
+ }
+ ;
} else {
- throw new DiscoveryException("Missing Authorization: " +(authorization==null ? "null" : authorization.toString()), Status.UNAUTHORIZED);
+ throw new DiscoveryException(
+ "Missing Authorization: " + (authorization == null ? "null" : authorization.toString()),
+ Status.UNAUTHORIZED);
+ }
+ }
+
+ @Override
+ public void networkDiscoveryNotification(NetworkDiscoveryNotification ndNotification, String authorization)
+ throws DiscoveryException {
+ String requestId = ndNotification.getRequestId();
+ initMDC_MsgFrom_networkDiscoveryMicroService(requestId);
+ log.info("POST message payload:" + ndNotification.toString());
+ String status = null;
+
+ NetworkDiscoveryRspInfo myNetworkDiscoveryRspInfo;
+ lock.lock();
+ try {
+ myNetworkDiscoveryRspInfo = networkDiscoveryInfoList.get(requestId);
+ if (myNetworkDiscoveryRspInfo == null) {
+ // The requestId is invalid. The corresponding request may
+ // already be discarded
+ // due to time out or error exception, or the request may never
+ // exist.
+ log.error("Unknown RequestId:" + requestId
+ + "! The corresponding request may already be discarded due to time out or error exception, or the request never exists.");
+
+ status = MDC_FROM_NETWORK_DISCOVERY_MICRO_SERVICE_STATUS_UNKNOWN_REQ;
+ return;
+ }
+
+ // Update networkDiscoveryInfo
+ status = MDC_FROM_NETWORK_DISCOVERY_MICRO_SERVICE_STATUS_SUCCESS;
+ myNetworkDiscoveryRspInfo.getNetworkDiscoveryNotificationList().add(ndNotification);
+ } finally {
+ lock.unlock();
+ }
+
+ MDC.put(MDC_FROM_NETWORK_DISCOVERY_MICRO_SERVICE_STATUS, status);
+ CountDownLatch latch = myNetworkDiscoveryRspInfo.getLatchSignal();
+ if (latch != null) {
+ latch.countDown();
+ }
+
+ return;
+ }
+
+ private ModelContext updateServiceDecompCtx_and_networkDiscoveryInfoList(ModelContext serviceDecompCtx,
+ List<String> sentRequestIdList) {
+ /*
+ * TO DO: We can’t add network discovery data to serviceDecompCtx
+ * because the existing “v0” context aggregator context model doesn’t
+ * support it. We will have to wait for the real “v1” context model
+ * which contains attributes, vservers and networks.
+ */
+
+ StringBuilder sbl = new StringBuilder();
+ int idx = 0;
+ for (String reqId : sentRequestIdList) {
+ if (!(networkDiscoveryInfoList.containsKey(reqId))) {
+ continue;
+ }
+ idx++;
+ sbl.append("--[[Entry" + idx + "]]" + ", requestId:" + reqId);
+ lock.lock();
+ NetworkDiscoveryRspInfo tNdRspInfo = networkDiscoveryInfoList.get(reqId);
+
+ // ServiceDecompCtx is updated, we need to delete the existing entry
+ // in
+ // networkDiscoveryInfoList
+ networkDiscoveryInfoList.remove(reqId);
+ lock.unlock();
+
+ sbl.append(", Resource :" + tNdRspInfo.getResourceType());
+ sbl.append(", ServerId :" + tNdRspInfo.getResourceId());
+ sbl.append(", RelatedRequestId :" + tNdRspInfo.getRelatedRequestIdList());
+ List<NetworkDiscoveryNotification> nList = tNdRspInfo.getNetworkDiscoveryNotificationList();
+ if (nList.size() > 0) {
+ for (NetworkDiscoveryNotification nt : tNdRspInfo.getNetworkDiscoveryNotificationList()) {
+ sbl.append(" Notification :" + nt.toString());
+ }
+ }
+
+ }
+
+ String infoStr = sbl.toString();
+ log.info(
+ "updateServiceDecompCtx_and_networkDiscoveryInfoList: All Notifications from NetworkDiscoveryMicroService: "
+ + infoStr);
+
+ return serviceDecompCtx;
+ }
+
+ private CountDownLatch createCountDownLatch(ModelContext serviceDecompCtx) {
+
+ // Obtain the possible total count of messages to NetworkDiscovery
+ // for CountDownLatch.
+ int latch_count = sizeOfMsgToNetworkDiscovery(serviceDecompCtx);
+ if (latch_count > 0) {
+ // Let us create task that is going to
+ // wait for all threads before it starts
+ CountDownLatch latchSignal = new CountDownLatch(latch_count);
+ return latchSignal;
+ }
+
+ return null;
+ }
+
+ /* Return list of requestIds sent to network-discovery microService. */
+ private List<String> sendNetworkDiscoveryRequest(ModelContext serviceDecompCtx, String serviceInstanceId,
+ String partner_name, CountDownLatch latchSignal) throws DiscoveryException {
+ List<String> relatedRequestIdList = new ArrayList<>();
+
+ String parent_requestId = MDC.get(MDC_REQUEST_ID);
+
+ List<VF> vfList = serviceDecompCtx.getVf();
+
+ for (VF entryVF : vfList) {
+
+ List<VNFC> vnfcList = entryVF.getVnfc();
+ for (VNFC entryVnfc : vnfcList) {
+ String resourceId = entryVnfc.getUuid();
+ String resourceType = entryVnfc.getNfcNamingCode();
+
+ // The old_requestId is inheritated from ServiceDecomposition.
+ // Before we send a
+ // message to NetworkDiscoveryMicroService for each Vserver, we
+ // need to generate
+ // a new request for identification, based on the old ID.
+ String requestId = parent_requestId + NETWORK_DISCOVERY_RSP_REQUESTID_SPLITTER
+ + uniqueSeq.incrementAndGet();
+
+ if (true == sendNetworkDiscoveryRequestToSpecificServer(partner_name, parent_requestId, requestId,
+ resourceId, resourceType, latchSignal)) {
+ relatedRequestIdList.add(requestId);
+ }
+ }
+ }
+
+ // Update networkDiscoveryInfoList
+ for (String t_rqId : relatedRequestIdList) {
+ if (networkDiscoveryInfoList.containsKey(t_rqId)) {
+ lock.lock();
+ networkDiscoveryInfoList.get(t_rqId).setRelatedRequestIdList(relatedRequestIdList);
+ lock.unlock();
+ }
+ }
+
+ return relatedRequestIdList;
+ }
+
+ /* Return number of messages sent to network-discovery microService. */
+ private int sizeOfMsgToNetworkDiscovery(ModelContext serviceDecompCtx) {
+ int msg_count = 0;
+
+ List<VF> vfList = serviceDecompCtx.getVf();
+ for (VF entryVF : vfList) {
+ List<VNFC> vnfcList = entryVF.getVnfc();
+ msg_count = msg_count + vnfcList.size();
+ }
+ return msg_count;
+ }
+
+ // Return true when message is sent to network-discovery microService,
+ // otherwise, return false.
+ private boolean sendNetworkDiscoveryRequestToSpecificServer(String partner_name, String parent_requestId,
+ String requestId, String resourceId, String resourceType, CountDownLatch latchSignal)
+ throws DiscoveryException {
+ String callbackUrlStr = getNetworkDiscoveryCtxBuilderCallBackUrl();
+ String networkDiscoveryUrl = networkDiscoveryMicroServiceBaseUrl;
+
+ NetworkDiscoveryRspInfo entryNS = new NetworkDiscoveryRspInfo();
+ entryNS.setRequestId(requestId);
+ entryNS.setResourceId(resourceId);
+ entryNS.setResourceType(resourceType);
+ entryNS.setLatchSignal(latchSignal);
+ List<NetworkDiscoveryNotification> notfList = new ArrayList<>();
+ List<String> reqList = new ArrayList<>();
+ entryNS.setNetworkDiscoveryNotificationList(notfList);
+ entryNS.setRelatedRequestIdList(reqList);
+
+ // Update networkDiscoveryInfoList before sending the message
+ // to NetworkDiscoveryMicroService, in case of race condition.
+ lock.lock();
+ networkDiscoveryInfoList.put(requestId, entryNS);
+ lock.unlock();
+
+ // send message to Network Discovery API
+ NetworkDiscoveryResponse ndResponse = null;
+
+ // Prepare MDC for logs
+ initMDC_sendTo_networkDiscoveryMicroService(networkDiscoveryUrl, requestId, resourceType, resourceId,
+ callbackUrlStr, partner_name);
+
+ try {
+ Response response = jerseyClient.target(networkDiscoveryUrl)
+ .queryParam(NETWORK_DISCOVERY_FIND_RESOURCE_BY_TYPE_REST_REQUEST_ID, requestId)
+ .queryParam(NETWORK_DISCOVERY_FIND_RESOURCE_BY_TYPE_REST_RESOURCE_TYPE, resourceType)
+ .queryParam(NETWORK_DISCOVERY_FIND_RESOURCE_BY_TYPE_REST_RESOURCE_ID, resourceId)
+ .queryParam(NETWORK_DISCOVERY_FIND_RESOURCE_BY_TYPE_REST_NOTIFICATION_URL, callbackUrlStr).request()
+ .header(HttpHeaders.CONTENT_TYPE, "application/json").header(HttpHeaders.ACCEPT, "application/json")
+ .header(HttpHeaders.AUTHORIZATION, getNetworkDiscoveryMircoServiceBasicAuthorization())
+ .header(NETWORK_DISCOVERY_FIND_RESOURCE_BY_TYPE_REST_X_ONAP_PARTNER_NAME, partner_name)
+ .header(NETWORK_DISCOVERY_FIND_RESOURCE_BY_TYPE_REST_X_ONAP_REQUEST_ID, parent_requestId).get();
+
+ int responseCode = response.getStatus();
+ String status = Response.Status.fromStatusCode(response.getStatus()) + ",code:" + response.getStatus();
+ if ((responseCode < 200) || (responseCode >= 300)) {
+ latchSignal.countDown();
+ safeRemoveEntry_from_networkDiscoveryInfoList(requestId);
+ MDC.put(MDC_TO_NETWORK_DISCOVERY_MICRO_SERVICE_STATUS, status);
+ throw new DiscoveryException(response.getStatusInfo().toString(),
+ Response.Status.fromStatusCode(response.getStatus()));
+ } else {
+ ndResponse = response.readEntity(NetworkDiscoveryResponse.class);
+ MDC.put(MDC_TO_NETWORK_DISCOVERY_MICRO_SERVICE_STATUS, status);
+ }
+ } catch (Exception e) {
+ latchSignal.countDown();
+ safeRemoveEntry_from_networkDiscoveryInfoList(requestId);
+ MDC.put(MDC_TO_NETWORK_DISCOVERY_MICRO_SERVICE_STATUS, e.getMessage());
+ throw new DiscoveryException(e.getMessage(), e);
+ }
+
+ if (true == ndResponse.getAckFinalIndicator()) {
+ // Perform count-down because there is no more notification coming
+ // for this requestId.
+ latchSignal.countDown();
+ safeRemoveEntry_from_networkDiscoveryInfoList(requestId);
+ MDC.put(MDC_TO_NETWORK_DISCOVERY_MICRO_SERVICE_STATUS,
+ MDC_TO_NETWORK_DISCOVERY_MICRO_SERVICE_STATUS_NO_MORE_CALL_BACK);
+ }
+
+ log.info("Message sent. Response Payload:" + ndResponse);
+ return true;
+ }
+
+ private void safeRemoveEntry_from_networkDiscoveryInfoList(String requestId) {
+ lock.lock();
+ networkDiscoveryInfoList.remove(requestId);
+ lock.unlock();
+ }
+
+ private String getNetworkDiscoveryCtxBuilderCallBackUrl() {
+ String url = networkDiscoveryCtxBuilderBaseUrl
+ + NETWORK_DISCOVERY_CTX_BUILDER_NETWORK_DISCOVERY_NOTIFICATION_PATH;
+ return url;
+ }
+
+ private String getNetworkDiscoveryMircoServiceBasicAuthorization() {
+ return networkDiscoveryMicroServiceBasicAuthorization;
+ }
+
+ private void initMDC_sendTo_networkDiscoveryMicroService(String networkDiscoveryUrl, String requestId,
+ String resourceType, String resourceId, String callbackUrlStr, String partner_name) {
+ String parentRequestId = MDC.get(MDC_REQUEST_ID);
+ String parentServiceInstanceId = MDC.get(MDC_SERVICE_INSTANCE_ID);
+ String parentPartnerName = MDC.get(MDC_PARTNER_NAME);
+
+ MDC.clear();
+ initMDC(parentRequestId, parentPartnerName, parentServiceInstanceId, networkDiscoveryMicroServiceHostAndPort);
+
+ MDC.put(MDC_SERVICE_NAME, MDC_TO_NETWORK_DISCOVERY_MICRO_SERVICE_APP);
+ MDC.put(MDC_TO_NETWORK_DISCOVERY_MICRO_SERVICE_MSG_NAME,
+ MDC_TO_NETWORK_DISCOVERY_MICRO_SERVICE_FINDBYRESOURCEIDANDTYPE);
+ MDC.put(MDC_START_TIME, new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX").format(new Date()));
+ MDC.put(MDC_TO_NETWORK_DISCOVERY_MICRO_SERVICE_URL, networkDiscoveryUrl);
+ MDC.put(MDC_TO_NETWORK_DISCOVERY_MICRO_SERVICE_REQUEST_ID, requestId);
+ MDC.put(MDC_TO_NETWORK_DISCOVERY_MICRO_SERVICE_RESOURCE_TYPE, resourceType);
+ MDC.put(MDC_TO_NETWORK_DISCOVERY_MICRO_SERVICE_RESOURCE_ID, resourceId);
+ MDC.put(MDC_TO_NETWORK_DISCOVERY_MICRO_SERVICE_CALL_BACK_URL, callbackUrlStr);
+ try {
+ MDC.put(MDC_SERVER_FQDN, InetAddress.getLocalHost().getHostAddress());
+ } catch (Exception e) {
+ // If, for some reason we are unable to get the canonical host name,
+ // we
+ // just want to leave the field null.
+ }
+ }
+
+ private void initMDC_MsgFrom_networkDiscoveryMicroService(String requestId) {
+ String parentRequestId = MDC.get(MDC_REQUEST_ID);
+ String parentServiceInstanceId = MDC.get(MDC_SERVICE_INSTANCE_ID);
+ String parentPartnerName = MDC.get(MDC_PARTNER_NAME);
+
+ MDC.clear();
+ initMDC(parentRequestId, parentPartnerName, parentServiceInstanceId, networkDiscoveryMicroServiceHostAndPort);
+
+ MDC.put(MDC_SERVICE_NAME, MDC_FROM_NETWORK_DISCOVERY_MICRO_SERVICE_APP);
+ MDC.put(MDC_FROM_NETWORK_DISCOVERY_MICRO_SERVICE_MSG_NAME,
+ MDC_FROM_NETWORK_DISCOVERY_MICRO_SERVICE_NETWORKDISCOVERYNOTIFICATION);
+ MDC.put(MDC_START_TIME, new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX").format(new Date()));
+ MDC.put(MDC_FROM_NETWORK_DISCOVERY_MICRO_SERVICE_REQUEST_ID, requestId);
+ try {
+ MDC.put(MDC_SERVER_FQDN, InetAddress.getLocalHost().getHostAddress());
+ } catch (Exception e) {
+ // If, for some reason we are unable to get the canonical host name,
+ // we
+ // just want to leave the field null.
}
}
+ protected static void updateNetworkDiscoveryInfoList(String requestId, NetworkDiscoveryRspInfo resp) {
+ lock.lock();
+ networkDiscoveryInfoList.put(requestId, resp);
+ lock.unlock();
+ return;
+ }
+
+ protected static NetworkDiscoveryRspInfo getNetworkDiscoveryInfoList(String requestId) {
+ lock.lock();
+ NetworkDiscoveryRspInfo returnInfo = networkDiscoveryInfoList.get(requestId);
+ lock.unlock();
+ return returnInfo;
+ }
} \ No newline at end of file
diff --git a/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/service/rs/RestService.java b/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/service/rs/RestService.java
index 7377c18..8825bc6 100644
--- a/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/service/rs/RestService.java
+++ b/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/service/rs/RestService.java
@@ -17,21 +17,25 @@
*/
package org.onap.pomba.contextbuilder.networkdiscovery.service.rs;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiResponse;
-import io.swagger.annotations.ApiResponses;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
+import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
+
import org.onap.pomba.contextbuilder.networkdiscovery.exception.DiscoveryException;
+import org.onap.sdnc.apps.pomba.networkdiscovery.datamodel.NetworkDiscoveryNotification;
+import org.onap.sdnc.apps.pomba.networkdiscovery.datamodel.NetworkDiscoveryResponse;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
@Api
@Path("/service")
@@ -41,24 +45,24 @@ public interface RestService {
@GET
@Path("/context")
@Produces(MediaType.APPLICATION_JSON)
- @ApiOperation(
- value = "Fetch network info for service",
- notes = "Returns a JSON object which represents the Context model data",
- response = Response.class
- )
- @ApiResponses(
- value = {
- @ApiResponse(code = 200, message = "OK"),
- @ApiResponse(code = 400, message = "Bad Request"),
- @ApiResponse(code = 404, message = "Service not available"),
- @ApiResponse(code = 500, message = "Unexpected Runtime error")
- })
- public Response getContext(
- @Context HttpServletRequest req,
- @HeaderParam("Authorization") String authorization,
- @HeaderParam("X-ONAP-PartnerName") String xpartnerName,
- @HeaderParam("X-ONAP-RequestID") String xRequestId,
+ @ApiOperation(value = "Fetch network info for service", notes = "Returns a JSON object which represents the Context model data", response = Response.class)
+ @ApiResponses(value = { @ApiResponse(code = 200, message = "OK"), @ApiResponse(code = 400, message = "Bad Request"),
+ @ApiResponse(code = 404, message = "Service not available"),
+ @ApiResponse(code = 500, message = "Unexpected Runtime error") })
+ public Response getContext(@Context HttpServletRequest req, @HeaderParam("Authorization") String authorization,
+ @HeaderParam("X-ONAP-PartnerName") String xpartnerName, @HeaderParam("X-ONAP-RequestID") String xRequestId,
@QueryParam("serviceInstanceId") String serviceInstanceId,
@QueryParam("modelVersionId") String modelVersionId,
@QueryParam("modelInvariantId") String modelInvariantId) throws DiscoveryException;
+
+ @POST
+ @Path("/networkDiscoveryNotification")
+ @Produces(MediaType.TEXT_PLAIN)
+ @ApiOperation(value = "Send query request to Network Discovery", notes = "Retrieve information from primary data sources", response = NetworkDiscoveryResponse.class)
+ @ApiResponses(value = {
+ @ApiResponse(code = 200, message = "Request has completed and no more information is forthcoming."),
+ @ApiResponse(code = 400, message = "Missing mandatory field in the request or HTTP header."),
+ @ApiResponse(code = 500, message = "Request failed due to internal error") })
+ public Response networkDiscoveryNotification(NetworkDiscoveryNotification notification,
+ @HeaderParam("Authorization") String authorization) throws DiscoveryException;
} \ No newline at end of file
diff --git a/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/service/rs/RestServiceImpl.java b/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/service/rs/RestServiceImpl.java
index 6c79545..6f1a8c9 100644
--- a/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/service/rs/RestServiceImpl.java
+++ b/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/service/rs/RestServiceImpl.java
@@ -26,8 +26,8 @@ import javax.ws.rs.core.Response.Status;
import org.onap.pomba.common.datatypes.ModelContext;
import org.onap.pomba.contextbuilder.networkdiscovery.exception.DiscoveryException;
import org.onap.pomba.contextbuilder.networkdiscovery.exception.ErrorMessage;
-
import org.onap.pomba.contextbuilder.networkdiscovery.service.SpringService;
+import org.onap.sdnc.apps.pomba.networkdiscovery.datamodel.NetworkDiscoveryNotification;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -46,23 +46,19 @@ public class RestServiceImpl implements RestService {
private SpringService service;
@Override
- public Response getContext(HttpServletRequest req,
- String authorization,
- String partnerName,
- String requestId,
- String serviceInstanceId,
- String modelVersionId,
- String modelInvariantId) throws DiscoveryException {
+ public Response getContext(HttpServletRequest req, String authorization, String partnerName, String requestId,
+ String serviceInstanceId, String modelVersionId, String modelInvariantId) throws DiscoveryException {
// Do some validation on Http headers and URL parameters
if (requestId == null || requestId.isEmpty()) {
- requestId = UUID.randomUUID().toString();
- log.debug(HEADER_REQUEST_ID + " is missing; using newly generated value: " + requestId);
+ requestId = UUID.randomUUID().toString();
+ log.debug(HEADER_REQUEST_ID + " is missing; using newly generated value: " + requestId);
}
try {
- ModelContext sdContext = service.getContext(req, partnerName, authorization, requestId, serviceInstanceId, modelVersionId, modelInvariantId);
+ ModelContext sdContext = service.getContext(req, partnerName, authorization, requestId, serviceInstanceId,
+ modelVersionId, modelInvariantId);
if (sdContext == null) {
// Return empty JSON
return Response.ok().entity(EMPTY_JSON_OBJECT).build();
@@ -80,5 +76,24 @@ public class RestServiceImpl implements RestService {
}
}
+ @Override
+ public Response networkDiscoveryNotification(NetworkDiscoveryNotification notification, String authorization)
+ throws DiscoveryException {
+
+ try {
+ // The calling server (network discovery microService)
+ // doesn't check the response.
+ this.service.validateBasicAuth(authorization);
+ this.service.networkDiscoveryNotification(notification, authorization);
+ return Response.ok("Ack").build();
+ } catch (DiscoveryException x) {
+ log.error("context builder failed", x);
+ return Response.status(x.getHttpStatus()).entity(x.getMessage()).build();
+
+ } catch (Exception x) {
+ log.error("context builder failed", x);
+ return Response.status(Status.INTERNAL_SERVER_ERROR).entity(x.getMessage()).build();
+ }
+ }
}
diff --git a/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/util/RestUtil.java b/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/util/RestUtil.java
index a8f78fc..94a5d5a 100644
--- a/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/util/RestUtil.java
+++ b/src/main/java/org/onap/pomba/contextbuilder/networkdiscovery/util/RestUtil.java
@@ -30,25 +30,28 @@ public class RestUtil {
/**
* Validates the URL parameter seriveInstanceId.
*
- * @throws DiscoveryException if there is missing parameter
+ * @throws DiscoveryException
+ * if there is missing parameter
*/
public static void validateServiceInstanceId(String serviceInstanceId) throws DiscoveryException {
if (serviceInstanceId == null || serviceInstanceId.trim().isEmpty())
- throw new DiscoveryException(ErrorMessage.INVALID_REQUEST_URL + ErrorMessage.MISSING_PARAMTER + SERVICE_INSTANCE_ID, Status.BAD_REQUEST);
+ throw new DiscoveryException(
+ ErrorMessage.INVALID_REQUEST_URL + ErrorMessage.MISSING_PARAMTER + SERVICE_INSTANCE_ID,
+ Status.BAD_REQUEST);
}
/**
* Validates the URL parameter X-ONAP-PartnerName.
*
- * @throws DiscoveryException if there is missing parameter
+ * @throws DiscoveryException
+ * if there is missing parameter
*/
public static void validatePartnerName(String partnerName) throws DiscoveryException {
if ((partnerName == null) || partnerName.trim().isEmpty()) {
- throw new DiscoveryException(ErrorMessage.MISSING_PARAMTER + HEADER_PARTNER_NAME, Status.BAD_REQUEST);
+ throw new DiscoveryException(ErrorMessage.MISSING_PARAMTER + HEADER_PARTNER_NAME, Status.BAD_REQUEST);
}
}
-
}
diff --git a/src/test/java/org/onap/pomba/contextbuilder/networkdiscovery/test/NetworkDiscoveryRspInfoTest.java b/src/test/java/org/onap/pomba/contextbuilder/networkdiscovery/test/NetworkDiscoveryRspInfoTest.java
new file mode 100644
index 0000000..ac5979a
--- /dev/null
+++ b/src/test/java/org/onap/pomba/contextbuilder/networkdiscovery/test/NetworkDiscoveryRspInfoTest.java
@@ -0,0 +1,103 @@
+/*
+ * ============LICENSE_START===================================================
+ * Copyright (c) 2018 Amdocs
+ * ============================================================================
+ * 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.pomba.contextbuilder.networkdiscovery.test;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.pomba.contextbuilder.networkdiscovery.model.NetworkDiscoveryRspInfo;
+import org.onap.sdnc.apps.pomba.networkdiscovery.datamodel.NetworkDiscoveryNotification;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class })
+@WebAppConfiguration
+@SpringBootTest
+@TestPropertySource(properties = { "enricher.url=http://localhost:9505", "serviceDecomposition.host=localhost",
+ "networkDiscoveryMicroService.host=localhost",
+ "networkDiscoveryMicroService.responseTimeOutInMilliseconds=1000" })
+public class NetworkDiscoveryRspInfoTest {
+ NetworkDiscoveryRspInfo networkDiscoveryRspInfo = new NetworkDiscoveryRspInfo();
+
+ @Before
+ public void setUp() throws Exception {
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ }
+
+ @Test
+ public void testGetRequestId() throws Exception {
+ String requestId = "2123";
+ networkDiscoveryRspInfo.setRequestId(requestId);
+ assertEquals(requestId, networkDiscoveryRspInfo.getRequestId());
+ }
+
+ @Test
+ public void testGetResourceType() throws Exception {
+ String resourceType = "vserver";
+ networkDiscoveryRspInfo.setResourceType(resourceType);
+ assertEquals(resourceType, networkDiscoveryRspInfo.getResourceType());
+ }
+
+ @Test
+ public void testGetResourceId() throws Exception {
+ String resourceId = "2123";
+ networkDiscoveryRspInfo.setResourceId(resourceId);
+ assertEquals(resourceId, networkDiscoveryRspInfo.getResourceId());
+ }
+
+ @Test
+ public void testGetLatchSignal() throws Exception {
+ CountDownLatch latchSignal = new CountDownLatch(5);
+ networkDiscoveryRspInfo.setLatchSignal(latchSignal);
+ assertEquals(latchSignal, networkDiscoveryRspInfo.getLatchSignal());
+ }
+
+ @Test
+ public void testGetNetworkDiscoveryNotificationList() throws Exception {
+ NetworkDiscoveryNotification tmpNof = new NetworkDiscoveryNotification();
+ List<NetworkDiscoveryNotification> myList = Arrays.asList(tmpNof);
+
+ networkDiscoveryRspInfo.setNetworkDiscoveryNotificationList(myList);
+ networkDiscoveryRspInfo.toString();
+ assertEquals(myList, networkDiscoveryRspInfo.getNetworkDiscoveryNotificationList());
+ }
+
+ @Test
+ public void testGetRelatedRequestIdList() throws Exception {
+ List<String> myList = Arrays.asList("myTest123");
+
+ networkDiscoveryRspInfo.setRelatedRequestIdList(myList);
+ assertEquals(myList, networkDiscoveryRspInfo.getRelatedRequestIdList());
+ }
+}
diff --git a/src/test/java/org/onap/pomba/contextbuilder/networkdiscovery/unittest/service/NetworkDiscoveryContextBuilderTest.java b/src/test/java/org/onap/pomba/contextbuilder/networkdiscovery/unittest/service/NetworkDiscoveryContextBuilderTest.java
index 16b327b..f5ba694 100644
--- a/src/test/java/org/onap/pomba/contextbuilder/networkdiscovery/unittest/service/NetworkDiscoveryContextBuilderTest.java
+++ b/src/test/java/org/onap/pomba/contextbuilder/networkdiscovery/unittest/service/NetworkDiscoveryContextBuilderTest.java
@@ -25,21 +25,33 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
-import com.github.jknack.handlebars.internal.Files;
-import com.github.tomakehurst.wiremock.junit.WireMockRule;
import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Base64;
+import java.util.List;
import java.util.UUID;
+
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.onap.pomba.contextbuilder.networkdiscovery.model.NetworkDiscoveryRspInfo;
+import org.onap.pomba.contextbuilder.networkdiscovery.service.SpringServiceImpl;
import org.onap.pomba.contextbuilder.networkdiscovery.service.rs.RestService;
+import org.onap.sdnc.apps.pomba.networkdiscovery.datamodel.Attribute;
+import org.onap.sdnc.apps.pomba.networkdiscovery.datamodel.DataQuality;
+import org.onap.sdnc.apps.pomba.networkdiscovery.datamodel.NetworkDiscoveryNotification;
+import org.onap.sdnc.apps.pomba.networkdiscovery.datamodel.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
@@ -50,26 +62,31 @@ import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
+import com.github.jknack.handlebars.internal.Files;
+import com.github.tomakehurst.wiremock.client.WireMock;
+import com.github.tomakehurst.wiremock.junit.WireMockRule;
+import com.github.tomakehurst.wiremock.matching.UrlPattern;
+
@RunWith(SpringJUnit4ClassRunner.class)
@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class })
@WebAppConfiguration
@SpringBootTest
-@TestPropertySource(properties = {
- "serviceDecomposition.host=localhost",
- "serviceDecomposition.port=3333",
- "serviceDecomposition.serviceInstancePath=/service-decomposition/service/context"
- })
+@TestPropertySource(properties = { "serviceDecomposition.host=localhost", "serviceDecomposition.port=3333",
+ "networkDiscoveryMicroService.host=localhost", "networkDiscoveryMicroService.port=9808",
+ "networkDiscoveryMicroService.responseTimeOutInMilliseconds=1000" })
public class NetworkDiscoveryContextBuilderTest {
private String authorization = "Basic "
- + Base64.getEncoder()
- .encodeToString(("admin" + ":" + "admin")
- .getBytes(StandardCharsets.UTF_8));
+ + Base64.getEncoder().encodeToString(("admin" + ":" + "admin").getBytes(StandardCharsets.UTF_8));
private String partnerName = "POMBA";
private String transactionId = UUID.randomUUID().toString();
private String serviceInstanceId = "c6456519-6acf-4adb-997c-3c363dd4caaf";
+ private String requestId = "2131__1";
+ private String resourceType = "vserver";
+ private String resourceId = "25fb07ab-0478-465e-a021-6384ac299671";
HttpServletRequest httpServletRequest = mock(HttpServletRequest.class);
+ NetworkDiscoveryNotification networkDiscoveryNotification = simulateNetworkDiscoveryNotification();
@Autowired
Environment environment;
@@ -79,6 +96,8 @@ public class NetworkDiscoveryContextBuilderTest {
@Rule
public WireMockRule serviceDecompositionRule = new WireMockRule(wireMockConfig().port(3333));
+ @Rule
+ public WireMockRule networkDiscoveryMicroServiceRule = new WireMockRule(wireMockConfig().port(9808));
@Before
public void setUp() throws Exception {
@@ -90,67 +109,36 @@ public class NetworkDiscoveryContextBuilderTest {
@Test
public void testVerifyNoAuthoriztion() throws Exception {
- Response response = this
- .restService
- .getContext(httpServletRequest,
- null,
- partnerName,
- transactionId,
- serviceInstanceId,
- null,
- null);
+ Response response = this.restService.getContext(httpServletRequest, null, partnerName, transactionId,
+ serviceInstanceId, null, null);
assertTrue(response.getEntity().toString().contains("Missing Authorization: "));
- assertEquals(Status.INTERNAL_SERVER_ERROR.getStatusCode(), response.getStatus());
+ assertEquals(Status.UNAUTHORIZED.getStatusCode(), response.getStatus());
}
@Test
public void testVerifyBadAuthoriztion() throws Exception {
String authorization = "Basic "
- + Base64.getEncoder()
- .encodeToString(("Test" + ":" + "Fake")
- .getBytes(StandardCharsets.UTF_8));
- Response response = this
- .restService
- .getContext(httpServletRequest,
- authorization,
- partnerName,
- transactionId,
- serviceInstanceId,
- null,
- null);
+ + Base64.getEncoder().encodeToString(("Test" + ":" + "Fake").getBytes(StandardCharsets.UTF_8));
+ Response response = this.restService.getContext(httpServletRequest, authorization, partnerName, transactionId,
+ serviceInstanceId, null, null);
assertEquals("Authorization Failed", response.getEntity().toString());
- assertEquals(Status.INTERNAL_SERVER_ERROR.getStatusCode(), response.getStatus());
+ assertEquals(Status.UNAUTHORIZED.getStatusCode(), response.getStatus());
}
-
@Test
public void testVerifyPartnerName() throws Exception {
- Response response = this
- .restService
- .getContext(httpServletRequest,
- authorization,
- null,
- transactionId,
- serviceInstanceId,
- null,
- null);
+ Response response = this.restService.getContext(httpServletRequest, authorization, null, transactionId,
+ serviceInstanceId, null, null);
assertTrue(response.getEntity().toString().contains("X-ONAP-PartnerName"));
- assertEquals(Status.INTERNAL_SERVER_ERROR.getStatusCode(), response.getStatus());
+ assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
}
@Test
public void testVerifyServiceInstanceId() throws Exception {
- Response response = this
- .restService
- .getContext(httpServletRequest,
- authorization,
- partnerName,
- transactionId,
- null,
- null,
- null);
+ Response response = this.restService.getContext(httpServletRequest, authorization, partnerName, transactionId,
+ null, null, null);
assertTrue(response.getEntity().toString().contains("serviceInstanceId"));
- assertEquals(Status.INTERNAL_SERVER_ERROR.getStatusCode(), response.getStatus());
+ assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
}
@Test
@@ -159,19 +147,178 @@ public class NetworkDiscoveryContextBuilderTest {
String urlStr = "/service-decomposition/service/context?serviceInstanceId=" + serviceInstanceId;
File file = new File(ClassLoader.getSystemResource("SD_response.json").getFile());
- String sdResonse = new String(Files.read(file));
+ String sdResonse = Files.read(file);
this.serviceDecompositionRule.stubFor(get(urlStr).willReturn(okJson(sdResonse)));
- Response response = this
- .restService
- .getContext(httpServletRequest,
- authorization,
- partnerName,
- transactionId,
- serviceInstanceId,
- null,
- null);
+ addResponse_any("junit/networkDiscoveryResponse-1.json", networkDiscoveryMicroServiceRule);
+ Response response = this.restService.getContext(httpServletRequest, authorization, partnerName, transactionId,
+ serviceInstanceId, null, null);
+ assertEquals(Status.OK.getStatusCode(), response.getStatus());
+ }
+
+ @Test
+ public void testVerifyGetContext() throws Exception {
+
+ String serviceDecompUrl = "/service-decomposition/service/context?serviceInstanceId=" + serviceInstanceId;
+ addResponse(serviceDecompUrl, "junit/serviceDecomposition-1.json", serviceDecompositionRule);
+ addResponse_any("junit/networkDiscoveryResponse-1.json", networkDiscoveryMicroServiceRule);
+
+ Response response = this.restService.getContext(httpServletRequest, authorization, partnerName, transactionId,
+ serviceInstanceId, null, null);
+
+ assertEquals(Status.OK.getStatusCode(), response.getStatus());
+ }
+
+ @Test
+ public void testUnauthorizedNetworkDiscoveryNotfi() throws Exception {
+ String networkDiscoveryCallBackUrl = "/network-discovery/service/networkDiscoveryNotification";
+ addResponse(networkDiscoveryCallBackUrl, "junit/networkDiscovery-1.json", networkDiscoveryMicroServiceRule);
+
+ String badAuthorization = "Basic "
+ + Base64.getEncoder().encodeToString(("Test" + ":" + "Fake").getBytes(StandardCharsets.UTF_8));
+ Response response = this.restService.networkDiscoveryNotification(networkDiscoveryNotification,
+ badAuthorization);
+
+ assertEquals(Status.UNAUTHORIZED.getStatusCode(), response.getStatus());
+ }
+
+ @Test
+ public void testNetworkDiscoveryNotfi() throws Exception {
+ NetworkDiscoveryInfoAccess networkDiscoveryInfoAccess = new NetworkDiscoveryInfoAccess();
+ simulateNetworkDiscoveryInfoList();
+ String networkDiscoveryCallBackUrl = "/network-discovery/service/networkDiscoveryNotification";
+ addResponse(networkDiscoveryCallBackUrl, "junit/networkDiscovery-1.json", networkDiscoveryMicroServiceRule);
+
+ Response response = this.restService.networkDiscoveryNotification(networkDiscoveryNotification, authorization);
+ NetworkDiscoveryRspInfo rsp = networkDiscoveryInfoAccess.getList(requestId);
assertEquals(Status.OK.getStatusCode(), response.getStatus());
+ assertEquals(rsp.getNetworkDiscoveryNotificationList().size(), 1);
}
+ private void addResponse(String path, String classpathResource, WireMockRule thisMock) throws IOException {
+ String payload = readFully(ClassLoader.getSystemResourceAsStream(classpathResource));
+ thisMock.stubFor(get(path).willReturn(okJson(payload)));
+ }
+
+ private void addResponse_any(String classpathResource, WireMockRule thisMock) throws IOException {
+ String payload = readFully(ClassLoader.getSystemResourceAsStream(classpathResource));
+ UrlPattern tPath = WireMock.anyUrl();
+ thisMock.stubFor(get(tPath).willReturn(okJson(payload)));
+ }
+
+ private String readFully(InputStream in) throws IOException {
+ char[] cbuf = new char[1024];
+ StringBuilder content = new StringBuilder();
+ try (InputStreamReader reader = new InputStreamReader(in, "UTF-8")) {
+ int count;
+ while ((count = reader.read(cbuf)) >= 0) {
+ content.append(cbuf, 0, count);
+ }
+ }
+ return content.toString();
+ }
+
+ private NetworkDiscoveryNotification simulateNetworkDiscoveryNotification() {
+ NetworkDiscoveryNotification notification = new NetworkDiscoveryNotification();
+ Resource myResource = new Resource();
+ myResource.setId("25fb07ab-0478-465e-a021-6384ac299671");
+ myResource.setType("vserver");
+ DataQuality dataQuality = new DataQuality();
+ dataQuality.setStatus(DataQuality.Status.ok);
+ myResource.setDataQuality(dataQuality);
+ List<Attribute> attributeList = new ArrayList<>();
+ ;
+ Attribute attribute = new Attribute();
+ attribute.setName("vserver-id");
+ attribute.setValue("25fb07ab-0478-465e-a021-6384ac299671");
+ attribute.setDataQuality(dataQuality);
+ attributeList.add(attribute);
+
+ attribute.setName("power-state");
+ attribute.setValue("1");
+ attribute.setDataQuality(dataQuality);
+ attributeList.add(attribute);
+
+ attribute.setName("vm-state");
+ attribute.setValue("active");
+ attribute.setDataQuality(dataQuality);
+ attributeList.add(attribute);
+
+ attribute.setName("status");
+ attribute.setValue("ACTIVE");
+ attribute.setDataQuality(dataQuality);
+ attributeList.add(attribute);
+
+ attribute.setName("host-status");
+ attribute.setValue("UNKNOWN");
+ attribute.setDataQuality(dataQuality);
+ attributeList.add(attribute);
+
+ attribute.setName("updated");
+ attribute.setValue("2017-11-20T04:26:13Z");
+ attribute.setDataQuality(dataQuality);
+ attributeList.add(attribute);
+
+ attribute.setName("disk-allocation-gb");
+ attribute.setValue(".010");
+ attribute.setDataQuality(dataQuality);
+ attributeList.add(attribute);
+
+ attribute.setName("memory-usage-mb");
+ attribute.setValue("null");
+ attribute.setDataQuality(dataQuality);
+ attributeList.add(attribute);
+
+ attribute.setName("cpu-util-percent");
+ attribute.setValue(".048");
+ attribute.setDataQuality(dataQuality);
+ attributeList.add(attribute);
+
+ attribute.setName(".048");
+ attribute.setValue("2018-07-26 01:37:07 +0000");
+ attribute.setDataQuality(dataQuality);
+ attributeList.add(attribute);
+ myResource.setAttributeList(attributeList);
+
+ notification.setResources(Arrays.asList(myResource));
+ notification.setAckFinalIndicator(true);
+ notification.setCode(200);
+ notification.setRequestId(requestId);
+ notification.setMessage("OK");
+
+ return notification;
+ }
+
+ private void simulateNetworkDiscoveryInfoList() {
+ NetworkDiscoveryInfoAccess networkDiscoveryInfoAccess = new NetworkDiscoveryInfoAccess();
+
+ String requestId2 = "2131__2";
+ List<String> related_request_list = new ArrayList<>();
+ related_request_list.add(requestId);
+ related_request_list.add(requestId2);
+
+ NetworkDiscoveryRspInfo notif1 = new NetworkDiscoveryRspInfo();
+ notif1.setRequestId(requestId);
+ notif1.setResourceType(resourceType);
+ notif1.setResourceId(resourceId);
+ notif1.setRelatedRequestIdList(related_request_list);
+ networkDiscoveryInfoAccess.updateList(requestId, notif1);
+
+ NetworkDiscoveryRspInfo notif2 = new NetworkDiscoveryRspInfo();
+ notif2.setRequestId(requestId2);
+ notif2.setResourceType(resourceType);
+ notif2.setResourceId(resourceId);
+ notif2.setRelatedRequestIdList(related_request_list);
+ networkDiscoveryInfoAccess.updateList(requestId2, notif2);
+ }
+
+ private class NetworkDiscoveryInfoAccess extends SpringServiceImpl {
+ public void updateList(String requestId, NetworkDiscoveryRspInfo resp) {
+ super.updateNetworkDiscoveryInfoList(requestId, resp);
+ }
+
+ public NetworkDiscoveryRspInfo getList(String requestId) {
+ return super.getNetworkDiscoveryInfoList(requestId);
+ }
+ }
}
diff --git a/src/test/resources/junit/networkDiscovery-1.json b/src/test/resources/junit/networkDiscovery-1.json
new file mode 100644
index 0000000..6dd844f
--- /dev/null
+++ b/src/test/resources/junit/networkDiscovery-1.json
@@ -0,0 +1,83 @@
+{
+ "requestId": "2131_1",
+ "code": 200,
+ "message": "OK",
+ "ackFinalIndicator": true,
+ "resources": [{
+ "id": "25fb07ab-0478-465e-a021-6384ac299671",
+ "type": "vserver",
+ "dataQuality": {
+ "status": "ok"
+ },
+ "attributeList": [{
+ "name": "vserver-id",
+ "value": "25fb07ab-0478-465e-a021-6384ac299671",
+ "dataQuality": {
+ "status": "ok"
+ }
+ },
+ {
+ "name": "power-state",
+ "value": "1",
+ "dataQuality": {
+ "status": "ok"
+ }
+ },
+ {
+ "name": "vm-state",
+ "value": "active",
+ "dataQuality": {
+ "status": "ok"
+ }
+ },
+ {
+ "name": "status",
+ "value": "ACTIVE",
+ "dataQuality": {
+ "status": "ok"
+ }
+ },
+ {
+ "name": "host-status",
+ "value": "UNKNOWN",
+ "dataQuality": {
+ "status": "ok"
+ }
+ },
+ {
+ "name": "updated",
+ "value": "2017-11-20T04:26:13Z",
+ "dataQuality": {
+ "status": "ok"
+ }
+ },
+ {
+ "name": "disk-allocation-gb",
+ "value": ".010",
+ "dataQuality": {
+ "status": "ok"
+ }
+ },
+ {
+ "name": "memory-usage-mb",
+ "value": "null",
+ "dataQuality": {
+ "status": "ok"
+ }
+ },
+ {
+ "name": "cpu-util-percent",
+ "value": ".048",
+ "dataQuality": {
+ "status": "ok"
+ }
+ },
+ {
+ "name": "retrieval-timestamp",
+ "value": "2018-07-26 01:37:07 +0000",
+ "dataQuality": {
+ "status": "ok"
+ }
+ }]
+ }]
+} \ No newline at end of file
diff --git a/src/test/resources/junit/networkDiscoveryResponse-1.json b/src/test/resources/junit/networkDiscoveryResponse-1.json
new file mode 100644
index 0000000..12da468
--- /dev/null
+++ b/src/test/resources/junit/networkDiscoveryResponse-1.json
@@ -0,0 +1,6 @@
+{
+ "requestId": "2131_1",
+ "code": 202,
+ "message": "Accepted",
+ "ackFinalIndicator": false
+} \ No newline at end of file
diff --git a/src/test/resources/junit/serviceDecomposition-1.json b/src/test/resources/junit/serviceDecomposition-1.json
new file mode 100644
index 0000000..10ebe4a
--- /dev/null
+++ b/src/test/resources/junit/serviceDecomposition-1.json
@@ -0,0 +1,461 @@
+{
+ "relationship-list": {
+ "relationship": [{
+ "related-to": "generic-vnf",
+ "relationship-data": [{
+ "relationship-value": "6700c313-fbb7-4cf9-ac70-0293ec56df68",
+ "relationship-key": "generic-vnf.vnf-id"
+ }],
+ "related-link": "/aai/v13/network/generic-vnfs/generic-vnf/6700c313-fbb7-4cf9-ac70-0293ec56df68",
+ "related-to-property": [{
+ "property-key": "generic-vnf.vnf-name",
+ "property-value": "PacketGenerator-1"
+ }]
+ },
+ {
+ "related-to": "generic-vnf",
+ "relationship-data": [{
+ "relationship-value": "6700c313-fbb7-4cf9-ac70-0293ec56df69",
+ "relationship-key": "generic-vnf.vnf-id"
+ }],
+ "related-link": "/aai/v13/network/generic-vnfs/generic-vnf/6700c313-fbb7-4cf9-ac70-0293ec56df69",
+ "related-to-property": [{
+ "property-key": "generic-vnf.vnf-name",
+ "property-value": "PacketGenerator-2"
+ }]
+ }]
+ },
+ "model-version-id": "d3d6cf83-d03a-43cc-99ff-206d40bb9a72",
+ "service-instance-id": "c6456519-6acf-4adb-997c-3c363dd4caaf",
+ "resource-version": "1527637758480",
+ "generic-vnfs": [{
+ "nf-role": "",
+ "service-id": "8ea56b0d-459d-4668-b363-c9567432d8b7",
+ "relationship-list": {
+ "relationship": [{
+ "related-to": "service-instance",
+ "relationship-data": [{
+ "relationship-value": "Demonstration",
+ "relationship-key": "customer.global-customer-id"
+ },
+ {
+ "relationship-value": "vFWCL",
+ "relationship-key": "service-subscription.service-type"
+ },
+ {
+ "relationship-value": "c6456519-6acf-4adb-997c-3c363dd4caaf",
+ "relationship-key": "service-instance.service-instance-id"
+ }],
+ "related-link": "/aai/v11/business/customers/customer/Demonstration/service-subscriptions/service-subscription/vFWCL/service-instances/service-instance/c6456519-6acf-4adb-997c-3c363dd4caaf",
+ "related-to-property": [{
+ "property-key": "service-instance.service-instance-name",
+ "property-value": "Firewall1"
+ }]
+ },
+ {
+ "related-to": "l3-network",
+ "relationship-data": [{
+ "relationship-value": "HNP1d77c-1094-41ec-b7f3-94bb30951870",
+ "relationship-key": "l3-network.network-id"
+ }],
+ "related-link": "/aai/v13/network/l3-networks/l3-network/HNP1d77c-1094-41ec-b7f3-94bb30951870",
+ "relationship-label": "org.onap.relationships.inventory.Uses",
+ "related-to-property": [{
+ "property-key": "l3-network.network-name",
+ "property-value": "HNPORTALOAM.OAM"
+ }]
+ },
+ {
+ "related-to": "vserver",
+ "relationship-data": [{
+ "relationship-value": "CloudOwner",
+ "relationship-key": "cloud-region.cloud-owner"
+ },
+ {
+ "relationship-value": "RegionOne",
+ "relationship-key": "cloud-region.cloud-region-id"
+ },
+ {
+ "relationship-value": "b49b830686654191bb1e952a74b014ad",
+ "relationship-key": "tenant.tenant-id"
+ },
+ {
+ "relationship-value": "25fb07ab-0478-465e-a021-6384ac299671",
+ "relationship-key": "vserver.vserver-id"
+ }],
+ "related-link": "/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/b49b830686654191bb1e952a74b014ad/vservers/vserver/25fb07ab-0478-465e-a021-6384ac299671"
+ },
+ {
+ "related-to": "vserver",
+ "relationship-data": [{
+ "relationship-value": "CloudOwner",
+ "relationship-key": "cloud-region.cloud-owner"
+ },
+ {
+ "relationship-value": "RegionOne",
+ "relationship-key": "cloud-region.cloud-region-id"
+ },
+ {
+ "relationship-value": "b49b830686654191bb1e952a74b014ad",
+ "relationship-key": "tenant.tenant-id"
+ },
+ {
+ "relationship-value": "25fb07ab-0478-465e-a021-6384ac299672",
+ "relationship-key": "vserver.vserver-id"
+ }],
+ "related-link": "/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/b49b830686654191bb1e952a74b014ad/vservers/vserver/25fb07ab-0478-465e-a021-6384ac299672"
+ }]
+ },
+ "vnf-id": "6700c313-fbb7-4cf9-ac70-0293ec56df68",
+ "nf-type": "",
+ "l3-networks": [{
+ "network-role": "HNPORTALOAM.OAM",
+ "network-technology": "ovs",
+ "service-id": "V7611HNP-1222-48f1-8085-94aef0c6ef3d51870",
+ "network-id": "HNP1d77c-1222-41ec-b7f3-94bb30951870",
+ "neutron-network-id": "491c7cef-a3f4-4990-883e-b0af397466d0",
+ "is-external-network": false,
+ "is-bound-to-vpn": false,
+ "is-provider-network": false,
+ "network-type": "OVS_PROVIDER_VLAN",
+ "orchestration-status": "active",
+ "network-role-instance": 0,
+ "resource-version": "1526558298075",
+ "network-name": "HNPORTALOAM.OAM",
+ "is-shared-network": false
+ }],
+ "prov-status": "PREPROV",
+ "vnf-type": "vFW-vSINK-service/vPKG 0",
+ "orchestration-status": "Created",
+ "nf-naming-code": "",
+ "in-maint": false,
+ "nf-function": "",
+ "model-version-id": "a5565bf4-d55a-4964-8fbc-6a7674a2e676",
+ "vservers": [{
+ "relationship-list": {
+ "relationship": [{
+ "related-to": "generic-vnf",
+ "relationship-data": [{
+ "relationship-value": "8a9ddb25-2e79-449c-a40d-5011bac0da39",
+ "relationship-key": "generic-vnf.vnf-id"
+ }],
+ "related-link": "/aai/v11/network/generic-vnfs/generic-vnf/8a9ddb25-2e79-449c-a40d-5011bac0da39",
+ "related-to-property": [{
+ "property-key": "generic-vnf.vnf-name",
+ "property-value": "Firewall-1"
+ }]
+ },
+ {
+ "related-to": "flavor",
+ "relationship-data": [{
+ "relationship-value": "CloudOwner",
+ "relationship-key": "cloud-region.cloud-owner"
+ },
+ {
+ "relationship-value": "RegionOne",
+ "relationship-key": "cloud-region.cloud-region-id"
+ },
+ {
+ "relationship-value": "764efb04-5a46-4806-a766-2bdd24559f39",
+ "relationship-key": "flavor.flavor-id"
+ }],
+ "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/764efb04-5a46-4806-a766-2bdd24559f39",
+ "related-to-property": [{
+ "property-key": "flavor.flavor-name",
+ "property-value": "m1.medium"
+ }]
+ },
+ {
+ "related-to": "image",
+ "relationship-data": [{
+ "relationship-value": "CloudOwner",
+ "relationship-key": "cloud-region.cloud-owner"
+ },
+ {
+ "relationship-value": "RegionOne",
+ "relationship-key": "cloud-region.cloud-region-id"
+ },
+ {
+ "relationship-value": "42fd42f8-cf81-4f4c-a552-d4b124f83b0b",
+ "relationship-key": "image.image-id"
+ }],
+ "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/images/image/42fd42f8-cf81-4f4c-a552-d4b124f83b0b",
+ "related-to-property": [{
+ "property-key": "image.image-name",
+ "property-value": "unknown"
+ }]
+ }]
+ },
+ "in-maint": false,
+ "resource-version": "1528481820321",
+ "vserver-name": "Firewall-0",
+ "prov-status": "ACTIVE",
+ "vserver-id": "25fb07ab-0478-465e-a021-6384ac299671",
+ "vserver-name2": "Firewall-0",
+ "vserver-selflink": "http://10.12.25.2:8774/v2.1/b49b830686654191bb1e952a74b014ad/servers/25fb07ab-0478-465e-a021-6384ac299671",
+ "is-closed-loop-disabled": false
+ },
+ {
+ "relationship-list": {
+ "relationship": [{
+ "related-to": "generic-vnf",
+ "relationship-data": [{
+ "relationship-value": "8a9ddb25-2e79-449c-a40d-5011bac0da39",
+ "relationship-key": "generic-vnf.vnf-id"
+ }],
+ "related-link": "/aai/v11/network/generic-vnfs/generic-vnf/8a9ddb25-2e79-449c-a40d-5011bac0da39",
+ "related-to-property": [{
+ "property-key": "generic-vnf.vnf-name",
+ "property-value": "Firewall-1"
+ }]
+ },
+ {
+ "related-to": "flavor",
+ "relationship-data": [{
+ "relationship-value": "CloudOwner",
+ "relationship-key": "cloud-region.cloud-owner"
+ },
+ {
+ "relationship-value": "RegionOne",
+ "relationship-key": "cloud-region.cloud-region-id"
+ },
+ {
+ "relationship-value": "764efb04-5a46-4806-a766-2bdd24559f39",
+ "relationship-key": "flavor.flavor-id"
+ }],
+ "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/764efb04-5a46-4806-a766-2bdd24559f39",
+ "related-to-property": [{
+ "property-key": "flavor.flavor-name",
+ "property-value": "m1.medium"
+ }]
+ },
+ {
+ "related-to": "image",
+ "relationship-data": [{
+ "relationship-value": "CloudOwner",
+ "relationship-key": "cloud-region.cloud-owner"
+ },
+ {
+ "relationship-value": "RegionOne",
+ "relationship-key": "cloud-region.cloud-region-id"
+ },
+ {
+ "relationship-value": "42fd42f8-cf81-4f4c-a552-d4b124f83b0b",
+ "relationship-key": "image.image-id"
+ }],
+ "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/images/image/42fd42f8-cf81-4f4c-a552-d4b124f83b0b",
+ "related-to-property": [{
+ "property-key": "image.image-name",
+ "property-value": "unknown"
+ }]
+ }]
+ },
+ "in-maint": false,
+ "resource-version": "1528481820321",
+ "vserver-name": "Firewall-0",
+ "prov-status": "ACTIVE",
+ "vserver-id": "25fb07ab-0478-465e-a021-6384ac299672",
+ "vserver-name2": "Firewall-0",
+ "vserver-selflink": "http://10.12.25.2:8774/v2.1/b49b830686654191bb1e952a74b014ad/servers/25fb07ab-0478-465e-a021-6384ac299672",
+ "is-closed-loop-disabled": false
+ }],
+ "resource-version": "1527638176989",
+ "model-customization-id": "4cc1e555-361f-4d69-ae21-9f371ea9f40c",
+ "vf-modules": {
+ "vf-module": [{
+ "vf-module-name": "vPacketGen-VNF-1128-3",
+ "model-version-id": "d6d4a002-a584-4640-bdce-a50e9bce552b",
+ "heat-stack-id": "vPacketGen-VNF-1128-3/df34f5d6-ed39-4184-b785-51c37cfa8ac2",
+ "resource-version": "1527641224058",
+ "model-customization-id": "49c8f521-e5ee-4095-bb87-4090166e49ab",
+ "is-base-vf-module": true,
+ "vf-module-id": "0f792076-f5b3-4251-9fcc-c4d5afae0eb1",
+ "module-index": 0,
+ "model-invariant-id": "2a8844a8-f5f7-46dd-a732-472c6972a28e",
+ "orchestration-status": "active"
+ }]
+ },
+ "vserver": [{
+ "vserver-name": "Firewall-1",
+ "vserver-id": "25fb07ab-0478-465e-a021-6384ac299671",
+ "model-invariant-id": "0c5a20de-87ad-442c-9190-f38ab0a6bb7f"
+ }],
+ "model-invariant-id": "99f1fd3f-845c-48f5-a0ba-11fbde6ae557",
+ "vnf-name": "PacketGenerator-1",
+ "is-closed-loop-disabled": false
+ },
+ {
+ "nf-role": "",
+ "service-id": "8ea56b0d-459d-4668-b363-c9567432d8b9",
+ "relationship-list": {
+ "relationship": [{
+ "related-to": "service-instance",
+ "relationship-data": [{
+ "relationship-value": "Demonstration",
+ "relationship-key": "customer.global-customer-id"
+ },
+ {
+ "relationship-value": "vFWCL",
+ "relationship-key": "service-subscription.service-type"
+ },
+ {
+ "relationship-value": "c6456519-6acf-4adb-997c-3c363dd4caaf",
+ "relationship-key": "service-instance.service-instance-id"
+ }],
+ "related-link": "/aai/v11/business/customers/customer/Demonstration/service-subscriptions/service-subscription/vFWCL/service-instances/service-instance/c6456519-6acf-4adb-997c-3c363dd4caaf",
+ "related-to-property": [{
+ "property-key": "service-instance.service-instance-name",
+ "property-value": "Firewall1"
+ }]
+ },
+ {
+ "related-to": "l3-network",
+ "relationship-data": [{
+ "relationship-value": "HNP1d77c-1094-41ec-b7f3-94bb30951870",
+ "relationship-key": "l3-network.network-id"
+ }],
+ "related-link": "/aai/v13/network/l3-networks/l3-network/HNP1d77c-1094-41ec-b7f3-94bb30951871",
+ "relationship-label": "org.onap.relationships.inventory.Uses",
+ "related-to-property": [{
+ "property-key": "l3-network.network-name",
+ "property-value": "HNPORTALOAM.OAM"
+ }]
+ },
+ {
+ "related-to": "vserver",
+ "relationship-data": [{
+ "relationship-value": "CloudOwner",
+ "relationship-key": "cloud-region.cloud-owner"
+ },
+ {
+ "relationship-value": "RegionOne",
+ "relationship-key": "cloud-region.cloud-region-id"
+ },
+ {
+ "relationship-value": "b49b830686654191bb1e952a74b014ad",
+ "relationship-key": "tenant.tenant-id"
+ },
+ {
+ "relationship-value": "25fb07ab-0478-465e-a021-6384ac299671",
+ "relationship-key": "vserver.vserver-id"
+ }],
+ "related-link": "/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/b49b830686654191bb1e952a74b014ad/vservers/vserver/b494cd6e-b9f3-45e0-afe7-e1d1a5f5d74b"
+ }]
+ },
+ "vnf-id": "6700c313-fbb7-4cf9-ac70-0293ec56df69",
+ "nf-type": "",
+ "l3-networks": [{
+ "network-role": "HNPORTALOAM.OAM",
+ "network-technology": "ovs",
+ "service-id": "V7611HNP-1222-48f1-8085-94aef0c6ef3d51870",
+ "network-id": "HNP1d77c-1222-41ec-b7f3-94bb30951870",
+ "neutron-network-id": "491c7cef-a3f4-4990-883e-b0af397466d0",
+ "is-external-network": false,
+ "is-bound-to-vpn": false,
+ "is-provider-network": false,
+ "network-type": "OVS_PROVIDER_VLAN",
+ "orchestration-status": "active",
+ "network-role-instance": 0,
+ "resource-version": "1526558298075",
+ "network-name": "HNPORTALOAM.OAM",
+ "is-shared-network": false
+ }],
+ "prov-status": "PREPROV",
+ "vnf-type": "vFW-vSINK-service/vPKG 0",
+ "orchestration-status": "Created",
+ "nf-naming-code": "",
+ "in-maint": false,
+ "nf-function": "",
+ "model-version-id": "a5565bf4-d55a-4964-8fbc-6a7674a2e676",
+ "vservers": [{
+ "relationship-list": {
+ "relationship": [{
+ "related-to": "generic-vnf",
+ "relationship-data": [{
+ "relationship-value": "8a9ddb25-2e79-449c-a40d-5011bac0da39",
+ "relationship-key": "generic-vnf.vnf-id"
+ }],
+ "related-link": "/aai/v11/network/generic-vnfs/generic-vnf/8a9ddb25-2e79-449c-a40d-5011bac0da39",
+ "related-to-property": [{
+ "property-key": "generic-vnf.vnf-name",
+ "property-value": "Firewall-1"
+ }]
+ },
+ {
+ "related-to": "flavor",
+ "relationship-data": [{
+ "relationship-value": "CloudOwner",
+ "relationship-key": "cloud-region.cloud-owner"
+ },
+ {
+ "relationship-value": "RegionOne",
+ "relationship-key": "cloud-region.cloud-region-id"
+ },
+ {
+ "relationship-value": "764efb04-5a46-4806-a766-2bdd24559f39",
+ "relationship-key": "flavor.flavor-id"
+ }],
+ "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/764efb04-5a46-4806-a766-2bdd24559f39",
+ "related-to-property": [{
+ "property-key": "flavor.flavor-name",
+ "property-value": "m1.medium"
+ }]
+ },
+ {
+ "related-to": "image",
+ "relationship-data": [{
+ "relationship-value": "CloudOwner",
+ "relationship-key": "cloud-region.cloud-owner"
+ },
+ {
+ "relationship-value": "RegionOne",
+ "relationship-key": "cloud-region.cloud-region-id"
+ },
+ {
+ "relationship-value": "42fd42f8-cf81-4f4c-a552-d4b124f83b0b",
+ "relationship-key": "image.image-id"
+ }],
+ "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/images/image/42fd42f8-cf81-4f4c-a552-d4b124f83b0b",
+ "related-to-property": [{
+ "property-key": "image.image-name",
+ "property-value": "unknown"
+ }]
+ }]
+ },
+ "in-maint": false,
+ "resource-version": "1528481820321",
+ "vserver-name": "Firewall-0",
+ "prov-status": "ACTIVE",
+ "vserver-id": "b494cd6e-b9f3-45e0-afe7-e1d1a5f5d74b",
+ "vserver-name2": "Firewall-0",
+ "vserver-selflink": "http://10.12.25.2:8774/v2.1/b49b830686654191bb1e952a74b014ad/servers/25fb07ab-0478-465e-a021-6384ac299671",
+ "is-closed-loop-disabled": false
+ }],
+ "resource-version": "1527638176989",
+ "model-customization-id": "4cc1e555-361f-4d69-ae21-9f371ea9f40c",
+ "vf-modules": {
+ "vf-module": [{
+ "vf-module-name": "vPacketGen-VNF-1128-3",
+ "model-version-id": "d6d4a002-a584-4640-bdce-a50e9bce552b",
+ "heat-stack-id": "vPacketGen-VNF-1128-3/df34f5d6-ed39-4184-b785-51c37cfa8ac2",
+ "resource-version": "1527641224058",
+ "model-customization-id": "49c8f521-e5ee-4095-bb87-4090166e49ab",
+ "is-base-vf-module": true,
+ "vf-module-id": "0f792076-f5b3-4251-9fcc-c4d5afae0eb1",
+ "module-index": 0,
+ "model-invariant-id": "2a8844a8-f5f7-46dd-a732-472c6972a28e",
+ "orchestration-status": "active"
+ }]
+ },
+ "vserver": [{
+ "vserver-name": "Firewall-1",
+ "vserver-id": "25fb07ab-0478-465e-a021-6384ac299672",
+ "model-invariant-id": "0c5a20de-87ad-442c-9190-f38ab0a6bb7f"
+ }],
+ "model-invariant-id": "99f1fd3f-845c-48f5-a0ba-11fbde6ae557",
+ "vnf-name": "PacketGenerator-2",
+ "is-closed-loop-disabled": false
+ }],
+ "model-invariant-id": "0c5a20de-87ad-442c-9190-f38ab0a6bb7f",
+ "service-instance-name": "Firewall1"
+} \ No newline at end of file