diff options
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 371f88e8b..16351b820 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 72726fa3f..64874a32d 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 85e24cd00..e52029662 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 c994af7c0..1a75f71e6 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 e8bf4a655..d9e8a57d6 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 cf99625ee..a0a3eb104 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 036e8efc8..57d32f0fe 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 75ac66c6c..223498e81 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&useSystemProperties=true&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&authMethod=Basic&authUsername={{clamp.config.policy.api.userName}}&authPassword={{clamp.config.policy.api.password}}&connectionTimeToLive=5000&httpClient.connectTimeout=10000&httpClient.socketTimeout=20000&authenticationPreemptive=true&connectionClose=true" /> + uri="{{clamp.config.policy.pap.url}}/policy/pap/v1/policies/${exchangeProperty[policyName]}/1.0.0?bridgeEndpoint=true&useSystemProperties=true&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&authMethod=Basic&authUsername={{clamp.config.policy.api.userName}}&authPassword={{clamp.config.policy.api.password}}&connectionTimeToLive=5000&httpClient.connectTimeout=10000&httpClient.socketTimeout=20000&authenticationPreemptive=true&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 70d1b4ac2..26cc831ec 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 8834ef667..75ca25cff 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 5ec9f46c1..9dcc4b3a3 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 58fbce635..eb4ff6a50 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 95eb9310e..c73ed62b5 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 f67bc0aa0..471fa4d71 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 c84b5b691..087ab5d45 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 e2e234821..ead2cf80c 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 9c9a16feb..6468e9f9e 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 5c5f0241a..dc7c0a489 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 9c7da3108..c10c6ff0a 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 |