From 926646d8e5e86e680a119360f93d7bdb46c89435 Mon Sep 17 00:00:00 2001 From: "a.sreekumar" Date: Tue, 22 Jun 2021 15:55:46 +0100 Subject: Changes to support multiple outputs from a state This review addresses two main changes: 1) inputFields and outputFields are not tied to task definition anymore. Instead inputEvent and outputEvents associated to a task is populated as part of the policy state definition, as the state definition have the information anyway. - Clean up of the usage of inputFields and outputFields in task definition will happen in a future review - inputFields and outputFields defined in task definition in policies until honolulu will not make the policy invalid as the changes are done in backward compatible way. 2) Multiple output events can come out of a final state now. - Define another policy state output with the relevant eventName in the command file - In the task logic, create a map to store the fields of the relevant outputEvent, and then just call "executor.addFieldsToOutput()" These 2 steps are enough to send multiple events to relevant components as per the apex configuration. Change-Id: Id88ca402704106404f529e595e1a76f6bf167876 Issue-ID: POLICY-3336 Signed-off-by: a.sreekumar --- .../plugins/executor/java/JavaTaskExecutor.java | 3 +- .../executor/java/JavaTaskExecutorTest.java | 8 ++++-- .../javascript/JavascriptTaskExecutor.java | 3 +- .../javascript/JavascriptTaskExecutorTest.java | 33 ++++++++++++++++------ .../plugins/executor/jruby/JrubyTaskExecutor.java | 3 +- .../executor/jruby/JrubyTaskExecutorTest.java | 14 +++++---- .../plugins/executor/mvel/MvelTaskExecutor.java | 3 +- .../executor/mvel/MvelTaskExecutorTest.java | 7 ++++- 8 files changed, 52 insertions(+), 22 deletions(-) (limited to 'plugins') diff --git a/plugins/plugins-executor/plugins-executor-java/src/main/java/org/onap/policy/apex/plugins/executor/java/JavaTaskExecutor.java b/plugins/plugins-executor/plugins-executor-java/src/main/java/org/onap/policy/apex/plugins/executor/java/JavaTaskExecutor.java index 2ccddcf0f..736249efd 100644 --- a/plugins/plugins-executor/plugins-executor-java/src/main/java/org/onap/policy/apex/plugins/executor/java/JavaTaskExecutor.java +++ b/plugins/plugins-executor/plugins-executor-java/src/main/java/org/onap/policy/apex/plugins/executor/java/JavaTaskExecutor.java @@ -2,6 +2,7 @@ * ============LICENSE_START======================================================= * Copyright (C) 2016-2018 Ericsson. All rights reserved. * Modifications Copyright (C) 2020 Nordix Foundation. + * Modifications Copyright (C) 2021 Bell Canada. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -76,7 +77,7 @@ public class JavaTaskExecutor extends TaskExecutor { * @throws ContextException on context errors */ @Override - public Map execute(final long executionId, final Properties executionProperties, + public Map> execute(final long executionId, final Properties executionProperties, final Map incomingFields) throws StateMachineException, ContextException { // Do execution pre work executePre(executionId, executionProperties, incomingFields); diff --git a/plugins/plugins-executor/plugins-executor-java/src/test/java/org/onap/policy/apex/plugins/executor/java/JavaTaskExecutorTest.java b/plugins/plugins-executor/plugins-executor-java/src/test/java/org/onap/policy/apex/plugins/executor/java/JavaTaskExecutorTest.java index 7f263245c..96bc6bb3d 100644 --- a/plugins/plugins-executor/plugins-executor-java/src/test/java/org/onap/policy/apex/plugins/executor/java/JavaTaskExecutorTest.java +++ b/plugins/plugins-executor/plugins-executor-java/src/test/java/org/onap/policy/apex/plugins/executor/java/JavaTaskExecutorTest.java @@ -2,6 +2,7 @@ * ============LICENSE_START======================================================= * Copyright (C) 2018 Ericsson. All rights reserved. * Modifications Copyright (C) 2020 Nordix Foundation + * Modifications Copyright (C) 2021 Bell Canada. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,6 +29,7 @@ import static org.junit.Assert.assertNotNull; import java.util.HashMap; import java.util.Map; import java.util.Properties; +import java.util.TreeMap; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -38,6 +40,7 @@ import org.onap.policy.apex.context.parameters.LockManagerParameters; import org.onap.policy.apex.context.parameters.PersistorParameters; import org.onap.policy.apex.core.engine.context.ApexInternalContext; import org.onap.policy.apex.core.engine.executor.exception.StateMachineException; +import org.onap.policy.apex.model.eventmodel.concepts.AxEvent; import org.onap.policy.apex.model.policymodel.concepts.AxPolicyModel; import org.onap.policy.apex.model.policymodel.concepts.AxTask; import org.onap.policy.common.parameters.ParameterService; @@ -83,7 +86,8 @@ public class JavaTaskExecutorTest { assertThatThrownBy(jte::prepare) .hasMessage("instantiation error on Java class \"\""); task.getTaskLogic().setLogic("java.lang.String"); - + task.setInputEvent(new AxEvent()); + task.setOutputEvents(new TreeMap<>()); jte.prepare(); assertThatThrownBy(() -> jte.execute(-1, new Properties(), null)) @@ -96,7 +100,7 @@ public class JavaTaskExecutorTest { assertThatThrownBy(() -> jte.execute(-1, new Properties(), incomingParameters)) .hasMessage("execute-post: task logic execution failure on task \"NULL\" in model NULL:0.0.0"); jte.prepare(); - Map returnMap = jte.execute(0, new Properties(), incomingParameters); + Map> returnMap = jte.execute(0, new Properties(), incomingParameters); assertEquals(0, returnMap.size()); jte.cleanUp(); diff --git a/plugins/plugins-executor/plugins-executor-javascript/src/main/java/org/onap/policy/apex/plugins/executor/javascript/JavascriptTaskExecutor.java b/plugins/plugins-executor/plugins-executor-javascript/src/main/java/org/onap/policy/apex/plugins/executor/javascript/JavascriptTaskExecutor.java index a25dca0c6..f88e3ef1e 100644 --- a/plugins/plugins-executor/plugins-executor-javascript/src/main/java/org/onap/policy/apex/plugins/executor/javascript/JavascriptTaskExecutor.java +++ b/plugins/plugins-executor/plugins-executor-javascript/src/main/java/org/onap/policy/apex/plugins/executor/javascript/JavascriptTaskExecutor.java @@ -2,6 +2,7 @@ * ============LICENSE_START======================================================= * Copyright (C) 2016-2018 Ericsson. All rights reserved. * Modifications Copyright (C) 2019-2020 Nordix Foundation. + * Modifications Copyright (C) 2021 Bell Canada. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -66,7 +67,7 @@ public class JavascriptTaskExecutor extends TaskExecutor { * @throws ContextException on context errors */ @Override - public Map execute(final long executionId, final Properties executionProperties, + public Map> execute(final long executionId, final Properties executionProperties, final Map incomingFields) throws StateMachineException, ContextException { executePre(executionId, executionProperties, incomingFields); boolean result = javascriptExecutor.execute(getExecutionContext()); diff --git a/plugins/plugins-executor/plugins-executor-javascript/src/test/java/org/onap/policy/apex/plugins/executor/javascript/JavascriptTaskExecutorTest.java b/plugins/plugins-executor/plugins-executor-javascript/src/test/java/org/onap/policy/apex/plugins/executor/javascript/JavascriptTaskExecutorTest.java index 991c89bcb..fbf7db864 100644 --- a/plugins/plugins-executor/plugins-executor-javascript/src/test/java/org/onap/policy/apex/plugins/executor/javascript/JavascriptTaskExecutorTest.java +++ b/plugins/plugins-executor/plugins-executor-javascript/src/test/java/org/onap/policy/apex/plugins/executor/javascript/JavascriptTaskExecutorTest.java @@ -2,6 +2,7 @@ * ============LICENSE_START======================================================= * Copyright (C) 2019-2020 Nordix Foundation. * Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2021 Bell Canada. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +30,7 @@ import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import java.util.Properties; +import java.util.TreeMap; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -47,6 +49,8 @@ import org.onap.policy.apex.model.basicmodel.service.ModelService; import org.onap.policy.apex.model.contextmodel.concepts.AxContextAlbum; import org.onap.policy.apex.model.contextmodel.concepts.AxContextSchema; import org.onap.policy.apex.model.contextmodel.concepts.AxContextSchemas; +import org.onap.policy.apex.model.eventmodel.concepts.AxEvent; +import org.onap.policy.apex.model.eventmodel.concepts.AxField; import org.onap.policy.apex.model.policymodel.concepts.AxPolicyModel; import org.onap.policy.apex.model.policymodel.concepts.AxTask; import org.onap.policy.common.parameters.ParameterService; @@ -123,7 +127,8 @@ public class JavascriptTaskExecutorTest { jte.execute(-1, props, null); }).isInstanceOf(NullPointerException.class); jte.cleanUp(); - + task.setInputEvent(new AxEvent()); + task.setOutputEvents(new TreeMap<>()); task.getTaskLogic().setLogic("var returnValue = false;\nreturnValue;"); Map incomingParameters = new HashMap<>(); @@ -138,13 +143,14 @@ public class JavascriptTaskExecutorTest { task.getTaskLogic().setLogic("var returnValue = true;\nreturnValue;"); jte.prepare(); - Map returnMap = jte.execute(0, new Properties(), incomingParameters); + Map> returnMap = jte.execute(0, new Properties(), incomingParameters); assertEquals(0, returnMap.size()); jte.cleanUp(); } @Test public void testJavascriptTaskExecutorLogic() throws Exception { + JavascriptTaskExecutor jte = new JavascriptTaskExecutor(); assertNotNull(jte); @@ -160,16 +166,25 @@ public class JavascriptTaskExecutorTest { internalContext.getContextAlbums().put(contextAlbum.getKey(), contextAlbum); task.getContextAlbumReferences().add(contextAlbum.getKey()); - task.getOutputFields().put("par0", null); - task.getOutputFields().put("par1", null); + String parKey0 = "par0"; + task.getOutputFields().put(parKey0, null); + String parKey1 = "par1"; + task.getOutputFields().put(parKey1, null); jte.setContext(null, task, internalContext); Map incomingParameters = new HashMap<>(); - incomingParameters.put("par0", "value0"); + incomingParameters.put(parKey0, "value0"); - task.getTaskLogic().setLogic(TextFileUtils.getTextFileAsString("src/test/resources/javascript/TestLogic00.js")); + AxEvent inEvent = new AxEvent(); + inEvent.setParameterMap(Map.of(parKey0, new AxField())); + task.setInputEvent(inEvent); + AxEvent outEvent = new AxEvent(); + outEvent.setParameterMap(Map.of(parKey0, new AxField(), parKey1, new AxField())); + final String eventName = "event1"; + task.setOutputEvents(Map.of(eventName, outEvent)); + task.getTaskLogic().setLogic(TextFileUtils.getTextFileAsString("src/test/resources/javascript/TestLogic00.js")); jte.prepare(); jte.execute(-1, new Properties(), incomingParameters); jte.cleanUp(); @@ -177,11 +192,11 @@ public class JavascriptTaskExecutorTest { task.getTaskLogic().setLogic(TextFileUtils.getTextFileAsString("src/test/resources/javascript/TestLogic01.js")); jte.prepare(); - Map outcomingParameters = jte.execute(-1, new Properties(), incomingParameters); + Map> outcomingParameters = jte.execute(-1, new Properties(), incomingParameters); jte.cleanUp(); - assertEquals("returnVal0", outcomingParameters.get("par0")); - assertEquals("returnVal1", outcomingParameters.get("par1")); + assertEquals("returnVal0", outcomingParameters.get(eventName).get(parKey0)); + assertEquals("returnVal1", outcomingParameters.get(eventName).get(parKey1)); } private ContextAlbum createTestContextAlbum() throws ContextException { diff --git a/plugins/plugins-executor/plugins-executor-jruby/src/main/java/org/onap/policy/apex/plugins/executor/jruby/JrubyTaskExecutor.java b/plugins/plugins-executor/plugins-executor-jruby/src/main/java/org/onap/policy/apex/plugins/executor/jruby/JrubyTaskExecutor.java index 02504c670..aa5700433 100644 --- a/plugins/plugins-executor/plugins-executor-jruby/src/main/java/org/onap/policy/apex/plugins/executor/jruby/JrubyTaskExecutor.java +++ b/plugins/plugins-executor/plugins-executor-jruby/src/main/java/org/onap/policy/apex/plugins/executor/jruby/JrubyTaskExecutor.java @@ -2,6 +2,7 @@ * ============LICENSE_START======================================================= * Copyright (C) 2016-2018 Ericsson. All rights reserved. * Modifications Copyright (C) 2019 Nordix Foundation. + * Modifications Copyright (C) 2021 Bell Canada. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -80,7 +81,7 @@ public class JrubyTaskExecutor extends TaskExecutor { * @throws ContextException on context errors */ @Override - public Map execute(final long executionId, final Properties executionProperties, + public Map> execute(final long executionId, final Properties executionProperties, final Map incomingFields) throws StateMachineException, ContextException { // Do execution pre work executePre(executionId, executionProperties, incomingFields); diff --git a/plugins/plugins-executor/plugins-executor-jruby/src/test/java/org/onap/policy/apex/plugins/executor/jruby/JrubyTaskExecutorTest.java b/plugins/plugins-executor/plugins-executor-jruby/src/test/java/org/onap/policy/apex/plugins/executor/jruby/JrubyTaskExecutorTest.java index e2785d816..0cc476425 100644 --- a/plugins/plugins-executor/plugins-executor-jruby/src/test/java/org/onap/policy/apex/plugins/executor/jruby/JrubyTaskExecutorTest.java +++ b/plugins/plugins-executor/plugins-executor-jruby/src/test/java/org/onap/policy/apex/plugins/executor/jruby/JrubyTaskExecutorTest.java @@ -1,7 +1,7 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2019 Nordix Foundation. - * Modifications Copyright (C) 2019-2020 Nordix Foundation. + * Copyright (C) 2019-2020 Nordix Foundation. + * Modifications Copyright (C) 2021 Bell Canada. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,7 @@ import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; import java.util.Properties; +import java.util.TreeMap; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -39,6 +40,7 @@ import org.onap.policy.apex.context.parameters.LockManagerParameters; import org.onap.policy.apex.context.parameters.PersistorParameters; import org.onap.policy.apex.core.engine.context.ApexInternalContext; import org.onap.policy.apex.core.engine.executor.exception.StateMachineException; +import org.onap.policy.apex.model.eventmodel.concepts.AxEvent; import org.onap.policy.apex.model.policymodel.concepts.AxPolicyModel; import org.onap.policy.apex.model.policymodel.concepts.AxTask; import org.onap.policy.common.parameters.ParameterService; @@ -91,7 +93,8 @@ public class JrubyTaskExecutorTest { AxTask task = new AxTask(); ApexInternalContext internalContext = null; internalContext = new ApexInternalContext(new AxPolicyModel()); - + task.setInputEvent(new AxEvent()); + task.setOutputEvents(new TreeMap<>()); jte.setContext(null, task, internalContext); jte.prepare(); @@ -102,14 +105,13 @@ public class JrubyTaskExecutorTest { final String jrubyLogic = "if executor.executionId == -1" + "\n return false" + "\n else " + "\n return true" + "\n end"; task.getTaskLogic().setLogic(jrubyLogic); - jte.prepare(); - Map returnMap = jte.execute(0, new Properties(), incomingParameters); + Map> returnMap = jte.execute(0, new Properties(), incomingParameters); assertEquals(0, returnMap.size()); jte.cleanUp(); jte.prepare(); - Map returnMap1 = jte.execute(0, new Properties(), incomingParameters); + Map> returnMap1 = jte.execute(0, new Properties(), incomingParameters); assertEquals(0, returnMap1.size()); jte.cleanUp(); } diff --git a/plugins/plugins-executor/plugins-executor-mvel/src/main/java/org/onap/policy/apex/plugins/executor/mvel/MvelTaskExecutor.java b/plugins/plugins-executor/plugins-executor-mvel/src/main/java/org/onap/policy/apex/plugins/executor/mvel/MvelTaskExecutor.java index 179462bb1..07a287f4d 100644 --- a/plugins/plugins-executor/plugins-executor-mvel/src/main/java/org/onap/policy/apex/plugins/executor/mvel/MvelTaskExecutor.java +++ b/plugins/plugins-executor/plugins-executor-mvel/src/main/java/org/onap/policy/apex/plugins/executor/mvel/MvelTaskExecutor.java @@ -2,6 +2,7 @@ * ============LICENSE_START======================================================= * Copyright (C) 2016-2018 Ericsson. All rights reserved. * Modifications Copyright (C) 2019 Nordix Foundation. + * Modifications Copyright (C) 2021 Bell Canada. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -77,7 +78,7 @@ public class MvelTaskExecutor extends TaskExecutor { * @throws ContextException on context errors */ @Override - public Map execute(final long executionId, final Properties executionProperties, + public Map> execute(final long executionId, final Properties executionProperties, final Map incomingFields) throws StateMachineException, ContextException { // Do execution pre work executePre(executionId, executionProperties, incomingFields); diff --git a/plugins/plugins-executor/plugins-executor-mvel/src/test/java/org/onap/policy/apex/plugins/executor/mvel/MvelTaskExecutorTest.java b/plugins/plugins-executor/plugins-executor-mvel/src/test/java/org/onap/policy/apex/plugins/executor/mvel/MvelTaskExecutorTest.java index a4d2cbf2b..3d59c4b21 100644 --- a/plugins/plugins-executor/plugins-executor-mvel/src/test/java/org/onap/policy/apex/plugins/executor/mvel/MvelTaskExecutorTest.java +++ b/plugins/plugins-executor/plugins-executor-mvel/src/test/java/org/onap/policy/apex/plugins/executor/mvel/MvelTaskExecutorTest.java @@ -2,6 +2,7 @@ * ============LICENSE_START======================================================= * Copyright (C) 2019 Nordix Foundation. * Modifications Copyright (C) 2020 Nordix Foundation + * Modifications Copyright (C) 2021 Bell Canada. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,6 +29,7 @@ import static org.junit.Assert.assertNotNull; import java.util.HashMap; import java.util.Map; import java.util.Properties; +import java.util.TreeMap; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -38,6 +40,7 @@ import org.onap.policy.apex.context.parameters.LockManagerParameters; import org.onap.policy.apex.context.parameters.PersistorParameters; import org.onap.policy.apex.core.engine.context.ApexInternalContext; import org.onap.policy.apex.core.engine.executor.exception.StateMachineException; +import org.onap.policy.apex.model.eventmodel.concepts.AxEvent; import org.onap.policy.apex.model.policymodel.concepts.AxPolicyModel; import org.onap.policy.apex.model.policymodel.concepts.AxTask; import org.onap.policy.common.parameters.ParameterService; @@ -77,6 +80,8 @@ public class MvelTaskExecutorTest { AxTask task = new AxTask(); ApexInternalContext internalContext = null; internalContext = new ApexInternalContext(new AxPolicyModel()); + task.setInputEvent(new AxEvent()); + task.setOutputEvents(new TreeMap<>()); mte.setContext(null, task, internalContext); task.getTaskLogic().setLogic("x > 1 2 ()"); @@ -97,7 +102,7 @@ public class MvelTaskExecutorTest { .hasMessage("execute-post: task logic execution failure on task \"NULL\" in model NULL:0.0.0"); mte.prepare(); - Map returnMap = mte.execute(0, new Properties(), incomingParameters); + Map> returnMap = mte.execute(0, new Properties(), incomingParameters); assertEquals(0, returnMap.size()); mte.cleanUp(); } -- cgit 1.2.3-korg