summaryrefslogtreecommitdiffstats
path: root/controlloop/common/model-impl
diff options
context:
space:
mode:
authorPamela Dragosh <pdragosh@research.att.com>2018-09-06 00:27:03 +0000
committerGerrit Code Review <gerrit@onap.org>2018-09-06 00:27:03 +0000
commit1edf5cb1278f8c920599196e5722c1237face1da (patch)
tree4c191155b8a5c5c246fb5322ff080c6e3d6c5250 /controlloop/common/model-impl
parent6e3c351251ae1e578b3f28019de41fe03a69f1e0 (diff)
parent0b6288e180c1d33bba88b3df5e03442c57058db9 (diff)
Merge "Added support for VF Module Delete recipe"
Diffstat (limited to 'controlloop/common/model-impl')
-rw-r--r--controlloop/common/model-impl/aai/src/main/java/org/onap/policy/aai/AaiManager.java14
-rw-r--r--controlloop/common/model-impl/rest/src/main/java/org/onap/policy/rest/HttpDeleteWithBody.java52
-rw-r--r--controlloop/common/model-impl/rest/src/main/java/org/onap/policy/rest/RESTManager.java196
-rw-r--r--controlloop/common/model-impl/rest/src/test/java/org/onap/policy/rest/HttpDeleteWithBodyTest.java36
-rwxr-xr-xcontrolloop/common/model-impl/rest/src/test/java/org/onap/policy/rest/TestGet.java18
-rwxr-xr-xcontrolloop/common/model-impl/rest/src/test/java/org/onap/policy/rest/TestPair.java8
-rw-r--r--controlloop/common/model-impl/so/src/main/java/org/onap/policy/so/SOManager.java89
-rw-r--r--controlloop/common/model-impl/so/src/main/java/org/onap/policy/so/SORequest.java9
-rw-r--r--controlloop/common/model-impl/so/src/main/java/org/onap/policy/so/SoOperationType.java40
-rw-r--r--controlloop/common/model-impl/so/src/test/java/org/onap/policy/so/TestSoDummyServer.java191
-rw-r--r--controlloop/common/model-impl/so/src/test/java/org/onap/policy/so/TestSoManager.java156
-rwxr-xr-xcontrolloop/common/model-impl/so/src/test/java/org/onap/policy/so/TestSoRequest.java3
-rw-r--r--controlloop/common/model-impl/vfc/src/main/java/org/onap/policy/vfc/VFCManager.java12
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);