Merge "Migrate parent from springboot to oparent"
authorEric Debeau <eric.debeau@orange.com>
Tue, 19 Mar 2019 16:07:40 +0000 (16:07 +0000)
committerGerrit Code Review <gerrit@onap.org>
Tue, 19 Mar 2019 16:07:40 +0000 (16:07 +0000)
22 files changed:
INFO.yaml
pom.xml
src/main/java/org/onap/nbi/apis/hub/HubResource.java
src/main/java/org/onap/nbi/apis/hub/model/EventType.java
src/main/java/org/onap/nbi/apis/hub/service/CheckDMaaPEventsManager.java [deleted file]
src/main/java/org/onap/nbi/apis/hub/service/DMaaPEventsScheduler.java [deleted file]
src/main/java/org/onap/nbi/apis/hub/service/EventFactory.java
src/main/java/org/onap/nbi/apis/hub/service/dmaap/CheckDMaaPEventsManager.java [new file with mode: 0644]
src/main/java/org/onap/nbi/apis/hub/service/dmaap/DMaaPEventsScheduler.java [new file with mode: 0644]
src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationDBManager.java [new file with mode: 0644]
src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationResource.java
src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationService.java
src/main/java/org/onap/nbi/apis/servicecatalog/ToscaInfosProcessor.java
src/main/java/org/onap/nbi/apis/servicecatalog/model/ServiceSpecification.java [new file with mode: 0644]
src/main/java/org/onap/nbi/apis/servicecatalog/model/SpecificationInputSchema.java [new file with mode: 0644]
src/main/java/org/onap/nbi/apis/servicecatalog/repositories/ServiceSpecificationRepository.java [new file with mode: 0644]
src/main/java/org/onap/nbi/apis/servicecatalog/repositories/SpecificationInputSchemaRepository.java [new file with mode: 0644]
src/main/java/org/onap/nbi/apis/status/OnapClient.java
src/main/resources/application-test.properties
src/main/resources/application.properties
src/test/java/org/onap/nbi/apis/servicecatalog/ToscaInfosProcessorTest.java
src/test/resources/karatetest/features/00--ServiceCatalog.feature

index 241df2c..4def3aa 100644 (file)
--- 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 (file)
--- 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>
       <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>
index ac073c1..016ebca 100755 (executable)
@@ -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;
index b4e1f1a..5db21f3 100644 (file)
@@ -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 (file)
index b45647f..0000000
+++ /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 (file)
index 20bc2d9..0000000
+++ /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();
-    
-  }
-}
-
index ed34322..2fe533b 100644 (file)
@@ -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 (file)
index 0000000..4ff40e6
--- /dev/null
@@ -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 (file)
index 0000000..cdd1825
--- /dev/null
@@ -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 (file)
index 0000000..466611d
--- /dev/null
@@ -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);
+
+    }
+}
index e8ef9e3..6484672 100644 (file)
@@ -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);
+    }
+
 }
index 5e3e4cf..8f0829b 100644 (file)
@@ -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;
+    }
+  }
 }
index fff4444..fc0494f 100644 (file)
 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 (file)
index 0000000..c88cc65
--- /dev/null
@@ -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 (file)
index 0000000..e4e85d7
--- /dev/null
@@ -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 (file)
index 0000000..f46e008
--- /dev/null
@@ -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 (file)
index 0000000..56adbd3
--- /dev/null
@@ -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> {
+
+
+}
index d9bedc0..c3eb746 100644 (file)
@@ -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) {
index 028040d..ed34f0a 100644 (file)
@@ -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
index 741682e..fe7dde0 100644 (file)
@@ -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
index 8849607..68a955f 100644 (file)
@@ -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);
+  }
 }
index 2a40526..27807ac 100644 (file)
@@ -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'