summaryrefslogtreecommitdiffstats
path: root/controlloop/common/model-impl/so
diff options
context:
space:
mode:
authorPiyush Garg <piyush.garg1@amdocs.com>2018-08-29 15:40:53 +0530
committerPiyush Garg <piyush.garg1@amdocs.com>2018-08-31 20:48:21 +0000
commit0b6288e180c1d33bba88b3df5e03442c57058db9 (patch)
tree072c9c553f9ac7a4874ce97101be5c6e211d547e /controlloop/common/model-impl/so
parent8279af376b435e1d7dd118a1955c5681edf3b847 (diff)
Added support for VF Module Delete recipe
Enhanced SOActorServiceProvider to support VF Module Delete Recipe. Added SOOperationType enum to map the policy recipe with the SO API that we want to call for a recipe. vf module id from non-base vf module is used to construct the delete request url and same will be deleted. Updated SOManager so that it sends request to SO based on the SOOperationType enum value. Enhanced RESTManager to add support for the http delete using new class HttpDeleteWithBody (to allow pass the payload to the SO delete VF module API). Change-Id: I15b678ed9ebc85dfa7cb62bbf23e41c0fe6e4c69 Issue-ID: POLICY-1079 Signed-off-by: Piyush Garg <piyush.garg1@amdocs.com>
Diffstat (limited to 'controlloop/common/model-impl/so')
-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
6 files changed, 327 insertions, 161 deletions
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());