From 38f720752af4d4aad8c4e467a288d9048659f688 Mon Sep 17 00:00:00 2001 From: Rob Daugherty Date: Wed, 14 Mar 2018 02:07:32 -0400 Subject: AT&T 1712 and 1802 release code This is code from AT&T's 1712 and 1802 releases. Change-Id: Ie1e85851e94bc66c4d9514a0226c221939531a04 Issue-ID: SO-425 Signed-off-by: Rob Daugherty --- .../tenantisolation/AaiClientPropertiesImpl.java | 52 +++ .../tenantisolation/CloudOrchestration.java | 333 ++++++++++++++ .../tenantisolation/CloudOrchestrationRequest.java | 81 ++++ .../CloudResourcesOrchestration.java | 335 +++++++++++++++ .../tenantisolation/GrmClientPropertiesImpl.java | 70 +++ .../tenantisolation/ModelDistributionRequest.java | 160 +++++++ .../OperationalEnvironmentProcessFactory.java | 54 +++ .../tenantisolation/TenantIsolationRequest.java | 476 +++++++++++++++++++++ .../tenantisolation/TenantIsolationRunnable.java | 106 +++++ .../dmaap/CreateEcompOperationEnvironmentBean.java | 172 ++++++++ .../dmaap/DmaapOperationalEnvClient.java | 67 +++ .../tenantisolation/dmaap/DmaapPropertiesImpl.java | 45 ++ .../dmaap/OperationalEnvironmentPublisher.java | 58 +++ .../exceptions/AAIClientCallFailed.java | 29 ++ .../exceptions/AsdcClientCallFailed.java | 34 ++ .../exceptions/TenantIsolationException.java | 36 ++ .../tenantisolation/helpers/AAIClientHelper.java | 145 +++++++ .../helpers/AAIClientObjectBuilder.java | 78 ++++ .../tenantisolation/helpers/AsdcClientHelper.java | 216 ++++++++++ .../process/ActivateVnfOperationalEnvironment.java | 290 +++++++++++++ .../ActivateVnfStatusOperationalEnvironment.java | 342 +++++++++++++++ .../process/CreateEcompOperationalEnvironment.java | 82 ++++ .../process/CreateVnfOperationalEnvironment.java | 216 ++++++++++ .../DeactivateVnfOperationalEnvironment.java | 92 ++++ .../process/OperationalEnvironmentProcess.java | 78 ++++ 25 files changed, 3647 insertions(+) create mode 100644 mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/AaiClientPropertiesImpl.java create mode 100644 mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/CloudOrchestration.java create mode 100644 mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/CloudOrchestrationRequest.java create mode 100644 mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/CloudResourcesOrchestration.java create mode 100644 mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/GrmClientPropertiesImpl.java create mode 100644 mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/ModelDistributionRequest.java create mode 100644 mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/OperationalEnvironmentProcessFactory.java create mode 100644 mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/TenantIsolationRequest.java create mode 100644 mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/TenantIsolationRunnable.java create mode 100644 mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/dmaap/CreateEcompOperationEnvironmentBean.java create mode 100644 mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/dmaap/DmaapOperationalEnvClient.java create mode 100644 mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/dmaap/DmaapPropertiesImpl.java create mode 100644 mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/dmaap/OperationalEnvironmentPublisher.java create mode 100644 mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/exceptions/AAIClientCallFailed.java create mode 100644 mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/exceptions/AsdcClientCallFailed.java create mode 100644 mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/exceptions/TenantIsolationException.java create mode 100644 mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/helpers/AAIClientHelper.java create mode 100644 mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/helpers/AAIClientObjectBuilder.java create mode 100644 mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/helpers/AsdcClientHelper.java create mode 100644 mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/process/ActivateVnfOperationalEnvironment.java create mode 100644 mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/process/ActivateVnfStatusOperationalEnvironment.java create mode 100644 mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/process/CreateEcompOperationalEnvironment.java create mode 100644 mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/process/CreateVnfOperationalEnvironment.java create mode 100644 mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/process/DeactivateVnfOperationalEnvironment.java create mode 100644 mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/process/OperationalEnvironmentProcess.java (limited to 'mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation') diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/AaiClientPropertiesImpl.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/AaiClientPropertiesImpl.java new file mode 100644 index 0000000000..03af038574 --- /dev/null +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/AaiClientPropertiesImpl.java @@ -0,0 +1,52 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.mso.apihandlerinfra.tenantisolation; + +import java.net.MalformedURLException; +import java.net.URL; + +import org.openecomp.mso.apihandlerinfra.MsoPropertiesUtils; +import org.openecomp.mso.client.aai.AAIProperties; +import org.openecomp.mso.client.aai.AAIVersion; +import org.openecomp.mso.properties.MsoJavaProperties; + +public class AaiClientPropertiesImpl implements AAIProperties { + + final MsoJavaProperties props; + public AaiClientPropertiesImpl() { + this.props = MsoPropertiesUtils.loadMsoProperties (); + } + + @Override + public URL getEndpoint() throws MalformedURLException { + return new URL(props.getProperty("aai.endpoint", null)); + } + + @Override + public String getSystemName() { + return "MSO"; + } + + @Override + public AAIVersion getDefaultVersion() { + return AAIVersion.LATEST; + } +} diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/CloudOrchestration.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/CloudOrchestration.java new file mode 100644 index 0000000000..4801811c41 --- /dev/null +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/CloudOrchestration.java @@ -0,0 +1,333 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.mso.apihandlerinfra.tenantisolation; + + +import java.util.HashMap; + +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import org.apache.http.HttpStatus; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.openecomp.mso.apihandler.common.ErrorNumbers; +import org.openecomp.mso.apihandlerinfra.Constants; +import org.openecomp.mso.apihandlerinfra.MsoException; +import org.openecomp.mso.apihandlerinfra.Status; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.Action; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.OperationalEnvironment; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.RequestReferences; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.TenantSyncResponse; +import org.openecomp.mso.logger.MessageEnum; +import org.openecomp.mso.logger.MsoLogger; +import org.openecomp.mso.requestsdb.InfraActiveRequests; +import org.openecomp.mso.requestsdb.RequestsDatabase; +import org.openecomp.mso.utils.UUIDChecker; + +import com.wordnik.swagger.annotations.Api; +import com.wordnik.swagger.annotations.ApiOperation; + +@Path("/cloudResources") +@Api(value="/cloudResources",description="API Requests for cloud resources - Tenant Isolation") +public class CloudOrchestration { + + private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH); + private TenantIsolationRunnable tenantIsolation = null; + private TenantIsolationRequest tenantIsolationRequest = null; + private RequestsDatabase requestsDatabase = null; + + @POST + @Path("/{version:[vV][1]}/operationalEnvironments") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @ApiOperation(value="Create an Operational Environment",response=Response.class) + public Response createOperationEnvironment(String request, @PathParam("version") String version) { + msoLogger.debug("Received request to Create Operational Environment"); + return cloudOrchestration(request, Action.create, null, version); + } + + @POST + @Path("/{version:[vV][1]}/operationalEnvironments/{operationalEnvironmentId}/activate") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @ApiOperation(value="Activate an Operational Environment",response=Response.class) + public Response activateOperationEnvironment(String request, @PathParam("version") String version, @PathParam("operationalEnvironmentId") String operationalEnvironmentId) { + msoLogger.debug("Received request to Activate an Operational Environment"); + HashMap instanceIdMap = new HashMap(); + instanceIdMap.put("operationalEnvironmentId", operationalEnvironmentId); + return cloudOrchestration(request, Action.activate, instanceIdMap, version); + } + + @POST + @Path("/{version:[vV][1]}/operationalEnvironments/{operationalEnvironmentId}/deactivate") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @ApiOperation(value="Deactivate an Operational Environment",response=Response.class) + public Response deactivateOperationEnvironment(String request, @PathParam("version") String version, @PathParam("operationalEnvironmentId") String operationalEnvironmentId) { + msoLogger.debug("Received request to Deactivate an Operational Environment"); + HashMap instanceIdMap = new HashMap(); + instanceIdMap.put("operationalEnvironmentId", operationalEnvironmentId); + return cloudOrchestration(request, Action.deactivate, instanceIdMap, version); + } + + + private Response cloudOrchestration(String requestJSON, Action action, HashMap instanceIdMap, String version) { + String requestId = UUIDChecker.generateUUID(msoLogger); + long startTime = System.currentTimeMillis (); + CloudOrchestrationRequest cor = null; + Response response = null; + getTenantIsolationRequest().setRequestId(requestId); + + try { + cor = convertJsonToCloudOrchestrationRequest(requestJSON, action, startTime, cor); + } catch(Exception e) { + response = getTenantIsolationRequest().buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, + MsoException.ServiceException, + "Mapping of request to JSON object failed. " + e.getMessage(), + ErrorNumbers.SVC_BAD_PARAMETER, + null); + msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ()); + return response; + } + + try { + getTenantIsolationRequest().parse(cor, instanceIdMap, action); + } catch(Exception e) { + msoLogger.debug ("Validation failed: ", e); + if (getTenantIsolationRequest().getRequestId () != null) { + msoLogger.debug ("Logging failed message to the database"); + getTenantIsolationRequest().createRequestRecord (Status.FAILED, action); + } + response = getTenantIsolationRequest().buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, + MsoException.ServiceException, + "Error parsing request. " + e.getMessage(), + ErrorNumbers.SVC_BAD_PARAMETER, null); + msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ()); + return response; + } + + String instanceName = cor.getRequestDetails().getRequestInfo().getInstanceName(); + String resourceType = cor.getRequestDetails().getRequestInfo().getResourceType().name(); + InfraActiveRequests dup = null; + String messageAppend = null; + try { + dup = duplicateCheck(action, instanceIdMap, startTime, instanceName, resourceType); + + if(dup != null) { + messageAppend = "already has a request being worked with a status of " + dup.getRequestStatus() + " (RequestId - " + dup.getRequestId() + ")."; + } + } catch(Exception e) { + response = getTenantIsolationRequest().buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, + MsoException.ServiceException, + e.getMessage(), + ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, + null) ; + msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ()); + return response; + } + + try { + if(dup == null && (Action.activate.equals(action) || Action.deactivate.equals(action))) { + dup = getRequestsDatabase().checkVnfIdStatus(cor.getOperationalEnvironmentId()); + if(dup != null) { + messageAppend = "OperationalEnvironmentId is not COMPLETED."; + } + } + } catch(Exception e) { + response = getTenantIsolationRequest().buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, + MsoException.ServiceException, + e.getMessage(), + ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, + null) ; + msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ()); + return response; + } + + if(dup != null) { + String instance = null; + if(instanceName != null){ + instance = instanceName; + }else{ + instance = instanceIdMap.get(resourceType + "InstanceId"); + } + String dupMessage = "Error: Locked instance - This " + resourceType + " (" + instance + ") " + messageAppend + " The existing request must finish or be cleaned up before proceeding."; + + response = getTenantIsolationRequest().buildServiceErrorResponse(HttpStatus.SC_CONFLICT, + MsoException.ServiceException, + dupMessage, + ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, + null) ; + + msoLogger.warn (MessageEnum.APIH_DUPLICATE_FOUND, dupMessage, "", "", MsoLogger.ErrorCode.SchemaError, dupMessage); + getTenantIsolationRequest().createRequestRecord (Status.FAILED, action); + msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, dupMessage); + msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ()); + return response; + } + + String instanceId = null; + try { + if(instanceIdMap != null && instanceIdMap.get("operationalEnvironmentId") != null) { + instanceId = instanceIdMap.get("operationalEnvironmentId"); + } else { + instanceId = UUIDChecker.generateUUID(msoLogger); + getTenantIsolationRequest().setOperationalEnvironmentId(instanceId); + cor.setOperationalEnvironmentId(instanceId); + } + + msoLogger.debug("Creating record in Request DB"); + getTenantIsolationRequest().createRequestRecord(Status.IN_PROGRESS, action); + } catch(Exception e) { + response = getTenantIsolationRequest().buildServiceErrorResponse (HttpStatus.SC_INTERNAL_SERVER_ERROR, + MsoException.ServiceException, + "Exception while creating record in DB " + e.getMessage(), + ErrorNumbers.SVC_BAD_PARAMETER, + null); + msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ()); + return response; + } + + try { + OperationalEnvironment opEnv = cor.getRequestDetails().getRequestParameters().getOperationalEnvironmentType(); + String operationalEnvType = opEnv != null ? opEnv.name() : null; + + TenantIsolationRunnable runnable = getThread(); + runnable.setAction(action); + runnable.setCor(cor); + runnable.setOperationalEnvType(operationalEnvType); + runnable.setRequestId(requestId); + + Thread thread = new Thread(runnable); + thread.start(); + } catch(Exception e) { + msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while creating a new Thread", "APIH", null, null); + response = getTenantIsolationRequest().buildServiceErrorResponse (HttpStatus.SC_INTERNAL_SERVER_ERROR, + MsoException.ServiceException, + "Failed creating a Thread " + e.getMessage (), + ErrorNumbers.SVC_NO_SERVER_RESOURCES, + null); + getTenantIsolationRequest().updateFinalStatus (Status.FAILED); + msoLogger.error (MessageEnum.APIH_GENERAL_EXCEPTION, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.UnknownError, "Exception while creating a new Thread"); + msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.UnknownError, "Exception while creating a new Thread"); + msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ()); + return response; + } + + try { + String encodedValue = new String(instanceId.getBytes("UTF-8")); + msoLogger.debug ("InstanceId: " + instanceId + " encoded to " + encodedValue); + + TenantSyncResponse tenantResponse = new TenantSyncResponse(); + RequestReferences reqReference = new RequestReferences(); + reqReference.setInstanceId(encodedValue); + reqReference.setRequestId(requestId); + tenantResponse.setRequestReferences(reqReference); + + response = Response.ok(tenantResponse).build(); + + msoLogger.debug ("Successful Sync response " + response.getEntity() + " with status code " + response.getStatus()); + + return response; + } catch(Exception e) { + msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while building sync response", "APIH", null, null); + response = getTenantIsolationRequest().buildServiceErrorResponse (HttpStatus.SC_INTERNAL_SERVER_ERROR, + MsoException.ServiceException, + "Failed sending Sync Response " + e.getMessage (), + ErrorNumbers.SVC_NO_SERVER_RESOURCES, + null); + getTenantIsolationRequest().updateFinalStatus (Status.FAILED); + msoLogger.error (MessageEnum.APIH_GENERAL_EXCEPTION, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.UnknownError, "Exception while sending sync Response"); + msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.UnknownError, "Exception while sending sync Response"); + msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ()); + return response; + } + } + + private InfraActiveRequests duplicateCheck(Action action, HashMap instanceIdMap, long startTime, + String instanceName, String requestScope) throws Exception { + InfraActiveRequests dup = null; + try { + dup = getRequestsDatabase().checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope); + } catch (Exception e) { + msoLogger.error (MessageEnum.APIH_DUPLICATE_CHECK_EXC, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Error during duplicate check ", e); + msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Error during duplicate check"); + throw new Exception(e); + } + return dup; + } + + private CloudOrchestrationRequest convertJsonToCloudOrchestrationRequest(String requestJSON, Action action, long startTime, + CloudOrchestrationRequest cor) throws Exception { + try{ + msoLogger.debug("Converting incoming JSON request to Object"); + ObjectMapper mapper = new ObjectMapper(); + cor = mapper.readValue(requestJSON, CloudOrchestrationRequest.class); + } catch(Exception e){ + msoLogger.debug ("Mapping of request to JSON object failed : ", e); + if (getTenantIsolationRequest().getRequestId () != null) { + msoLogger.debug ("Mapping of request to JSON object failed"); + getTenantIsolationRequest().createRequestRecord (Status.FAILED, action); + } + msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e); + msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Mapping of request to JSON object failed"); + throw new Exception(e); + } + return cor; + } + + public TenantIsolationRequest getTenantIsolationRequest() { + if(tenantIsolationRequest == null) { + tenantIsolationRequest = new TenantIsolationRequest(); + } + return tenantIsolationRequest; + } + + public void setTenantIsolationRequest(TenantIsolationRequest tenantIsolationRequest) { + this.tenantIsolationRequest = tenantIsolationRequest; + } + + public RequestsDatabase getRequestsDatabase() { + if(requestsDatabase == null) { + requestsDatabase = RequestsDatabase.getInstance(); + } + return requestsDatabase; + } + + public void setRequestsDatabase(RequestsDatabase requestsDatabase) { + this.requestsDatabase = requestsDatabase; + } + + public TenantIsolationRunnable getThread() { + if(tenantIsolation == null) { + tenantIsolation = new TenantIsolationRunnable(); + } + return tenantIsolation; + } + + public void setThread(TenantIsolationRunnable thread) { + this.tenantIsolation = thread; + } +} diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/CloudOrchestrationRequest.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/CloudOrchestrationRequest.java new file mode 100644 index 0000000000..5e6c1ecd60 --- /dev/null +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/CloudOrchestrationRequest.java @@ -0,0 +1,81 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.mso.apihandlerinfra.tenantisolation; + +import java.io.Serializable; + +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.Distribution; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.RequestDetails; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class CloudOrchestrationRequest implements Serializable { + + private static final long serialVersionUID = -4959169541182257787L; + @JsonProperty("requestDetails") + private RequestDetails requestDetails; + @JsonProperty("operationalEnvironmentId") + private String operationalEnvironmentId; + @JsonProperty("distribution") + private Distribution distribution; + @JsonProperty("distributionId") + private String distributionId; + + public String getOperationalEnvironmentId() { + return operationalEnvironmentId; + } + + public void setOperationalEnvironmentId(String operationalEnvironmentId) { + this.operationalEnvironmentId = operationalEnvironmentId; + } + + public RequestDetails getRequestDetails() { + return requestDetails; + } + + public void setRequestDetails(RequestDetails requestDetails){ + this.requestDetails = requestDetails; + } + + public Distribution getDistribution() { + return distribution; + } + + public void setDistribution(Distribution distribution) { + this.distribution = distribution; + } + + public String getDistributionId() { + return distributionId; + } + + public void setDistributionId(String distributionId) { + this.distributionId = distributionId; + } + + @Override + public String toString() { + return "ServiceInstancesRequest [requestDetails=" + requestDetails + + ", operationalEnvironmentId=" + operationalEnvironmentId + + ", distribution=" + distribution + + ", distributionId=" + distributionId + "]"; + } +} diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/CloudResourcesOrchestration.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/CloudResourcesOrchestration.java new file mode 100644 index 0000000000..a580a483c2 --- /dev/null +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/CloudResourcesOrchestration.java @@ -0,0 +1,335 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.mso.apihandlerinfra.tenantisolation; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriInfo; + +import org.apache.http.HttpStatus; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.openecomp.mso.apihandler.common.ErrorNumbers; +import org.openecomp.mso.apihandlerinfra.Constants; +import org.openecomp.mso.apihandlerinfra.Messages; +import org.openecomp.mso.apihandlerinfra.MsoException; +import org.openecomp.mso.apihandlerinfra.Status; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.CloudOrchestrationRequestList; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.CloudOrchestrationResponse; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.InstanceReferences; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.Request; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.RequestDetails; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.RequestStatus; +import org.openecomp.mso.logger.MessageEnum; +import org.openecomp.mso.logger.MsoAlarmLogger; +import org.openecomp.mso.logger.MsoLogger; +import org.openecomp.mso.requestsdb.InfraActiveRequests; +import org.openecomp.mso.requestsdb.RequestsDatabase; +import org.openecomp.mso.utils.UUIDChecker; + +import com.wordnik.swagger.annotations.Api; +import com.wordnik.swagger.annotations.ApiOperation; + +@Path("/cloudResourcesRequests") +@Api(value="/cloudResourcesRequests",description="API GET Requests for cloud resources - Tenant Isolation") +public class CloudResourcesOrchestration { + + private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH); + private static MsoAlarmLogger alarmLogger = new MsoAlarmLogger (); + private RequestsDatabase requestsDB = null; + + @POST + @Path("/{version: [vV][1]}/{requestId}/unlock") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @ApiOperation(value="Unlock CloudOrchestration requests for a specified requestId") + public Response unlockOrchestrationRequest(String requestJSON, @PathParam("requestId") String requestId, @PathParam("version") String version) { + TenantIsolationRequest msoRequest = new TenantIsolationRequest(requestId); + InfraActiveRequests requestDB = null; + Request request = null; + CloudOrchestrationRequest cor = null; + + long startTime = System.currentTimeMillis (); + msoLogger.debug ("requestId is: " + requestId); + + try{ + ObjectMapper mapper = new ObjectMapper(); + cor = mapper.readValue(requestJSON, CloudOrchestrationRequest.class); + } catch(Exception e){ + msoLogger.debug ("Mapping of request to JSON object failed : ", e); + Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException, + "Mapping of request to JSON object failed. " + e.getMessage(), + ErrorNumbers.SVC_BAD_PARAMETER, null); + if (msoRequest.getRequestId () != null) { + msoLogger.debug ("Mapping of request to JSON object failed"); + } + msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e); + msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Mapping of request to JSON object failed"); + msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ()); + return response; + } + + try{ + msoRequest.parseOrchestration(cor); + } catch (Exception e) { + msoLogger.debug ("Validation failed: ", e); + Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException, + "Error parsing request. " + e.getMessage(), + ErrorNumbers.SVC_BAD_PARAMETER, null); + if (msoRequest.getRequestId () != null) { + msoLogger.debug ("Logging failed message to the database"); + } + msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e); + msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Validation of the input request failed"); + msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ()); + return response; + } + + try { + requestDB = getRequestsDB().getRequestFromInfraActive(requestId); + + if(requestDB == null) { + Response resp = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND, + MsoException.ServiceException, + "Orchestration RequestId " + requestId + " is not found in DB", + ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, + null); + msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Null response from RequestDB when searching by RequestId"); + msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "Null response from RequestDB when searching by RequestId"); + msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ()); + return resp; + + }else{ + request = mapInfraActiveRequestToRequest(requestDB); + RequestStatus reqStatus = request.getRequestStatus(); + Status status = Status.valueOf(reqStatus.getRequestState()); + if(status == Status.IN_PROGRESS || status == Status.PENDING || status == Status.PENDING_MANUAL_TASK){ + msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.UNLOCKED); + reqStatus.setRequestState(Status.UNLOCKED.toString ()); + getRequestsDB().updateInfraStatus (requestId, + Status.UNLOCKED.toString (), + Constants.MODIFIED_BY_APIHANDLER); + + msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "RequestId " + requestId + " has been unlocked"); + + }else{ + Response resp = msoRequest.buildServiceErrorResponse (HttpStatus.SC_BAD_REQUEST, + MsoException.ServiceException, + "Orchestration RequestId " + requestId + " has a status of " + status + " and can not be unlocked", + ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, + null); + msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Orchestration RequestId " + requestId + " has a status of " + status + " and can not be unlocked"); + msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataError, "Orchestration RequestId " + requestId + " has a status of " + status + " and can not be unlocked"); + msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ()); + return resp; + } + } + } catch (Exception e) { + msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communciate with Request DB - Infra Request Lookup", e); + msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED); + Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND, + MsoException.ServiceException, + e.getMessage (), + ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB, + null); + alarmLogger.sendAlarm ("MsoDatabaseAccessError", + MsoAlarmLogger.CRITICAL, + Messages.getErrors().get (ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB)); + msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while communciate with Request DB"); + msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ()); + return response; + + } + + return Response.status (HttpStatus.SC_NO_CONTENT).entity ("").build (); + } + + @GET + @Path("/{version:[vV][1]}") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @ApiOperation(value="Get status of an Operational Environment based on filter criteria",response=Response.class) + public Response getOperationEnvironmentStatusFilter(@Context UriInfo ui, @PathParam("version") String version ) { + MsoLogger.setServiceName ("getOperationEnvironmentStatusFilter"); + UUIDChecker.generateUUID(msoLogger); + long startTime = System.currentTimeMillis (); + + MultivaluedMap queryParams = ui.getQueryParameters(); + List requestIdKey = queryParams.get("requestId"); + + if(queryParams.size() == 1 && requestIdKey != null) { + msoLogger.debug ("Entered requestId GET OperationalEnvironment Request"); + String requestId = requestIdKey.get(0); + + CloudOrchestrationResponse cloudOrchestrationGetResponse = new CloudOrchestrationResponse(); + TenantIsolationRequest tenantIsolationRequest = new TenantIsolationRequest (requestId); + InfraActiveRequests requestDB = null; + + try { + requestDB = getRequestsDB().getRequestFromInfraActive(requestId); + + } catch (Exception e) { + msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communciate with Request DB - Infra Request Lookup", e); + // TODO Will need to set Status for tenantIsolationRequest + // tenantIsolationRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED); + Response response = tenantIsolationRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND, + MsoException.ServiceException, + e.getMessage (), + ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB, + null); + alarmLogger.sendAlarm ("MsoDatabaseAccessError", + MsoAlarmLogger.CRITICAL, + Messages.getErrors().get (ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB)); + msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while communciate with Request DB"); + msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ()); + return response; + } + + if(requestDB == null) { + Response resp = tenantIsolationRequest.buildServiceErrorResponse (HttpStatus.SC_NO_CONTENT, + MsoException.ServiceException, + "Orchestration RequestId " + requestId + " is not found in DB", + ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, + null); + msoLogger.error (MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Null response from RequestDB when searching by RequestId"); + msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "Null response from RequestDB when searching by RequestId"); + msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ()); + return resp; + } + + Request request = mapInfraActiveRequestToRequest(requestDB); + cloudOrchestrationGetResponse.setRequest(request); + return Response.status(200).entity(cloudOrchestrationGetResponse).build(); + + } else { + msoLogger.debug ("Entered GET OperationalEnvironment filter Request"); + TenantIsolationRequest tenantIsolationRequest = new TenantIsolationRequest (); + List activeRequests = null; + CloudOrchestrationRequestList orchestrationList = null; + + try{ + Map orchestrationMap = tenantIsolationRequest.getOrchestrationFilters(queryParams); + activeRequests = getRequestsDB().getCloudOrchestrationFiltersFromInfraActive(orchestrationMap); + orchestrationList = new CloudOrchestrationRequestList(); + List requestLists = new ArrayList(); + + for(InfraActiveRequests infraActive : activeRequests){ + + Request request = mapInfraActiveRequestToRequest(infraActive); + CloudOrchestrationResponse requestList = new CloudOrchestrationResponse(); + requestList.setRequest(request); + requestLists.add(requestList); + } + orchestrationList.setRequestList(requestLists); + + }catch(Exception e){ + msoLogger.debug ("Get Orchestration Request with Filters Failed : ", e); + Response response = tenantIsolationRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, MsoException.ServiceException, + "Get CloudOrchestration Request with Filters Failed. " + e.getMessage(), + ErrorNumbers.SVC_GENERAL_SERVICE_ERROR, null); + msoLogger.error (MessageEnum.APIH_GENERAL_EXCEPTION, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Get Orchestration Request with Filters Failed : " + e); + msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataError, "Get CloudOrchestration Request with Filters Failed"); + msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ()); + return response; + } + return Response.status(200).entity(orchestrationList).build(); + } + } + + private Request mapInfraActiveRequestToRequest(InfraActiveRequests requestDB) { + Request request = new Request(); + request.setRequestId(requestDB.getRequestId()); + request.setRequestScope(requestDB.getRequestScope()); + request.setRequestType(requestDB.getRequestAction()); + + InstanceReferences ir = new InstanceReferences(); + + if(requestDB.getOperationalEnvId() != null) + ir.setOperationalEnvironmentId(requestDB.getOperationalEnvId()); + if(requestDB.getOperationalEnvName() != null) + ir.setOperationalEnvName(requestDB.getOperationalEnvName()); + if(requestDB.getRequestorId() != null) + ir.setRequestorId(requestDB.getRequestorId()); + + request.setInstanceReferences(ir); + String requestBody = requestDB.getRequestBody(); + RequestDetails requestDetails = null; + + try{ + ObjectMapper mapper = new ObjectMapper(); + requestDetails = mapper.readValue(requestBody, RequestDetails.class); + + }catch(Exception e){ + msoLogger.debug("Exception caught mapping requestBody to RequestDetails"); + } + + request.setRequestDetails(requestDetails); + String startTimeStamp = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss").format(requestDB.getStartTime()) + " GMT"; + request.setStartTime(startTimeStamp); + + RequestStatus status = new RequestStatus(); + if(requestDB.getStatusMessage() != null){ + status.setStatusMessage(requestDB.getStatusMessage()); + } + + if(requestDB.getEndTime() != null){ + String endTimeStamp = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss").format(requestDB.getEndTime()) + " GMT"; + status.setTimeStamp(endTimeStamp); + } + + if(requestDB.getRequestStatus() != null){ + status.setRequestState(requestDB.getRequestStatus()); + } + + if(requestDB.getProgress() != null){ + status.setPercentProgress(requestDB.getProgress().toString()); + } + + request.setRequestStatus(status); + + return request; + } + + public RequestsDatabase getRequestsDB() { + if(requestsDB == null) { + requestsDB = RequestsDatabase.getInstance(); + } + return requestsDB; + } + + public void setRequestsDB(RequestsDatabase requestsDB) { + this.requestsDB = requestsDB; + } + + +} diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/GrmClientPropertiesImpl.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/GrmClientPropertiesImpl.java new file mode 100644 index 0000000000..fc6d1a551f --- /dev/null +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/GrmClientPropertiesImpl.java @@ -0,0 +1,70 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.mso.apihandlerinfra.tenantisolation; + +import java.net.MalformedURLException; +import java.net.URL; + +import javax.ws.rs.core.MediaType; + +import org.openecomp.mso.apihandlerinfra.MsoPropertiesUtils; +import org.openecomp.mso.client.grm.GRMProperties; +import org.openecomp.mso.properties.MsoJavaProperties; + +public class GrmClientPropertiesImpl implements GRMProperties { + + final MsoJavaProperties props; + + public GrmClientPropertiesImpl() { + this.props = MsoPropertiesUtils.loadMsoProperties (); + } + + @Override + public URL getEndpoint() throws MalformedURLException { + return new URL(props.getProperty("grm.endpoint", null)); + } + + @Override + public String getSystemName() { + return "MSO"; + } + + @Override + public String getDefaultVersion() { + return "v1"; + } + + @Override + public String getUsername() { + return props.getProperty("grm.username", null); + } + + @Override + public String getPassword() { + return props.getProperty("grm.password", null); + } + + @Override + public String getContentType() { + return MediaType.APPLICATION_JSON; + } + +} diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/ModelDistributionRequest.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/ModelDistributionRequest.java new file mode 100644 index 0000000000..eb5306a155 --- /dev/null +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/ModelDistributionRequest.java @@ -0,0 +1,160 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.mso.apihandlerinfra.tenantisolation; + +import java.util.List; + +import javax.ws.rs.Consumes; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.xml.bind.ValidationException; + +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpStatus; +import org.openecomp.mso.apihandler.common.ErrorNumbers; +import org.openecomp.mso.apihandlerinfra.Constants; +import org.openecomp.mso.apihandlerinfra.MsoException; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.Action; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.Distribution; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.Status; +import org.openecomp.mso.logger.MessageEnum; +import org.openecomp.mso.logger.MsoLogger; +import org.openecomp.mso.serviceinstancebeans.RequestError; +import org.openecomp.mso.serviceinstancebeans.ServiceException; + +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.wordnik.swagger.annotations.Api; +import com.wordnik.swagger.annotations.ApiOperation; +import com.wordnik.swagger.jaxrs.PATCH; + +@Path("/modelDistributions") +@Api(value="/modelDistributions",description="API Requests for Model Distributions") +public class ModelDistributionRequest { + + private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH); + private TenantIsolationRunnable tenantIsolation = null; + + @PATCH + @Path("/{version:[vV][1]}/distributions/{distributionId}") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @ApiOperation(value="Update model distribution status",response=Response.class) + public Response updateModelDistributionStatus(String requestJSON, @PathParam("version") String version, @PathParam("distributionId") String distributionId) { + long startTime = System.currentTimeMillis (); + Distribution distributionRequest = null; + + try { + ObjectMapper mapper = new ObjectMapper(); + distributionRequest = mapper.readValue(requestJSON, Distribution.class); + } catch(Exception e) { + msoLogger.debug ("Mapping of request to JSON object failed : ", e); + Response response = buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, + MsoException.ServiceException, + "Mapping of request to JSON object failed. " + e.getMessage(), + ErrorNumbers.SVC_BAD_PARAMETER, null); + msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e); + msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Mapping of request to JSON object failed"); + msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ()); + return response; + } + + try { + parse(distributionRequest); + } catch(Exception e) { + msoLogger.debug ("Validation failed: ", e); + msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e); + msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Validation of the input request failed"); + Response response = buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, + MsoException.ServiceException, + "Error parsing request. " + e.getMessage(), + ErrorNumbers.SVC_BAD_PARAMETER, null); + msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ()); + return response; + } + + CloudOrchestrationRequest cor = new CloudOrchestrationRequest(); + cor.setDistribution(distributionRequest); + cor.setDistributionId(distributionId); + + TenantIsolationRunnable runnable = getThread(); + runnable.setAction(Action.distributionStatus); + runnable.setCor(cor); + runnable.setOperationalEnvType(null); + runnable.setRequestId(null); + + Thread thread = new Thread(runnable); + thread.start(); + + return Response.ok().build(); + } + + private void parse(Distribution distributionRequest) throws ValidationException { + if(distributionRequest.getStatus() == null) { + throw new ValidationException("status"); + } + + if(StringUtils.isBlank(distributionRequest.getErrorReason()) && Status.DISTRIBUTION_COMPLETE_ERROR.equals(distributionRequest.getStatus())) { + throw new ValidationException("errorReason"); + } + } + + private Response buildServiceErrorResponse (int httpResponseCode, MsoException exceptionType, String text, + String messageId, List variables) { + RequestError re = new RequestError(); + ServiceException se = new ServiceException(); + se.setMessageId(messageId); + se.setText(text); + if(variables != null){ + if(variables != null){ + for(String variable: variables){ + se.getVariables().add(variable); + } + } + } + re.setServiceException(se); + + String requestErrorStr = null; + try{ + ObjectMapper mapper = new ObjectMapper(); + mapper.setSerializationInclusion(Include.NON_DEFAULT); + requestErrorStr = mapper.writeValueAsString(re); + }catch(Exception e){ + msoLogger.error (MessageEnum.APIH_VALIDATION_ERROR, "", "", MsoLogger.ErrorCode.DataError, "Exception in buildServiceErrorResponse writing exceptionType to string ", e); + } + + return Response.status (httpResponseCode).entity(requestErrorStr).build (); + } + + public TenantIsolationRunnable getThread() { + if(tenantIsolation == null) { + tenantIsolation = new TenantIsolationRunnable(); + } + return tenantIsolation; + } + + public void setThread(TenantIsolationRunnable thread) { + this.tenantIsolation = thread; + } +} diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/OperationalEnvironmentProcessFactory.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/OperationalEnvironmentProcessFactory.java new file mode 100644 index 0000000000..e39c1d7ef1 --- /dev/null +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/OperationalEnvironmentProcessFactory.java @@ -0,0 +1,54 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.mso.apihandlerinfra.tenantisolation; + +import org.openecomp.mso.apihandlerinfra.tenantisolation.process.ActivateVnfOperationalEnvironment; +import org.openecomp.mso.apihandlerinfra.tenantisolation.process.ActivateVnfStatusOperationalEnvironment; +import org.openecomp.mso.apihandlerinfra.tenantisolation.process.CreateEcompOperationalEnvironment; +import org.openecomp.mso.apihandlerinfra.tenantisolation.process.CreateVnfOperationalEnvironment; +import org.openecomp.mso.apihandlerinfra.tenantisolation.process.DeactivateVnfOperationalEnvironment; +import org.openecomp.mso.apihandlerinfra.tenantisolation.process.OperationalEnvironmentProcess; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.Action; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.OperationalEnvironment; + +public class OperationalEnvironmentProcessFactory { + + public OperationalEnvironmentProcess getOperationalEnvironmentProcess(Action action, String operationalEnvType, CloudOrchestrationRequest cor, String requestId) throws Exception{ + + if(Action.create.equals(action)) { + if(OperationalEnvironment.ECOMP.name().equalsIgnoreCase(operationalEnvType)) { + return new CreateEcompOperationalEnvironment(cor, requestId); + } else if(OperationalEnvironment.VNF.name().equalsIgnoreCase(operationalEnvType)) { + return new CreateVnfOperationalEnvironment(cor, requestId); + } else { + throw new Exception("Invalid OperationalEnvironment Type specified for Create Action"); + } + } else if(Action.activate.equals(action)) { + return new ActivateVnfOperationalEnvironment(cor, requestId); + } else if(Action.deactivate.equals(action)) { + return new DeactivateVnfOperationalEnvironment(cor, requestId); + } else if(Action.distributionStatus.equals(action)) { + return new ActivateVnfStatusOperationalEnvironment(cor, requestId); + } else { + throw new Exception("Invalid Action specified: " + action); + } + } +} diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/TenantIsolationRequest.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/TenantIsolationRequest.java new file mode 100644 index 0000000000..ce9d7b3a30 --- /dev/null +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/TenantIsolationRequest.java @@ -0,0 +1,476 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.mso.apihandlerinfra.tenantisolation; + +import java.sql.Timestamp; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.core.Response; + +import org.apache.commons.lang3.StringUtils; +import org.hibernate.Session; +import org.openecomp.mso.apihandler.common.ValidationException; +import org.openecomp.mso.apihandlerinfra.Constants; +import org.openecomp.mso.apihandlerinfra.MsoException; +import org.openecomp.mso.apihandlerinfra.Status; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.Action; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.Manifest; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.OperationalEnvironment; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.RelatedInstance; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.RelatedInstanceList; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.RequestDetails; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.RequestInfo; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.RequestParameters; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.ResourceType; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.ServiceModelList; +import org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType; +import org.openecomp.mso.db.AbstractSessionFactoryManager; +import org.openecomp.mso.logger.MessageEnum; +import org.openecomp.mso.logger.MsoLogger; +import org.openecomp.mso.requestsdb.InfraActiveRequests; +import org.openecomp.mso.requestsdb.RequestsDatabase; +import org.openecomp.mso.requestsdb.RequestsDbSessionFactoryManager; +import org.openecomp.mso.serviceinstancebeans.PolicyException; +import org.openecomp.mso.serviceinstancebeans.RequestError; +import org.openecomp.mso.serviceinstancebeans.ServiceException; +import org.openecomp.mso.utils.UUIDChecker; + +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class TenantIsolationRequest { + + private String requestId; + private String requestJSON; + private RequestInfo requestInfo; + + private String errorMessage; + private String errorCode; + private String httpResponse; + private String responseBody; + private RequestStatusType status; + private CloudOrchestrationRequest cor; + private String operationalEnvironmentId; + private long progress = Constants.PROGRESS_REQUEST_RECEIVED; + private String requestScope; + + + + private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH); + protected AbstractSessionFactoryManager requestsDbSessionFactoryManager = new RequestsDbSessionFactoryManager (); + + TenantIsolationRequest (String requestId) { + this.requestId = requestId; + MsoLogger.setLogContext (requestId, null); + } + + TenantIsolationRequest () { + MsoLogger.setLogContext (requestId, null); + } + + void parse(CloudOrchestrationRequest request, HashMap instanceIdMap, Action action) throws ValidationException { + msoLogger.debug ("Validating the Cloud Orchestration request"); + this.cor = request; + this.requestInfo = request.getRequestDetails().getRequestInfo(); + + try{ + ObjectMapper mapper = new ObjectMapper(); + requestJSON = mapper.writeValueAsString(request.getRequestDetails()); + + } catch(Exception e){ + throw new ValidationException ("Parse ServiceInstanceRequest to JSON string"); + } + + String envId = null; + if(instanceIdMap != null) { + envId = instanceIdMap.get("operationalEnvironmentId"); + if(envId != null && !UUIDChecker.isValidUUID (envId)){ + throw new ValidationException ("operationalEnvironmentId"); + } + cor.setOperationalEnvironmentId(envId); + } + + this.operationalEnvironmentId = envId; + + RequestDetails requestDetails = request.getRequestDetails(); + RequestParameters requestParameters = requestDetails.getRequestParameters(); + + requestInfoValidation(action, requestInfo); + + requestParamsValidation(action, requestParameters); + + relatedInstanceValidation(action, requestDetails, requestParameters); + + } + + private void relatedInstanceValidation(Action action, RequestDetails requestDetails, RequestParameters requestParameters) throws ValidationException { + RelatedInstanceList[] instanceList = requestDetails.getRelatedInstanceList(); + + if((Action.activate.equals(action) || Action.deactivate.equals(action)) && OperationalEnvironment.ECOMP.equals(requestParameters.getOperationalEnvironmentType())) { + throw new ValidationException("operationalEnvironmentType in requestParameters"); + } + + if(!Action.deactivate.equals(action) && OperationalEnvironment.VNF.equals(requestParameters.getOperationalEnvironmentType())) { + if(instanceList != null && instanceList.length > 0) { + for(RelatedInstanceList relatedInstanceList : instanceList){ + RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance(); + + if(relatedInstance.getResourceType() == null) { + throw new ValidationException("ResourceType in relatedInstance"); + } + + if(!empty(relatedInstance.getInstanceName()) && !relatedInstance.getInstanceName().matches(Constants.VALID_INSTANCE_NAME_FORMAT)) { + throw new ValidationException ("instanceName format"); + } + + if (empty (relatedInstance.getInstanceId ())) { + throw new ValidationException ("instanceId in relatedInstance"); + } + + if (!UUIDChecker.isValidUUID (relatedInstance.getInstanceId ())) { + throw new ValidationException ("instanceId format in relatedInstance"); + } + } + } else { + throw new ValidationException ("relatedInstanceList"); + } + } + } + + private void requestParamsValidation(Action action, RequestParameters requestParameters) throws ValidationException { + + if(requestParameters != null) { + if(!Action.deactivate.equals(action) && requestParameters.getOperationalEnvironmentType() == null) { + throw new ValidationException ("OperationalEnvironmentType"); + } + + if (Action.create.equals(action) && empty(requestParameters.getTenantContext())) { + throw new ValidationException ("Tenant Context"); + } + if (!Action.deactivate.equals(action) && empty(requestParameters.getWorkloadContext())) { + throw new ValidationException ("Workload Context"); + } + + Manifest manifest = requestParameters.getManifest(); + + if(Action.activate.equals(action)) { + if(manifest == null) { + throw new ValidationException ("Manifest on Activate"); + } else { + List serviceModelList = manifest.getServiceModelList(); + + if(serviceModelList.size() == 0) { + throw new ValidationException (" empty ServiceModelList"); + } + + for(ServiceModelList list : serviceModelList) { + if(empty(list.getServiceModelVersionId())) { + throw new ValidationException ("ServiceModelVersionId"); + } + + if (!UUIDChecker.isValidUUID (list.getServiceModelVersionId())) { + throw new ValidationException ("ServiceModelVersionId format"); + } + + if(list.getRecoveryAction() == null) { + throw new ValidationException ("RecoveryAction"); + } + } + } + } + } else if(!Action.deactivate.equals(action)) { + throw new ValidationException("request Parameters"); + } + } + + private void requestInfoValidation(Action action, RequestInfo requestInfo) throws ValidationException { + + if(Action.create.equals(action) && empty(requestInfo.getInstanceName())) { + throw new ValidationException ("instanceName"); + } + + if(!empty(requestInfo.getInstanceName()) && !requestInfo.getInstanceName().matches(Constants.VALID_INSTANCE_NAME_FORMAT)) { + throw new ValidationException ("instanceName format"); + } + + if (empty(requestInfo.getSource())) { + throw new ValidationException ("source"); + } + + if(empty(requestInfo.getRequestorId())) { + throw new ValidationException ("requestorId"); + } + + ResourceType resourceType = requestInfo.getResourceType(); + if(resourceType == null) { + throw new ValidationException ("resourceType"); + } + + this.requestScope = resourceType.name(); + } + + void parseOrchestration (CloudOrchestrationRequest cor) throws ValidationException { + + msoLogger.debug ("Validating the Orchestration request"); + + this.cor = cor; + + try{ + ObjectMapper mapper = new ObjectMapper(); + //mapper.configure(Feature.WRAP_ROOT_VALUE, true); + requestJSON = mapper.writeValueAsString(cor.getRequestDetails()); + + } catch(Exception e){ + throw new ValidationException ("Parse CloudOrchestrationRequest to JSON string", e); + } + + this.requestInfo = cor.getRequestDetails().getRequestInfo(); + + if (this.requestInfo == null) { + throw new ValidationException ("requestInfo"); + } + + if (empty (requestInfo.getSource ())) { + throw new ValidationException ("source"); + } + if (empty (requestInfo.getRequestorId ())) { + throw new ValidationException ("requestorId"); + } + } + + public void createRequestRecord (Status status, Action action) { + Session session = null; + try { + + session = requestsDbSessionFactoryManager.getSessionFactory ().openSession (); + session.beginTransaction (); + + if (null == cor) { + cor = new CloudOrchestrationRequest(); + } + + InfraActiveRequests aq = new InfraActiveRequests (); + aq.setRequestId (requestId); + + aq.setRequestAction(action.name()); + aq.setAction(action.name()); + + Timestamp startTimeStamp = new Timestamp (System.currentTimeMillis()); + + aq.setStartTime (startTimeStamp); + + if (requestInfo != null) { + + if(requestInfo.getSource() != null){ + aq.setSource(requestInfo.getSource()); + } + if(requestInfo.getRequestorId() != null) { + aq.setRequestorId(requestInfo.getRequestorId()); + } + if(requestInfo.getResourceType() != null) { + aq.setRequestScope(requestInfo.getResourceType().name()); + } + } + + if(ResourceType.operationalEnvironment.name().equalsIgnoreCase(requestScope)) { + aq.setOperationalEnvId(operationalEnvironmentId); + aq.setOperationalEnvName(requestInfo.getInstanceName()); + } + + aq.setRequestBody (this.requestJSON); + + aq.setRequestStatus (status.toString ()); + aq.setLastModifiedBy (Constants.MODIFIED_BY_APIHANDLER); + + if ((status == Status.FAILED) || (status == Status.COMPLETE)) { + aq.setStatusMessage (this.errorMessage); + aq.setResponseBody (this.responseBody); + aq.setProgress(new Long(100)); + + Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis()); + aq.setEndTime (endTimeStamp); + } else if(status == Status.IN_PROGRESS) { + aq.setProgress(Constants.PROGRESS_REQUEST_IN_PROGRESS); + } + + msoLogger.debug ("About to insert a record"); + + session.save (aq); + session.getTransaction ().commit (); + session.close (); + } catch (Exception e) { + msoLogger.error (MessageEnum.APIH_DB_INSERT_EXC, "", "", MsoLogger.ErrorCode.DataError, "Exception when creation record request", e); + if (session != null) { + session.close (); + } + if (!status.equals (Status.FAILED)) { + throw e; + } + } + } + + + public Map getOrchestrationFilters (MultivaluedMap queryParams) throws ValidationException { + String queryParam = null; + Map orchestrationFilterParams = new HashMap(); + + for (Entry> entry : queryParams.entrySet()) { + queryParam = entry.getKey(); + try{ + for(String value : entry.getValue()) { + if(StringUtils.isBlank(value)) { + throw new Exception(queryParam + " value"); + } + orchestrationFilterParams.put(queryParam, value); + } + }catch(Exception e){ + throw new ValidationException (e.getMessage()); + } + } + + return orchestrationFilterParams; + } + + /** + * Build Error Response for Exception handling. + * + * @param int + * @param httpResponseCode the HTTP response code + * @param exceptionType. + * @param text the error description + * @param messageId + * @return the web service response + * + */ + public Response buildServiceErrorResponse (int httpResponseCode, + MsoException exceptionType, + String text, + String messageId, + List variables) { + + this.errorCode = messageId; + + if (text != null) { + this.errorMessage = text; + } + else { + this.errorMessage = ""; + } + this.httpResponse = Integer.toString(httpResponseCode); + if(errorMessage.length() > 1999){ + errorMessage = errorMessage.substring(0, 1999); + } + + RequestError re = new RequestError(); + + if(exceptionType.name().equals("PolicyException")){ + + PolicyException pe = new PolicyException(); + pe.setMessageId(messageId); + pe.setText(text); + if(variables != null){ + for(String variable: variables){ + pe.getVariables().add(variable); + } + } + re.setPolicyException(pe); + + } else { + + ServiceException se = new ServiceException(); + se.setMessageId(messageId); + se.setText(text); + if(variables != null){ + if(variables != null){ + for(String variable: variables){ + se.getVariables().add(variable); + } + } + } + re.setServiceException(se); + } + + String requestErrorStr = null; + + try{ + ObjectMapper mapper = new ObjectMapper(); + mapper.setSerializationInclusion(Include.NON_DEFAULT); + requestErrorStr = mapper.writeValueAsString(re); + }catch(Exception e){ + msoLogger.error (MessageEnum.APIH_VALIDATION_ERROR, "", "", MsoLogger.ErrorCode.DataError, "Exception in buildServiceErrorResponse writing exceptionType to string ", e); + } + + + return Response.status (httpResponseCode).entity(requestErrorStr).build (); + + } + + private static boolean empty(String s) { + return (s == null || s.trim().isEmpty()); + } + + public String getRequestId () { + return requestId; + } + + public void setRequestId(String requestId) { + this.requestId = requestId; + } + + public void updateFinalStatus(Status failed) { + try { + (RequestsDatabase.getInstance()).updateInfraFinalStatus (requestId, + status.toString (), + this.errorMessage, + this.progress, + this.responseBody, + Constants.MODIFIED_BY_APIHANDLER); + } catch (Exception e) { + msoLogger.error(MessageEnum.APIH_DB_UPDATE_EXC, e.getMessage(), "", "", MsoLogger.ErrorCode.DataError, "Exception when updating record in DB"); + msoLogger.debug ("Exception: ", e); + } + } + + public void setStatus (RequestStatusType status) { + this.status = status; + switch (status) { + case FAILED: + case COMPLETE: + this.progress = Constants.PROGRESS_REQUEST_COMPLETED; + break; + case IN_PROGRESS: + this.progress = Constants.PROGRESS_REQUEST_IN_PROGRESS; + break; + } + } + + public String getOperationalEnvironmentId() { + return operationalEnvironmentId; + } + + public void setOperationalEnvironmentId(String operationalEnvironmentId) { + this.operationalEnvironmentId = operationalEnvironmentId; + } +} diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/TenantIsolationRunnable.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/TenantIsolationRunnable.java new file mode 100644 index 0000000000..167b88fbc8 --- /dev/null +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/TenantIsolationRunnable.java @@ -0,0 +1,106 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.mso.apihandlerinfra.tenantisolation; + +import org.openecomp.mso.apihandlerinfra.Constants; +import org.openecomp.mso.apihandlerinfra.tenantisolation.process.OperationalEnvironmentProcess; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.Action; +import org.openecomp.mso.logger.MessageEnum; +import org.openecomp.mso.logger.MsoLogger; +import org.openecomp.mso.requestsdb.RequestsDBHelper; + +public class TenantIsolationRunnable implements Runnable { + + private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH); + private OperationalEnvironmentProcessFactory factory = null; + private Action action; + private String operationalEnvType; + private CloudOrchestrationRequest cor; + private String requestId; + protected RequestsDBHelper requestDb; + + @Override + public void run() { + msoLogger.debug ("Starting threadExecution in TenantIsolationRunnable for Action " + action.name() + " and OperationalEnvType: " + operationalEnvType); + try { + OperationalEnvironmentProcess isolation = getFactory().getOperationalEnvironmentProcess(action, operationalEnvType, cor, requestId); + isolation.execute(); + } catch(Exception e) { + msoLogger.debug ("Exception during Thread initiation: ", e); + msoLogger.error (MessageEnum.APIH_GENERAL_EXCEPTION, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.UnknownError, null, e); + getRequestDb().updateInfraFailureCompletion(e.getMessage(), requestId, cor.getOperationalEnvironmentId()); + } + } + + public Action getAction() { + return action; + } + + public void setAction(Action action) { + this.action = action; + } + + public String getOperationalEnvType() { + return operationalEnvType; + } + + public void setOperationalEnvType(String operationalEnvType) { + this.operationalEnvType = operationalEnvType; + } + + public CloudOrchestrationRequest getCor() { + return cor; + } + + public void setCor(CloudOrchestrationRequest cor) { + this.cor = cor; + } + + public String getRequestId() { + return requestId; + } + + public void setRequestId(String requestId) { + this.requestId = requestId; + } + + public OperationalEnvironmentProcessFactory getFactory() { + if(factory == null) { + factory = new OperationalEnvironmentProcessFactory(); + } + return factory; + } + + public void setFactory(OperationalEnvironmentProcessFactory factory) { + this.factory = factory; + } + + protected RequestsDBHelper getRequestDb() { + if(requestDb == null) { + requestDb = new RequestsDBHelper(); + } + return requestDb; + } + + protected void setRequestsDBHelper(RequestsDBHelper helper) { + this.requestDb = helper; + } +} diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/dmaap/CreateEcompOperationEnvironmentBean.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/dmaap/CreateEcompOperationEnvironmentBean.java new file mode 100644 index 0000000000..1f3457e6e0 --- /dev/null +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/dmaap/CreateEcompOperationEnvironmentBean.java @@ -0,0 +1,172 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.mso.apihandlerinfra.tenantisolation.dmaap; + + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ +"operationalEnvironmentId", +"operationalEnvironmentName", +"operationalEnvironmentType", +"tenantContext", +"workloadContext" +}) + +public class CreateEcompOperationEnvironmentBean { + +@JsonProperty("operationalEnvironmentId") +private String operationalEnvironmentId; +@JsonProperty("operationalEnvironmentName") +private String operationalEnvironmentName; +@JsonProperty("operationalEnvironmentType") +private String operationalEnvironmentType; +@JsonProperty("tenantContext") +private String tenantContext; +@JsonProperty("workloadContext") +private String workloadContext; +@JsonProperty("action") +private String action; + + +/** +* No args constructor for use in serialization +* +*/ +public CreateEcompOperationEnvironmentBean() { + } + +/** +* +* @param operationalEnvironmentId +* @param operationalEnvironmentName +* @param operationalEnvironmentType +* @param tenantContext +* @param workloadContext +*/ +public CreateEcompOperationEnvironmentBean(String operationalEnvironmentId, String operationalEnvironmentName, String operationalEnvironmentType, String tenantContext, String workloadContext, String action) { +super(); +this.operationalEnvironmentId = operationalEnvironmentId; +this.operationalEnvironmentName = operationalEnvironmentName; +this.operationalEnvironmentType = operationalEnvironmentType; +this.tenantContext = tenantContext; +this.workloadContext = workloadContext; +this.action = action; + } + +@JsonProperty("operationalEnvironmentId") +public String getOperationalEnvironmentId() { +return operationalEnvironmentId; + } + +@JsonProperty("operationalEnvironmentId") +public void setOperationalEnvironmentId(String operationalEnvironmentId) { +this.operationalEnvironmentId = operationalEnvironmentId; + } + +public CreateEcompOperationEnvironmentBean withOperationalEnvironmentId(String operationalEnvironmentId) { +this.operationalEnvironmentId = operationalEnvironmentId; +return this; + } + + +@JsonProperty("operationalEnvironmentName") +public String getoperationalEnvironmentName() { +return operationalEnvironmentName; + } + +@JsonProperty("operationalEnvironmentName") +public void setoperationalEnvironmentName(String operationalEnvironmentName) { +this.operationalEnvironmentName = operationalEnvironmentName; + } + +public CreateEcompOperationEnvironmentBean withOperationalEnvironmentName(String operationalEnvironmentName) { +this.operationalEnvironmentName = operationalEnvironmentName; +return this; + } + +@JsonProperty("operationalEnvironmentType") +public String getoperationalEnvironmentType() { +return operationalEnvironmentType; + } + +@JsonProperty("operationalEnvironmentType") +public void setoperationalEnvironmentType(String operationalEnvironmentType) { +this.operationalEnvironmentType = operationalEnvironmentType; + } + +public CreateEcompOperationEnvironmentBean withOperationalEnvironmentType(String operationalEnvironmentType) { +this.operationalEnvironmentType = operationalEnvironmentType; +return this; + } + +@JsonProperty("tenantContext") +public String gettenantContext() { +return tenantContext; + } + +@JsonProperty("tenantContext") +public void settenantContext(String tenantContext) { +this.tenantContext = tenantContext; + } + +public CreateEcompOperationEnvironmentBean withTenantContext(String tenantContext) { +this.tenantContext = tenantContext; +return this; + } + +@JsonProperty("workloadContext") +public String getworkloadContext() { +return workloadContext; + } + +@JsonProperty("workloadContext") +public void setworkloadContext(String workloadContext) { +this.workloadContext = workloadContext; + } + +public CreateEcompOperationEnvironmentBean withWorkloadContext(String workloadContext) { +this.workloadContext = workloadContext; +return this; + } + + +@JsonProperty("action") +public String getaction() { +return action; + } + +@JsonProperty("action") +public void setaction(String action) { +this.action = action; + } + +public CreateEcompOperationEnvironmentBean withaction(String action) { +this.action = action; +return this; + } + + + +} diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/dmaap/DmaapOperationalEnvClient.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/dmaap/DmaapOperationalEnvClient.java new file mode 100644 index 0000000000..4d47acdd22 --- /dev/null +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/dmaap/DmaapOperationalEnvClient.java @@ -0,0 +1,67 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.mso.apihandlerinfra.tenantisolation.dmaap; + +import java.io.IOException; + + +import org.openecomp.mso.client.dmaap.DmaapPublisher; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class DmaapOperationalEnvClient { + + + protected String buildRequest(String operationalEnvironmentId, String operationalEnvironmentName, String operationalEnvironmentType, String tenantContext, String workloadContext, String action ) + throws JsonProcessingException { + final CreateEcompOperationEnvironmentBean operationalEnv = new CreateEcompOperationEnvironmentBean(); + operationalEnv.withOperationalEnvironmentId(operationalEnvironmentId) + .withOperationalEnvironmentName(operationalEnvironmentName) + .withOperationalEnvironmentType(operationalEnvironmentType) + .withTenantContext(tenantContext) + .withWorkloadContext(workloadContext) + .withaction(action); + + return this.getJson(operationalEnv); + + } + + protected String getJson(CreateEcompOperationEnvironmentBean obj) throws JsonProcessingException { + + final ObjectMapper mapper = new ObjectMapper(); + return mapper.writeValueAsString(obj); + + } + + protected DmaapPublisher getPublisher() throws IOException { + return new OperationalEnvironmentPublisher(); + } + + public void dmaapPublishOperationalEnvRequest(String operationalEnvironmentId, String operationalEnvironmentName, String operationalEnvironmentType, + String tenantContext, String workloadContext, String action ) throws Exception { + + String request = this.buildRequest(operationalEnvironmentId, operationalEnvironmentName, operationalEnvironmentType, tenantContext, workloadContext, action); + final DmaapPublisher publisher = this.getPublisher(); + publisher.send(request); + + } + +} diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/dmaap/DmaapPropertiesImpl.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/dmaap/DmaapPropertiesImpl.java new file mode 100644 index 0000000000..3ce4759577 --- /dev/null +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/dmaap/DmaapPropertiesImpl.java @@ -0,0 +1,45 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.mso.apihandlerinfra.tenantisolation.dmaap; + +import java.util.Map; + +import org.openecomp.mso.apihandlerinfra.MsoPropertiesUtils; +import org.openecomp.mso.client.dmaap.DmaapProperties; +import org.openecomp.mso.properties.MsoJavaProperties; + +public class DmaapPropertiesImpl implements DmaapProperties { + + private final Map props; + + public DmaapPropertiesImpl () { + + MsoJavaProperties properties = MsoPropertiesUtils.loadMsoProperties(); + this.props = properties.asMap(); + } + + @Override + public Map getProperties() { + + return this.props; + } + +} diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/dmaap/OperationalEnvironmentPublisher.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/dmaap/OperationalEnvironmentPublisher.java new file mode 100644 index 0000000000..36c1085655 --- /dev/null +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/dmaap/OperationalEnvironmentPublisher.java @@ -0,0 +1,58 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.mso.apihandlerinfra.tenantisolation.dmaap; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Optional; + +import org.openecomp.mso.client.dmaap.DmaapPublisher; + +public class OperationalEnvironmentPublisher extends DmaapPublisher { + + + public OperationalEnvironmentPublisher() throws FileNotFoundException, IOException { + super(); + } + + @Override + public String getUserName() { + + return this.msoProperties.get("so.operational-environment.dmaap.username"); + } + + @Override + public String getPassword() { + + return this.msoProperties.get("so.operational-environment.dmaap.password"); + } + + @Override + public String getTopic() { + + return this.msoProperties.get("so.operational-environment.publisher.topic"); + } + + @Override + public Optional getHost() { + return Optional.ofNullable(this.msoProperties.get("so.operational-environment.dmaap.host")); + } +} \ No newline at end of file diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/exceptions/AAIClientCallFailed.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/exceptions/AAIClientCallFailed.java new file mode 100644 index 0000000000..993c7dc9b7 --- /dev/null +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/exceptions/AAIClientCallFailed.java @@ -0,0 +1,29 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.mso.apihandlerinfra.tenantisolation.exceptions; + +public class AAIClientCallFailed extends Exception { + + public AAIClientCallFailed(String message, Throwable cause) { + super(message, cause); + } + +} diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/exceptions/AsdcClientCallFailed.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/exceptions/AsdcClientCallFailed.java new file mode 100644 index 0000000000..3e9009d2e3 --- /dev/null +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/exceptions/AsdcClientCallFailed.java @@ -0,0 +1,34 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.mso.apihandlerinfra.tenantisolation.exceptions; + +public class AsdcClientCallFailed extends Exception { + + public AsdcClientCallFailed(String message, Throwable cause) { + super(message, cause); + } + + public AsdcClientCallFailed(String message) { + super(message); + } + + +} diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/exceptions/TenantIsolationException.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/exceptions/TenantIsolationException.java new file mode 100644 index 0000000000..279a93e1b7 --- /dev/null +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/exceptions/TenantIsolationException.java @@ -0,0 +1,36 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.mso.apihandlerinfra.tenantisolation.exceptions; + +public class TenantIsolationException extends Exception { + + private static final long serialVersionUID = 6948152225371031774L; + + public TenantIsolationException() { + super(); + + } + + public TenantIsolationException(String msg) { + super ("Tenant Isolation error: " + msg); + + } +} \ No newline at end of file diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/helpers/AAIClientHelper.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/helpers/AAIClientHelper.java new file mode 100644 index 0000000000..c431da66ee --- /dev/null +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/helpers/AAIClientHelper.java @@ -0,0 +1,145 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.mso.apihandlerinfra.tenantisolation.helpers; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.Map; + +import org.openecomp.mso.apihandlerinfra.tenantisolation.exceptions.AAIClientCallFailed; +import org.openecomp.mso.client.aai.AAIObjectType; +import org.openecomp.mso.client.aai.AAIResourcesClient; +import org.openecomp.mso.client.aai.entities.AAIResultWrapper; +import org.openecomp.mso.client.aai.entities.uri.AAIResourceUri; +import org.openecomp.mso.client.aai.entities.uri.AAIUriFactory; +import org.openecomp.mso.client.aai.entities.uri.Depth; +import org.openecomp.mso.client.aai.objects.AAIOperationalEnvironment; +import org.openecomp.mso.logger.MsoLogger; + +public class AAIClientHelper { + + private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH); + + public AAIClientHelper() { + super(); + } + + public AAIClientHelper(String serviceName, String requestId) { + super(); + MsoLogger.setServiceName (serviceName); + MsoLogger.setLogContext(requestId, ""); + } + + /** + * Get managing ECOMP Environment Info from A&AI + * @param id = operationalEnvironmentId + * @return AAIResultWrapper object + */ + public AAIResultWrapper getAaiOperationalEnvironment(String id) throws Exception { + try { + AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.OPERATIONAL_ENVIRONMENT, id); + uri.depth(Depth.ZERO); //Do not return relationships if any + AAIResourcesClient aaiClient = this.getClient(); + AAIResultWrapper result = aaiClient.get(uri); + return result; + } + catch(Exception ex) { + logStackTrace(ex); + throw new AAIClientCallFailed("Call to A&AI failed!", ex); + } + } + + + /** + * Update managing ECOMP Environment Info from A&AI + * @param id = operationalEnvironmentId + * @param AAIOperationalEnvironment object + */ + public void updateAaiOperationalEnvironment(String id, AAIOperationalEnvironment aaiRequest) throws Exception { + try { + AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.OPERATIONAL_ENVIRONMENT, id); + AAIResourcesClient aaiClient = this.getClient(); + aaiClient.update(uri, aaiRequest); + } + catch(Exception ex) { + logStackTrace(ex); + throw new AAIClientCallFailed("Call to A&AI failed!", ex); + } + } + + + public void updateAaiOperationalEnvironment(String operationalEnvironmentId, Map payload) throws Exception { + try { + AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.OPERATIONAL_ENVIRONMENT, operationalEnvironmentId); + AAIResourcesClient aaiClient = this.getClient(); + aaiClient.update(uri, payload); + } + catch(Exception ex) { + logStackTrace(ex); + throw new AAIClientCallFailed("Call to A&AI failed!", ex); + } + } + + /** + * Create an Operational Environment object in A&AI + * @param AAIOperationalEnvironment object + */ + public void createOperationalEnvironment(AAIOperationalEnvironment operationalEnvironment) throws Exception { + try { + AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.OPERATIONAL_ENVIRONMENT, operationalEnvironment.getOperationalEnvironmentId()); + AAIResourcesClient aaiClient = this.getClient(); + aaiClient.create(uri, operationalEnvironment); + } + catch(Exception ex) { + logStackTrace(ex); + throw new AAIClientCallFailed("Call to A&AI failed!", ex); + } + } + + /** + * Create a relationship between ECOMP managing and VNF Operational Environments + * @param managingEcompOperationalEnvironmentId + * @param vnfOperationalEnvironmentId + * @throws Exception + */ + public void createRelationship(String managingEcompOperationalEnvironmentId, String vnfOperationalEnvironmentId) throws Exception { + try { + AAIResourceUri ecompEnvUri = AAIUriFactory.createResourceUri(AAIObjectType.OPERATIONAL_ENVIRONMENT, managingEcompOperationalEnvironmentId); + AAIResourceUri vnfEnvUri = AAIUriFactory.createResourceUri(AAIObjectType.OPERATIONAL_ENVIRONMENT, vnfOperationalEnvironmentId); + AAIResourcesClient aaiClient = this.getClient(); + aaiClient.connect(vnfEnvUri, ecompEnvUri); + } + catch(Exception ex) { + logStackTrace(ex); + throw new AAIClientCallFailed("Call to A&AI failed!", ex); + } + } + + private void logStackTrace(Exception e) { + StringWriter sw = new StringWriter(); + e.printStackTrace(new PrintWriter(sw)); + msoLogger.debug(sw.toString()); + } + + protected AAIResourcesClient getClient() { + return new AAIResourcesClient(); + } +} diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/helpers/AAIClientObjectBuilder.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/helpers/AAIClientObjectBuilder.java new file mode 100644 index 0000000000..58b78d7e8b --- /dev/null +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/helpers/AAIClientObjectBuilder.java @@ -0,0 +1,78 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.mso.apihandlerinfra.tenantisolation.helpers; + +import org.openecomp.mso.apihandlerinfra.tenantisolation.CloudOrchestrationRequest; +import org.openecomp.mso.client.aai.objects.AAIOperationalEnvironment; + +public class AAIClientObjectBuilder { + + private CloudOrchestrationRequest cloudOrchestrationRequest; + + public AAIClientObjectBuilder(CloudOrchestrationRequest request) { + this.cloudOrchestrationRequest = request; + } + + /** + * Create an AAIOperationalEnvironment object. + * @param environmentId + * @param environmentName + * @param environmentType + * @param envrionmentStatus + * @param tenantContext + * @param workloadContext + * @return + * @throws JsonProcessingException + */ + @Deprecated + public static AAIOperationalEnvironment createAAIOperationalEnvironment( + String environmentId, + String environmentName, + String environmentType, + String envrionmentStatus, + String tenantContext, + String workloadContext) { + + AAIOperationalEnvironment oe = new AAIOperationalEnvironment(); + oe.setOperationalEnvironmentId(environmentId); + oe.setOperationalEnvironmentName(environmentName); + oe.setOperationalEnvironmentType(environmentType); + oe.setOperationalEnvironmentStatus(envrionmentStatus); + oe.setTenantContext(tenantContext); + oe.setWorkloadContext(workloadContext); + + return oe; + } + + + public AAIOperationalEnvironment buildAAIOperationalEnvironment(String status) { + AAIOperationalEnvironment env = new AAIOperationalEnvironment(); + env.setOperationalEnvironmentId(this.cloudOrchestrationRequest.getOperationalEnvironmentId()); + env.setOperationalEnvironmentName(this.cloudOrchestrationRequest.getRequestDetails().getRequestInfo().getInstanceName()); + env.setOperationalEnvironmentType(this.cloudOrchestrationRequest.getRequestDetails().getRequestParameters().getOperationalEnvironmentType().toString()); + env.setOperationalEnvironmentStatus(status); + env.setTenantContext(this.cloudOrchestrationRequest.getRequestDetails().getRequestParameters().getTenantContext()); + env.setWorkloadContext(this.cloudOrchestrationRequest.getRequestDetails().getRequestParameters().getWorkloadContext()); + return env; + } + + +} diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/helpers/AsdcClientHelper.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/helpers/AsdcClientHelper.java new file mode 100644 index 0000000000..2575013609 --- /dev/null +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/helpers/AsdcClientHelper.java @@ -0,0 +1,216 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.mso.apihandlerinfra.tenantisolation.helpers; + +import java.util.UUID; + +import javax.ws.rs.core.UriBuilder; + +import org.json.JSONObject; +import org.openecomp.mso.apihandlerinfra.tenantisolation.exceptions.AsdcClientCallFailed; +import org.openecomp.mso.logger.MsoLogger; +import org.openecomp.mso.properties.MsoJavaProperties; +import org.openecomp.mso.rest.APIResponse; +import org.openecomp.mso.rest.RESTClient; +import org.openecomp.mso.rest.RESTConfig; + +public class AsdcClientHelper { + + private static MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.APIH); + private String className = this.getClass().getSimpleName(); + private String methodName = ""; + private String classMethodMessage = ""; + + private JSONObject asdcResponseJsonObj; + + protected MsoJavaProperties properties; + + public static final String ASDC_CONTENT_TYPE = "application/json"; + public static final String ASDC_ACCEPT_TYPE = "application/json"; + + protected String instanceid; + protected String userid; + protected String asdcEndpoint; + protected String basicAuthCred; + protected String uri; + + public static String PARTIAL_ASDC_URI = "/sdc/v1/catalog/services/"; + + public AsdcClientHelper(MsoJavaProperties properties) { + this.properties = properties; + setAsdcProperties(); + + }; + + /** + * properties should be set during instantiation of this object + */ + private void setAsdcProperties() { + String asdcClientAuth = this.properties.getProperty("mso.asdc.client.auth", null); + String msoKey = this.properties.getProperty("mso.msoKey", null); + this.basicAuthCred = this.properties.decrypt(asdcClientAuth, msoKey); + this.asdcEndpoint = this.properties.getProperty("asdc.endpoint", null); + this.userid = this.properties.getProperty("asdc.activate.userid", null); + this.instanceid = this.properties.getProperty("asdc.activate.instanceid", null); + + } + + /** + * Send POST request to ASDC for operational activation + * @param uri - /sdc/v1/catalog/services/{serviceUUID}/distribution/{opEnvId}/activate + * @param jsonPayload - json string value of 'workloadContext'. + * @return JSONObject + */ + public JSONObject postActivateOperationalEnvironment(String serviceModelVersionId, String operationalEnvironmentId, String workloadContext) { + + try { + + String url = this.buildUriBuilder(serviceModelVersionId, operationalEnvironmentId); + msoLogger.debug(" ASDC url : " + url); + String jsonPayload = this.buildJsonWorkloadContext(workloadContext); + msoLogger.debug(" ASDC jsonPayload : " + jsonPayload); + asdcResponseJsonObj = new JSONObject(); + + if ( basicAuthCred == null || "".equals(basicAuthCred) ) { + String errorMessage = " ** ERROR: ASDC credentials 'mso.asdc.client.auth' not setup in properties file!"; + throw new AsdcClientCallFailed(errorMessage); + } + + RESTConfig config = new RESTConfig(url); + RESTClient client = setRestClient(config); + client.addAuthorizationHeader(basicAuthCred); + + APIResponse apiResponse = setHttpPostResponse(client, jsonPayload); + int statusCode = apiResponse.getStatusCode(); + msoLogger.debug(" ASDC return code : " + statusCode); + String responseData = apiResponse.getResponseBodyAsString(); + msoLogger.debug(" ASDC responseData : " + responseData); + asdcResponseJsonObj = enhanceJsonResponse(new JSONObject(responseData), statusCode); + + } catch (Exception ex) { + msoLogger.debug("calling ASDC Exception message: " + ex.getMessage()); + String errorMessage = " Encountered Error while calling ASDC POST Activate. " + ex.getMessage(); + msoLogger.debug(errorMessage); + asdcResponseJsonObj.put("statusCode", "500"); + asdcResponseJsonObj.put("messageId", ""); + asdcResponseJsonObj.put("message", errorMessage); + + } + return asdcResponseJsonObj; + + } + + /** + * set RESTClient + * @return RestClient object + */ + public RESTClient setRestClient(RESTConfig config) throws Exception { + + RESTClient client = new RESTClient(config).addHeader("X-ECOMP-InstanceID", instanceid) + .addHeader("X-ECOMP-RequestID", UUID.randomUUID().toString()) + .addHeader("Content-Type", AsdcClientHelper.ASDC_CONTENT_TYPE) + .addHeader("Accept", AsdcClientHelper.ASDC_ACCEPT_TYPE) + .addHeader("USER_ID", userid); + return client; + + } + + public APIResponse setHttpPostResponse(RESTClient client, String jsonPayload) throws Exception { + return client.httpPost(jsonPayload); + + } + + + public JSONObject enhanceJsonResponse(JSONObject asdcResponseJsonObj, int statusCode) { + + if (statusCode == 202) { // Accepted + asdcResponseJsonObj.put("statusCode", Integer.toString(statusCode)); + asdcResponseJsonObj.put("messageId", ""); + asdcResponseJsonObj.put("message", "Success"); + + } else { // error + String message = "Undefined Error Message!"; + String messageId = ""; + if (asdcResponseJsonObj.has("requestError") ) { + JSONObject requestErrorObj = asdcResponseJsonObj.getJSONObject("requestError"); + if (asdcResponseJsonObj.getJSONObject("requestError").has("serviceException") ) { + message = requestErrorObj.getJSONObject("serviceException").getString("text"); + messageId = requestErrorObj.getJSONObject("serviceException").getString("messageId"); + } + if (asdcResponseJsonObj.getJSONObject("requestError").has("policyException") ) { + message = requestErrorObj.getJSONObject("policyException").getString("text"); + messageId = requestErrorObj.getJSONObject("policyException").getString("messageId"); + } + + } + asdcResponseJsonObj.put("statusCode", Integer.toString(statusCode)); + asdcResponseJsonObj.put("messageId", messageId); + asdcResponseJsonObj.put("message", message); + } + + return asdcResponseJsonObj; + + } + + /** + * Build Uri + * @return String uri + */ + public String buildUriBuilder(String serviceModelVersionId, String operationalEnvironmentId) { + String path = serviceModelVersionId + "/distribution/" + operationalEnvironmentId +"/activate"; + UriBuilder uriBuilder = UriBuilder.fromPath(asdcEndpoint + AsdcClientHelper.PARTIAL_ASDC_URI) + .path(path); + return uriBuilder.build().toString(); + } + + /** + * Build JSON context + * @return String json + */ + public String buildJsonWorkloadContext(String workloadContext) { + return new JSONObject().put("workloadContext", workloadContext).toString(); + + } + + /** + * get asdc instanceId of this object + */ + public String getAsdcInstanceId() { + return this.instanceid; + } + + /** + * get asdc asdcEndpoint of this object + */ + public String getAsdcEndpoint() { + return this.asdcEndpoint; + } + + /** + * get asdc asdcUserId of this object + */ + public String getAsdcUserId() { + return this.userid; + } + + + +} diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/process/ActivateVnfOperationalEnvironment.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/process/ActivateVnfOperationalEnvironment.java new file mode 100644 index 0000000000..24111c43c2 --- /dev/null +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/process/ActivateVnfOperationalEnvironment.java @@ -0,0 +1,290 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.mso.apihandlerinfra.tenantisolation.process; + +import java.io.IOException; +import java.util.List; + +import org.json.JSONObject; +import org.openecomp.mso.apihandlerinfra.MsoPropertiesUtils; +import org.openecomp.mso.apihandlerinfra.tenantisolation.CloudOrchestrationRequest; +import org.openecomp.mso.apihandlerinfra.tenantisolation.exceptions.AsdcClientCallFailed; +import org.openecomp.mso.apihandlerinfra.tenantisolation.exceptions.TenantIsolationException; +import org.openecomp.mso.apihandlerinfra.tenantisolation.helpers.AsdcClientHelper; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.ServiceModelList; +import org.openecomp.mso.client.aai.entities.AAIResultWrapper; +import org.openecomp.mso.client.aai.objects.AAIOperationalEnvironment; +import org.openecomp.mso.logger.MsoLogger; +import org.openecomp.mso.properties.MsoJavaProperties; +import org.openecomp.mso.requestsdb.OperationalEnvDistributionStatus; +import org.openecomp.mso.requestsdb.OperationalEnvDistributionStatusDb; +import org.openecomp.mso.requestsdb.OperationalEnvServiceModelStatus; +import org.openecomp.mso.requestsdb.OperationalEnvServiceModelStatusDb; +import org.openecomp.mso.requestsdb.RequestsDBHelper; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; + + +public class ActivateVnfOperationalEnvironment extends OperationalEnvironmentProcess { + + private static final String SERVICE_NAME = "ActivateVnfOperationalEnvironment"; + private AsdcClientHelper asdcClientHelper = null; + + private static MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.APIH); + private String className = this.getClass().getSimpleName(); + private String methodName = ""; + private String classMethodMessage = ""; + private String errorMessage = ""; + + private String operationalEnvironmentId = ""; + private int DEFAULT_ACTIVATE_RETRY_COUNT = 3; + private boolean successIndicator = false; + + MsoJavaProperties properties; + OperationalEnvDistributionStatusDb activateDistributionDb = null; + OperationalEnvDistributionStatus queryDistributionDbResponse = null; + OperationalEnvServiceModelStatusDb activateServiceModelDb = null; + OperationalEnvServiceModelStatus queryServiceModelResponse = null; + + /** + * The class constructor with loadProperties() + * @param CloudOrchestrationRequest - object + * @param requestId - string + */ + public ActivateVnfOperationalEnvironment(CloudOrchestrationRequest request, String requestId) { + super(request, requestId); + MsoLogger.setServiceName (getRequestId()); + MsoLogger.setLogContext(getRequestId(), getRequest().getOperationalEnvironmentId()); + this.properties = MsoPropertiesUtils.loadMsoProperties(); + asdcClientHelper = new AsdcClientHelper(properties); + } + + @Override + protected String getServiceName() { + return ActivateVnfOperationalEnvironment.SERVICE_NAME; + } + + /** + * The Point-Of-Entry from APIH with VID request to send activate request + * @return void - nothing + */ + @Override + public void execute() { + + methodName = "execute() method. "; + classMethodMessage = className + " " + methodName; + msoLogger.debug("Begin of " + classMethodMessage); + + activateDistributionDb = getOperationalEnvDistributionStatusDb(); + activateServiceModelDb = getOperationalEnvServiceModelStatusDb(); + + try { + + msoLogger.debug("Start of extracting variables from Input."); + msoLogger.debug(" requestId: " + requestId); + msoLogger.debug(" cloudOrchestrationRequest: " + request.toString()); + String operationalEnvironmentId = request.getOperationalEnvironmentId(); + this.operationalEnvironmentId = operationalEnvironmentId; + msoLogger.debug(" operationalEnvironmentId: " + this.operationalEnvironmentId); + String vidWorkloadContext = request.getRequestDetails().getRequestParameters().getWorkloadContext(); + List serviceModelVersionIdList = request.getRequestDetails().getRequestParameters().getManifest().getServiceModelList(); + msoLogger.debug(" serviceModelVersionIdList size(): " + serviceModelVersionIdList.size()); + msoLogger.debug("End of extracting variables from Input."); + + msoLogger.debug("Start of getting AAIOperationalEnvironment Object."); + AAIOperationalEnvironment operationalEnv = getAAIOperationalEnvironment(operationalEnvironmentId); + String workloadContext = operationalEnv.getWorkloadContext(); + msoLogger.debug(" aai workloadContext: " + workloadContext); + if (vidWorkloadContext.equals(workloadContext)) { + msoLogger.debug(" vid workloadContext matched with aai record, continue!"); + } else { + errorMessage = " The vid workloadContext did not match from aai record. " + " vid workloadContext:" + vidWorkloadContext + " aai workloadContext:" + workloadContext; + msoLogger.debug(errorMessage); + throw new TenantIsolationException(errorMessage); + } + msoLogger.debug("End of getting AAIOperationalEnvironment Object."); + + msoLogger.debug("Start of sending activation request to ASDC."); + processActivateASDCRequest(requestId, operationalEnvironmentId, serviceModelVersionIdList, workloadContext); + msoLogger.debug("End of sending activation request to ASDC."); + + msoLogger.debug("** OVERALL status of flow: Processed ALL " + serviceModelVersionIdList.size() + " activation requests are SUCCESSFUL!"); + successIndicator = true; + msoLogger.debug("End of " + classMethodMessage); + + } catch (Exception ex) { + errorMessage = "** OVERALL status of flow: " + methodName + ex.getMessage(); + msoLogger.debug(errorMessage); + getRequestDb().updateInfraFailureCompletion(errorMessage, requestId, operationalEnvironmentId); + + } + + } + + + /** + * The Method to send the Activation Requests to ASDC + * @param requestId - string + * @param operationalEnvironmentId - string + * @param List serviceModelVersionIdList - list + * @param workloadContext - string + * @return void - nothing + */ + public void processActivateASDCRequest(String requestId, String operationalEnvironmentId, + List serviceModelVersionIdList, String workloadContext) throws TenantIsolationException, AsdcClientCallFailed { + + int retryCount = 0; + String retryCountString = properties.getProperty("mso.tenant.isolation.retry.count", null); + try { + retryCount = Integer.parseInt(retryCountString); + msoLogger.debug(" ** Used Properties File retryCount: " + retryCount); + } catch (NumberFormatException e) { + retryCount = DEFAULT_ACTIVATE_RETRY_COUNT; + msoLogger.debug(" ** Used Default retryCount: " + retryCount + " Exception: " + e.getMessage()); + } + + msoLogger.debug(" ** serviceModelVersionIdList: " + serviceModelVersionIdList.size()); + + // loop through the serviceModelVersionId, and send request ASDC + for(ServiceModelList serviceModelList : serviceModelVersionIdList){ + String serviceModelVersionId = serviceModelList.getServiceModelVersionId(); + String recoveryAction = serviceModelList.getRecoveryAction().toString().toUpperCase(); + msoLogger.debug(" ** serviceModelVersionId: " + serviceModelVersionId + "; recoveryAction: " + recoveryAction); + // should insert 1 row + activateServiceModelDb.insertOperationalEnvServiceModelStatus(requestId, operationalEnvironmentId, serviceModelVersionId, "SENT", recoveryAction, retryCount, workloadContext); + + JSONObject jsonResponse = null; + String distributionId = ""; + try { + jsonResponse = asdcClientHelper.postActivateOperationalEnvironment(serviceModelVersionId, operationalEnvironmentId, workloadContext); + msoLogger.debug(" JSONObject jsonResponse:" + jsonResponse.toString()); + String statusCode = jsonResponse.get("statusCode").toString(); + if (statusCode.equals("202")) { + distributionId = jsonResponse.get("distributionId").toString(); + + // should insert 1 row + activateDistributionDb.insertOperationalEnvDistributionStatus(distributionId, operationalEnvironmentId, serviceModelVersionId, "SENT", requestId); + + } else { + errorMessage = " Failure calling ASDC: statusCode: " + statusCode + + "; messageId: " + jsonResponse.get("messageId") + + "; message: " + jsonResponse.get("message"); + msoLogger.debug(errorMessage); + throw new AsdcClientCallFailed(errorMessage); + + } + + } catch (Exception ex) { + errorMessage = " Encountered Exception in " + methodName + " Exception: " + ex.getMessage(); + msoLogger.debug(errorMessage); + throw new TenantIsolationException(errorMessage); + } + + } + + } + + /** + * Get AAIOperationalEnvironment object + * @param String operationalEnvironmentId + * @return object AAIOperationalEnvironment + */ + public AAIOperationalEnvironment getAAIOperationalEnvironment(String operationalEnvironmentId) { + + AAIOperationalEnvironment operationalEnv = null; + getAaiHelper(); + + try { + AAIResultWrapper aaiResult = aaiHelper.getAaiOperationalEnvironment(operationalEnvironmentId); + operationalEnv = aaiResult.asBean(AAIOperationalEnvironment.class).get(); + } catch (JsonParseException e) { + msoLogger.debug(" **** JsonParseException: " + e.getMessage()); + e.printStackTrace(); + } catch (JsonMappingException e) { + msoLogger.debug(" **** JsonMappingException: " + e.getMessage()); + e.printStackTrace(); + } catch (IOException e) { + msoLogger.debug(" **** IOException: " + e.getMessage()); + e.printStackTrace(); + } catch (Exception e) { + msoLogger.debug(" **** Exception: " + e.getMessage()); + e.printStackTrace(); + } + + return operationalEnv; + + } + + + /** + * Overall Success indicator + * @return true or false + */ + public boolean isSuccess() { + return successIndicator; + } + + /** + * Set to new OperationalEnvDistributionStatusDb + * @return void + */ + public void setOperationalEnvDistributionStatusDb (OperationalEnvDistributionStatusDb activateDistributionDb) { + this.activateDistributionDb = activateDistributionDb; + } + + /** + * Set to new OperationalEnvServiceModelStatusDb + * @return void + */ + public void setOperationalEnvServiceModelStatusDb (OperationalEnvServiceModelStatusDb activateServiceModelDb) { + this.activateServiceModelDb = activateServiceModelDb; + } + + /** + * Set to new AsdcClientHelper + * @return void + */ + public void setAsdcClientHelper (AsdcClientHelper asdcClientHelper) { + this.asdcClientHelper = asdcClientHelper; + } + + /** + * get OperationalEnvDistributionStatusDb instance + */ + public OperationalEnvDistributionStatusDb getOperationalEnvDistributionStatusDb() { + if(this.activateDistributionDb == null) { + this.activateDistributionDb = OperationalEnvDistributionStatusDb.getInstance(); + } + return this.activateDistributionDb; + } + + /** + * get OperationalEnvServiceModelStatusDb instance + */ + public OperationalEnvServiceModelStatusDb getOperationalEnvServiceModelStatusDb() { + if(this.activateServiceModelDb == null) { + this.activateServiceModelDb = OperationalEnvServiceModelStatusDb.getInstance(); + } + return this.activateServiceModelDb; + } + +} diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/process/ActivateVnfStatusOperationalEnvironment.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/process/ActivateVnfStatusOperationalEnvironment.java new file mode 100644 index 0000000000..7ef0da61f5 --- /dev/null +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/process/ActivateVnfStatusOperationalEnvironment.java @@ -0,0 +1,342 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.mso.apihandlerinfra.tenantisolation.process; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.json.JSONObject; +import org.openecomp.mso.apihandlerinfra.MsoPropertiesUtils; +import org.openecomp.mso.apihandlerinfra.tenantisolation.CloudOrchestrationRequest; +import org.openecomp.mso.apihandlerinfra.tenantisolation.exceptions.AsdcClientCallFailed; +import org.openecomp.mso.apihandlerinfra.tenantisolation.exceptions.TenantIsolationException; +import org.openecomp.mso.apihandlerinfra.tenantisolation.helpers.AsdcClientHelper; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.Distribution; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.DistributionStatus; +import org.openecomp.mso.logger.MsoLogger; +import org.openecomp.mso.properties.MsoJavaProperties; +import org.openecomp.mso.requestsdb.OperationalEnvDistributionStatus; +import org.openecomp.mso.requestsdb.OperationalEnvDistributionStatusDb; +import org.openecomp.mso.requestsdb.OperationalEnvServiceModelStatus; +import org.openecomp.mso.requestsdb.OperationalEnvServiceModelStatusDb; + + +public class ActivateVnfStatusOperationalEnvironment extends OperationalEnvironmentProcess { + + private static final String SERVICE_NAME = "ActivateVnfStatusOperationalEnvironment"; + private AsdcClientHelper asdcClientHelper = null; + + private static MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.APIH); + private String className = this.getClass().getSimpleName(); + private String methodName = ""; + private String classMethodMessage = ""; + private String errorMessage = ""; + + private String operationalEnvironmentId = ""; + private boolean successIndicator = false; + + MsoJavaProperties properties; + OperationalEnvDistributionStatusDb activateDistributionDb = null; + OperationalEnvDistributionStatus queryDistributionDbResponse = null; + OperationalEnvServiceModelStatusDb activateServiceModelDb = null; + OperationalEnvServiceModelStatus queryServiceModelResponse = null; + + /** + * The class constructor with loadProperties() + * @param CloudOrchestrationRequest - object + * @param requestId - string + */ + public ActivateVnfStatusOperationalEnvironment(CloudOrchestrationRequest request, String requestId) { + super(request, requestId); + MsoLogger.setServiceName (getRequestId()); + MsoLogger.setLogContext(getRequestId(), getRequest().getOperationalEnvironmentId()); + this.properties = MsoPropertiesUtils.loadMsoProperties(); + asdcClientHelper = new AsdcClientHelper(properties); + } + + @Override + protected String getServiceName() { + return ActivateVnfStatusOperationalEnvironment.SERVICE_NAME; + } + + + /** + * The Point-Of-Entry from APIH with activate status from ASDC + * @return void - nothing + */ + @Override + public void execute() { + + methodName = "execute() method. "; + classMethodMessage = className + " " + methodName; + msoLogger.debug("Begin of " + classMethodMessage); + + activateDistributionDb = getOperationalEnvDistributionStatusDb(); + activateServiceModelDb = getOperationalEnvServiceModelStatusDb(); + + try { + + String asdcDistributionId = request.getDistributionId(); + Distribution distributionObject = request.getDistribution(); + msoLogger.debug(" ** asdcDistributionId: " + asdcDistributionId + ";" + " status: " + request.getDistribution().getStatus()); + + // Distribution, Query for operationalEnvironmentId, serviceModelVersionId + queryDistributionDbResponse = activateDistributionDb.getOperationalEnvDistributionStatus(asdcDistributionId); + + if(queryDistributionDbResponse == null) { + throw new TenantIsolationException("DistributionId doesn't exist in the DB: " + asdcDistributionId); + } + + String operationalEnvironmentId = queryDistributionDbResponse.getOperationalEnvId(); + this.operationalEnvironmentId = operationalEnvironmentId; + String serviceModelVersionId = queryDistributionDbResponse.getServiceModelVersionId(); + + // ServiceModel, Query for dbRequestId, recoveryAction, retryCountString + queryServiceModelResponse = activateServiceModelDb.getOperationalEnvServiceModelStatus(operationalEnvironmentId, serviceModelVersionId); + String origRequestId = queryServiceModelResponse.getRequestId(); + this.requestId = origRequestId; + + msoLogger.debug("Start of processing activation status."); + processActivateASDCStatus(asdcDistributionId, distributionObject); + msoLogger.debug("End of processing activation status."); + + // After EVERY status processed, need to query the status of all service modelId + // to determine the OVERALL status if "COMPLETE" or "FAILURE": + checkOrUpdateOverallStatus(origRequestId, operationalEnvironmentId); + + msoLogger.debug("End of " + classMethodMessage); + + } catch (Exception ex) { + errorMessage = "** OVERALL status of flow: " + methodName + ex.getMessage(); + msoLogger.debug(errorMessage); + getRequestDb().updateInfraFailureCompletion(errorMessage, requestId, operationalEnvironmentId); + + } + + } + + /** + * The Method to process the Activation Status from ASDC + * @param asdcDistributionId - string + * @param Distribution - object + * @return void - nothing + */ + public void processActivateASDCStatus(String asdcDistributionId, Distribution asdcStatus) throws TenantIsolationException { + + String operationalEnvironmentId = queryDistributionDbResponse.getOperationalEnvId(); + String serviceModelVersionId = queryDistributionDbResponse.getServiceModelVersionId(); + + String origRequestId = queryServiceModelResponse.getRequestId(); + String recoveryAction = queryServiceModelResponse.getRecoveryAction(); + int retryCount = queryServiceModelResponse.getRetryCount(); + String workloadContext = queryServiceModelResponse.getWorkloadContext(); + + // Validate/process status + if (asdcStatus.getStatus().toString().equals(DistributionStatus.DISTRIBUTION_COMPLETE_OK.toString())) { + // should update 1 row, update status to "DISTRIBUTION_COMPLETE_OK" + activateDistributionDb.updateOperationalEnvDistributionStatus(asdcStatus.getStatus().toString(), asdcDistributionId, operationalEnvironmentId, serviceModelVersionId); + // should update 1 row, update status and retryCount = 0 (ie, serviceModelVersionId is DONE!) + activateServiceModelDb.updateOperationalEnvRetryCountStatus(operationalEnvironmentId, serviceModelVersionId, asdcStatus.getStatus().toString(), 0); + + } else { + + // "DISTRIBUTION_COMPLETE_ERROR", Check if recoveryAction is "RETRY" + if (recoveryAction.equals("RETRY") & retryCount > 0) { + // RESEND / RETRY serviceModelVersionId to ASDC + JSONObject jsonResponse = null; + String newDistributionId = ""; + try { + jsonResponse = asdcClientHelper.postActivateOperationalEnvironment(serviceModelVersionId, operationalEnvironmentId, workloadContext); + String statusCode = jsonResponse.get("statusCode").toString(); + if (statusCode.equals("202")) { + newDistributionId = jsonResponse.get("distributionId").toString(); + + // should insert 1 row, NEW distributionId for old serviceModelServiceId + activateDistributionDb.insertOperationalEnvDistributionStatus(newDistributionId, operationalEnvironmentId, serviceModelVersionId, "SENT", origRequestId); + + // update retryCount (less 1) for the serviceModelServiceId + retryCount = retryCount - 1; + // should update 1 row, original insert + activateServiceModelDb.updateOperationalEnvRetryCountStatusPerReqId(operationalEnvironmentId, serviceModelVersionId, asdcStatus.getStatus().toString(), retryCount, origRequestId); + + // should update 1 row, OLD distributionId set to status error (ie, old distributionId is DONE!). + activateDistributionDb.updateOperationalEnvDistributionStatus(DistributionStatus.DISTRIBUTION_COMPLETE_ERROR.toString(), asdcDistributionId, operationalEnvironmentId, serviceModelVersionId); + + } else { + errorMessage = " Failure calling ASDC: statusCode: " + statusCode + + "; messageId: " + jsonResponse.get("messageId") + + "; message: " + jsonResponse.get("message"); + msoLogger.debug(errorMessage); + throw new AsdcClientCallFailed(errorMessage); + + } + + } catch (Exception ex) { + errorMessage = " Encountered Exception in " + methodName + " Exception: " + ex.getMessage(); + msoLogger.debug(errorMessage); + throw new TenantIsolationException(errorMessage); + } + + + } else { // either RETRY & Count = 0, or 'ABORT', or 'SKIP' + + if (recoveryAction.equals("SKIP") || recoveryAction.equals("ABORT")) { + String modifiedStatus = ""; + if (recoveryAction.equals("SKIP")) { // considered SUCCESS + modifiedStatus = DistributionStatus.DISTRIBUTION_COMPLETE_OK.toString(); + } else { + if (recoveryAction.equals("ABORT")) { + modifiedStatus = DistributionStatus.DISTRIBUTION_COMPLETE_ERROR.toString(); // ABORT, error + } + } + // should update 1 row, modified status & retryCount set 0 + activateServiceModelDb.updateOperationalEnvRetryCountStatus(operationalEnvironmentId, serviceModelVersionId, modifiedStatus, 0); + // should update 1 row, modified status + activateDistributionDb.updateOperationalEnvDistributionStatus(modifiedStatus, asdcDistributionId, operationalEnvironmentId, serviceModelVersionId); + + } else { + // RETRY & Count = 0 (do nothing!) + } + } + + } + + } + + /** + * The Method to check the overall status of the Activation for an operationalEnvironmentId + * @param origRequestId - string + * @param operationalEnvironmentId - string + * @return void - nothing + * @throws Exception + */ + public void checkOrUpdateOverallStatus(String origRequestId, String operationalEnvironmentId) throws Exception { + + List queryServiceModelResponseList = activateServiceModelDb.getOperationalEnvIdStatus(operationalEnvironmentId, origRequestId); + msoLogger.debug(" **** queryServiceModelResponseList.size(): " + queryServiceModelResponseList.size()); + + String status = "Waiting"; + int count = 0; + // loop through the statuses of the service model + for (OperationalEnvServiceModelStatus queryServiceModelResponse : queryServiceModelResponseList) { + status = queryServiceModelResponse.getServiceModelVersionDistrStatus(); + // all should be OK to be completed. + if ((status.equals(DistributionStatus.DISTRIBUTION_COMPLETE_OK.toString()) && + (queryServiceModelResponse.getRetryCount() == 0))) { + status = "Completed"; + count ++; + } + // one error with zero retry, means all are failures. + if ((status.equals(DistributionStatus.DISTRIBUTION_COMPLETE_ERROR.toString()) && + (queryServiceModelResponse.getRetryCount() == 0))) { + status = "Failure"; + count = queryServiceModelResponseList.size(); + break; + } + + } + + // "DISTRIBUTION_COMPLETE_OK" : Completed / Successful + if (status == "Completed" && queryServiceModelResponseList.size() == count) { + executeAAIPatch(operationalEnvironmentId); + String messageStatus = "Overall Activation process is complete. " + status; + successIndicator = true; + msoLogger.debug(messageStatus); + // Update DB to COMPLETION + getRequestDb().updateInfraSuccessCompletion(messageStatus, origRequestId, operationalEnvironmentId); + } else { + // "DISTRIBUTION_COMPLETE_ERROR" : Failure + if (status == "Failure" && queryServiceModelResponseList.size() == count) { + errorMessage = "Overall Activation process is a Failure. " + status; + msoLogger.debug(errorMessage); + getRequestDb().updateInfraFailureCompletion(errorMessage, requestId, operationalEnvironmentId); + } else { + msoLogger.debug(" **** Still waiting for more distribution status!"); // 1+ rows + } + } + + } + + private void executeAAIPatch(String operationalEnvironmentId) throws Exception { + msoLogger.debug("Start of AA&I UPDATE client call in ActivateVnfStatusOperationalEnvironment"); + + Map payload = new HashMap<>(); + payload.put("operational-environment-status", "ACTIVE"); + getAaiHelper().updateAaiOperationalEnvironment(operationalEnvironmentId, payload); + + msoLogger.debug("End of AA&I UPDATE client call in ActivateVnfStatusOperationalEnvironment"); + } + + /** + * Overall Success indicator + * @return true or false + */ + public boolean isSuccess() { + return successIndicator; + } + + /** + * Set to new OperationalEnvDistributionStatusDb + * @return void + */ + public void setOperationalEnvDistributionStatusDb (OperationalEnvDistributionStatusDb activateDistributionDb) { + this.activateDistributionDb = activateDistributionDb; + } + + /** + * Set to new OperationalEnvServiceModelStatusDb + * @return void + */ + public void setOperationalEnvServiceModelStatusDb (OperationalEnvServiceModelStatusDb activateServiceModelDb) { + this.activateServiceModelDb = activateServiceModelDb; + } + + + /** + * Set to new AsdcClientHelper + * @return void + */ + public void setAsdcClientHelper (AsdcClientHelper asdcClientHelper) { + this.asdcClientHelper = asdcClientHelper; + } + + /** + * get OperationalEnvDistributionStatusDb instance + */ + public OperationalEnvDistributionStatusDb getOperationalEnvDistributionStatusDb() { + if(this.activateDistributionDb == null) { + this.activateDistributionDb = OperationalEnvDistributionStatusDb.getInstance(); + } + return this.activateDistributionDb; + } + + /** + * get OperationalEnvServiceModelStatusDb instance + */ + public OperationalEnvServiceModelStatusDb getOperationalEnvServiceModelStatusDb() { + if(this.activateServiceModelDb == null) { + this.activateServiceModelDb = OperationalEnvServiceModelStatusDb.getInstance(); + } + return this.activateServiceModelDb; + } + +} diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/process/CreateEcompOperationalEnvironment.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/process/CreateEcompOperationalEnvironment.java new file mode 100644 index 0000000000..1ce3c5e06d --- /dev/null +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/process/CreateEcompOperationalEnvironment.java @@ -0,0 +1,82 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.mso.apihandlerinfra.tenantisolation.process; + +import org.openecomp.mso.apihandlerinfra.tenantisolation.CloudOrchestrationRequest; +import org.openecomp.mso.apihandlerinfra.tenantisolation.dmaap.DmaapOperationalEnvClient; +import org.openecomp.mso.logger.MessageEnum; +import org.openecomp.mso.logger.MsoLogger; + + +public class CreateEcompOperationalEnvironment extends OperationalEnvironmentProcess { + + private static final String SERVICE_NAME = "CreateEcompOperationalEnvironment"; + private static MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.APIH); + + + public CreateEcompOperationalEnvironment(CloudOrchestrationRequest request, String requestId) { + super(request, requestId); + MsoLogger.setServiceName (getRequestId()); + MsoLogger.setLogContext(getRequestId(), getRequest().getOperationalEnvironmentId()); + } + + + protected DmaapOperationalEnvClient getDmaapClient() { + return new DmaapOperationalEnvClient(); + } + + + @Override + public void execute() { + try { + msoLogger.debug("Begin of execute method in " + SERVICE_NAME); + msoLogger.debug("CloudOrchestrationRequest: " + request.toString()); + + //Create ECOMP Managing Environment object in A&AI + getAaiHelper().createOperationalEnvironment(getAaiClientObjectBuilder().buildAAIOperationalEnvironment("ACTIVE")); + msoLogger.debug("ECOMP operational environment created in A&AI."); + + // Call client to publish to DMaap + getDmaapClient().dmaapPublishOperationalEnvRequest(getRequest().getOperationalEnvironmentId(), + getRequest().getRequestDetails().getRequestInfo().getInstanceName(), + getRequest().getRequestDetails().getRequestParameters().getOperationalEnvironmentType().toString(), + getRequest().getRequestDetails().getRequestParameters().getTenantContext(), + getRequest().getRequestDetails().getRequestParameters().getWorkloadContext(), + "Create"); + msoLogger.debug("ECOMP operational environment published in Dmaap/ASDC."); + + //Update request database + getRequestDb().updateInfraSuccessCompletion("SUCCESSFULLY Created ECOMP OperationalEnvironment.", getRequestId(), getRequest().getOperationalEnvironmentId()); + } + catch (Exception e) { + e.printStackTrace(); + msoLogger.error(MessageEnum.APIH_GENERAL_EXCEPTION, "", "", "", MsoLogger.ErrorCode.UnknownError, e.getMessage()); + getRequestDb().updateInfraFailureCompletion(e.getMessage(), getRequestId(), getRequest().getOperationalEnvironmentId()); + } + } + + + @Override + protected String getServiceName() { + return CreateEcompOperationalEnvironment.SERVICE_NAME; + } + +} \ No newline at end of file diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/process/CreateVnfOperationalEnvironment.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/process/CreateVnfOperationalEnvironment.java new file mode 100644 index 0000000000..a235526887 --- /dev/null +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/process/CreateVnfOperationalEnvironment.java @@ -0,0 +1,216 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.mso.apihandlerinfra.tenantisolation.process; + +import java.util.ArrayList; +import java.util.List; + +import org.openecomp.mso.apihandlerinfra.tenantisolation.CloudOrchestrationRequest; +import org.openecomp.mso.apihandlerinfra.tenantisolation.exceptions.TenantIsolationException; +import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.RelatedInstanceList; +import org.openecomp.mso.client.aai.entities.AAIResultWrapper; +import org.openecomp.mso.client.aai.objects.AAIOperationalEnvironment; +import org.openecomp.mso.client.grm.GRMClient; +import org.openecomp.mso.client.grm.beans.OperationalInfo; +import org.openecomp.mso.client.grm.beans.Property; +import org.openecomp.mso.client.grm.beans.ServiceEndPoint; +import org.openecomp.mso.client.grm.beans.ServiceEndPointList; +import org.openecomp.mso.client.grm.beans.ServiceEndPointRequest; +import org.openecomp.mso.client.grm.beans.Version; +import org.openecomp.mso.logger.MessageEnum; +import org.openecomp.mso.logger.MsoLogger; +import org.apache.commons.lang3.StringUtils; + +import com.fasterxml.jackson.databind.ObjectMapper; + +public class CreateVnfOperationalEnvironment extends OperationalEnvironmentProcess { + + private static final String SERVICE_NAME = "CreateVnfOperationalEnvironment"; + private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH); + private ObjectMapper mapper = new ObjectMapper(); + private GRMClient grmClient; + + public CreateVnfOperationalEnvironment(CloudOrchestrationRequest request, String requestId) { + super(request, requestId); + MsoLogger.setServiceName (getRequestId()); + MsoLogger.setLogContext(getRequestId(), getRequest().getOperationalEnvironmentId()); + } + + + @Override + public void execute() { + try { + msoLogger.debug("Begin of execute method in " + SERVICE_NAME); + //Retrieve ECOMP Managing environment info in A&AI + AAIResultWrapper aaiResultWrapper = getAaiHelper().getAaiOperationalEnvironment(getEcompManagingEnvironmentId()); + AAIOperationalEnvironment aaiEnv = mapper.readValue(aaiResultWrapper.getJson(), AAIOperationalEnvironment.class); + + //Find ECOMP environments in GRM + msoLogger.debug(" Start of GRM findRunningServicesAsString"); + String searchKey = getSearchKey(aaiEnv); + String tenantContext = getTenantContext().toUpperCase(); + String jsonResponse = getGRMClient().findRunningServicesAsString(searchKey, 1, tenantContext); + ServiceEndPointList sel = getObjectMapper().readValue(jsonResponse, ServiceEndPointList.class); + if(sel.getServiceEndPointList().size() == 0) { + throw new TenantIsolationException("GRM did not find any matches for " + searchKey + " in " + tenantContext); + } + //Replicate end-point for VNF Operating environment in GRM + List serviceEndpointRequestList = buildEndPointRequestList(sel); + int ctr = 0; + int total = serviceEndpointRequestList.size(); + for(ServiceEndPointRequest request : serviceEndpointRequestList) { + msoLogger.debug("Creating endpoint " + ++ctr + " of " + total + ": " + request.getServiceEndPoint().getName()); + getGRMClient().addServiceEndPoint(request); + } + + //Create VNF operating in A&AI + getAaiHelper().createOperationalEnvironment(getAaiClientObjectBuilder().buildAAIOperationalEnvironment("INACTIVE")); + getAaiHelper().createRelationship(getRequest().getOperationalEnvironmentId(), getEcompManagingEnvironmentId()); + + //Update request database + getRequestDb().updateInfraSuccessCompletion("SUCCESSFULLY created VNF operational environment", getRequestId(), getRequest().getOperationalEnvironmentId()); + } + catch(Exception e) { + msoLogger.error(MessageEnum.APIH_GENERAL_EXCEPTION, "", "", "", MsoLogger.ErrorCode.DataError, e.getMessage()); + getRequestDb().updateInfraFailureCompletion(e.getMessage(), requestId, getRequest().getOperationalEnvironmentId()); + } + } + + + protected String getEcompManagingEnvironmentId() throws TenantIsolationException { + RelatedInstanceList[] relatedInstances = getRequest().getRequestDetails().getRelatedInstanceList(); + if (relatedInstances.length > 0 && relatedInstances[0].getRelatedInstance() != null) { + return relatedInstances[0].getRelatedInstance().getInstanceId(); + } else { + throw new TenantIsolationException("Unable to get Managing ECOMP Environment ID, request related instance list is empty!"); + } + } + + + protected String getTenantContext() throws TenantIsolationException { + if(!StringUtils.isEmpty(getRequest().getRequestDetails().getRequestParameters().getTenantContext())) { + return getRequest().getRequestDetails().getRequestParameters().getTenantContext(); + } + else { + throw new TenantIsolationException("Tenant Context is missing from request!"); + } + } + + + private List buildEndPointRequestList(ServiceEndPointList serviceEndPointList) throws TenantIsolationException { + List endpointList = serviceEndPointList.getServiceEndPointList(); + msoLogger.debug("Number of service endpoints from GRM: " + endpointList.size()); + List serviceEndPointRequestList = new ArrayList(); + for(ServiceEndPoint serviceEndpoint : endpointList) { + serviceEndPointRequestList.add(buildServiceEndpoint(serviceEndpoint)); + } + return serviceEndPointRequestList; + } + + + private ServiceEndPointRequest buildServiceEndpoint(ServiceEndPoint serviceEndpoint) throws TenantIsolationException { + + //@TODO: handle nulls? Put in a ServiceEndpointWrapper class which will check for nulls and flatten access to fields + Version ver = new Version(); + ver.setMajor(serviceEndpoint.getVersion().getMajor()); + ver.setMinor(serviceEndpoint.getVersion().getMinor()); + ver.setPatch(serviceEndpoint.getVersion().getPatch()); + + ServiceEndPoint endpoint = new ServiceEndPoint(); + endpoint.setName(buildServiceNameForVnf(serviceEndpoint.getName())); + + endpoint.setVersion(ver); + endpoint.setHostAddress(serviceEndpoint.getHostAddress()); + endpoint.setListenPort(serviceEndpoint.getListenPort()); + endpoint.setLatitude(serviceEndpoint.getLatitude()); + endpoint.setLongitude(serviceEndpoint.getLongitude()); + endpoint.setContextPath(serviceEndpoint.getContextPath()); + endpoint.setRouteOffer(serviceEndpoint.getRouteOffer()); + + OperationalInfo operInfo = new OperationalInfo(); + operInfo.setCreatedBy(serviceEndpoint.getOperationalInfo().getCreatedBy()); + operInfo.setUpdatedBy(serviceEndpoint.getOperationalInfo().getUpdatedBy()); + + endpoint.setOperationalInfo(operInfo); + endpoint.setProperties(serviceEndpoint.getProperties()); + + String env = getEnvironmentName(serviceEndpoint.getProperties()); + + ServiceEndPointRequest serviceEndPontRequest = new ServiceEndPointRequest(); + serviceEndPontRequest.setEnv(env); + serviceEndPontRequest.setServiceEndPoint(endpoint); + + return serviceEndPontRequest; + } + + + protected String getEnvironmentName(List props) { + String env = ""; + for(Property prop : props) { + if(prop.getName().equalsIgnoreCase("Environment")) { + env = prop.getValue(); + } + } + return env; + } + + + protected String buildServiceNameForVnf(String fqName) throws TenantIsolationException { + // Service name format is: {tenantContext}.{workloadContext}.{serviceName} e.g. TEST.ECOMP_PSL.Inventory + // We need to extract the serviceName, in the above example: "Inventory" + String[] tokens = fqName.split("[.]"); + String serviceName; + if(tokens.length > 0) { + serviceName = tokens[tokens.length-1]; + } + else { + throw new TenantIsolationException("Fully qualified service name is null."); + } + String tenantContext = getRequest().getRequestDetails().getRequestParameters().getTenantContext(); + String workloadContext = getRequest().getRequestDetails().getRequestParameters().getWorkloadContext(); + return tenantContext + "." + workloadContext + "." + serviceName; + } + + + protected GRMClient getGRMClient() { + if(this.grmClient == null) { + this.grmClient = new GRMClient(); + } + return this.grmClient; + } + + + protected String getSearchKey(AAIOperationalEnvironment aaiEnv) { + return aaiEnv.getTenantContext() + "." + aaiEnv.getWorkloadContext() + ".*"; + } + + protected ObjectMapper getObjectMapper() { + return mapper; + } + + + @Override + protected String getServiceName() { + return CreateVnfOperationalEnvironment.SERVICE_NAME; + } + + +} diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/process/DeactivateVnfOperationalEnvironment.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/process/DeactivateVnfOperationalEnvironment.java new file mode 100644 index 0000000000..b419a0ccd0 --- /dev/null +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/process/DeactivateVnfOperationalEnvironment.java @@ -0,0 +1,92 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.mso.apihandlerinfra.tenantisolation.process; + +import org.openecomp.mso.apihandlerinfra.tenantisolation.CloudOrchestrationRequest; +import org.openecomp.mso.apihandlerinfra.tenantisolation.exceptions.TenantIsolationException; +import org.openecomp.mso.client.aai.entities.AAIResultWrapper; +import org.openecomp.mso.client.aai.objects.AAIOperationalEnvironment; +import org.openecomp.mso.logger.MessageEnum; +import org.openecomp.mso.logger.MsoLogger; + +public class DeactivateVnfOperationalEnvironment extends OperationalEnvironmentProcess { + + private static final String SERVICE_NAME = "DeactivateVnfOperationalEnvironment"; + private static MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.APIH); + private String className = this.getClass().getName(); + + public DeactivateVnfOperationalEnvironment(CloudOrchestrationRequest request, String requestId) { + super(request, requestId); + MsoLogger.setServiceName (getRequestId()); + MsoLogger.setLogContext(getRequestId(), getRequest().getOperationalEnvironmentId()); + } + + @Override + public void execute() { + String methodName = "deactivateOperationalEnvironment() method."; + String classMethodMessage = className + " " + methodName; + + msoLogger.debug("Begin of execute method in " + SERVICE_NAME); + + String operationalEnvironmentId = getRequest().getOperationalEnvironmentId(); + msoLogger.debug("Deactivate OperationalEnvironment on " + operationalEnvironmentId); + try { + msoLogger.debug("Start of AA&I Get client call in " + classMethodMessage); + + AAIResultWrapper aaiResult = getAaiHelper().getAaiOperationalEnvironment(operationalEnvironmentId); + AAIOperationalEnvironment aaiOpEnv = aaiResult.asBean(AAIOperationalEnvironment.class).get(); + String operationalEnvironmentStatus = aaiOpEnv.getOperationalEnvironmentStatus(); + + msoLogger.debug("OperationalEnvironmentStatus is :" + operationalEnvironmentStatus); + msoLogger.debug(" End of AA&I Get client call in " + classMethodMessage); + + if(operationalEnvironmentStatus == null) { + String error = "OperationalEnvironmentStatus is null on OperationalEnvironmentId: " + operationalEnvironmentId; + throw new TenantIsolationException(error); + } + + if(operationalEnvironmentStatus.equalsIgnoreCase("ACTIVE")) { + msoLogger.debug("Start of AA&I UPDATE client call in " + classMethodMessage); + + aaiOpEnv.setOperationalEnvironmentStatus("INACTIVE"); + getAaiHelper().updateAaiOperationalEnvironment(operationalEnvironmentId, aaiOpEnv); + + msoLogger.debug(" End of AA&I UPDATE client call in " + classMethodMessage); + } else if(!operationalEnvironmentStatus.equalsIgnoreCase("INACTIVE")) { + String error = "Invalid OperationalEnvironmentStatus on OperationalEnvironmentId: " + operationalEnvironmentId; + throw new TenantIsolationException(error); + } + + getRequestDb().updateInfraSuccessCompletion("SUCCESSFULLY Deactivated OperationalEnvironment", requestId, operationalEnvironmentId); + + } catch(Exception e) { + msoLogger.error (MessageEnum.APIH_GENERAL_EXCEPTION, "", "", "", MsoLogger.ErrorCode.DataError, e.getMessage()); + getRequestDb().updateInfraFailureCompletion(e.getMessage(), requestId, operationalEnvironmentId); + } + + msoLogger.debug("End of " + classMethodMessage); + } + + @Override + protected String getServiceName() { + return DeactivateVnfOperationalEnvironment.SERVICE_NAME; + } +} \ No newline at end of file diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/process/OperationalEnvironmentProcess.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/process/OperationalEnvironmentProcess.java new file mode 100644 index 0000000000..9c2d443215 --- /dev/null +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/tenantisolation/process/OperationalEnvironmentProcess.java @@ -0,0 +1,78 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.mso.apihandlerinfra.tenantisolation.process; + +import org.openecomp.mso.apihandlerinfra.tenantisolation.CloudOrchestrationRequest; +import org.openecomp.mso.apihandlerinfra.tenantisolation.helpers.AAIClientHelper; +import org.openecomp.mso.apihandlerinfra.tenantisolation.helpers.AAIClientObjectBuilder; +import org.openecomp.mso.requestsdb.RequestsDBHelper; + +public abstract class OperationalEnvironmentProcess { + + protected String requestId; + protected CloudOrchestrationRequest request; + protected AAIClientObjectBuilder aaiClientObjectBuilder; + protected AAIClientHelper aaiHelper; + protected RequestsDBHelper requestDb; + + public OperationalEnvironmentProcess(CloudOrchestrationRequest request, String requestId) { + this.requestId = requestId; + this.request = request; + this.aaiClientObjectBuilder = new AAIClientObjectBuilder(getRequest()); + } + + protected String getRequestId() { + return this.requestId; + } + + protected CloudOrchestrationRequest getRequest() { + return this.request; + } + + protected AAIClientHelper getAaiHelper() { + if(this.aaiHelper == null) { + this.aaiHelper = new AAIClientHelper(getServiceName(), getRequestId()); + } + return this.aaiHelper; + } + + protected void setAaiHelper(AAIClientHelper helper) { + this.aaiHelper = helper; + } + + protected AAIClientObjectBuilder getAaiClientObjectBuilder() { + return this.aaiClientObjectBuilder; + } + + protected RequestsDBHelper getRequestDb() { + if(requestDb == null) { + requestDb = new RequestsDBHelper(); + } + return requestDb; + } + + protected void setRequestsDBHelper(RequestsDBHelper helper) { + this.requestDb = helper; + } + + protected abstract String getServiceName(); + public abstract void execute(); +} -- cgit 1.2.3-korg