Improve unit-test coverage
[vfc/nfvo/driver/vnfm/svnfm.git] / nokia / vnfmdriver / vfcadaptorservice / vfcadaptor / src / main / java / org / onap / vfc / nfvo / driver / vnfm / svnfm / adaptor / TerminateVnfContinueRunnable.java
1 /*
2  * Copyright 2016-2017, Nokia Corporation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package org.onap.vfc.nfvo.driver.vnfm.svnfm.adaptor;
18
19 import java.util.ArrayList;
20 import java.util.List;
21
22 import org.onap.vfc.nfvo.driver.vnfm.svnfm.cbam.bo.CBAMQueryVnfResponse;
23 import org.onap.vfc.nfvo.driver.vnfm.svnfm.cbam.bo.CBAMTerminateVnfRequest;
24 import org.onap.vfc.nfvo.driver.vnfm.svnfm.cbam.bo.CBAMTerminateVnfResponse;
25 import org.onap.vfc.nfvo.driver.vnfm.svnfm.cbam.inf.CbamMgmrInf;
26 import org.onap.vfc.nfvo.driver.vnfm.svnfm.constant.CommonConstants;
27 import org.onap.vfc.nfvo.driver.vnfm.svnfm.constant.CommonEnum;
28 import org.onap.vfc.nfvo.driver.vnfm.svnfm.constant.CommonEnum.LifecycleOperation;
29 import org.onap.vfc.nfvo.driver.vnfm.svnfm.db.bean.VnfmJobExecutionInfo;
30 import org.onap.vfc.nfvo.driver.vnfm.svnfm.db.mapper.VnfcResourceInfoMapper;
31 import org.onap.vfc.nfvo.driver.vnfm.svnfm.db.mapper.VnfmJobExecutionMapper;
32 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nslcm.bo.NslcmGrantVnfRequest;
33 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nslcm.bo.NslcmGrantVnfResponse;
34 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nslcm.bo.NslcmNotifyLCMEventsRequest;
35 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nslcm.bo.entity.AddResource;
36 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nslcm.bo.entity.AffectedVnfc;
37 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nslcm.bo.entity.ResourceDefinition;
38 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nslcm.inf.NslcmMgmrInf;
39 import org.onap.vfc.nfvo.driver.vnfm.svnfm.vnfmdriver.bo.TerminateVnfRequest;
40 import org.slf4j.Logger;
41 import org.slf4j.LoggerFactory;
42 import org.springframework.beans.factory.annotation.Autowired;
43
44 public class TerminateVnfContinueRunnable implements Runnable {
45         private static final Logger logger = LoggerFactory.getLogger(TerminateVnfContinueRunnable.class);
46
47         @Autowired
48         private CbamMgmrInf cbamMgmr;
49         @Autowired
50         private NslcmMgmrInf nslcmMgmr;
51         
52         private TerminateVnfRequest driverRequest;
53         private String vnfInstanceId;
54         private String jobId;
55         private String vnfmId;
56         @Autowired
57         private VnfmJobExecutionMapper jobDbMgmr;
58         @Autowired
59         private VnfcResourceInfoMapper vnfcDbMgmr;
60         
61         private Driver2CbamRequestConverter requestConverter;
62         
63         public TerminateVnfContinueRunnable(String vnfmId, TerminateVnfRequest driverRequest, String vnfInstanceId, String jobId,
64                         NslcmMgmrInf nslcmMgmr, CbamMgmrInf cbamMgmr, Driver2CbamRequestConverter requestConverter, VnfmJobExecutionMapper dbManager, VnfcResourceInfoMapper vnfcDbMgmr)
65         {
66                 this.driverRequest = driverRequest;
67                 this.vnfInstanceId = vnfInstanceId;
68                 this.nslcmMgmr = nslcmMgmr; 
69                 this.cbamMgmr = cbamMgmr;
70                 this.requestConverter = requestConverter;
71                 this.jobId = jobId;
72                 this.jobDbMgmr = dbManager;
73                 this.vnfmId = vnfmId;
74                 this.vnfcDbMgmr = vnfcDbMgmr;
75         }
76         
77         private void handleGrant(){
78                 try {
79                         NslcmGrantVnfRequest grantRequest = buildNslcmGrantVnfRequest();
80                         nslcmMgmr.grantVnf(grantRequest);
81                 } catch (Exception e) {
82                         logger.error("TerminateVnfContinueRunnable --> handleGrant error.", e);
83                 }
84         }
85         
86         public void run() {
87                 handleGrant();
88                 handleTerminate();
89                 handleDelete();
90         }
91         
92         private void handleDelete() {
93                 try {
94                         boolean vnfAllowDelete = false;
95                         int i = 0;
96                         while(!vnfAllowDelete) {
97                                 CBAMQueryVnfResponse queryResponse = cbamMgmr.queryVnf(vnfInstanceId);
98                                 if(CommonEnum.InstantiationState.NOT_INSTANTIATED == queryResponse.getInstantiationState())
99                                 {
100                                         vnfAllowDelete = true;
101                                         break;
102                                 }
103                                 i++;
104                                 logger.info(i + ": The vnf's current status is " + queryResponse.getInstantiationState().name() + " is not ready for deleting, please wait ... ");
105                                 Thread.sleep(30000);
106                         }
107                         prepareDelete(jobId);
108                         cbamMgmr.deleteVnf(vnfInstanceId);
109                 } catch (Exception e) {
110                         logger.error("TerminateVnfContinueRunnable --> handleDelete error.", e);
111                 }
112         }
113         
114         private void prepareDelete(String jobId) {
115                 long nowTime = System.currentTimeMillis();
116                 VnfmJobExecutionInfo jobInfo = jobDbMgmr.findOne(Long.parseLong(jobId));
117                 jobInfo.setStatus(CommonConstants.CBAM_OPERATION_STATUS_FINISH);
118                 jobInfo.setOperateEndTime(nowTime);
119                 jobDbMgmr.update(jobInfo);
120                 
121                 try {
122                         NslcmNotifyLCMEventsRequest nslcmNotifyReq = buildNslcmNotifyLCMEventsRequest();
123                         nslcmMgmr.notifyVnf(nslcmNotifyReq, vnfmId, vnfInstanceId);
124                 } catch (Exception e) {
125                         logger.error("TerminateVnfContinueRunnable --> handleNotify error.", e);
126                 }
127         }
128
129         private CBAMTerminateVnfResponse handleTerminate() {
130                 CBAMTerminateVnfResponse cbamResponse = null;
131                 try {
132                         CBAMTerminateVnfRequest  modifyReq = requestConverter.terminateReqConvert(driverRequest);
133                         cbamResponse = cbamMgmr.terminateVnf(modifyReq, vnfInstanceId);
134                         handleCbamTerminateResponse(cbamResponse, jobId);
135                 } catch (Exception e) {
136                         logger.error("TerminateVnfContinueRunnable --> handleTerminate error.", e);
137                 }
138                 
139                 return cbamResponse;
140         }
141
142         private void handleCbamTerminateResponse(CBAMTerminateVnfResponse cbamResponse, String jobId) {
143                 VnfmJobExecutionInfo jobInfo = jobDbMgmr.findOne(Long.parseLong(jobId));
144                 
145                 jobInfo.setVnfmExecutionId(cbamResponse.getId());
146                 if(CommonEnum.OperationStatus.FAILED == cbamResponse.getStatus()) {
147                         jobInfo.setStatus(CommonConstants.CBAM_OPERATION_STATUS_ERROR);
148                 }
149                 else {
150                         jobInfo.setStatus(CommonConstants.CBAM_OPERATION_STATUS_PROCESSING);
151                 }
152                 jobDbMgmr.update(jobInfo);
153         }
154         
155         private NslcmGrantVnfRequest buildNslcmGrantVnfRequest() {
156                 NslcmGrantVnfRequest request = new NslcmGrantVnfRequest();
157                 
158                 request.setVnfInstanceId(vnfInstanceId);
159                 request.setLifecycleOperation(LifecycleOperation.Terminal);
160                 request.setJobId(jobId);
161                 
162                 ResourceDefinition resource = getFreeVnfResource();
163                 List<ResourceDefinition> resourceList = new ArrayList<ResourceDefinition>();
164                 resourceList.add(resource);
165                 request.setRemoveResource(resourceList);
166                 
167                 return request;
168         }
169         
170         private ResourceDefinition getFreeVnfResource() {
171                 ResourceDefinition def = new ResourceDefinition();
172                 def.setVnfInstanceId(vnfInstanceId);
173                 def.setVimId("001");
174                 List<AddResource> resources = new ArrayList<>();
175                 AddResource res = new AddResource();
176                 res.setVdu("1");
177                 res.setType("vdu");
178                 res.setResourceDefinitionId(2);
179                 resources.add(res);
180                 def.setAddResource(resources);
181                 return def;
182         }
183
184         private NslcmNotifyLCMEventsRequest buildNslcmNotifyLCMEventsRequest() {
185                 NslcmNotifyLCMEventsRequest request = new NslcmNotifyLCMEventsRequest();
186                 request.setStatus(CommonEnum.status.result);
187                 List<AffectedVnfc> vnfcsFromDb = vnfcDbMgmr.getAllByInstanceId(vnfInstanceId);
188                 List<AffectedVnfc> vnfcs = modifyResourceTypeAsRemove(vnfcsFromDb);
189                 
190                 request.setAffectedVnfc(vnfcs);
191                 request.setVnfInstanceId(vnfInstanceId);
192                 request.setOperation(CommonConstants.NSLCM_OPERATION_TERMINATE);
193                 request.setJobId(jobId);
194                 return request;
195         }
196
197         private List<AffectedVnfc> modifyResourceTypeAsRemove(List<AffectedVnfc> affectedVnfc) {
198                 List<AffectedVnfc> vnfcs = affectedVnfc;
199                 if(vnfcs != null && !vnfcs.isEmpty()) {
200                         for(AffectedVnfc vnfc : vnfcs)
201                         {
202                                 vnfc.setChangeType(CommonEnum.AffectchangeType.removed);
203                         }
204                 }
205                 
206                 if(vnfcs == null) {
207                         vnfcs = new ArrayList<>();
208                 }
209                 
210                 return vnfcs;
211         }
212
213         public void setDriverRequest(TerminateVnfRequest driverRequest) {
214                 this.driverRequest = driverRequest;
215         }
216
217         public void setVnfInstanceId(String vnfInstanceId) {
218                 this.vnfInstanceId = vnfInstanceId;
219         }
220
221         public void setJobId(String jobId) {
222                 this.jobId = jobId;
223         }
224
225         public void setVnfmId(String vnfmId) {
226                 this.vnfmId = vnfmId;
227         }
228
229         public void setRequestConverter(Driver2CbamRequestConverter requestConverter) {
230                 this.requestConverter = requestConverter;
231         }
232 }