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