Bump policy/models to 2.3.1-SNAPSHOT
[policy/models.git] / models-interactions / model-impl / vfc / src / main / java / org / onap / policy / vfc / VfcManager.java
index 695b1b1..64d60ba 100644 (file)
@@ -1,7 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  * Copyright (C) 2017-2019 Intel Corp. All rights reserved.
- * Modifications Copyright (C) 2019 Nordix Foundation.
+ * Modifications Copyright (C) 2019-2020 Nordix Foundation.
  * Modifications Copyright (C) 2018-2019 AT&T Corporation. All rights reserved.
  * Modifications Copyright (C) 2019 Samsung Electronics Co., Ltd.
  * ================================================================================
 package org.onap.policy.vfc;
 
 import com.google.gson.JsonSyntaxException;
-
 import java.util.HashMap;
 import java.util.Map;
-
-import org.drools.core.WorkingMemory;
+import org.apache.commons.lang3.tuple.Pair;
 import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
 import org.onap.policy.common.endpoints.utils.NetLoggerUtil;
 import org.onap.policy.common.endpoints.utils.NetLoggerUtil.EventType;
-import org.onap.policy.drools.system.PolicyEngine;
 import org.onap.policy.rest.RestManager;
-import org.onap.policy.rest.RestManager.Pair;
 import org.onap.policy.vfc.util.Serialization;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -43,31 +39,42 @@ public final class VfcManager implements Runnable {
     private String username;
     private String password;
     private VfcRequest vfcRequest;
-    private WorkingMemory workingMem;
+    private VfcCallback callback;
     private static final Logger logger = LoggerFactory.getLogger(VfcManager.class);
 
     // The REST manager used for processing REST calls for this VFC manager
     private RestManager restManager;
 
+    @FunctionalInterface
+    public interface VfcCallback {
+        void onResponse(VfcResponse responseError);
+    }
+
     /**
      * Constructor.
      *
-     * @param wm Drools working memory
+     * @param cb Callback method to call when response
      * @param request request
+     * @param url URL to VFC component
+     * @param user username
+     * @param pwd password
      */
-    public VfcManager(WorkingMemory wm, VfcRequest request) {
-        if (wm == null || request == null) {
+    public VfcManager(VfcCallback cb, VfcRequest request, String url, String user, String pwd) {
+        if (cb == null || request == null) {
+            throw new IllegalArgumentException(
+                    "the parameters \"cb\" and \"request\" on the VfcManager constructor may not be null");
+        }
+        if (url == null) {
             throw new IllegalArgumentException(
-                    "the parameters \"wm\" and \"request\" on the VfcManager constructor may not be null");
+                    "the \"url\" parameter on the VfcManager constructor may not be null");
         }
-        workingMem = wm;
+        callback = cb;
         vfcRequest = request;
+        vfcUrlBase = url;
+        username = user;
+        password = pwd;
 
         restManager = new RestManager();
-
-        // use getPEManagerEnvProperty() for required properties; others are optional
-        setVfcParams(getPeManagerEnvProperty("vfc.url"), PolicyEngine.manager.getEnvironmentProperty("vfc.username"),
-                PolicyEngine.manager.getEnvironmentProperty("vfc.password"));
     }
 
     /**
@@ -101,58 +108,22 @@ public final class VfcManager implements Runnable {
             httpDetails = restManager.post(vfcUrl, username, password, headers, "application/json", vfcRequestJson);
         } catch (Exception e) {
             logger.error(e.getMessage(), e);
-            workingMem.insert(responseError);
+            this.callback.onResponse(responseError);
             return;
         }
 
         if (httpDetails == null) {
-            workingMem.insert(responseError);
+            this.callback.onResponse(responseError);
             return;
         }
 
-        if (httpDetails.first != 202) {
+        if (httpDetails.getLeft() != 202) {
             logger.warn("VFC Heal Restcall failed");
             return;
         }
 
         try {
-            VfcResponse response = Serialization.gsonPretty.fromJson(httpDetails.second, VfcResponse.class);
-            NetLoggerUtil.log(EventType.IN, CommInfrastructure.REST, vfcUrl, httpDetails.second);
-            String body = Serialization.gsonPretty.toJson(response);
-            logger.debug("Response to VFC Heal post:");
-            logger.debug(body);
-
-            String jobId = response.getJobId();
-            int attemptsLeft = 20;
-
-            String urlGet = vfcUrlBase + "/jobs/" + jobId;
-            VfcResponse responseGet = null;
-
-            while (attemptsLeft-- > 0) {
-                NetLoggerUtil.getNetworkLogger().info("[OUT|{}|{}|]", "VFC", urlGet);
-                Pair<Integer, String> httpDetailsGet = restManager.get(urlGet, username, password, headers);
-                responseGet = Serialization.gsonPretty.fromJson(httpDetailsGet.second, VfcResponse.class);
-                NetLoggerUtil.log(EventType.IN, CommInfrastructure.REST, vfcUrl, 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.first == 200
-                        && ("finished".equalsIgnoreCase(responseStatus) || "error".equalsIgnoreCase(responseStatus))) {
-                    logger.debug("VFC Heal Status {}", responseGet.getResponseDescriptor().getStatus());
-                    workingMem.insert(responseGet);
-                    break;
-                }
-                Thread.sleep(20000);
-            }
-            if ((attemptsLeft <= 0) && (responseGet != null) && (responseGet.getResponseDescriptor() != null)
-                    && (responseGet.getResponseDescriptor().getStatus() != null)
-                    && (!responseGet.getResponseDescriptor().getStatus().isEmpty())) {
-                logger.debug("VFC timeout. Status: ({})", responseGet.getResponseDescriptor().getStatus());
-                workingMem.insert(responseGet);
-            }
+            handleVfcResponse(headers, httpDetails, vfcUrl);
         } catch (JsonSyntaxException e) {
             logger.error("Failed to deserialize into VfcResponse {}", e.getLocalizedMessage(), e);
         } catch (InterruptedException e) {
@@ -164,28 +135,62 @@ public final class VfcManager implements Runnable {
     }
 
     /**
-     * Protected setter for rest manager to allow mocked rest manager to be used for testing.
+     * Handle a VFC response message.
      *
-     * @param restManager the test REST manager
+     * @param headers the headers in the response
+     * @param httpDetails the HTTP details in the response
+     * @param vfcUrl the response URL
+     * @throws InterruptedException on errors in the response
      */
-    protected void setRestManager(final RestManager restManager) {
-        this.restManager = restManager;
+    private void handleVfcResponse(Map<String, String> headers, Pair<Integer, String> httpDetails, String vfcUrl)
+            throws InterruptedException {
+        VfcResponse response = Serialization.gsonPretty.fromJson(httpDetails.getRight(), VfcResponse.class);
+        NetLoggerUtil.log(EventType.IN, CommInfrastructure.REST, vfcUrl, httpDetails.getRight());
+        String body = Serialization.gsonPretty.toJson(response);
+        logger.debug("Response to VFC Heal post:");
+        logger.debug(body);
+
+        String jobId = response.getJobId();
+        int attemptsLeft = 20;
+
+        String urlGet = vfcUrlBase + "/jobs/" + jobId;
+        VfcResponse responseGet = null;
+
+        while (attemptsLeft-- > 0) {
+            NetLoggerUtil.getNetworkLogger().info("[OUT|{}|{}|]", "VFC", urlGet);
+            Pair<Integer, String> httpDetailsGet = restManager.get(urlGet, username, password, headers);
+            responseGet = Serialization.gsonPretty.fromJson(httpDetailsGet.getRight(), VfcResponse.class);
+            NetLoggerUtil.log(EventType.IN, CommInfrastructure.REST, vfcUrl, httpDetailsGet.getRight());
+            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.getLeft() == 200
+                    && ("finished".equalsIgnoreCase(responseStatus) || "error".equalsIgnoreCase(responseStatus))) {
+                logger.debug("VFC Heal Status {}", responseGet.getResponseDescriptor().getStatus());
+                this.callback.onResponse(responseGet);
+                return;
+            }
+            Thread.sleep(20000);
+        }
+        boolean isTimeout = (attemptsLeft <= 0) && (responseGet != null)
+                        && (responseGet.getResponseDescriptor() != null);
+        isTimeout = isTimeout && (responseGet.getResponseDescriptor().getStatus() != null)
+                        && (!responseGet.getResponseDescriptor().getStatus().isEmpty());
+        if (isTimeout) {
+            logger.debug("VFC timeout. Status: ({})", responseGet.getResponseDescriptor().getStatus());
+            this.callback.onResponse(responseGet);
+        }
     }
 
     /**
-     * This method reads and validates environmental properties coming from the policy engine. Null
-     * properties cause an {@link IllegalArgumentException} runtime exception to be thrown
+     * Protected setter for rest manager to allow mocked rest manager to be used for testing.
      *
-     * @param string the name of the parameter to retrieve
-     * @return the property value
+     * @param restManager the test REST manager
      */
-
-    private String getPeManagerEnvProperty(String enginePropertyName) {
-        String enginePropertyValue = PolicyEngine.manager.getEnvironmentProperty(enginePropertyName);
-        if (enginePropertyValue == null) {
-            throw new IllegalArgumentException("The value of policy engine manager environment property \""
-                    + enginePropertyName + "\" may not be null");
-        }
-        return enginePropertyValue;
+    protected void setRestManager(final RestManager restManager) {
+        this.restManager = restManager;
     }
 }