Fix sonar issue vfc-adaptor
[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
64         ////////////////////////// Builder class
65
66         public static class TerminateVnfContinueRunnableBuilder {
67                 private String vnfmId;
68                 private TerminateVnfRequest driverRequest;
69                 private String vnfInstanceId;
70                 private String jobId;
71                 private NslcmMgmrInf nslcmMgmr;
72                 private CbamMgmrInf cbamMgmr;
73                 private Driver2CbamRequestConverter requestConverter;
74                 private VnfmJobExecutionMapper dbManager;
75                 private VnfcResourceInfoMapper vnfcDbMgmr;
76
77                 public TerminateVnfContinueRunnableBuilder setVnfmId(String vnfmId) {
78                         this.vnfmId = vnfmId;
79                         return this;
80                 }
81
82                 public TerminateVnfContinueRunnableBuilder setDriverRequest(TerminateVnfRequest driverRequest) {
83                         this.driverRequest = driverRequest;
84                         return this;
85                 }
86
87                 public TerminateVnfContinueRunnableBuilder setVnfInstanceId(String vnfInstanceId) {
88                         this.vnfInstanceId = vnfInstanceId;
89                         return this;
90                 }
91
92                 public TerminateVnfContinueRunnableBuilder setJobId(String jobId) {
93                         this.jobId = jobId;
94                         return this;
95                 }
96
97                 public TerminateVnfContinueRunnableBuilder setNslcmMgmr(NslcmMgmrInf nslcmMgmr) {
98                         this.nslcmMgmr = nslcmMgmr;
99                         return this;
100                 }
101
102                 public TerminateVnfContinueRunnableBuilder setCbamMgmr(CbamMgmrInf cbamMgmr) {
103                         this.cbamMgmr = cbamMgmr;
104                         return this;
105                 }
106
107                 public TerminateVnfContinueRunnableBuilder setRequestConverter(Driver2CbamRequestConverter requestConverter) {
108                         this.requestConverter = requestConverter;
109                         return this;
110                 }
111
112                 public TerminateVnfContinueRunnableBuilder setDbManager(VnfmJobExecutionMapper dbManager) {
113                         this.dbManager = dbManager;
114                         return this;
115                 }
116
117                 public TerminateVnfContinueRunnableBuilder setVnfcDbMgmr(VnfcResourceInfoMapper vnfcDbMgmr) {
118                         this.vnfcDbMgmr = vnfcDbMgmr;
119                         return this;
120                 }
121
122                 public TerminateVnfContinueRunnable build(){
123                         return new TerminateVnfContinueRunnable(this);
124                 }
125
126
127         }
128
129
130         public TerminateVnfContinueRunnable(TerminateVnfContinueRunnableBuilder builder)
131         {
132                 this.driverRequest = builder.driverRequest;
133                 this.vnfInstanceId =  builder.vnfInstanceId;
134                 this.nslcmMgmr =  builder.nslcmMgmr;
135                 this.cbamMgmr =  builder.cbamMgmr;
136                 this.requestConverter =  builder.requestConverter;
137                 this.jobId =  builder.jobId;
138                 this.jobDbMgmr =  builder.dbManager;
139                 this.vnfmId =  builder.vnfmId;
140                 this.vnfcDbMgmr =  builder.vnfcDbMgmr;
141         }
142
143
144         private void handleGrant(){
145                 try {
146                         NslcmGrantVnfRequest grantRequest = buildNslcmGrantVnfRequest();
147                         nslcmMgmr.grantVnf(grantRequest);
148                 } catch (Exception e) {
149                         logger.error("TerminateVnfContinueRunnable --> handleGrant error.", e);
150                 }
151         }
152         
153         public void run() {
154                 handleGrant();
155                 handleTerminate();
156                 handleDelete();
157         }
158         
159     private void handleDelete() {
160         try {
161             boolean vnfAllowDelete = false;
162             int i = 0;
163             while (!vnfAllowDelete) {
164                 CBAMQueryVnfResponse queryResponse = cbamMgmr.queryVnf(vnfInstanceId);
165                 if (CommonEnum.InstantiationState.NOT_INSTANTIATED == queryResponse.getInstantiationState()) {
166                     vnfAllowDelete = true;
167                     break;
168                 }
169                 i++;
170                 logger.info(i + ": The vnf's current status is " + queryResponse.getInstantiationState().name()
171                         + " is not ready for deleting, please wait ... ");
172                 Thread.sleep(30000);
173             }
174             prepareDelete(jobId);
175             cbamMgmr.deleteVnf(vnfInstanceId);
176         } catch (Exception e) {
177             logger.error("TerminateVnfContinueRunnable --> handleDelete error.", e);
178         }
179     }
180         
181         private void prepareDelete(String jobId) {
182                 long nowTime = System.currentTimeMillis();
183                 VnfmJobExecutionInfo jobInfo = jobDbMgmr.findOne(Long.parseLong(jobId));
184                 jobInfo.setStatus(CommonConstants.CBAM_OPERATION_STATUS_FINISH);
185                 jobInfo.setOperateEndTime(nowTime);
186                 jobDbMgmr.update(jobInfo);
187                 
188                 try {
189                         NslcmNotifyLCMEventsRequest nslcmNotifyReq = buildNslcmNotifyLCMEventsRequest();
190                         nslcmMgmr.notifyVnf(nslcmNotifyReq, vnfmId, vnfInstanceId);
191                 } catch (Exception e) {
192                         logger.error("TerminateVnfContinueRunnable --> handleNotify error.", e);
193                 }
194         }
195
196         private CBAMTerminateVnfResponse handleTerminate() {
197                 CBAMTerminateVnfResponse cbamResponse = null;
198                 try {
199                         CBAMTerminateVnfRequest  modifyReq = requestConverter.terminateReqConvert(driverRequest);
200                         cbamResponse = cbamMgmr.terminateVnf(modifyReq, vnfInstanceId);
201                         handleCbamTerminateResponse(cbamResponse, jobId);
202                 } catch (Exception e) {
203                         logger.error("TerminateVnfContinueRunnable --> handleTerminate error.", e);
204                 }
205                 
206                 return cbamResponse;
207         }
208
209         private void handleCbamTerminateResponse(CBAMTerminateVnfResponse cbamResponse, String jobId) {
210                 VnfmJobExecutionInfo jobInfo = jobDbMgmr.findOne(Long.parseLong(jobId));
211                 
212                 jobInfo.setVnfmExecutionId(cbamResponse.getId());
213                 if(CommonEnum.OperationStatus.FAILED == cbamResponse.getStatus()) {
214                         jobInfo.setStatus(CommonConstants.CBAM_OPERATION_STATUS_ERROR);
215                 }
216                 else {
217                         jobInfo.setStatus(CommonConstants.CBAM_OPERATION_STATUS_PROCESSING);
218                 }
219                 jobDbMgmr.update(jobInfo);
220         }
221         
222         private NslcmGrantVnfRequest buildNslcmGrantVnfRequest() {
223                 NslcmGrantVnfRequest request = new NslcmGrantVnfRequest();
224                 
225                 request.setVnfInstanceId(vnfInstanceId);
226                 request.setLifecycleOperation(LifecycleOperation.Terminal);
227                 request.setJobId(jobId);
228                 
229                 ResourceDefinition resource = getFreeVnfResource();
230                 List<ResourceDefinition> resourceList = new ArrayList<ResourceDefinition>();
231                 resourceList.add(resource);
232                 request.setRemoveResource(resourceList);
233                 
234                 return request;
235         }
236         
237         private ResourceDefinition getFreeVnfResource() {
238                 ResourceDefinition def = new ResourceDefinition();
239                 def.setVnfInstanceId(vnfInstanceId);
240                 def.setVimId("001");
241                 List<AddResource> resources = new ArrayList<>();
242                 AddResource res = new AddResource();
243                 res.setVdu("1");
244                 res.setType("vdu");
245                 res.setResourceDefinitionId(2);
246                 resources.add(res);
247                 def.setAddResource(resources);
248                 return def;
249         }
250
251         private NslcmNotifyLCMEventsRequest buildNslcmNotifyLCMEventsRequest() {
252                 NslcmNotifyLCMEventsRequest request = new NslcmNotifyLCMEventsRequest();
253                 request.setStatus(CommonEnum.status.result);
254                 List<AffectedVnfc> vnfcsFromDb = vnfcDbMgmr.getAllByInstanceId(vnfInstanceId);
255                 List<AffectedVnfc> vnfcs = modifyResourceTypeAsRemove(vnfcsFromDb);
256                 
257                 request.setAffectedVnfc(vnfcs);
258                 request.setVnfInstanceId(vnfInstanceId);
259                 request.setOperation(CommonConstants.NSLCM_OPERATION_TERMINATE);
260                 request.setJobId(jobId);
261                 return request;
262         }
263
264         private List<AffectedVnfc> modifyResourceTypeAsRemove(List<AffectedVnfc> affectedVnfc) {
265                 List<AffectedVnfc> vnfcs = affectedVnfc;
266                 if(vnfcs != null && !vnfcs.isEmpty()) {
267                         for(AffectedVnfc vnfc : vnfcs)
268                         {
269                                 vnfc.setChangeType(CommonEnum.AffectchangeType.removed);
270                         }
271                 }
272                 
273                 if(vnfcs == null) {
274                         vnfcs = new ArrayList<>();
275                 }
276                 
277                 return vnfcs;
278         }
279
280         public void setDriverRequest(TerminateVnfRequest driverRequest) {
281                 this.driverRequest = driverRequest;
282         }
283
284         public void setVnfInstanceId(String vnfInstanceId) {
285                 this.vnfInstanceId = vnfInstanceId;
286         }
287
288         public void setJobId(String jobId) {
289                 this.jobId = jobId;
290         }
291
292         public void setVnfmId(String vnfmId) {
293                 this.vnfmId = vnfmId;
294         }
295
296         public void setRequestConverter(Driver2CbamRequestConverter requestConverter) {
297                 this.requestConverter = requestConverter;
298         }
299 }