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.svnfm.simulator.services;
23 import java.lang.reflect.InvocationTargetException;
24 import java.util.List;
25 import java.util.UUID;
26 import java.util.concurrent.ExecutorService;
27 import java.util.concurrent.Executors;
28 import org.modelmapper.ModelMapper;
29 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.CreateVnfRequest;
30 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.InlineResponse200;
31 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.InlineResponse201;
32 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.InlineResponse201.InstantiationStateEnum;
33 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.InlineResponse201InstantiatedVnfInfo;
34 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.InlineResponse201VimConnectionInfo;
35 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.LccnSubscriptionRequest;
36 import org.onap.so.svnfm.simulator.model.Vnfds;
37 import org.onap.so.svnfm.simulator.notifications.VnfInstantiationNotification;
38 import org.onap.so.svnfm.simulator.notifications.VnfmAdapterCreationNotification;
39 import org.onap.so.svnfm.simulator.repository.VnfOperationRepository;
40 import org.onap.so.svnfm.simulator.repository.VnfmRepository;
41 import org.onap.so.svnfm.simulator.config.ApplicationConfig;
42 import org.onap.so.svnfm.simulator.constants.Constant;
43 import org.onap.so.svnfm.simulator.model.VnfInstance;
44 import org.onap.so.svnfm.simulator.model.VnfOperation;
45 import org.slf4j.Logger;
46 import org.slf4j.LoggerFactory;
47 import org.springframework.beans.factory.annotation.Autowired;
48 import org.springframework.cache.Cache;
49 import org.springframework.cache.CacheManager;
50 import org.springframework.cache.annotation.CachePut;
51 import org.springframework.cache.support.SimpleValueWrapper;
52 import org.springframework.stereotype.Service;
56 * @author Lathishbabu Ganesan (lathishbabu.ganesan@est.tech)
57 * @author Ronan Kenny (ronan.kenny@est.tech)
60 public class SvnfmService {
62 private VnfmRepository vnfmRepository;
63 private VnfOperationRepository vnfOperationRepository;
64 private VnfmHelper vnfmHelper;
65 private ApplicationConfig applicationConfig;
66 private CacheManager cacheManager;
68 private SubscriptionService subscriptionService;
70 private final ExecutorService executor = Executors.newCachedThreadPool();
72 private static final Logger LOGGER = LoggerFactory.getLogger(SvnfmService.class);
75 public SvnfmService(VnfmRepository vnfmRepository, VnfOperationRepository vnfOperationRepository,
76 VnfmHelper vnfmHelper, ApplicationConfig applicationConfig, CacheManager cacheManager, Vnfds vnfds,
77 SubscriptionService subscriptionService) {
78 this.vnfmRepository = vnfmRepository;
79 this.vnfOperationRepository = vnfOperationRepository;
80 this.vnfmHelper = vnfmHelper;
81 this.applicationConfig = applicationConfig;
82 this.cacheManager = cacheManager;
84 this.subscriptionService = subscriptionService;
87 public InlineResponse201 createVnf(final CreateVnfRequest createVNFRequest, final String id) {
88 InlineResponse201 inlineResponse201 = null;
90 final VnfInstance vnfInstance = vnfmHelper.createVnfInstance(createVNFRequest, id);
91 vnfmRepository.save(vnfInstance);
92 final Thread creationNotification = new Thread(new VnfmAdapterCreationNotification());
93 creationNotification.start();
94 inlineResponse201 = vnfmHelper.getInlineResponse201(vnfInstance);
95 LOGGER.debug("Response from Create VNF {}", inlineResponse201);
96 } catch (IllegalAccessException | InvocationTargetException e) {
97 LOGGER.error("Failed in Create Vnf", e);
99 return inlineResponse201;
102 @CachePut(value = Constant.IN_LINE_RESPONSE_201_CACHE, key = "#id")
103 public void updateVnf(final InstantiationStateEnum instantiationState,
104 final InlineResponse201InstantiatedVnfInfo instantiatedVnfInfo, final String id,
105 final List<InlineResponse201VimConnectionInfo> vimConnectionInfo) {
106 final InlineResponse201 vnf = getVnf(id);
107 vnf.setInstantiatedVnfInfo(instantiatedVnfInfo);
108 vnf.setInstantiationState(instantiationState);
109 vnf.setVimConnectionInfo(vimConnectionInfo);
112 public String instantiateVnf(final String vnfId) {
113 final VnfOperation vnfOperation = buildVnfOperation(InlineResponse200.OperationEnum.INSTANTIATE, vnfId);
114 vnfOperationRepository.save(vnfOperation);
115 executor.submit(new InstantiateOperationProgressor(vnfOperation, this, vnfOperationRepository,
116 applicationConfig, vnfds, subscriptionService));
117 return vnfOperation.getId();
120 private VnfOperation buildVnfOperation(final InlineResponse200.OperationEnum operation, final String vnfId) {
121 final VnfOperation vnfOperation = new VnfOperation();
122 vnfOperation.setId(UUID.randomUUID().toString());
123 vnfOperation.setOperation(operation);
124 vnfOperation.setOperationState(InlineResponse200.OperationStateEnum.STARTING);
125 vnfOperation.setVnfInstanceId(vnfId);
129 public InlineResponse200 getOperationStatus(final String operationId) {
130 LOGGER.info("Getting operation status with id: {}", operationId);
131 final Thread instantiationNotification = new Thread(new VnfInstantiationNotification());
132 instantiationNotification.start();
133 for (final VnfOperation operation : vnfOperationRepository.findAll()) {
134 LOGGER.info("Operation found: {}", operation);
135 if (operation.getId().equals(operationId)) {
136 final ModelMapper modelMapper = new ModelMapper();
137 return modelMapper.map(operation, InlineResponse200.class);
143 public InlineResponse201 getVnf(final String vnfId) {
144 final Cache ca = cacheManager.getCache(Constant.IN_LINE_RESPONSE_201_CACHE);
147 final SimpleValueWrapper wrapper = (SimpleValueWrapper) ca.get(vnfId);
150 final InlineResponse201 inlineResponse201 = (InlineResponse201) wrapper.get();
151 if (inlineResponse201 != null) {
152 LOGGER.info("Cache Read Successful");
153 return inlineResponse201;
158 public String terminateVnf(final String vnfId) {
159 final VnfOperation vnfOperation = buildVnfOperation(InlineResponse200.OperationEnum.TERMINATE, vnfId);
160 vnfOperationRepository.save(vnfOperation);
161 executor.submit(new TerminateOperationProgressor(vnfOperation, this, vnfOperationRepository, applicationConfig,
162 vnfds, subscriptionService));
163 return vnfOperation.getId();
166 public void registerSubscription(final LccnSubscriptionRequest subscription) {
167 subscriptionService.registerSubscription(subscription);