AT&T 1712 and 1802 release code
[so.git] / mso-api-handlers / mso-api-handler-infra / src / main / java / org / openecomp / mso / apihandlerinfra / tenantisolation / process / ActivateVnfStatusOperationalEnvironment.java
1 /*-\r
2  * ============LICENSE_START=======================================================\r
3  * ONAP - SO\r
4  * ================================================================================\r
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.\r
6  * ================================================================================\r
7  * Licensed under the Apache License, Version 2.0 (the "License");\r
8  * you may not use this file except in compliance with the License.\r
9  * You may obtain a copy of the License at\r
10  * \r
11  *      http://www.apache.org/licenses/LICENSE-2.0\r
12  * \r
13  * Unless required by applicable law or agreed to in writing, software\r
14  * distributed under the License is distributed on an "AS IS" BASIS,\r
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16  * See the License for the specific language governing permissions and\r
17  * limitations under the License.\r
18  * ============LICENSE_END=========================================================\r
19  */\r
20 \r
21 package org.openecomp.mso.apihandlerinfra.tenantisolation.process;\r
22 \r
23 import java.util.HashMap;\r
24 import java.util.List;\r
25 import java.util.Map;\r
26 \r
27 import org.json.JSONObject;\r
28 import org.openecomp.mso.apihandlerinfra.MsoPropertiesUtils;\r
29 import org.openecomp.mso.apihandlerinfra.tenantisolation.CloudOrchestrationRequest;\r
30 import org.openecomp.mso.apihandlerinfra.tenantisolation.exceptions.AsdcClientCallFailed;\r
31 import org.openecomp.mso.apihandlerinfra.tenantisolation.exceptions.TenantIsolationException;\r
32 import org.openecomp.mso.apihandlerinfra.tenantisolation.helpers.AsdcClientHelper;\r
33 import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.Distribution;\r
34 import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.DistributionStatus;\r
35 import org.openecomp.mso.logger.MsoLogger;\r
36 import org.openecomp.mso.properties.MsoJavaProperties;\r
37 import org.openecomp.mso.requestsdb.OperationalEnvDistributionStatus;\r
38 import org.openecomp.mso.requestsdb.OperationalEnvDistributionStatusDb;\r
39 import org.openecomp.mso.requestsdb.OperationalEnvServiceModelStatus;\r
40 import org.openecomp.mso.requestsdb.OperationalEnvServiceModelStatusDb;\r
41 \r
42 \r
43 public class ActivateVnfStatusOperationalEnvironment extends OperationalEnvironmentProcess {\r
44 \r
45         private static final String SERVICE_NAME = "ActivateVnfStatusOperationalEnvironment"; \r
46         private AsdcClientHelper asdcClientHelper = null;\r
47         \r
48         private static MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.APIH);\r
49         private String className = this.getClass().getSimpleName();\r
50         private String methodName = "";\r
51         private String classMethodMessage = "";\r
52         private String errorMessage = "";\r
53         \r
54         private String operationalEnvironmentId = "";\r
55         private boolean successIndicator = false;\r
56         \r
57         MsoJavaProperties properties; \r
58         OperationalEnvDistributionStatusDb activateDistributionDb = null;\r
59         OperationalEnvDistributionStatus queryDistributionDbResponse = null;\r
60         OperationalEnvServiceModelStatusDb activateServiceModelDb = null; \r
61         OperationalEnvServiceModelStatus queryServiceModelResponse = null;\r
62         \r
63         /**\r
64          * The class constructor with loadProperties()\r
65          * @param CloudOrchestrationRequest - object   \r
66          * @param requestId - string      \r
67          */             \r
68         public ActivateVnfStatusOperationalEnvironment(CloudOrchestrationRequest request, String requestId) {\r
69                 super(request, requestId);\r
70                 MsoLogger.setServiceName (getRequestId());\r
71         MsoLogger.setLogContext(getRequestId(), getRequest().getOperationalEnvironmentId());            \r
72                 this.properties = MsoPropertiesUtils.loadMsoProperties();\r
73                 asdcClientHelper = new AsdcClientHelper(properties);\r
74         }\r
75         \r
76         @Override\r
77         protected String getServiceName() {\r
78                 return ActivateVnfStatusOperationalEnvironment.SERVICE_NAME;\r
79         }       \r
80         \r
81 \r
82         /**\r
83          * The Point-Of-Entry from APIH with activate status from ASDC\r
84          * @return void - nothing \r
85          */\r
86         @Override\r
87         public void execute() {\r
88         \r
89                 methodName = "execute() method. ";\r
90                 classMethodMessage = className + " " + methodName;\r
91                 msoLogger.debug("Begin of " + classMethodMessage);      \r
92 \r
93                 activateDistributionDb = getOperationalEnvDistributionStatusDb();               \r
94                 activateServiceModelDb = getOperationalEnvServiceModelStatusDb();\r
95                 \r
96                 try {\r
97                         \r
98                         String asdcDistributionId = request.getDistributionId();\r
99                         Distribution distributionObject = request.getDistribution();\r
100                         msoLogger.debug(" ** asdcDistributionId: " + asdcDistributionId + ";" +  " status: " +  request.getDistribution().getStatus());\r
101                         \r
102                         // Distribution, Query for operationalEnvironmentId, serviceModelVersionId\r
103                         queryDistributionDbResponse = activateDistributionDb.getOperationalEnvDistributionStatus(asdcDistributionId);\r
104                         \r
105                         if(queryDistributionDbResponse == null) {\r
106                                 throw new TenantIsolationException("DistributionId doesn't exist in the DB: " + asdcDistributionId);\r
107                         }\r
108                         \r
109                         String operationalEnvironmentId = queryDistributionDbResponse.getOperationalEnvId();\r
110                         this.operationalEnvironmentId = operationalEnvironmentId;\r
111                         String serviceModelVersionId = queryDistributionDbResponse.getServiceModelVersionId();\r
112 \r
113                         // ServiceModel, Query for dbRequestId, recoveryAction, retryCountString\r
114                         queryServiceModelResponse =  activateServiceModelDb.getOperationalEnvServiceModelStatus(operationalEnvironmentId, serviceModelVersionId);\r
115                         String origRequestId = queryServiceModelResponse.getRequestId();                \r
116                         this.requestId = origRequestId;\r
117                         \r
118                         msoLogger.debug("Start of processing activation status.");\r
119                         processActivateASDCStatus(asdcDistributionId, distributionObject);\r
120                         msoLogger.debug("End of processing activation status.");\r
121                         \r
122                         // After EVERY status processed, need to query the status of all service modelId \r
123                         //  to determine the OVERALL status if "COMPLETE" or "FAILURE":\r
124                         checkOrUpdateOverallStatus(origRequestId, operationalEnvironmentId);                    \r
125 \r
126                         msoLogger.debug("End of " + classMethodMessage);\r
127                         \r
128                 } catch (Exception ex) {\r
129                         errorMessage = "** OVERALL status of flow: " + methodName + ex.getMessage();\r
130                         msoLogger.debug(errorMessage);\r
131                         getRequestDb().updateInfraFailureCompletion(errorMessage, requestId, operationalEnvironmentId);\r
132 \r
133                 }\r
134                 \r
135         }\r
136         \r
137         /**\r
138          * The Method to process the Activation Status from ASDC\r
139          * @param asdcDistributionId - string\r
140          * @param Distribution - object    \r
141          * @return void - nothing \r
142          */                     \r
143         public void processActivateASDCStatus(String asdcDistributionId, Distribution asdcStatus) throws TenantIsolationException { \r
144                 \r
145                 String operationalEnvironmentId = queryDistributionDbResponse.getOperationalEnvId();\r
146                 String serviceModelVersionId = queryDistributionDbResponse.getServiceModelVersionId();          \r
147                 \r
148                 String origRequestId = queryServiceModelResponse.getRequestId();                \r
149                 String recoveryAction = queryServiceModelResponse.getRecoveryAction();\r
150                 int retryCount = queryServiceModelResponse.getRetryCount();\r
151                 String workloadContext  = queryServiceModelResponse.getWorkloadContext();\r
152 \r
153                 // Validate/process status\r
154                 if (asdcStatus.getStatus().toString().equals(DistributionStatus.DISTRIBUTION_COMPLETE_OK.toString())) {\r
155                         // should update 1 row, update status to "DISTRIBUTION_COMPLETE_OK"\r
156                         activateDistributionDb.updateOperationalEnvDistributionStatus(asdcStatus.getStatus().toString(), asdcDistributionId, operationalEnvironmentId, serviceModelVersionId);\r
157                         // should update 1 row, update status and retryCount = 0 (ie, serviceModelVersionId is DONE!)\r
158                         activateServiceModelDb.updateOperationalEnvRetryCountStatus(operationalEnvironmentId, serviceModelVersionId, asdcStatus.getStatus().toString(), 0);\r
159                 \r
160                 } else {\r
161                         \r
162                           // "DISTRIBUTION_COMPLETE_ERROR", Check if recoveryAction is "RETRY" \r
163                           if (recoveryAction.equals("RETRY") & retryCount > 0) {\r
164                                         // RESEND / RETRY serviceModelVersionId to ASDC    \r
165                                         JSONObject jsonResponse = null;\r
166                                         String newDistributionId = "";\r
167                                         try {\r
168                                                 jsonResponse = asdcClientHelper.postActivateOperationalEnvironment(serviceModelVersionId, operationalEnvironmentId, workloadContext);\r
169                                                 String statusCode = jsonResponse.get("statusCode").toString();\r
170                                                 if (statusCode.equals("202")) {\r
171                                                         newDistributionId = jsonResponse.get("distributionId").toString();\r
172                                                         \r
173                                                         // should insert 1 row, NEW distributionId for old serviceModelServiceId\r
174                                                         activateDistributionDb.insertOperationalEnvDistributionStatus(newDistributionId, operationalEnvironmentId, serviceModelVersionId, "SENT", origRequestId);                                       \r
175                                                                         \r
176                                                         // update retryCount (less 1) for the serviceModelServiceId\r
177                                                         retryCount = retryCount - 1;\r
178                                                         // should update 1 row, original insert\r
179                                                         activateServiceModelDb.updateOperationalEnvRetryCountStatusPerReqId(operationalEnvironmentId, serviceModelVersionId, asdcStatus.getStatus().toString(), retryCount, origRequestId);\r
180                                 \r
181                                                         // should update 1 row, OLD distributionId set to status error (ie, old distributionId is DONE!).  \r
182                                                         activateDistributionDb.updateOperationalEnvDistributionStatus(DistributionStatus.DISTRIBUTION_COMPLETE_ERROR.toString(), asdcDistributionId, operationalEnvironmentId, serviceModelVersionId);\r
183                                                         \r
184                                                 } else {                                        \r
185                                                         errorMessage = " Failure calling ASDC: statusCode: " + statusCode + \r
186                                                                          "; messageId: " + jsonResponse.get("messageId") +\r
187                                                                          "; message: " + jsonResponse.get("message"); \r
188                                                         msoLogger.debug(errorMessage);\r
189                                                         throw new AsdcClientCallFailed(errorMessage);\r
190                                                         \r
191                                                 } \r
192                                                 \r
193                                         } catch (Exception ex) {\r
194                                                 errorMessage = " Encountered Exception in " + methodName + " Exception: " + ex.getMessage();\r
195                                                 msoLogger.debug(errorMessage);\r
196                                                 throw new TenantIsolationException(errorMessage);       \r
197                                         }\r
198                                         \r
199                 \r
200                          } else { // either RETRY & Count = 0, or 'ABORT', or 'SKIP' \r
201 \r
202                                         if (recoveryAction.equals("SKIP") || recoveryAction.equals("ABORT")) {\r
203                                                 String modifiedStatus = "";\r
204                                                 if (recoveryAction.equals("SKIP")) {  // considered SUCCESS\r
205                                                         modifiedStatus = DistributionStatus.DISTRIBUTION_COMPLETE_OK.toString();\r
206                                                 } else { \r
207                                                         if (recoveryAction.equals("ABORT")) {\r
208                                                                 modifiedStatus = DistributionStatus.DISTRIBUTION_COMPLETE_ERROR.toString();  // ABORT, error\r
209                                                         }\r
210                                                 }       \r
211                                                 // should update 1 row, modified status & retryCount set 0\r
212                                                 activateServiceModelDb.updateOperationalEnvRetryCountStatus(operationalEnvironmentId, serviceModelVersionId, modifiedStatus, 0);\r
213                                                 // should update 1 row, modified status\r
214                                                 activateDistributionDb.updateOperationalEnvDistributionStatus(modifiedStatus, asdcDistributionId, operationalEnvironmentId, serviceModelVersionId);\r
215                                                 \r
216                                         } else {\r
217                                                 // RETRY & Count = 0 (do nothing!)\r
218                                         }       \r
219                           }             \r
220                 \r
221                 } \r
222 \r
223         }\r
224         \r
225         /**\r
226          * The Method to check the overall status of the Activation for an operationalEnvironmentId\r
227          * @param origRequestId - string\r
228          * @param operationalEnvironmentId - string   \r
229          * @return void - nothing \r
230          * @throws Exception \r
231          */             \r
232         public void checkOrUpdateOverallStatus(String origRequestId, String operationalEnvironmentId) throws Exception {\r
233                 \r
234                 List<OperationalEnvServiceModelStatus> queryServiceModelResponseList = activateServiceModelDb.getOperationalEnvIdStatus(operationalEnvironmentId, origRequestId);\r
235                 msoLogger.debug(" **** queryServiceModelResponseList.size(): " + queryServiceModelResponseList.size());\r
236                 \r
237                 String status = "Waiting";\r
238                 int count = 0;\r
239                 // loop through the statuses of the service model\r
240                 for (OperationalEnvServiceModelStatus  queryServiceModelResponse : queryServiceModelResponseList) {\r
241                                 status = queryServiceModelResponse.getServiceModelVersionDistrStatus();\r
242                                 // all should be OK to be completed.\r
243                                 if ((status.equals(DistributionStatus.DISTRIBUTION_COMPLETE_OK.toString()) &&\r
244                                         (queryServiceModelResponse.getRetryCount() == 0))) {\r
245                                         status = "Completed";\r
246                                         count ++;                                       \r
247                                 } \r
248                                 // one error with zero retry, means all are failures.\r
249                                 if ((status.equals(DistributionStatus.DISTRIBUTION_COMPLETE_ERROR.toString()) &&\r
250                                         (queryServiceModelResponse.getRetryCount() == 0))) {\r
251                                         status = "Failure";\r
252                                         count = queryServiceModelResponseList.size();\r
253                                         break;\r
254                                 } \r
255                                 \r
256                 }\r
257                 \r
258                 //  "DISTRIBUTION_COMPLETE_OK"    : Completed / Successful\r
259                 if (status == "Completed" && queryServiceModelResponseList.size() == count) {\r
260                         executeAAIPatch(operationalEnvironmentId);\r
261                         String messageStatus = "Overall Activation process is complete. " + status;\r
262                         successIndicator = true;\r
263                         msoLogger.debug(messageStatus);\r
264                         //      Update DB to COMPLETION\r
265                         getRequestDb().updateInfraSuccessCompletion(messageStatus, origRequestId, operationalEnvironmentId);\r
266                 } else {        \r
267                         //  "DISTRIBUTION_COMPLETE_ERROR"  : Failure\r
268                         if (status == "Failure" && queryServiceModelResponseList.size() == count) {\r
269                                 errorMessage = "Overall Activation process is a Failure. " + status;\r
270                                 msoLogger.debug(errorMessage);\r
271                                 getRequestDb().updateInfraFailureCompletion(errorMessage, requestId, operationalEnvironmentId);\r
272                         } else {        \r
273                           msoLogger.debug(" **** Still waiting for more distribution status!"); // 1+ rows\r
274                         } \r
275                 }       \r
276 \r
277         }       \r
278         \r
279         private void executeAAIPatch(String operationalEnvironmentId) throws Exception {\r
280                 msoLogger.debug("Start of AA&I UPDATE client call in ActivateVnfStatusOperationalEnvironment");\r
281                 \r
282                 Map<String, String> payload = new HashMap<>();\r
283                 payload.put("operational-environment-status", "ACTIVE");\r
284                 getAaiHelper().updateAaiOperationalEnvironment(operationalEnvironmentId, payload);\r
285                 \r
286                 msoLogger.debug("End of AA&I UPDATE client call in ActivateVnfStatusOperationalEnvironment");\r
287         }\r
288         \r
289         /**\r
290          * Overall Success indicator \r
291          * @return true or false\r
292          */     \r
293         public boolean isSuccess() {\r
294                 return successIndicator;\r
295         }\r
296         \r
297         /**\r
298          * Set to new OperationalEnvDistributionStatusDb \r
299          * @return void\r
300          */     \r
301         public void setOperationalEnvDistributionStatusDb (OperationalEnvDistributionStatusDb activateDistributionDb) {\r
302                 this.activateDistributionDb = activateDistributionDb;\r
303         }\r
304         \r
305         /**\r
306          * Set to new OperationalEnvServiceModelStatusDb \r
307          * @return void\r
308          */     \r
309         public void setOperationalEnvServiceModelStatusDb (OperationalEnvServiceModelStatusDb activateServiceModelDb) {\r
310                 this.activateServiceModelDb = activateServiceModelDb;\r
311         }\r
312 \r
313         \r
314         /**\r
315          * Set to new AsdcClientHelper \r
316          * @return void\r
317          */     \r
318         public void setAsdcClientHelper (AsdcClientHelper asdcClientHelper) {\r
319                 this.asdcClientHelper = asdcClientHelper;\r
320         }               \r
321         \r
322         /**\r
323          * get OperationalEnvDistributionStatusDb instance \r
324          */     \r
325         public OperationalEnvDistributionStatusDb getOperationalEnvDistributionStatusDb() {\r
326                 if(this.activateDistributionDb == null) {\r
327                         this.activateDistributionDb = OperationalEnvDistributionStatusDb.getInstance();\r
328                 }\r
329                 return this.activateDistributionDb;\r
330         }       \r
331         \r
332         /**\r
333          * get OperationalEnvServiceModelStatusDb instance \r
334          */     \r
335         public OperationalEnvServiceModelStatusDb getOperationalEnvServiceModelStatusDb() {\r
336                 if(this.activateServiceModelDb == null) {\r
337                         this.activateServiceModelDb = OperationalEnvServiceModelStatusDb.getInstance();\r
338                 }\r
339                 return this.activateServiceModelDb;\r
340         }                       \r
341         \r
342 }\r