Added input parameter loading handling from SDNC
[so.git] / bpmn / so-bpmn-tasks / src / main / java / org / onap / so / bpmn / infrastructure / adapter / vnfm / tasks / utils / InputParametersProviderImpl.java
1 /*-
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
8  * 
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  * 
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.
16  * 
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20 package org.onap.so.bpmn.infrastructure.adapter.vnfm.tasks.utils;
21
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
25 import java.io.IOException;
26 import java.util.Arrays;
27 import java.util.Collections;
28 import java.util.List;
29 import java.util.Map;
30 import java.util.stream.Collectors;
31
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
41 import com.fasterxml.jackson.core.JsonParseException;
42 import com.fasterxml.jackson.core.type.TypeReference;
43 import com.fasterxml.jackson.databind.ObjectMapper;
44 import com.jayway.jsonpath.JsonPath;
45
46 import net.minidev.json.JSONArray;
47
48 /**
49  * This class retrieve pre-load data from SDNC using <br/>
50  * <b>GET</b> /config/VNF-API:preload-vnfs/vnf-preload-list/{vnf-name}/{vnf-type}
51  * 
52  * @author waqas.ikram@est.tech
53  */
54 @Service
55 public class InputParametersProviderImpl implements InputParametersProvider {
56
57     private static final Logger LOGGER = LoggerFactory.getLogger(InputParametersProviderImpl.class);
58
59     private static final String EXT_VIRTUAL_LINKS = "extVirtualLinks";
60     private static final String ADDITIONAL_PARAMS = "additionalParams";
61     private static final String VNF_PARAMETERS_PATH = "$..vnf-parameters";
62
63     private final SDNCClient sdncClient;
64
65     @Autowired
66     public InputParametersProviderImpl(final SDNCClient sdncClient) {
67         this.sdncClient = sdncClient;
68     }
69
70     @Override
71     public InputParameter getInputParameter(final GenericVnf genericVnf) {
72         final String vnfName = genericVnf.getVnfName();
73         final String vnfType = getVnfType(genericVnf);
74         final String url = getPreloadVnfsUrl(vnfName, vnfType);
75
76         try {
77             LOGGER.debug("Will query sdnc for input parameters using url: {}", url);
78             final String jsonResponse = sdncClient.get(url);
79
80             final JSONArray vnfParametersArray = JsonPath.read(jsonResponse, VNF_PARAMETERS_PATH);
81             if (vnfParametersArray != null) {
82                 for (int index = 0; index < vnfParametersArray.size(); index++) {
83                     final Object vnfParametersObject = vnfParametersArray.get(index);
84                     if (vnfParametersObject instanceof JSONArray) {
85                         final JSONArray vnfParameters = (JSONArray) vnfParametersObject;
86                         final Map<String, String> vnfParametersMap = getVnfParameterMap(vnfParameters);
87                         return new InputParameter(getAdditionalParameters(vnfParametersMap),
88                                 getExtVirtualLinks(vnfParametersMap));
89                     }
90                 }
91             }
92         } catch (final Exception exception) {
93             LOGGER.error("Unable to retrieve/parse input parameters using URL: {} ", url, exception);
94         }
95         LOGGER.warn("No input parameters found ...");
96         return NullInputParameter.NULL_INSTANCE;
97
98     }
99
100     private List<ExternalVirtualLink> getExtVirtualLinks(final Map<String, String> vnfParametersMap)
101             throws JsonParseException, IOException {
102         try {
103             final String extVirtualLinksString = vnfParametersMap.get(EXT_VIRTUAL_LINKS);
104
105             if (extVirtualLinksString != null && !extVirtualLinksString.isEmpty()) {
106                 final ObjectMapper mapper = new ObjectMapper();
107                 final TypeReference<List<ExternalVirtualLink>> extVirtualLinksStringTypeRef =
108                         new TypeReference<List<ExternalVirtualLink>>() {};
109
110                 return mapper.readValue(extVirtualLinksString, extVirtualLinksStringTypeRef);
111             }
112         } catch (final Exception exception) {
113             LOGGER.error("Unable to parse {} ", EXT_VIRTUAL_LINKS, exception);
114         }
115         return Collections.emptyList();
116     }
117
118     private Map<String, String> getAdditionalParameters(final Map<String, String> vnfParametersMap)
119             throws JsonParseException, IOException {
120         try {
121             final String additionalParamsString = vnfParametersMap.get(ADDITIONAL_PARAMS);
122             if (additionalParamsString != null && !additionalParamsString.isEmpty()) {
123                 final ObjectMapper mapper = new ObjectMapper();
124                 final TypeReference<Map<String, String>> typeRef = new TypeReference<Map<String, String>>() {};
125                 return mapper.readValue(additionalParamsString, typeRef);
126             }
127         } catch (final Exception exception) {
128             LOGGER.error("Unable to parse {} ", ADDITIONAL_PARAMS, exception);
129         }
130         return Collections.emptyMap();
131     }
132
133     private Map<String, String> getVnfParameterMap(final JSONArray array) {
134         try {
135             if (array != null) {
136                 final ObjectMapper mapper = new ObjectMapper();
137                 final VnfParameter[] readValue = mapper.readValue(array.toJSONString(), VnfParameter[].class);
138                 LOGGER.debug("Vnf parameters: {}", Arrays.asList(readValue));
139                 return Arrays.asList(readValue).stream()
140                         .filter(vnfParam -> vnfParam.getName() != null && vnfParam.getValue() != null)
141                         .collect(Collectors.toMap(VnfParameter::getName, VnfParameter::getValue));
142             }
143         } catch (final IOException exception) {
144             LOGGER.error("Unable to parse vnf parameters : {}", array, exception);
145         }
146         return Collections.emptyMap();
147     }
148
149     private String getPreloadVnfsUrl(final String vnfName, final String vnfType) {
150         return PRELOAD_VNFS_URL + vnfName + FORWARD_SLASH + vnfType;
151     }
152
153     private String getVnfType(final GenericVnf genericVnf) {
154         final ModelInfoGenericVnf modelInfoGenericVnf = genericVnf.getModelInfoGenericVnf();
155         if (modelInfoGenericVnf != null && modelInfoGenericVnf.getModelName() != null) {
156             return modelInfoGenericVnf.getModelName();
157         }
158         return genericVnf.getVnfType();
159     }
160
161 }