From 680ace99b3bfc3018b48af973086b51b5fef45f7 Mon Sep 17 00:00:00 2001 From: Sriharsha Chintalapani Date: Thu, 31 Oct 2024 11:48:46 -0700 Subject: [PATCH] Fix #18332: Do not consolidate changes for Parent Entities (#18333) * Fix #18332: Do not consolidate changes for Parent Entities * Fix #18332: Do not consolidate changes for Parent Entities * added no data placeholder when no tags there * fix failing playwright test due to consolidation changes and added the missing services * Fix tests * Fix parent entity change notifications * Fix tests * Fix parent entity change notifications * Fix tests * Fix tests --------- Co-authored-by: Ashish Gupta --- .../java/org/openmetadata/service/Entity.java | 20 ++ .../jdbi3/APICollectionRepository.java | 1 + .../service/jdbi3/APIServiceRepository.java | 1 + .../jdbi3/ClassificationRepository.java | 1 + .../jdbi3/DashboardServiceRepository.java | 1 + .../service/jdbi3/DatabaseRepository.java | 1 + .../jdbi3/DatabaseSchemaRepository.java | 1 + .../jdbi3/DatabaseServiceRepository.java | 1 + .../service/jdbi3/DomainRepository.java | 1 + .../service/jdbi3/EntityRepository.java | 6 +- .../service/jdbi3/GlossaryRepository.java | 1 + .../jdbi3/MessagingServiceRepository.java | 1 + .../jdbi3/MetadataServiceRepository.java | 1 + .../jdbi3/MlModelServiceRepository.java | 1 + .../jdbi3/PipelineServiceRepository.java | 1 + .../jdbi3/SearchServiceRepository.java | 1 + .../jdbi3/StorageServiceRepository.java | 1 + .../service/jdbi3/TeamRepository.java | 1 + .../service/jdbi3/TestSuiteRepository.java | 1 + .../service/search/SearchRepository.java | 34 +- .../service/resources/EntityResourceTest.java | 295 ++++++++++++------ .../resources/domains/DomainResourceTest.java | 24 +- .../glossary/GlossaryResourceTest.java | 17 +- .../resources/teams/TeamResourceTest.java | 34 +- .../e2e/Pages/GlossaryVersionPage.spec.ts | 2 +- .../ui/playwright/e2e/Pages/Tags.spec.ts | 5 +- .../ClassificationVersionPage.spec.ts | 6 +- .../ServiceEntityVersionPage.spec.ts | 6 +- .../main/resources/ui/playwright/utils/tag.ts | 2 +- .../AsyncSelectList/AsyncSelectList.tsx | 15 +- .../ui/src/locale/languages/de-de.json | 1 + .../ui/src/locale/languages/en-us.json | 1 + .../ui/src/locale/languages/es-es.json | 1 + .../ui/src/locale/languages/fr-fr.json | 1 + .../ui/src/locale/languages/he-he.json | 1 + .../ui/src/locale/languages/ja-jp.json | 1 + .../ui/src/locale/languages/nl-nl.json | 1 + .../ui/src/locale/languages/pr-pr.json | 1 + .../ui/src/locale/languages/pt-br.json | 1 + .../ui/src/locale/languages/ru-ru.json | 1 + .../ui/src/locale/languages/zh-cn.json | 1 + 41 files changed, 331 insertions(+), 163 deletions(-) diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/Entity.java b/openmetadata-service/src/main/java/org/openmetadata/service/Entity.java index e9bf591be56..498cc407e3c 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/Entity.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/Entity.java @@ -243,6 +243,7 @@ public final class Entity { public static final String DOCUMENT = "document"; // ServiceType - Service Entity name map static final Map SERVICE_TYPE_ENTITY_MAP = new EnumMap<>(ServiceType.class); + public static final List PARENT_ENTITY_TYPES = new ArrayList<>(); static { SERVICE_TYPE_ENTITY_MAP.put(ServiceType.DATABASE, DATABASE_SERVICE); @@ -254,6 +255,25 @@ public final class Entity { SERVICE_TYPE_ENTITY_MAP.put(ServiceType.STORAGE, STORAGE_SERVICE); SERVICE_TYPE_ENTITY_MAP.put(ServiceType.SEARCH, SEARCH_SERVICE); SERVICE_TYPE_ENTITY_MAP.put(ServiceType.API, API_SERVICE); + PARENT_ENTITY_TYPES.addAll( + listOf( + DATABASE_SERVICE, + DASHBOARD_SERVICE, + MESSAGING_SERVICE, + MLMODEL_SERVICE, + PIPELINE_SERVICE, + API_SERVICE, + API_COLLCECTION, + STORAGE_SERVICE, + METADATA_SERVICE, + SEARCH_SERVICE, + DATABASE, + DATABASE_SCHEMA, + CLASSIFICATION, + GLOSSARY, + DOMAIN, + TEST_SUITE, + TEAM)); } private Entity() {} diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/APICollectionRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/APICollectionRepository.java index 8c6551c0988..d4cbda5233a 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/APICollectionRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/APICollectionRepository.java @@ -39,6 +39,7 @@ public class APICollectionRepository extends EntityRepository { "", ""); supportsSearch = true; + parent = true; } @Override diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/APIServiceRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/APIServiceRepository.java index 5d6f9f61993..6ea4a0f692c 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/APIServiceRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/APIServiceRepository.java @@ -16,5 +16,6 @@ public class APIServiceRepository extends ServiceEntityRepository { quoteFqn = true; supportsSearch = true; renameAllowed = true; + parent = true; } @Override diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DashboardServiceRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DashboardServiceRepository.java index 8bf66d6e20c..63811a6df5b 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DashboardServiceRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DashboardServiceRepository.java @@ -33,5 +33,6 @@ public class DashboardServiceRepository "", ServiceType.DASHBOARD); supportsSearch = true; + parent = true; } } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseRepository.java index d37fbd24202..00593019b22 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseRepository.java @@ -69,6 +69,7 @@ public class DatabaseRepository extends EntityRepository { "", ""); supportsSearch = true; + parent = true; fieldFetchers.put("name", this::fetchAndSetService); } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseSchemaRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseSchemaRepository.java index 82cca116660..528ef99baa1 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseSchemaRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseSchemaRepository.java @@ -74,6 +74,7 @@ public class DatabaseSchemaRepository extends EntityRepository { "", ""); supportsSearch = true; + parent = true; } @Override diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseServiceRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseServiceRepository.java index fc4440c9525..104f9d846e2 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseServiceRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseServiceRepository.java @@ -60,6 +60,7 @@ public class DatabaseServiceRepository "", ServiceType.DATABASE); supportsSearch = true; + parent = true; } @Override diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DomainRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DomainRepository.java index a7e6e54efcf..707c9f3f97a 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DomainRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DomainRepository.java @@ -46,6 +46,7 @@ public class DomainRepository extends EntityRepository { UPDATE_FIELDS, UPDATE_FIELDS); supportsSearch = true; + parent = true; } @Override diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/EntityRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/EntityRepository.java index 3dceb1c75f1..e71a280314b 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/EntityRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/EntityRepository.java @@ -260,6 +260,7 @@ public abstract class EntityRepository { @Getter protected final Fields putFields; protected boolean supportsSearch = false; + @Getter protected boolean parent = false; protected final Map, Fields>> fieldFetchers = new HashMap<>(); protected EntityRepository( @@ -3276,7 +3277,9 @@ public abstract class EntityRepository { private boolean consolidateChanges(T original, T updated, Operation operation) { // If user is the same and the new update is with in the user session timeout - return original.getVersion() > 0.1 // First update on an entity that + return !parent // Parent entity shouldn't consolidate changes, as we need ChangeDescription to + // propagate to children + && original.getVersion() > 0.1 // First update on an entity that && operation == Operation.PATCH && !Boolean.TRUE.equals(original.getDeleted()) // Entity is not soft deleted && !operation.isDelete() // Operation must be an update @@ -3285,6 +3288,7 @@ public abstract class EntityRepository { .equals(updated.getUpdatedBy()) // Must be updated by the same user && updated.getUpdatedAt() - original.getUpdatedAt() <= sessionTimeoutMillis; // With in session timeout + // changes to children } private T getPreviousVersion(T original) { diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/GlossaryRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/GlossaryRepository.java index 675bbacc467..3701ef0a7ae 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/GlossaryRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/GlossaryRepository.java @@ -89,6 +89,7 @@ public class GlossaryRepository extends EntityRepository { quoteFqn = true; supportsSearch = true; renameAllowed = true; + parent = true; } @Override diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/MessagingServiceRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/MessagingServiceRepository.java index 9f3554b92c1..2d757f9ac87 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/MessagingServiceRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/MessagingServiceRepository.java @@ -34,5 +34,6 @@ public class MessagingServiceRepository UPDATE_FIELDS, ServiceType.MESSAGING); supportsSearch = true; + parent = true; } } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/MetadataServiceRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/MetadataServiceRepository.java index 5f9094143e5..d0cc53ba923 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/MetadataServiceRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/MetadataServiceRepository.java @@ -19,5 +19,6 @@ public class MetadataServiceRepository UPDATE_FIELDS, ServiceType.METADATA); supportsSearch = true; + parent = true; } } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/MlModelServiceRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/MlModelServiceRepository.java index ecd8d17d09f..0d15888b0a5 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/MlModelServiceRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/MlModelServiceRepository.java @@ -34,5 +34,6 @@ public class MlModelServiceRepository UPDATE_FIELDS, ServiceType.ML_MODEL); supportsSearch = true; + parent = true; } } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/PipelineServiceRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/PipelineServiceRepository.java index e1281c96835..bcadae3b80e 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/PipelineServiceRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/PipelineServiceRepository.java @@ -33,5 +33,6 @@ public class PipelineServiceRepository "", ServiceType.PIPELINE); supportsSearch = true; + parent = true; } } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/SearchServiceRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/SearchServiceRepository.java index b3acc9d2a95..4cd0f5bb09b 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/SearchServiceRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/SearchServiceRepository.java @@ -17,5 +17,6 @@ public class SearchServiceRepository "", ServiceType.SEARCH); supportsSearch = true; + parent = true; } } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/StorageServiceRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/StorageServiceRepository.java index 887d5e6e595..b101cbc193c 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/StorageServiceRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/StorageServiceRepository.java @@ -17,5 +17,6 @@ public class StorageServiceRepository "", ServiceType.STORAGE); supportsSearch = true; + parent = true; } } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TeamRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TeamRepository.java index ee6b3856915..1c169cc8fd3 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TeamRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TeamRepository.java @@ -102,6 +102,7 @@ public class TeamRepository extends EntityRepository { TEAM_UPDATE_FIELDS); this.quoteFqn = true; supportsSearch = true; + parent = true; } @Override diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestSuiteRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestSuiteRepository.java index a582ea55998..84550114bcd 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestSuiteRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestSuiteRepository.java @@ -104,6 +104,7 @@ public class TestSuiteRepository extends EntityRepository { UPDATE_FIELDS); quoteFqn = false; supportsSearch = true; + parent = true; } @Override diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/search/SearchRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/search/SearchRepository.java index 1a39cdc71b6..5cb80c1e85e 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/search/SearchRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/search/SearchRepository.java @@ -449,7 +449,7 @@ public class SearchRepository { Map fieldData = new HashMap<>(); if (changeDescription != null) { - for (FieldChange field : changeDescription.getFieldsAdded()) { + for (FieldChange field : changeDescription.getFieldsDeleted()) { if (inheritableFields.contains(field.getName())) { try { if (field.getName().equals(FIELD_OWNERS)) { @@ -458,24 +458,21 @@ public class SearchRepository { for (EntityReference inheritedOwner : inheritedOwners) { inheritedOwner.setInherited(true); } - fieldData.put("updatedOwners", inheritedOwners); - scriptTxt.append(ADD_OWNERS_SCRIPT); + fieldData.put("deletedOwners", inheritedOwners); + scriptTxt.append(REMOVE_OWNERS_SCRIPT); } else { EntityReference entityReference = - JsonUtils.readValue(field.getNewValue().toString(), EntityReference.class); + JsonUtils.readValue(field.getOldValue().toString(), EntityReference.class); scriptTxt.append( String.format( - PROPAGATE_ENTITY_REFERENCE_FIELD_SCRIPT, - field.getName(), - field.getName(), + REMOVE_PROPAGATED_ENTITY_REFERENCE_FIELD_SCRIPT, field.getName(), field.getName(), field.getName())); - fieldData.put(field.getName(), entityReference); + fieldData.put(field.getName(), JsonUtils.getMap(entityReference)); } } catch (UnhandledServerException e) { - scriptTxt.append( - String.format(PROPAGATE_FIELD_SCRIPT, field.getName(), field.getNewValue())); + scriptTxt.append(String.format(REMOVE_PROPAGATED_FIELD_SCRIPT, field.getName())); } } } @@ -507,7 +504,7 @@ public class SearchRepository { } } } - for (FieldChange field : changeDescription.getFieldsDeleted()) { + for (FieldChange field : changeDescription.getFieldsAdded()) { if (inheritableFields.contains(field.getName())) { try { if (field.getName().equals(FIELD_OWNERS)) { @@ -516,21 +513,24 @@ public class SearchRepository { for (EntityReference inheritedOwner : inheritedOwners) { inheritedOwner.setInherited(true); } - fieldData.put("deletedOwners", inheritedOwners); - scriptTxt.append(REMOVE_OWNERS_SCRIPT); + fieldData.put("updatedOwners", inheritedOwners); + scriptTxt.append(ADD_OWNERS_SCRIPT); } else { EntityReference entityReference = - JsonUtils.readValue(field.getOldValue().toString(), EntityReference.class); + JsonUtils.readValue(field.getNewValue().toString(), EntityReference.class); scriptTxt.append( String.format( - REMOVE_PROPAGATED_ENTITY_REFERENCE_FIELD_SCRIPT, + PROPAGATE_ENTITY_REFERENCE_FIELD_SCRIPT, + field.getName(), + field.getName(), field.getName(), field.getName(), field.getName())); - fieldData.put(field.getName(), JsonUtils.getMap(entityReference)); + fieldData.put(field.getName(), entityReference); } } catch (UnhandledServerException e) { - scriptTxt.append(String.format(REMOVE_PROPAGATED_FIELD_SCRIPT, field.getName())); + scriptTxt.append( + String.format(PROPAGATE_FIELD_SCRIPT, field.getName(), field.getNewValue())); } } } diff --git a/openmetadata-service/src/test/java/org/openmetadata/service/resources/EntityResourceTest.java b/openmetadata-service/src/test/java/org/openmetadata/service/resources/EntityResourceTest.java index 2641ab72e4a..3922e5237e7 100644 --- a/openmetadata-service/src/test/java/org/openmetadata/service/resources/EntityResourceTest.java +++ b/openmetadata-service/src/test/java/org/openmetadata/service/resources/EntityResourceTest.java @@ -1549,13 +1549,24 @@ public abstract class EntityResourceTest fieldDeleted(change, "experts", listOf(USER2.getEntityReference())); domain = updateAndCheckEntity(create, Status.OK, ADMIN_AUTH_HEADERS, MINOR_UPDATE, change); - // Add User2 back as expert using PATCH - // Version 0. 2 - Changes from this PATCH is consolidated with the previous change resulting in - // no change String json = JsonUtils.pojoToJson(domain); domain.withExperts(List.of(USER1.getEntityReference(), USER2.getEntityReference())); - change = getChangeDescription(domain, REVERT); - domain = patchEntityAndCheck(domain, json, ADMIN_AUTH_HEADERS, REVERT, change); + change = getChangeDescription(domain, MINOR_UPDATE); + fieldAdded(change, "experts", listOf(USER2.getEntityReference())); + domain = patchEntityAndCheck(domain, json, ADMIN_AUTH_HEADERS, MINOR_UPDATE, change); - // Remove User2 as expert using PATCH - // Version 0.1 - Changes from this PATCH is consolidated with the previous two changes resulting - // in deletion of USER2 json = JsonUtils.pojoToJson(domain); - change = getChangeDescription(domain, REVERT); + change = getChangeDescription(domain, MINOR_UPDATE); + fieldDeleted(change, "experts", listOf(USER2.getEntityReference())); domain.withExperts(List.of(USER1.getEntityReference())); - patchEntityAndCheck(domain, json, ADMIN_AUTH_HEADERS, REVERT, change); + patchEntityAndCheck(domain, json, ADMIN_AUTH_HEADERS, MINOR_UPDATE, change); } @Test @@ -104,9 +98,9 @@ public class DomainResourceTest extends EntityResourceTest // Changes from this PATCH is consolidated with the previous changes String json = JsonUtils.pojoToJson(domain); domain.withDomainType(DomainType.CONSUMER_ALIGNED); - change = getChangeDescription(domain, CHANGE_CONSOLIDATED); - fieldUpdated(change, "domainType", DomainType.AGGREGATE, DomainType.CONSUMER_ALIGNED); - patchEntityAndCheck(domain, json, ADMIN_AUTH_HEADERS, CHANGE_CONSOLIDATED, change); + change = getChangeDescription(domain, MINOR_UPDATE); + fieldUpdated(change, "domainType", DomainType.SOURCE_ALIGNED, DomainType.CONSUMER_ALIGNED); + patchEntityAndCheck(domain, json, ADMIN_AUTH_HEADERS, MINOR_UPDATE, change); } @Test diff --git a/openmetadata-service/src/test/java/org/openmetadata/service/resources/glossary/GlossaryResourceTest.java b/openmetadata-service/src/test/java/org/openmetadata/service/resources/glossary/GlossaryResourceTest.java index 248bc9b51fb..f6543cdaa50 100644 --- a/openmetadata-service/src/test/java/org/openmetadata/service/resources/glossary/GlossaryResourceTest.java +++ b/openmetadata-service/src/test/java/org/openmetadata/service/resources/glossary/GlossaryResourceTest.java @@ -37,11 +37,11 @@ import static org.openmetadata.schema.type.ProviderType.SYSTEM; import static org.openmetadata.schema.type.TaskType.RequestDescription; import static org.openmetadata.service.security.SecurityUtil.authHeaders; import static org.openmetadata.service.util.EntityUtil.fieldAdded; +import static org.openmetadata.service.util.EntityUtil.fieldDeleted; import static org.openmetadata.service.util.EntityUtil.fieldUpdated; import static org.openmetadata.service.util.EntityUtil.getFqn; import static org.openmetadata.service.util.EntityUtil.toTagLabels; import static org.openmetadata.service.util.TestUtils.ADMIN_AUTH_HEADERS; -import static org.openmetadata.service.util.TestUtils.UpdateType.CHANGE_CONSOLIDATED; import static org.openmetadata.service.util.TestUtils.UpdateType.MINOR_UPDATE; import static org.openmetadata.service.util.TestUtils.assertListNull; import static org.openmetadata.service.util.TestUtils.assertResponse; @@ -168,11 +168,9 @@ public class GlossaryResourceTest extends EntityResourceTest { bu2 = updateAndCheckEntity(create, OK, ADMIN_AUTH_HEADERS, MINOR_UPDATE, change); // Change bu2 parent from Organization to bu1 using PATCH operation. - // Change from this PATCH is combined with the previous PUT resulting in no change String json = JsonUtils.pojoToJson(bu2); - change = getChangeDescription(bu2, REVERT); + change = getChangeDescription(bu2, MINOR_UPDATE); bu2.setParents(List.of(bu1.getEntityReference())); - patchEntityAndCheck(bu2, json, ADMIN_AUTH_HEADERS, REVERT, change); + fieldAdded(change, "parents", List.of(bu1.getEntityReference())); + fieldDeleted(change, "parents", List.of(ORG_TEAM.getEntityReference())); + patchEntityAndCheck(bu2, json, ADMIN_AUTH_HEADERS, MINOR_UPDATE, change); } @Test @@ -626,11 +625,11 @@ public class TeamResourceTest extends EntityResourceTest { fieldUpdated(change, "isJoinable", false, true); team = patchEntityAndCheck(team, json, ADMIN_AUTH_HEADERS, MINOR_UPDATE, change); - // set isJoinable to false - change from this PATCH and the previous are consolidated resulting - // in no change json = JsonUtils.pojoToJson(team); team.setIsJoinable(false); - patchEntityAndCheck(team, json, ADMIN_AUTH_HEADERS, NO_CHANGE, null); + change = getChangeDescription(team, MINOR_UPDATE); + fieldUpdated(change, "isJoinable", true, false); + patchEntityAndCheck(team, json, ADMIN_AUTH_HEADERS, MINOR_UPDATE, change); } @Test @@ -672,10 +671,9 @@ public class TeamResourceTest extends EntityResourceTest { int removeDefaultRoleIndex = new Random().nextInt(roles.size()); EntityReference deletedRole = team.getDefaultRoles().get(removeDefaultRoleIndex); team.getDefaultRoles().remove(removeDefaultRoleIndex); - change = getChangeDescription(team, CHANGE_CONSOLIDATED); - fieldDeleted(change, "users", CommonUtil.listOf(deletedUser)); + change = getChangeDescription(team, MINOR_UPDATE); fieldDeleted(change, "defaultRoles", CommonUtil.listOf(deletedRole)); - patchEntityAndCheck(team, json, ADMIN_AUTH_HEADERS, CHANGE_CONSOLIDATED, change); + patchEntityAndCheck(team, json, ADMIN_AUTH_HEADERS, MINOR_UPDATE, change); } @Test @@ -725,8 +723,10 @@ public class TeamResourceTest extends EntityResourceTest { // resulting in no change json = JsonUtils.pojoToJson(team); team.withPolicies(null); - change = getChangeDescription(team, REVERT); - patchEntityAndCheck(team, json, ADMIN_AUTH_HEADERS, REVERT, change); + change = getChangeDescription(team, MINOR_UPDATE); + fieldDeleted( + change, "policies", List.of(POLICY1.getEntityReference(), POLICY2.getEntityReference())); + patchEntityAndCheck(team, json, ADMIN_AUTH_HEADERS, MINOR_UPDATE, change); } @Test @@ -768,13 +768,11 @@ public class TeamResourceTest extends EntityResourceTest { fieldUpdated(change, "profile", PROFILE, profile1); team = patchEntityAndCheck(team, json, ADMIN_AUTH_HEADERS, MINOR_UPDATE, change); - // Remove profile from the team - Change from this PATCH and previous are consolidated to no - // change json = JsonUtils.pojoToJson(team); team.withProfile(null); - change = getChangeDescription(team, CHANGE_CONSOLIDATED); - fieldDeleted(change, "profile", PROFILE); - patchEntityAndCheck(team, json, ADMIN_AUTH_HEADERS, CHANGE_CONSOLIDATED, change); + change = getChangeDescription(team, MINOR_UPDATE); + fieldDeleted(change, "profile", profile1); + patchEntityAndCheck(team, json, ADMIN_AUTH_HEADERS, MINOR_UPDATE, change); } @Test diff --git a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/GlossaryVersionPage.spec.ts b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/GlossaryVersionPage.spec.ts index 60e66e2d2a4..a5f16c6afc8 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/GlossaryVersionPage.spec.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/GlossaryVersionPage.spec.ts @@ -89,7 +89,7 @@ test('Glossary', async ({ page }) => { await page.reload(); const versionPageResponse = page.waitForResponse( - `/api/v1/glossaries/${glossary.responseData.id}/versions/0.2` + `/api/v1/glossaries/${glossary.responseData.id}/versions/0.3` ); await page.click('[data-testid="version-button"]'); await versionPageResponse; diff --git a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Tags.spec.ts b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Tags.spec.ts index 243497d80ca..c6fa884de53 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Tags.spec.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Tags.spec.ts @@ -173,7 +173,9 @@ test('Classification Page', async ({ page }) => { ) ).not.toBeVisible(); - await expect(page.getByTestId('saveAssociatedTag')).not.toBeVisible(); + await expect(page.getByText('No Tags are available')).toBeVisible(); + + await expect(page.getByTestId('saveAssociatedTag')).toBeDisabled(); // Re-enable the disabled Classification await classification.visitPage(page); @@ -207,6 +209,7 @@ test('Classification Page', async ({ page }) => { }); await test.step('Create classification with validation checks', async () => { + await classification.visitPage(page); await page.click('[data-testid="add-classification"]'); await page.waitForSelector('.ant-modal-content', { state: 'visible', diff --git a/openmetadata-ui/src/main/resources/ui/playwright/e2e/VersionPages/ClassificationVersionPage.spec.ts b/openmetadata-ui/src/main/resources/ui/playwright/e2e/VersionPages/ClassificationVersionPage.spec.ts index 6397dbd8005..e67283bd2dc 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/e2e/VersionPages/ClassificationVersionPage.spec.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/e2e/VersionPages/ClassificationVersionPage.spec.ts @@ -80,12 +80,12 @@ test('Classification version page', async ({ page }) => { await patchClassificationResponse; // Verify disabled state - await page.click('[data-testid="version-button"]:has-text("0.2")'); + await page.click('[data-testid="version-button"]:has-text("0.3")'); await expect(page.locator('[data-testid="disabled"]')).toBeVisible(); // Toggle back to enabled - await page.click('[data-testid="version-button"]:has-text("0.2")'); + await page.click('[data-testid="version-button"]:has-text("0.3")'); await page.click('[data-testid="manage-button"]'); const patchClassificationResponse2 = page.waitForResponse( `/api/v1/classifications/${classification.responseData?.id}` @@ -94,7 +94,7 @@ test('Classification version page', async ({ page }) => { await patchClassificationResponse2; // Verify enabled state - await page.click('[data-testid="version-button"]:has-text("0.2")'); + await page.click('[data-testid="version-button"]:has-text("0.4")'); await expect( page.locator(`[data-testid="classification-${classification.data.name}"]`) diff --git a/openmetadata-ui/src/main/resources/ui/playwright/e2e/VersionPages/ServiceEntityVersionPage.spec.ts b/openmetadata-ui/src/main/resources/ui/playwright/e2e/VersionPages/ServiceEntityVersionPage.spec.ts index 895c59e8662..d083c18c1ec 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/e2e/VersionPages/ServiceEntityVersionPage.spec.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/e2e/VersionPages/ServiceEntityVersionPage.spec.ts @@ -153,7 +153,7 @@ entities.forEach((EntityClass) => { type: 'Users', }); - const versionDetailResponse = page.waitForResponse(`**/versions/0.2`); + const versionDetailResponse = page.waitForResponse(`**/versions/0.3`); await page.locator('[data-testid="version-button"]').click(); await versionDetailResponse; @@ -169,7 +169,7 @@ entities.forEach((EntityClass) => { await assignTier(page, 'Tier1', entity.endpoint); - const versionDetailResponse = page.waitForResponse(`**/versions/0.2`); + const versionDetailResponse = page.waitForResponse(`**/versions/0.4`); await page.locator('[data-testid="version-button"]').click(); await versionDetailResponse; @@ -210,7 +210,7 @@ entities.forEach((EntityClass) => { await expect(deletedBadge).toHaveText('Deleted'); - const versionDetailResponse = page.waitForResponse(`**/versions/0.3`); + const versionDetailResponse = page.waitForResponse(`**/versions/0.5`); await page.locator('[data-testid="version-button"]').click(); await versionDetailResponse; diff --git a/openmetadata-ui/src/main/resources/ui/playwright/utils/tag.ts b/openmetadata-ui/src/main/resources/ui/playwright/utils/tag.ts index ffcc3c253bf..a3d13d81bed 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/utils/tag.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/utils/tag.ts @@ -136,7 +136,7 @@ export const addTagToTableColumn = async ( await expect( page.locator( - `[data-testid="classification-tags-${columnNumber}"] [data-testid="tags-container"] [data-testid="icon"]` + `[data-testid="classification-tags-${columnNumber}"] [data-testid="tags-container"] [data-testid="tag-${tagFqn}"]` ) ).toBeVisible(); }; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/AsyncSelectList/AsyncSelectList.tsx b/openmetadata-ui/src/main/resources/ui/src/components/common/AsyncSelectList/AsyncSelectList.tsx index 2a36c2ee375..29a04a7a475 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/common/AsyncSelectList/AsyncSelectList.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/common/AsyncSelectList/AsyncSelectList.tsx @@ -13,6 +13,7 @@ import { CloseOutlined } from '@ant-design/icons'; import { Button, + Empty, Form, Select, SelectProps, @@ -187,6 +188,7 @@ const AsyncSelectList: FC = ({