Move the VNFM Simulator into CSIT
[integration/csit.git] / plans / so / integration-etsi-testing / so-simulators / vnfm-simulator / vnfm-service / src / main / java / org / onap / so / svnfm / simulator / services / SvnfmService.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.svnfm.simulator.services;
22
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;
53
54 /**
55  *
56  * @author Lathishbabu Ganesan (lathishbabu.ganesan@est.tech)
57  * @author Ronan Kenny (ronan.kenny@est.tech)
58  */
59 @Service
60 public class SvnfmService {
61
62     private VnfmRepository vnfmRepository;
63     private VnfOperationRepository vnfOperationRepository;
64     private VnfmHelper vnfmHelper;
65     private ApplicationConfig applicationConfig;
66     private CacheManager cacheManager;
67     private Vnfds vnfds;
68     private SubscriptionService subscriptionService;
69
70     private final ExecutorService executor = Executors.newCachedThreadPool();
71
72     private static final Logger LOGGER = LoggerFactory.getLogger(SvnfmService.class);
73
74     @Autowired
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;
83         this.vnfds = vnfds;
84         this.subscriptionService = subscriptionService;
85     }
86
87     public InlineResponse201 createVnf(final CreateVnfRequest createVNFRequest, final String id) {
88         InlineResponse201 inlineResponse201 = null;
89         try {
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);
98         }
99         return inlineResponse201;
100     }
101
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);
110     }
111
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();
118     }
119
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);
126         return vnfOperation;
127     }
128
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);
138             }
139         }
140         return null;
141     }
142
143     public InlineResponse201 getVnf(final String vnfId) {
144         final Cache ca = cacheManager.getCache(Constant.IN_LINE_RESPONSE_201_CACHE);
145         if (ca == null)
146             return null;
147         final SimpleValueWrapper wrapper = (SimpleValueWrapper) ca.get(vnfId);
148         if (wrapper == null)
149             return null;
150         final InlineResponse201 inlineResponse201 = (InlineResponse201) wrapper.get();
151         if (inlineResponse201 != null) {
152             LOGGER.info("Cache Read Successful");
153             return inlineResponse201;
154         }
155         return null;
156     }
157
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();
164     }
165
166     public void registerSubscription(final LccnSubscriptionRequest subscription) {
167         subscriptionService.registerSubscription(subscription);
168     }
169 }