From f86d08ca5598571410386372f3f06d5c8c686c74 Mon Sep 17 00:00:00 2001 From: "a.sreekumar" Date: Tue, 9 Feb 2021 18:21:49 +0000 Subject: Changes related to multi policy handling improvement in APEX This review fixes an issue identified during testing the changes done for improving multiple policy handling in APEX. Changes done to a few test files in the previous review are reverted as well. Change-Id: I98324da708239d314aadd4c45dc377137fd552ba Issue-ID: POLICY-2883 Signed-off-by: a.sreekumar --- .../services/onappf/handler/ApexEngineHandler.java | 158 ++++++++++++--------- 1 file changed, 87 insertions(+), 71 deletions(-) (limited to 'services/services-onappf/src/main/java') diff --git a/services/services-onappf/src/main/java/org/onap/policy/apex/services/onappf/handler/ApexEngineHandler.java b/services/services-onappf/src/main/java/org/onap/policy/apex/services/onappf/handler/ApexEngineHandler.java index 03e97215b..5a113a77d 100644 --- a/services/services-onappf/src/main/java/org/onap/policy/apex/services/onappf/handler/ApexEngineHandler.java +++ b/services/services-onappf/src/main/java/org/onap/policy/apex/services/onappf/handler/ApexEngineHandler.java @@ -72,7 +72,7 @@ public class ApexEngineHandler { private static final Logger LOGGER = LoggerFactory.getLogger(ApexEngineHandler.class); - private Map apexMainMap; + private Map apexMainMap = new LinkedHashMap<>(); /** * Constructs the object. Extracts the config and model files from each policy and instantiates the apex engine. @@ -82,12 +82,7 @@ public class ApexEngineHandler { */ public ApexEngineHandler(List policies) throws ApexStarterException { LOGGER.debug("Starting apex engine."); - apexMainMap = initiateApexEngineForPolicies(policies); - if (apexMainMap.isEmpty()) { - ModelService.clear(); - ParameterService.clear(); - throw new ApexStarterException("Apex Engine failed to start."); - } + initiateApexEngineForPolicies(policies); } /** @@ -118,11 +113,7 @@ public class ApexEngineHandler { updateModelAndParameterServices(undeployedPoliciesMainMap); } if (!policiesToDeploy.isEmpty()) { - Map mainMap = initiateApexEngineForPolicies(policiesToDeploy); - if (mainMap.isEmpty()) { - throw new ApexStarterException("Updating the APEX engine with new policies failed."); - } - apexMainMap.putAll(mainMap); + initiateApexEngineForPolicies(policiesToDeploy); } if (apexMainMap.isEmpty()) { ModelService.clear(); @@ -168,65 +159,80 @@ public class ApexEngineHandler { policyKeystoRetain.addAll(main.getActivator().getPolicyModel().getPolicies().getPolicyMap().keySet()); }); for (ApexMain main : undeployedPoliciesMainMap.values()) { - ApexParameters existingParameters = ParameterService.get(ApexParameterConstants.MAIN_GROUP_NAME); - List eventInputParamKeysToRemove = main.getApexParameters().getEventInputParameters().keySet() - .stream().filter(key -> !inputParamKeysToRetain.contains(key)).collect(Collectors.toList()); - List eventOutputParamKeysToRemove = main.getApexParameters().getEventOutputParameters().keySet() - .stream().filter(key -> !outputParamKeysToRetain.contains(key)).collect(Collectors.toList()); - eventInputParamKeysToRemove.forEach(existingParameters.getEventInputParameters()::remove); - eventOutputParamKeysToRemove.forEach(existingParameters.getEventOutputParameters()::remove); - EngineParameters engineParameters = - main.getApexParameters().getEngineServiceParameters().getEngineParameters(); - final List taskParametersToRemove = engineParameters.getTaskParameters().stream() - .filter(taskParameter -> !taskParametersToRetain.contains(taskParameter)).collect(Collectors.toList()); - final List executorParamKeysToRemove = engineParameters.getExecutorParameterMap().keySet().stream() - .filter(key -> !executorParamKeysToRetain.contains(key)).collect(Collectors.toList()); - final List schemaParamKeysToRemove = - engineParameters.getContextParameters().getSchemaParameters().getSchemaHelperParameterMap().keySet() - .stream().filter(key -> !schemaParamKeysToRetain.contains(key)).collect(Collectors.toList()); - EngineParameters aggregatedEngineParameters = - existingParameters.getEngineServiceParameters().getEngineParameters(); - aggregatedEngineParameters.getTaskParameters().removeAll(taskParametersToRemove); - executorParamKeysToRemove.forEach(aggregatedEngineParameters.getExecutorParameterMap()::remove); - schemaParamKeysToRemove.forEach(aggregatedEngineParameters.getContextParameters().getSchemaParameters() - .getSchemaHelperParameterMap()::remove); + handleParametersRemoval(inputParamKeysToRetain, outputParamKeysToRetain, taskParametersToRetain, + executorParamKeysToRetain, schemaParamKeysToRetain, main); + + if (null != main.getActivator() && null != main.getActivator().getPolicyModel()) { + handleAxConceptsRemoval(keyInfoKeystoRetain, schemaKeystoRetain, eventKeystoRetain, albumKeystoRetain, + taskKeystoRetain, policyKeystoRetain, main); + } + } + } - final AxPolicyModel policyModel = main.getActivator().getPolicyModel(); - final List keyInfoKeystoRemove = policyModel.getKeyInformation().getKeyInfoMap().keySet() - .stream().filter(key -> !keyInfoKeystoRetain.contains(key)).collect(Collectors.toList()); - final List schemaKeystoRemove = policyModel.getSchemas().getSchemasMap().keySet().stream() - .filter(key -> !schemaKeystoRetain.contains(key)).collect(Collectors.toList()); - final List eventKeystoRemove = policyModel.getEvents().getEventMap().keySet().stream() - .filter(key -> !eventKeystoRetain.contains(key)).collect(Collectors.toList()); - final List albumKeystoRemove = policyModel.getAlbums().getAlbumsMap().keySet().stream() - .filter(key -> !albumKeystoRetain.contains(key)).collect(Collectors.toList()); - final List taskKeystoRemove = policyModel.getTasks().getTaskMap().keySet().stream() - .filter(key -> !taskKeystoRetain.contains(key)).collect(Collectors.toList()); - final List policyKeystoRemove = policyModel.getPolicies().getPolicyMap().keySet().stream() - .filter(key -> !policyKeystoRetain.contains(key)).collect(Collectors.toList()); + private void handleParametersRemoval(Set inputParamKeysToRetain, Set outputParamKeysToRetain, + List taskParametersToRetain, List executorParamKeysToRetain, + List schemaParamKeysToRetain, ApexMain main) { + ApexParameters existingParameters = ParameterService.get(ApexParameterConstants.MAIN_GROUP_NAME); + List eventInputParamKeysToRemove = main.getApexParameters().getEventInputParameters().keySet().stream() + .filter(key -> !inputParamKeysToRetain.contains(key)).collect(Collectors.toList()); + List eventOutputParamKeysToRemove = main.getApexParameters().getEventOutputParameters().keySet() + .stream().filter(key -> !outputParamKeysToRetain.contains(key)).collect(Collectors.toList()); + eventInputParamKeysToRemove.forEach(existingParameters.getEventInputParameters()::remove); + eventOutputParamKeysToRemove.forEach(existingParameters.getEventOutputParameters()::remove); + EngineParameters engineParameters = main.getApexParameters().getEngineServiceParameters().getEngineParameters(); + final List taskParametersToRemove = engineParameters.getTaskParameters().stream() + .filter(taskParameter -> !taskParametersToRetain.contains(taskParameter)).collect(Collectors.toList()); + final List executorParamKeysToRemove = engineParameters.getExecutorParameterMap().keySet().stream() + .filter(key -> !executorParamKeysToRetain.contains(key)).collect(Collectors.toList()); + final List schemaParamKeysToRemove = + engineParameters.getContextParameters().getSchemaParameters().getSchemaHelperParameterMap().keySet() + .stream().filter(key -> !schemaParamKeysToRetain.contains(key)).collect(Collectors.toList()); + EngineParameters aggregatedEngineParameters = + existingParameters.getEngineServiceParameters().getEngineParameters(); + aggregatedEngineParameters.getTaskParameters().removeAll(taskParametersToRemove); + executorParamKeysToRemove.forEach(aggregatedEngineParameters.getExecutorParameterMap()::remove); + schemaParamKeysToRemove.forEach(aggregatedEngineParameters.getContextParameters().getSchemaParameters() + .getSchemaHelperParameterMap()::remove); + } - final Map keyInfoMap = - ModelService.getModel(AxKeyInformation.class).getKeyInfoMap(); - final Map schemasMap = - ModelService.getModel(AxContextSchemas.class).getSchemasMap(); - final Map eventMap = ModelService.getModel(AxEvents.class).getEventMap(); - final Map albumsMap = - ModelService.getModel(AxContextAlbums.class).getAlbumsMap(); - final Map taskMap = ModelService.getModel(AxTasks.class).getTaskMap(); - final Map policyMap = ModelService.getModel(AxPolicies.class).getPolicyMap(); + private void handleAxConceptsRemoval(List keyInfoKeystoRetain, + List schemaKeystoRetain, List eventKeystoRetain, + List albumKeystoRetain, List taskKeystoRetain, + List policyKeystoRetain, ApexMain main) { + final AxPolicyModel policyModel = main.getActivator().getPolicyModel(); + final List keyInfoKeystoRemove = policyModel.getKeyInformation().getKeyInfoMap().keySet() + .stream().filter(key -> !keyInfoKeystoRetain.contains(key)).collect(Collectors.toList()); + final List schemaKeystoRemove = policyModel.getSchemas().getSchemasMap().keySet().stream() + .filter(key -> !schemaKeystoRetain.contains(key)).collect(Collectors.toList()); + final List eventKeystoRemove = policyModel.getEvents().getEventMap().keySet().stream() + .filter(key -> !eventKeystoRetain.contains(key)).collect(Collectors.toList()); + final List albumKeystoRemove = policyModel.getAlbums().getAlbumsMap().keySet().stream() + .filter(key -> !albumKeystoRetain.contains(key)).collect(Collectors.toList()); + final List taskKeystoRemove = policyModel.getTasks().getTaskMap().keySet().stream() + .filter(key -> !taskKeystoRetain.contains(key)).collect(Collectors.toList()); + final List policyKeystoRemove = policyModel.getPolicies().getPolicyMap().keySet().stream() + .filter(key -> !policyKeystoRetain.contains(key)).collect(Collectors.toList()); - keyInfoKeystoRemove.forEach(keyInfoMap::remove); - schemaKeystoRemove.forEach(schemasMap::remove); - eventKeystoRemove.forEach(eventMap::remove); - albumKeystoRemove.forEach(albumsMap::remove); - taskKeystoRemove.forEach(taskMap::remove); - policyKeystoRemove.forEach(policyMap::remove); - } + final Map keyInfoMap = ModelService.getModel(AxKeyInformation.class).getKeyInfoMap(); + final Map schemasMap = + ModelService.getModel(AxContextSchemas.class).getSchemasMap(); + final Map eventMap = ModelService.getModel(AxEvents.class).getEventMap(); + final Map albumsMap = + ModelService.getModel(AxContextAlbums.class).getAlbumsMap(); + final Map taskMap = ModelService.getModel(AxTasks.class).getTaskMap(); + final Map policyMap = ModelService.getModel(AxPolicies.class).getPolicyMap(); + + keyInfoKeystoRemove.forEach(keyInfoMap::remove); + schemaKeystoRemove.forEach(schemasMap::remove); + eventKeystoRemove.forEach(eventMap::remove); + albumKeystoRemove.forEach(albumsMap::remove); + taskKeystoRemove.forEach(taskMap::remove); + policyKeystoRemove.forEach(policyMap::remove); } - private Map initiateApexEngineForPolicies(List policies) + private void initiateApexEngineForPolicies(List policies) throws ApexStarterException { - Map mainMap = new LinkedHashMap<>(); + Map failedPoliciesMainMap = new LinkedHashMap<>(); for (ToscaPolicy policy : policies) { String policyName = policy.getIdentifier().getName(); final StandardCoder standardCoder = new StandardCoder(); @@ -243,14 +249,24 @@ public class ApexEngineHandler { } final String[] apexArgs = {"-p", file.getAbsolutePath()}; LOGGER.info("Starting apex engine for policy {}", policy.getIdentifier()); - try { - ApexMain apexMain = new ApexMain(apexArgs); - mainMap.put(policy.getIdentifier(), apexMain); - } catch (Exception e) { - LOGGER.error("Execution of policy {} failed", policy.getIdentifier(), e); + ApexMain apexMain = new ApexMain(apexArgs); + if (apexMain.isAlive()) { + apexMainMap.put(policy.getIdentifier(), apexMain); + } else { + failedPoliciesMainMap.put(policy.getIdentifier(), apexMain); + LOGGER.error("Execution of policy {} failed", policy.getIdentifier()); + } + } + if (apexMainMap.isEmpty()) { + ModelService.clear(); + ParameterService.clear(); + throw new ApexStarterException("Apex Engine failed to start."); + } else if (failedPoliciesMainMap.size() > 0) { + updateModelAndParameterServices(failedPoliciesMainMap); + if (failedPoliciesMainMap.size() == policies.size()) { + throw new ApexStarterException("Updating the APEX engine with new policies failed."); } } - return mainMap; } /** -- cgit 1.2.3-korg