CLEANED UP IMPORTS IN MSO-VFNM-ETSI Adapter
[so.git] / adapters / mso-vnfm-adapter / mso-vnfm-etsi-adapter / src / main / java / org / onap / so / adapters / vnfmadapter / extclients / vnfm / VnfmHelper.java
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2019 Nordix Foundation.
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
21 package org.onap.so.adapters.vnfmadapter.extclients.vnfm;
22
23 import com.google.common.reflect.TypeToken;
24 import com.google.gson.Gson;
25 import com.google.gson.JsonElement;
26 import com.google.gson.JsonObject;
27 import org.onap.aai.domain.yang.EsrSystemInfo;
28 import org.onap.so.adapters.vnfmadapter.extclients.aai.AaiServiceProvider;
29 import org.onap.so.adapters.vnfmadapter.extclients.vim.model.AccessInfo;
30 import org.onap.so.adapters.vnfmadapter.extclients.vim.model.InterfaceInfo;
31 import org.onap.so.adapters.vnfmadapter.extclients.vim.model.VimCredentials;
32 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.model.InlineResponse201VimConnections;
33 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.InstantiateVnfRequest;
34 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.LccnSubscriptionRequest;
35 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.SubscriptionsAuthentication;
36 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.SubscriptionsAuthentication.AuthTypeEnum;
37 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.SubscriptionsAuthenticationParamsBasic;
38 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.SubscriptionsFilter;
39 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.SubscriptionsFilter.NotificationTypesEnum;
40 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.SubscriptionsFilterVnfInstanceSubscriptionFilter;
41 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.VnfInstancesvnfInstanceIdinstantiateExtVirtualLinks;
42 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.VnfInstancesvnfInstanceIdinstantiateVimConnectionInfo;
43 import org.onap.so.security.WebSecurityConfig;
44 import org.onap.vnfmadapter.v1.model.CreateVnfRequest;
45 import org.onap.vnfmadapter.v1.model.ExternalVirtualLink;
46 import org.onap.vnfmadapter.v1.model.Tenant;
47 import org.slf4j.Logger;
48 import org.slf4j.LoggerFactory;
49 import org.springframework.beans.factory.annotation.Autowired;
50 import org.springframework.beans.factory.annotation.Value;
51 import org.springframework.stereotype.Service;
52 import java.util.ArrayList;
53 import java.util.List;
54 import java.util.Map;
55 import static org.onap.so.adapters.vnfmadapter.Constants.BASE_URL;
56 import static org.onap.so.adapters.vnfmadapter.Constants.OPERATION_NOTIFICATION_ENDPOINT;
57
58 /**
59  * Provides helper methods for interactions with VNFM.
60  */
61 @Service
62 public class VnfmHelper {
63
64     private static final Logger logger = LoggerFactory.getLogger(VnfmHelper.class);
65     private static final String SEPARATOR = "_";
66     private final AaiServiceProvider aaiServiceProvider;
67     private final WebSecurityConfig webSecurityConfig;
68
69     @Value("${vnfmadapter.endpoint}")
70     private String vnfmAdapterEndoint;
71
72     @Autowired
73     public VnfmHelper(final AaiServiceProvider aaiServiceProvider, final WebSecurityConfig webSecurityConfig) {
74         this.aaiServiceProvider = aaiServiceProvider;
75         this.webSecurityConfig = webSecurityConfig;
76     }
77
78     /**
79      * Create an {@link InstantiateVnfRequest} to send in an instantiation request to a VNFM.
80      *
81      * @param tenant the tenant the request is to be fulfilled on
82      * @param createVnfRequest the request received by the VNFM adapter
83      */
84     public InstantiateVnfRequest createInstantiateRequest(final Tenant tenant, final CreateVnfRequest createVnfRequest,
85             final String flavourId) {
86         final InstantiateVnfRequest instantiateVnfRequest = new InstantiateVnfRequest();
87         instantiateVnfRequest.setFlavourId(flavourId);
88         instantiateVnfRequest.setVimConnectionInfo(getVimConnectionInfos(tenant));
89         instantiateVnfRequest
90                 .setAdditionalParams(getAdditionalParametersAsJsonObject(createVnfRequest.getAdditionalParams()));
91         instantiateVnfRequest.setExtVirtualLinks(getExternalVirtualLinks(createVnfRequest.getExternalVirtualLinks()));
92         createVnfRequest.getExternalVirtualLinks();
93         return instantiateVnfRequest;
94     }
95
96     private String getFlavourId() {
97         // TODO read from csar
98         return "default";
99     }
100
101     private List<VnfInstancesvnfInstanceIdinstantiateVimConnectionInfo> getVimConnectionInfos(final Tenant tenant) {
102         final List<VnfInstancesvnfInstanceIdinstantiateVimConnectionInfo> connectionInfos = new ArrayList<>();
103         connectionInfos.add(getVimConnectionInfo(tenant));
104         return connectionInfos;
105     }
106
107     private VnfInstancesvnfInstanceIdinstantiateVimConnectionInfo getVimConnectionInfo(final Tenant tenant) {
108         final EsrSystemInfo esrSystemInfo =
109                 aaiServiceProvider.invokeGetCloudRegionEsrSystemInfoList(tenant.getCloudOwner(), tenant.getRegionName())
110                         .getEsrSystemInfo().iterator().next();
111
112         final VnfInstancesvnfInstanceIdinstantiateVimConnectionInfo vnfInstancesVimConnectionInfo =
113                 new VnfInstancesvnfInstanceIdinstantiateVimConnectionInfo();
114         final String vimId = createVimId(tenant.getCloudOwner(), tenant.getRegionName());
115         vnfInstancesVimConnectionInfo.setId(vimId);
116         vnfInstancesVimConnectionInfo.setVimId(vimId);
117         vnfInstancesVimConnectionInfo.setVimType(esrSystemInfo.getType());
118         vnfInstancesVimConnectionInfo.setInterfaceInfo(getInterfaceInfo(esrSystemInfo.getServiceUrl()));
119         vnfInstancesVimConnectionInfo.setAccessInfo(getAccessInfo(esrSystemInfo, tenant.getTenantId()));
120         return vnfInstancesVimConnectionInfo;
121     }
122
123     private InterfaceInfo getInterfaceInfo(final String url) {
124         final InterfaceInfo interfaceInfo = new InterfaceInfo();
125         interfaceInfo.setIdentityEndPoint(url);
126         return interfaceInfo;
127     }
128
129     private AccessInfo getAccessInfo(final EsrSystemInfo esrSystemInfo, final String tenantId) {
130         final AccessInfo accessInfo = new AccessInfo();
131         accessInfo.setProjectId(tenantId);
132         accessInfo.setDomainName(esrSystemInfo.getCloudDomain());
133
134         final VimCredentials vimCredentials = new VimCredentials();
135         vimCredentials.setUsername(esrSystemInfo.getUserName());
136         vimCredentials.setPassword(esrSystemInfo.getPassword());
137         accessInfo.setCredentials(vimCredentials);
138         return accessInfo;
139     }
140
141     private String createVimId(final String cloudOwner, final String cloudRegion) {
142         return cloudOwner + SEPARATOR + cloudRegion;
143     }
144
145     private JsonObject getAdditionalParametersAsJsonObject(final Map<String, String> additionalParameters) {
146         final JsonObject additionalParametersJsonObject = new JsonObject();
147         if (additionalParameters != null) {
148             for (final Map.Entry<String, JsonElement> item : new Gson().toJsonTree(additionalParameters)
149                     .getAsJsonObject().entrySet()) {
150                 additionalParametersJsonObject.add(item.getKey(), item.getValue());
151             }
152         } else {
153             logger.warn("No additional parameters were specified for the operation");
154         }
155         return additionalParametersJsonObject;
156     }
157
158     private List<VnfInstancesvnfInstanceIdinstantiateExtVirtualLinks> getExternalVirtualLinks(
159             final List<ExternalVirtualLink> extVirtualLinks) {
160         if (extVirtualLinks != null) {
161             final String extVirtualLinksJsonObject =
162                     new Gson().toJson(extVirtualLinks, new TypeToken<List<ExternalVirtualLink>>() {}.getType());
163             return new Gson().fromJson(extVirtualLinksJsonObject,
164                     new TypeToken<List<VnfInstancesvnfInstanceIdinstantiateExtVirtualLinks>>() {}.getType());
165         }
166         return null;
167     }
168
169     /**
170      * Create a {@link LccnSubscriptionRequest} to send in an notification subscription request to a VNFM.
171      *
172      * @param the ID of the VNF notifications are required for
173      * @return the request
174      */
175     public LccnSubscriptionRequest createNotificationSubscriptionRequest(final String vnfId) {
176         final LccnSubscriptionRequest lccnSubscriptionRequest = new LccnSubscriptionRequest();
177         lccnSubscriptionRequest.setAuthentication(getSubscriptionsAuthentication());
178         lccnSubscriptionRequest.setCallbackUri(vnfmAdapterEndoint + BASE_URL + OPERATION_NOTIFICATION_ENDPOINT);
179         final SubscriptionsFilter filter = new SubscriptionsFilter();
180         filter.addNotificationTypesItem(NotificationTypesEnum.VNFLCMOPERATIONOCCURRENCENOTIFICATION);
181         final SubscriptionsFilterVnfInstanceSubscriptionFilter vnfInstanceSubscriptionFilter =
182                 new SubscriptionsFilterVnfInstanceSubscriptionFilter();
183         vnfInstanceSubscriptionFilter.addVnfInstanceIdsItem(vnfId);
184         filter.setVnfInstanceSubscriptionFilter(vnfInstanceSubscriptionFilter);
185         lccnSubscriptionRequest.setFilter(filter);
186         return lccnSubscriptionRequest;
187     }
188
189     private SubscriptionsAuthentication getSubscriptionsAuthentication() {
190         final SubscriptionsAuthenticationParamsBasic basicAuthParams = new SubscriptionsAuthenticationParamsBasic();
191         basicAuthParams.setUserName("vnfm");
192         basicAuthParams.setPassword(webSecurityConfig.getUsercredentials().stream()
193                 .filter(userCredentials -> "vnfm".equals(userCredentials.getUsername())).findFirst().get()
194                 .getPassword());
195
196         final SubscriptionsAuthentication authentication = new SubscriptionsAuthentication();
197         authentication.addAuthTypeItem(AuthTypeEnum.BASIC);
198         authentication.paramsBasic(basicAuthParams);
199         return authentication;
200     }
201
202     /**
203      * Get the VIM connections for a tenant
204      *
205      * @param tenant the tenant
206      * @return the VIM connections
207      */
208     public InlineResponse201VimConnections getVimConnections(final Tenant tenant) {
209         final EsrSystemInfo esrSystemInfo =
210                 aaiServiceProvider.invokeGetCloudRegionEsrSystemInfoList(tenant.getCloudOwner(), tenant.getRegionName())
211                         .getEsrSystemInfo().iterator().next();
212
213         final InlineResponse201VimConnections vimConnection = new InlineResponse201VimConnections();
214         vimConnection.setId(createVimId(tenant.getCloudOwner(), tenant.getRegionName()));
215         vimConnection.setVimId(vimConnection.getId());
216         vimConnection.setVimType(esrSystemInfo.getType());
217         vimConnection.setInterfaceInfo(getInterfaceInfo(esrSystemInfo.getServiceUrl()));
218         vimConnection.setAccessInfo(getAccessInfo(esrSystemInfo, tenant.getTenantId()));
219         return vimConnection;
220     }
221
222
223 }