Loading src/policy/src/main/java/org/etsi/tfs/policy/PolicyServiceImpl.java +230 −192 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package org.etsi.tfs.policy; import static org.etsi.tfs.policy.common.ApplicationProperties.*; import io.smallrye.mutiny.Multi; import io.smallrye.mutiny.Uni; import io.smallrye.mutiny.groups.UniJoin; Loading @@ -38,6 +40,7 @@ import org.etsi.tfs.policy.context.model.Constraint; import org.etsi.tfs.policy.context.model.ConstraintCustom; import org.etsi.tfs.policy.context.model.ConstraintTypeCustom; import org.etsi.tfs.policy.context.model.ServiceConfig; import org.etsi.tfs.policy.context.model.ServiceId; import org.etsi.tfs.policy.device.DeviceService; import org.etsi.tfs.policy.model.BooleanOperator; import org.etsi.tfs.policy.model.PolicyRule; Loading @@ -64,8 +67,7 @@ import org.jboss.logging.Logger; public class PolicyServiceImpl implements PolicyService { private static final Logger LOGGER = Logger.getLogger(PolicyServiceImpl.class); private static final String INVALID_MESSAGE = "%s is invalid."; private static final String VALID_MESSAGE = "%s is valid."; private static final int POLICY_EVALUATION_TIMEOUT = 5; private static final int ACCEPTABLE_NUMBER_OF_ALARMS = 3; private static final int MONITORING_WINDOW_IN_SECONDS = 5; Loading @@ -74,39 +76,6 @@ public class PolicyServiceImpl implements PolicyService { // Temporary solution for not calling the same rpc more than it's needed private static int noAlarms = 0; private static final PolicyRuleState INSERTED_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_INSERTED, "Successfully entered to INSERTED state"); private static final PolicyRuleState VALIDATED_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_VALIDATED, "Successfully transitioned to VALIDATED state"); private static final PolicyRuleState PROVISIONED_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_PROVISIONED, "Successfully transitioned from VALIDATED to PROVISIONED state"); private static final PolicyRuleState ACTIVE_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_ACTIVE, "Successfully transitioned from PROVISIONED to ACTIVE state"); private static final PolicyRuleState ENFORCED_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_ENFORCED, "Successfully transitioned from ACTIVE to ENFORCED state"); private static final PolicyRuleState INEFFECTIVE_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_INEFFECTIVE, "Transitioned from ENFORCED to INEFFECTIVE state"); private static final PolicyRuleState EFFECTIVE_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_EFFECTIVE, "Successfully transitioned from ENFORCED to EFFECTIVE state"); private static final PolicyRuleState UPDATED_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_UPDATED, "Successfully entered to UPDATED state"); private static final PolicyRuleState REMOVED_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_REMOVED, "Successfully entered to REMOVED state"); private final ContextService contextService; private final MonitoringService monitoringService; private final ServiceService serviceService; Loading Loading @@ -176,12 +145,21 @@ public class PolicyServiceImpl implements PolicyService { return isServiceValid .onItem() .transform( isService -> { isService -> constructPolicyStateBasedOnCriteria( isService, serviceId, policyRuleService, policyRuleBasic)); } private PolicyRuleState constructPolicyStateBasedOnCriteria( Boolean isService, ServiceId serviceId, PolicyRuleService policyRuleService, PolicyRuleBasic policyRuleBasic) { if (!isService) { var policyRuleState = new PolicyRuleState( PolicyRuleStateEnum.POLICY_FAILED, String.format(INVALID_MESSAGE, serviceId)); PolicyRuleStateEnum.POLICY_FAILED, String.format(INVALID_MESSAGE, serviceId)); return policyRuleState; } Loading @@ -198,48 +176,41 @@ public class PolicyServiceImpl implements PolicyService { "Invalid PolicyRuleConditions in PolicyRule with ID: %s", policyRuleBasic.getPolicyRuleId())); return policyRuleState; } else { } return setPolicyRuleOnContextAndReturnState(policyRule, policyRuleService, alarmDescriptorList); } private PolicyRuleState setPolicyRuleOnContextAndReturnState( PolicyRule policyRule, PolicyRuleService policyRuleService, List<AlarmDescriptor> alarmDescriptorList) { contextService .setPolicyRule(policyRule) .subscribe() .with( policyId -> { setPolicyRuleServiceToContext( policyRuleService, VALIDATED_POLICYRULE_STATE); policyId -> startMonitoringBasedOnAlarmDescriptors( policyId, policyRuleService, alarmDescriptorList)); return VALIDATED_POLICYRULE_STATE; } private void startMonitoringBasedOnAlarmDescriptors( String policyId, PolicyRuleService policyRuleService, List<AlarmDescriptor> alarmDescriptorList) { setPolicyRuleServiceToContext(policyRuleService, VALIDATED_POLICYRULE_STATE); noAlarms = 0; // Create an alarmIds list that contains the promised ids returned from // setKpiAlarm List<Uni<String>> alarmIds = new ArrayList<Uni<String>>(); for (AlarmDescriptor alarmDescriptor : alarmDescriptorList) { LOGGER.infof("alarmDescriptor:"); LOGGER.infof(alarmDescriptor.toString()); alarmIds.add(monitoringService.setKpiAlarm(alarmDescriptor)); } // Transform the alarmIds into promised alarms returned from the // getAlarmResponseStream List<Multi<AlarmResponse>> alarmResponseStreamList = new ArrayList<>(); for (Uni<String> alarmId : alarmIds) { alarmResponseStreamList.add( alarmId .onItem() .transformToMulti( id -> { alarmPolicyRuleServiceMap.put(id, policyRuleService); List<Uni<String>> alarmIds = createAlarmList(alarmDescriptorList); // setAllarmtomonitoring get back alarmid // TODO: Create infinite subscription var alarmSubscription = new AlarmSubscription(id, 259200, 5000); return monitoringService.getAlarmResponseStream( alarmSubscription); })); } List<Multi<AlarmResponse>> alarmResponseStreamList = transformAlarmIds(alarmIds, policyRuleService); // Merge the promised alarms into one stream (Multi Object) final var multi = Multi.createBy().merging().streams(alarmResponseStreamList); setPolicyRuleServiceToContext( policyRuleService, PROVISIONED_POLICYRULE_STATE); final var multi = Multi.createBy().merging().streams(alarmResponseStreamList); setPolicyRuleServiceToContext(policyRuleService, PROVISIONED_POLICYRULE_STATE); subscriptionList.put(policyId, monitorAlarmResponseForService(multi)); Loading @@ -247,10 +218,49 @@ public class PolicyServiceImpl implements PolicyService { // TODO: Redesign evaluation of action // evaluateAction(policyRule, alarmDescriptorList, multi); }); return VALIDATED_POLICYRULE_STATE; } }); /** * Transform the alarmIds into promised alarms returned from the getAlarmResponseStream * * @param alarmIds the list of alarm ids * @param policyRuleService the policy rule service * @return */ private List<Multi<AlarmResponse>> transformAlarmIds( List<Uni<String>> alarmIds, PolicyRuleService policyRuleService) { List<Multi<AlarmResponse>> alarmResponseStreamList = new ArrayList<>(); for (Uni<String> alarmId : alarmIds) { Multi<AlarmResponse> alarmResponseStream = alarmId.onItem().transformToMulti(id -> setPolicyMonitor(policyRuleService, id)); alarmResponseStreamList.add(alarmResponseStream); } return alarmResponseStreamList; } private Multi<AlarmResponse> setPolicyMonitor(PolicyRuleService policyRuleService, String id) { alarmPolicyRuleServiceMap.put(id, policyRuleService); // TODO: Create infinite subscription var alarmSubscription = new AlarmSubscription(id, 259200, 5000); return monitoringService.getAlarmResponseStream(alarmSubscription); } /** * Create an alarmIds list that contains the promised ids returned from setKpiAlarm * * @param alarmDescriptorList the list of alarm descriptors * @return the list of alarm descriptors */ public List<Uni<String>> createAlarmList(List<AlarmDescriptor> alarmDescriptorList) { List<Uni<String>> alarmIds = new ArrayList<Uni<String>>(); for (AlarmDescriptor alarmDescriptor : alarmDescriptorList) { LOGGER.infof("alarmDescriptor:"); LOGGER.infof(alarmDescriptor.toString()); alarmIds.add(monitoringService.setKpiAlarm(alarmDescriptor)); } return alarmIds; } @Override Loading Loading @@ -280,15 +290,19 @@ public class PolicyServiceImpl implements PolicyService { return areDevicesValid .onItem() .transform( areDevices -> { .transform(areDevices -> areDeviceOnContext(areDevices, policyRuleDevice, policyRuleBasic)); } private PolicyRuleState areDeviceOnContext( List<Boolean> areDevices, PolicyRuleDevice policyRuleDevice, PolicyRuleBasic policyRuleBasic) { if (areDevices.contains(false)) { var policyRuleState = new PolicyRuleState( PolicyRuleStateEnum.POLICY_FAILED, String.format( INVALID_MESSAGE, policyRuleDevice.getPolicyRuleBasic().getPolicyRuleId())); INVALID_MESSAGE, policyRuleDevice.getPolicyRuleBasic().getPolicyRuleId())); return policyRuleState; } Loading @@ -307,47 +321,71 @@ public class PolicyServiceImpl implements PolicyService { return policyRuleState; } contextService.setPolicyRule(policyRule).subscribe().with(x -> {}); contextService .setPolicyRule(policyRule) .subscribe() .with( policyId -> { startMonitoringBasedOnAlarmDescriptors( policyId, policyRuleDevice, alarmDescriptorList); }); return VALIDATED_POLICYRULE_STATE; } private void startMonitoringBasedOnAlarmDescriptors( String policyId, PolicyRuleDevice policyRuleDevice, List<AlarmDescriptor> alarmDescriptorList) { setPolicyRuleDeviceToContext(policyRuleDevice, VALIDATED_POLICYRULE_STATE); noAlarms = 0; List<Uni<String>> alarmIds = new ArrayList<Uni<String>>(); for (AlarmDescriptor alarmDescriptor : alarmDescriptorList) { LOGGER.infof("alarmDescriptor:"); LOGGER.infof(alarmDescriptor.toString()); alarmIds.add(monitoringService.setKpiAlarm(alarmDescriptor)); List<Uni<String>> alarmIds = getAlarmIds(alarmDescriptorList); List<Multi<AlarmResponse>> alarmResponseStreamList = getAlarmResponse(alarmIds, policyRuleDevice); // Merge the promised alarms into one stream (Multi Object) final var multi = Multi.createBy().merging().streams(alarmResponseStreamList); setPolicyRuleDeviceToContext(policyRuleDevice, PROVISIONED_POLICYRULE_STATE); subscriptionList.put(policyId, monitorAlarmResponseForDevice(multi)); // TODO: Resubscribe to the stream, if it has ended // TODO: Redesign evaluation of action // evaluateAction(policyRule, alarmDescriptorList, multi); } private List<Multi<AlarmResponse>> getAlarmResponse( List<Uni<String>> alarmIds, PolicyRuleDevice policyRuleDevice) { // Transform the alarmIds into promised alarms returned from the // getAlarmResponseStream List<Multi<AlarmResponse>> alarmResponseStreamList = new ArrayList<>(); for (Uni<String> alarmId : alarmIds) { alarmResponseStreamList.add( alarmId .onItem() .transformToMulti( id -> { alarmId.onItem().transformToMulti(id -> setPolicyMonitoringDevice(policyRuleDevice, id))); } return alarmResponseStreamList; } private Multi<AlarmResponse> setPolicyMonitoringDevice( PolicyRuleDevice policyRuleDevice, String id) { alarmPolicyRuleDeviceMap.put(id, policyRuleDevice); // TODO: Create infinite subscription var alarmSubscription = new AlarmSubscription(id, 259200, 5000); return monitoringService.getAlarmResponseStream(alarmSubscription); })); } // Merge the promised alarms into one stream (Multi Object) final var multi = Multi.createBy().merging().streams(alarmResponseStreamList); setPolicyRuleDeviceToContext(policyRuleDevice, PROVISIONED_POLICYRULE_STATE); monitorAlarmResponseForDevice(multi); // TODO: Resubscribe to the stream, if it has ended // TODO: Redesign evaluation of action // evaluateAction(policyRule, alarmDescriptorList, multi); return VALIDATED_POLICYRULE_STATE; }); private List<Uni<String>> getAlarmIds(List<AlarmDescriptor> alarmDescriptorList) { List<Uni<String>> alarmIds = new ArrayList<Uni<String>>(); for (AlarmDescriptor alarmDescriptor : alarmDescriptorList) { LOGGER.infof("alarmDescriptor:"); LOGGER.infof(alarmDescriptor.toString()); alarmIds.add(monitoringService.setKpiAlarm(alarmDescriptor)); } return alarmIds; } @Override Loading Loading @@ -435,10 +473,10 @@ public class PolicyServiceImpl implements PolicyService { final var getPolicyRule = contextService.getPolicyRule(policyRuleId); return getPolicyRule .onItem() .transform( policyRule -> { return getPolicyRule.onItem().transform(policyRule -> removePolicyFromContext(policyRule)); } private PolicyRuleState removePolicyFromContext(PolicyRule policyRule) { var policyRuleBasic = policyRule.getPolicyRuleType().getPolicyRuleBasic(); String policyId = policyRuleBasic.getPolicyRuleId(); Loading @@ -453,14 +491,14 @@ public class PolicyServiceImpl implements PolicyService { .with( tmp -> LOGGER.infof( "DeletePolicy with id: " + VALID_MESSAGE, policyRuleBasic.getPolicyRuleId())); "DeletePolicy with id: " + VALID_MESSAGE, policyRuleBasic.getPolicyRuleId())); contextService.removePolicyRule(policyId).subscribe().with(x -> {}); subscriptionList.get(policyId).cancel(); // TODO: When the Map doesn't contains the policyId we should throw an exception? if (subscriptionList.contains(policyId)) subscriptionList.get(policyId).cancel(); return policyRuleBasic.getPolicyRuleState(); }); } private Uni<List<Boolean>> returnInvalidDeviceIds(List<String> deviceIds) { Loading Loading @@ -514,8 +552,8 @@ public class PolicyServiceImpl implements PolicyService { }); } private void monitorAlarmResponseForDevice(Multi<AlarmResponse> multi) { multi private Cancellable monitorAlarmResponseForDevice(Multi<AlarmResponse> multi) { return multi .subscribe() .with( alarmResponse -> { Loading src/policy/src/main/java/org/etsi/tfs/policy/common/ApplicationProperties.java 0 → 100644 +59 −0 Original line number Diff line number Diff line /* * Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.etsi.tfs.policy.common; import org.etsi.tfs.policy.model.PolicyRuleState; import org.etsi.tfs.policy.model.PolicyRuleStateEnum; public class ApplicationProperties { public static final String INVALID_MESSAGE = "%s is invalid."; public static final String VALID_MESSAGE = "%s is valid."; public static final PolicyRuleState INSERTED_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_INSERTED, "Successfully entered to INSERTED state"); public static final PolicyRuleState VALIDATED_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_VALIDATED, "Successfully transitioned to VALIDATED state"); public static final PolicyRuleState PROVISIONED_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_PROVISIONED, "Successfully transitioned from VALIDATED to PROVISIONED state"); public static final PolicyRuleState ACTIVE_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_ACTIVE, "Successfully transitioned from PROVISIONED to ACTIVE state"); public static final PolicyRuleState ENFORCED_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_ENFORCED, "Successfully transitioned from ACTIVE to ENFORCED state"); public static final PolicyRuleState INEFFECTIVE_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_INEFFECTIVE, "Transitioned from ENFORCED to INEFFECTIVE state"); public static final PolicyRuleState EFFECTIVE_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_EFFECTIVE, "Successfully transitioned from ENFORCED to EFFECTIVE state"); public static final PolicyRuleState UPDATED_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_UPDATED, "Successfully entered to UPDATED state"); public static final PolicyRuleState REMOVED_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_REMOVED, "Successfully entered to REMOVED state"); } src/policy/src/main/java/org/etsi/tfs/policy/model/PolicyRuleBasic.java +1 −1 Original line number Diff line number Diff line Loading @@ -64,7 +64,7 @@ public class PolicyRuleBasic { this.booleanOperator = BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_UNDEFINED; this.policyRuleActions = new ArrayList<PolicyRuleAction>(); this.isValid = false; this.exceptionMessage = e.toString(); this.exceptionMessage = e.getMessage(); } } Loading src/policy/src/main/java/org/etsi/tfs/policy/model/PolicyRuleDevice.java +1 −1 Original line number Diff line number Diff line Loading @@ -40,7 +40,7 @@ public class PolicyRuleDevice { this.policyRuleBasic = policyRuleBasic; this.deviceIds = new ArrayList<String>(); this.isValid = false; this.exceptionMessage = e.toString(); this.exceptionMessage = e.getMessage(); } } Loading src/policy/src/main/java/org/etsi/tfs/policy/model/PolicyRuleService.java +1 −1 Original line number Diff line number Diff line Loading @@ -50,7 +50,7 @@ public class PolicyRuleService { this.serviceId = new ServiceId("", ""); this.deviceIds = new ArrayList<String>(); this.isValid = false; this.exceptionMessage = e.toString(); this.exceptionMessage = e.getMessage(); } } Loading Loading
src/policy/src/main/java/org/etsi/tfs/policy/PolicyServiceImpl.java +230 −192 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package org.etsi.tfs.policy; import static org.etsi.tfs.policy.common.ApplicationProperties.*; import io.smallrye.mutiny.Multi; import io.smallrye.mutiny.Uni; import io.smallrye.mutiny.groups.UniJoin; Loading @@ -38,6 +40,7 @@ import org.etsi.tfs.policy.context.model.Constraint; import org.etsi.tfs.policy.context.model.ConstraintCustom; import org.etsi.tfs.policy.context.model.ConstraintTypeCustom; import org.etsi.tfs.policy.context.model.ServiceConfig; import org.etsi.tfs.policy.context.model.ServiceId; import org.etsi.tfs.policy.device.DeviceService; import org.etsi.tfs.policy.model.BooleanOperator; import org.etsi.tfs.policy.model.PolicyRule; Loading @@ -64,8 +67,7 @@ import org.jboss.logging.Logger; public class PolicyServiceImpl implements PolicyService { private static final Logger LOGGER = Logger.getLogger(PolicyServiceImpl.class); private static final String INVALID_MESSAGE = "%s is invalid."; private static final String VALID_MESSAGE = "%s is valid."; private static final int POLICY_EVALUATION_TIMEOUT = 5; private static final int ACCEPTABLE_NUMBER_OF_ALARMS = 3; private static final int MONITORING_WINDOW_IN_SECONDS = 5; Loading @@ -74,39 +76,6 @@ public class PolicyServiceImpl implements PolicyService { // Temporary solution for not calling the same rpc more than it's needed private static int noAlarms = 0; private static final PolicyRuleState INSERTED_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_INSERTED, "Successfully entered to INSERTED state"); private static final PolicyRuleState VALIDATED_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_VALIDATED, "Successfully transitioned to VALIDATED state"); private static final PolicyRuleState PROVISIONED_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_PROVISIONED, "Successfully transitioned from VALIDATED to PROVISIONED state"); private static final PolicyRuleState ACTIVE_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_ACTIVE, "Successfully transitioned from PROVISIONED to ACTIVE state"); private static final PolicyRuleState ENFORCED_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_ENFORCED, "Successfully transitioned from ACTIVE to ENFORCED state"); private static final PolicyRuleState INEFFECTIVE_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_INEFFECTIVE, "Transitioned from ENFORCED to INEFFECTIVE state"); private static final PolicyRuleState EFFECTIVE_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_EFFECTIVE, "Successfully transitioned from ENFORCED to EFFECTIVE state"); private static final PolicyRuleState UPDATED_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_UPDATED, "Successfully entered to UPDATED state"); private static final PolicyRuleState REMOVED_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_REMOVED, "Successfully entered to REMOVED state"); private final ContextService contextService; private final MonitoringService monitoringService; private final ServiceService serviceService; Loading Loading @@ -176,12 +145,21 @@ public class PolicyServiceImpl implements PolicyService { return isServiceValid .onItem() .transform( isService -> { isService -> constructPolicyStateBasedOnCriteria( isService, serviceId, policyRuleService, policyRuleBasic)); } private PolicyRuleState constructPolicyStateBasedOnCriteria( Boolean isService, ServiceId serviceId, PolicyRuleService policyRuleService, PolicyRuleBasic policyRuleBasic) { if (!isService) { var policyRuleState = new PolicyRuleState( PolicyRuleStateEnum.POLICY_FAILED, String.format(INVALID_MESSAGE, serviceId)); PolicyRuleStateEnum.POLICY_FAILED, String.format(INVALID_MESSAGE, serviceId)); return policyRuleState; } Loading @@ -198,48 +176,41 @@ public class PolicyServiceImpl implements PolicyService { "Invalid PolicyRuleConditions in PolicyRule with ID: %s", policyRuleBasic.getPolicyRuleId())); return policyRuleState; } else { } return setPolicyRuleOnContextAndReturnState(policyRule, policyRuleService, alarmDescriptorList); } private PolicyRuleState setPolicyRuleOnContextAndReturnState( PolicyRule policyRule, PolicyRuleService policyRuleService, List<AlarmDescriptor> alarmDescriptorList) { contextService .setPolicyRule(policyRule) .subscribe() .with( policyId -> { setPolicyRuleServiceToContext( policyRuleService, VALIDATED_POLICYRULE_STATE); policyId -> startMonitoringBasedOnAlarmDescriptors( policyId, policyRuleService, alarmDescriptorList)); return VALIDATED_POLICYRULE_STATE; } private void startMonitoringBasedOnAlarmDescriptors( String policyId, PolicyRuleService policyRuleService, List<AlarmDescriptor> alarmDescriptorList) { setPolicyRuleServiceToContext(policyRuleService, VALIDATED_POLICYRULE_STATE); noAlarms = 0; // Create an alarmIds list that contains the promised ids returned from // setKpiAlarm List<Uni<String>> alarmIds = new ArrayList<Uni<String>>(); for (AlarmDescriptor alarmDescriptor : alarmDescriptorList) { LOGGER.infof("alarmDescriptor:"); LOGGER.infof(alarmDescriptor.toString()); alarmIds.add(monitoringService.setKpiAlarm(alarmDescriptor)); } // Transform the alarmIds into promised alarms returned from the // getAlarmResponseStream List<Multi<AlarmResponse>> alarmResponseStreamList = new ArrayList<>(); for (Uni<String> alarmId : alarmIds) { alarmResponseStreamList.add( alarmId .onItem() .transformToMulti( id -> { alarmPolicyRuleServiceMap.put(id, policyRuleService); List<Uni<String>> alarmIds = createAlarmList(alarmDescriptorList); // setAllarmtomonitoring get back alarmid // TODO: Create infinite subscription var alarmSubscription = new AlarmSubscription(id, 259200, 5000); return monitoringService.getAlarmResponseStream( alarmSubscription); })); } List<Multi<AlarmResponse>> alarmResponseStreamList = transformAlarmIds(alarmIds, policyRuleService); // Merge the promised alarms into one stream (Multi Object) final var multi = Multi.createBy().merging().streams(alarmResponseStreamList); setPolicyRuleServiceToContext( policyRuleService, PROVISIONED_POLICYRULE_STATE); final var multi = Multi.createBy().merging().streams(alarmResponseStreamList); setPolicyRuleServiceToContext(policyRuleService, PROVISIONED_POLICYRULE_STATE); subscriptionList.put(policyId, monitorAlarmResponseForService(multi)); Loading @@ -247,10 +218,49 @@ public class PolicyServiceImpl implements PolicyService { // TODO: Redesign evaluation of action // evaluateAction(policyRule, alarmDescriptorList, multi); }); return VALIDATED_POLICYRULE_STATE; } }); /** * Transform the alarmIds into promised alarms returned from the getAlarmResponseStream * * @param alarmIds the list of alarm ids * @param policyRuleService the policy rule service * @return */ private List<Multi<AlarmResponse>> transformAlarmIds( List<Uni<String>> alarmIds, PolicyRuleService policyRuleService) { List<Multi<AlarmResponse>> alarmResponseStreamList = new ArrayList<>(); for (Uni<String> alarmId : alarmIds) { Multi<AlarmResponse> alarmResponseStream = alarmId.onItem().transformToMulti(id -> setPolicyMonitor(policyRuleService, id)); alarmResponseStreamList.add(alarmResponseStream); } return alarmResponseStreamList; } private Multi<AlarmResponse> setPolicyMonitor(PolicyRuleService policyRuleService, String id) { alarmPolicyRuleServiceMap.put(id, policyRuleService); // TODO: Create infinite subscription var alarmSubscription = new AlarmSubscription(id, 259200, 5000); return monitoringService.getAlarmResponseStream(alarmSubscription); } /** * Create an alarmIds list that contains the promised ids returned from setKpiAlarm * * @param alarmDescriptorList the list of alarm descriptors * @return the list of alarm descriptors */ public List<Uni<String>> createAlarmList(List<AlarmDescriptor> alarmDescriptorList) { List<Uni<String>> alarmIds = new ArrayList<Uni<String>>(); for (AlarmDescriptor alarmDescriptor : alarmDescriptorList) { LOGGER.infof("alarmDescriptor:"); LOGGER.infof(alarmDescriptor.toString()); alarmIds.add(monitoringService.setKpiAlarm(alarmDescriptor)); } return alarmIds; } @Override Loading Loading @@ -280,15 +290,19 @@ public class PolicyServiceImpl implements PolicyService { return areDevicesValid .onItem() .transform( areDevices -> { .transform(areDevices -> areDeviceOnContext(areDevices, policyRuleDevice, policyRuleBasic)); } private PolicyRuleState areDeviceOnContext( List<Boolean> areDevices, PolicyRuleDevice policyRuleDevice, PolicyRuleBasic policyRuleBasic) { if (areDevices.contains(false)) { var policyRuleState = new PolicyRuleState( PolicyRuleStateEnum.POLICY_FAILED, String.format( INVALID_MESSAGE, policyRuleDevice.getPolicyRuleBasic().getPolicyRuleId())); INVALID_MESSAGE, policyRuleDevice.getPolicyRuleBasic().getPolicyRuleId())); return policyRuleState; } Loading @@ -307,47 +321,71 @@ public class PolicyServiceImpl implements PolicyService { return policyRuleState; } contextService.setPolicyRule(policyRule).subscribe().with(x -> {}); contextService .setPolicyRule(policyRule) .subscribe() .with( policyId -> { startMonitoringBasedOnAlarmDescriptors( policyId, policyRuleDevice, alarmDescriptorList); }); return VALIDATED_POLICYRULE_STATE; } private void startMonitoringBasedOnAlarmDescriptors( String policyId, PolicyRuleDevice policyRuleDevice, List<AlarmDescriptor> alarmDescriptorList) { setPolicyRuleDeviceToContext(policyRuleDevice, VALIDATED_POLICYRULE_STATE); noAlarms = 0; List<Uni<String>> alarmIds = new ArrayList<Uni<String>>(); for (AlarmDescriptor alarmDescriptor : alarmDescriptorList) { LOGGER.infof("alarmDescriptor:"); LOGGER.infof(alarmDescriptor.toString()); alarmIds.add(monitoringService.setKpiAlarm(alarmDescriptor)); List<Uni<String>> alarmIds = getAlarmIds(alarmDescriptorList); List<Multi<AlarmResponse>> alarmResponseStreamList = getAlarmResponse(alarmIds, policyRuleDevice); // Merge the promised alarms into one stream (Multi Object) final var multi = Multi.createBy().merging().streams(alarmResponseStreamList); setPolicyRuleDeviceToContext(policyRuleDevice, PROVISIONED_POLICYRULE_STATE); subscriptionList.put(policyId, monitorAlarmResponseForDevice(multi)); // TODO: Resubscribe to the stream, if it has ended // TODO: Redesign evaluation of action // evaluateAction(policyRule, alarmDescriptorList, multi); } private List<Multi<AlarmResponse>> getAlarmResponse( List<Uni<String>> alarmIds, PolicyRuleDevice policyRuleDevice) { // Transform the alarmIds into promised alarms returned from the // getAlarmResponseStream List<Multi<AlarmResponse>> alarmResponseStreamList = new ArrayList<>(); for (Uni<String> alarmId : alarmIds) { alarmResponseStreamList.add( alarmId .onItem() .transformToMulti( id -> { alarmId.onItem().transformToMulti(id -> setPolicyMonitoringDevice(policyRuleDevice, id))); } return alarmResponseStreamList; } private Multi<AlarmResponse> setPolicyMonitoringDevice( PolicyRuleDevice policyRuleDevice, String id) { alarmPolicyRuleDeviceMap.put(id, policyRuleDevice); // TODO: Create infinite subscription var alarmSubscription = new AlarmSubscription(id, 259200, 5000); return monitoringService.getAlarmResponseStream(alarmSubscription); })); } // Merge the promised alarms into one stream (Multi Object) final var multi = Multi.createBy().merging().streams(alarmResponseStreamList); setPolicyRuleDeviceToContext(policyRuleDevice, PROVISIONED_POLICYRULE_STATE); monitorAlarmResponseForDevice(multi); // TODO: Resubscribe to the stream, if it has ended // TODO: Redesign evaluation of action // evaluateAction(policyRule, alarmDescriptorList, multi); return VALIDATED_POLICYRULE_STATE; }); private List<Uni<String>> getAlarmIds(List<AlarmDescriptor> alarmDescriptorList) { List<Uni<String>> alarmIds = new ArrayList<Uni<String>>(); for (AlarmDescriptor alarmDescriptor : alarmDescriptorList) { LOGGER.infof("alarmDescriptor:"); LOGGER.infof(alarmDescriptor.toString()); alarmIds.add(monitoringService.setKpiAlarm(alarmDescriptor)); } return alarmIds; } @Override Loading Loading @@ -435,10 +473,10 @@ public class PolicyServiceImpl implements PolicyService { final var getPolicyRule = contextService.getPolicyRule(policyRuleId); return getPolicyRule .onItem() .transform( policyRule -> { return getPolicyRule.onItem().transform(policyRule -> removePolicyFromContext(policyRule)); } private PolicyRuleState removePolicyFromContext(PolicyRule policyRule) { var policyRuleBasic = policyRule.getPolicyRuleType().getPolicyRuleBasic(); String policyId = policyRuleBasic.getPolicyRuleId(); Loading @@ -453,14 +491,14 @@ public class PolicyServiceImpl implements PolicyService { .with( tmp -> LOGGER.infof( "DeletePolicy with id: " + VALID_MESSAGE, policyRuleBasic.getPolicyRuleId())); "DeletePolicy with id: " + VALID_MESSAGE, policyRuleBasic.getPolicyRuleId())); contextService.removePolicyRule(policyId).subscribe().with(x -> {}); subscriptionList.get(policyId).cancel(); // TODO: When the Map doesn't contains the policyId we should throw an exception? if (subscriptionList.contains(policyId)) subscriptionList.get(policyId).cancel(); return policyRuleBasic.getPolicyRuleState(); }); } private Uni<List<Boolean>> returnInvalidDeviceIds(List<String> deviceIds) { Loading Loading @@ -514,8 +552,8 @@ public class PolicyServiceImpl implements PolicyService { }); } private void monitorAlarmResponseForDevice(Multi<AlarmResponse> multi) { multi private Cancellable monitorAlarmResponseForDevice(Multi<AlarmResponse> multi) { return multi .subscribe() .with( alarmResponse -> { Loading
src/policy/src/main/java/org/etsi/tfs/policy/common/ApplicationProperties.java 0 → 100644 +59 −0 Original line number Diff line number Diff line /* * Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.etsi.tfs.policy.common; import org.etsi.tfs.policy.model.PolicyRuleState; import org.etsi.tfs.policy.model.PolicyRuleStateEnum; public class ApplicationProperties { public static final String INVALID_MESSAGE = "%s is invalid."; public static final String VALID_MESSAGE = "%s is valid."; public static final PolicyRuleState INSERTED_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_INSERTED, "Successfully entered to INSERTED state"); public static final PolicyRuleState VALIDATED_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_VALIDATED, "Successfully transitioned to VALIDATED state"); public static final PolicyRuleState PROVISIONED_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_PROVISIONED, "Successfully transitioned from VALIDATED to PROVISIONED state"); public static final PolicyRuleState ACTIVE_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_ACTIVE, "Successfully transitioned from PROVISIONED to ACTIVE state"); public static final PolicyRuleState ENFORCED_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_ENFORCED, "Successfully transitioned from ACTIVE to ENFORCED state"); public static final PolicyRuleState INEFFECTIVE_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_INEFFECTIVE, "Transitioned from ENFORCED to INEFFECTIVE state"); public static final PolicyRuleState EFFECTIVE_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_EFFECTIVE, "Successfully transitioned from ENFORCED to EFFECTIVE state"); public static final PolicyRuleState UPDATED_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_UPDATED, "Successfully entered to UPDATED state"); public static final PolicyRuleState REMOVED_POLICYRULE_STATE = new PolicyRuleState( PolicyRuleStateEnum.POLICY_REMOVED, "Successfully entered to REMOVED state"); }
src/policy/src/main/java/org/etsi/tfs/policy/model/PolicyRuleBasic.java +1 −1 Original line number Diff line number Diff line Loading @@ -64,7 +64,7 @@ public class PolicyRuleBasic { this.booleanOperator = BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_UNDEFINED; this.policyRuleActions = new ArrayList<PolicyRuleAction>(); this.isValid = false; this.exceptionMessage = e.toString(); this.exceptionMessage = e.getMessage(); } } Loading
src/policy/src/main/java/org/etsi/tfs/policy/model/PolicyRuleDevice.java +1 −1 Original line number Diff line number Diff line Loading @@ -40,7 +40,7 @@ public class PolicyRuleDevice { this.policyRuleBasic = policyRuleBasic; this.deviceIds = new ArrayList<String>(); this.isValid = false; this.exceptionMessage = e.toString(); this.exceptionMessage = e.getMessage(); } } Loading
src/policy/src/main/java/org/etsi/tfs/policy/model/PolicyRuleService.java +1 −1 Original line number Diff line number Diff line Loading @@ -50,7 +50,7 @@ public class PolicyRuleService { this.serviceId = new ServiceId("", ""); this.deviceIds = new ArrayList<String>(); this.isValid = false; this.exceptionMessage = e.toString(); this.exceptionMessage = e.getMessage(); } } Loading