From e058c5393e92e15a16df6ea51657fc8fec3b31c7 Mon Sep 17 00:00:00 2001 From: Ram Narayan Balaji <81347100+yan-3005@users.noreply.github.com> Date: Tue, 23 Sep 2025 17:58:41 +0530 Subject: [PATCH] MigrationFix for duplicate ViewAll in OrganizationPolicy (#23524) --- .../migration/mysql/v1910/Migration.java | 19 +++++ .../migration/postgres/v1910/Migration.java | 19 +++++ .../migration/utils/v160/MigrationUtil.java | 2 +- .../migration/utils/v1910/MigrationUtil.java | 69 +++++++++++++++++++ 4 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 openmetadata-service/src/main/java/org/openmetadata/service/migration/mysql/v1910/Migration.java create mode 100644 openmetadata-service/src/main/java/org/openmetadata/service/migration/postgres/v1910/Migration.java create mode 100644 openmetadata-service/src/main/java/org/openmetadata/service/migration/utils/v1910/MigrationUtil.java diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/migration/mysql/v1910/Migration.java b/openmetadata-service/src/main/java/org/openmetadata/service/migration/mysql/v1910/Migration.java new file mode 100644 index 00000000000..0ef5996848d --- /dev/null +++ b/openmetadata-service/src/main/java/org/openmetadata/service/migration/mysql/v1910/Migration.java @@ -0,0 +1,19 @@ +package org.openmetadata.service.migration.mysql.v1910; + +import lombok.SneakyThrows; +import org.openmetadata.service.migration.api.MigrationProcessImpl; +import org.openmetadata.service.migration.utils.MigrationFile; +import org.openmetadata.service.migration.utils.v1910.MigrationUtil; + +public class Migration extends MigrationProcessImpl { + + public Migration(MigrationFile migrationFile) { + super(migrationFile); + } + + @Override + @SneakyThrows + public void runDataMigration() { + MigrationUtil.removeDuplicateViewAllRules(collectionDAO); + } +} diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/migration/postgres/v1910/Migration.java b/openmetadata-service/src/main/java/org/openmetadata/service/migration/postgres/v1910/Migration.java new file mode 100644 index 00000000000..1cb6b4f91e4 --- /dev/null +++ b/openmetadata-service/src/main/java/org/openmetadata/service/migration/postgres/v1910/Migration.java @@ -0,0 +1,19 @@ +package org.openmetadata.service.migration.postgres.v1910; + +import lombok.SneakyThrows; +import org.openmetadata.service.migration.api.MigrationProcessImpl; +import org.openmetadata.service.migration.utils.MigrationFile; +import org.openmetadata.service.migration.utils.v1910.MigrationUtil; + +public class Migration extends MigrationProcessImpl { + + public Migration(MigrationFile migrationFile) { + super(migrationFile); + } + + @Override + @SneakyThrows + public void runDataMigration() { + MigrationUtil.removeDuplicateViewAllRules(collectionDAO); + } +} diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/migration/utils/v160/MigrationUtil.java b/openmetadata-service/src/main/java/org/openmetadata/service/migration/utils/v160/MigrationUtil.java index 87b7dab3336..28e372eb01f 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/migration/utils/v160/MigrationUtil.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/migration/utils/v160/MigrationUtil.java @@ -37,7 +37,7 @@ public class MigrationUtil { Policy organizationPolicy = repository.findByName("OrganizationPolicy", Include.NON_DELETED); boolean noViewAllRule = true; for (Rule rule : organizationPolicy.getRules()) { - if (rule.getName().equals("OrganizationPolicy-View-All-Rule")) { + if (rule.getName().equals("OrganizationPolicy-ViewAll-Rule")) { noViewAllRule = false; break; } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/migration/utils/v1910/MigrationUtil.java b/openmetadata-service/src/main/java/org/openmetadata/service/migration/utils/v1910/MigrationUtil.java new file mode 100644 index 00000000000..fda7eb7e8c3 --- /dev/null +++ b/openmetadata-service/src/main/java/org/openmetadata/service/migration/utils/v1910/MigrationUtil.java @@ -0,0 +1,69 @@ +package org.openmetadata.service.migration.utils.v1910; + +import java.util.ArrayList; +import java.util.List; +import lombok.extern.slf4j.Slf4j; +import org.openmetadata.schema.entity.policies.Policy; +import org.openmetadata.schema.entity.policies.accessControl.Rule; +import org.openmetadata.schema.type.Include; +import org.openmetadata.schema.utils.JsonUtils; +import org.openmetadata.service.Entity; +import org.openmetadata.service.exception.EntityNotFoundException; +import org.openmetadata.service.jdbi3.CollectionDAO; +import org.openmetadata.service.jdbi3.PolicyRepository; + +@Slf4j +public class MigrationUtil { + + public static void removeDuplicateViewAllRules(CollectionDAO collectionDAO) { + PolicyRepository repository = (PolicyRepository) Entity.getEntityRepository(Entity.POLICY); + try { + Policy organizationPolicy = repository.findByName("OrganizationPolicy", Include.NON_DELETED); + List rules = organizationPolicy.getRules(); + if (rules == null) { + LOG.info("OrganizationPolicy has no rules defined, skipping duplicate removal"); + return; + } + + List viewAllRules = new ArrayList<>(); + List otherRules = new ArrayList<>(); + + for (Rule rule : rules) { + if (rule.getName() != null && rule.getName().equals("OrganizationPolicy-ViewAll-Rule")) { + viewAllRules.add(rule); + } else { + otherRules.add(rule); + } + } + + if (viewAllRules.size() <= 1) { + LOG.info("No duplicate ViewAll rules found, skipping removal"); + return; + } + + LOG.info("Found {} duplicate ViewAll rules, keeping the first one", viewAllRules.size()); + + // Keep only the first ViewAll rule and all other rules + List updatedRules = new ArrayList<>(otherRules); + updatedRules.add(viewAllRules.get(0)); + + organizationPolicy.setRules(updatedRules); + + collectionDAO + .policyDAO() + .update( + organizationPolicy.getId(), + organizationPolicy.getFullyQualifiedName(), + JsonUtils.pojoToJson(organizationPolicy)); + + LOG.info( + "Successfully removed {} duplicate ViewAll rules from OrganizationPolicy", + viewAllRules.size() - 1); + } catch (EntityNotFoundException ex) { + LOG.warn("OrganizationPolicy not found, skipping duplicate ViewAll rule removal"); + } catch (Exception ex) { + LOG.error( + "Error removing duplicate ViewAll rules from OrganizationPolicy: {}", ex.getMessage()); + } + } +}