diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/events/subscription/AlertUtil.java b/openmetadata-service/src/main/java/org/openmetadata/service/events/subscription/AlertUtil.java index 7b37ea1e9c0..3f4de8ed417 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/events/subscription/AlertUtil.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/events/subscription/AlertUtil.java @@ -29,6 +29,7 @@ import java.util.stream.Collectors; import javax.ws.rs.BadRequestException; import lombok.extern.slf4j.Slf4j; import org.openmetadata.common.utils.CommonUtil; +import org.openmetadata.schema.api.events.AlertFilteringInput; import org.openmetadata.schema.api.events.CreateEventSubscription; import org.openmetadata.schema.entity.events.Argument; import org.openmetadata.schema.entity.events.ArgumentsInput; @@ -98,7 +99,7 @@ public final class AlertUtil { public static boolean shouldTriggerAlert(String entityType, FilteringRules config) { if (config == null) { - return false; + return true; } // OpenMetadataWide Setting apply to all ChangeEvents if (config.getResources().size() == 1 && config.getResources().get(0).equals("all")) { @@ -186,92 +187,71 @@ public final class AlertUtil { } public static FilteringRules validateAndBuildFilteringConditions( - CreateEventSubscription createEventSubscription) { - // Resource Validation - List finalRules = new ArrayList<>(); - List actions = new ArrayList<>(); - List resource = createEventSubscription.getResources(); + List resource, + CreateEventSubscription.AlertType alertType, + AlertFilteringInput input) { if (resource.size() > 1) { throw new BadRequestException( "Only one resource can be specified. Multiple resources are not supported."); } - if (createEventSubscription - .getAlertType() - .equals(CreateEventSubscription.AlertType.NOTIFICATION)) { + if (alertType.equals(CreateEventSubscription.AlertType.NOTIFICATION)) { Map supportedFilters = - EventsSubscriptionRegistry.getEntityNotificationDescriptor(resource.get(0)) - .getSupportedFilters() - .stream() - .collect( - Collectors.toMap( - EventFilterRule::getName, - eventFilterRule -> - JsonUtils.deepCopy(eventFilterRule, EventFilterRule.class))); + buildFilteringRulesMap( + EventsSubscriptionRegistry.getEntityNotificationDescriptor(resource.get(0)) + .getSupportedFilters()); // Input validation - if (createEventSubscription.getInput() != null) { - listOrEmpty(createEventSubscription.getInput().getFilters()) - .forEach( - argumentsInput -> - finalRules.add( - getFilterRule( - supportedFilters, - argumentsInput, - buildInputArgumentsMap(argumentsInput)))); + if (input != null) { + return new FilteringRules() + .withResources(resource) + .withRules(buildRulesList(supportedFilters, input.getFilters())) + .withActions(Collections.emptyList()); } - return new FilteringRules() - .withResources(resource) - .withRules(finalRules) - .withActions(Collections.emptyList()); - } else if (createEventSubscription - .getAlertType() - .equals(CreateEventSubscription.AlertType.OBSERVABILITY)) { + } else if (alertType.equals(CreateEventSubscription.AlertType.OBSERVABILITY)) { // Build a Map of Entity Filter Name Map supportedFilters = - EventsSubscriptionRegistry.getObservabilityDescriptor(resource.get(0)) - .getSupportedFilters() - .stream() - .collect( - Collectors.toMap( - EventFilterRule::getName, - eventFilterRule -> - JsonUtils.deepCopy(eventFilterRule, EventFilterRule.class))); + buildFilteringRulesMap( + EventsSubscriptionRegistry.getObservabilityDescriptor(resource.get(0)) + .getSupportedFilters()); + // Build a Map of Actions Map supportedActions = - EventsSubscriptionRegistry.getObservabilityDescriptor(resource.get(0)) - .getSupportedActions() - .stream() - .collect( - Collectors.toMap( - EventFilterRule::getName, - eventFilterRule -> - JsonUtils.deepCopy(eventFilterRule, EventFilterRule.class))); + buildFilteringRulesMap( + EventsSubscriptionRegistry.getObservabilityDescriptor(resource.get(0)) + .getSupportedActions()); // Input validation - if (createEventSubscription.getInput() != null) { - listOrEmpty(createEventSubscription.getInput().getFilters()) - .forEach( - argumentsInput -> - finalRules.add( - getFilterRule( - supportedFilters, - argumentsInput, - buildInputArgumentsMap(argumentsInput)))); - listOrEmpty(createEventSubscription.getInput().getActions()) - .forEach( - argumentsInput -> - actions.add( - getFilterRule( - supportedActions, - argumentsInput, - buildInputArgumentsMap(argumentsInput)))); + if (input != null) { + return new FilteringRules() + .withResources(resource) + .withRules(buildRulesList(supportedFilters, input.getFilters())) + .withActions(buildRulesList(supportedActions, input.getActions())); } - return new FilteringRules() - .withResources(resource) - .withRules(finalRules) - .withActions(actions); } - return null; + return new FilteringRules() + .withResources(resource) + .withRules(Collections.emptyList()) + .withActions(Collections.emptyList()); + } + + private static Map buildFilteringRulesMap( + List filteringRules) { + return filteringRules.stream() + .collect( + Collectors.toMap( + EventFilterRule::getName, + eventFilterRule -> JsonUtils.deepCopy(eventFilterRule, EventFilterRule.class))); + } + + private static List buildRulesList( + Map lookUp, List input) { + List rules = new ArrayList<>(); + listOrEmpty(input) + .forEach( + argumentsInput -> + rules.add( + getFilterRule(lookUp, argumentsInput, buildInputArgumentsMap(argumentsInput)))); + return rules; } private static Map> buildInputArgumentsMap(ArgumentsInput filter) { diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/EventSubscriptionRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/EventSubscriptionRepository.java index ffc549e939e..389b77c9093 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/EventSubscriptionRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/EventSubscriptionRepository.java @@ -13,11 +13,17 @@ package org.openmetadata.service.jdbi3; +import static org.openmetadata.common.utils.CommonUtil.listOrEmpty; +import static org.openmetadata.common.utils.CommonUtil.nullOrEmpty; +import static org.openmetadata.service.events.subscription.AlertUtil.validateAndBuildFilteringConditions; + import java.util.ArrayList; import java.util.Comparator; import java.util.List; import lombok.extern.slf4j.Slf4j; import org.openmetadata.schema.api.events.CreateEventSubscription; +import org.openmetadata.schema.entity.events.Argument; +import org.openmetadata.schema.entity.events.ArgumentsInput; import org.openmetadata.schema.entity.events.EventFilterRule; import org.openmetadata.schema.entity.events.EventSubscription; import org.openmetadata.schema.entity.events.SubscriptionDestination; @@ -66,6 +72,30 @@ public class EventSubscriptionRepository extends EntityRepository + listOrEmpty(filter.getArguments()).sort(Comparator.comparing(Argument::getName))); + listOrEmpty(entity.getInput().getActions()) + .forEach( + filter -> + listOrEmpty(filter.getArguments()).sort(Comparator.comparing(Argument::getName))); + } + + if (update && !nullOrEmpty(entity.getFilteringRules())) { + entity.setFilteringRules( + validateAndBuildFilteringConditions( + entity.getFilteringRules().getResources(), entity.getAlertType(), entity.getInput())); + } + validateFilterRules(entity); } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/resources/events/subscription/EventSubscriptionResource.java b/openmetadata-service/src/main/java/org/openmetadata/service/resources/events/subscription/EventSubscriptionResource.java index 153cf49b268..f2bc5f5982a 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/resources/events/subscription/EventSubscriptionResource.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/resources/events/subscription/EventSubscriptionResource.java @@ -120,10 +120,10 @@ public class EventSubscriptionResource @Override public void initialize(OpenMetadataApplicationConfig config) { try { - repository.initSeedDataFromResources(); EventsSubscriptionRegistry.initialize( listOrEmpty(EventSubscriptionResource.getNotificationsFilterDescriptors()), listOrEmpty(EventSubscriptionResource.getObservabilityFilterDescriptors())); + repository.initSeedDataFromResources(); initializeEventSubscriptions(); } catch (Exception ex) { // Starting application should not fail @@ -599,7 +599,9 @@ public class EventSubscriptionResource .withTrigger(create.getTrigger()) .withEnabled(create.getEnabled()) .withBatchSize(create.getBatchSize()) - .withFilteringRules(validateAndBuildFilteringConditions(create)) + .withFilteringRules( + validateAndBuildFilteringConditions( + create.getResources(), create.getAlertType(), create.getInput())) .withDestinations(getSubscriptions(create.getDestinations())) .withProvider(create.getProvider()) .withRetries(create.getRetries()) diff --git a/openmetadata-service/src/test/java/org/openmetadata/service/resources/events/EventSubscriptionResourceTest.java b/openmetadata-service/src/test/java/org/openmetadata/service/resources/events/EventSubscriptionResourceTest.java index 19342d360b9..78843b9374a 100644 --- a/openmetadata-service/src/test/java/org/openmetadata/service/resources/events/EventSubscriptionResourceTest.java +++ b/openmetadata-service/src/test/java/org/openmetadata/service/resources/events/EventSubscriptionResourceTest.java @@ -281,7 +281,10 @@ public class EventSubscriptionResourceTest change, "filteringRules", createdAlert.getFilteringRules(), - AlertUtil.validateAndBuildFilteringConditions(genericWebhookActionRequest)); + AlertUtil.validateAndBuildFilteringConditions( + genericWebhookActionRequest.getResources(), + genericWebhookActionRequest.getAlertType(), + genericWebhookActionRequest.getInput())); createdAlert = updateAndCheckEntity( @@ -299,7 +302,10 @@ public class EventSubscriptionResourceTest change, "filteringRules", createdAlert.getFilteringRules(), - AlertUtil.validateAndBuildFilteringConditions(genericWebhookActionRequest)); + AlertUtil.validateAndBuildFilteringConditions( + genericWebhookActionRequest.getResources(), + genericWebhookActionRequest.getAlertType(), + genericWebhookActionRequest.getInput())); createdAlert = updateAndCheckEntity( @@ -317,7 +323,10 @@ public class EventSubscriptionResourceTest change, "filteringRules", createdAlert.getFilteringRules(), - AlertUtil.validateAndBuildFilteringConditions(genericWebhookActionRequest)); + AlertUtil.validateAndBuildFilteringConditions( + genericWebhookActionRequest.getResources(), + genericWebhookActionRequest.getAlertType(), + genericWebhookActionRequest.getInput())); createdAlert = updateAndCheckEntity(