summaryrefslogtreecommitdiffstats
path: root/controlloop/common/model-impl/so
diff options
context:
space:
mode:
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());