Merge "Add template and tosca model entities and repositories"
authorSébastien Determe <sebastien.determe@intl.att.com>
Thu, 16 Jan 2020 13:38:31 +0000 (13:38 +0000)
committerGerrit Code Review <gerrit@onap.org>
Thu, 16 Jan 2020 13:38:31 +0000 (13:38 +0000)
19 files changed:
src/main/java/org/onap/clamp/loop/CsarInstaller.java
src/main/java/org/onap/clamp/loop/LoopController.java
src/main/java/org/onap/clamp/loop/LoopService.java
src/main/java/org/onap/clamp/loop/deploy/DcaeDeployParameters.java [moved from src/main/java/org/onap/clamp/loop/deploy/DeployParameters.java with 75% similarity]
src/main/java/org/onap/clamp/policy/operational/OperationalPolicy.java
src/main/resources/clds/camel/rest/clamp-api-v2.xml
src/main/resources/clds/camel/routes/loop-flows.xml
src/main/resources/clds/camel/routes/policy-flows.xml
src/test/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponseCacheTest.java
src/test/java/org/onap/clamp/loop/deploy/BlueprintInputParametersTest.java [moved from src/test/java/org/onap/clamp/loop/deploy/DeployParametersTest.java with 94% similarity]
src/test/resources/http-cache/third_party_proxy.py
ui-react/src/LoopUI.js
ui-react/src/api/LoopCache.js
ui-react/src/api/LoopCache.test.js
ui-react/src/api/LoopCache_mokeLoopJsonCache.json
ui-react/src/api/LoopService.js
ui-react/src/components/dialogs/Loop/DeployLoopModal.js
ui-react/src/components/dialogs/OperationalPolicy/OperationalPolicyModal.js
ui-react/src/components/dialogs/OperationalPolicy/OperationalPolicyModal.test.js

index 371f88e..16351b8 100644 (file)
@@ -31,7 +31,6 @@ import java.io.IOException;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Map.Entry;
 
 import org.json.simple.parser.ParseException;
@@ -45,7 +44,7 @@ import org.onap.clamp.clds.sdc.controller.installer.CsarHandler;
 import org.onap.clamp.clds.sdc.controller.installer.MicroService;
 import org.onap.clamp.clds.util.JsonUtils;
 import org.onap.clamp.clds.util.drawing.SvgFacade;
-import org.onap.clamp.loop.deploy.DeployParameters;
+import org.onap.clamp.loop.deploy.DcaeDeployParameters;
 import org.onap.clamp.loop.service.Service;
 import org.onap.clamp.loop.service.ServiceRepository;
 import org.onap.clamp.policy.Policy;
@@ -98,7 +97,7 @@ public class CsarInstaller {
     @Autowired
     private SvgFacade svgFacade;
 
-   /**
+    /**
     * Verify whether Csar is deployed.
     * 
     * @param csar The Csar Handler
@@ -241,7 +240,7 @@ public class CsarInstaller {
     }
 
     private JsonObject createGlobalPropertiesJson(BlueprintArtifact blueprintArtifact, Loop newLoop) {
-        return new DeployParameters(blueprintArtifact, newLoop).getDeploymentParametersinJson();
+        return DcaeDeployParameters.getDcaeDeploymentParametersInJson(blueprintArtifact, newLoop);
     }
 
     private static JsonObject createVfModuleProperties(CsarHandler csar) {
index 72726fa..64874a3 100644 (file)
@@ -117,4 +117,14 @@ public class LoopController {
         Loop loop = loopService.getLoop(loopName);
         return loop != null ? loop.getSvgRepresentation() : null;
     }
+
+    /**
+     * Refresh the Operational Policy Json representation of the loop.
+     *
+     * @param loopName The loop name
+     * @return The refreshed Loop
+     */
+    public Loop refreshOpPolicyJsonRepresentation(String loopName) {
+        return loopService.refreshOpPolicyJsonRepresentation(loopName);
+    }
 }
index 85e24cd..e520296 100644 (file)
@@ -105,4 +105,20 @@ public class LoopService {
         return loopsRepository.findById(loopName)
                 .orElseThrow(() -> new EntityNotFoundException("Couldn't find closed loop named: " + loopName));
     }
