summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--INFO.yaml15
-rw-r--r--pom.xml11
-rwxr-xr-xsrc/main/java/org/onap/nbi/apis/hub/HubResource.java2
-rw-r--r--src/main/java/org/onap/nbi/apis/hub/model/EventType.java4
-rw-r--r--src/main/java/org/onap/nbi/apis/hub/service/CheckDMaaPEventsManager.java202
-rw-r--r--src/main/java/org/onap/nbi/apis/hub/service/DMaaPEventsScheduler.java40
-rw-r--r--src/main/java/org/onap/nbi/apis/hub/service/EventFactory.java128
-rw-r--r--src/main/java/org/onap/nbi/apis/hub/service/dmaap/CheckDMaaPEventsManager.java240
-rw-r--r--src/main/java/org/onap/nbi/apis/hub/service/dmaap/DMaaPEventsScheduler.java38
-rw-r--r--src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationDBManager.java87
-rw-r--r--src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationResource.java10
-rw-r--r--src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationService.java55
-rw-r--r--src/main/java/org/onap/nbi/apis/servicecatalog/ToscaInfosProcessor.java88
-rw-r--r--src/main/java/org/onap/nbi/apis/servicecatalog/model/ServiceSpecification.java56
-rw-r--r--src/main/java/org/onap/nbi/apis/servicecatalog/model/SpecificationInputSchema.java54
-rw-r--r--src/main/java/org/onap/nbi/apis/servicecatalog/repositories/ServiceSpecificationRepository.java22
-rw-r--r--src/main/java/org/onap/nbi/apis/servicecatalog/repositories/SpecificationInputSchemaRepository.java24
-rw-r--r--src/main/java/org/onap/nbi/apis/status/OnapClient.java4
-rw-r--r--src/main/resources/application-test.properties3
-rw-r--r--src/main/resources/application.properties3
-rw-r--r--src/test/java/org/onap/nbi/apis/servicecatalog/ToscaInfosProcessorTest.java81
-rw-r--r--src/test/resources/karatetest/features/00--ServiceCatalog.feature17
22 files changed, 827 insertions, 357 deletions
diff --git a/INFO.yaml b/INFO.yaml
index 241df2c..4def3aa 100644
--- a/INFO.yaml
+++ b/INFO.yaml
@@ -26,13 +26,15 @@ project_lead: &onap_releng_ptl
company: 'Orange'
timezone: 'Europe/Paris'
primary_contact: *onap_releng_ptl
+mailing_list:
+ type: 'groups.io'
+ url: 'lists.onap.org'
+ tag: '<[sub-project_name]>'
+realtime_discussion: ''
issue_tracking:
type: 'jira'
url: 'https://jira.onap.org/projects/EXTAPI'
key: 'EXTAPI'
-mailing_list:
-realtime_discussion:
-repositories:
meetings:
- type: 'zoom'
agenda: ''
@@ -41,17 +43,20 @@ meetings:
channel: 'n/a'
repeats: 'weekly'
time: '14:00 UTC'
+repositories:
+ - 'externalapi-nbi'
committers:
+ - <<: *onap_releng_ptl
- name: 'Andy Mayer'
email: 'am803u@att.com'
id: 'ajmayer'
company: 'ATT'
- timezone: 'America/New York'
+ timezone: 'America/New_York'
- name: 'Raluca Sirbu'
email: 'rs2184@att.com'
id: ''
company: 'ATT'
- timezone: 'America/New York'
+ timezone: 'America/New_York'
- name: 'Mark Gibson'
email: 'markgi@amdocs.com'
id: ''
diff --git a/pom.xml b/pom.xml
index 2d9ed7f..30d19d5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -7,8 +7,8 @@
OR CONDITIONS OF ANY KIND, either express or implied. See the License for
the specific language governing permissions and limitations under the License. -->
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="http://maven.apache.org/POM/4.0.0"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ xmlns="http://maven.apache.org/POM/4.0.0"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.onap.externalapi-nbi</groupId>
@@ -168,6 +168,13 @@
<version>1.5.18</version>
</dependency>
+ <!-- swagger core -->
+ <dependency>
+ <groupId>io.swagger</groupId>
+ <artifactId>swagger-core</artifactId>
+ <version>1.5.18</version>
+ </dependency>
+
<!-- jackson -->
<dependency>
diff --git a/src/main/java/org/onap/nbi/apis/hub/HubResource.java b/src/main/java/org/onap/nbi/apis/hub/HubResource.java
index ac073c1..016ebca 100755
--- a/src/main/java/org/onap/nbi/apis/hub/HubResource.java
+++ b/src/main/java/org/onap/nbi/apis/hub/HubResource.java
@@ -18,7 +18,7 @@ import java.util.Optional;
import java.util.stream.Collectors;
import org.onap.nbi.apis.hub.model.Subscriber;
import org.onap.nbi.apis.hub.model.Subscription;
-import org.onap.nbi.apis.hub.service.CheckDMaaPEventsManager;
+import org.onap.nbi.apis.hub.service.dmaap.CheckDMaaPEventsManager;
import org.onap.nbi.apis.hub.service.SubscriptionService;
import org.onap.nbi.commons.JsonRepresentation;
import org.onap.nbi.commons.MultiCriteriaRequestBuilder;
diff --git a/src/main/java/org/onap/nbi/apis/hub/model/EventType.java b/src/main/java/org/onap/nbi/apis/hub/model/EventType.java
index b4e1f1a..5db21f3 100644
--- a/src/main/java/org/onap/nbi/apis/hub/model/EventType.java
+++ b/src/main/java/org/onap/nbi/apis/hub/model/EventType.java
@@ -28,7 +28,9 @@ public enum EventType {
SERVICE_ATTRIBUTE_VALUE_CHANGE("ServiceAttributeValueChangeNotification"),
- SERVICE_REMOVE("ServiceRemoveNotification");
+ SERVICE_REMOVE("ServiceRemoveNotification"),
+
+ SDC_DISTRIBUTION("SdcDistributionNotification");
private String value;
diff --git a/src/main/java/org/onap/nbi/apis/hub/service/CheckDMaaPEventsManager.java b/src/main/java/org/onap/nbi/apis/hub/service/CheckDMaaPEventsManager.java
deleted file mode 100644
index b45647f..0000000
--- a/src/main/java/org/onap/nbi/apis/hub/service/CheckDMaaPEventsManager.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/**
- * Copyright (c) 2019 Huawei
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package org.onap.nbi.apis.hub.service;
-
-import java.io.IOException;
-import java.net.URI;
-import java.util.List;
-import javax.annotation.PostConstruct;
-import org.onap.nbi.OnapComponentsUrlPaths;
-import org.onap.nbi.apis.hub.model.Event;
-import org.onap.nbi.apis.hub.model.EventType;
-import org.onap.nbi.apis.hub.model.ServiceInstanceEvent;
-import org.onap.nbi.apis.hub.repository.SubscriberRepository;
-import org.onap.nbi.apis.serviceorder.model.RelatedParty;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.http.HttpEntity;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpMethod;
-import org.springframework.http.ResponseEntity;
-import org.springframework.stereotype.Service;
-import org.springframework.util.CollectionUtils;
-import org.springframework.web.client.RestTemplate;
-import org.springframework.web.util.UriComponentsBuilder;
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.databind.JsonMappingException;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-
-@Service
-public class CheckDMaaPEventsManager {
-
- public static final String RESPONSE_STATUS = "response status : ";
- public static final String RETURNS = " returns ";
- public static final String ERROR_ON_CALLING = "error on calling ";
-
- @Autowired
- private RestTemplate restTemplate;
-
- @Autowired
- private SubscriberRepository subscriberRepository;
-
- @Autowired
- private NotifierService notifier;
-
- @Value("${dmaap.host}")
- private String dmaapHostname;
-
- @Value("${dmaap.topic}")
- private String topic;
-
- @Value("${dmaap.consumergroup}")
- private String consumerGroup;
-
- @Value("${dmaap.consumerid}")
- private String consumerId;
-
- @Value("${dmaap.timeout}")
- private String timeout;
-
- private final Logger logger = LoggerFactory.getLogger(CheckDMaaPEventsManager.class);
-
- private String dmaapGetEventsUrl;
-
- @PostConstruct
- private void setUpAndLogDMaaPUrl() {
- dmaapGetEventsUrl = new StringBuilder().append(dmaapHostname)
- .append(OnapComponentsUrlPaths.DMAAP_CONSUME_EVENTS).toString();
- logger.info("DMaaP Get Events url : " + dmaapGetEventsUrl);
- }
-
- public void checkForDMaaPAAIEvents() {
- ObjectMapper mapper = new ObjectMapper();
-
-
-
- List<String> dmaapResponse = callDMaaPGetEvents();
- if (!CollectionUtils.isEmpty(dmaapResponse)) {
- for (int i = 0; i < dmaapResponse.size(); i++) {
- String aaiEventString = dmaapResponse.get(i);
- if (logger.isDebugEnabled()) {
- logger.debug("aai event returned was {}", aaiEventString);
- }
- try {
- JsonNode jsonNode = mapper.readValue(aaiEventString, JsonNode.class);
- JsonNode eventHeader = jsonNode.get("event-header");
- String aaiEventEntityType = eventHeader.get("entity-type").asText();
- String action = eventHeader.get("action").asText();
- if (logger.isDebugEnabled()) {
- logger.debug("aaiEventEntityType is {} and action is {}", aaiEventEntityType, action);
- }
- if (aaiEventEntityType.equals("service-instance")) {
- {
- // parse the AAI-EVENT service-instance tree
- ServiceInstanceEvent serviceInstanceEvent = new ServiceInstanceEvent();
- RelatedParty relatedParty = new RelatedParty();
- JsonNode entity = jsonNode.get("entity");
- relatedParty.setId(entity.get("global-customer-id").asText());
- relatedParty.setName(entity.get("subscriber-name").asText());
- serviceInstanceEvent.setRelatedParty(relatedParty);
- JsonNode childServiceSubscription = entity.get("service-subscriptions");
- JsonNode serviceSubscriptions = childServiceSubscription.get("service-subscription");
- JsonNode serviceSubscription = serviceSubscriptions.get(0);
- String serviceSubscriptionPrint = serviceSubscription.toString();
- JsonNode childserviceInstances = serviceSubscription.get("service-instances");
- JsonNode serviceInstances = childserviceInstances.get("service-instance");
- JsonNode serviceInstance = serviceInstances.get(0);
- serviceInstanceEvent.setId(serviceInstance.get("service-instance-id").asText());
- serviceInstanceEvent.setHref("service/" + serviceInstance.get("service-instance-id").asText());
- serviceInstanceEvent.setState(serviceInstance.get("orchestration-status").asText());
- if (action.equals("CREATE")) {
- if (logger.isDebugEnabled()) {
- logger.debug("sending service inventory event to listeners");
- }
- processEvent(
- EventFactory.getEvent(EventType.SERVICE_CREATION, serviceInstanceEvent));
- } else if (action.equals("DELETE")) {
- processEvent(EventFactory.getEvent(EventType.SERVICE_REMOVE, serviceInstanceEvent));
- } else if (action.equals("UPDATE")) {
- processEvent(EventFactory.getEvent(EventType.SERVICE_ATTRIBUTE_VALUE_CHANGE,
- serviceInstanceEvent));
- }
-
-
- }
-
- }
-
- } catch (JsonParseException e) {
- logger.error(" unable to Parse AAI Event JSON String {}, exception is", aaiEventString,
- e.getMessage());
- } catch (JsonMappingException e) {
- logger.error(" unable to Map AAI Event JSON String {} to Java Pojo, exception is",
- aaiEventString, e.getMessage());
- } catch (IOException e) {
- logger.error("IO Error when parsing AAI Event JSON String {} ", aaiEventString,
- e.getMessage());
- }
- }
- }
- }
-
- public List<String> callDMaaPGetEvents() {
-
- String dmaapGetEventsUrlFormated = dmaapGetEventsUrl.replace("$topic", topic);
- dmaapGetEventsUrlFormated = dmaapGetEventsUrlFormated.replace("$consumergroup", consumerGroup);
- dmaapGetEventsUrlFormated = dmaapGetEventsUrlFormated.replace("$consumerid", consumerId);
- dmaapGetEventsUrlFormated = dmaapGetEventsUrlFormated.replace("$timeout", timeout);
-
-
- if (logger.isDebugEnabled()) {
- logger.debug("Calling DMaaP Url : " + dmaapGetEventsUrlFormated);
- }
- UriComponentsBuilder callURI = UriComponentsBuilder.fromHttpUrl(dmaapGetEventsUrlFormated);
- ResponseEntity<Object> response = callDMaaP(callURI.build().encode().toUri());
- return (List<String>) response.getBody();
-
- }
-
- private ResponseEntity<Object> callDMaaP(URI callURI) {
- ResponseEntity<Object> response =
- restTemplate.exchange(callURI, HttpMethod.GET, buildRequestHeader(), Object.class);
-
- if (logger.isDebugEnabled()) {
- logger.debug("response body : {} ", response.getBody().toString());
- logger.debug("response status : {}", response.getStatusCodeValue());
- }
- return response;
- }
-
- private HttpEntity<String> buildRequestHeader() {
- HttpHeaders httpHeaders = new HttpHeaders();
- httpHeaders.add("Accept", "application/json");
- httpHeaders.add("Content-Type", "application/json");
- return new HttpEntity<>("parameters", httpHeaders);
- }
-
- /**
- * Retrieve subscribers that match an event and fire notification asynchronously
- *
- * @param event
- */
- private void processEvent(Event event) {
- subscriberRepository.findSubscribersUsingEvent(event).forEach(sub -> notifier.run(sub, event));
- }
-
-}
diff --git a/src/main/java/org/onap/nbi/apis/hub/service/DMaaPEventsScheduler.java b/src/main/java/org/onap/nbi/apis/hub/service/DMaaPEventsScheduler.java
deleted file mode 100644
index 20bc2d9..0000000
--- a/src/main/java/org/onap/nbi/apis/hub/service/DMaaPEventsScheduler.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * Copyright (c) 2019 Huawei
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package org.onap.nbi.apis.hub.service;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Profile;
-import org.springframework.scheduling.annotation.EnableScheduling;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Service;
-
-@Profile("default")
-@Service
-@EnableScheduling
-public class DMaaPEventsScheduler {
-
- @Autowired
- CheckDMaaPEventsManager checkDMaaPEventsManager;
-
- @Scheduled(fixedDelayString = "${dmaapCheck.schedule}",
- initialDelayString = "${dmaapCheck.initial}")
- private void processDMaaPEvents() {
- checkDMaaPEventsManager.checkForDMaaPAAIEvents();
-
- }
-}
-
diff --git a/src/main/java/org/onap/nbi/apis/hub/service/EventFactory.java b/src/main/java/org/onap/nbi/apis/hub/service/EventFactory.java
index ed34322..2fe533b 100644
--- a/src/main/java/org/onap/nbi/apis/hub/service/EventFactory.java
+++ b/src/main/java/org/onap/nbi/apis/hub/service/EventFactory.java
@@ -1,18 +1,22 @@
/**
* Copyright (c) 2018 Orange
*
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
*/
package org.onap.nbi.apis.hub.service;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.MappingJsonFactory;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
@@ -24,72 +28,90 @@ import org.onap.nbi.apis.serviceorder.model.ServiceOrder;
import org.onap.nbi.apis.serviceorder.model.ServiceOrderItem;
import org.onap.nbi.commons.JacksonFilter;
import org.onap.nbi.commons.JsonRepresentation;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.MappingJsonFactory;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class EventFactory {
- private static final ObjectMapper mapper = new ObjectMapper(new MappingJsonFactory());
+ private static final ObjectMapper mapper = new ObjectMapper(new MappingJsonFactory());
+ private static final Logger logger = LoggerFactory.getLogger(EventFactory.class);
+
+ public static Event getEvent(EventType eventType, ServiceOrder serviceOrder,
+ ServiceOrderItem serviceOrderItem) {
+ Event event = new Event();
+ event.setEventId(UUID.randomUUID().toString());
+ event.setEventDate(new Date());
+ event.setEventType(eventType.value());
+
+ DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
+ mapper.setDateFormat(df);
- public static Event getEvent(EventType eventType, ServiceOrder serviceOrder,
- ServiceOrderItem serviceOrderItem) {
- Event event = new Event();
- event.setEventId(UUID.randomUUID().toString());
- event.setEventDate(new Date());
- event.setEventType(eventType.value());
+ JsonNode serviceOrderJson = mapper.valueToTree(filterServiceOrder(serviceOrder));
- DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
- mapper.setDateFormat(df);
+ if (EventType.SERVICE_ORDER_ITEM_STATE_CHANGE.equals(eventType)) {
+ JsonNode serviceOrderItemJson = mapper.valueToTree(serviceOrderItem);
+ ((ObjectNode) serviceOrderJson).putArray("orderItem").add(serviceOrderItemJson);
+ }
- JsonNode serviceOrderJson = mapper.valueToTree(filterServiceOrder(serviceOrder));
+ event.setEvent(serviceOrderJson);
- if (EventType.SERVICE_ORDER_ITEM_STATE_CHANGE.equals(eventType)) {
- JsonNode serviceOrderItemJson = mapper.valueToTree(serviceOrderItem);
- ((ObjectNode) serviceOrderJson).putArray("orderItem").add(serviceOrderItemJson);
+ return event;
}
- event.setEvent(serviceOrderJson);
+ public static Event getEvent(EventType eventType, ServiceInstanceEvent serviceInstanceEvent) {
+ Event event = new Event();
+ event.setEventId(UUID.randomUUID().toString());
+ event.setEventDate(new Date());
+ event.setEventType(eventType.value());
- return event;
- }
+ DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
+ mapper.setDateFormat(df);
- public static Event getEvent(EventType eventType, ServiceInstanceEvent serviceInstanceEvent) {
- Event event = new Event();
- event.setEventId(UUID.randomUUID().toString());
- event.setEventDate(new Date());
- event.setEventType(eventType.value());
+ JsonNode serviceInstanceJson = mapper.valueToTree(serviceInstanceEvent);
- DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
- mapper.setDateFormat(df);
+ event.setEvent(serviceInstanceJson);
- JsonNode serviceInstanceJson = mapper.valueToTree(serviceInstanceEvent);
+ return event;
+ }
- event.setEvent(serviceInstanceJson);
+ public static Event getEvent(EventType eventType, String eventString) {
+ Event event = new Event();
+ event.setEventId(UUID.randomUUID().toString());
+ event.setEventDate(new Date());
+ event.setEventType(eventType.value());
+ DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
+ mapper.setDateFormat(df);
+ JsonNode serviceInstanceJson = null;
+ try {
+ serviceInstanceJson = mapper.readTree(eventString);
+ event.setEvent(serviceInstanceJson);
+ return event;
+ } catch (IOException e) {
+ logger.error("IO Error when parsing Event JSON String {} ", eventString,
+ e.getMessage());
+ }
+ return null;
+ }
- return event;
- }
+ /**
+ * Filter ServiceOrderObject to produce a lightweight object that fit the eventBody specification
+ *
+ * @param serviceOrder
+ * @return
+ */
+ private static Object filterServiceOrder(final ServiceOrder serviceOrder) {
- /**
- * Filter ServiceOrderObject to produce a lightweight object that fit the eventBody specification
- *
- * @param serviceOrder
- * @return
- */
- private static Object filterServiceOrder(final ServiceOrder serviceOrder) {
+ Object filteredServiceOrder = null;
- Object filteredServiceOrder = null;
+ if (serviceOrder != null) {
+ JsonRepresentation jsonRepresentation = new JsonRepresentation();
+ jsonRepresentation.add("id").add("href").add("externalId").add("state").add("orderDate")
+ .add("completionDateTime").add("orderItem");
- if (serviceOrder != null) {
- JsonRepresentation jsonRepresentation = new JsonRepresentation();
- jsonRepresentation.add("id").add("href").add("externalId").add("state").add("orderDate")
- .add("completionDateTime").add("orderItem");
+ filteredServiceOrder = JacksonFilter.createNode(serviceOrder, jsonRepresentation);
+ }
- filteredServiceOrder = JacksonFilter.createNode(serviceOrder, jsonRepresentation);
+ return filteredServiceOrder;
}
-
- return filteredServiceOrder;
- }
}
diff --git a/src/main/java/org/onap/nbi/apis/hub/service/dmaap/CheckDMaaPEventsManager.java b/src/main/java/org/onap/nbi/apis/hub/service/dmaap/CheckDMaaPEventsManager.java
new file mode 100644
index 0000000..4ff40e6
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/hub/service/dmaap/CheckDMaaPEventsManager.java
@@ -0,0 +1,240 @@
+/**
+ * Copyright (c) 2019 Huawei
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+
+package org.onap.nbi.apis.hub.service.dmaap;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
+import java.net.URI;
+import java.text.MessageFormat;
+import java.util.List;
+import javax.annotation.PostConstruct;
+import org.apache.commons.lang3.StringUtils;
+import org.onap.nbi.OnapComponentsUrlPaths;
+import org.onap.nbi.apis.hub.model.Event;
+import org.onap.nbi.apis.hub.model.EventType;
+import org.onap.nbi.apis.hub.model.ServiceInstanceEvent;
+import org.onap.nbi.apis.hub.repository.SubscriberRepository;
+import org.onap.nbi.apis.hub.service.EventFactory;
+import org.onap.nbi.apis.hub.service.NotifierService;
+import org.onap.nbi.apis.serviceorder.model.RelatedParty;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.util.UriComponentsBuilder;
+
+
+@Service
+public class CheckDMaaPEventsManager {
+
+ public static final String RESPONSE_STATUS = "response status : ";
+ public static final String RETURNS = " returns ";
+ public static final String ERROR_ON_CALLING = "error on calling ";
+ private final Logger logger = LoggerFactory.getLogger(CheckDMaaPEventsManager.class);
+ @Autowired
+ private RestTemplate restTemplate;
+ @Autowired
+ private SubscriberRepository subscriberRepository;
+ @Autowired
+ private NotifierService notifier;
+ @Value("${dmaap.host}")
+ private String dmaapHostname;
+ @Value("${dmaap.aai.topic}")
+ private String aaiTopic;
+ @Value("${dmaap.sdc.topic}")
+ private String sdcTopic;
+ @Value("${dmaap.consumergroup}")
+ private String consumerGroup;
+ @Value("${dmaap.consumerid}")
+ private String consumerId;
+ @Value("${dmaap.timeout}")
+ private String timeout;
+ private String dmaapGetEventsUrl;
+
+ @PostConstruct
+ private void setUpAndLogDMaaPUrl() {
+ dmaapGetEventsUrl = new StringBuilder().append(dmaapHostname)
+ .append(OnapComponentsUrlPaths.DMAAP_CONSUME_EVENTS).toString();
+ logger.info("DMaaP Get Events url : " + dmaapGetEventsUrl);
+ }
+
+ public void checkForDMaaPAAIEvents() {
+ ObjectMapper mapper = new ObjectMapper();
+ List<String> dmaapResponse = callDMaaPGetEvents(aaiTopic);
+ if (!CollectionUtils.isEmpty(dmaapResponse)) {
+ for (int i = 0; i < dmaapResponse.size(); i++) {
+ String aaiEventString = dmaapResponse.get(i);
+ if (logger.isDebugEnabled()) {
+ logger.debug("aai event returned was {}", aaiEventString);
+ }
+ try {
+ JsonNode jsonNode = mapper.readValue(aaiEventString, JsonNode.class);
+ JsonNode eventHeader = jsonNode.get("event-header");
+ String aaiEventEntityType = eventHeader.get("entity-type").asText();
+ String action = eventHeader.get("action").asText();
+ if (logger.isDebugEnabled()) {
+ logger.debug("aaiEventEntityType is {} and action is {}", aaiEventEntityType, action);
+ }
+ if (aaiEventEntityType.equals("service-instance")) {
+ {
+ // parse the AAI-EVENT service-instance tree
+ ServiceInstanceEvent serviceInstanceEvent = new ServiceInstanceEvent();
+ RelatedParty relatedParty = new RelatedParty();
+ JsonNode entity = jsonNode.get("entity");
+ relatedParty.setId(entity.get("global-customer-id").asText());
+ relatedParty.setName(entity.get("subscriber-name").asText());
+ serviceInstanceEvent.setRelatedParty(relatedParty);
+ JsonNode childServiceSubscription = entity.get("service-subscriptions");
+ JsonNode serviceSubscriptions = childServiceSubscription.get("service-subscription");
+ JsonNode serviceSubscription = serviceSubscriptions.get(0);
+ String serviceSubscriptionPrint = serviceSubscription.toString();
+ JsonNode childserviceInstances = serviceSubscription.get("service-instances");
+ JsonNode serviceInstances = childserviceInstances.get("service-instance");
+ JsonNode serviceInstance = serviceInstances.get(0);
+ serviceInstanceEvent.setId(serviceInstance.get("service-instance-id").asText());
+ serviceInstanceEvent
+ .setHref("service/" + serviceInstance.get("service-instance-id").asText());
+ serviceInstanceEvent.setState(serviceInstance.get("orchestration-status").asText());
+ if (action.equals("CREATE")) {
+ if (logger.isDebugEnabled()) {
+ logger.debug("sending service inventory event to listeners");
+ }
+ processEvent(
+ EventFactory.getEvent(EventType.SERVICE_CREATION, serviceInstanceEvent));
+ } else if (action.equals("DELETE")) {
+ processEvent(EventFactory.getEvent(EventType.SERVICE_REMOVE, serviceInstanceEvent));
+ } else if (action.equals("UPDATE")) {
+ processEvent(EventFactory.getEvent(EventType.SERVICE_ATTRIBUTE_VALUE_CHANGE,
+ serviceInstanceEvent));
+ }
+
+
+ }
+
+ }
+
+ } catch (JsonParseException e) {
+ logger.error(" unable to Parse AAI Event JSON String {}, exception is", aaiEventString,
+ e.getMessage());
+ } catch (JsonMappingException e) {
+ logger.error(" unable to Map AAI Event JSON String {} to Java Pojo, exception is",
+ aaiEventString, e.getMessage());
+ } catch (IOException e) {
+ logger.error("IO Error when parsing AAI Event JSON String {} ", aaiEventString,
+ e.getMessage());
+ }
+ }
+ }
+ }
+
+ public void checkForDMaaPSDCEvents() {
+ List<String> dmaapResponse = callDMaaPGetEvents(sdcTopic);
+ if (!CollectionUtils.isEmpty(dmaapResponse)) {
+ for (int i = 0; i < dmaapResponse.size(); i++) {
+ String sdcEventString = dmaapResponse.get(i);
+ if (logger.isDebugEnabled()) {
+ logger.debug("sdc event returned was {}", sdcEventString);
+ }
+ processEvent(EventFactory.getEvent(EventType.SDC_DISTRIBUTION, sdcEventString));
+ }
+ }
+ }
+
+
+ public List<String> callDMaaPGetEvents(String topic) {
+
+ URI callURI = buildRequest(topic);
+ ResponseEntity<Object> response = callDMaaP(callURI);
+ if (response != null) {
+ return (List<String>) response.getBody();
+
+ } else {
+ return null;
+ }
+ }
+
+ public ResponseEntity<Object> callCheckConnectivity() {
+ URI callURI = buildRequest(null);
+
+ ResponseEntity<Object> response = restTemplate.exchange(callURI, HttpMethod.GET, buildRequestHeader(),
+ Object.class);
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("response body : {} ", response.getBody().toString());
+ logger.debug("response status : {}", response.getStatusCodeValue());
+ }
+ return response;
+
+ }
+
+
+ private URI buildRequest(String topic) {
+ if (StringUtils.isEmpty(topic)) {
+ topic = aaiTopic;
+ }
+ String dmaapGetEventsUrlFormated = dmaapGetEventsUrl.replace("$topic", topic);
+ dmaapGetEventsUrlFormated = dmaapGetEventsUrlFormated.replace("$consumergroup", consumerGroup);
+ dmaapGetEventsUrlFormated = dmaapGetEventsUrlFormated.replace("$consumerid", consumerId);
+ dmaapGetEventsUrlFormated = dmaapGetEventsUrlFormated.replace("$timeout", timeout);
+ if (logger.isDebugEnabled()) {
+ logger.debug("Calling DMaaP Url : " + dmaapGetEventsUrlFormated);
+ }
+ UriComponentsBuilder callURI = UriComponentsBuilder.fromHttpUrl(dmaapGetEventsUrlFormated);
+ return callURI.build().encode().toUri();
+ }
+
+ private ResponseEntity<Object> callDMaaP(URI callURI) {
+ try {
+ ResponseEntity<Object> response =
+ restTemplate.exchange(callURI, HttpMethod.GET, buildRequestHeader(), Object.class);
+ if (logger.isDebugEnabled()) {
+ logger.debug("response body : {} ", response.getBody().toString());
+ logger.debug("response status : {}", response.getStatusCodeValue());
+ }
+ return response;
+ } catch (Exception e) {
+ String message = MessageFormat
+ .format("Exception while calling dmaap : {0}", callURI);
+ logger.error(message);
+ return null;
+ }
+
+ }
+
+
+ private HttpEntity<String> buildRequestHeader() {
+ HttpHeaders httpHeaders = new HttpHeaders();
+ httpHeaders.add("Accept", "application/json");
+ httpHeaders.add("Content-Type", "application/json");
+ return new HttpEntity<>("parameters", httpHeaders);
+ }
+
+ /**
+ * Retrieve subscribers that match an event and fire notification asynchronously
+ */
+ private void processEvent(Event event) {
+ subscriberRepository.findSubscribersUsingEvent(event).forEach(sub -> notifier.run(sub, event));
+ }
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/hub/service/dmaap/DMaaPEventsScheduler.java b/src/main/java/org/onap/nbi/apis/hub/service/dmaap/DMaaPEventsScheduler.java
new file mode 100644
index 0000000..cdd1825
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/hub/service/dmaap/DMaaPEventsScheduler.java
@@ -0,0 +1,38 @@
+/**
+ * Copyright (c) 2019 Huawei
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+
+package org.onap.nbi.apis.hub.service.dmaap;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Profile;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+@Profile("default")
+@Service
+@EnableScheduling
+public class DMaaPEventsScheduler {
+
+ @Autowired
+ CheckDMaaPEventsManager checkDMaaPEventsManager;
+
+ @Scheduled(fixedDelayString = "${dmaapCheck.schedule}",
+ initialDelayString = "${dmaapCheck.initial}")
+ private void processDMaaPEvents() {
+ checkDMaaPEventsManager.checkForDMaaPAAIEvents();
+ checkDMaaPEventsManager.checkForDMaaPSDCEvents();
+
+ }
+}
+
diff --git a/src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationDBManager.java b/src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationDBManager.java
new file mode 100644
index 0000000..466611d
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationDBManager.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2019 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.
+ */
+package org.onap.nbi.apis.servicecatalog;
+
+import org.onap.nbi.apis.servicecatalog.model.ServiceSpecification;
+import org.onap.nbi.apis.servicecatalog.model.SpecificationInputSchema;
+import org.onap.nbi.apis.servicecatalog.repositories.ServiceSpecificationRepository;
+import org.onap.nbi.apis.servicecatalog.repositories.SpecificationInputSchemaRepository;
+import org.onap.nbi.exceptions.TechnicalException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Optional;
+
+@Service
+public class ServiceSpecificationDBManager {
+
+ @Autowired
+ ServiceSpecificationRepository serviceSpecificationRepository;
+
+ @Autowired
+ SpecificationInputSchemaRepository specificationInputSchemaRepository;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ServiceSpecificationService.class);
+
+ public void saveCatalogResponse(LinkedHashMap serviceCatalogResponse) {
+
+ ServiceSpecification serviceSpecification = new ServiceSpecification();
+ serviceSpecification.setId((String) serviceCatalogResponse.get("id"));
+ serviceSpecification.setCatalogResponse(serviceCatalogResponse);
+ serviceSpecificationRepository.save(serviceSpecification);
+
+ }
+
+ public boolean checkServiceSpecExistence(String serviceSpecId) {
+
+ return serviceSpecificationRepository.existsById(serviceSpecId);
+ }
+
+ public Map getServiceSpecification(String serviceSpecId) {
+
+ Optional<ServiceSpecification> optionalServiceSpecification = serviceSpecificationRepository.findById(serviceSpecId);
+ if(!optionalServiceSpecification.isPresent()) {
+ throw new TechnicalException("Unable get service specification");
+ }else {
+ return optionalServiceSpecification.get().getCatalogResponse();
+ }
+ }
+
+ public boolean checkInputSchemaExistence(String serviceSpecId) {
+ return specificationInputSchemaRepository.existsById(serviceSpecId);
+ }
+
+ public String getInputSchema(String serviceSpecId) {
+ Optional<SpecificationInputSchema> optionalSpecificationInputSchema = specificationInputSchemaRepository.findById(serviceSpecId);
+ if(!optionalSpecificationInputSchema.isPresent()) {
+ throw new TechnicalException("Unable get specification input schema");
+ }else {
+ return optionalSpecificationInputSchema.get().getSpecificationSchemaJson();
+ }
+ }
+
+ public void saveSpecificationInputSchema(String svcCharacteristicsJson, Map serviceCatalogResponse) {
+ SpecificationInputSchema specificationInputSchema = new SpecificationInputSchema();
+ specificationInputSchema.setId((String) serviceCatalogResponse.get("id"));
+ specificationInputSchema.setSpecificationSchemaJson(svcCharacteristicsJson);
+ specificationInputSchemaRepository.save(specificationInputSchema);
+
+ }
+}
diff --git a/src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationResource.java b/src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationResource.java
index e8ef9e3..6484672 100644
--- a/src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationResource.java
+++ b/src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationResource.java
@@ -40,7 +40,7 @@ public class ServiceSpecificationResource extends ResourceManagement {
@GetMapping(value = "/{serviceSpecId}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Object> getServiceSpecification(@PathVariable String serviceSpecId,
- @RequestParam MultiValueMap<String, String> params) {
+ @RequestParam MultiValueMap<String, String> params) {
Map response = serviceSpecificationService.get(serviceSpecId);
JsonRepresentation filter = new JsonRepresentation(params);
if (response.get("serviceSpecCharacteristic") != null) {
@@ -58,4 +58,12 @@ public class ServiceSpecificationResource extends ResourceManagement {
return this.findResponse(response, filter, null);
}
+ @GetMapping(value = "/{serviceSpecId}/specificationInputSchema", produces = MediaType.APPLICATION_JSON_VALUE)
+ public ResponseEntity<Object> findSpecificationInputSchema(@PathVariable String serviceSpecId,
+ @RequestParam MultiValueMap<String,String> params) {
+ String response = serviceSpecificationService.getInputSchema(serviceSpecId);
+ JsonRepresentation filter = new JsonRepresentation(params);
+ return this.getResponse(response, filter);
+ }
+
}
diff --git a/src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationService.java b/src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationService.java
index 5e3e4cf..8f0829b 100644
--- a/src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationService.java
+++ b/src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationService.java
@@ -50,33 +50,39 @@ public class ServiceSpecificationService {
@Autowired
private ServiceCatalogUrl serviceCatalogUrl;
+ @Autowired
+ ServiceSpecificationDBManager serviceSpecificationDBManager;
private static final Logger LOGGER = LoggerFactory.getLogger(ServiceSpecificationService.class);
-
public Map get(String serviceSpecId) {
- Map sdcResponse = sdcClient.callGet(serviceSpecId);
- LinkedHashMap serviceCatalogResponse =
- (LinkedHashMap) getServiceSpecJsonTransformer.transform(sdcResponse);
- String toscaModelUrl = (String) sdcResponse.get("toscaModelURL");
- String serviceId = (String) sdcResponse.get("id");
- File toscaFile = sdcClient.callGetWithAttachment(toscaModelUrl);
- Path pathToToscaCsar = toscaFile.toPath().toAbsolutePath();
- try {
- toscaInfosProcessor.buildResponseWithSdcToscaParser(pathToToscaCsar, serviceCatalogResponse);
- } catch (SdcToscaParserException e) {
- LOGGER.debug("unable to build response from tosca csar using sdc-parser, partial response : "
- + pathToToscaCsar.toString() + " " + e.getMessage());
- }
- try {
- if (toscaFile != null) {
- LOGGER.debug("deleting tosca archive : " + toscaFile.getName());
- FileUtils.forceDelete(toscaFile);
+ if(serviceSpecificationDBManager.checkServiceSpecExistence(serviceSpecId)) {
+ return serviceSpecificationDBManager.getServiceSpecification(serviceSpecId);
+ }else {
+ Map sdcResponse = sdcClient.callGet(serviceSpecId);
+ LinkedHashMap serviceCatalogResponse =
+ (LinkedHashMap) getServiceSpecJsonTransformer.transform(sdcResponse);
+ String toscaModelUrl = (String) sdcResponse.get("toscaModelURL");
+ String serviceId = (String) sdcResponse.get("id");
+ File toscaFile = sdcClient.callGetWithAttachment(toscaModelUrl);
+ Path pathToToscaCsar = toscaFile.toPath().toAbsolutePath();
+ try {
+ toscaInfosProcessor.buildAndSaveResponseWithSdcToscaParser(pathToToscaCsar, serviceCatalogResponse);
+ serviceSpecificationDBManager.saveCatalogResponse(serviceCatalogResponse);
+ } catch (SdcToscaParserException e) {
+ LOGGER.debug("unable to build response from tosca csar using sdc-parser, partial response : "
+ + pathToToscaCsar.toString() + " " + e.getMessage());
+ }
+ try {
+ if (toscaFile != null) {
+ LOGGER.debug("deleting tosca archive : " + toscaFile.getName());
+ FileUtils.forceDelete(toscaFile);
+ }
+ } catch (IOException e) {
+ LOGGER.error("unable to delete temp directory tosca file for id : " + serviceId, e);
}
- } catch (IOException e) {
- LOGGER.error("unable to delete temp directory tosca file for id : " + serviceId, e);
+ return serviceCatalogResponse;
}
- return serviceCatalogResponse;
}
public List<LinkedHashMap> find(MultiValueMap<String, String> parametersMap) {
@@ -87,4 +93,11 @@ public class ServiceSpecificationService {
}
return serviceCatalogResponse;
}
+ public String getInputSchema(String serviceSpecId) {
+ if(serviceSpecificationDBManager.checkInputSchemaExistence(serviceSpecId)) {
+ return serviceSpecificationDBManager.getInputSchema(serviceSpecId);
+ } else {
+ return null;
+ }
+ }
}
diff --git a/src/main/java/org/onap/nbi/apis/servicecatalog/ToscaInfosProcessor.java b/src/main/java/org/onap/nbi/apis/servicecatalog/ToscaInfosProcessor.java
index fff4444..fc0494f 100644
--- a/src/main/java/org/onap/nbi/apis/servicecatalog/ToscaInfosProcessor.java
+++ b/src/main/java/org/onap/nbi/apis/servicecatalog/ToscaInfosProcessor.java
@@ -14,10 +14,9 @@
package org.onap.nbi.apis.servicecatalog;
import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+
+import io.swagger.util.Json;
import org.onap.sdc.tosca.parser.api.ISdcCsarHelper;
import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException;
import org.onap.sdc.tosca.parser.impl.SdcToscaParserFactory;
@@ -29,6 +28,10 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+import io.swagger.models.Model;
+import io.swagger.models.ModelImpl;
+import io.swagger.models.properties.Property;
+import io.swagger.models.properties.PropertyBuilder;
@Service
public class ToscaInfosProcessor {
@@ -36,14 +39,15 @@ public class ToscaInfosProcessor {
@Autowired
SdcClient sdcClient;
+ @Autowired
+ private ServiceSpecificationDBManager serviceSpecificationDBManager;
+
final ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); // jackson databind
private static final Logger LOGGER = LoggerFactory.getLogger(ToscaInfosProcessor.class);
-
-
public void buildResponseWithSdcToscaParser(Path path, Map serviceCatalogResponse)
- throws SdcToscaParserException {
+ throws SdcToscaParserException {
SdcToscaParserFactory factory = SdcToscaParserFactory.getInstance();
ISdcCsarHelper sdcCsarHelper = factory.getSdcCsarHelper(path.toFile().getAbsolutePath(), false);
@@ -62,7 +66,7 @@ public class ToscaInfosProcessor {
// If this Input has a default value, then put it in serviceSpecCharacteristicValue
if (input.getDefault() != null) {
List<LinkedHashMap> serviceSpecCharacteristicValues =
- buildServiceSpecCharacteristicsValuesFromSdc(input);
+ buildServiceSpecCharacteristicsValuesFromSdc(input);
mapParameter.put("serviceSpecCharacteristicValue", serviceSpecCharacteristicValues);
}
serviceSpecCharacteristic.add(mapParameter);
@@ -72,7 +76,7 @@ public class ToscaInfosProcessor {
List<NodeTemplate> nodeTemplates = sdcCsarHelper.getServiceNodeTemplates();
List<LinkedHashMap> resourceSpecifications =
- (List<LinkedHashMap>) serviceCatalogResponse.get("resourceSpecification");
+ (List<LinkedHashMap>) serviceCatalogResponse.get("resourceSpecification");
for (LinkedHashMap resourceSpecification : resourceSpecifications) {
if (resourceSpecification.get("id") != null) {
String id = (String) resourceSpecification.get("id");
@@ -87,12 +91,11 @@ public class ToscaInfosProcessor {
if (nodeTemplate == null)
continue;
resourceSpecification.put("modelCustomizationId",
- sdcCsarHelper.getNodeTemplateCustomizationUuid(nodeTemplate));
+ sdcCsarHelper.getNodeTemplateCustomizationUuid(nodeTemplate));
}
}
}
-
private List<LinkedHashMap> buildServiceSpecCharacteristicsValuesFromSdc(Input input) {
List<LinkedHashMap> serviceSpecCharacteristicValues = new ArrayList<>();
@@ -106,4 +109,67 @@ public class ToscaInfosProcessor {
return serviceSpecCharacteristicValues;
}
+ public void buildAndSaveResponseWithSdcToscaParser(Path path, Map serviceCatalogResponse) throws SdcToscaParserException {
+
+ SdcToscaParserFactory factory = SdcToscaParserFactory.getInstance();
+ ISdcCsarHelper sdcCsarHelper = factory.getSdcCsarHelper(path.toFile().getAbsolutePath(), false);
+ List<Input> inputs = sdcCsarHelper.getServiceInputs();
+
+ Map<String, Model> definitions = new HashMap<String,Model>();
+ Model model = new ModelImpl();
+
+ if (inputs != null && inputs.size() > 0) {
+ for (Input input : inputs) {
+ Property property = PropertyBuilder.build(input.getType(), null, null);
+ property.setDescription(input.getDescription());
+ property.setRequired(input.isRequired());
+
+ if (input.getDefault() != null) {
+ property.setDefault(input.getDefault().toString());
+ }
+ ((ModelImpl) model).addProperty(input.getName(), property);
+ }
+ definitions.put("ServiceCharacteristics", model);
+
+ }
+
+ String svcCharacteristicsJson = Json.pretty(definitions);
+ serviceSpecificationDBManager.saveSpecificationInputSchema(svcCharacteristicsJson,serviceCatalogResponse);
+
+ LinkedHashMap inputSchemaRef = new LinkedHashMap();
+ inputSchemaRef.put("valueType","Object");
+ inputSchemaRef.put("@schemaLocation","/serviceSpecification/"+serviceCatalogResponse.get("id")+"/specificationInputSchema");
+ inputSchemaRef.put("@type",serviceCatalogResponse.get("name") + "_ServiceCharacteristic");
+
+ LinkedHashMap serviceSpecCharacteristic = new LinkedHashMap();
+ serviceSpecCharacteristic.put("name",serviceCatalogResponse.get("name") + "_ServiceCharacteristics");
+ serviceSpecCharacteristic.put("description","This object describes all the inputs needed from the client to interact with the " + serviceCatalogResponse.get("name") + " Service Topology");
+ serviceSpecCharacteristic.put("valueType", "Object");
+ serviceSpecCharacteristic.put("@type","ONAPServiceCharacteristic");
+ serviceSpecCharacteristic.put("@schemaLocation", "null");
+ serviceSpecCharacteristic.put("serviceSpecCharacteristicValue",inputSchemaRef);
+
+ serviceCatalogResponse.put("serviceSpecCharacteristic",serviceSpecCharacteristic);
+
+ List<NodeTemplate> nodeTemplates = sdcCsarHelper.getServiceNodeTemplates();
+ List<LinkedHashMap> resourceSpecifications =
+ (List<LinkedHashMap>) serviceCatalogResponse.get("resourceSpecification");
+ for (LinkedHashMap resourceSpecification : resourceSpecifications) {
+ if (resourceSpecification.get("id") != null) {
+ String id = (String) resourceSpecification.get("id");
+ LOGGER.debug("get tosca infos for service id: {}", id);
+ NodeTemplate nodeTemplate = null;
+ for (NodeTemplate node : nodeTemplates) {
+ if (node.getMetaData().getValue("UUID").equals(id)) {
+ nodeTemplate = node;
+ break;
+ }
+ }
+ if (nodeTemplate == null)
+ continue;
+ resourceSpecification.put("modelCustomizationId", sdcCsarHelper.getNodeTemplateCustomizationUuid(nodeTemplate));
+ }
+ }
+ }
+
}
diff --git a/src/main/java/org/onap/nbi/apis/servicecatalog/model/ServiceSpecification.java b/src/main/java/org/onap/nbi/apis/servicecatalog/model/ServiceSpecification.java
new file mode 100644
index 0000000..c88cc65
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/servicecatalog/model/ServiceSpecification.java
@@ -0,0 +1,56 @@
+/**
+ * Copyright (c) 2019 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.
+ */
+package org.onap.nbi.apis.servicecatalog.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.onap.nbi.commons.Resource;
+import org.springframework.data.annotation.Id;
+
+import java.util.Map;
+
+@ApiModel
+public class ServiceSpecification implements Resource {
+
+ @Id
+ @JsonProperty("id")
+ private String id = null;
+
+ @JsonProperty("catalogResponse")
+ private Map catalogResponse = null;
+
+ @Override
+ @JsonProperty("id")
+ @ApiModelProperty(required = true, value = "uuid for the service specification")
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ @JsonProperty("catalogResponse")
+ @ApiModelProperty(required = true, value = "catalogResponse for the corresponding service uuid")
+ public Map getCatalogResponse() {
+ return catalogResponse;
+ }
+
+ public void setCatalogResponse(Map catalogResponse) {
+ this.catalogResponse = catalogResponse;
+ }
+}
diff --git a/src/main/java/org/onap/nbi/apis/servicecatalog/model/SpecificationInputSchema.java b/src/main/java/org/onap/nbi/apis/servicecatalog/model/SpecificationInputSchema.java
new file mode 100644
index 0000000..e4e85d7
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/servicecatalog/model/SpecificationInputSchema.java
@@ -0,0 +1,54 @@
+/**
+ * Copyright (c) 2019 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.
+ */
+package org.onap.nbi.apis.servicecatalog.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.onap.nbi.commons.Resource;
+import org.springframework.data.annotation.Id;
+
+@ApiModel
+ public class SpecificationInputSchema implements Resource {
+
+
+ @Id
+ @JsonProperty("id")
+ private String id = null;
+
+ @JsonProperty("schema")
+ private String specificationSchemaJson = null;
+
+ @Override
+ @JsonProperty("id")
+ @ApiModelProperty(required = true, value = "uuid for the specification input schema")
+ public String getId() {
+ return id;
+ }
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ @JsonProperty("schema")
+ @ApiModelProperty(required = true, value = "Input schema for the service")
+ public String getSpecificationSchemaJson() {
+ return specificationSchemaJson;
+ }
+
+ public void setSpecificationSchemaJson(String specificationSchemaJson) {
+ this.specificationSchemaJson = specificationSchemaJson;
+ }
+}
diff --git a/src/main/java/org/onap/nbi/apis/servicecatalog/repositories/ServiceSpecificationRepository.java b/src/main/java/org/onap/nbi/apis/servicecatalog/repositories/ServiceSpecificationRepository.java
new file mode 100644
index 0000000..f46e008
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/servicecatalog/repositories/ServiceSpecificationRepository.java
@@ -0,0 +1,22 @@
+/**
+ * Copyright (c) 2019 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.
+ */
+package org.onap.nbi.apis.servicecatalog.repositories;
+
+import org.onap.nbi.apis.servicecatalog.model.ServiceSpecification;
+import org.springframework.data.mongodb.repository.MongoRepository;
+
+public interface ServiceSpecificationRepository extends MongoRepository<ServiceSpecification, String> {
+}
diff --git a/src/main/java/org/onap/nbi/apis/servicecatalog/repositories/SpecificationInputSchemaRepository.java b/src/main/java/org/onap/nbi/apis/servicecatalog/repositories/SpecificationInputSchemaRepository.java
new file mode 100644
index 0000000..56adbd3
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/servicecatalog/repositories/SpecificationInputSchemaRepository.java
@@ -0,0 +1,24 @@
+/**
+ * Copyright (c) 2019 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.
+ */
+package org.onap.nbi.apis.servicecatalog.repositories;
+
+import org.onap.nbi.apis.servicecatalog.model.SpecificationInputSchema;
+import org.springframework.data.mongodb.repository.MongoRepository;
+
+public interface SpecificationInputSchemaRepository extends MongoRepository<SpecificationInputSchema, String> {
+
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/status/OnapClient.java b/src/main/java/org/onap/nbi/apis/status/OnapClient.java
index d9bedc0..c3eb746 100644
--- a/src/main/java/org/onap/nbi/apis/status/OnapClient.java
+++ b/src/main/java/org/onap/nbi/apis/status/OnapClient.java
@@ -13,7 +13,7 @@
package org.onap.nbi.apis.status;
import java.text.MessageFormat;
-import org.onap.nbi.apis.hub.service.CheckDMaaPEventsManager;
+import org.onap.nbi.apis.hub.service.dmaap.CheckDMaaPEventsManager;
import org.onap.nbi.apis.servicecatalog.SdcClient;
import org.onap.nbi.apis.serviceinventory.AaiClient;
import org.onap.nbi.apis.serviceorder.SoClient;
@@ -59,7 +59,7 @@ public class OnapClient {
soClient.callCheckConnectivity();
break;
case DMAAP:
- checkDMaaPEventsManager.callDMaaPGetEvents();
+ checkDMaaPEventsManager.callCheckConnectivity();
break;
}
} catch (BackendFunctionalException e) {
diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties
index 028040d..ed34f0a 100644
--- a/src/main/resources/application-test.properties
+++ b/src/main/resources/application-test.properties
@@ -64,7 +64,8 @@ so.project.name = Project-generic
# DMAAP
dmaap.host = http://127.0.0.1:8091
-dmaap.topic = AAI-EVENT
+dmaap.aai.topic = AAI-EVENT
+dmaap.sdc.topic = SDC-DISTR-NOTIF-TOPIC-AUTO
dmaap.consumergroup = NBICG1
dmaap.consumerid = NBIC1
dmaap.timeout = 2000
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 741682e..fe7dde0 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -72,7 +72,8 @@ so.project.name = Project-generic
# DMAAP
dmaap.host = http://10.0.6.1:3904
-dmaap.topic = AAI-EVENT
+dmaap.aai.topic = AAI-EVENT
+dmaap.sdc.topic = SDC-DISTR-NOTIF-TOPIC-AUTO
dmaap.consumergroup = NBICG1
dmaap.consumerid = NBIC1
dmaap.timeout = 2000
diff --git a/src/test/java/org/onap/nbi/apis/servicecatalog/ToscaInfosProcessorTest.java b/src/test/java/org/onap/nbi/apis/servicecatalog/ToscaInfosProcessorTest.java
index 8849607..68a955f 100644
--- a/src/test/java/org/onap/nbi/apis/servicecatalog/ToscaInfosProcessorTest.java
+++ b/src/test/java/org/onap/nbi/apis/servicecatalog/ToscaInfosProcessorTest.java
@@ -20,26 +20,35 @@ import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import org.junit.Test;
+import org.junit.runner.RunWith;
import org.onap.nbi.exceptions.TechnicalException;
import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.junit4.SpringRunner;
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
+@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
+@ActiveProfiles("test")
public class ToscaInfosProcessorTest {
+ @Autowired
+ ToscaInfosProcessor toscaInfosProcessor;
final ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); // jackson databind
- ToscaInfosProcessor toscaInfosProcessor = new ToscaInfosProcessor();
-
-
@Test
public void buildResponseWithSdcToscaParser() {
ClassLoader classLoader = getClass().getClassLoader();
Path path = new File(
- classLoader.getResource("toscafile/service-Sdwanvpninfraservice-csar.csar").getFile())
+ classLoader.getResource("toscafile/service-Sdwanvpninfraservice-csar.csar").getFile())
.toPath().toAbsolutePath();
List<LinkedHashMap> resources = new ArrayList<>();
LinkedHashMap resource1 = new LinkedHashMap();
@@ -55,22 +64,22 @@ public class ToscaInfosProcessorTest {
toscaInfosProcessor.buildResponseWithSdcToscaParser(path, response);
} catch (SdcToscaParserException e) {
throw new TechnicalException("unable to build response from tosca csar using sdc-parser : "
- + path.toString() + " " + e.getMessage());
+ + path.toString() + " " + e.getMessage());
}
resources = (List<LinkedHashMap>) response.get("resourceSpecification");
List<LinkedHashMap> serviceSpecCharacteristic = new ArrayList<>();
serviceSpecCharacteristic = (List<LinkedHashMap>) response.get("serviceSpecCharacteristic");
assertThat(serviceSpecCharacteristic.get(0).get("name"))
- .isEqualTo("sdwanconnectivity0_topology");
+ .isEqualTo("sdwanconnectivity0_topology");
assertThat(serviceSpecCharacteristic.get(1).get("valueType")).isEqualTo("string");
assertThat(serviceSpecCharacteristic.get(0).get("required")).isEqualTo(true);
assertThat(serviceSpecCharacteristic.get(1).get("name")).isEqualTo("sdwanconnectivity0_name");
assertThat(serviceSpecCharacteristic.get(1).get("valueType")).isEqualTo("string");
assertThat(serviceSpecCharacteristic.get(1).get("required")).isEqualTo(true);
assertThat(resources.get(0).get("modelCustomizationId"))
- .isEqualTo("94ec574b-2306-4cbd-8214-09662b040f73");
+ .isEqualTo("94ec574b-2306-4cbd-8214-09662b040f73");
assertThat(resources.get(1).get("modelCustomizationId"))
- .isEqualTo("a7baba5d-6ac3-42b5-b47d-070841303ab1");
+ .isEqualTo("a7baba5d-6ac3-42b5-b47d-070841303ab1");
}
@@ -79,7 +88,7 @@ public class ToscaInfosProcessorTest {
ClassLoader classLoader = getClass().getClassLoader();
Path path = new File(
- classLoader.getResource("toscafile/service-Sotnvpninfraservice-csar.csar").getFile())
+ classLoader.getResource("toscafile/service-Sotnvpninfraservice-csar.csar").getFile())
.toPath().toAbsolutePath();
List<LinkedHashMap> resources = new ArrayList<>();
LinkedHashMap resource1 = new LinkedHashMap();
@@ -95,15 +104,15 @@ public class ToscaInfosProcessorTest {
toscaInfosProcessor.buildResponseWithSdcToscaParser(path, response);
} catch (SdcToscaParserException e) {
throw new TechnicalException("unable to build response from tosca csar using sdc-parser : "
- + path.toString() + " " + e.getMessage());
+ + path.toString() + " " + e.getMessage());
}
resources = (List<LinkedHashMap>) response.get("resourceSpecification");
List<LinkedHashMap> serviceSpecCharacteristic = new ArrayList<>();
serviceSpecCharacteristic = (List<LinkedHashMap>) response.get("serviceSpecCharacteristic");
assertThat(resources.get(0).get("modelCustomizationId"))
- .isEqualTo("b44071c8-04fd-4d6b-b6af-772cbfaa1129");
+ .isEqualTo("b44071c8-04fd-4d6b-b6af-772cbfaa1129");
assertThat(resources.get(1).get("modelCustomizationId"))
- .isEqualTo("c3612284-6c67-4d8c-8b41-b699cc90e76d");
+ .isEqualTo("c3612284-6c67-4d8c-8b41-b699cc90e76d");
assertThat(serviceSpecCharacteristic.get(12).get("serviceSpecCharacteristicValue")).isNull();
assertThat(serviceSpecCharacteristic.get(13).get("serviceSpecCharacteristicValue")).isNotNull();
}
@@ -113,7 +122,7 @@ public class ToscaInfosProcessorTest {
ClassLoader classLoader = getClass().getClassLoader();
Path path = new File(
- classLoader.getResource("toscafile/service-Sdwanvpninfraservice-csar.csar").getFile())
+ classLoader.getResource("toscafile/service-Sdwanvpninfraservice-csar.csar").getFile())
.toPath().toAbsolutePath();
List<LinkedHashMap> resources = new ArrayList<>();
LinkedHashMap resource1 = new LinkedHashMap();
@@ -129,13 +138,13 @@ public class ToscaInfosProcessorTest {
toscaInfosProcessor.buildResponseWithSdcToscaParser(path, response);
} catch (SdcToscaParserException e) {
throw new TechnicalException("unable to build response from tosca csar using sdc-parser : "
- + path.toString() + " " + e.getMessage());
+ + path.toString() + " " + e.getMessage());
}
resources = (List<LinkedHashMap>) response.get("resourceSpecification");
List<LinkedHashMap> serviceSpecCharacteristic = new ArrayList<>();
serviceSpecCharacteristic = (List<LinkedHashMap>) response.get("serviceSpecCharacteristic");
assertThat(serviceSpecCharacteristic.get(0).get("name"))
- .isEqualTo("sdwanconnectivity0_topology");
+ .isEqualTo("sdwanconnectivity0_topology");
assertThat(serviceSpecCharacteristic.get(1).get("valueType")).isEqualTo("string");
assertThat(serviceSpecCharacteristic.get(0).get("required")).isEqualTo(true);
assertThat(serviceSpecCharacteristic.get(1).get("name")).isEqualTo("sdwanconnectivity0_name");
@@ -146,4 +155,46 @@ public class ToscaInfosProcessorTest {
assertThat(resources.get(1).get("modelCustomizationId")).isNull();
}
+
+ @Test
+ public void testBuildAndSaveResponseWithSdcToscaParser() {
+
+ ClassLoader classLoader = getClass().getClassLoader();
+ Path path = new File(classLoader.getResource("toscafile/service-Sotnvpninfraservice-csar.csar").getFile()).toPath().toAbsolutePath();
+
+ LinkedHashMap response = new LinkedHashMap();
+ response.put("version", "1.0");
+ response.put("name", "Service_vMME");
+ response.put("description", "some service characteristics schema");
+ response.put("id", "7f5e5139-768d-4410-a871-c41430785214");
+
+ List<LinkedHashMap> resources = new ArrayList<>();
+ LinkedHashMap resource1 = new LinkedHashMap();
+ resource1.put("id", "7baa7742-3a13-4288-8330-868015adc340");
+ resources.add(resource1);
+ LinkedHashMap resource2 = new LinkedHashMap();
+ resource2.put("id", "81b9430b-8abe-45d6-8bf9-f41a8f5c735f");
+ resources.add(resource2);
+
+ response.put("resourceSpecification", resources);
+
+ LinkedHashMap serviceSpecCharacteristicValue = new LinkedHashMap();
+ serviceSpecCharacteristicValue.put("valueType","Object");
+ serviceSpecCharacteristicValue.put("@schemaLocation","/serviceSpecification/7f5e5139-768d-4410-a871-c41430785214/specificationInputSchema");
+ serviceSpecCharacteristicValue.put("@type","Service_vMME_ServiceCharacteristic");
+
+ LinkedHashMap serviceSpecCharacteristic = new LinkedHashMap();
+ serviceSpecCharacteristic.put("name","Service_vMME_ServiceCharacteristics");
+ serviceSpecCharacteristic.put("description", "This object describes all the inputs needed from the client to interact with the Service_vMME Service Topology");
+ serviceSpecCharacteristic.put("valueType","Object");
+ serviceSpecCharacteristic.put("@type","ONAPServiceCharacteristic");
+ serviceSpecCharacteristic.put("@schemaLocation","null");
+ serviceSpecCharacteristic.put("serviceSpecCharacteristicValue",serviceSpecCharacteristicValue);
+ try {
+ toscaInfosProcessor.buildAndSaveResponseWithSdcToscaParser(path, response);
+ } catch (SdcToscaParserException ex) {
+ throw new TechnicalException("unable to build response " + ex.getMessage());
+ }
+ assertThat(response.get("serviceSpecCharacteristic")).isEqualTo(serviceSpecCharacteristic);
+ }
}
diff --git a/src/test/resources/karatetest/features/00--ServiceCatalog.feature b/src/test/resources/karatetest/features/00--ServiceCatalog.feature
index 2a40526..27807ac 100644
--- a/src/test/resources/karatetest/features/00--ServiceCatalog.feature
+++ b/src/test/resources/karatetest/features/00--ServiceCatalog.feature
@@ -23,7 +23,22 @@ Given path 'serviceSpecification','462f84e5-f0e5-44c5-ab95-38fb4bf77064'
When method get
Then status 200
And match $ contains { id : '462f84e5-f0e5-44c5-ab95-38fb4bf77064' , name : 'vFW' , invariantUUID : 'b58a118e-eeb9-4f6e-bdca-e292f84d17df' , toscaModelURL : '/sdc/v1/catalog/services/462f84e5-f0e5-44c5-ab95-38fb4bf77064/toscaModel' , distributionStatus : 'DISTRIBUTED' , version : '2.0' , lifecycleStatus : 'CERTIFIED' , @type : 'ONAPservice' , attachment : '#array' , relatedParty : '#notnull' , resourceSpecification : '#array' }
-And match $.serviceSpecCharacteristic[0] contains { name : 'sdwanconnectivity0_topology', description : 'full mesh, hub-spoke', valueType : 'string', required : '#boolean', serviceSpecCharacteristicValue : '#null' }
+And match $.serviceSpecCharacteristic contains
+"""
+{
+ name : 'vFW_ServiceCharacteristics',
+ description : 'This object describes all the inputs needed from the client to interact with the vFW Service Topology',
+ valueType : 'Object',
+ @type : 'ONAPServiceCharacteristic',
+ @schemaLocation : 'null',
+ serviceSpecCharacteristicValue :
+ {
+ valueType : 'Object',
+ @schemaLocation : '/serviceSpecification/462f84e5-f0e5-44c5-ab95-38fb4bf77064/specificationInputSchema',
+ @type : 'vFW_ServiceCharacteristic',
+ }
+}
+"""
Scenario: findServiceCatalog
Given path 'serviceSpecification'