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;
26 import java.io.IOException;
27 import java.io.UnsupportedEncodingException;
28 import java.util.HashMap;
29 import java.util.UUID;
30 import javax.inject.Provider;
31 import javax.transaction.Transactional;
32 import javax.ws.rs.Consumes;
33 import javax.ws.rs.POST;
34 import javax.ws.rs.Path;
35 import javax.ws.rs.PathParam;
36 import javax.ws.rs.Produces;
37 import javax.ws.rs.container.ContainerRequestContext;
38 import javax.ws.rs.core.Context;
39 import javax.ws.rs.core.MediaType;
40 import javax.ws.rs.core.Response;
41 import org.onap.so.logger.LoggingAnchor;
42 import org.apache.http.HttpStatus;
43 import org.onap.so.apihandler.common.ErrorNumbers;
44 import org.onap.so.apihandlerinfra.Constants;
45 import org.onap.so.apihandlerinfra.exceptions.ApiException;
46 import org.onap.so.apihandlerinfra.exceptions.DuplicateRequestException;
47 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
48 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
49 import org.onap.so.apihandlerinfra.tenantisolationbeans.Action;
50 import org.onap.so.apihandlerinfra.tenantisolationbeans.OperationalEnvironment;
51 import org.onap.so.apihandlerinfra.tenantisolationbeans.RequestReferences;
52 import org.onap.so.apihandlerinfra.tenantisolationbeans.TenantSyncResponse;
53 import org.onap.so.constants.Status;
54 import org.onap.so.db.request.beans.InfraActiveRequests;
55 import org.onap.so.db.request.client.RequestsDbClient;
56 import org.onap.so.exceptions.ValidationException;
57 import org.onap.so.logger.ErrorCode;
58 import org.onap.so.logger.MessageEnum;
59 import org.slf4j.Logger;
60 import org.slf4j.LoggerFactory;
61 import org.springframework.beans.factory.annotation.Autowired;
62 import org.springframework.stereotype.Component;
63 import com.fasterxml.jackson.databind.ObjectMapper;
64 import io.swagger.annotations.Api;
65 import io.swagger.annotations.ApiOperation;
68 @Path("/onap/so/infra/cloudResources")
69 @Api(value = "/onap/so/infra/cloudResources", description = "API Requests for cloud resources - Tenant Isolation")
70 public class CloudOrchestration {
72 private static Logger logger = LoggerFactory.getLogger(CloudOrchestration.class);
73 private static final String ENVIRONMENT_ID_KEY = "operationalEnvironmentId";
76 private TenantIsolationRequest tenantIsolationRequest;
79 private RequestsDbClient requestsDbClient;
82 private Provider<TenantIsolationRunnable> tenantIsolationRunnable;
85 @Path("/{version:[vV][1]}/operationalEnvironments")
86 @Consumes(MediaType.APPLICATION_JSON)
87 @Produces(MediaType.APPLICATION_JSON)
88 @ApiOperation(value = "Create an Operational Environment", response = Response.class)
90 public Response createOperationEnvironment(String request, @PathParam("version") String version,
91 @Context ContainerRequestContext requestContext) throws ApiException {
92 logger.debug("Received request to Create Operational Environment");
93 return cloudOrchestration(request, Action.create, null, version, getRequestId(requestContext));
97 @Path("/{version:[vV][1]}/operationalEnvironments/{operationalEnvironmentId}/activate")
98 @Consumes(MediaType.APPLICATION_JSON)
99 @Produces(MediaType.APPLICATION_JSON)
100 @ApiOperation(value = "Activate an Operational Environment", response = Response.class)
102 public Response activateOperationEnvironment(String request, @PathParam("version") String version,
103 @PathParam("operationalEnvironmentId") String operationalEnvironmentId,
104 @Context ContainerRequestContext requestContext) throws ApiException {
105 logger.debug("Received request to Activate an Operational Environment");
106 HashMap<String, String> instanceIdMap = new HashMap<>();
107 instanceIdMap.put(ENVIRONMENT_ID_KEY, operationalEnvironmentId);
108 return cloudOrchestration(request, Action.activate, instanceIdMap, version, getRequestId(requestContext));
112 @Path("/{version:[vV][1]}/operationalEnvironments/{operationalEnvironmentId}/deactivate")
113 @Consumes(MediaType.APPLICATION_JSON)
114 @Produces(MediaType.APPLICATION_JSON)
115 @ApiOperation(value = "Deactivate an Operational Environment", response = Response.class)
117 public Response deactivateOperationEnvironment(String request, @PathParam("version") String version,
118 @PathParam("operationalEnvironmentId") String operationalEnvironmentId,
119 @Context ContainerRequestContext requestContext) throws ApiException {
120 logger.debug("Received request to Deactivate an Operational Environment");
121 HashMap<String, String> instanceIdMap = new HashMap<>();
122 instanceIdMap.put(ENVIRONMENT_ID_KEY, operationalEnvironmentId);
123 return cloudOrchestration(request, Action.deactivate, instanceIdMap, version, getRequestId(requestContext));
127 private Response cloudOrchestration(String requestJSON, Action action, HashMap<String, String> instanceIdMap,
128 String version, String requestId) throws ApiException {
129 logger.info(LoggingAnchor.TWO, MessageEnum.APIH_GENERATED_REQUEST_ID.toString(), requestId);
130 long startTime = System.currentTimeMillis();
131 CloudOrchestrationRequest cor = null;
132 tenantIsolationRequest.setRequestId(requestId);
134 cor = convertJsonToCloudOrchestrationRequest(requestJSON, action, startTime, cor);
137 tenantIsolationRequest.parse(cor, instanceIdMap, action);
138 } catch (ValidationException e) {
139 ErrorLoggerInfo errorLoggerInfo =
140 new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError)
144 throw new ValidateException.Builder("Mapping of request to JSON object failed. " + e.getMessage(),
145 HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo)
149 String instanceName = cor.getRequestDetails().getRequestInfo().getInstanceName();
150 String resourceType = cor.getRequestDetails().getRequestInfo().getResourceType().name();
151 InfraActiveRequests dup = null;
153 dup = duplicateCheck(action, instanceIdMap, startTime, instanceName, resourceType);
155 if (dup == null && (Action.activate.equals(action) || Action.deactivate.equals(action))) {
156 dup = requestsDbClient.checkVnfIdStatus(cor.getOperationalEnvironmentId());
160 String instance = null;
161 if (instanceName != null) {
162 instance = instanceName;
163 } else if (instanceIdMap != null) {
164 instance = instanceIdMap.get(resourceType + "InstanceId");
167 ErrorLoggerInfo errorLoggerInfo =
168 new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_FOUND, ErrorCode.SchemaError).build();
171 throw new DuplicateRequestException.Builder(resourceType, instance, dup.getRequestStatus(),
172 dup.getRequestId(), HttpStatus.SC_CONFLICT, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
173 .errorInfo(errorLoggerInfo).build();
176 String instanceId = null;
178 if (instanceIdMap != null && instanceIdMap.get(ENVIRONMENT_ID_KEY) != null) {
179 instanceId = instanceIdMap.get(ENVIRONMENT_ID_KEY);
181 instanceId = UUID.randomUUID().toString();
182 tenantIsolationRequest.setOperationalEnvironmentId(instanceId);
183 cor.setOperationalEnvironmentId(instanceId);
186 tenantIsolationRequest.createRequestRecord(Status.IN_PROGRESS, action);
188 OperationalEnvironment opEnv = cor.getRequestDetails().getRequestParameters().getOperationalEnvironmentType();
189 String operationalEnvType = opEnv != null ? opEnv.name() : null;
191 TenantIsolationRunnable runnable = tenantIsolationRunnable.get();
192 runnable.run(action, operationalEnvType, cor, requestId);
196 encodedValue = new String(instanceId.getBytes("UTF-8"));
197 } catch (UnsupportedEncodingException ex) {
198 ErrorLoggerInfo errorLoggerInfo =
199 new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.DataError).build();
202 throw new ValidateException.Builder("Could not encode instanceID" + ex.getMessage(),
203 HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(ex).errorInfo(errorLoggerInfo)
207 TenantSyncResponse tenantResponse = new TenantSyncResponse();
208 RequestReferences reqReference = new RequestReferences();
209 reqReference.setInstanceId(encodedValue);
210 reqReference.setRequestId(requestId);
211 tenantResponse.setRequestReferences(reqReference);
213 return Response.ok(tenantResponse).build();
216 private InfraActiveRequests duplicateCheck(Action action, HashMap<String, String> instanceIdMap, long startTime,
217 String instanceName, String requestScope) throws ApiException {
219 return requestsDbClient.checkInstanceNameDuplicate(instanceIdMap, instanceName, requestScope);
220 } catch (Exception e) {
221 ErrorLoggerInfo errorLoggerInfo =
222 new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, ErrorCode.DataError)
223 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
226 throw new ValidateException.Builder("Duplicate Check Request", HttpStatus.SC_INTERNAL_SERVER_ERROR,
227 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
231 private CloudOrchestrationRequest convertJsonToCloudOrchestrationRequest(String requestJSON, Action action,
232 long startTime, CloudOrchestrationRequest cor) throws ApiException {
234 logger.debug("Converting incoming JSON request to Object");
235 ObjectMapper mapper = new ObjectMapper();
236 return mapper.readValue(requestJSON, CloudOrchestrationRequest.class);
237 } catch (IOException e) {
239 ErrorLoggerInfo errorLoggerInfo =
240 new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError)
244 ValidateException validateException =
245 new ValidateException.Builder("Mapping of request to JSON object failed. " + e.getMessage(),
246 HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
247 .errorInfo(errorLoggerInfo).build();
248 if (tenantIsolationRequest.getRequestId() != null) {
249 tenantIsolationRequest.createRequestRecord(Status.FAILED, action);
251 throw validateException;
255 private String getRequestId(ContainerRequestContext requestContext) {
256 return requestContext.getProperty("requestId").toString();