Commit 92c9cc24 authored by Lluis Gifre Renom's avatar Lluis Gifre Renom
Browse files

Merge branch 'feat/112-ubi-refactor-policy' into 'develop'

Resolve "(UBI) Refactor Policy"

Closes #112

See merge request !197
parents 2b473b13 7697bae0
Loading
Loading
Loading
Loading
+226 −158
Original line number Diff line number Diff line
@@ -40,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;
@@ -144,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;
        }
@@ -166,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));

@@ -215,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
@@ -248,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;
        }
@@ -275,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
@@ -403,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();

@@ -421,8 +491,7 @@ 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 -> {});

@@ -430,7 +499,6 @@ public class PolicyServiceImpl implements PolicyService {
        if (subscriptionList.contains(policyId)) subscriptionList.get(policyId).cancel();

        return policyRuleBasic.getPolicyRuleState();
                        });
    }

    private Uni<List<Boolean>> returnInvalidDeviceIds(List<String> deviceIds) {
@@ -484,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 -> {
+2 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import org.etsi.tfs.policy.model.PolicyRuleCondition;
import org.etsi.tfs.policy.model.PolicyRuleDevice;
import org.etsi.tfs.policy.model.PolicyRuleState;
import org.etsi.tfs.policy.model.PolicyRuleStateEnum;
import org.etsi.tfs.policy.monitoring.MonitoringService;
import org.etsi.tfs.policy.monitoring.model.IntegerKpiValue;
import org.etsi.tfs.policy.monitoring.model.KpiValue;
import org.junit.jupiter.api.BeforeAll;
@@ -57,6 +58,7 @@ class PolicyAddDeviceTest {

    @InjectMock ContextService contextService;

    @InjectMock MonitoringService monitoringService;
    static PolicyRuleBasic policyRuleBasic;
    static PolicyRuleDevice policyRuleDevice;

+3 −0
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ import org.etsi.tfs.policy.model.PolicyRuleState;
import org.etsi.tfs.policy.model.PolicyRuleStateEnum;
import org.etsi.tfs.policy.model.PolicyRuleType;
import org.etsi.tfs.policy.model.PolicyRuleTypeService;
import org.etsi.tfs.policy.monitoring.MonitoringService;
import org.etsi.tfs.policy.monitoring.model.IntegerKpiValue;
import org.etsi.tfs.policy.monitoring.model.KpiValue;
import org.junit.jupiter.api.BeforeAll;
@@ -58,6 +59,8 @@ class PolicyDeleteServiceTest {
    @Inject PolicyServiceImpl policyService;
    @InjectMock ContextService contextService;

    @InjectMock MonitoringService monitoringService;

    static PolicyRuleBasic policyRuleBasic;
    static PolicyRuleService policyRuleService;

+3 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ import org.etsi.tfs.policy.model.PolicyRuleCondition;
import org.etsi.tfs.policy.model.PolicyRuleDevice;
import org.etsi.tfs.policy.model.PolicyRuleState;
import org.etsi.tfs.policy.model.PolicyRuleStateEnum;
import org.etsi.tfs.policy.monitoring.MonitoringService;
import org.etsi.tfs.policy.monitoring.model.IntegerKpiValue;
import org.etsi.tfs.policy.monitoring.model.KpiValue;
import org.junit.jupiter.api.BeforeAll;
@@ -54,6 +55,8 @@ class PolicyUpdateDeviceTest {

    @InjectMock PolicyRuleConditionValidator policyRuleConditionValidator;

    @InjectMock MonitoringService monitoringService;

    static PolicyRuleBasic policyRuleBasic;
    static PolicyRuleDevice policyRuleDevice;