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