2 * ============LICENSE_START=======================================================
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
13 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
23 package org.onap.so.apihandlerinfra.tenantisolation;
25 import java.sql.Timestamp;
26 import java.util.HashMap;
27 import java.util.List;
29 import java.util.Map.Entry;
30 import javax.ws.rs.core.MultivaluedMap;
31 import org.onap.so.logger.LoggingAnchor;
32 import org.apache.commons.lang3.StringUtils;
33 import org.onap.so.apihandlerinfra.Constants;
34 import org.onap.so.apihandlerinfra.Status;
35 import org.onap.so.apihandlerinfra.tenantisolationbeans.Action;
36 import org.onap.so.apihandlerinfra.tenantisolationbeans.Manifest;
37 import org.onap.so.apihandlerinfra.tenantisolationbeans.OperationalEnvironment;
38 import org.onap.so.apihandlerinfra.tenantisolationbeans.RelatedInstance;
39 import org.onap.so.apihandlerinfra.tenantisolationbeans.RelatedInstanceList;
40 import org.onap.so.apihandlerinfra.tenantisolationbeans.RequestDetails;
41 import org.onap.so.apihandlerinfra.tenantisolationbeans.RequestInfo;
42 import org.onap.so.apihandlerinfra.tenantisolationbeans.RequestParameters;
43 import org.onap.so.apihandlerinfra.tenantisolationbeans.ResourceType;
44 import org.onap.so.apihandlerinfra.tenantisolationbeans.ServiceModelList;
45 import org.onap.so.apihandlerinfra.vnfbeans.RequestStatusType;
46 import org.onap.so.db.request.beans.InfraActiveRequests;
47 import org.onap.so.db.request.client.RequestsDbClient;
48 import org.onap.so.exceptions.ValidationException;
49 import org.onap.so.logger.ErrorCode;
50 import org.onap.so.logger.MessageEnum;
51 import org.onap.so.utils.UUIDChecker;
52 import org.slf4j.Logger;
53 import org.slf4j.LoggerFactory;
54 import org.springframework.beans.factory.annotation.Autowired;
55 import org.springframework.context.annotation.Scope;
56 import org.springframework.stereotype.Component;
57 import com.fasterxml.jackson.core.JsonProcessingException;
58 import com.fasterxml.jackson.databind.ObjectMapper;
62 public class TenantIsolationRequest {
64 private String requestId;
65 private String requestJSON;
66 private RequestInfo requestInfo;
68 private String errorMessage;
69 private String responseBody;
70 private RequestStatusType status;
71 private String operationalEnvironmentId;
72 private long progress = Constants.PROGRESS_REQUEST_RECEIVED;
73 private String requestScope;
74 private CloudOrchestrationRequest cor;
77 private RequestsDbClient requestsDbClient;
79 private static Logger logger = LoggerFactory.getLogger(TenantIsolationRequest.class);
82 TenantIsolationRequest(String requestId) {
83 this.requestId = requestId;
86 TenantIsolationRequest() {}
88 void parse(CloudOrchestrationRequest request, HashMap<String, String> instanceIdMap, Action action)
89 throws ValidationException {
91 this.requestInfo = request.getRequestDetails().getRequestInfo();
94 ObjectMapper mapper = new ObjectMapper();
95 requestJSON = mapper.writeValueAsString(request.getRequestDetails());
97 } catch (JsonProcessingException e) {
98 throw new ValidationException("Parse ServiceInstanceRequest to JSON string", true);
102 if (instanceIdMap != null) {
103 envId = instanceIdMap.get("operationalEnvironmentId");
104 if (envId != null && !UUIDChecker.isValidUUID(envId)) {
105 throw new ValidationException("operationalEnvironmentId", true);
107 cor.setOperationalEnvironmentId(envId);
110 this.operationalEnvironmentId = envId;
112 RequestDetails requestDetails = request.getRequestDetails();
113 RequestParameters requestParameters = requestDetails.getRequestParameters();
115 requestInfoValidation(action, requestInfo);
117 requestParamsValidation(action, requestParameters);
119 relatedInstanceValidation(action, requestDetails, requestParameters);
123 private void relatedInstanceValidation(Action action, RequestDetails requestDetails,
124 RequestParameters requestParameters) throws ValidationException {
125 RelatedInstanceList[] instanceList = requestDetails.getRelatedInstanceList();
127 if (requestParameters == null) {
128 throw new ValidationException("requestParameters", true);
130 if ((Action.activate.equals(action) || Action.deactivate.equals(action))
131 && OperationalEnvironment.ECOMP.equals(requestParameters.getOperationalEnvironmentType())) {
132 throw new ValidationException("operationalEnvironmentType in requestParameters", true);
135 if (!Action.deactivate.equals(action)
136 && OperationalEnvironment.VNF.equals(requestParameters.getOperationalEnvironmentType())) {
137 if (instanceList != null && instanceList.length > 0) {
138 for (RelatedInstanceList relatedInstanceList : instanceList) {
139 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
141 if (relatedInstance.getResourceType() == null) {
142 throw new ValidationException("ResourceType in relatedInstance", true);
145 if (!empty(relatedInstance.getInstanceName())
146 && !relatedInstance.getInstanceName().matches(Constants.VALID_INSTANCE_NAME_FORMAT)) {
147 throw new ValidationException("instanceName format", true);
150 if (empty(relatedInstance.getInstanceId())) {
151 throw new ValidationException("instanceId in relatedInstance", true);
154 if (!UUIDChecker.isValidUUID(relatedInstance.getInstanceId())) {
155 throw new ValidationException("instanceId format in relatedInstance", true);
159 throw new ValidationException("relatedInstanceList", true);
164 private void requestParamsValidation(Action action, RequestParameters requestParameters)
165 throws ValidationException {
167 if (requestParameters != null) {
168 if (!Action.deactivate.equals(action) && requestParameters.getOperationalEnvironmentType() == null) {
169 throw new ValidationException("OperationalEnvironmentType", true);
172 if (Action.create.equals(action) && empty(requestParameters.getTenantContext())) {
173 throw new ValidationException("Tenant Context", true);
175 if (!Action.deactivate.equals(action) && empty(requestParameters.getWorkloadContext())) {
176 throw new ValidationException("Workload Context", true);
179 Manifest manifest = requestParameters.getManifest();
181 if (Action.activate.equals(action)) {
182 if (manifest == null) {
183 throw new ValidationException("Manifest on Activate", true);
185 List<ServiceModelList> serviceModelList = manifest.getServiceModelList();
187 if (serviceModelList.isEmpty()) {
188 throw new ValidationException(" empty ServiceModelList", true);
191 for (ServiceModelList list : serviceModelList) {
192 if (empty(list.getServiceModelVersionId())) {
193 throw new ValidationException("ServiceModelVersionId", true);
196 if (!UUIDChecker.isValidUUID(list.getServiceModelVersionId())) {
197 throw new ValidationException("ServiceModelVersionId format", true);
200 if (list.getRecoveryAction() == null) {
201 throw new ValidationException("RecoveryAction", true);
206 } else if (!Action.deactivate.equals(action)) {
207 throw new ValidationException("request Parameters", true);
211 private void requestInfoValidation(Action action, RequestInfo requestInfo) throws ValidationException {
213 if (Action.create.equals(action) && empty(requestInfo.getInstanceName())) {
214 throw new ValidationException("instanceName", true);
217 if (!empty(requestInfo.getInstanceName())
218 && !requestInfo.getInstanceName().matches(Constants.VALID_INSTANCE_NAME_FORMAT)) {
219 throw new ValidationException("instanceName format", true);
222 if (empty(requestInfo.getSource())) {
223 throw new ValidationException("source", true);
226 if (empty(requestInfo.getRequestorId())) {
227 throw new ValidationException("requestorId", true);
230 ResourceType resourceType = requestInfo.getResourceType();
231 if (resourceType == null) {
232 throw new ValidationException("resourceType", true);
235 this.requestScope = resourceType.name();
238 void parseOrchestration(CloudOrchestrationRequest cor) throws ValidationException {
243 ObjectMapper mapper = new ObjectMapper();
244 requestJSON = mapper.writeValueAsString(cor.getRequestDetails());
246 } catch (JsonProcessingException e) {
247 throw new ValidationException("Parse CloudOrchestrationRequest to JSON string", e);
250 if (cor.getRequestDetails() == null) {
251 throw new ValidationException("requestDetails", true);
253 this.requestInfo = cor.getRequestDetails().getRequestInfo();
255 if (this.requestInfo == null) {
256 throw new ValidationException("requestInfo", true);
259 if (empty(requestInfo.getSource())) {
260 throw new ValidationException("source", true);
262 if (empty(requestInfo.getRequestorId())) {
263 throw new ValidationException("requestorId", true);
267 public void createRequestRecord(Status status, Action action) {
269 InfraActiveRequests aq = new InfraActiveRequests();
270 aq.setRequestId(requestId);
272 aq.setRequestAction(action.name());
273 aq.setAction(action.name());
275 Timestamp startTimeStamp = new Timestamp(System.currentTimeMillis());
277 aq.setStartTime(startTimeStamp);
279 if (requestInfo != null) {
281 if (requestInfo.getSource() != null) {
282 aq.setSource(requestInfo.getSource());
284 if (requestInfo.getRequestorId() != null) {
285 aq.setRequestorId(requestInfo.getRequestorId());
287 if (requestInfo.getResourceType() != null) {
288 aq.setRequestScope(requestInfo.getResourceType().name());
292 if (ResourceType.operationalEnvironment.name().equalsIgnoreCase(requestScope) && requestInfo != null) {
293 aq.setOperationalEnvId(operationalEnvironmentId);
294 aq.setOperationalEnvName(requestInfo.getInstanceName());
297 aq.setRequestBody(this.requestJSON);
299 aq.setRequestStatus(status.toString());
300 aq.setLastModifiedBy(Constants.MODIFIED_BY_APIHANDLER);
302 if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
303 aq.setStatusMessage(this.errorMessage);
304 aq.setResponseBody(this.responseBody);
305 aq.setProgress(Long.valueOf(100));
307 Timestamp endTimeStamp = new Timestamp(System.currentTimeMillis());
308 aq.setEndTime(endTimeStamp);
309 } else if (status == Status.IN_PROGRESS) {
310 aq.setProgress(Constants.PROGRESS_REQUEST_IN_PROGRESS);
312 requestsDbClient.save(aq);
316 public Map<String, String> getOrchestrationFilters(MultivaluedMap<String, String> queryParams)
317 throws ValidationException {
318 String queryParam = null;
319 Map<String, String> orchestrationFilterParams = new HashMap<>();
321 for (Entry<String, List<String>> entry : queryParams.entrySet()) {
322 queryParam = entry.getKey();
324 for (String value : entry.getValue()) {
325 if (StringUtils.isBlank(value)) {
326 throw (new Exception(queryParam + " value"));
328 orchestrationFilterParams.put(queryParam, value);
330 } catch (Exception e) {
331 throw new ValidationException(e.getMessage(), true);
335 return orchestrationFilterParams;
338 private static boolean empty(String s) {
339 return (s == null || s.trim().isEmpty());
342 public String getRequestId() {
346 public void setRequestId(String requestId) {
347 this.requestId = requestId;
350 public void updateFinalStatus() {
352 InfraActiveRequests request = new InfraActiveRequests(requestId);
353 request.setRequestStatus(status.toString());
354 request.setStatusMessage(this.errorMessage);
355 request.setProgress(this.progress);
356 request.setResponseBody(this.responseBody);
357 request.setLastModifiedBy(Constants.MODIFIED_BY_APIHANDLER);
358 requestsDbClient.save(request);
359 } catch (Exception e) {
360 logger.error(LoggingAnchor.FOUR, MessageEnum.APIH_DB_UPDATE_EXC.toString(), e.getMessage(),
361 ErrorCode.DataError.getValue(), "Exception when updating record in DB");
362 logger.debug("Exception: ", e);
366 public void setStatus(RequestStatusType status) {
367 this.status = status;
371 this.progress = Constants.PROGRESS_REQUEST_COMPLETED;
374 this.progress = Constants.PROGRESS_REQUEST_IN_PROGRESS;
387 public String getOperationalEnvironmentId() {
388 return operationalEnvironmentId;
391 public void setOperationalEnvironmentId(String operationalEnvironmentId) {
392 this.operationalEnvironmentId = operationalEnvironmentId;