aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/onap/clamp/loop/CsarInstaller.java7
-rw-r--r--src/main/java/org/onap/clamp/loop/LoopController.java10
-rw-r--r--src/main/java/org/onap/clamp/loop/LoopService.java16
-rw-r--r--src/main/java/org/onap/clamp/loop/deploy/DcaeDeployParameters.java (renamed from src/main/java/org/onap/clamp/loop/deploy/DeployParameters.java)59
-rw-r--r--src/main/java/org/onap/clamp/policy/operational/OperationalPolicy.java15
-rw-r--r--src/main/resources/clds/camel/rest/clamp-api-v2.xml42
-rw-r--r--src/main/resources/clds/camel/routes/loop-flows.xml1
-rw-r--r--src/main/resources/clds/camel/routes/policy-flows.xml4
-rw-r--r--src/test/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponseCacheTest.java3
-rw-r--r--src/test/java/org/onap/clamp/loop/deploy/BlueprintInputParametersTest.java (renamed from src/test/java/org/onap/clamp/loop/deploy/DeployParametersTest.java)5
-rwxr-xr-xsrc/test/resources/http-cache/third_party_proxy.py2
-rw-r--r--ui-react/src/LoopUI.js2
-rw-r--r--ui-react/src/api/LoopCache.js8
-rw-r--r--ui-react/src/api/LoopCache.test.js25
-rw-r--r--ui-react/src/api/LoopCache_mokeLoopJsonCache.json3
-rw-r--r--ui-react/src/api/LoopService.js23
-rw-r--r--ui-react/src/components/dialogs/Loop/DeployLoopModal.js36
-rw-r--r--ui-react/src/components/dialogs/OperationalPolicy/OperationalPolicyModal.js30
-rw-r--r--ui-react/src/components/dialogs/OperationalPolicy/OperationalPolicyModal.test.js21
19 files changed, 245 insertions, 67 deletions
diff --git a/src/main/java/org/onap/clamp/loop/CsarInstaller.java b/src/main/java/org/onap/clamp/loop/CsarInstaller.java
index 371f88e8..16351b82 100644
--- a/src/main/java/org/onap/clamp/loop/CsarInstaller.java
+++ b/src/main/java/org/onap/clamp/loop/CsarInstaller.java
@@ -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) {
diff --git a/src/main/java/org/onap/clamp/loop/LoopController.java b/src/main/java/org/onap/clamp/loop/LoopController.java
index 72726fa3..64874a32 100644
--- a/src/main/java/org/onap/clamp/loop/LoopController.java
+++ b/src/main/java/org/onap/clamp/loop/LoopController.java
@@ -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);
+ }
}
diff --git a/src/main/java/org/onap/clamp/loop/LoopService.java b/src/main/java/org/onap/clamp/loop/LoopService.java
index 85e24cd0..e5202966 100644
--- a/src/main/java/org/onap/clamp/loop/LoopService.java
+++ b/src/main/java/org/onap/clamp/loop/LoopService.java
@@ -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);
+ }
}
diff --git a/src/main/java/org/onap/clamp/loop/deploy/DeployParameters.java b/src/main/java/org/onap/clamp/loop/deploy/DcaeDeployParameters.java
index c994af7c..1a75f71e 100644
--- a/src/main/java/org/onap/clamp/loop/deploy/DeployParameters.java
+++ b/src/main/java/org/onap/clamp/loop/deploy/DcaeDeployParameters.java
@@ -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);
+ }
}
diff --git a/src/main/java/org/onap/clamp/policy/operational/OperationalPolicy.java b/src/main/java/org/onap/clamp/policy/operational/OperationalPolicy.java
index e8bf4a65..d9e8a57d 100644
--- a/src/main/java/org/onap/clamp/policy/operational/OperationalPolicy.java
+++ b/src/main/java/org/onap/clamp/policy/operational/OperationalPolicy.java
@@ -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();
+ }
+ }
}
diff --git a/src/main/resources/clds/camel/rest/clamp-api-v2.xml b/src/main/resources/clds/camel/rest/clamp-api-v2.xml
index cf99625e..a0a3eb10 100644
--- a/src/main/resources/clds/camel/rest/clamp-api-v2.xml
+++ b/src/main/resources/clds/camel/rest/clamp-api-v2.xml
@@ -238,6 +238,48 @@
</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"
produces="application/json">
diff --git a/src/main/resources/clds/camel/routes/loop-flows.xml b/src/main/resources/clds/camel/routes/loop-flows.xml
index 036e8efc..57d32f0f 100644
--- a/src/main/resources/clds/camel/routes/loop-flows.xml
+++ b/src/main/resources/clds/camel/routes/loop-flows.xml
@@ -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">
diff --git a/src/main/resources/clds/camel/routes/policy-flows.xml b/src/main/resources/clds/camel/routes/policy-flows.xml
index 75ac66c6..223498e8 100644
--- a/src/main/resources/clds/camel/routes/policy-flows.xml
+++ b/src/main/resources/clds/camel/routes/policy-flows.xml
@@ -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
diff --git a/src/test/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponseCacheTest.java b/src/test/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponseCacheTest.java
index 70d1b4ac..26cc831e 100644
--- a/src/test/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponseCacheTest.java
+++ b/src/test/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponseCacheTest.java
@@ -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();
diff --git a/src/test/java/org/onap/clamp/loop/deploy/DeployParametersTest.java b/src/test/java/org/onap/clamp/loop/deploy/BlueprintInputParametersTest.java
index 8834ef66..75ca25cf 100644
--- a/src/test/java/org/onap/clamp/loop/deploy/DeployParametersTest.java
+++ b/src/test/java/org/onap/clamp/loop/deploy/BlueprintInputParametersTest.java
@@ -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"));
diff --git a/src/test/resources/http-cache/third_party_proxy.py b/src/test/resources/http-cache/third_party_proxy.py
index 5ec9f46c..9dcc4b3a 100755
--- a/src/test/resources/http-cache/third_party_proxy.py
+++ b/src/test/resources/http-cache/third_party_proxy.py
@@ -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
diff --git a/ui-react/src/LoopUI.js b/ui-react/src/LoopUI.js
index 58fbce63..eb4ff6a5 100644
--- a/ui-react/src/LoopUI.js
+++ b/ui-react/src/LoopUI.js
@@ -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}/>)} />
diff --git a/ui-react/src/api/LoopCache.js b/ui-react/src/api/LoopCache.js
index 95eb9310..c73ed62b 100644
--- a/ui-react/src/api/LoopCache.js
+++ b/ui-react/src/api/LoopCache.js
@@ -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"];
}
diff --git a/ui-react/src/api/LoopCache.test.js b/ui-react/src/api/LoopCache.test.js
index f67bc0aa..471fa4d7 100644
--- a/ui-react/src/api/LoopCache.test.js
+++ b/ui-react/src/api/LoopCache.test.js
@@ -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": {
diff --git a/ui-react/src/api/LoopCache_mokeLoopJsonCache.json b/ui-react/src/api/LoopCache_mokeLoopJsonCache.json
index c84b5b69..087ab5d4 100644
--- a/ui-react/src/api/LoopCache_mokeLoopJsonCache.json
+++ b/ui-react/src/api/LoopCache_mokeLoopJsonCache.json
@@ -93,6 +93,9 @@
"controlLoop": {},
"policies": []
}
+ },
+ "jsonRepresentation": {
+ "schema": {}
}
}
],
diff --git a/ui-react/src/api/LoopService.js b/ui-react/src/api/LoopService.js
index e2e23482..ead2cf80 100644
--- a/ui-react/src/api/LoopService.js
+++ b/ui-react/src/api/LoopService.js
@@ -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 {};
+ });
+ }
}
diff --git a/ui-react/src/components/dialogs/Loop/DeployLoopModal.js b/ui-react/src/components/dialogs/Loop/DeployLoopModal.js
index 9c9a16fe..6468e9f9 100644
--- a/ui-react/src/components/dialogs/Loop/DeployLoopModal.js
+++ b/ui-react/src/components/dialogs/Loop/DeployLoopModal.js
@@ -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) =>
diff --git a/ui-react/src/components/dialogs/OperationalPolicy/OperationalPolicyModal.js b/ui-react/src/components/dialogs/OperationalPolicy/OperationalPolicyModal.js
index 5c5f0241..dc7c0a48 100644
--- a/ui-react/src/components/dialogs/OperationalPolicy/OperationalPolicyModal.js
+++ b/ui-react/src/components/dialogs/OperationalPolicy/OperationalPolicyModal.js
@@ -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>
diff --git a/ui-react/src/components/dialogs/OperationalPolicy/OperationalPolicyModal.test.js b/ui-react/src/components/dialogs/OperationalPolicy/OperationalPolicyModal.test.js
index 9c7da310..c10c6ff0 100644
--- a/ui-react/src/components/dialogs/OperationalPolicy/OperationalPolicyModal.test.js
+++ b/ui-react/src/components/dialogs/OperationalPolicy/OperationalPolicyModal.test.js
@@ -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