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.FORWARD_SLASH;
23 import static org.onap.so.bpmn.infrastructure.adapter.vnfm.tasks.Constants.PRELOAD_VNFS_URL;
24 import java.io.IOException;
25 import java.util.Arrays;
26 import java.util.Collections;
27 import java.util.List;
29 import java.util.stream.Collectors;
30 import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
31 import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoGenericVnf;
32 import org.onap.so.client.sdnc.SDNCClient;
33 import org.onap.vnfmadapter.v1.model.ExternalVirtualLink;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
36 import org.springframework.beans.factory.annotation.Autowired;
37 import org.springframework.stereotype.Service;
38 import com.fasterxml.jackson.core.JsonParseException;
39 import com.fasterxml.jackson.core.type.TypeReference;
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 InputParametersProviderImpl implements InputParametersProvider {
53 private static final Logger LOGGER = LoggerFactory.getLogger(InputParametersProviderImpl.class);
55 private static final String EXT_VIRTUAL_LINKS = "extVirtualLinks";
56 private static final String ADDITIONAL_PARAMS = "additionalParams";
57 private static final String VNF_PARAMETERS_PATH = "$..vnf-parameters";
59 private final SDNCClient sdncClient;
62 public InputParametersProviderImpl(final SDNCClient sdncClient) {
63 this.sdncClient = sdncClient;
67 public InputParameter getInputParameter(final GenericVnf genericVnf) {
68 final String vnfName = genericVnf.getVnfName();
69 final String vnfType = getVnfType(genericVnf);
70 final String url = getPreloadVnfsUrl(vnfName, vnfType);
73 LOGGER.debug("Will query sdnc for input parameters using url: {}", url);
74 final String jsonResponse = sdncClient.get(url);
76 final JSONArray vnfParametersArray = JsonPath.read(jsonResponse, VNF_PARAMETERS_PATH);
77 if (vnfParametersArray != null) {
78 for (int index = 0; index < vnfParametersArray.size(); index++) {
79 final Object vnfParametersObject = vnfParametersArray.get(index);
80 if (vnfParametersObject instanceof JSONArray) {
81 final JSONArray vnfParameters = (JSONArray) vnfParametersObject;
82 final Map<String, String> vnfParametersMap = getVnfParameterMap(vnfParameters);
83 return new InputParameter(getAdditionalParameters(vnfParametersMap),
84 getExtVirtualLinks(vnfParametersMap));
88 } catch (final Exception exception) {
89 LOGGER.error("Unable to retrieve/parse input parameters using URL: {} ", url, exception);
91 LOGGER.warn("No input parameters found ...");
92 return NullInputParameter.NULL_INSTANCE;
96 private List<ExternalVirtualLink> getExtVirtualLinks(final Map<String, String> vnfParametersMap)
97 throws JsonParseException, IOException {
99 final String extVirtualLinksString = vnfParametersMap.get(EXT_VIRTUAL_LINKS);
101 if (extVirtualLinksString != null && !extVirtualLinksString.isEmpty()) {
102 final ObjectMapper mapper = new ObjectMapper();
103 final TypeReference<List<ExternalVirtualLink>> extVirtualLinksStringTypeRef =
104 new TypeReference<List<ExternalVirtualLink>>() {};
106 return mapper.readValue(extVirtualLinksString, extVirtualLinksStringTypeRef);
108 } catch (final Exception exception) {
109 LOGGER.error("Unable to parse {} ", EXT_VIRTUAL_LINKS, exception);
111 return Collections.emptyList();
114 private Map<String, String> getAdditionalParameters(final Map<String, String> vnfParametersMap)
115 throws JsonParseException, IOException {
117 final String additionalParamsString = vnfParametersMap.get(ADDITIONAL_PARAMS);
118 if (additionalParamsString != null && !additionalParamsString.isEmpty()) {
119 final ObjectMapper mapper = new ObjectMapper();
120 final TypeReference<Map<String, String>> typeRef = new TypeReference<Map<String, String>>() {};
121 return mapper.readValue(additionalParamsString, typeRef);
123 } catch (final Exception exception) {
124 LOGGER.error("Unable to parse {} ", ADDITIONAL_PARAMS, exception);
126 return Collections.emptyMap();
129 private Map<String, String> getVnfParameterMap(final JSONArray array) {
132 final ObjectMapper mapper = new ObjectMapper();
133 final VnfParameter[] readValue = mapper.readValue(array.toJSONString(), VnfParameter[].class);
134 LOGGER.debug("Vnf parameters: {}", Arrays.asList(readValue));
135 return Arrays.asList(readValue).stream()
136 .filter(vnfParam -> vnfParam.getName() != null && vnfParam.getValue() != null)
137 .collect(Collectors.toMap(VnfParameter::getName, VnfParameter::getValue));
139 } catch (final IOException exception) {
140 LOGGER.error("Unable to parse vnf parameters : {}", array, exception);
142 return Collections.emptyMap();
145 private String getPreloadVnfsUrl(final String vnfName, final String vnfType) {
146 return PRELOAD_VNFS_URL + vnfName + FORWARD_SLASH + vnfType;
149 private String getVnfType(final GenericVnf genericVnf) {
150 final ModelInfoGenericVnf modelInfoGenericVnf = genericVnf.getModelInfoGenericVnf();
151 if (modelInfoGenericVnf != null && modelInfoGenericVnf.getModelName() != null) {
152 return modelInfoGenericVnf.getModelName();
154 return genericVnf.getVnfType();