diff options
Diffstat (limited to 'mso-api-handlers/mso-api-handler-common/src')
17 files changed, 324 insertions, 920 deletions
diff --git a/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/camundabeans/CamundaVIDRequest.java b/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/camundabeans/CamundaVIDRequest.java index 4517811494..65c850a785 100644 --- a/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/camundabeans/CamundaVIDRequest.java +++ b/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/camundabeans/CamundaVIDRequest.java @@ -65,7 +65,8 @@ public class CamundaVIDRequest { @JsonProperty(CommonConstants.SERVICE_INSTANCE_ID_VARIABLE) private CamundaInput serviceInstanceId; - + @JsonProperty(CommonConstants.OPERATION_TYPE) + private CamundaInput operationType; @JsonProperty(CommonConstants.PNF_CORRELATION_ID) private CamundaInput pnfCorrelationId; @@ -194,6 +195,16 @@ public class CamundaVIDRequest { this.serviceInstanceId = serviceInstanceId; } + @JsonProperty(CommonConstants.OPERATION_TYPE) + public CamundaInput getOperationType() { + return operationType; + } + + @JsonProperty(CommonConstants.OPERATION_TYPE) + public void setOperationType(CamundaInput operationType) { + this.operationType = operationType; + } + @JsonProperty(CommonConstants.PNF_CORRELATION_ID) public CamundaInput getPnfCorrelationId() { return pnfCorrelationId; diff --git a/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/common/CamundaClient.java b/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/common/CamundaClient.java index bc8af6e690..4bbfa1d067 100644 --- a/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/common/CamundaClient.java +++ b/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/common/CamundaClient.java @@ -25,84 +25,63 @@ package org.onap.so.apihandler.common; import java.io.IOException; -import java.util.UUID; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.List; import javax.xml.bind.DatatypeConverter; import org.apache.commons.lang3.StringUtils; -import org.apache.http.HttpResponse; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.entity.StringEntity; -import org.onap.logging.ref.slf4j.ONAPLogConstants; +import org.apache.http.HttpStatus; import org.onap.so.apihandler.camundabeans.CamundaBooleanInput; import org.onap.so.apihandler.camundabeans.CamundaInput; import org.onap.so.apihandler.camundabeans.CamundaIntegerInput; import org.onap.so.apihandler.camundabeans.CamundaRequest; +import org.onap.so.apihandler.camundabeans.CamundaResponse; import org.onap.so.apihandler.camundabeans.CamundaVIDRequest; +import org.onap.so.apihandlerinfra.exceptions.ApiException; +import org.onap.so.apihandlerinfra.exceptions.BPMNFailureException; +import org.onap.so.apihandlerinfra.exceptions.ClientConnectionException; +import org.onap.so.utils.CryptoUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.slf4j.MDC; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.HttpStatusCodeException; +import org.springframework.web.client.ResourceAccessException; +import org.springframework.web.client.RestTemplate; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; -public class CamundaClient extends RequestClient { +@Component +public class CamundaClient { private static Logger logger = LoggerFactory.getLogger(CamundaClient.class); - private static final String CAMUNDA_URL_MESAGE = "Camunda url is: "; - private static final String CAMUNDA_RESPONSE = "Response is: {}"; - private static final String AUTHORIZATION = "Authorization"; private static final String BASIC = "Basic "; - public CamundaClient() { - super(CommonConstants.CAMUNDA); - } + @Autowired + private RestTemplate restTemplate; + @Autowired + private Environment env; - @Override - public HttpResponse post(String camundaReqXML, String requestId, String requestTimeout, String schemaVersion, - String serviceInstanceId, String action) throws IOException { - HttpPost post = new HttpPost(url); - logger.debug(CAMUNDA_URL_MESAGE + url); - String jsonReq = wrapRequest(camundaReqXML, requestId, serviceInstanceId, requestTimeout, schemaVersion); + @Autowired + private ResponseHandler responseHandler; - StringEntity input = new StringEntity(jsonReq); - input.setContentType(CommonConstants.CONTENT_TYPE_JSON); + public ResponseEntity<String> post(String camundaReqXML, String requestId, String requestTimeout, + String schemaVersion, String serviceInstanceId, String action, String orchestrationURI) + throws ApiException { + String jsonReq = wrapRequest(camundaReqXML, requestId, serviceInstanceId, requestTimeout, schemaVersion, + orchestrationURI); logger.info("Camunda Request Content: {}", jsonReq); - - post.setEntity(input); - setupHeaders(post); - - HttpResponse response = client.execute(post); - logger.debug(CAMUNDA_RESPONSE, response); - - return response; - } - - - private void setupHeaders(HttpPost post) { - post.addHeader(ONAPLogConstants.Headers.REQUEST_ID, MDC.get(ONAPLogConstants.MDCs.REQUEST_ID)); - post.addHeader(ONAPLogConstants.Headers.INVOCATION_ID, UUID.randomUUID().toString()); - addAuthorizationHeader(post); + return post(jsonReq, orchestrationURI); } - @Override - public HttpResponse post(String jsonReq) throws IOException { - HttpPost post = new HttpPost(url); - logger.debug(CAMUNDA_URL_MESAGE + url); - - StringEntity input = new StringEntity(jsonReq); - input.setContentType(CommonConstants.CONTENT_TYPE_JSON); - setupHeaders(post); - addAuthorizationHeader(post); - post.setEntity(input); - HttpResponse response = client.execute(post); - logger.debug(CAMUNDA_RESPONSE, response); - - return response; - } - - @Override - public HttpResponse post(RequestClientParameter parameterObject) throws IOException { - HttpPost post = new HttpPost(url); - logger.debug(CAMUNDA_URL_MESAGE + url); + public ResponseEntity<String> post(RequestClientParameter parameterObject, String orchestrationURI) + throws ApiException { String jsonReq = wrapVIDRequest(parameterObject.getRequestId(), parameterObject.isBaseVfModule(), parameterObject.getRecipeTimeout(), parameterObject.getRequestAction(), parameterObject.getServiceInstanceId(), parameterObject.getPnfCorrelationId(), @@ -111,28 +90,47 @@ public class CamundaClient extends RequestClient { parameterObject.getVnfType(), parameterObject.getVfModuleType(), parameterObject.getNetworkType(), parameterObject.getRequestDetails(), parameterObject.getApiVersion(), parameterObject.isaLaCarte(), parameterObject.getRequestUri(), parameterObject.getRecipeParamXsd(), - parameterObject.getInstanceGroupId(), parameterObject.isGenerateIdsOnly()); + parameterObject.getInstanceGroupId(), parameterObject.isGenerateIdsOnly(), + parameterObject.getOperationType()); - StringEntity input = new StringEntity(jsonReq); - input.setContentType(CommonConstants.CONTENT_TYPE_JSON); - setupHeaders(post); - addAuthorizationHeader(post); - post.setEntity(input); - HttpResponse response = client.execute(post); - logger.debug(CAMUNDA_RESPONSE, response); + return post(jsonReq, orchestrationURI); + } - return response; + public ResponseEntity<String> get(String url) throws ApiException { + url = env.getRequiredProperty(CommonConstants.CAMUNDA_URL) + url; + HttpEntity<?> requestEntity = new HttpEntity<>(setHeaders()); + try { + return restTemplate.exchange(url, HttpMethod.GET, requestEntity, String.class); + } catch (HttpStatusCodeException e) { + logger.error("Error returned from sending GET request to BPMN", e); + throw createBPMNFailureException(e); + } catch (ResourceAccessException e) { + logger.error("Error sending GET to BPMN", e); + ClientConnectionException clientException = new ClientConnectionException.Builder(url, + HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).build(); + throw clientException; + } } - @Override - public HttpResponse get() { - return null; + public ResponseEntity<String> post(String jsonReq, String url) throws ApiException { + url = env.getRequiredProperty(CommonConstants.CAMUNDA_URL) + url; + HttpEntity<String> request = new HttpEntity<String>(jsonReq, setHeaders()); + try { + return restTemplate.postForEntity(url, request, String.class); + } catch (HttpStatusCodeException e) { + logger.error("Error returned after sending POST request to BPMN", e); + throw createBPMNFailureException(e); + } catch (ResourceAccessException e) { + logger.error("Error sending POST to BPMN", e); + ClientConnectionException clientException = new ClientConnectionException.Builder(url, + HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).build(); + throw clientException; + } } protected String wrapRequest(String reqXML, String requestId, String serviceInstanceId, String requestTimeout, - String schemaVersion) { + String schemaVersion, String url) { String jsonReq = null; - try { CamundaRequest camundaRequest = new CamundaRequest(); CamundaInput camundaInput = new CamundaInput(); @@ -142,7 +140,7 @@ public class CamundaClient extends RequestClient { CamundaInput svcid = new CamundaInput(); CamundaInput timeout = new CamundaInput(); camundaInput.setValue(StringUtils.defaultString(reqXML)); - host.setValue(parseURL()); + host.setValue(CommonConstants.CAMUNDA_URL); schema.setValue(StringUtils.defaultString(schemaVersion)); reqid.setValue(requestId); svcid.setValue(serviceInstanceId); @@ -160,7 +158,7 @@ public class CamundaClient extends RequestClient { jsonReq = mapper.writeValueAsString(camundaRequest); logger.trace("request body is {}", jsonReq); } catch (Exception e) { - logger.error("Error in APIH Warp request", e); + logger.error("Error in APIH Wrap request", e); } return jsonReq; } @@ -170,7 +168,7 @@ public class CamundaClient extends RequestClient { String serviceInstanceId, String pnfCorrelationId, String vnfId, String vfModuleId, String volumeGroupId, String networkId, String configurationId, String serviceType, String vnfType, String vfModuleType, String networkType, String requestDetails, String apiVersion, boolean aLaCarte, String requestUri, - String paramXsd, String instanceGroupId, boolean generateIdsOnly) { + String paramXsd, String instanceGroupId, boolean generateIdsOnly, String operationType) { String jsonReq = null; try { @@ -182,6 +180,7 @@ public class CamundaClient extends RequestClient { CamundaIntegerInput recipeTimeoutInput = new CamundaIntegerInput(); CamundaInput requestActionInput = new CamundaInput(); CamundaInput serviceInstanceIdInput = new CamundaInput(); + CamundaInput operationTypeInput = new CamundaInput(); CamundaInput pnfCorrelationIdInput = new CamundaInput(); CamundaInput vnfIdInput = new CamundaInput(); CamundaInput vfModuleIdInput = new CamundaInput(); @@ -199,7 +198,7 @@ public class CamundaClient extends RequestClient { CamundaInput instanceGroupIdInput = new CamundaInput(); CamundaBooleanInput generateIds = new CamundaBooleanInput(); - + operationTypeInput.setValue(StringUtils.defaultString(operationType)); requestIdInput.setValue(StringUtils.defaultString(requestId)); isBaseVfModuleInput.setValue(isBaseVfModule); recipeTimeoutInput.setValue(recipeTimeout); @@ -231,6 +230,7 @@ public class CamundaClient extends RequestClient { camundaRequest.setRecipeTimeout(recipeTimeoutInput); camundaRequest.setRequestAction(requestActionInput); camundaRequest.setServiceInstanceId(serviceInstanceIdInput); + camundaRequest.setOperationType(operationTypeInput); camundaRequest.setPnfCorrelationId(pnfCorrelationIdInput); camundaRequest.setVnfId(vnfIdInput); camundaRequest.setVfModuleId(vfModuleIdInput); @@ -254,35 +254,53 @@ public class CamundaClient extends RequestClient { jsonReq = mapper.writeValueAsString(camundaRequest); logger.trace("request body is {}", jsonReq); } catch (Exception e) { - logger.error("Error in APIH Warp request", e); + logger.error("Error in wrapVIDRequest", e); } return jsonReq; } - private String parseURL() { - String[] parts = url.split(":"); - String host = ""; - if (parts.length >= 2) { - host = parts[1]; - if (host.length() > 2) { - host = host.substring(2); + protected HttpHeaders setHeaders() { + HttpHeaders headers = new HttpHeaders(); + List<org.springframework.http.MediaType> acceptableMediaTypes = new ArrayList<>(); + acceptableMediaTypes.add(org.springframework.http.MediaType.APPLICATION_JSON); + headers.setAccept(acceptableMediaTypes); + headers.setContentType(org.springframework.http.MediaType.APPLICATION_JSON); + headers.add(HttpHeaders.AUTHORIZATION, addAuthorizationHeader(env.getRequiredProperty("mso.camundaAuth"), + env.getRequiredProperty("mso.msoKey"))); + return headers; + } + + protected String addAuthorizationHeader(String auth, String msoKey) { + String basicAuth = null; + try { + String userCredentials = CryptoUtils.decrypt(auth, msoKey); + if (userCredentials != null) { + basicAuth = BASIC + DatatypeConverter.printBase64Binary(userCredentials.getBytes()); } + } catch (GeneralSecurityException e) { + logger.error("Security exception", e); } - return host; + return basicAuth; } - private void addAuthorizationHeader(HttpPost post) { - String encryptedCredentials; - if (props != null) { - encryptedCredentials = props.getProperty(CommonConstants.CAMUNDA_AUTH); - if (encryptedCredentials != null) { - String userCredentials = getEncryptedPropValue(encryptedCredentials, CommonConstants.DEFAULT_BPEL_AUTH, - props.getProperty(CommonConstants.ENCRYPTION_KEY_PROP)); - if (userCredentials != null) { - post.addHeader(AUTHORIZATION, - BASIC + new String(DatatypeConverter.printBase64Binary(userCredentials.getBytes()))); - } - } + protected BPMNFailureException createBPMNFailureException(HttpStatusCodeException e) { + ObjectMapper mapper = new ObjectMapper(); + String responseText = null; + String message = null; + try { + CamundaResponse response = mapper.readValue(e.getResponseBodyAsString(), CamundaResponse.class); + responseText = response.getResponse(); + } catch (IOException ex) { + responseText = e.getResponseBodyAsString(); + } + message = String.valueOf(e.getStatusCode()); + if (responseText != null && !responseText.isEmpty()) { + message = message + " " + responseText; } + BPMNFailureException bpmnException = + new BPMNFailureException.Builder(message, responseHandler.setStatus(e.getStatusCode().value()), + ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, e.getStatusCode()).build(); + return bpmnException; } + } diff --git a/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/common/CamundaTaskClient.java b/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/common/CamundaTaskClient.java deleted file mode 100644 index d6d999b4b5..0000000000 --- a/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/common/CamundaTaskClient.java +++ /dev/null @@ -1,96 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP - SO - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Modifications Copyright (c) 2019 Samsung - * ================================================================================ - * 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.onap.so.apihandler.common; - -import java.io.IOException; -import javax.xml.bind.DatatypeConverter; -import org.apache.http.HttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.entity.StringEntity; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class CamundaTaskClient extends RequestClient { - private static Logger logger = LoggerFactory.getLogger(CamundaTaskClient.class); - - public CamundaTaskClient() { - super(CommonConstants.CAMUNDATASK); - } - - @Override - public HttpResponse post(String jsonReq) throws IOException { - HttpPost post = new HttpPost(url); - logger.debug("Camunda Task url is: {}", url); - - StringEntity input = new StringEntity(jsonReq); - input.setContentType(CommonConstants.CONTENT_TYPE_JSON); - - String encryptedCredentials; - if (props != null) { - encryptedCredentials = props.getProperty(CommonConstants.CAMUNDA_AUTH); - if (encryptedCredentials != null) { - String userCredentials = getEncryptedPropValue(encryptedCredentials, CommonConstants.DEFAULT_BPEL_AUTH, - props.getProperty(CommonConstants.ENCRYPTION_KEY_PROP)); - if (userCredentials != null) { - post.addHeader("Authorization", - "Basic " + DatatypeConverter.printBase64Binary(userCredentials.getBytes())); - } - } - } - - post.setEntity(input); - return client.execute(post); - } - - @Override - public HttpResponse post(String camundaReqXML, String requestId, String requestTimeout, String schemaVersion, - String serviceInstanceId, String action) { - throw new UnsupportedOperationException("Method not supported."); - } - - @Override - public HttpResponse post(RequestClientParameter params) { - throw new UnsupportedOperationException("Method not supported."); - } - - @Override - public HttpResponse get() throws IOException { - HttpGet get = new HttpGet(url); - logger.debug("Camunda Task url is: {}", url); - String encryptedCredentials; - if (props != null) { - encryptedCredentials = props.getProperty(CommonConstants.CAMUNDA_AUTH); - if (encryptedCredentials != null) { - String userCredentials = getEncryptedPropValue(encryptedCredentials, CommonConstants.DEFAULT_BPEL_AUTH, - props.getProperty(CommonConstants.ENCRYPTION_KEY_PROP)); - if (userCredentials != null) { - get.addHeader("Authorization", - "Basic " + new String(DatatypeConverter.printBase64Binary(userCredentials.getBytes()))); - } - } - } - return client.execute(get); - } - -} diff --git a/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/common/CommonConstants.java b/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/common/CommonConstants.java index 6d2bbfc613..d667126afa 100644 --- a/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/common/CommonConstants.java +++ b/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/common/CommonConstants.java @@ -54,6 +54,7 @@ public final class CommonConstants { public static final String RECIPE_TIMEOUT_VARIABLE = "recipeTimeout"; public static final String REQUEST_ACTION_VARIABLE = "requestAction"; public static final String SERVICE_INSTANCE_ID_VARIABLE = "serviceInstanceId"; + public static final String OPERATION_TYPE = "operationType"; public static final String PNF_CORRELATION_ID = "pnfCorrelationId"; public static final String VNF_ID_VARIABLE = "vnfId"; public static final String VF_MODULE_ID_VARIABLE = "vfModuleId"; diff --git a/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/common/RequestClient.java b/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/common/RequestClient.java deleted file mode 100644 index 318b3ba5af..0000000000 --- a/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/common/RequestClient.java +++ /dev/null @@ -1,86 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP - SO - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Modifications Copyright (c) 2019 Samsung - * ================================================================================ - * 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.onap.so.apihandler.common; - -import java.io.IOException; -import java.security.GeneralSecurityException; -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; -import org.onap.so.utils.CryptoUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.core.env.Environment; - -public abstract class RequestClient { - private static Logger logger = LoggerFactory.getLogger(RequestClient.class); - protected Environment props; - protected String url; - protected HttpClient client; - private int type; - - public RequestClient(int type) { - this.type = type; - } - - public void setProps(Environment env) { - this.props = env; - } - - public void setUrl(String url) { - this.url = url; - } - - public String getUrl() { - return url; - } - - public int getType() { - return type; - } - - public HttpClient getClient() { - return client; - } - - public void setClient(HttpClient client) { - this.client = client; - } - - public abstract HttpResponse post(String request, String requestId, String requestTimeout, String schemaVersion, - String serviceInstanceId, String action) throws IOException; - - public abstract HttpResponse post(String request) throws IOException; - - public abstract HttpResponse post(RequestClientParameter parameterObject) throws IOException; - - public abstract HttpResponse get() throws IOException; - - protected String getEncryptedPropValue(String prop, String defaultValue, String encryptionKey) { - try { - return CryptoUtils.decrypt(prop, encryptionKey); - } catch (GeneralSecurityException e) { - logger.debug("Security exception", e); - } - return defaultValue; - } -} diff --git a/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/common/RequestClientFactory.java b/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/common/RequestClientFactory.java deleted file mode 100644 index c2ffa7e004..0000000000 --- a/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/common/RequestClientFactory.java +++ /dev/null @@ -1,66 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP - SO - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Modifications Copyright (c) 2019 Samsung - * ================================================================================ - * - * 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.onap.so.apihandler.common; - -import org.apache.http.impl.client.HttpClientBuilder; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.env.Environment; -import org.springframework.stereotype.Component; - -@Component -public class RequestClientFactory { - - @Autowired - private Environment env; - - // based on URI, returns BPEL, CamundaTask or Camunda client - public RequestClient getRequestClient(String orchestrationURI) { - RequestClient retClient; - - String url; - if (orchestrationURI.contains(CommonConstants.TASK_SEARCH_STR)) { - url = env.getProperty(CommonConstants.CAMUNDA_URL) + orchestrationURI; - retClient = new CamundaTaskClient(); - } else { - url = env.getProperty(CommonConstants.CAMUNDA_URL) + orchestrationURI; - retClient = new CamundaClient(); - } - retClient.setClient(HttpClientBuilder.create().build()); - retClient.setProps(env); - retClient.setUrl(url); - return retClient; - - } - - public Environment getEnv() { - return env; - } - - public void setEnv(Environment env) { - this.env = env; - } - - - -} diff --git a/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/common/ResponseHandler.java b/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/common/ResponseHandler.java index 806646022c..af1258e963 100644 --- a/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/common/ResponseHandler.java +++ b/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandler/common/ResponseHandler.java @@ -24,144 +24,55 @@ package org.onap.so.apihandler.common; import java.io.IOException; -import org.apache.http.HttpEntity; -import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; -import org.apache.http.util.EntityUtils; import org.onap.so.apihandler.camundabeans.CamundaResponse; -import org.onap.so.apihandlerinfra.Constants; -import org.onap.so.apihandlerinfra.exceptions.ApiException; import org.onap.so.apihandlerinfra.exceptions.BPMNFailureException; import org.onap.so.apihandlerinfra.exceptions.ValidateException; -import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo; -import org.onap.logging.filter.base.ErrorCode; -import org.onap.so.logger.MessageEnum; -import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import com.fasterxml.jackson.databind.ObjectMapper; -public class ResponseHandler { - private CamundaResponse response; - private int status; - private String responseBody = ""; - private HttpResponse httpResponse; - private int type; +@Component +public class ResponseHandler { private static Logger logger = LoggerFactory.getLogger(ResponseHandler.class); - public ResponseHandler(HttpResponse httpResponse, int type) throws ApiException { - this.httpResponse = httpResponse; - this.type = type; - parseResponse(); - } - - - private void parseResponse() throws ApiException { - int statusCode = httpResponse.getStatusLine().getStatusCode(); - status = setStatus(statusCode); - if (type == CommonConstants.CAMUNDA) { - parseCamunda(); - } else if (type == CommonConstants.CAMUNDATASK) { - parseCamundaTask(); - } else { - parseBpel(); - } - - } - - - - private void parseCamunda() throws ApiException { - try { - HttpEntity entity = httpResponse.getEntity(); - responseBody = EntityUtils.toString(entity); - } catch (IOException e) { - ErrorLoggerInfo errorLoggerInfo = - new ErrorLoggerInfo.Builder(MessageEnum.APIH_VALIDATION_ERROR, ErrorCode.SchemaError) - .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build(); - - throw new ValidateException.Builder("IOException getting Camunda response body", HttpStatus.SC_BAD_REQUEST, - ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build(); - } - + public CamundaResponse getCamundaResponse(ResponseEntity<String> camundaResponse) throws ValidateException { + String responseBody = camundaResponse.getBody(); + CamundaResponse response = null; ObjectMapper mapper = new ObjectMapper(); try { response = mapper.readValue(responseBody, CamundaResponse.class); - } catch (IOException e) { - ErrorLoggerInfo errorLoggerInfo = - new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError) - .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build(); - - throw new ValidateException.Builder("Cannot parse Camunda Response", HttpStatus.SC_BAD_REQUEST, - ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build(); - } - if (response != null) { - responseBody = response.getResponse(); - } else { - ErrorLoggerInfo errorLoggerInfo = - new ErrorLoggerInfo.Builder(MessageEnum.APIH_ERROR_FROM_BPEL_SERVER, ErrorCode.BusinessProcessError) - .targetEntity("Camunda").targetServiceName("parseCamunda").build(); - BPMNFailureException bpmnFailureException = - new BPMNFailureException.Builder(String.valueOf(status), status, ErrorNumbers.ERROR_FROM_BPEL) - .errorInfo(errorLoggerInfo).build(); + } catch (IOException | NullPointerException e) { + logger.error("Cannot parse Camunda Response: ", e); + throw new ValidateException.Builder( + "Cannot parse Camunda ResponseBody. BPMN HTTP status: " + camundaResponse.getStatusCodeValue(), + HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).cause(e).build(); } + return response; } - private void parseBpel() throws ApiException { - - HttpEntity bpelEntity = httpResponse.getEntity(); - - try { - if (bpelEntity != null) { - responseBody = EntityUtils.toString(bpelEntity); - - } - } catch (IOException e) { - ErrorLoggerInfo errorLoggerInfo = - new ErrorLoggerInfo.Builder(MessageEnum.APIH_GENERAL_EXCEPTION, ErrorCode.DataError).build(); - - throw new ValidateException.Builder("Could not convert BPEL response to string", HttpStatus.SC_BAD_REQUEST, - ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build(); - } + public void acceptedResponse(ResponseEntity<String> response) throws BPMNFailureException { + int status = setStatus(response.getStatusCodeValue()); if (status != HttpStatus.SC_ACCEPTED) { - ErrorLoggerInfo errorLoggerInfo = - new ErrorLoggerInfo.Builder(MessageEnum.APIH_ERROR_FROM_BPEL_SERVER, ErrorCode.BusinessProcessError) - .targetEntity("BPEL").targetServiceName("parseBpel").build(); - - throw new BPMNFailureException.Builder(String.valueOf(status), status, ErrorNumbers.ERROR_FROM_BPEL) - .errorInfo(errorLoggerInfo).build(); + logger.info("Camunda did not return a valid response"); + throw new BPMNFailureException.Builder(String.valueOf(status), HttpStatus.SC_INTERNAL_SERVER_ERROR, + ErrorNumbers.ERROR_FROM_BPEL).build(); } - } - private void parseCamundaTask() throws ApiException { - - HttpEntity camundataskEntity = httpResponse.getEntity(); - - try { - if (camundataskEntity != null) { - responseBody = EntityUtils.toString(camundataskEntity); - } - } catch (IOException e) { - ErrorLoggerInfo errorLoggerInfo = - new ErrorLoggerInfo.Builder(MessageEnum.APIH_GENERAL_EXCEPTION, ErrorCode.DataError).build(); - - throw new ValidateException.Builder("Could not convert CamundaTask response to string", - HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo) - .build(); - } + public void acceptedOrNoContentResponse(ResponseEntity<String> response) throws BPMNFailureException { + int status = setStatus(response.getStatusCodeValue()); if (status != HttpStatus.SC_NO_CONTENT && status != HttpStatus.SC_ACCEPTED) { - ErrorLoggerInfo errorLoggerInfo = - new ErrorLoggerInfo.Builder(MessageEnum.APIH_ERROR_FROM_BPEL_SERVER, ErrorCode.BusinessProcessError) - .targetEntity("CAMUNDATASK").targetServiceName("parseCamundaTask").build(); - - throw new BPMNFailureException.Builder(String.valueOf(status), status, ErrorNumbers.ERROR_FROM_BPEL) - .errorInfo(errorLoggerInfo).build(); + logger.info("Camunda did not return a valid response"); + throw new BPMNFailureException.Builder(String.valueOf(status), HttpStatus.SC_INTERNAL_SERVER_ERROR, + ErrorNumbers.ERROR_FROM_BPEL).build(); } - } - private int setStatus(int statusCode) { + public int setStatus(int statusCode) { int httpStatus; switch (statusCode) { case HttpStatus.SC_ACCEPTED: @@ -193,30 +104,4 @@ public class ResponseHandler { } return httpStatus; } - - - public CamundaResponse getResponse() { - return response; - } - - - public void setResponse(CamundaResponse response) { - this.response = response; - } - - - public String getResponseBody() { - return responseBody; - } - - - public void setResponseBody(String responseBody) { - this.responseBody = responseBody; - } - - - public int getStatus() { - return status; - } - } diff --git a/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandlerinfra/exceptions/ApiException.java b/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandlerinfra/exceptions/ApiException.java index ab2ce10690..2ca18de9e3 100644 --- a/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandlerinfra/exceptions/ApiException.java +++ b/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandlerinfra/exceptions/ApiException.java @@ -23,6 +23,7 @@ package org.onap.so.apihandlerinfra.exceptions; import java.util.List; import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo; +import org.springframework.http.HttpStatus; public abstract class ApiException extends Exception { /** @@ -32,17 +33,16 @@ public abstract class ApiException extends Exception { private int httpResponseCode = 500; private String messageID; private ErrorLoggerInfo errorLoggerInfo; - + private HttpStatus originalHttpResponseCode; private List<String> variables; public ApiException(Builder builder) { super(builder.message, builder.cause); - this.httpResponseCode = builder.httpResponseCode; this.messageID = builder.messageID; this.variables = builder.variables; this.errorLoggerInfo = builder.errorLoggerInfo; - this.variables = builder.variables; + this.originalHttpResponseCode = builder.originalHttpResponseCode; } public ApiException(String message, Throwable cause) { @@ -54,6 +54,12 @@ public abstract class ApiException extends Exception { this.httpResponseCode = httpResponseCode; } + public ApiException(String message, int httpResponseCode, HttpStatus original) { + super(message); + this.httpResponseCode = httpResponseCode; + this.originalHttpResponseCode = original; + } + public ApiException(String message) { super(message); } @@ -75,13 +81,17 @@ public abstract class ApiException extends Exception { return variables; } + public HttpStatus getOriginalHttpResponseCode() { + return originalHttpResponseCode; + } + public static class Builder<T extends Builder<T>> { private String message; private Throwable cause = null; private int httpResponseCode; private String messageID; + private HttpStatus originalHttpResponseCode; private ErrorLoggerInfo errorLoggerInfo = null; - private List<String> variables = null; public Builder(String message, int httpResponseCode, String messageID) { @@ -90,6 +100,13 @@ public abstract class ApiException extends Exception { this.messageID = messageID; } + public Builder(String message, int httpResponseCode, String messageID, HttpStatus originalHttpResponseCode) { + this.message = message; + this.httpResponseCode = httpResponseCode; + this.messageID = messageID; + this.originalHttpResponseCode(originalHttpResponseCode); + } + public T message(String message) { this.message = message; return (T) this; @@ -119,5 +136,10 @@ public abstract class ApiException extends Exception { this.variables = variables; return (T) this; } + + public T originalHttpResponseCode(HttpStatus originalHttpResponseCode) { + this.originalHttpResponseCode = originalHttpResponseCode; + return (T) this; + } } } diff --git a/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandlerinfra/exceptions/ApiExceptionMapper.java b/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandlerinfra/exceptions/ApiExceptionMapper.java index 62f39d9148..696a518ceb 100644 --- a/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandlerinfra/exceptions/ApiExceptionMapper.java +++ b/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandlerinfra/exceptions/ApiExceptionMapper.java @@ -22,14 +22,9 @@ package org.onap.so.apihandlerinfra.exceptions; -import java.io.StringWriter; -import java.util.ArrayList; import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; import javax.ws.rs.core.Context; import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.ext.ExceptionMapper; import javax.ws.rs.ext.Provider; @@ -41,10 +36,7 @@ import org.onap.so.serviceinstancebeans.RequestError; import org.onap.so.serviceinstancebeans.ServiceException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; @Provider public class ApiExceptionMapper implements ExceptionMapper<ApiException> { diff --git a/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandlerinfra/exceptions/BPMNFailureException.java b/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandlerinfra/exceptions/BPMNFailureException.java index 97d46bd6f1..0d2b9be93a 100644 --- a/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandlerinfra/exceptions/BPMNFailureException.java +++ b/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandlerinfra/exceptions/BPMNFailureException.java @@ -20,6 +20,8 @@ package org.onap.so.apihandlerinfra.exceptions; +import org.springframework.http.HttpStatus; + public class BPMNFailureException extends ApiException { private static final String bpmnFailMessage = "Request Failed due to BPEL error with HTTP Status = $HTTPSTATUS"; @@ -35,6 +37,12 @@ public class BPMNFailureException extends ApiException { super(bpmnFailMessage.replaceAll("\\$HTTPSTATUS", message), httpResponseCode, messageID); } + public Builder(String message, int httpResponseCode, String messageID, HttpStatus originalHttpResponseCode) { + super(bpmnFailMessage.replaceAll("\\$HTTPSTATUS", message), httpResponseCode, messageID, + originalHttpResponseCode); + } + + public BPMNFailureException build() { return new BPMNFailureException(this); } diff --git a/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandlerinfra/exceptions/ClientConnectionException.java b/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandlerinfra/exceptions/ClientConnectionException.java index 4af5289ad7..9ef2072fef 100644 --- a/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandlerinfra/exceptions/ClientConnectionException.java +++ b/mso-api-handlers/mso-api-handler-common/src/main/java/org/onap/so/apihandlerinfra/exceptions/ClientConnectionException.java @@ -26,7 +26,7 @@ public class ClientConnectionException extends ApiException { * */ private static final long serialVersionUID = 1L; - private static final String clientFailMessage = "Client from $URL failed to connect"; + private static final String clientFailMessage = "Client from $URL failed to connect or respond"; private ClientConnectionException(Builder builder) { super(builder); diff --git a/mso-api-handlers/mso-api-handler-common/src/test/java/org/onap/so/apihandler/common/CamundaClientTest.java b/mso-api-handlers/mso-api-handler-common/src/test/java/org/onap/so/apihandler/common/CamundaClientTest.java index 94c62a9689..e0f4fe3f7a 100644 --- a/mso-api-handlers/mso-api-handler-common/src/test/java/org/onap/so/apihandler/common/CamundaClientTest.java +++ b/mso-api-handlers/mso-api-handler-common/src/test/java/org/onap/so/apihandler/common/CamundaClientTest.java @@ -24,109 +24,61 @@ package org.onap.so.apihandler.common; -import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.when; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; -import org.apache.http.HttpResponse; -import org.apache.http.HttpStatus; -import org.apache.http.ProtocolVersion; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.entity.StringEntity; -import org.apache.http.message.BasicHttpResponse; -import org.apache.http.message.BasicStatusLine; -import org.junit.Assert; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; -import org.mockito.ArgumentCaptor; +import org.junit.rules.ExpectedException; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; +import org.mockito.Spy; +import org.mockito.junit.MockitoJUnitRunner; +import org.onap.so.apihandlerinfra.exceptions.ApiException; +import org.onap.so.apihandlerinfra.exceptions.BPMNFailureException; +import org.onap.so.apihandlerinfra.exceptions.ClientConnectionException; import org.skyscreamer.jsonassert.JSONAssert; -import org.springframework.mock.env.MockEnvironment; -import com.fasterxml.jackson.core.JsonGenerationException; -import com.fasterxml.jackson.databind.JsonMappingException; - -/** - * This class implements test methods of Camunda Beans. - * - * - */ +import org.springframework.core.env.Environment; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.HttpServerErrorException; +import org.springframework.web.client.ResourceAccessException; +import org.springframework.web.client.RestTemplate; + +@RunWith(MockitoJUnitRunner.class) public class CamundaClientTest { - - @Mock - private HttpClient mockHttpClient; - private static final String AUTHORIZATION_HEADER_NAME = "Authorization"; - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - } - - @Test - public void tesCamundaPost() throws JsonGenerationException, JsonMappingException, IOException { - - - String responseBody = - "{\"links\":[{\"method\":\"GET\",\"href\":\"http://localhost:9080/engine-rest/process-instance/2047c658-37ae-11e5-9505-7a1020524153\",\"rel\":\"self\"}],\"id\":\"2047c658-37ae-11e5-9505-7a1020524153\",\"definitionId\":\"dummy:10:73298961-37ad-11e5-9505-7a1020524153\",\"businessKey\":null,\"caseInstanceId\":null,\"ended\":true,\"suspended\":false}"; - - HttpResponse mockResponse = createResponse(200, responseBody); - mockHttpClient = Mockito.mock(HttpClient.class); - ArgumentCaptor<HttpPost> httpPostCaptor = ArgumentCaptor.forClass(HttpPost.class); - Mockito.when(mockHttpClient.execute(Mockito.any(HttpPost.class))).thenReturn(mockResponse); - - String reqXML = "<xml>test</xml>"; - String orchestrationURI = "/engine-rest/process-definition/key/dummy/start"; - MockEnvironment environment = new MockEnvironment(); - - environment.setProperty("mso.camundaUR", "yourValue1"); - environment.setProperty("mso.camundaAuth", - "E8E19DD16CC90D2E458E8FF9A884CC0452F8F3EB8E321F96038DE38D5C1B0B02DFAE00B88E2CF6E2A4101AB2C011FC161212EE"); - environment.setProperty("org.onap.so.adapters.network.encryptionKey", "aa3871669d893c7fb8abbcda31b88b4f"); - - - RequestClientFactory reqClientFactory = new RequestClientFactory(); - reqClientFactory.setEnv(environment); - RequestClient requestClient = reqClientFactory.getRequestClient(orchestrationURI); - - requestClient.setClient(mockHttpClient); - HttpResponse response = requestClient.post(reqXML, "reqId", "timeout", "version", null, null); + private RestTemplate restTemplate; + @Mock + private Environment env; - int statusCode = response.getStatusLine().getStatusCode(); - assertEquals(requestClient.getType(), CommonConstants.CAMUNDA); - assertEquals(statusCode, HttpStatus.SC_OK); + @Spy + private ResponseHandler responseHandler; + @Spy + @InjectMocks + private CamundaClient client; - requestClient = reqClientFactory.getRequestClient(orchestrationURI); - requestClient.setClient(mockHttpClient); - response = requestClient.post(null, "reqId", null, null, null, null); - assertEquals(requestClient.getType(), CommonConstants.CAMUNDA); - assertEquals(statusCode, HttpStatus.SC_OK); - verify(mockHttpClient, times(2)).execute(httpPostCaptor.capture()); - assertThat(httpPostCaptor.getValue().getHeaders(AUTHORIZATION_HEADER_NAME)).isNotEmpty(); - Assert.assertEquals("Basic YXBpaEJwbW46Y2FtdW5kYS1SMTUxMiE=", - httpPostCaptor.getValue().getHeaders(AUTHORIZATION_HEADER_NAME)[0].getValue()); - } + @Rule + public ExpectedException thrown = ExpectedException.none(); - private HttpResponse createResponse(int respStatus, String respBody) { - HttpResponse response = - new BasicHttpResponse(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), respStatus, "")); - response.setStatusCode(respStatus); - try { - response.setEntity(new StringEntity(respBody)); - response.setHeader("Content-Type", "application/json"); - } catch (Exception e) { - e.printStackTrace(); - } - return response; + @Before + public void setup() { + when(env.getRequiredProperty("mso.camundaAuth")) + .thenReturn("015E7ACF706C6BBF85F2079378BDD2896E226E09D13DC2784BA309E27D59AB9FAD3A5E039DF0BB8408"); + when(env.getRequiredProperty("mso.msoKey")).thenReturn("07a7159d3bf51a0e53be7a8f89699be7"); + when(env.getRequiredProperty("mso.camundaURL")).thenReturn("http://localhost:8080"); } public String inputStream(String JsonInput) throws IOException { @@ -136,10 +88,37 @@ public class CamundaClientTest { } @Test - public void wrapVIDRequestTest() throws IOException { - CamundaClient testClient = new CamundaClient(); - testClient.setUrl("/mso/async/services/CreateGenericALaCarteServiceInstance"); + public void createBPMNFailureExceptionNoResponseBodyTest() { + HttpServerErrorException e = new HttpServerErrorException(HttpStatus.NOT_FOUND); + BPMNFailureException ex = client.createBPMNFailureException(e); + assertEquals(HttpStatus.NOT_IMPLEMENTED.value(), ex.getHttpResponseCode()); + assertEquals("Request Failed due to BPEL error with HTTP Status = 404 NOT_FOUND", ex.getMessage()); + } + + @Test + public void createBPMNFailureExceptionWithCamundaResponseTest() throws IOException { + HttpClientErrorException e = new HttpClientErrorException(HttpStatus.INTERNAL_SERVER_ERROR, null, + inputStream("/CamundaFailure.json").getBytes(), null); + BPMNFailureException ex = client.createBPMNFailureException(e); + assertEquals(HttpStatus.BAD_GATEWAY.value(), ex.getHttpResponseCode()); + assertEquals( + "Request Failed due to BPEL error with HTTP Status = 500 INTERNAL_SERVER_ERROR <aetgt:WorkflowException xmlns:aetgt=\"http://org.onap/so/workflow/schema/v1\"><aetgt:ErrorMessage>Exception in create execution list 500 </aetgt:ErrorMessage><aetgt:ErrorCode>7000</aetgt:ErrorCode></aetgt:WorkflowException>", + ex.getMessage()); + } + + @Test + public void createBPMNFailureExceptionTest() throws IOException { + String response = "Request failed"; + HttpClientErrorException e = + new HttpClientErrorException(HttpStatus.INTERNAL_SERVER_ERROR, null, response.getBytes(), null); + BPMNFailureException ex = client.createBPMNFailureException(e); + assertEquals(HttpStatus.BAD_GATEWAY.value(), ex.getHttpResponseCode()); + assertEquals("Request Failed due to BPEL error with HTTP Status = 500 INTERNAL_SERVER_ERROR Request failed", + ex.getMessage()); + } + @Test + public void wrapVIDRequestTest() throws IOException { String requestId = "f7ce78bb-423b-11e7-93f8-0050569a796"; boolean isBaseVfModule = true; int recipeTimeout = 10000; @@ -160,50 +139,55 @@ public class CamundaClientTest { boolean aLaCarte = true; String requestUri = "v7/serviceInstances/assign"; String instanceGroupId = "ff305d54-75b4-431b-adb2-eb6b9e5ff000"; + String operationType = "activation"; - String testResult = testClient.wrapVIDRequest(requestId, isBaseVfModule, recipeTimeout, requestAction, + String testResult = client.wrapVIDRequest(requestId, isBaseVfModule, recipeTimeout, requestAction, serviceInstanceId, pnfCorrelationId, vnfId, vfModuleId, volumeGroupId, networkId, configurationId, serviceType, vnfType, vfModuleType, networkType, requestDetails, apiVersion, aLaCarte, requestUri, "", - instanceGroupId, false); + instanceGroupId, false, operationType); String expected = inputStream("/WrappedVIDRequest.json"); JSONAssert.assertEquals(expected, testResult, false); } @Test - public void testPost() throws Exception { - CamundaClient testClient = new CamundaClient(); - String orchestrationURI = "/engine-rest/process-definition/key/dummy/start"; - MockEnvironment environment = new MockEnvironment(); - - environment.setProperty("mso.camundaUR", "yourValue1"); - testClient.setProps(environment); - testClient.setClient(mockHttpClient); - - testClient.setUrl(orchestrationURI); - - String responseBody = - "{\"links\":[{\"method\":\"GET\",\"href\":\"http://localhost:9080/engine-rest/process-instance/2047c658-37ae-11e5-9505-7a1020524153\",\"rel\":\"self\"}],\"id\":\"2047c658-37ae-11e5-9505-7a1020524153\",\"definitionId\":\"dummy:10:73298961-37ad-11e5-9505-7a1020524153\",\"businessKey\":null,\"caseInstanceId\":null,\"ended\":true,\"suspended\":false}"; - assertNull(testClient.post(responseBody)); - + public void getClientConnectionExceptionTest() throws ApiException { + doThrow(ResourceAccessException.class).when(restTemplate).exchange(eq("http://localhost:8080/path"), + eq(HttpMethod.GET), any(HttpEntity.class), eq(String.class)); + thrown.expect(ClientConnectionException.class); + thrown.expectMessage("Client from http://localhost:8080/path failed to connect or respond"); + client.get("/path"); } @Test - public void testPostWithRequestClientParameter() throws Exception { - CamundaClient testClient = new CamundaClient(); - String orchestrationURI = "/engine-rest/process-definition/key/dummy/start"; - HttpResponse mockResponse = createResponse(200, "{}"); - mockHttpClient = Mockito.mock(HttpClient.class); - Mockito.when(mockHttpClient.execute(Mockito.any(HttpPost.class))).thenReturn(mockResponse); - - testClient.setClient(mockHttpClient); - testClient.setUrl(orchestrationURI); - - HttpResponse response = testClient.post(new RequestClientParameter.Builder().build()); - - assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode()); + public void postClientConnectionExceptionTest() throws ApiException, IOException { + String jsonReq = inputStream("/WrappedVIDRequest.json"); + doThrow(ResourceAccessException.class).when(restTemplate).postForEntity(eq("http://localhost:8080/path"), + any(HttpEntity.class), eq(String.class)); + thrown.expect(ClientConnectionException.class); + thrown.expectMessage("Client from http://localhost:8080/path failed to connect or respond"); + client.post(jsonReq, "/path"); + } + @Test + public void getHttpStatusCodeExceptionTest() throws ApiException { + HttpServerErrorException e = new HttpServerErrorException(HttpStatus.NOT_FOUND); + doThrow(e).when(restTemplate).exchange(eq("http://localhost:8080/path"), eq(HttpMethod.GET), + any(HttpEntity.class), eq(String.class)); + thrown.expect(BPMNFailureException.class); + thrown.expectMessage("Request Failed due to BPEL error with HTTP Status = 404 NOT_FOUND"); + client.get("/path"); } + @Test + public void postHttpStatusCodeExceptionTest() throws ApiException, IOException { + HttpServerErrorException e = new HttpServerErrorException(HttpStatus.NOT_FOUND); + String jsonReq = inputStream("/WrappedVIDRequest.json"); + doThrow(e).when(restTemplate).postForEntity(eq("http://localhost:8080/path"), any(HttpEntity.class), + eq(String.class)); + thrown.expect(BPMNFailureException.class); + thrown.expectMessage("Request Failed due to BPEL error with HTTP Status = 404 NOT_FOUND"); + client.post(jsonReq, "/path"); + } } diff --git a/mso-api-handlers/mso-api-handler-common/src/test/java/org/onap/so/apihandler/common/CamundaTaskClientTest.java b/mso-api-handlers/mso-api-handler-common/src/test/java/org/onap/so/apihandler/common/CamundaTaskClientTest.java deleted file mode 100644 index 9e9ab6048e..0000000000 --- a/mso-api-handlers/mso-api-handler-common/src/test/java/org/onap/so/apihandler/common/CamundaTaskClientTest.java +++ /dev/null @@ -1,140 +0,0 @@ -/*- - * ============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.onap.so.apihandler.common; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import org.apache.http.HttpEntity; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.client.methods.HttpRequestBase; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; -import org.springframework.core.env.Environment; - -@RunWith(MockitoJUnitRunner.class) -public class CamundaTaskClientTest { - - @Mock - private Environment env; - private CamundaTaskClient testedObject = new CamundaTaskClient(); - private HttpClient httpClientMock; - private static final String JSON_REQUEST = "{\"value1\": \"aaa\",\"value2\": \"bbb\"}"; - private static final String URL_SCHEMA = "http"; - private static final String HOST = "testhost"; - private static final int PORT = 1234; - private static final String URL_PATH = "/requestMethodSuccessful"; - private static final String URL = URL_SCHEMA + "://" + HOST + ":" + PORT + URL_PATH; - private static final String AUTHORIZATION_HEADER_NAME = "Authorization"; - - @Before - public void init() { - when(env.getProperty(eq(CommonConstants.CAMUNDA_AUTH))).thenReturn( - "E8E19DD16CC90D2E458E8FF9A884CC0452F8F3EB8E321F96038DE38D5C1B0B02DFAE00B88E2CF6E2A4101AB2C011FC161212EE"); - when(env.getProperty(eq(CommonConstants.ENCRYPTION_KEY_PROP))).thenReturn("aa3871669d893c7fb8abbcda31b88b4f"); - testedObject = new CamundaTaskClient(); - httpClientMock = mock(HttpClient.class); - testedObject.setClient(httpClientMock); - testedObject.setUrl(URL); - } - - @Test - public void postMethodSuccessful() throws IOException { - ArgumentCaptor<HttpPost> httpPostCaptor = ArgumentCaptor.forClass(HttpPost.class); - testedObject.post(JSON_REQUEST); - verify(httpClientMock).execute(httpPostCaptor.capture()); - checkUri(httpPostCaptor.getValue()); - assertThat(httpPostCaptor.getValue().getEntity().getContentType().getValue()) - .isEqualTo(CommonConstants.CONTENT_TYPE_JSON); - assertThat(getJsonFromEntity(httpPostCaptor.getValue().getEntity())).isEqualTo(JSON_REQUEST); - } - - @Test - public void postMethodSuccessfulWithCredentials() throws IOException { - ArgumentCaptor<HttpPost> httpPostCaptor = ArgumentCaptor.forClass(HttpPost.class); - testedObject.setProps(env); - testedObject.post(JSON_REQUEST); - verify(httpClientMock).execute(httpPostCaptor.capture()); - assertThat(httpPostCaptor.getValue().getHeaders(AUTHORIZATION_HEADER_NAME)).isNotEmpty(); - Assert.assertEquals("Basic YXBpaEJwbW46Y2FtdW5kYS1SMTUxMiE=", - httpPostCaptor.getValue().getHeaders(AUTHORIZATION_HEADER_NAME)[0].getValue()); - } - - @Test - public void getMethodSuccessful() throws IOException { - ArgumentCaptor<HttpGet> httpGetCaptor = ArgumentCaptor.forClass(HttpGet.class); - testedObject.get(); - verify(httpClientMock).execute(httpGetCaptor.capture()); - checkUri(httpGetCaptor.getValue()); - } - - @Test - public void getMethodSuccessfulWithCredentials() throws IOException { - ArgumentCaptor<HttpGet> httpGetCaptor = ArgumentCaptor.forClass(HttpGet.class); - testedObject.setUrl(URL); - testedObject.setProps(env); - testedObject.get(); - verify(httpClientMock).execute(httpGetCaptor.capture()); - assertThat(httpGetCaptor.getValue().getHeaders(AUTHORIZATION_HEADER_NAME)).isNotEmpty(); - Assert.assertEquals("Basic YXBpaEJwbW46Y2FtdW5kYS1SMTUxMiE=", - httpGetCaptor.getValue().getHeaders(AUTHORIZATION_HEADER_NAME)[0].getValue()); - } - - @Test(expected = UnsupportedOperationException.class) - public void postMethodUnsupported() { - testedObject.post("", "", "", "", "", ""); - } - - @Test(expected = UnsupportedOperationException.class) - public void postMethodUnsupported2() { - testedObject.post(new RequestClientParameter.Builder().build()); - } - - private void checkUri(HttpRequestBase httpRequestBase) { - assertThat(httpRequestBase.getURI().getScheme()).isEqualTo(URL_SCHEMA); - assertThat(httpRequestBase.getURI().getHost()).isEqualTo(HOST); - assertThat(httpRequestBase.getURI().getPort()).isEqualTo(PORT); - assertThat(httpRequestBase.getURI().getPath()).isEqualTo(URL_PATH); - } - - private String getJsonFromEntity(HttpEntity httpEntity) throws IOException { - BufferedReader rd = new BufferedReader(new InputStreamReader(httpEntity.getContent())); - StringBuilder result = new StringBuilder(); - String line; - while ((line = rd.readLine()) != null) { - result.append(line); - } - return result.toString(); - } - -} diff --git a/mso-api-handlers/mso-api-handler-common/src/test/java/org/onap/so/apihandler/common/RequestClientTest.java b/mso-api-handlers/mso-api-handler-common/src/test/java/org/onap/so/apihandler/common/RequestClientTest.java deleted file mode 100644 index 86b12ae8f6..0000000000 --- a/mso-api-handlers/mso-api-handler-common/src/test/java/org/onap/so/apihandler/common/RequestClientTest.java +++ /dev/null @@ -1,60 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP - SO - * ================================================================================ - * Copyright (c) 2019 Samsung. 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.onap.so.apihandler.common; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; - -@RunWith(MockitoJUnitRunner.class) -public class RequestClientTest { - - private static final String ENCRYPTION_KEY = "aa3871669d893c7fb8abbcda31b88b4f"; - - private RequestClient requestClient; - - @Before - public void init() { - requestClient = Mockito.mock(RequestClient.class, Mockito.CALLS_REAL_METHODS); - } - - @Test - public void getEncryptedPropValueWithSuccess() { - - String encryptedValue = requestClient.getEncryptedPropValue( - "E8E19DD16CC90D2E458E8FF9A884CC0452F8F3EB8E321F96038DE38D5C1B0B02DFAE00B88E2CF6E2A4101AB2C011FC161212EE", - "defaultValue", ENCRYPTION_KEY); - - Assert.assertEquals("apihBpmn:camunda-R1512!", encryptedValue); - } - - @Test - public void getDefaultEncryptedPropValue() { - - String encryptedValue = - requestClient.getEncryptedPropValue("012345678901234567890123456789", "defaultValue", ENCRYPTION_KEY); - - Assert.assertEquals("defaultValue", encryptedValue); - } - -} diff --git a/mso-api-handlers/mso-api-handler-common/src/test/java/org/onap/so/apihandler/common/ResponseHandlerTest.java b/mso-api-handlers/mso-api-handler-common/src/test/java/org/onap/so/apihandler/common/ResponseHandlerTest.java index 2095a9117d..e6f7a3663a 100644 --- a/mso-api-handlers/mso-api-handler-common/src/test/java/org/onap/so/apihandler/common/ResponseHandlerTest.java +++ b/mso-api-handlers/mso-api-handler-common/src/test/java/org/onap/so/apihandler/common/ResponseHandlerTest.java @@ -23,122 +23,42 @@ package org.onap.so.apihandler.common; -import static org.hamcrest.Matchers.hasProperty; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.startsWith; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import org.apache.http.HttpResponse; -import org.apache.http.HttpStatus; -import org.apache.http.ProtocolVersion; -import org.apache.http.entity.StringEntity; -import org.apache.http.message.BasicHttpResponse; -import org.apache.http.message.BasicStatusLine; +import java.io.IOException; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import org.onap.so.apihandlerinfra.exceptions.ApiException; -import org.onap.so.apihandlerinfra.exceptions.ValidateException; - -/** - * This class implements test methods of CamundaResoponseHandler. - * - * - */ +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Spy; +import org.mockito.junit.MockitoJUnitRunner; +import org.onap.so.apihandlerinfra.exceptions.BPMNFailureException; +import org.springframework.http.ResponseEntity; + +@RunWith(MockitoJUnitRunner.class) public class ResponseHandlerTest { + @Spy + @InjectMocks + private ResponseHandler responseHandler; + @Rule public ExpectedException thrown = ExpectedException.none(); @Test - public void tesParseCamundaResponse() throws ApiException { - // String body - // ="{\"links\":[{\"method\":\"GET\",\"href\":\"http://localhost:9080/engine-rest/process-instance/2047c658-37ae-11e5-9505-7a1020524153\",\"rel\":\"self\"}],\"id\":\"2047c658-37ae-11e5-9505-7a1020524153\",\"definitionId\":\"dummy:10:73298961-37ad-11e5-9505-7a1020524153\",\"businessKey\":null,\"caseInstanceId\":null,\"ended\":true,\"suspended\":false}"; - - String body = "{ \"response\": \"<xml>xml</xml>\"," + "\"messageCode\": 200," - + "\"message\": \"Successfully started the process\"}"; - - HttpResponse response = createResponse(200, body, "application/json"); - - ResponseHandler respHandler = new ResponseHandler(response, 1); - - int status = respHandler.getStatus(); - assertEquals(status, HttpStatus.SC_ACCEPTED); - assertEquals(respHandler.getResponse().getMessage(), "Successfully started the process"); - - } - - @Test - public void tesParseCamundaResponseForCamundaTaskType() throws ApiException { - String body = "{ \"response\": \"<xml>xml</xml>\"," + "\"messageCode\": 200," - + "\"message\": \"Successfully started the process\"}"; - - HttpResponse response = createResponse(200, body, "application/json"); - - ResponseHandler respHandler = new ResponseHandler(response, 2); - - int status = respHandler.getStatus(); - assertEquals(status, HttpStatus.SC_ACCEPTED); - assertEquals(respHandler.getResponseBody(), body); - - } - - @Test - public void tesParseBpelResponse() throws ApiException { - String body = "<test:service-response xmlns:test=\"http://org.onap/so/test\">" - + "<test:request-id>req5</test:request-id>" + "<test:request-action>test</test:request-action>" - + "<test:source>test</test:source>" + "<test:ack-final-indicator>n</test:ack-final-indicator>" - + "</test:service-response>"; - - HttpResponse response = createResponse(200, body, "text/xml"); - - ResponseHandler respHandler = new ResponseHandler(response, 0); - - int status = respHandler.getStatus(); - assertEquals(status, HttpStatus.SC_ACCEPTED); - assertTrue(respHandler.getResponseBody() != null); - } - - @Test - public void tesMappingErrorResponse() throws ApiException { - thrown.expect(ValidateException.class); - thrown.expectMessage(startsWith("Cannot parse Camunda Response")); - thrown.expect(hasProperty("httpResponseCode", is(HttpStatus.SC_BAD_REQUEST))); - thrown.expect(hasProperty("messageID", is(ErrorNumbers.SVC_BAD_PARAMETER))); - - HttpResponse response = createResponse(HttpStatus.SC_NOT_FOUND, "<html>error</html>", "text/html"); - ResponseHandler respHandler = new ResponseHandler(response, 1); - - int status = respHandler.getStatus(); - - assertEquals(HttpStatus.SC_NOT_IMPLEMENTED, status); - + public void acceptedResponseTest() throws IOException, BPMNFailureException { + ResponseEntity<String> camundaResponse = ResponseEntity.noContent().build(); + thrown.expect(BPMNFailureException.class); + thrown.expectMessage("Request Failed due to BPEL error with HTTP Status = 204"); + responseHandler.acceptedResponse(camundaResponse); } @Test - public void tesGenricErrorResponse() throws ApiException { - - String body = "{ \"response\": \"<xml>xml</xml>\"," + "\"messageCode\": 500," - + "\"message\": \"Something went wrong\"}"; - - HttpResponse response = createResponse(500, body, "application/json"); - ResponseHandler respHandler = new ResponseHandler(response, 1); - int status = respHandler.getStatus(); - assertEquals(status, HttpStatus.SC_BAD_GATEWAY); - assertEquals(respHandler.getResponse().getMessage(), "Something went wrong"); - } + public void acceptedOrNoContentResponseTest() throws IOException, BPMNFailureException { + ResponseEntity<String> camundaResponse = ResponseEntity.badRequest().build(); + thrown.expect(BPMNFailureException.class); + thrown.expectMessage("Request Failed due to BPEL error with HTTP Status = 400"); + responseHandler.acceptedOrNoContentResponse(camundaResponse); - private HttpResponse createResponse(int respStatus, String respBody, String contentType) { - HttpResponse response = - new BasicHttpResponse(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), respStatus, "")); - response.setStatusCode(respStatus); - try { - response.setEntity(new StringEntity(respBody)); - response.setHeader("Content-Type", contentType); - } catch (Exception e) { - e.printStackTrace(); - } - return response; } } diff --git a/mso-api-handlers/mso-api-handler-common/src/test/resources/CamundaClientTest/CamundaFailure.json b/mso-api-handlers/mso-api-handler-common/src/test/resources/CamundaClientTest/CamundaFailure.json new file mode 100644 index 0000000000..2d9e3ddef8 --- /dev/null +++ b/mso-api-handlers/mso-api-handler-common/src/test/resources/CamundaClientTest/CamundaFailure.json @@ -0,0 +1,7 @@ +{ + "response":"<aetgt:WorkflowException xmlns:aetgt=\"http://org.onap/so/workflow/schema/v1\"><aetgt:ErrorMessage>Exception in create execution list 500 </aetgt:ErrorMessage><aetgt:ErrorCode>7000</aetgt:ErrorCode></aetgt:WorkflowException>", + "message":"Fail", + "processInstanceID":"4b33ca85-5860-11e8-ae53-0a580ae94342", + "variables":null, + "messageCode":500 +}
\ No newline at end of file diff --git a/mso-api-handlers/mso-api-handler-common/src/test/resources/CamundaClientTest/WrappedVIDRequest.json b/mso-api-handlers/mso-api-handler-common/src/test/resources/CamundaClientTest/WrappedVIDRequest.json index 3353f8c7ce..6eebb5f703 100644 --- a/mso-api-handlers/mso-api-handler-common/src/test/resources/CamundaClientTest/WrappedVIDRequest.json +++ b/mso-api-handlers/mso-api-handler-common/src/test/resources/CamundaClientTest/WrappedVIDRequest.json @@ -95,6 +95,10 @@ "generateIdsOnly": { "value": false, "type": "Boolean" + }, + "operationType": { + "value": "activation", + "type": "String" } } } |