efdc52b837a51b277b42083850295c57e7b12e5b
[so.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Modifications Copyright (c) 2019 Samsung
8  * ================================================================================
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  * 
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  * 
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  * ============LICENSE_END=========================================================
21  */
22
23 package org.onap.so.apihandlerinfra.tenantisolation;
24
25 import java.sql.Timestamp;
26 import java.util.HashMap;
27 import java.util.List;
28 import java.util.Map;
29 import java.util.Map.Entry;
30 import javax.ws.rs.core.MultivaluedMap;
31 import org.apache.commons.lang3.StringUtils;
32 import org.onap.so.apihandlerinfra.Constants;
33 import org.onap.so.apihandlerinfra.tenantisolationbeans.Action;
34 import org.onap.so.apihandlerinfra.tenantisolationbeans.Manifest;
35 import org.onap.so.apihandlerinfra.tenantisolationbeans.OperationalEnvironment;
36 import org.onap.so.apihandlerinfra.tenantisolationbeans.RelatedInstance;
37 import org.onap.so.apihandlerinfra.tenantisolationbeans.RelatedInstanceList;
38 import org.onap.so.apihandlerinfra.tenantisolationbeans.RequestDetails;
39 import org.onap.so.apihandlerinfra.tenantisolationbeans.RequestInfo;
40 import org.onap.so.apihandlerinfra.tenantisolationbeans.RequestParameters;
41 import org.onap.so.apihandlerinfra.tenantisolationbeans.ResourceType;
42 import org.onap.so.apihandlerinfra.tenantisolationbeans.ServiceModelList;
43 import org.onap.so.apihandlerinfra.vnfbeans.RequestStatusType;
44 import org.onap.so.constants.Status;
45 import org.onap.so.db.request.beans.InfraActiveRequests;
46 import org.onap.so.db.request.client.RequestsDbClient;
47 import org.onap.so.exceptions.ValidationException;
48 import org.onap.so.utils.UUIDChecker;
49 import org.slf4j.Logger;
50 import org.slf4j.LoggerFactory;
51 import org.springframework.beans.factory.annotation.Autowired;
52 import org.springframework.context.annotation.Scope;
53 import org.springframework.stereotype.Component;
54 import com.fasterxml.jackson.core.JsonProcessingException;
55 import com.fasterxml.jackson.databind.ObjectMapper;
56
57 @Component
58 @Scope("prototype")
59 public class TenantIsolationRequest {
60
61     private String requestId;
62     private String requestJSON;
63     private RequestInfo requestInfo;
64
65     private String errorMessage;
66     private String responseBody;
67     private RequestStatusType status;
68     private String operationalEnvironmentId;
69     private long progress = Constants.PROGRESS_REQUEST_RECEIVED;
70     private String requestScope;
71     private CloudOrchestrationRequest cor;
72
73     @Autowired
74     private RequestsDbClient requestsDbClient;
75
76     private static Logger logger = LoggerFactory.getLogger(TenantIsolationRequest.class);
77
78
79     TenantIsolationRequest(String requestId) {
80         this.requestId = requestId;
81     }
82
83     TenantIsolationRequest() {}
84
85     void parse(CloudOrchestrationRequest request, HashMap<String, String> instanceIdMap, Action action)
86             throws ValidationException {
87         this.cor = request;
88         this.requestInfo = request.getRequestDetails().getRequestInfo();
89
90         try {
91             ObjectMapper mapper = new ObjectMapper();
92             requestJSON = mapper.writeValueAsString(request.getRequestDetails());
93
94         } catch (JsonProcessingException e) {
95             throw new ValidationException("Parse ServiceInstanceRequest to JSON string", true);
96         }
97
98         String envId = null;
99         if (instanceIdMap != null) {
100             envId = instanceIdMap.get("operationalEnvironmentId");
101             if (envId != null && !UUIDChecker.isValidUUID(envId)) {
102                 throw new ValidationException("operationalEnvironmentId", true);
103             }
104             cor.setOperationalEnvironmentId(envId);
105         }
106
107         this.operationalEnvironmentId = envId;
108
109         RequestDetails requestDetails = request.getRequestDetails();
110         RequestParameters requestParameters = requestDetails.getRequestParameters();
111
112         requestInfoValidation(action, requestInfo);
113
114         requestParamsValidation(action, requestParameters);
115
116         relatedInstanceValidation(action, requestDetails, requestParameters);
117
118     }
119
120     private void relatedInstanceValidation(Action action, RequestDetails requestDetails,
121             RequestParameters requestParameters) throws ValidationException {
122         RelatedInstanceList[] instanceList = requestDetails.getRelatedInstanceList();
123
124         if (requestParameters == null) {
125             throw new ValidationException("requestParameters", true);
126         }
127         if ((Action.activate.equals(action) || Action.deactivate.equals(action))
128                 && OperationalEnvironment.ECOMP.equals(requestParameters.getOperationalEnvironmentType())) {
129             throw new ValidationException("operationalEnvironmentType in requestParameters", true);
130         }
131
132         if (!Action.deactivate.equals(action)
133                 && OperationalEnvironment.VNF.equals(requestParameters.getOperationalEnvironmentType())) {
134             if (instanceList != null && instanceList.length > 0) {
135                 for (RelatedInstanceList relatedInstanceList : instanceList) {
136                     RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
137
138                     if (relatedInstance.getResourceType() == null) {
139                         throw new ValidationException("ResourceType in relatedInstance", true);
140                     }
141
142                     if (!empty(relatedInstance.getInstanceName())
143                             && !relatedInstance.getInstanceName().matches(Constants.VALID_INSTANCE_NAME_FORMAT)) {
144                         throw new ValidationException("instanceName format", true);
145                     }
146
147                     if (empty(relatedInstance.getInstanceId())) {
148                         throw new ValidationException("instanceId in relatedInstance", true);
149                     }
150
151                     if (!UUIDChecker.isValidUUID(relatedInstance.getInstanceId())) {
152                         throw new ValidationException("instanceId format in relatedInstance", true);
153                     }
154                 }
155             } else {
156                 throw new ValidationException("relatedInstanceList", true);
157             }
158         }
159     }
160
161     private void requestParamsValidation(Action action, RequestParameters requestParameters)
162             throws ValidationException {
163
164         if (requestParameters != null) {
165             if (!Action.deactivate.equals(action) && requestParameters.getOperationalEnvironmentType() == null) {
166                 throw new ValidationException("OperationalEnvironmentType", true);
167             }
168
169             if (Action.create.equals(action) && empty(requestParameters.getTenantContext())) {
170                 throw new ValidationException("Tenant Context", true);
171             }
172             if (!Action.deactivate.equals(action) && empty(requestParameters.getWorkloadContext())) {
173                 throw new ValidationException("Workload Context", true);
174             }
175
176             Manifest manifest = requestParameters.getManifest();
177
178             if (Action.activate.equals(action)) {
179                 if (manifest == null) {
180                     throw new ValidationException("Manifest on Activate", true);
181                 } else {
182                     List<ServiceModelList> serviceModelList = manifest.getServiceModelList();
183
184                     if (serviceModelList.isEmpty()) {
185                         throw new ValidationException(" empty ServiceModelList", true);
186                     }
187
188                     for (ServiceModelList list : serviceModelList) {
189                         if (empty(list.getServiceModelVersionId())) {
190                             throw new ValidationException("ServiceModelVersionId", true);
191                         }
192
193                         if (!UUIDChecker.isValidUUID(list.getServiceModelVersionId())) {
194                             throw new ValidationException("ServiceModelVersionId format", true);
195                         }
196
197                         if (list.getRecoveryAction() == null) {
198                             throw new ValidationException("RecoveryAction", true);
199                         }
200                     }
201                 }
202             }
203         } else if (!Action.deactivate.equals(action)) {
204             throw new ValidationException("request Parameters", true);
205         }
206     }
207
208     private void requestInfoValidation(Action action, RequestInfo requestInfo) throws ValidationException {
209
210         if (Action.create.equals(action) && empty(requestInfo.getInstanceName())) {
211             throw new ValidationException("instanceName", true);
212         }
213
214         if (!empty(requestInfo.getInstanceName())
215                 && !requestInfo.getInstanceName().matches(Constants.VALID_INSTANCE_NAME_FORMAT)) {
216             throw new ValidationException("instanceName format", true);
217         }
218
219         if (empty(requestInfo.getSource())) {
220             throw new ValidationException("source", true);
221         }
222
223         if (empty(requestInfo.getRequestorId())) {
224             throw new ValidationException("requestorId", true);
225         }
226
227         ResourceType resourceType = requestInfo.getResourceType();
228         if (resourceType == null) {
229             throw new ValidationException("resourceType", true);
230         }
231
232         this.requestScope = resourceType.name();
233     }
234
235     void parseOrchestration(CloudOrchestrationRequest cor) throws ValidationException {
236
237         this.cor = cor;
238
239         try {
240             ObjectMapper mapper = new ObjectMapper();
241             requestJSON = mapper.writeValueAsString(cor.getRequestDetails());
242
243         } catch (JsonProcessingException e) {
244             throw new ValidationException("Parse CloudOrchestrationRequest to JSON string", e);
245         }
246
247         if (cor.getRequestDetails() == null) {
248             throw new ValidationException("requestDetails", true);
249         }
250         this.requestInfo = cor.getRequestDetails().getRequestInfo();
251
252         if (this.requestInfo == null) {
253             throw new ValidationException("requestInfo", true);
254         }
255
256         if (empty(requestInfo.getSource())) {
257             throw new ValidationException("source", true);
258         }
259         if (empty(requestInfo.getRequestorId())) {
260             throw new ValidationException("requestorId", true);
261         }
262     }
263
264     public void createRequestRecord(Status status, Action action) {
265
266         InfraActiveRequests aq = new InfraActiveRequests();
267         aq.setRequestId(requestId);
268
269         aq.setRequestAction(action.name());
270         aq.setAction(action.name());
271
272         Timestamp startTimeStamp = new Timestamp(System.currentTimeMillis());
273
274         aq.setStartTime(startTimeStamp);
275
276         if (requestInfo != null) {
277
278             if (requestInfo.getSource() != null) {
279                 aq.setSource(requestInfo.getSource());
280             }
281             if (requestInfo.getRequestorId() != null) {
282                 aq.setRequestorId(requestInfo.getRequestorId());
283             }
284             if (requestInfo.getResourceType() != null) {
285                 aq.setRequestScope(requestInfo.getResourceType().name());
286             }
287         }
288
289         if (ResourceType.operationalEnvironment.name().equalsIgnoreCase(requestScope) && requestInfo != null) {
290             aq.setOperationalEnvId(operationalEnvironmentId);
291             aq.setOperationalEnvName(requestInfo.getInstanceName());
292         }
293
294         aq.setRequestBody(this.requestJSON);
295
296         aq.setRequestStatus(status.toString());
297         aq.setLastModifiedBy(Constants.MODIFIED_BY_APIHANDLER);
298
299         if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
300             aq.setStatusMessage(this.errorMessage);
301             aq.setResponseBody(this.responseBody);
302             aq.setProgress(Long.valueOf(100));
303
304             Timestamp endTimeStamp = new Timestamp(System.currentTimeMillis());
305             aq.setEndTime(endTimeStamp);
306         } else if (status == Status.IN_PROGRESS) {
307             aq.setProgress(Constants.PROGRESS_REQUEST_IN_PROGRESS);
308         }
309         requestsDbClient.save(aq);
310     }
311
312
313     public Map<String, String> getOrchestrationFilters(MultivaluedMap<String, String> queryParams)
314             throws ValidationException {
315         String queryParam = null;
316         Map<String, String> orchestrationFilterParams = new HashMap<>();
317
318         for (Entry<String, List<String>> entry : queryParams.entrySet()) {
319             queryParam = entry.getKey();
320             try {
321                 for (String value : entry.getValue()) {
322                     if (StringUtils.isBlank(value)) {
323                         throw (new Exception(queryParam + " value"));
324                     }
325                     orchestrationFilterParams.put(queryParam, value);
326                 }
327             } catch (Exception e) {
328                 throw new ValidationException(e.getMessage(), true);
329             }
330         }
331
332         return orchestrationFilterParams;
333     }
334
335     private static boolean empty(String s) {
336         return (s == null || s.trim().isEmpty());
337     }
338
339     public String getRequestId() {
340         return requestId;
341     }
342
343     public void setRequestId(String requestId) {
344         this.requestId = requestId;
345     }
346
347     public void updateFinalStatus() {
348         try {
349             InfraActiveRequests request = new InfraActiveRequests(requestId);
350             request.setRequestStatus(status.toString());
351             request.setStatusMessage(this.errorMessage);
352             request.setProgress(this.progress);
353             request.setResponseBody(this.responseBody);
354             request.setLastModifiedBy(Constants.MODIFIED_BY_APIHANDLER);
355             requestsDbClient.save(request);
356         } catch (Exception e) {
357             logger.error("Exception when updating record in DB", e);
358             logger.debug("Exception: ", e);
359         }
360     }
361
362     public void setStatus(RequestStatusType status) {
363         this.status = status;
364         switch (status) {
365             case FAILED:
366             case COMPLETE:
367                 this.progress = Constants.PROGRESS_REQUEST_COMPLETED;
368                 break;
369             case IN_PROGRESS:
370                 this.progress = Constants.PROGRESS_REQUEST_IN_PROGRESS;
371                 break;
372             case PENDING:
373                 break;
374             case TIMEOUT:
375                 break;
376             case UNLOCKED:
377                 break;
378             default:
379                 break;
380         }
381     }
382
383     public String getOperationalEnvironmentId() {
384         return operationalEnvironmentId;
385     }
386
387     public void setOperationalEnvironmentId(String operationalEnvironmentId) {
388         this.operationalEnvironmentId = operationalEnvironmentId;
389     }
390 }