aboutsummaryrefslogtreecommitdiffstats
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
parent6dcf97a8e2160f9d54a3a155a36f4c4fa7e35f0d (diff)
Stitch btw NetworkDiscovery&ServiceDecomp& CtxAggr
Issue-ID: LOG-599 Change-Id: Ia96ee1f7e586f385a3dc9c4fe0c5ff3badfeeea3 Signed-off-by: Phillip Leigh <phillip.leigh@amdocs.com>
-rw-r--r--config/application.properties4
-rw-r--r--pom.xml2
-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
-rw-r--r--version.properties2
16 files changed, 1574 insertions, 163 deletions
diff --git a/config/application.properties b/config/application.properties
index 546bb38..d731df3 100644
--- a/config/application.properties
+++ b/config/application.properties
@@ -24,7 +24,7 @@ networkDiscoveryCtxBuilder.password=OBF:1u2a1toa1w8v1tok1u30
# Service Decomposition REST Client Configuration
serviceDecomposition.httpProtocol=http
-serviceDecomposition.host=1.2.3.4
+serviceDecomposition.host=10.147.112.136
serviceDecomposition.port=8080
serviceDecomposition.serviceInstancePath=/service-decomposition/service/context
#Basic Authorization Client credentials for Service Decomposition REST service
@@ -38,7 +38,7 @@ networkDiscoveryMicroService.port=8080
networkDiscoveryMicroService.httpProtocol=http
networkDiscoveryMicroService.networkDiscoveryPath=/network-discovery/v1/network/resource
# Wait for Network Discovery MicroService response in milliseconds
-networkDiscoveryMicroService.responseTimeOutInMilliseconds = 8000
+networkDiscoveryMicroService.responseTimeOutInMilliseconds=60000
# Basic Authorization credentials for Network Discovery Micro Service Rest Service
networkDiscoveryMicroService.userId=admin
networkDiscoveryMicroService.password=OBF:1u2a1toa1w8v1tok1u30
diff --git a/pom.xml b/pom.xml
index 6e757ec..a29892d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -14,7 +14,7 @@ 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=====================================================
+============LICENSE_END====================================================
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
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
diff --git a/version.properties b/version.properties
index 19b4911..35797f4 100644
--- a/version.properties
+++ b/version.properties
@@ -1,6 +1,6 @@
# Versioning variables
# Note that these variables cannot be structured (e.g. : version.release or version.snapshot etc... )
-# because they are used in Jenkins, whose plug-in doesn't support
+# because they are used in Jenkins, whose plug-in doesn't support.
major=1
minor=3