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
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=========================================================
21 package org.onap.so.adapters.vnfmadapter.lifecycle;
23 import com.google.common.base.Optional;
25 import org.onap.aai.domain.yang.EsrVnfm;
26 import org.onap.aai.domain.yang.GenericVnf;
27 import org.onap.so.adapters.vnfmadapter.extclients.aai.AaiHelper;
28 import org.onap.so.adapters.vnfmadapter.extclients.aai.AaiServiceProvider;
29 import org.onap.so.adapters.vnfmadapter.extclients.aai.OamIpAddressSource;
30 import org.onap.so.adapters.vnfmadapter.extclients.aai.OamIpAddressSource.OamIpAddressType;
31 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.VnfmHelper;
32 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.VnfmServiceProvider;
33 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.InlineResponse201;
34 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.InstantiateVnfRequest;
35 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.LccnSubscriptionRequest;
36 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.TerminateVnfRequest;
37 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.TerminateVnfRequest.TerminationTypeEnum;
38 import org.onap.so.adapters.vnfmadapter.jobmanagement.JobManager;
39 import org.onap.so.adapters.vnfmadapter.rest.exceptions.VnfNotFoundException;
40 import org.onap.so.adapters.vnfmadapter.rest.exceptions.VnfmNotFoundException;
41 import org.onap.vnfmadapter.v1.model.CreateVnfRequest;
42 import org.onap.vnfmadapter.v1.model.CreateVnfResponse;
43 import org.onap.vnfmadapter.v1.model.DeleteVnfResponse;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
46 import org.springframework.beans.factory.annotation.Autowired;
47 import org.springframework.stereotype.Component;
50 * Manages lifecycle operations towards the VNFMs.
53 public class LifecycleManager {
54 private static final Logger logger = LoggerFactory.getLogger(LifecycleManager.class);
55 private final AaiServiceProvider aaiServiceProvider;
56 private final VnfmServiceProvider vnfmServiceProvider;
57 private final AaiHelper aaiHelper;
58 private final VnfmHelper vnfmHelper;
59 private final JobManager jobManager;
62 LifecycleManager(final AaiServiceProvider aaiServiceProvider, final AaiHelper aaiHelper,
63 final VnfmHelper vnfmHelper, final VnfmServiceProvider vnfmServiceProvider, final JobManager jobManager) {
64 this.aaiServiceProvider = aaiServiceProvider;
65 this.vnfmServiceProvider = vnfmServiceProvider;
66 this.aaiHelper = aaiHelper;
67 this.vnfmHelper = vnfmHelper;
68 this.jobManager = jobManager;
72 * Create a VNF on a VNFM.
74 * @param vnfIdInAai the ID of the VNF in AAI
75 * @param request the create request
76 * @return the response to the request
78 public CreateVnfResponse createVnf(final String vnfIdInAai, final CreateVnfRequest request) {
79 final GenericVnf genericVnf = getGenericVnfFromAai(vnfIdInAai);
80 checkIfVnfAlreadyExistsInVnfm(genericVnf);
82 EsrVnfm vnfm = aaiHelper.getAssignedVnfm(genericVnf);
84 vnfm = aaiHelper.selectVnfm(genericVnf);
85 aaiHelper.addRelationshipFromGenericVnfToVnfm(genericVnf, vnfm.getVnfmId());
88 final String vnfIdInVnfm = sendCreateRequestToVnfm(genericVnf);
90 final OamIpAddressSource oamIpAddressSource = extractOamIpAddressSource(request);
91 aaiHelper.setOamIpAddressSource(vnfIdInVnfm, oamIpAddressSource);
93 createNotificationSubscription(vnfm.getVnfmId(), vnfIdInVnfm);
94 final String operationId = sendInstantiateRequestToVnfm(vnfm, genericVnf, request, vnfIdInAai, vnfIdInVnfm);
96 final String jobId = jobManager.createJob(vnfm.getVnfmId(), operationId, false);
97 final CreateVnfResponse response = new CreateVnfResponse();
98 response.setJobId(jobId);
102 private OamIpAddressSource extractOamIpAddressSource(final CreateVnfRequest request) {
103 final Map<String, String> additionalParams = request.getAdditionalParams();
105 final String sourceType = additionalParams.remove("oamIpAddressSourceType");
106 final String sourceValue = additionalParams.remove("oamIpAddressSourceValue");
107 final OamIpAddressType oamIpAddressType = OamIpAddressType.valueOf(sourceType.toUpperCase());
108 return new OamIpAddressSource(oamIpAddressType, sourceValue);
109 } catch (final NullPointerException | IllegalArgumentException exception) {
110 logger.debug("Additional Params not set for OAM IP address source", exception);
115 private void checkIfVnfAlreadyExistsInVnfm(final GenericVnf genericVnf) {
116 if (genericVnf.getSelflink() != null && !genericVnf.getSelflink().isEmpty()) {
117 Optional<InlineResponse201> response = Optional.absent();
119 response = vnfmServiceProvider.getVnf(genericVnf.getSelflink());
120 } catch (final Exception exception) {
121 logger.debug("Ignoring invalid self link in generic vnf", exception);
123 if (response.isPresent()) {
124 throw new IllegalArgumentException("VNF " + genericVnf.getVnfId()
125 + " is already defined on the VNFM, self link: " + genericVnf.getSelflink());
130 private String sendCreateRequestToVnfm(final GenericVnf genericVnf) {
131 // TODO call create request
132 genericVnf.setSelflink("http://dummy.value/until/create/implememted/vnfId");
136 private void createNotificationSubscription(final String vnfmId, final String vnfId) {
138 final LccnSubscriptionRequest subscriptionRequest = vnfmHelper.createNotificationSubscriptionRequest(vnfId);
139 vnfmServiceProvider.subscribeForNotifications(vnfmId, subscriptionRequest);
140 } catch (final Exception exception) {
141 logger.warn("Subscription for notifications to VNFM: " + vnfmId + " for VNF " + vnfId
142 + " failed. AAI will not be updated unless the VNFM is configured by other means to send notifications relating to this VNF",
147 private String sendInstantiateRequestToVnfm(final EsrVnfm vnfm, final GenericVnf genericVnf,
148 final CreateVnfRequest createVnfRequest, final String vnfIdInAai, final String vnfIdInVnfm) {
150 final InstantiateVnfRequest instantiateVnfRequest =
151 vnfmHelper.createInstantiateRequest(createVnfRequest.getTenant(), createVnfRequest);
152 final String jobId = vnfmServiceProvider.instantiateVnf(genericVnf.getSelflink(), instantiateVnfRequest);
154 logger.info("Instantiate VNF request successfully sent to " + genericVnf.getSelflink());
159 * Delete a VNF on a VNFM.
161 * @param vnfIdInAai the ID of the VNF in AAI
162 * @return the response to the request
164 public DeleteVnfResponse deleteVnf(final String vnfIdInAai) {
165 final GenericVnf genericVnf = getGenericVnfFromAai(vnfIdInAai);
166 final String vnfmId = getIdOfAssignedVnfm(genericVnf);
168 final String operationId = sendTerminateRequestToVnfm(genericVnf);
169 final String jobId = jobManager.createJob(vnfmId, operationId, true);
171 return new DeleteVnfResponse().jobId(jobId);
174 private String sendTerminateRequestToVnfm(final GenericVnf genericVnf) {
175 final TerminateVnfRequest terminateVnfRequest = new TerminateVnfRequest();
176 terminateVnfRequest.setTerminationType(TerminationTypeEnum.FORCEFUL);
177 return vnfmServiceProvider.terminateVnf(genericVnf.getSelflink(), terminateVnfRequest);
180 private GenericVnf getGenericVnfFromAai(final String vnfIdInAai) {
181 final GenericVnf genericVnf = aaiServiceProvider.invokeGetGenericVnf(vnfIdInAai);
182 if (genericVnf == null) {
183 throw new VnfNotFoundException("VNF not found in AAI: " + vnfIdInAai);
185 logger.debug("Retrieved generic VNF from AAI: " + genericVnf);
189 private String getIdOfAssignedVnfm(final GenericVnf genericVnf) {
190 final String vnfmId = aaiHelper.getIdOfAssignedVnfm(genericVnf);
191 if (vnfmId == null) {
192 throw new VnfmNotFoundException("No VNFM found in AAI for VNF " + genericVnf.getVnfId());