Skip to content
Snippets Groups Projects
Commit d96c938f authored by Konstantinos Poulakakis's avatar Konstantinos Poulakakis
Browse files

refactor: add exception handling mechanism on addPolicyService.

parent d4fe3d25
No related branches found
No related tags found
2 merge requests!235Release TeraFlowSDN 3.0,!208Resolve "(UBI) Upgrade Policy Quarkus to v.3"
...@@ -31,6 +31,8 @@ import java.util.HashMap; ...@@ -31,6 +31,8 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import org.etsi.tfs.policy.context.ContextService; import org.etsi.tfs.policy.context.ContextService;
import org.etsi.tfs.policy.context.model.ConfigActionEnum; import org.etsi.tfs.policy.context.model.ConfigActionEnum;
import org.etsi.tfs.policy.context.model.ConfigRule; import org.etsi.tfs.policy.context.model.ConfigRule;
...@@ -42,6 +44,8 @@ import org.etsi.tfs.policy.context.model.ConstraintTypeCustom; ...@@ -42,6 +44,8 @@ import org.etsi.tfs.policy.context.model.ConstraintTypeCustom;
import org.etsi.tfs.policy.context.model.ServiceConfig; import org.etsi.tfs.policy.context.model.ServiceConfig;
import org.etsi.tfs.policy.context.model.ServiceId; import org.etsi.tfs.policy.context.model.ServiceId;
import org.etsi.tfs.policy.device.DeviceService; import org.etsi.tfs.policy.device.DeviceService;
import org.etsi.tfs.policy.exception.ExternalServiceFailureException;
import org.etsi.tfs.policy.exception.NewException;
import org.etsi.tfs.policy.model.BooleanOperator; import org.etsi.tfs.policy.model.BooleanOperator;
import org.etsi.tfs.policy.model.PolicyRule; import org.etsi.tfs.policy.model.PolicyRule;
import org.etsi.tfs.policy.model.PolicyRuleAction; import org.etsi.tfs.policy.model.PolicyRuleAction;
...@@ -143,14 +147,17 @@ public class PolicyServiceImpl implements PolicyService { ...@@ -143,14 +147,17 @@ public class PolicyServiceImpl implements PolicyService {
final var isServiceValid = policyRuleConditionValidator.isServiceIdValid(serviceId, deviceIds); final var isServiceValid = policyRuleConditionValidator.isServiceIdValid(serviceId, deviceIds);
return isServiceValid return isServiceValid
.onFailure()
.transform(failure -> new ExternalServiceFailureException(failure.getMessage()))
.onItem() .onItem()
.transform( .transform(
isService -> isService ->
constructPolicyStateBasedOnCriteria( constructPolicyStateBasedOnCriteria(
isService, serviceId, policyRuleService, policyRuleBasic)); isService, serviceId, policyRuleService, policyRuleBasic))
.flatMap(Function.identity());
} }
private PolicyRuleState constructPolicyStateBasedOnCriteria( private Uni<PolicyRuleState> constructPolicyStateBasedOnCriteria(
Boolean isService, Boolean isService,
ServiceId serviceId, ServiceId serviceId,
PolicyRuleService policyRuleService, PolicyRuleService policyRuleService,
...@@ -161,7 +168,7 @@ public class PolicyServiceImpl implements PolicyService { ...@@ -161,7 +168,7 @@ public class PolicyServiceImpl implements PolicyService {
new PolicyRuleState( new PolicyRuleState(
PolicyRuleStateEnum.POLICY_FAILED, String.format(INVALID_MESSAGE, serviceId)); PolicyRuleStateEnum.POLICY_FAILED, String.format(INVALID_MESSAGE, serviceId));
return policyRuleState; return Uni.createFrom().item(policyRuleState);
} }
final var policyRuleTypeService = new PolicyRuleTypeService(policyRuleService); final var policyRuleTypeService = new PolicyRuleTypeService(policyRuleService);
...@@ -175,24 +182,28 @@ public class PolicyServiceImpl implements PolicyService { ...@@ -175,24 +182,28 @@ public class PolicyServiceImpl implements PolicyService {
String.format( String.format(
"Invalid PolicyRuleConditions in PolicyRule with ID: %s", "Invalid PolicyRuleConditions in PolicyRule with ID: %s",
policyRuleBasic.getPolicyRuleId())); policyRuleBasic.getPolicyRuleId()));
return policyRuleState; return Uni.createFrom().item(policyRuleState);
} }
return setPolicyRuleOnContextAndReturnState(policyRule, policyRuleService, alarmDescriptorList); return setPolicyRuleOnContextAndReturnState(policyRule, policyRuleService, alarmDescriptorList);
} }
private PolicyRuleState setPolicyRuleOnContextAndReturnState( private Uni<PolicyRuleState> setPolicyRuleOnContextAndReturnState(
PolicyRule policyRule, PolicyRule policyRule,
PolicyRuleService policyRuleService, PolicyRuleService policyRuleService,
List<AlarmDescriptor> alarmDescriptorList) { List<AlarmDescriptor> alarmDescriptorList) {
contextService return contextService
.setPolicyRule(policyRule) .setPolicyRule(policyRule)
.subscribe() .onFailure()
.with( .transform(failure -> new NewException(failure.getMessage()))
policyId -> .onItem()
startMonitoringBasedOnAlarmDescriptors( .transform(
policyId, policyRuleService, alarmDescriptorList)); policyId -> {
return VALIDATED_POLICYRULE_STATE; startMonitoringBasedOnAlarmDescriptors(
policyId, policyRuleService, alarmDescriptorList);
return VALIDATED_POLICYRULE_STATE;
});
} }
private void startMonitoringBasedOnAlarmDescriptors( private void startMonitoringBasedOnAlarmDescriptors(
......
package org.etsi.tfs.policy.exception;
public class ExternalServiceFailureException extends RuntimeException {
public ExternalServiceFailureException(String message, Exception e) {
super(message, e);
}
public ExternalServiceFailureException(String message) {
super(message);
}
}
package org.etsi.tfs.policy.exception;
import io.grpc.Metadata;
import io.grpc.ServerCall;
import io.grpc.Status;
import io.grpc.StatusRuntimeException;
import io.quarkus.grpc.ExceptionHandler;
import io.quarkus.grpc.ExceptionHandlerProvider;
import jakarta.enterprise.context.ApplicationScoped;
@ApplicationScoped
public class GeneralExceptionHandler implements ExceptionHandlerProvider {
@Override
public <ReqT, RespT> ExceptionHandler<ReqT, RespT> createHandler(
ServerCall.Listener<ReqT> listener, ServerCall<ReqT, RespT> serverCall, Metadata metadata) {
return new HelloExceptionHandler<>(listener, serverCall, metadata);
}
@Override
public Throwable transform(Throwable t) {
if (t instanceof ExternalServiceFailureException) {
return new StatusRuntimeException(Status.INTERNAL.withDescription(t.getMessage()));
}else if (t instanceof NewException) {
return new StatusRuntimeException(Status.UNIMPLEMENTED.withDescription(t.getMessage()));
} else {
return ExceptionHandlerProvider.toStatusException(t, true);
}
}
private static class HelloExceptionHandler<A, B> extends ExceptionHandler<A, B> {
public HelloExceptionHandler(
ServerCall.Listener<A> listener, ServerCall<A, B> call, Metadata metadata) {
super(listener, call, metadata);
}
@Override
protected void handleException(Throwable t, ServerCall<A, B> call, Metadata metadata) {
StatusRuntimeException sre =
(StatusRuntimeException) ExceptionHandlerProvider.toStatusException(t, true);
Metadata trailers = sre.getTrailers() != null ? sre.getTrailers() : metadata;
call.close(sre.getStatus(), trailers);
}
}
}
package org.etsi.tfs.policy.exception;
public class NewException extends RuntimeException {
public NewException(String message, Exception e) {
super(message, e);
}
public NewException(String message) {
super(message);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment