2  * ============LICENSE_START=======================================================
 
   3  *  Copyright (C) 2019 Ericsson. All rights reserved.
 
   4  * ================================================================================
 
   5  * Licensed under the Apache License, Version 2.0 (the "License");
 
   6  * you may not use this file except in compliance with the License.
 
   7  * You may obtain a copy of the License at
 
   9  *      http://www.apache.org/licenses/LICENSE-2.0
 
  11  * Unless required by applicable law or agreed to in writing, software
 
  12  * distributed under the License is distributed on an "AS IS" BASIS,
 
  13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  14  * See the License for the specific language governing permissions and
 
  15  * limitations under the License.
 
  17  * SPDX-License-Identifier: Apache-2.0
 
  18  * ============LICENSE_END=========================================================
 
  20 package org.onap.so.bpmn.infrastructure.adapter.vnfm.tasks.utils;
 
  22 import static org.onap.so.bpmn.infrastructure.adapter.vnfm.tasks.Constants.ADDITIONAL_PARAMS;
 
  23 import static org.onap.so.bpmn.infrastructure.adapter.vnfm.tasks.Constants.EXT_VIRTUAL_LINKS;
 
  24 import static org.onap.so.bpmn.infrastructure.adapter.vnfm.tasks.Constants.FORWARD_SLASH;
 
  25 import static org.onap.so.bpmn.infrastructure.adapter.vnfm.tasks.Constants.PRELOAD_VNFS_URL;
 
  26 import java.io.IOException;
 
  27 import java.util.Arrays;
 
  28 import java.util.Collections;
 
  29 import java.util.List;
 
  31 import java.util.stream.Collectors;
 
  32 import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
 
  33 import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoGenericVnf;
 
  34 import org.onap.so.client.sdnc.SDNCClient;
 
  35 import org.onap.vnfmadapter.v1.model.ExternalVirtualLink;
 
  36 import org.slf4j.Logger;
 
  37 import org.slf4j.LoggerFactory;
 
  38 import org.springframework.beans.factory.annotation.Autowired;
 
  39 import org.springframework.stereotype.Service;
 
  40 import com.fasterxml.jackson.databind.ObjectMapper;
 
  41 import com.jayway.jsonpath.JsonPath;
 
  42 import net.minidev.json.JSONArray;
 
  45  * This class retrieve pre-load data from SDNC using <br/>
 
  46  * <b>GET</b> /config/VNF-API:preload-vnfs/vnf-preload-list/{vnf-name}/{vnf-type}
 
  48  * @author waqas.ikram@est.tech
 
  51 public class SdncInputParametersProvider extends AbstractInputParametersProvider<GenericVnf> {
 
  53     private static final Logger LOGGER = LoggerFactory.getLogger(SdncInputParametersProvider.class);
 
  55     private static final String VNF_PARAMETERS_PATH = "$..vnf-parameters";
 
  57     private final SDNCClient sdncClient;
 
  60     public SdncInputParametersProvider(final SDNCClient sdncClient) {
 
  61         this.sdncClient = sdncClient;
 
  65     public InputParameter getInputParameter(final GenericVnf genericVnf) {
 
  66         final String vnfName = genericVnf.getVnfName();
 
  67         final String vnfType = getVnfType(genericVnf);
 
  68         final String url = getPreloadVnfsUrl(vnfName, vnfType);
 
  71             LOGGER.debug("Will query sdnc for input parameters using url: {}", url);
 
  72             final String jsonResponse = sdncClient.get(url);
 
  74             final JSONArray vnfParametersArray = JsonPath.read(jsonResponse, VNF_PARAMETERS_PATH);
 
  75             if (vnfParametersArray != null) {
 
  76                 for (int index = 0; index < vnfParametersArray.size(); index++) {
 
  77                     final Object vnfParametersObject = vnfParametersArray.get(index);
 
  78                     if (vnfParametersObject instanceof JSONArray) {
 
  79                         final JSONArray vnfParameters = (JSONArray) vnfParametersObject;
 
  80                         final Map<String, String> vnfParametersMap = getVnfParameterMap(vnfParameters);
 
  81                         final Map<String, String> additionalParameters = getAdditionalParameters(vnfParametersMap);
 
  82                         final List<ExternalVirtualLink> extVirtualLinks = getExtVirtualLinks(vnfParametersMap);
 
  83                         final InputParameter inputParameter = new InputParameter(additionalParameters, extVirtualLinks);
 
  84                         LOGGER.info("InputParameter found in sdnc response : {}", inputParameter);
 
  85                         return inputParameter;
 
  89         } catch (final Exception exception) {
 
  90             LOGGER.error("Unable to retrieve/parse input parameters using URL: {} ", url, exception);
 
  92         LOGGER.warn("No input parameters found ...");
 
  93         return NullInputParameter.NULL_INSTANCE;
 
  97     private List<ExternalVirtualLink> getExtVirtualLinks(final Map<String, String> vnfParametersMap) {
 
  98         final String extVirtualLinksString = vnfParametersMap.get(EXT_VIRTUAL_LINKS);
 
 100         if (extVirtualLinksString != null && !extVirtualLinksString.isEmpty()) {
 
 101             return parseExternalVirtualLinks(extVirtualLinksString);
 
 103         return Collections.emptyList();
 
 106     private Map<String, String> getAdditionalParameters(final Map<String, String> vnfParametersMap) {
 
 107         final String additionalParamsString = vnfParametersMap.get(ADDITIONAL_PARAMS);
 
 108         if (additionalParamsString != null && !additionalParamsString.isEmpty()) {
 
 109             return parseAdditionalParameters(additionalParamsString);
 
 111         return Collections.emptyMap();
 
 115     private Map<String, String> getVnfParameterMap(final JSONArray array) {
 
 118                 final ObjectMapper mapper = new ObjectMapper();
 
 119                 final VnfParameter[] readValue = mapper.readValue(array.toJSONString(), VnfParameter[].class);
 
 120                 LOGGER.debug("Vnf parameters: {}", Arrays.asList(readValue));
 
 121                 return Arrays.asList(readValue).stream()
 
 122                         .filter(vnfParam -> vnfParam.getName() != null && vnfParam.getValue() != null)
 
 123                         .collect(Collectors.toMap(VnfParameter::getName, VnfParameter::getValue));
 
 125         } catch (final IOException exception) {
 
 126             LOGGER.error("Unable to parse vnf parameters : {}", array, exception);
 
 128         return Collections.emptyMap();
 
 131     private String getPreloadVnfsUrl(final String vnfName, final String vnfType) {
 
 132         return PRELOAD_VNFS_URL + vnfName + FORWARD_SLASH + vnfType;
 
 135     private String getVnfType(final GenericVnf genericVnf) {
 
 136         final ModelInfoGenericVnf modelInfoGenericVnf = genericVnf.getModelInfoGenericVnf();
 
 137         if (modelInfoGenericVnf != null && modelInfoGenericVnf.getModelName() != null) {
 
 138             return modelInfoGenericVnf.getModelName();
 
 140         return genericVnf.getVnfType();