6831a656a82b23f10a16d1468293774b48cae2e5
[so.git] /
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.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.Collections;
28 import java.util.List;
29 import java.util.Map;
30 import java.util.stream.Collectors;
31 import org.onap.so.adapters.etsisol003adapter.lcm.v1.model.ExternalVirtualLink;
32 import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
33 import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoGenericVnf;
34 import org.onap.so.jsonpath.JsonPathUtil;
35 import org.onap.so.client.sdnc.SDNCClient;
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.core.type.TypeReference;
41 import com.fasterxml.jackson.databind.ObjectMapper;
42
43 /**
44  * This class retrieve pre-load data from SDNC using <br/>
45  * <b>GET</b> /config/VNF-API:preload-vnfs/vnf-preload-list/{vnf-name}/{vnf-type}
46  * 
47  * @author waqas.ikram@est.tech
48  */
49 @Service
50 public class SdncInputParametersProvider extends AbstractInputParametersProvider<GenericVnf> {
51
52     private static final Logger LOGGER = LoggerFactory.getLogger(SdncInputParametersProvider.class);
53
54     private static final String VNF_PARAMETERS_PATH = "$..vnf-parameters";
55
56     private final SDNCClient sdncClient;
57
58     private final ObjectMapper mapper;
59
60     @Autowired
61     public SdncInputParametersProvider(final SDNCClient sdncClient) {
62         this.sdncClient = sdncClient;
63         this.mapper = new ObjectMapper();
64     }
65
66     @Override
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);
71
72         try {
73             LOGGER.debug("Will query sdnc for input parameters using url: {}", url);
74             final String jsonResponse = sdncClient.get(url);
75             final String json = JsonPathUtil.getInstance().locateResult(jsonResponse, VNF_PARAMETERS_PATH).orElse(null);
76
77             try {
78
79                 if (json != null) {
80                     final List<VnfParameter> vnfParametersArray =
81                             mapper.readValue(json, new TypeReference<List<VnfParameter>>() {});
82                     final Map<String, String> vnfParametersMap = getVnfParameterMap(vnfParametersArray);
83                     final Map<String, String> additionalParameters = getAdditionalParameters(vnfParametersMap);
84                     final List<ExternalVirtualLink> extVirtualLinks = getExtVirtualLinks(vnfParametersMap);
85                     final InputParameter inputParameter = new InputParameter(additionalParameters, extVirtualLinks);
86                     LOGGER.info("InputParameter found in sdnc response : {}", inputParameter);
87                     return inputParameter;
88                 }
89
90             } catch (final IOException exception) {
91                 LOGGER.error("Unable to parse vnf parameters : {}", json, exception);
92             }
93         } catch (final Exception exception) {
94             LOGGER.error("Unable to retrieve/parse input parameters using URL: {} ", url, exception);
95         }
96         LOGGER.warn("No input parameters found ...");
97         return NullInputParameter.NULL_INSTANCE;
98
99     }
100
101     private List<ExternalVirtualLink> getExtVirtualLinks(final Map<String, String> vnfParametersMap) {
102         final String extVirtualLinksString = vnfParametersMap.get(EXT_VIRTUAL_LINKS);
103
104         if (extVirtualLinksString != null && !extVirtualLinksString.isEmpty()) {
105             return parseExternalVirtualLinks(extVirtualLinksString);
106         }
107         return Collections.emptyList();
108     }
109
110     private Map<String, String> getAdditionalParameters(final Map<String, String> vnfParametersMap) {
111         final String additionalParamsString = vnfParametersMap.get(ADDITIONAL_PARAMS);
112         if (additionalParamsString != null && !additionalParamsString.isEmpty()) {
113             return parseAdditionalParameters(additionalParamsString);
114         }
115         return Collections.emptyMap();
116     }
117
118
119     private Map<String, String> getVnfParameterMap(final List<VnfParameter> array) {
120         if (array != null) {
121             return array.stream().filter(vnfParam -> vnfParam.getName() != null && vnfParam.getValue() != null)
122                     .collect(Collectors.toMap(VnfParameter::getName, VnfParameter::getValue));
123         }
124
125         return Collections.emptyMap();
126     }
127
128     private String getPreloadVnfsUrl(final String vnfName, final String vnfType) {
129         return PRELOAD_VNFS_URL + vnfName + FORWARD_SLASH + vnfType;
130     }
131
132     private String getVnfType(final GenericVnf genericVnf) {
133         final ModelInfoGenericVnf modelInfoGenericVnf = genericVnf.getModelInfoGenericVnf();
134         if (modelInfoGenericVnf != null && modelInfoGenericVnf.getModelName() != null) {
135             return modelInfoGenericVnf.getModelName();
136         }
137         return genericVnf.getVnfType();
138     }
139
140 }