+
+    /**
+    * Api to refresh the Operational Policy UI window.
+    * 
+    * @param loopName The loop Name
+    * @return The refreshed loop object
+    */
+    public Loop refreshOpPolicyJsonRepresentation(String loopName) {
+        Loop loop = findClosedLoopByName(loopName);
+        Set<OperationalPolicy> policyList = loop.getOperationalPolicies();
+        for (OperationalPolicy policy : policyList) {
+            policy.updateJsonRepresentation();
+        }
+        loop.setOperationalPolicies(policyList);
+        return loopsRepository.save(loop);
+    }
 }
@@ -35,33 +35,14 @@ import org.onap.clamp.loop.Loop;
 import org.onap.clamp.policy.microservice.MicroServicePolicy;
 import org.yaml.snakeyaml.Yaml;
 
-public class DeployParameters  {
-
-    private LinkedHashMap<String, JsonObject> deploymentParamMap = new LinkedHashMap<String, JsonObject>();
-
-    /**
-     * Constructor.
-     * 
-     * @param blueprintArtifactList A list of blueprint artifacts
-     * @param loop The loop object
-     */
-    public DeployParameters(LinkedHashSet<BlueprintArtifact> blueprintArtifactList, Loop loop) {
-        this.init(blueprintArtifactList, loop);
-    }
-
-    /**
-     * Constructor.
-     * 
-     * @param blueprintArtifact One blueprint artifact
-     * @param loop The loop object
-     */
-    public DeployParameters(BlueprintArtifact blueprintArtifact, Loop loop) {
-        LinkedHashSet<BlueprintArtifact> blueprintArtifactList = new LinkedHashSet<BlueprintArtifact>();
-        blueprintArtifactList.add(blueprintArtifact);
-        this.init(blueprintArtifactList, loop);
-    }
+/**
+ * To decode the bluprint input parameters.
+ */
+public class DcaeDeployParameters  {
 
-    private void init(LinkedHashSet<BlueprintArtifact> blueprintArtifactList, Loop loop) {
+    private static LinkedHashMap<String, JsonObject> init(LinkedHashSet<BlueprintArtifact> blueprintArtifactList,
+            Loop loop) {
+        LinkedHashMap<String, JsonObject> deploymentParamMap = new LinkedHashMap<String, JsonObject>();
         String microServiceName = ((MicroServicePolicy) loop.getMicroServicePolicies().toArray()[0]).getName();
         // Add index to the microservice name from the 2nd blueprint artifact for now.
         // Update the microservice names, when able to link the microserivce <-> blueprint in the future
@@ -69,15 +50,18 @@ public class DeployParameters  {
         for (BlueprintArtifact blueprintArtifact: blueprintArtifactList) {
             if (index > 0) {
                 deploymentParamMap.put(microServiceName + index, 
-                        generateDeployParameter(blueprintArtifact, microServiceName));
+                        generateDcaeDeployParameter(blueprintArtifact, microServiceName));
             } else {
-                deploymentParamMap.put(microServiceName, generateDeployParameter(blueprintArtifact, microServiceName));
+                deploymentParamMap.put(microServiceName, 
+                        generateDcaeDeployParameter(blueprintArtifact, microServiceName));
             }
             index++;
         }
+        return deploymentParamMap;
     }
 
-    private JsonObject generateDeployParameter(BlueprintArtifact blueprintArtifact, String microServiceName) {
+    private static JsonObject generateDcaeDeployParameter(BlueprintArtifact blueprintArtifact,
+            String microServiceName) {
         JsonObject deployJsonBody = new JsonObject();
         Yaml yaml = new Yaml();
         Map<String, Object> inputsNodes = ((Map<String, Object>) ((Map<String, Object>) yaml
@@ -95,7 +79,7 @@ public class DeployParameters  {
         return deployJsonBody;
     }
 
-    private void addPropertyToNode(JsonObject node, String key, Object value) {
+    private static void addPropertyToNode(JsonObject node, String key, Object value) {
         if (value instanceof String) {
             node.addProperty(key, (String) value);
         } else if (value instanceof Number) {
@@ -114,7 +98,10 @@ public class DeployParameters  {
      *
      * @return The deploymentParameters in Json
      */
-    public JsonObject getDeploymentParametersinJson() {
+    public static JsonObject getDcaeDeploymentParametersInJson(LinkedHashSet<BlueprintArtifact> blueprintArtifactList,
+            Loop loop) {
+        LinkedHashMap<String, JsonObject> deploymentParamMap = init(blueprintArtifactList, loop);
+
         JsonObject globalProperties = new JsonObject();
         JsonObject deployParamJson = new JsonObject();
         for (Map.Entry<String, JsonObject> mapElement: deploymentParamMap.entrySet()) {
@@ -124,4 +111,14 @@ public class DeployParameters  {
         return globalProperties;
     }
 
+    /**
+     * Convert the object in Json.
+     *
+     * @return The deploymentParameters in Json
+     */
+    public static JsonObject getDcaeDeploymentParametersInJson(BlueprintArtifact blueprintArtifact, Loop loop) {
+        LinkedHashSet<BlueprintArtifact> blueprintArtifactList = new LinkedHashSet<BlueprintArtifact>();
+        blueprintArtifactList.add(blueprintArtifact);
+        return getDcaeDeploymentParametersInJson(blueprintArtifactList, loop);
+    }
 }
index e8bf4a6..d9e8a57 100644 (file)
@@ -174,7 +174,7 @@ public class OperationalPolicy implements Serializable, Policy {
 
     @Override
     public JsonObject getJsonRepresentation() {
-         return jsonRepresentation;
+        return jsonRepresentation;
     }
 
     void setJsonRepresentation(JsonObject jsonRepresentation) {
@@ -282,4 +282,17 @@ public class OperationalPolicy implements Serializable, Policy {
         return result;
     }
 
+    /**
+    * Regenerate the Operational Policy Json Representation.
+    *
+    */
+    public void updateJsonRepresentation() {
+        try {
+            this.jsonRepresentation = OperationalPolicyRepresentationBuilder
+                    .generateOperationalPolicySchema(loop.getModelService());
+        } catch (JsonSyntaxException | IOException | NullPointerException e) {
+            logger.error("Unable to generate the operational policy Schema ... ", e);
+            this.jsonRepresentation = new JsonObject();
+        }
+    }
 }
index cf99625..a0a3eb1 100644 (file)
                                </doTry>
                        </route>
                </put>
+               <put
+                       uri="/v2/loop/refreshOpPolicyJsonSchema/{loopName}"
+                       outType="org.onap.clamp.loop.Loop"
+                       produces="application/json">
+                       <route>
+                               <removeHeaders
+                                       pattern="*"
+                                       excludePattern="loopName" />
+                               <doTry>
+                                       <log
+                                               loggingLevel="INFO"
+                                               message="Refresh Operational Policy UI for loop: ${header.loopName}" />
+                                       <to
+                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=startLog(*, 'REFRESH OP Policy UI request')" />
+                                       <to
+                                               uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
+                                       <to uri="direct:load-loop" />
+                                       <to
+                                               uri="bean:org.onap.clamp.loop.LoopController?method=refreshOpPolicyJsonRepresentation(${header.loopName})" />
+                                       <log
+                                               loggingLevel="INFO"
+                                               message="REFRESH request successfully executed for loop: ${header.loopName}" />
+                                       <to
+                                               uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('REFRESH request successfully executed','INFO',${exchangeProperty[loopObject]})" />
+                                       <to
+                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=endLog()" />
+                                       <doCatch>
+                                               <exception>java.lang.Exception</exception>
+                                               <handled>
+                                                       <constant>false</constant>
+                                               </handled>
+                                               <to
+                                                       uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=errorLog()" />
+                                               <log
+                                                       loggingLevel="ERROR"
+                                                       message="REFRESH request failed for loop: ${header.loopName}" />
+                                               <to
+                                                       uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('REFRESH request failed, Error reported: ${exception} - Body: ${exception.responseBody}','ERROR',${exchangeProperty[loopObject]})" />
+                                       </doCatch>
+                               </doTry>
+                       </route>
+               </put>
                <put
                        uri="/v2/loop/undeploy/{loopName}"
                        outType="org.onap.clamp.loop.Loop"
index 036e8ef..57d32f0 100644 (file)
@@ -17,7 +17,6 @@
                        <stop />
                </when>
        </route>
-
        <route id="update-policy-status-for-loop">
                <from uri="direct:update-policy-status-for-loop" />
                <setProperty propertyName="policyComponent">
index 75ac66c..223498e 100644 (file)
@@ -97,9 +97,9 @@
                                </simple>
                        </setHeader>
                        <log loggingLevel="INFO"
-                               message="Endpoint to get policy deployment status: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[policyType]}/versions/1.0.0/policies/${exchangeProperty[policyName]}/versions/deployed"></log>
+                               message="Endpoint to get policy deployment status: {{clamp.config.policy.pap.url}}/policy/pap/v1/policies/deployed/${exchangeProperty[policyName]}/1.0.0"></log>
                        <toD
-                               uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[policyType]}/versions/1.0.0/policies/${exchangeProperty[policyName]}/versions/deployed?bridgeEndpoint=true&amp;useSystemProperties=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authMethod=Basic&amp;authUsername={{clamp.config.policy.api.userName}}&amp;authPassword={{clamp.config.policy.api.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true" />
+                               uri="{{clamp.config.policy.pap.url}}/policy/pap/v1/policies/${exchangeProperty[policyName]}/1.0.0?bridgeEndpoint=true&amp;useSystemProperties=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authMethod=Basic&amp;authUsername={{clamp.config.policy.api.userName}}&amp;authPassword={{clamp.config.policy.api.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true" />
                        <doFinally>
                                <to uri="direct:reset-raise-http-exception-flag" />
                                <to
index 70d1b4a..26cc831 100644 (file)
@@ -32,6 +32,9 @@ public class DcaeInventoryResponseCacheTest {
 
     public static DcaeInventoryCache inventoryCache = new DcaeInventoryCache();
 
+    /**
+     * Initialize the responses.
+     */
     @BeforeClass
     public static void createExample() {
         DcaeInventoryResponse response1 = new DcaeInventoryResponse();
@@ -41,7 +41,7 @@ import org.onap.clamp.loop.Loop;
 import org.onap.clamp.policy.microservice.MicroServicePolicy;
 import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException;
 
-public class DeployParametersTest {
+public class BlueprintInputParametersTest {
 
     private BlueprintArtifact buildFakeBuildprintArtifact(String blueprintFilePath) throws IOException {
         BlueprintArtifact blueprintArtifact = Mockito.mock(BlueprintArtifact.class);
@@ -77,8 +77,7 @@ public class DeployParametersTest {
         umServiceSet.add(umService);
         Mockito.when(loop.getMicroServicePolicies()).thenReturn(umServiceSet);
 
-        DeployParameters deployParams = new DeployParameters(buildFakeCsarHandler(), loop);
-        JsonObject paramJson = deployParams.getDeploymentParametersinJson();
+        JsonObject paramJson = DcaeDeployParameters.getDcaeDeploymentParametersInJson(buildFakeCsarHandler(), loop);
 
         Assert.assertEquals(JsonUtils.GSON_JPA_MODEL.toJson(paramJson), 
             ResourceFileUtil.getResourceAsString("example/sdc/expected-result/deployment-parameters.json"));
index 5ec9f46..9dcc4b3 100755 (executable)
@@ -237,7 +237,7 @@ class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
         with open(cached_file_content, 'w+') as f:
                 f.write(self.data_string)
         return True
-     elif self.path.startswith("/policy/api/v1/policytypes/") and http_type == "GET":
+     elif (self.path.startswith("/policy/api/v1/policytypes/") or self.path.startswith("/policy/pap/v1/policies/deployed/")) and http_type == "GET":
         print "self.path start with /policy/api/v1/policytypes/, generating response json..."
         jsonGenerated =  "{\"policyTypeId\": \"onap.policies.controlloop.operational\",\"policyTypeVersion\": \"1.0.0\",\"policyId\": \"OPERATIONAL_z711F_v1_0_ResourceInstanceName1_tca\"}"
         print "jsonGenerated: " + jsonGenerated
index 58fbce6..eb4ff6a 100644 (file)
@@ -252,7 +252,7 @@ export default class LoopUI extends React.Component {
                                <Route path="/viewToscaPolicyModal" render={(routeProps) => (<ViewToscaPolicyModal {...routeProps} />)} />
                                <Route path="/viewBlueprintMicroServiceTemplatesModal" render={(routeProps) => (<ViewBlueprintMicroServiceTemplatesModal {...routeProps} />)} />
                                <Route path="/operationalPolicyModal"
-                                       render={(routeProps) => (<OperationalPolicyModal {...routeProps} loopCache={this.getLoopCache()} loadLoopFunction={this.loadLoop} showAlert={this.showAlert}/>)} />
+                                       render={(routeProps) => (<OperationalPolicyModal {...routeProps} loopCache={this.getLoopCache()} loadLoopFunction={this.loadLoop} updateLoopFunction={this.updateLoopCache} showAlert={this.showAlert}/>)} />
                                <Route path="/configurationPolicyModal/:componentName" render={(routeProps) => (<ConfigurationPolicyModal {...routeProps} loopCache={this.getLoopCache()} loadLoopFunction={this.loadLoop}/>)} />
                                <Route path="/openLoop" render={(routeProps) => (<OpenLoopModal {...routeProps} loadLoopFunction={this.loadLoop} />)} />
                                <Route path="/loopProperties" render={(routeProps) => (<LoopPropertiesModal {...routeProps} loopCache={this.getLoopCache()} loadLoopFunction={this.loadLoop}/>)} />
index 95eb931..c73ed62 100644 (file)
@@ -53,13 +53,19 @@ export default class LoopCache {
        }
        
        getOperationalPolicyJsonSchema() {
-               return this.loopJsonCache["operationalPolicySchema"];
+               return this.loopJsonCache["operationalPolicies"]["0"]["jsonRepresentation"];
        }
 
        getOperationalPolicies() {
                return this.loopJsonCache["operationalPolicies"];
        }
 
+       getOperationalPoliciesNoJsonSchema() {
+               var operationalPolicies = JSON.parse(JSON.stringify(this.loopJsonCache["operationalPolicies"]));
+               delete operationalPolicies[0]["jsonRepresentation"];
+               return operationalPolicies;
+       }
+
        getGlobalProperties() {
                return this.loopJsonCache["globalPropertiesJson"];
        }
index f67bc0a..471fa4d 100644 (file)
@@ -49,13 +49,36 @@ describe('Verify LoopCache functions', () => {
           "operational_policy": {
             "controlLoop": {},
             "policies": []
+          }
+        },
+       "jsonRepresentation": {
+        "schema": {}
+      }
+      }];
+      expect(loopCache.getOperationalPolicies()).toStrictEqual(opPolicy);
+    });
 
+    it('getOperationalPoliciesNoJsonSchema', () => {
+      const opPolicy = [{
+        "name": "OPERATIONAL_h2NMX_v1_0_ResourceInstanceName1_tca",
+        "configurationsJson": {
+          "guard_policies": {},
+          "operational_policy": {
+            "controlLoop": {},
+            "policies": []
           }
         }
       }];
-      expect(loopCache.getOperationalPolicies()).toStrictEqual(opPolicy);
+      expect(loopCache.getOperationalPoliciesNoJsonSchema()).toStrictEqual(opPolicy);
     });
 
+    it('getOperationalPolicyJsonSchema', () => {
+      const jsonSchema = {
+          "schema": {}
+      };
+
+      expect(loopCache.getOperationalPolicyJsonSchema()).toStrictEqual(jsonSchema);
+    });
     it('getGlobalProperties', () => {
       const globelProp = {
         "dcaeDeployParameters": {
index c84b5b6..087ab5d 100644 (file)
@@ -93,6 +93,9 @@
           "controlLoop": {},
           "policies": []
         }
+      },
+      "jsonRepresentation": {
+        "schema": {}
       }
     }
   ],
index e2e2348..ead2cf8 100644 (file)
@@ -152,4 +152,27 @@ export default class LoopService {
                                return "";
                        });
        }
+
+       static refreshOpPolicyJson(loopName) {
+               return fetch('/restservices/clds/v2/loop/refreshOpPolicyJsonSchema/' + loopName, {
+                       method: 'PUT',
+                       headers: {
+                               "Content-Type": "application/json"
+                       },
+                       credentials: 'same-origin'
+               })
+                       .then(function (response) {
+                               console.debug("Refresh Operational Policy Json Schema response received: ", response.status);
+                               if (response.ok) {
+                                       return response.json();
+                               } else {
+                                       console.error("Refresh Operational Policy Json Schema query failed");
+                                       return {};
+                               }
+                       })
+                       .catch(function (error) {
+                               console.error("Refresh Operational Policy Json Schema error received", error);
+                               return {};
+                       });
+       }
 }
index 9c9a16f..6468e9f 100644 (file)
@@ -37,11 +37,9 @@ const FormStyled = styled(Form.Group)`
        padding: .25rem 1.5rem;
 `
 export default class DeployLoopModal extends React.Component {
-       state = {
-               loopCache: this.props.loopCache,
-               temporaryPropertiesJson: JSON.parse(JSON.stringify(this.props.loopCache.getGlobalProperties())),
-               show: true
-       };
+
+
+               
        constructor(props, context) {
                super(props, context);
 
@@ -50,6 +48,24 @@ export default class DeployLoopModal extends React.Component {
                this.handleChange = this.handleChange.bind(this);
                this.refreshStatus = this.refreshStatus.bind(this);
                this.renderDeployParam = this.renderDeployParam.bind(this);
+
+               const propertiesJson = JSON.parse(JSON.stringify(this.props.loopCache.getGlobalProperties()));
+               this.state = {
+                       loopCache: this.props.loopCache,
+                       temporaryPropertiesJson: propertiesJson,
+                       show: true,
+                       key: this.getInitialKeyValue(propertiesJson)
+               };
+       }
+       getInitialKeyValue(temporaryPropertiesJson) {
+               const deployJsonList = temporaryPropertiesJson["dcaeDeployParameters"];
+               let initialKey;
+               Object.keys(deployJsonList)
+                       .filter((obj) => Object.keys(deployJsonList).indexOf(obj) === 0)
+                       .map(obj =>
+                               initialKey = obj
+               );
+               return initialKey;
        }
        componentWillReceiveProps(newProps) {
                this.setState({
@@ -57,14 +73,7 @@ export default class DeployLoopModal extends React.Component {
                        show: true
                });
        }
-       componentDidMount() {
-               const deployJsonList = this.state.temporaryPropertiesJson["dcaeDeployParameters"];
-               Object.keys(deployJsonList)
-                       .filter((obj) => Object.keys(deployJsonList).indexOf(obj) === 0)
-                       .map(obj =>
-                               this.setState({key: obj})
-               );
-       }
+
        handleClose(){
                this.props.history.push('/');
        }
@@ -117,7 +126,6 @@ export default class DeployLoopModal extends React.Component {
                );
                return indents;
        }
-
        renderDeployParam(deployJson) {
                var indents = [];
                Object.keys(deployJson).map((item,key) =>
index 5c5f024..dc7c0a4 100644 (file)
@@ -25,6 +25,7 @@ import React from 'react'
 import Button from 'react-bootstrap/Button';
 import Modal from 'react-bootstrap/Modal';
 import styled from 'styled-components';
+import LoopCache from '../../../api/LoopCache';
 import LoopService from '../../../api/LoopService';
 import JSONEditor from '@json-editor/json-editor';
 
@@ -45,6 +46,7 @@ export default class OperationalPolicyModal extends React.Component {
                this.handleClose = this.handleClose.bind(this);
                this.handleSave = this.handleSave.bind(this);
                this.renderJsonEditor = this.renderJsonEditor.bind(this);
+               this.handleRefresh = this.handleRefresh.bind(this);
                this.setDefaultJsonEditorOptions();
        }
 
@@ -114,7 +116,7 @@ export default class OperationalPolicyModal extends React.Component {
                        console.error("NO Operational policy schema found");
                        return;
                }
-               var operationalPoliciesData = this.state.loopCache.getOperationalPolicies();
+               var operationalPoliciesData = this.state.loopCache.getOperationalPoliciesNoJsonSchema();
 
                this.setState({
                                jsonEditor: new JSONEditor(document.getElementById("editor"),
@@ -122,6 +124,25 @@ export default class OperationalPolicyModal extends React.Component {
                        })
        }
 
+       handleRefresh() {
+               LoopService.refreshOpPolicyJson(this.state.loopCache.getLoopName()).then(data => {
+                       var newLoopCache =  new LoopCache(data);
+                       var schema_json = newLoopCache.getOperationalPolicyJsonSchema();
+                       var operationalPoliciesData = newLoopCache.getOperationalPoliciesNoJsonSchema();
+                       document.getElementById("editor").innerHTML = "";
+                       this.setState({
+                               loopCache: newLoopCache,
+                               jsonEditor: new JSONEditor(document.getElementById("editor"),
+                                       { schema: schema_json.schema, startval: operationalPoliciesData })
+                       })
+                       this.props.updateLoopFunction(data);
+                       
+               })
+               .catch(error => {
+                       console.error("Error while refreshing the Operational Policy Json Representation");
+               });
+       }
+
        render() {
                return (
                        <ModalStyled size="xl" show={this.state.show} onHide={this.handleClose}>
@@ -135,10 +156,13 @@ export default class OperationalPolicyModal extends React.Component {
                                <Modal.Footer>
                                        <Button variant="secondary" onClick={this.handleClose}>
                                                Close
-                   </Button>
+                                       </Button>
+                                       <Button variant="secondary" onClick={this.handleRefresh}>
+                                               Refresh
+                                       </Button>
                                        <Button variant="primary" onClick={this.handleSave}>
                                                Save Changes
-                   </Button>
+                                       </Button>
                                </Modal.Footer>
                        </ModalStyled>
 
index 9c7da31..c10c6ff 100644 (file)
@@ -46,9 +46,9 @@ describe('Verify OperationalPolicyModal', () => {
                         "controlLoop": {},
                         "policies": []
                     }
-                }
-             }],
-            "operationalPolicySchema": {"schema": {}}
+                },
+                "jsonRepresentation" : {"schema": {}}
+             }]
     });
     const historyMock = { push: jest.fn() };
     const flushPromises = () => new Promise(setImmediate);
@@ -57,7 +57,7 @@ describe('Verify OperationalPolicyModal', () => {
       const handleClose = jest.spyOn(OperationalPolicyModal.prototype,'handleClose');
       const component = mount(<OperationalPolicyModal history={historyMock} loopCache={loopCache}/>)
 
-      component.find('[variant="secondary"]').prop('onClick')();
+      component.find('[variant="secondary"]').get(0).props.onClick();
 
       expect(handleClose).toHaveBeenCalledTimes(1);
       expect(component.state('show')).toEqual(false);
@@ -78,4 +78,17 @@ describe('Verify OperationalPolicyModal', () => {
         expect(component.state('show')).toEqual(false);
         expect(historyMock.push.mock.calls[0]).toEqual([ '/']);
     });
+
+    it('Test handleRefresh', async () => {
+        const updateLoopFunction = jest.fn();
+        const handleRefresh = jest.spyOn(OperationalPolicyModal.prototype,'handleRefresh');
+        const component = mount(<OperationalPolicyModal loopCache={loopCache} updateLoopFunction={updateLoopFunction} />)
+
+        component.find('[variant="secondary"]').get(1).props.onClick();
+        await flushPromises();
+        component.update();
+
+        expect(handleRefresh).toHaveBeenCalledTimes(1);
+        expect(component.state('show')).toEqual(true);
+    });
 });
\ No newline at end of file