diff options
author | Pamela Dragosh <pdragosh@research.att.com> | 2018-09-06 00:27:03 +0000 |
---|---|---|
committer | Gerrit Code Review <gerrit@onap.org> | 2018-09-06 00:27:03 +0000 |
commit | 1edf5cb1278f8c920599196e5722c1237face1da (patch) | |
tree | 4c191155b8a5c5c246fb5322ff080c6e3d6c5250 /controlloop/common/model-impl | |
parent | 6e3c351251ae1e578b3f28019de41fe03a69f1e0 (diff) | |
parent | 0b6288e180c1d33bba88b3df5e03442c57058db9 (diff) |
Merge "Added support for VF Module Delete recipe"
Diffstat (limited to 'controlloop/common/model-impl')
13 files changed, 547 insertions, 277 deletions
diff --git a/controlloop/common/model-impl/aai/src/main/java/org/onap/policy/aai/AaiManager.java b/controlloop/common/model-impl/aai/src/main/java/org/onap/policy/aai/AaiManager.java index 56f79d378..b54981d22 100644 --- a/controlloop/common/model-impl/aai/src/main/java/org/onap/policy/aai/AaiManager.java +++ b/controlloop/common/model-impl/aai/src/main/java/org/onap/policy/aai/AaiManager.java @@ -88,13 +88,13 @@ public final class AaiManager { return null; } - int httpResponseCode = httpDetails.a; + int httpResponseCode = httpDetails.first; logger.info(url); logger.info("{}", httpResponseCode); - logger.info(httpDetails.b); + logger.info(httpDetails.second); - if (httpDetails.b != null) { + if (httpDetails.second != null) { return composeResponse(httpDetails, url, AaiNqResponse.class); } return null; @@ -174,11 +174,11 @@ public final class AaiManager { return null; } - int httpResponseCode = httpDetailsGet.a; + int httpResponseCode = httpDetailsGet.first; logger.info(urlGet); logger.info("{}", httpResponseCode); - logger.info(httpDetailsGet.b); + logger.info(httpDetailsGet.second); if (httpResponseCode == 200) { T responseGet = composeResponse(httpDetailsGet, urlGet, classOfResponse); @@ -226,8 +226,8 @@ public final class AaiManager { private <T> T composeResponse(final Pair<Integer, String> httpDetails, final String url, final Class<T> classOfResponse) { try { - T response = Serialization.gsonPretty.fromJson(httpDetails.b, classOfResponse); - netLogger.info("[IN|{}|{}|]{}{}", "AAI", url, LINE_SEPARATOR, httpDetails.b); + T response = Serialization.gsonPretty.fromJson(httpDetails.second, classOfResponse); + netLogger.info("[IN|{}|{}|]{}{}", "AAI", url, LINE_SEPARATOR, httpDetails.second); return response; } catch (JsonSyntaxException e) { logger.error("postQuery threw: ", e); diff --git a/controlloop/common/model-impl/rest/src/main/java/org/onap/policy/rest/HttpDeleteWithBody.java b/controlloop/common/model-impl/rest/src/main/java/org/onap/policy/rest/HttpDeleteWithBody.java new file mode 100644 index 000000000..262872262 --- /dev/null +++ b/controlloop/common/model-impl/rest/src/main/java/org/onap/policy/rest/HttpDeleteWithBody.java @@ -0,0 +1,52 @@ +/* + * ============LICENSE_START======================================================= + * rest + * ================================================================================ + * Copyright (C) 2018 Amdocs. 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.policy.rest; + +import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; + +import java.net.URI; + + +/** + * Allows for HTTP DELETE requests to contain a body, which the HttpDelete + * class does not support. + */ +public class HttpDeleteWithBody extends HttpEntityEnclosingRequestBase { + public static final String METHOD_NAME = "DELETE"; + + public String getMethod() { + return METHOD_NAME; + } + + public HttpDeleteWithBody(final String uri) { + super(); + setURI(URI.create(uri)); + } + + public HttpDeleteWithBody(final URI uri) { + super(); + setURI(uri); + } + + public HttpDeleteWithBody() { + super(); + } +} diff --git a/controlloop/common/model-impl/rest/src/main/java/org/onap/policy/rest/RESTManager.java b/controlloop/common/model-impl/rest/src/main/java/org/onap/policy/rest/RESTManager.java index 39e0d8a7f..a7e373b5f 100644 --- a/controlloop/common/model-impl/rest/src/main/java/org/onap/policy/rest/RESTManager.java +++ b/controlloop/common/model-impl/rest/src/main/java/org/onap/policy/rest/RESTManager.java @@ -7,9 +7,9 @@ * 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. @@ -20,15 +20,16 @@ package org.onap.policy.rest; -import java.io.IOException; import java.nio.charset.Charset; import java.util.Map; import java.util.Map.Entry; import javax.xml.bind.DatatypeConverter; + import org.apache.http.HttpHeaders; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; @@ -42,126 +43,141 @@ public class RESTManager { private static final Logger logger = LoggerFactory.getLogger(RESTManager.class); public class Pair<A, B> { - public final A a; - public final B b; + public final A first; + public final B second; - public Pair(A a, B b) { - this.a = a; - this.b = b; + public Pair(A first, B second) { + this.first = first; + this.second = second; } } /** * Perform REST Post. - * - * @param url the url - * @param username the user name - * @param password the password - * @param headers any headers + * + * @param url the url + * @param username the user name + * @param password the password + * @param headers any headers * @param contentType what the content type is - * @param body body to send + * @param body body to send * @return the response status code and the body */ public Pair<Integer, String> post(String url, String username, String password, - Map<String, String> headers, String contentType, String body) { - - String authHeader = makeAuthHeader(username, password); - - logger.debug("HTTP REQUEST: {} -> {} {} -> {}", url, username, - ((password != null) ? password.length() : "-"), contentType); - if (headers != null) { - logger.debug("Headers: "); - headers.forEach((name, value) -> logger.debug("{} -> {}", name, value)); + Map<String, String> headers, String contentType, String body) { + HttpPost post = new HttpPost(url); + addHeaders(post, username, password, headers); + post.addHeader("Content-Type", contentType); + try { + StringEntity input = new StringEntity(body); + input.setContentType(contentType); + post.setEntity(input); + } catch (Exception e) { + logger.error("post threw: ", e); + return null; } - logger.debug(body); + return sendRequest(post); + } - try (CloseableHttpClient client = - HttpClientBuilder - .create() - .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) - .build()) { - - HttpPost post = new HttpPost(url); - if (headers != null) { - for (Entry<String, String> entry : headers.entrySet()) { - post.addHeader(entry.getKey(), headers.get(entry.getKey())); - } - } - post.addHeader("Content-Type", contentType); - if (authHeader != null) { - post.setHeader(HttpHeaders.AUTHORIZATION, authHeader); + /** + * Do a REST get. + * + * @param url URL + * @param username user name + * @param password password + * @param headers any headers to add + * @return a Pair for the response status and the body + */ + public Pair<Integer, String> get(String url, String username, String password, + Map<String, String> headers) { + HttpGet get = new HttpGet(url); + addHeaders(get, username, password, headers); + return sendRequest(get); + } + + /** + * Perform REST Delete. + * + * @param url the url + * @param username the user name + * @param password the password + * @param headers any headers + * @param contentType what the content type is + * @param body body (optional) to send + * @return the response status code and the body + */ + public Pair<Integer, String> delete(String url, String username, String password, Map<String, String> headers, + String contentType, String body) { + HttpDeleteWithBody delete = new HttpDeleteWithBody(url); + addHeaders(delete, username, password, headers); + delete.addHeader("Content-Type", contentType); + if (body != null && !body.isEmpty()) { + try { + StringEntity input = new StringEntity(body); + input.setContentType(contentType); + delete.setEntity(input); + } catch (Exception e) { + logger.error("delete threw: ", e); + return null; } + } + return sendRequest(delete); + } - StringEntity input = new StringEntity(body); - input.setContentType(contentType); - post.setEntity(input); + /** + * Send REST request. + * + * @param request http request to send + * @return the response status code and the body + */ + private Pair<Integer, String> sendRequest(HttpRequestBase request) { + if (logger.isDebugEnabled()) { + logger.debug("***** sendRequest to url {}:", request.getURI()); + } - HttpResponse response = client.execute(post); + try (CloseableHttpClient client = + HttpClientBuilder + .create() + .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) + .build()) { + HttpResponse response = client.execute(request); if (response != null) { String returnBody = EntityUtils.toString(response.getEntity(), "UTF-8"); - logger.debug("HTTP POST Response Status Code: {}", + logger.debug("HTTP Response Status Code: {}", response.getStatusLine().getStatusCode()); - logger.debug("HTTP POST Response Body:"); + logger.debug("HTTP Response Body:"); logger.debug(returnBody); return new Pair<>(response.getStatusLine().getStatusCode(), returnBody); - } - else { - logger.error("Response from {} is null", url); + } else { + logger.error("Response from {} is null", request.getURI()); return null; } - } - catch (Exception e) { - logger.error("Failed to POST to {}", url, e); + } catch (Exception e) { + logger.error("Request failed to {}", request.getURI(), e); return null; } } /** - * Do a REST get. - * - * @param url URL - * @param username user name - * @param password password - * @param headers any headers to add - * @return a Pair for the response status and the body + * Add header to the request. + * + * @param request http request to send + * @param username the user name + * @param password the password + * @param headers any headers */ - public Pair<Integer, String> get(String url, String username, String password, - Map<String, String> headers) { - + private void addHeaders(HttpRequestBase request, String username, String password, Map<String, + String> headers) { String authHeader = makeAuthHeader(username, password); - - try (CloseableHttpClient client = - HttpClientBuilder - .create() - .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) - .build()) { - - HttpGet get = new HttpGet(url); - if (headers != null) { - for (Entry<String, String> entry : headers.entrySet()) { - get.addHeader(entry.getKey(), headers.get(entry.getKey())); - } - } - if (authHeader != null) { - get.setHeader(HttpHeaders.AUTHORIZATION, authHeader); + if (headers != null) { + for (Entry<String, String> entry : headers.entrySet()) { + request.addHeader(entry.getKey(), headers.get(entry.getKey())); } - - HttpResponse response = client.execute(get); - - String returnBody = EntityUtils.toString(response.getEntity(), "UTF-8"); - - logger.debug("HTTP GET Response Status Code: {}", - response.getStatusLine().getStatusCode()); - logger.debug("HTTP GET Response Body:"); - logger.debug(returnBody); - - return new Pair<>(response.getStatusLine().getStatusCode(), returnBody); } - catch (IOException e) { - logger.error("Failed to GET to {}", url, e); - return null; + if (authHeader != null) { + request.setHeader(HttpHeaders.AUTHORIZATION, authHeader); } } diff --git a/controlloop/common/model-impl/rest/src/test/java/org/onap/policy/rest/HttpDeleteWithBodyTest.java b/controlloop/common/model-impl/rest/src/test/java/org/onap/policy/rest/HttpDeleteWithBodyTest.java new file mode 100644 index 000000000..0cb5f3aef --- /dev/null +++ b/controlloop/common/model-impl/rest/src/test/java/org/onap/policy/rest/HttpDeleteWithBodyTest.java @@ -0,0 +1,36 @@ +/* + * ============LICENSE_START======================================================= + * rest + * ================================================================================ + * Copyright (C) 2018 Amdocs. 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.policy.rest; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class HttpDeleteWithBodyTest { + + @Test + public void getMethod() { + String url = "http://www.example.org"; + HttpDeleteWithBody deleteWithBody = new HttpDeleteWithBody(url); + assertEquals("DELETE", deleteWithBody.getMethod()); + assertEquals(url, deleteWithBody.getURI().toString()); + } +}
\ No newline at end of file diff --git a/controlloop/common/model-impl/rest/src/test/java/org/onap/policy/rest/TestGet.java b/controlloop/common/model-impl/rest/src/test/java/org/onap/policy/rest/TestGet.java index a8301810c..7e881df51 100755 --- a/controlloop/common/model-impl/rest/src/test/java/org/onap/policy/rest/TestGet.java +++ b/controlloop/common/model-impl/rest/src/test/java/org/onap/policy/rest/TestGet.java @@ -39,9 +39,9 @@ public class TestGet { RESTManager mgr = new RESTManager(); Pair<Integer, String> result = mgr.get("http://www.example.org", null, null, null); - assertEquals((Integer)200, result.a); - assertTrue(result.b != null); - assertTrue(result.b.length() > 0); + assertEquals((Integer)200, result.first); + assertTrue(result.second != null); + assertTrue(result.second.length() > 0); } @Test @@ -49,9 +49,9 @@ public class TestGet { RESTManager mgr = new RESTManager(); Pair<Integer, String> result = mgr.get("http://www.example.org", "", null, null); - assertEquals((Integer)200, result.a); - assertTrue(result.b != null); - assertTrue(result.b.length() > 0); + assertEquals((Integer)200, result.first); + assertTrue(result.second != null); + assertTrue(result.second.length() > 0); } @Test @@ -59,8 +59,8 @@ public class TestGet { RESTManager mgr = new RESTManager(); Pair<Integer, String> result = mgr.get("http://www.example.org", "user", null, null); - assertEquals((Integer)200, result.a); - assertTrue(result.b != null); - assertTrue(result.b.length() > 0); + assertEquals((Integer)200, result.first); + assertTrue(result.second != null); + assertTrue(result.second.length() > 0); } }
\ No newline at end of file diff --git a/controlloop/common/model-impl/rest/src/test/java/org/onap/policy/rest/TestPair.java b/controlloop/common/model-impl/rest/src/test/java/org/onap/policy/rest/TestPair.java index aea5a7387..28e9934d1 100755 --- a/controlloop/common/model-impl/rest/src/test/java/org/onap/policy/rest/TestPair.java +++ b/controlloop/common/model-impl/rest/src/test/java/org/onap/policy/rest/TestPair.java @@ -32,11 +32,11 @@ public class TestPair { RESTManager mgr = new RESTManager(); Pair<Integer, Integer> pii = mgr.new Pair<>(1, 2); - assertEquals((Integer) 1, (Integer) pii.a); - assertEquals((Integer) 2, (Integer) pii.b); + assertEquals((Integer) 1, (Integer) pii.first); + assertEquals((Integer) 2, (Integer) pii.second); Pair<Integer, String> pis = mgr.new Pair<>(1, "test"); - assertEquals((Integer) 1, (Integer) pis.a); - assertEquals("test", pis.b); + assertEquals((Integer) 1, (Integer) pis.first); + assertEquals("test", pis.second); } } diff --git a/controlloop/common/model-impl/so/src/main/java/org/onap/policy/so/SOManager.java b/controlloop/common/model-impl/so/src/main/java/org/onap/policy/so/SOManager.java index a3f2be30b..5acd973ef 100644 --- a/controlloop/common/model-impl/so/src/main/java/org/onap/policy/so/SOManager.java +++ b/controlloop/common/model-impl/so/src/main/java/org/onap/policy/so/SOManager.java @@ -98,19 +98,35 @@ public final class SOManager { } /** + * Works just like {@link SOManager#asyncSORestCall(String, WorkingMemory, String, String, String, SORequest) + * except the vfModuleInstanceId is always null + * + * @see SOManager#asyncSORestCall(String, WorkingMemory, String, String, String, SORequest) + */ + public Future<SOResponse> asyncSORestCall(final String requestID, final WorkingMemory wm, + final String serviceInstanceId, final String vnfInstanceId, + final SORequest request) { + return asyncSORestCall(requestID, wm, serviceInstanceId, vnfInstanceId, null, request); + } + + /** * This method makes an asynchronous Rest call to MSO and inserts the response into * Drools working memory. - * - * @param requestID request id - * @param wm the Drools working memory - * @param serviceInstanceId service instance id - * @param vnfInstanceId vnf instance id - * @param request the SO request + * + * @param requestID + * @param wm the Drools working memory + * @param serviceInstanceId service instance id to construct the request url + * @param vnfInstanceId vnf instance id to construct the request url + * @param vfModuleInstanceId vfModule instance id to construct the request url (required in case of delete vf + * module) + * @param request the SO request * @return a concurrent Future for the thread that handles the request */ public Future<SOResponse> asyncSORestCall(final String requestID, final WorkingMemory wm, - final String serviceInstanceId, final String vnfInstanceId, final SORequest request) { - return executors.submit(new AsyncSORestCallThread(requestID, wm, serviceInstanceId, vnfInstanceId, request)); + final String serviceInstanceId, final String vnfInstanceId, final String vfModuleInstanceId, final + SORequest request) { + return executors.submit(new AsyncSORestCallThread(requestID, wm, serviceInstanceId, vnfInstanceId, + vfModuleInstanceId, request)); } /** @@ -121,23 +137,26 @@ public final class SOManager { final WorkingMemory wm; final String serviceInstanceId; final String vnfInstanceId; + final String vfModuleInstanceId; final SORequest request; /** * Constructor, sets the context of the request. * - * @param requestID The request ID - * @param wm reference to the Drools working memory - * @param serviceInstanceId the service instance in SO to use - * @param vnfInstanceId the VNF instance that is the subject of the request - * @param request the request itself + * @param requestID The request ID + * @param wm reference to the Drools working memory + * @param serviceInstanceId the service instance in SO to use + * @param vnfInstanceId the VNF instance that is the subject of the request + * @param vfModuleInstanceId the vf module instance id (not null in case of delete vf module request) + * @param request the request itself */ private AsyncSORestCallThread(final String requestID, final WorkingMemory wm, final String serviceInstanceId, - final String vnfInstanceId, final SORequest request) { + final String vnfInstanceId, final String vfModuleInstanceId, final SORequest request) { this.requestID = requestID; this.wm = wm; this.serviceInstanceId = serviceInstanceId; this.vnfInstanceId = vnfInstanceId; + this.vfModuleInstanceId = vfModuleInstanceId; this.request = request; } @@ -150,16 +169,26 @@ public final class SOManager { String username = PolicyEngine.manager.getEnvironmentProperty("so.username"); String password = PolicyEngine.manager.getEnvironmentProperty("so.password"); - // The URL of the request we will POST - String url = urlBase + "/serviceInstantiation/v7/" + serviceInstanceId + "/vnfs/" + vnfInstanceId - + "/vfModules/scaleOut"; - // Create a JSON representation of the request String soJson = new GsonBuilder().disableHtmlEscaping().setPrettyPrinting().create().toJson(request); - - netLogger.info("[OUT|{}|{}|]{}{}", "SO", url, LINE_SEPARATOR, soJson); - Pair<Integer, String> httpResponse = - restManager.post(url, username, password, createSimpleHeaders(), MEDIA_TYPE, soJson); + String url = null; + Pair<Integer, String> httpResponse = null; + + if (request.getOperationType() != null && request.getOperationType() + .equals(SoOperationType.SCALE_OUT)) { + url = urlBase + "/serviceInstantiation/v7/" + serviceInstanceId + "/vnfs/" + vnfInstanceId + + "/vfModules/scaleOut"; + netLogger.info("[OUT|{}|{}|]{}{}", "SO", url, LINE_SEPARATOR, soJson); + httpResponse = restManager.post(url, username, password, createSimpleHeaders(), MEDIA_TYPE, soJson); + } else if (request.getOperationType() != null && request.getOperationType() + .equals(SoOperationType.DELETE_VF_MODULE)) { + url = urlBase + "/serviceInstances/v7/" + serviceInstanceId + "/vnfs/" + vnfInstanceId + + "/vfModules/" + vfModuleInstanceId; + netLogger.info("[OUT|{}|{}|]{}{}", "SO", url, LINE_SEPARATOR, soJson); + httpResponse = restManager.delete(url, username, password, createSimpleHeaders(), MEDIA_TYPE, soJson); + } else { + return null; + } // Process the response from SO SOResponse response = waitForSOOperationCompletion(urlBase, username, password, url, httpResponse); @@ -241,7 +270,7 @@ public final class SOManager { * Parse the response message from SO into a SOResponse object. * * @param requestURL The URL of the HTTP request - * @param httpDetails The HTTP message returned from SO + * @param httpResponse The HTTP message returned from SO * @return The parsed response */ private SOResponse processSOResponse(final String requestURL, final Pair<Integer, String> httpResponse) { @@ -250,7 +279,7 @@ public final class SOManager { // A null httpDetails indicates a HTTP problem, a valid response from SO must be // either 200 // or 202 - if (!httpResultIsNullFree(httpResponse) || (httpResponse.a != 200 && httpResponse.a != 202)) { + if (!httpResultIsNullFree(httpResponse) || (httpResponse.first != 200 && httpResponse.first != 202)) { logger.error("Invalid HTTP response received from SO"); response.setHttpResponseCode(SO_RESPONSE_ERROR); return response; @@ -258,7 +287,7 @@ public final class SOManager { // Parse the JSON of the response into our POJO try { - response = Serialization.gsonPretty.fromJson(httpResponse.b, SOResponse.class); + response = Serialization.gsonPretty.fromJson(httpResponse.second, SOResponse.class); } catch (JsonSyntaxException e) { logger.error("Failed to deserialize HTTP response into SOResponse: ", e); response.setHttpResponseCode(SO_RESPONSE_ERROR); @@ -267,14 +296,14 @@ public final class SOManager { // Set the HTTP response code of the response if needed if (response.getHttpResponseCode() == 0) { - response.setHttpResponseCode(httpResponse.a); + response.setHttpResponseCode(httpResponse.first); } - netLogger.info("[IN|{}|{}|]{}{}", "SO", requestURL, LINE_SEPARATOR, httpResponse.b); + netLogger.info("[IN|{}|{}|]{}{}", "SO", requestURL, LINE_SEPARATOR, httpResponse.second); if (logger.isDebugEnabled()) { logger.debug("***** Response to SO Request to URL {}:", requestURL); - logger.debug(httpResponse.b); + logger.debug(httpResponse.second); } return response; @@ -308,7 +337,7 @@ public final class SOManager { * @return true if the request for the response is finished */ private boolean isRequestStateFinished(final Pair<Integer, String> latestHTTPDetails, final SOResponse response) { - if (latestHTTPDetails != null && 200 == latestHTTPDetails.a && isRequestStateDefined(response)) { + if (latestHTTPDetails != null && 200 == latestHTTPDetails.first && isRequestStateDefined(response)) { String requestState = response.getRequest().getRequestStatus().getRequestState(); return "COMPLETE".equalsIgnoreCase(requestState) || "FAILED".equalsIgnoreCase(requestState); } else { @@ -323,7 +352,7 @@ public final class SOManager { * @return true if no nulls are found */ private boolean httpResultIsNullFree(Pair<Integer, String> httpOperationResult) { - return httpOperationResult != null && httpOperationResult.a != null && httpOperationResult.b != null; + return httpOperationResult != null && httpOperationResult.first != null && httpOperationResult.second != null; } /** diff --git a/controlloop/common/model-impl/so/src/main/java/org/onap/policy/so/SORequest.java b/controlloop/common/model-impl/so/src/main/java/org/onap/policy/so/SORequest.java index 4a2f405e7..8bcbacf73 100644 --- a/controlloop/common/model-impl/so/src/main/java/org/onap/policy/so/SORequest.java +++ b/controlloop/common/model-impl/so/src/main/java/org/onap/policy/so/SORequest.java @@ -51,6 +51,8 @@ public class SORequest implements Serializable { @SerializedName("requestStatus") private SORequestStatus requestStatus; + private transient SoOperationType operationType; + public SORequest() { // required by author } @@ -111,4 +113,11 @@ public class SORequest implements Serializable { this.startTime = startTime; } + public SoOperationType getOperationType() { + return operationType; + } + + public void setOperationType(SoOperationType operationType) { + this.operationType = operationType; + } } diff --git a/controlloop/common/model-impl/so/src/main/java/org/onap/policy/so/SoOperationType.java b/controlloop/common/model-impl/so/src/main/java/org/onap/policy/so/SoOperationType.java new file mode 100644 index 000000000..7619e3a84 --- /dev/null +++ b/controlloop/common/model-impl/so/src/main/java/org/onap/policy/so/SoOperationType.java @@ -0,0 +1,40 @@ +/*- + * ============LICENSE_START======================================================= + * so + * ================================================================================ + * Copyright (C) 2018 Amdocs. 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.policy.so; + +/** + * Enumeration of SO Operations type that can be performed by a policy + */ +public enum SoOperationType { + SCALE_OUT("Create Vf Module"), + DELETE_VF_MODULE("Delete Vf Module"); + + private String operationType; + + SoOperationType(String operationType) { + this.operationType = operationType; + } + + @Override + public String toString() { + return this.operationType; + } +} diff --git a/controlloop/common/model-impl/so/src/test/java/org/onap/policy/so/TestSoDummyServer.java b/controlloop/common/model-impl/so/src/test/java/org/onap/policy/so/TestSoDummyServer.java index 5eb0a01ee..0d719e50d 100644 --- a/controlloop/common/model-impl/so/src/test/java/org/onap/policy/so/TestSoDummyServer.java +++ b/controlloop/common/model-impl/so/src/test/java/org/onap/policy/so/TestSoDummyServer.java @@ -25,6 +25,7 @@ package org.onap.policy.so; import com.google.gson.Gson; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; @@ -38,6 +39,7 @@ public class TestSoDummyServer { private static int putMessagesReceived = 0; private static int statMessagesReceived = 0; private static int getMessagesReceived = 0; + private static int deleteMessagesReceived = 0; private static Map<String, SOResponse> ongoingRequestMap = new ConcurrentHashMap<>(); @@ -51,7 +53,9 @@ public class TestSoDummyServer { public Response serviceGetStats() { statMessagesReceived++; return Response.status(200).entity("{\"GET\": " + getMessagesReceived + ",\"STAT\": " + statMessagesReceived - + ",\"POST\": " + postMessagesReceived + ",\"PUT\": " + putMessagesReceived + "}").build(); + + ",\"POST\": " + postMessagesReceived + ",\"PUT\": " + putMessagesReceived + + ",\"DELETE\": " + deleteMessagesReceived + "}").build(); + } /** @@ -77,98 +81,78 @@ public class TestSoDummyServer { @Path("/serviceInstantiation/v7") public Response servicePostRequest(final String jsonString) { postMessagesReceived++; + return buildResponse(jsonString); + } - if (jsonString == null) { - return Response.status(400).build(); - } - - SORequest request = null; - try { - request = new Gson().fromJson(jsonString, SORequest.class); - } catch (Exception e) { - return Response.status(400).build(); - } - - if (request == null) { - return Response.status(400).build(); - } - - if (request.getRequestType() == null) { - return Response.status(400).build(); - } - - if ("ReturnBadJson".equals(request.getRequestType())) { - return Response.status(200) - .entity("{\"GET\": , " + getMessagesReceived + ",\"STAT\": " + statMessagesReceived - + ",\"POST\": , " + postMessagesReceived + ",\"PUT\": " - + putMessagesReceived + "}") - .build(); - } - - SOResponse response = new SOResponse(); - response.setRequest(request); - response.setRequestReferences(new SORequestReferences()); - response.getRequestReferences().setRequestId(request.getRequestId().toString()); - - if ("ReturnCompleted".equals(request.getRequestType())) { - response.getRequest().getRequestStatus().setRequestState("COMPLETE"); - response.setHttpResponseCode(200); - String responseString = new Gson().toJson(response, SOResponse.class); - return Response.status(response.getHttpResponseCode()).entity(responseString).build(); - } - - if ("ReturnFailed".equals(request.getRequestType())) { - response.getRequest().getRequestStatus().setRequestState("FAILED"); - response.setHttpResponseCode(200); - String responseString = new Gson().toJson(response, SOResponse.class); - return Response.status(response.getHttpResponseCode()).entity(responseString).build(); - } - - if ("ReturnOnging202".equals(request.getRequestType())) { - ongoingRequestMap.put(request.getRequestId().toString(), response); + /** + * Post. + * + * @param serviceInstanceId service instance id + * @param vnfInstanceId vnf instance id + * @param jsonString json body + * @return http response + */ + @POST + @Path("/serviceInstantiation/v7/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/scaleOut") + public Response servicePostRequestVfModules(@PathParam("serviceInstanceId") final String serviceInstanceId, + @PathParam("vnfInstanceId") final String vnfInstanceId, final String jsonString) { + postMessagesReceived++; + return buildResponse(jsonString); + } - response.getRequest().getRequestStatus().setRequestState("ONGOING"); - response.setHttpResponseCode(202); - String responseString = new Gson().toJson(response, SOResponse.class); - return Response.status(response.getHttpResponseCode()).entity(responseString).build(); - } + /** + * Get instance ID. + * + * @param nsInstanceId node instance id + * @return http response + */ + @GET + @Path("/orchestrationRequests/v5/{nsInstanceId}") + public Response soRequestStatus(@PathParam("nsInstanceId") final String nsInstanceId) { - if ("ReturnOnging200".equals(request.getRequestType())) { - ongoingRequestMap.put(request.getRequestId().toString(), response); + SOResponse response = ongoingRequestMap.get(nsInstanceId); - response.getRequest().getRequestStatus().setRequestState("ONGOING"); - response.setHttpResponseCode(200); + int iterationsLeft = Integer.valueOf(response.getRequest().getRequestScope()); + if (--iterationsLeft > 0) { + response.getRequest().setRequestScope(new Integer(iterationsLeft).toString()); String responseString = new Gson().toJson(response, SOResponse.class); return Response.status(response.getHttpResponseCode()).entity(responseString).build(); } + ongoingRequestMap.remove(nsInstanceId); - if ("ReturnBadAfterWait".equals(request.getRequestType())) { - ongoingRequestMap.put(request.getRequestId().toString(), response); - - response.getRequest().getRequestStatus().setRequestState("ONGOING"); - response.setHttpResponseCode(200); - String responseString = new Gson().toJson(response, SOResponse.class); - return Response.status(response.getHttpResponseCode()).entity(responseString).build(); + if ("ReturnBadAfterWait".equals(response.getRequest().getRequestType())) { + return Response.status(400).build(); } - return null; + response.getRequest().getRequestStatus().setRequestState("COMPLETE"); + response.getRequest().setRequestScope("0"); + response.setHttpResponseCode(200); + String responseString = new Gson().toJson(response, SOResponse.class); + return Response.status(response.getHttpResponseCode()).entity(responseString).build(); } /** - * Post. - * + * Delete. + * * @param serviceInstanceId service instance id * @param vnfInstanceId vnf instance id + * @param vfModuleInstanceId vf module instance id * @param jsonString json body * @return http response */ - @POST - @Path("/serviceInstantiation/v7/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/scaleOut") - public Response servicePostRequestVfModules(@PathParam("serviceInstanceId") final String serviceInstanceId, - @PathParam("vnfInstanceId") final String vnfInstanceId, final String jsonString) { - postMessagesReceived++; + @DELETE + @Path("/serviceInstances/v7/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfModuleInstanceId}") + public Response serviceDeleteRequestVfModules( + @PathParam("serviceInstanceId") final String serviceInstanceId, + @PathParam("vnfInstanceId") final String vnfInstanceId, + @PathParam("vfModuleInstanceId") final String vfModuleInstanceId, + final String jsonString) { + deleteMessagesReceived++; + return buildResponse(jsonString); + } + private Response buildResponse(String jsonString) { if (jsonString == null) { return Response.status(400).build(); } @@ -190,10 +174,9 @@ public class TestSoDummyServer { if ("ReturnBadJson".equals(request.getRequestType())) { return Response.status(200) - .entity("{\"GET\": , " + getMessagesReceived + ",\"STAT\": " + statMessagesReceived - + ",\"POST\": , " + postMessagesReceived + ",\"PUT\": " - + putMessagesReceived + "}") - .build(); + .entity("{\"GET\": , " + getMessagesReceived + ",\"STAT\": " + statMessagesReceived + + ",\"POST\":" + " , " + postMessagesReceived + ",\"PUT\": " + putMessagesReceived + + ",\"DELETE\": " + deleteMessagesReceived + "}").build(); } SOResponse response = new SOResponse(); @@ -205,14 +188,18 @@ public class TestSoDummyServer { response.getRequest().getRequestStatus().setRequestState("COMPLETE"); response.setHttpResponseCode(200); String responseString = new Gson().toJson(response, SOResponse.class); - return Response.status(response.getHttpResponseCode()).entity(responseString).build(); + return Response.status(response.getHttpResponseCode()) + .entity(responseString) + .build(); } if ("ReturnFailed".equals(request.getRequestType())) { response.getRequest().getRequestStatus().setRequestState("FAILED"); response.setHttpResponseCode(200); String responseString = new Gson().toJson(response, SOResponse.class); - return Response.status(response.getHttpResponseCode()).entity(responseString).build(); + return Response.status(response.getHttpResponseCode()) + .entity(responseString) + .build(); } if ("ReturnOnging202".equals(request.getRequestType())) { @@ -221,7 +208,9 @@ public class TestSoDummyServer { response.getRequest().getRequestStatus().setRequestState("ONGOING"); response.setHttpResponseCode(202); String responseString = new Gson().toJson(response, SOResponse.class); - return Response.status(response.getHttpResponseCode()).entity(responseString).build(); + return Response.status(response.getHttpResponseCode()) + .entity(responseString) + .build(); } if ("ReturnOnging200".equals(request.getRequestType())) { @@ -230,51 +219,21 @@ public class TestSoDummyServer { response.getRequest().getRequestStatus().setRequestState("ONGOING"); response.setHttpResponseCode(200); String responseString = new Gson().toJson(response, SOResponse.class); - return Response.status(response.getHttpResponseCode()).entity(responseString).build(); + return Response.status(response.getHttpResponseCode()) + .entity(responseString) + .build(); } - if ("ReturnBadAfterWait".equals(request.getRequestType())) { ongoingRequestMap.put(request.getRequestId().toString(), response); response.getRequest().getRequestStatus().setRequestState("ONGOING"); response.setHttpResponseCode(200); String responseString = new Gson().toJson(response, SOResponse.class); - return Response.status(response.getHttpResponseCode()).entity(responseString).build(); + return Response.status(response.getHttpResponseCode()) + .entity(responseString) + .build(); } - return null; } - - /** - * Get instance ID. - * - * @param nsInstanceId node instance id - * @return http response - */ - @GET - @Path("/orchestrationRequests/v5/{nsInstanceId}") - public Response soRequestStatus(@PathParam("nsInstanceId") final String nsInstanceId) { - - SOResponse response = ongoingRequestMap.get(nsInstanceId); - - int iterationsLeft = Integer.valueOf(response.getRequest().getRequestScope()); - if (--iterationsLeft > 0) { - response.getRequest().setRequestScope(new Integer(iterationsLeft).toString()); - String responseString = new Gson().toJson(response, SOResponse.class); - return Response.status(response.getHttpResponseCode()).entity(responseString).build(); - } - - ongoingRequestMap.remove(nsInstanceId); - - if ("ReturnBadAfterWait".equals(response.getRequest().getRequestType())) { - return Response.status(400).build(); - } - - response.getRequest().getRequestStatus().setRequestState("COMPLETE"); - response.getRequest().setRequestScope("0"); - response.setHttpResponseCode(200); - String responseString = new Gson().toJson(response, SOResponse.class); - return Response.status(response.getHttpResponseCode()).entity(responseString).build(); - } } diff --git a/controlloop/common/model-impl/so/src/test/java/org/onap/policy/so/TestSoManager.java b/controlloop/common/model-impl/so/src/test/java/org/onap/policy/so/TestSoManager.java index 38bfcd398..20cb54fca 100644 --- a/controlloop/common/model-impl/so/src/test/java/org/onap/policy/so/TestSoManager.java +++ b/controlloop/common/model-impl/so/src/test/java/org/onap/policy/so/TestSoManager.java @@ -51,10 +51,18 @@ public class TestSoManager { private static final String BASE_SO_URI = BASE_URI + "/SO"; private static HttpServer server; + /** + * Set up test class. + */ @BeforeClass - public static void setUp() { + public static void setUp() throws IOException { final ResourceConfig rc = new ResourceConfig(TestSoDummyServer.class); - server = GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc); + //Grizzly by default doesn't allow payload for HTTP methods (ex: DELETE), for which HTTP spec doesn't + // explicitly state that. + //allow it before starting the server + server = GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc, false); + server.getServerConfiguration().setAllowPayloadForUndefinedHttpMethods(true); + server.start(); } @AfterClass @@ -69,7 +77,8 @@ public class TestSoManager { CloseableHttpResponse response = httpclient.execute(httpGet); String returnBody = EntityUtils.toString(response.getEntity(), "UTF-8"); - assertTrue(returnBody.matches("^\\{\"GET\": [0-9]*,\"STAT\": [0-9]*,\"POST\": [0-9]*,\"PUT\": [0-9]*\\}$")); + assertTrue(returnBody.matches("^\\{\"GET\": [0-9]*,\"STAT\": [0-9]*,\"POST\": [0-9]*,\"PUT\": [0-9]*," + + "\"DELETE\": [0-9]*\\}$")); } @Test @@ -78,8 +87,8 @@ public class TestSoManager { assertNotNull(manager); manager.setRestGetTimeout(100); - SOResponse response = - manager.createModuleInstance("http:/localhost:99999999", BASE_SO_URI, "sean", "citizen", null); + SOResponse response = manager.createModuleInstance("http:/localhost:99999999", BASE_SO_URI, "sean", + "citizen", null); assertNull(response); response = manager.createModuleInstance(BASE_SO_URI + "/serviceInstantiation/v7", BASE_SO_URI, "sean", @@ -158,9 +167,11 @@ public class TestSoManager { WorkingMemory wm = new DummyWorkingMemory(); + SORequest soRequest = new SORequest(); + soRequest.setOperationType(SoOperationType.SCALE_OUT); PolicyEngine.manager.setEnvironmentProperty("so.url", "http:/localhost:99999999"); Future<SOResponse> asyncRestCallFuture = manager.asyncSORestCall(UUID.randomUUID().toString(), wm, - UUID.randomUUID().toString(), UUID.randomUUID().toString(), null); + UUID.randomUUID().toString(), UUID.randomUUID().toString(), soRequest); try { SOResponse response = asyncRestCallFuture.get(); assertEquals(999, response.getHttpResponseCode()); @@ -170,7 +181,7 @@ public class TestSoManager { PolicyEngine.manager.setEnvironmentProperty("so.url", BASE_SO_URI); asyncRestCallFuture = manager.asyncSORestCall(UUID.randomUUID().toString(), wm, UUID.randomUUID().toString(), - UUID.randomUUID().toString(), null); + UUID.randomUUID().toString(), soRequest); try { SOResponse response = asyncRestCallFuture.get(); assertEquals(999, response.getHttpResponseCode()); @@ -178,8 +189,122 @@ public class TestSoManager { fail("test should not throw an exception"); } + SORequest request = new SORequest(); + request.setRequestId(UUID.randomUUID()); + request.setRequestScope("Test"); + request.setRequestType("ReturnBadJson"); + request.setStartTime("2018-03-23 16:31"); + request.setRequestStatus(new SORequestStatus()); + request.getRequestStatus().setRequestState("ONGOING"); + request.setOperationType(SoOperationType.SCALE_OUT); + + asyncRestCallFuture = manager.asyncSORestCall(UUID.randomUUID().toString(), wm, UUID.randomUUID().toString(), + UUID.randomUUID().toString(), request); + try { + SOResponse response = asyncRestCallFuture.get(); + assertEquals(999, response.getHttpResponseCode()); + } catch (Exception e) { + fail("test should not throw an exception"); + } + + request.setRequestType("ReturnCompleted"); + + asyncRestCallFuture = manager.asyncSORestCall(UUID.randomUUID().toString(), wm, UUID.randomUUID().toString(), + UUID.randomUUID().toString(), request); + try { + SOResponse response = asyncRestCallFuture.get(); + assertEquals("COMPLETE", response.getRequest().getRequestStatus().getRequestState()); + } catch (Exception e) { + fail("test should not throw an exception"); + } + + request.setRequestType("ReturnFailed"); + asyncRestCallFuture = manager.asyncSORestCall(UUID.randomUUID().toString(), wm, UUID.randomUUID().toString(), + UUID.randomUUID().toString(), request); + try { + SOResponse response = asyncRestCallFuture.get(); + assertEquals("FAILED", response.getRequest().getRequestStatus().getRequestState()); + } catch (Exception e) { + fail("test should not throw an exception"); + } + + // Use scope to set the number of iterations we'll wait for + + request.setRequestType("ReturnOnging200"); + request.setRequestScope(new Integer(10).toString()); + asyncRestCallFuture = manager.asyncSORestCall(UUID.randomUUID().toString(), wm, UUID.randomUUID().toString(), + UUID.randomUUID().toString(), request); + try { + SOResponse response = asyncRestCallFuture.get(); + assertNotNull(response.getRequest()); + assertEquals("COMPLETE", response.getRequest().getRequestStatus().getRequestState()); + } catch (Exception e) { + fail("test should not throw an exception"); + } + + request.setRequestType("ReturnOnging202"); + request.setRequestScope(new Integer(20).toString()); + asyncRestCallFuture = manager.asyncSORestCall(UUID.randomUUID().toString(), wm, UUID.randomUUID().toString(), + UUID.randomUUID().toString(), request); + try { + SOResponse response = asyncRestCallFuture.get(); + assertNotNull(response.getRequest()); + assertEquals("COMPLETE", response.getRequest().getRequestStatus().getRequestState()); + } catch (Exception e) { + fail("test should not throw an exception"); + } + + // Test timeout after 20 attempts for a response + request.setRequestType("ReturnOnging202"); + request.setRequestScope(new Integer(21).toString()); + asyncRestCallFuture = manager.asyncSORestCall(UUID.randomUUID().toString(), wm, UUID.randomUUID().toString(), + UUID.randomUUID().toString(), request); + try { + SOResponse response = asyncRestCallFuture.get(); + assertEquals(999, response.getHttpResponseCode()); + } catch (Exception e) { + fail("test should not throw an exception"); + } + + // Test bad response after 3 attempts for a response + request.setRequestType("ReturnBadAfterWait"); + request.setRequestScope(new Integer(3).toString()); + asyncRestCallFuture = manager.asyncSORestCall(UUID.randomUUID().toString(), wm, UUID.randomUUID().toString(), + UUID.randomUUID().toString(), request); + try { + SOResponse response = asyncRestCallFuture.get(); + assertEquals(999, response.getHttpResponseCode()); + } catch (Exception e) { + fail("test should not throw an exception"); + } + } + + @Test + public void testVfModuleDeletion() { + SOManager manager = new SOManager(); + assertNotNull(manager); + manager.setRestGetTimeout(100); + + PolicyEngine.manager.setEnvironmentProperty("so.username", "sean"); + PolicyEngine.manager.setEnvironmentProperty("so.password", "citizen"); + + WorkingMemory wm = new DummyWorkingMemory(); + + SORequest soRequest = new SORequest(); + soRequest.setOperationType(SoOperationType.DELETE_VF_MODULE); + PolicyEngine.manager.setEnvironmentProperty("so.url", "http:/localhost:99999999"); + Future<SOResponse> asyncRestCallFuture = manager.asyncSORestCall(UUID.randomUUID().toString(), wm, + UUID.randomUUID().toString(), UUID.randomUUID().toString(), UUID.randomUUID().toString(), soRequest); + try { + SOResponse response = asyncRestCallFuture.get(); + assertEquals(999, response.getHttpResponseCode()); + } catch (Exception e) { + fail("test should not throw an exception"); + } + + PolicyEngine.manager.setEnvironmentProperty("so.url", BASE_SO_URI); asyncRestCallFuture = manager.asyncSORestCall(UUID.randomUUID().toString(), wm, UUID.randomUUID().toString(), - UUID.randomUUID().toString(), new SORequest()); + UUID.randomUUID().toString(), UUID.randomUUID().toString(), soRequest); try { SOResponse response = asyncRestCallFuture.get(); assertEquals(999, response.getHttpResponseCode()); @@ -194,9 +319,10 @@ public class TestSoManager { request.setStartTime("2018-03-23 16:31"); request.setRequestStatus(new SORequestStatus()); request.getRequestStatus().setRequestState("ONGOING"); + request.setOperationType(SoOperationType.DELETE_VF_MODULE); asyncRestCallFuture = manager.asyncSORestCall(UUID.randomUUID().toString(), wm, UUID.randomUUID().toString(), - UUID.randomUUID().toString(), request); + UUID.randomUUID().toString(), UUID.randomUUID().toString(), request); try { SOResponse response = asyncRestCallFuture.get(); assertEquals(999, response.getHttpResponseCode()); @@ -207,7 +333,7 @@ public class TestSoManager { request.setRequestType("ReturnCompleted"); asyncRestCallFuture = manager.asyncSORestCall(UUID.randomUUID().toString(), wm, UUID.randomUUID().toString(), - UUID.randomUUID().toString(), request); + UUID.randomUUID().toString(), UUID.randomUUID().toString(), request); try { SOResponse response = asyncRestCallFuture.get(); assertEquals("COMPLETE", response.getRequest().getRequestStatus().getRequestState()); @@ -217,7 +343,7 @@ public class TestSoManager { request.setRequestType("ReturnFailed"); asyncRestCallFuture = manager.asyncSORestCall(UUID.randomUUID().toString(), wm, UUID.randomUUID().toString(), - UUID.randomUUID().toString(), request); + UUID.randomUUID().toString(), UUID.randomUUID().toString(), request); try { SOResponse response = asyncRestCallFuture.get(); assertEquals("FAILED", response.getRequest().getRequestStatus().getRequestState()); @@ -230,7 +356,7 @@ public class TestSoManager { request.setRequestType("ReturnOnging200"); request.setRequestScope(new Integer(10).toString()); asyncRestCallFuture = manager.asyncSORestCall(UUID.randomUUID().toString(), wm, UUID.randomUUID().toString(), - UUID.randomUUID().toString(), request); + UUID.randomUUID().toString(), UUID.randomUUID().toString(), request); try { SOResponse response = asyncRestCallFuture.get(); assertNotNull(response.getRequest()); @@ -242,7 +368,7 @@ public class TestSoManager { request.setRequestType("ReturnOnging202"); request.setRequestScope(new Integer(20).toString()); asyncRestCallFuture = manager.asyncSORestCall(UUID.randomUUID().toString(), wm, UUID.randomUUID().toString(), - UUID.randomUUID().toString(), request); + UUID.randomUUID().toString(), UUID.randomUUID().toString(), request); try { SOResponse response = asyncRestCallFuture.get(); assertNotNull(response.getRequest()); @@ -255,7 +381,7 @@ public class TestSoManager { request.setRequestType("ReturnOnging202"); request.setRequestScope(new Integer(21).toString()); asyncRestCallFuture = manager.asyncSORestCall(UUID.randomUUID().toString(), wm, UUID.randomUUID().toString(), - UUID.randomUUID().toString(), request); + UUID.randomUUID().toString(), UUID.randomUUID().toString(), request); try { SOResponse response = asyncRestCallFuture.get(); assertEquals(999, response.getHttpResponseCode()); @@ -267,7 +393,7 @@ public class TestSoManager { request.setRequestType("ReturnBadAfterWait"); request.setRequestScope(new Integer(3).toString()); asyncRestCallFuture = manager.asyncSORestCall(UUID.randomUUID().toString(), wm, UUID.randomUUID().toString(), - UUID.randomUUID().toString(), request); + UUID.randomUUID().toString(), UUID.randomUUID().toString(), request); try { SOResponse response = asyncRestCallFuture.get(); assertEquals(999, response.getHttpResponseCode()); diff --git a/controlloop/common/model-impl/so/src/test/java/org/onap/policy/so/TestSoRequest.java b/controlloop/common/model-impl/so/src/test/java/org/onap/policy/so/TestSoRequest.java index f58254184..2f9bf68bb 100755 --- a/controlloop/common/model-impl/so/src/test/java/org/onap/policy/so/TestSoRequest.java +++ b/controlloop/common/model-impl/so/src/test/java/org/onap/policy/so/TestSoRequest.java @@ -65,6 +65,9 @@ public class TestSoRequest { obj.setRequestType("requestType"); assertEquals("requestType", obj.getRequestType()); + obj.setOperationType(SoOperationType.DELETE_VF_MODULE); + assertEquals(SoOperationType.DELETE_VF_MODULE, obj.getOperationType()); + LocalDateTime startTime = LocalDateTime.now(); obj.setStartTime(startTime.toString()); assertEquals(startTime.toString(), obj.getStartTime()); diff --git a/controlloop/common/model-impl/vfc/src/main/java/org/onap/policy/vfc/VFCManager.java b/controlloop/common/model-impl/vfc/src/main/java/org/onap/policy/vfc/VFCManager.java index 1a8d603b5..d84d0403f 100644 --- a/controlloop/common/model-impl/vfc/src/main/java/org/onap/policy/vfc/VFCManager.java +++ b/controlloop/common/model-impl/vfc/src/main/java/org/onap/policy/vfc/VFCManager.java @@ -108,14 +108,14 @@ public final class VFCManager implements Runnable { return; } - if (httpDetails.a != 202) { + if (httpDetails.first != 202) { logger.warn("VFC Heal Restcall failed"); return; } try { - VFCResponse response = Serialization.gsonPretty.fromJson(httpDetails.b, VFCResponse.class); - netLogger.info("[IN|{}|{}|]{}{}", "VFC", vfcUrl, SYSTEM_LS, httpDetails.b); + VFCResponse response = Serialization.gsonPretty.fromJson(httpDetails.second, VFCResponse.class); + netLogger.info("[IN|{}|{}|]{}{}", "VFC", vfcUrl, SYSTEM_LS, httpDetails.second); String body = Serialization.gsonPretty.toJson(response); logger.debug("Response to VFC Heal post:"); logger.debug(body); @@ -129,15 +129,15 @@ public final class VFCManager implements Runnable { while (attemptsLeft-- > 0) { netLogger.info("[OUT|{}|{}|]", "VFC", urlGet); Pair<Integer, String> httpDetailsGet = restManager.get(urlGet, username, password, headers); - responseGet = Serialization.gsonPretty.fromJson(httpDetailsGet.b, VFCResponse.class); - netLogger.info("[IN|{}|{}|]{}{}", "VFC", urlGet, SYSTEM_LS, httpDetailsGet.b); + responseGet = Serialization.gsonPretty.fromJson(httpDetailsGet.second, VFCResponse.class); + netLogger.info("[IN|{}|{}|]{}{}", "VFC", urlGet, SYSTEM_LS, httpDetailsGet.second); responseGet.setRequestId(vfcRequest.getRequestId().toString()); body = Serialization.gsonPretty.toJson(responseGet); logger.debug("Response to VFC Heal get:"); logger.debug(body); String responseStatus = responseGet.getResponseDescriptor().getStatus(); - if (httpDetailsGet.a == 200 + if (httpDetailsGet.first == 200 && ("finished".equalsIgnoreCase(responseStatus) || "error".equalsIgnoreCase(responseStatus))) { logger.debug("VFC Heal Status {}", responseGet.getResponseDescriptor().getStatus()); workingMem.insert(responseGet); |