From 0791c8c266d278e9528e50f35264b86102a49444 Mon Sep 17 00:00:00 2001 From: Matt Date: Sun, 20 Feb 2022 21:21:08 -0800 Subject: [PATCH] Extend team to support defaultRoles (#2885) * Extend team to support defaultRoles * Add support for team defaultRoles change description * Add tests --- .../catalog/jdbi3/TeamRepository.java | 134 +++++++++++++----- .../catalog/resources/teams/TeamResource.java | 6 +- .../json/schema/api/teams/createTeam.json | 17 ++- .../json/schema/entity/teams/team.json | 6 +- .../resources/teams/TeamResourceTest.java | 100 +++++++++---- ingestion-core/src/metadata/_version.py | 2 +- 6 files changed, 195 insertions(+), 70 deletions(-) diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/TeamRepository.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/TeamRepository.java index fa14864a48c..7a64cbebde4 100644 --- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/TeamRepository.java +++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/TeamRepository.java @@ -35,8 +35,8 @@ import org.openmetadata.catalog.util.EntityUtil; import org.openmetadata.catalog.util.EntityUtil.Fields; public class TeamRepository extends EntityRepository { - static final Fields TEAM_UPDATE_FIELDS = new Fields(TeamResource.FIELD_LIST, "profile,users"); - static final Fields TEAM_PATCH_FIELDS = new Fields(TeamResource.FIELD_LIST, "profile,users"); + static final Fields TEAM_UPDATE_FIELDS = new Fields(TeamResource.FIELD_LIST, "profile,users,defaultRoles"); + static final Fields TEAM_PATCH_FIELDS = new Fields(TeamResource.FIELD_LIST, "profile,users,defaultRoles"); public TeamRepository(CollectionDAO dao) { super( @@ -52,23 +52,33 @@ public class TeamRepository extends EntityRepository { false); } - public List getUsers(List userIds) { - if (userIds == null) { + public List getEntityReferences(List ids) { + if (ids == null) { return null; } - List users = new ArrayList<>(); - for (UUID id : userIds) { - users.add(new EntityReference().withId(id)); + List entityReferences = new ArrayList<>(); + for (UUID id : ids) { + entityReferences.add(new EntityReference().withId(id)); } - return users; + return entityReferences; } - public void validateUsers(List users) throws IOException { - if (users != null) { - users.sort(EntityUtil.compareEntityReference); - for (EntityReference user : users) { - EntityReference ref = daoCollection.userDAO().findEntityReferenceById(user.getId()); - user.withType(ref.getType()).withName(ref.getName()).withDisplayName(ref.getDisplayName()); + public void validateEntityReferences(List entityReferences, String entityType) throws IOException { + if (entityReferences != null) { + entityReferences.sort(EntityUtil.compareEntityReference); + for (EntityReference entityReference : entityReferences) { + EntityReference ref; + switch (entityType) { + case Entity.USER: + ref = daoCollection.userDAO().findEntityReferenceById(entityReference.getId()); + break; + case Entity.ROLE: + ref = daoCollection.roleDAO().findEntityReferenceById(entityReference.getId()); + break; + default: + throw new IllegalArgumentException("Unsupported entity reference for validation"); + } + entityReference.withType(ref.getType()).withName(ref.getName()).withDisplayName(ref.getDisplayName()); } } } @@ -80,6 +90,7 @@ public class TeamRepository extends EntityRepository { } team.setUsers(fields.contains("users") ? getUsers(team) : null); team.setOwns(fields.contains("owns") ? getOwns(team) : null); + team.setDefaultRoles(fields.contains("defaultRoles") ? getDefaultRoles(team) : null); return team; } @@ -96,21 +107,23 @@ public class TeamRepository extends EntityRepository { @Override public void prepare(Team team) throws IOException { - validateUsers(team.getUsers()); + validateEntityReferences(team.getUsers(), Entity.USER); + validateEntityReferences(team.getDefaultRoles(), Entity.ROLE); } @Override public void storeEntity(Team team, boolean update) throws IOException { // Relationships and fields such as href are derived and not stored as part of json List users = team.getUsers(); + List defaultRoles = team.getDefaultRoles(); - // Don't store users, href as JSON. Build it on the fly based on relationships - team.withUsers(null).withHref(null); + // Don't store users, defaultRoles, href as JSON. Build it on the fly based on relationships + team.withUsers(null).withDefaultRoles(null).withHref(null); store(team.getId(), team, update); // Restore the relationships - team.withUsers(users); + team.withUsers(users).withDefaultRoles(defaultRoles); } @Override @@ -118,6 +131,9 @@ public class TeamRepository extends EntityRepository { for (EntityReference user : Optional.ofNullable(team.getUsers()).orElse(Collections.emptyList())) { addRelationship(team.getId(), user.getId(), Entity.TEAM, Entity.USER, Relationship.HAS); } + for (EntityReference defaultRole : Optional.ofNullable(team.getDefaultRoles()).orElse(Collections.emptyList())) { + addRelationship(team.getId(), defaultRole.getId(), Entity.TEAM, Entity.ROLE, Relationship.HAS); + } } @Override @@ -127,11 +143,7 @@ public class TeamRepository extends EntityRepository { private List getUsers(Team team) throws IOException { List userIds = findTo(team.getId(), Entity.TEAM, Relationship.HAS, Entity.USER, toBoolean(toInclude(team))); - List users = new ArrayList<>(); - for (String userId : userIds) { - users.add(daoCollection.userDAO().findEntityReferenceById(UUID.fromString(userId))); - } - return users; + return populateEntityReferences(userIds, Entity.USER); } private List getOwns(Team team) throws IOException { @@ -142,6 +154,29 @@ public class TeamRepository extends EntityRepository { .findTo(team.getId().toString(), Entity.TEAM, Relationship.OWNS.ordinal(), toBoolean(toInclude(team)))); } + private List getDefaultRoles(Team team) throws IOException { + List defaultRoleIds = + findTo(team.getId(), Entity.TEAM, Relationship.HAS, Entity.ROLE, toBoolean(toInclude(team))); + return populateEntityReferences(defaultRoleIds, Entity.ROLE); + } + + private List populateEntityReferences(List ids, String entityType) throws IOException { + List refs = new ArrayList<>(); + for (String id : ids) { + switch (entityType) { + case Entity.USER: + refs.add(daoCollection.userDAO().findEntityReferenceById(UUID.fromString(id))); + break; + case Entity.ROLE: + refs.add(daoCollection.roleDAO().findEntityReferenceById(UUID.fromString(id))); + break; + default: + throw new IllegalArgumentException("Unsupported entity type for populating entityReference list"); + } + } + return refs; + } + public static class TeamEntityInterface implements EntityInterface { private final Team entity; @@ -273,27 +308,56 @@ public class TeamRepository extends EntityRepository { public void entitySpecificUpdate() throws IOException { recordChange("profile", original.getEntity().getProfile(), updated.getEntity().getProfile()); updateUsers(original.getEntity(), updated.getEntity()); + updateDefaultRoles(original.getEntity(), updated.getEntity()); } private void updateUsers(Team origTeam, Team updatedTeam) throws JsonProcessingException { List origUsers = Optional.ofNullable(origTeam.getUsers()).orElse(Collections.emptyList()); List updatedUsers = Optional.ofNullable(updatedTeam.getUsers()).orElse(Collections.emptyList()); + updateEntityRelationships( + "users", origTeam.getId(), updatedTeam.getId(), Relationship.HAS, Entity.USER, origUsers, updatedUsers); + } + private void updateDefaultRoles(Team origTeam, Team updatedTeam) throws JsonProcessingException { + List origDefaultRoles = + Optional.ofNullable(origTeam.getDefaultRoles()).orElse(Collections.emptyList()); + List updatedDefaultRoles = + Optional.ofNullable(updatedTeam.getDefaultRoles()).orElse(Collections.emptyList()); + updateEntityRelationships( + "defaultRoles", + origTeam.getId(), + updatedTeam.getId(), + Relationship.HAS, + Entity.ROLE, + origDefaultRoles, + updatedDefaultRoles); + } + + private void updateEntityRelationships( + String field, + UUID origId, + UUID updatedId, + Relationship relationshipType, + String toEntityType, + List origRefs, + List updatedRefs) + throws JsonProcessingException { List added = new ArrayList<>(); List deleted = new ArrayList<>(); - if (recordListChange("users", origUsers, updatedUsers, added, deleted, entityReferenceMatch)) { - // Remove users from original and add users from updated - daoCollection - .relationshipDAO() - .deleteFrom(origTeam.getId().toString(), Entity.TEAM, Relationship.HAS.ordinal(), "user"); - // Add relationships - for (EntityReference user : updatedUsers) { - addRelationship(updatedTeam.getId(), user.getId(), Entity.TEAM, Entity.USER, Relationship.HAS); - } - - updatedUsers.sort(EntityUtil.compareEntityReference); - origUsers.sort(EntityUtil.compareEntityReference); + if (!recordListChange(field, origRefs, updatedRefs, added, deleted, entityReferenceMatch)) { + // No changes between original and updated. + return; } + // Remove relationships from original + daoCollection + .relationshipDAO() + .deleteFrom(origId.toString(), Entity.TEAM, relationshipType.ordinal(), toEntityType); + // Add relationships from updated + for (EntityReference ref : updatedRefs) { + addRelationship(updatedId, ref.getId(), Entity.TEAM, toEntityType, relationshipType); + } + updatedRefs.sort(EntityUtil.compareEntityReference); + origRefs.sort(EntityUtil.compareEntityReference); } } } diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/teams/TeamResource.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/teams/TeamResource.java index a80c61afdc5..6a93f631e88 100644 --- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/teams/TeamResource.java +++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/teams/TeamResource.java @@ -78,6 +78,7 @@ public class TeamResource { public static Team addHref(UriInfo uriInfo, Team team) { Entity.withHref(uriInfo, team.getUsers()); + Entity.withHref(uriInfo, team.getDefaultRoles()); Entity.withHref(uriInfo, team.getOwns()); return team; } @@ -98,7 +99,7 @@ public class TeamResource { } } - protected static final String FIELDS = "profile,users,owns"; + protected static final String FIELDS = "profile,users,owns,defaultRoles"; public static final List FIELD_LIST = Arrays.asList(FIELDS.replace(" ", "").split(",")); @GET @@ -370,6 +371,7 @@ public class TeamResource { .withProfile(ct.getProfile()) .withUpdatedBy(securityContext.getUserPrincipal().getName()) .withUpdatedAt(System.currentTimeMillis()) - .withUsers(dao.getUsers(ct.getUsers())); + .withUsers(dao.getEntityReferences(ct.getUsers())) + .withDefaultRoles(dao.getEntityReferences(ct.getDefaultRoles())); } } diff --git a/catalog-rest-service/src/main/resources/json/schema/api/teams/createTeam.json b/catalog-rest-service/src/main/resources/json/schema/api/teams/createTeam.json index 0172929b151..d6b218c4c45 100644 --- a/catalog-rest-service/src/main/resources/json/schema/api/teams/createTeam.json +++ b/catalog-rest-service/src/main/resources/json/schema/api/teams/createTeam.json @@ -4,25 +4,32 @@ "title": "CreateTeamRequest", "description": "Team entity", "type": "object", - "properties": { "name": { "$ref": "../../entity/teams/team.json#/definitions/teamName" }, "displayName": { - "description": "Optional name used for display purposes. Example 'Marketing Team'", + "description": "Optional name used for display purposes. Example 'Marketing Team'.", "type": "string" }, "description": { - "description": "Optional description of the team", + "description": "Optional description of the team.", "type": "string" }, "profile": { - "description": "Optional team profile information", + "description": "Optional team profile information.", "$ref": "../../type/profile.json" }, "users": { - "description": "Optional IDs of users that are part of the team", + "description": "Optional IDs of users that are part of the team.", + "type": "array", + "items": { + "$ref": "../../type/basic.json#/definitions/uuid" + }, + "default": null + }, + "defaultRoles": { + "description": "Roles to be assigned to all users that are part of this team.", "type": "array", "items": { "$ref": "../../type/basic.json#/definitions/uuid" diff --git a/catalog-rest-service/src/main/resources/json/schema/entity/teams/team.json b/catalog-rest-service/src/main/resources/json/schema/entity/teams/team.json index 6dcaaaaff13..7fdf7236bf6 100644 --- a/catalog-rest-service/src/main/resources/json/schema/entity/teams/team.json +++ b/catalog-rest-service/src/main/resources/json/schema/entity/teams/team.json @@ -4,7 +4,6 @@ "title": "Team", "description": "This schema defines the Team entity. A Team is a group of zero or more users. Teams can own zero or more data assets.", "type": "object", - "definitions": { "teamName": { "description": "A unique name of the team typically the team ID from an identity provider. Example - group Id from LDAP.", @@ -13,7 +12,6 @@ "maxLength": 128 } }, - "properties": { "id": { "$ref": "../../type/basic.json#/definitions/uuid" @@ -66,6 +64,10 @@ "description": "When `true` indicates the entity has been soft deleted.", "type": "boolean", "default": false + }, + "defaultRoles": { + "description": "Roles to be assigned to all users that are part of this team.", + "$ref": "../../type/entityReference.json#/definitions/entityReferenceList" } }, "required": ["id", "name", "href"], diff --git a/catalog-rest-service/src/test/java/org/openmetadata/catalog/resources/teams/TeamResourceTest.java b/catalog-rest-service/src/test/java/org/openmetadata/catalog/resources/teams/TeamResourceTest.java index e95df611de0..af3a7c59fd9 100644 --- a/catalog-rest-service/src/test/java/org/openmetadata/catalog/resources/teams/TeamResourceTest.java +++ b/catalog-rest-service/src/test/java/org/openmetadata/catalog/resources/teams/TeamResourceTest.java @@ -36,12 +36,14 @@ import java.util.Map; import java.util.Optional; import java.util.Random; import java.util.UUID; +import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.HttpResponseException; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInfo; import org.openmetadata.catalog.Entity; import org.openmetadata.catalog.api.teams.CreateTeam; +import org.openmetadata.catalog.entity.teams.Role; import org.openmetadata.catalog.entity.teams.Team; import org.openmetadata.catalog.entity.teams.User; import org.openmetadata.catalog.exception.CatalogExceptionMessage; @@ -55,7 +57,6 @@ import org.openmetadata.catalog.type.FieldChange; import org.openmetadata.catalog.type.ImageList; import org.openmetadata.catalog.type.Profile; import org.openmetadata.catalog.util.EntityInterface; -import org.openmetadata.catalog.util.EntityUtil; import org.openmetadata.catalog.util.JsonUtils; import org.openmetadata.catalog.util.TestUtils; import org.openmetadata.catalog.util.TestUtils.UpdateType; @@ -88,21 +89,28 @@ public class TeamResourceTest extends EntityResourceTest { } @Test - void post_teamWithUsers_200_OK(TestInfo test) throws IOException { + void post_teamWithUsersAndDefaultRoles_200_OK(TestInfo test) throws IOException { // Add team to user relationships while creating a team UserResourceTest userResourceTest = new UserResourceTest(); User user1 = userResourceTest.createEntity(userResourceTest.createRequest(test, 1), TEST_AUTH_HEADERS); User user2 = userResourceTest.createEntity(userResourceTest.createRequest(test, 2), TEST_AUTH_HEADERS); List users = Arrays.asList(user1.getId(), user2.getId()); + + RoleResourceTest roleResourceTest = new RoleResourceTest(); + Role role1 = roleResourceTest.createEntity(roleResourceTest.createRequest(test, 1), ADMIN_AUTH_HEADERS); + Role role2 = roleResourceTest.createEntity(roleResourceTest.createRequest(test, 2), ADMIN_AUTH_HEADERS); + List roles = Arrays.asList(role1.getId(), role2.getId()); + CreateTeam create = createRequest(test) .withDisplayName("displayName") .withDescription("description") .withProfile(PROFILE) - .withUsers(users); + .withUsers(users) + .withDefaultRoles(roles); Team team = createAndCheckEntity(create, ADMIN_AUTH_HEADERS); - // Make sure the user entity has relationship to the team + // Ensure that the user entity has relationship to the team user1 = userResourceTest.getEntity(user1.getId(), "teams", TEST_AUTH_HEADERS); assertEquals(team.getId(), user1.getTeams().get(0).getId()); user2 = userResourceTest.getEntity(user2.getId(), "teams", TEST_AUTH_HEADERS); @@ -135,15 +143,26 @@ public class TeamResourceTest extends EntityResourceTest { UserResourceTest userResourceTest = new UserResourceTest(); User user1 = userResourceTest.createEntity(userResourceTest.createRequest(test, 1), ADMIN_AUTH_HEADERS); List users = Collections.singletonList(user1.getId()); - CreateTeam create = createRequest(test).withUsers(users); + + RoleResourceTest roleResourceTest = new RoleResourceTest(); + Role role1 = roleResourceTest.createEntity(roleResourceTest.createRequest(test, 1), ADMIN_AUTH_HEADERS); + List roles = Collections.singletonList(role1.getId()); + + CreateTeam create = createRequest(test).withUsers(users).withDefaultRoles(roles); Team team = createAndCheckEntity(create, ADMIN_AUTH_HEADERS); - // Team with users can be deleted - Team -- has --> User relationships are deleted + // Team with users and defaultRoles can be deleted + // Team -- has --> User relationships are deleted + // Team -- has --> Role relationships are deleted deleteAndCheckEntity(team, ADMIN_AUTH_HEADERS); - // Make sure user does not have relationship to this team + // Ensure that the user does not have relationship to this team User user = userResourceTest.getEntity(user1.getId(), "teams", ADMIN_AUTH_HEADERS); assertTrue(user.getTeams().isEmpty()); + + // Ensure that the role is not deleted + Role role = roleResourceTest.getEntity(role1.getId(), "", ADMIN_AUTH_HEADERS); + assertNotNull(role); } @Test @@ -160,7 +179,7 @@ public class TeamResourceTest extends EntityResourceTest { } @Test - void patch_deleteUserFromTeam_200(TestInfo test) throws IOException { + void patch_deleteUserAndDefaultRoleFromTeam_200(TestInfo test) throws IOException { UserResourceTest userResourceTest = new UserResourceTest(); final int totalUsers = 20; ArrayList users = new ArrayList<>(); @@ -168,17 +187,35 @@ public class TeamResourceTest extends EntityResourceTest { User user = userResourceTest.createEntity(userResourceTest.createRequest(test, i), ADMIN_AUTH_HEADERS); users.add(user.getId()); } + + RoleResourceTest roleResourceTest = new RoleResourceTest(); + roleResourceTest.createRolesAndSetDefault(test, 5, 0); + List roles = roleResourceTest.listEntities(Map.of(), ADMIN_AUTH_HEADERS).getData(); + List rolesIds = roles.stream().map(Role::getId).collect(Collectors.toList()); + CreateTeam create = - createRequest(getEntityName(test), "description", "displayName", null).withProfile(PROFILE).withUsers(users); + createRequest(getEntityName(test), "description", "displayName", null) + .withProfile(PROFILE) + .withUsers(users) + .withDefaultRoles(rolesIds); Team team = createAndCheckEntity(create, ADMIN_AUTH_HEADERS); - // Remove a user from the team list using patch request + // Remove a user from the team using patch request String json = JsonUtils.pojoToJson(team); int removeUserIndex = new Random().nextInt(totalUsers); EntityReference deletedUser = team.getUsers().get(removeUserIndex).withHref(null); team.getUsers().remove(removeUserIndex); ChangeDescription change = getChangeDescription(team.getVersion()); change.getFieldsDeleted().add(new FieldChange().withName("users").withOldValue(Arrays.asList(deletedUser))); + team = patchEntityAndCheck(team, json, ADMIN_AUTH_HEADERS, UpdateType.MINOR_UPDATE, change); + + // Remove a default role from the team using patch request + json = JsonUtils.pojoToJson(team); + int removeDefaultRoleIndex = new Random().nextInt(roles.size()); + EntityReference deletedRole = team.getDefaultRoles().get(removeDefaultRoleIndex).withHref(null); + team.getDefaultRoles().remove(removeDefaultRoleIndex); + change = getChangeDescription(team.getVersion()); + change.getFieldsDeleted().add(new FieldChange().withName("defaultRoles").withOldValue(Arrays.asList(deletedRole))); patchEntityAndCheck(team, json, ADMIN_AUTH_HEADERS, UpdateType.MINOR_UPDATE, change); } @@ -188,6 +225,7 @@ public class TeamResourceTest extends EntityResourceTest { String expectedDisplayName, Profile expectedProfile, List expectedUsers, + List expectedDefaultRoles, String expectedUpdatedBy) { assertListNotNull(team.getId(), team.getHref()); assertEquals(expectedDescription, team.getDescription()); @@ -195,6 +233,7 @@ public class TeamResourceTest extends EntityResourceTest { assertEquals(expectedDisplayName, team.getDisplayName()); assertEquals(expectedProfile, team.getProfile()); TestUtils.assertEntityReferenceList(expectedUsers, team.getUsers()); + TestUtils.assertEntityReferenceList(expectedDefaultRoles, team.getDefaultRoles()); TestUtils.validateEntityReference(team.getOwns()); } @@ -214,18 +253,20 @@ public class TeamResourceTest extends EntityResourceTest { expectedTeam.getDisplayName(), expectedTeam.getProfile(), null, + null, updatedBy); assertNull(getTeam.getOwns()); - // .../teams?fields=users,owns - fields = "users,owns,profile"; + // .../teams?fields=users,owns,profile,defaultRoles + fields = "users,owns,profile,defaultRoles"; getTeam = byName ? getEntityByName(expectedTeam.getName(), fields, ADMIN_AUTH_HEADERS) : getEntity(expectedTeam.getId(), fields, ADMIN_AUTH_HEADERS); assertNotNull(getTeam.getProfile()); - validateEntityReference(getTeam.getUsers()); validateEntityReference(getTeam.getOwns()); + validateEntityReference(getTeam.getUsers()); + validateEntityReference(getTeam.getDefaultRoles()); } @Override @@ -252,14 +293,21 @@ public class TeamResourceTest extends EntityResourceTest { getEntityInterface(team), createRequest.getDescription(), TestUtils.getPrincipal(authHeaders), null); assertEquals(createRequest.getProfile(), team.getProfile()); + TestUtils.validateEntityReference(team.getOwns()); List expectedUsers = new ArrayList<>(); - for (UUID teamId : Optional.ofNullable(createRequest.getUsers()).orElse(Collections.emptyList())) { - expectedUsers.add(new EntityReference().withId(teamId).withType(Entity.USER)); + for (UUID userId : Optional.ofNullable(createRequest.getUsers()).orElse(Collections.emptyList())) { + expectedUsers.add(new EntityReference().withId(userId).withType(Entity.USER)); } expectedUsers = expectedUsers.isEmpty() ? null : expectedUsers; TestUtils.assertEntityReferenceList(expectedUsers, team.getUsers()); - TestUtils.validateEntityReference(team.getOwns()); + + List expectedDefaultRoles = new ArrayList<>(); + for (UUID roleId : Optional.ofNullable(createRequest.getDefaultRoles()).orElse(Collections.emptyList())) { + expectedDefaultRoles.add(new EntityReference().withId(roleId).withType(Entity.ROLE)); + } + expectedDefaultRoles = expectedDefaultRoles.isEmpty() ? null : expectedDefaultRoles; + TestUtils.assertEntityReferenceList(expectedDefaultRoles, team.getDefaultRoles()); } @Override @@ -287,15 +335,17 @@ public class TeamResourceTest extends EntityResourceTest { assertEquals(expected.getDisplayName(), updated.getDisplayName()); assertEquals(expected.getProfile(), updated.getProfile()); + TestUtils.validateEntityReference(updated.getOwns()); List expectedUsers = Optional.ofNullable(expected.getUsers()).orElse(Collections.emptyList()); List actualUsers = Optional.ofNullable(updated.getUsers()).orElse(Collections.emptyList()); - actualUsers.forEach(TestUtils::validateEntityReference); + TestUtils.assertEntityReferenceList(expectedUsers, actualUsers); - actualUsers.sort(EntityUtil.compareEntityReference); - expectedUsers.sort(EntityUtil.compareEntityReference); - assertEquals(expectedUsers, actualUsers); - TestUtils.validateEntityReference(updated.getOwns()); + List expectedDefaultRoles = + Optional.ofNullable(expected.getDefaultRoles()).orElse(Collections.emptyList()); + List actualDefaultRoles = + Optional.ofNullable(updated.getDefaultRoles()).orElse(Collections.emptyList()); + TestUtils.assertEntityReferenceList(expectedDefaultRoles, actualDefaultRoles); } @Override @@ -308,11 +358,11 @@ public class TeamResourceTest extends EntityResourceTest { if (expected == actual) { return; } - if (fieldName.equals("users")) { + if (fieldName.equals("users") || fieldName.equals("defaultRoles")) { @SuppressWarnings("unchecked") - List expectedUsers = (List) expected; - List actualUsers = JsonUtils.readObjects(actual.toString(), EntityReference.class); - assertEntityReferencesFieldChange(expectedUsers, actualUsers); + List expectedRefs = (List) expected; + List actualRefs = JsonUtils.readObjects(actual.toString(), EntityReference.class); + assertEntityReferencesFieldChange(expectedRefs, actualRefs); } else { assertCommonFieldChange(fieldName, expected, actual); } diff --git a/ingestion-core/src/metadata/_version.py b/ingestion-core/src/metadata/_version.py index e39e68bcc81..b9b15ff81c0 100644 --- a/ingestion-core/src/metadata/_version.py +++ b/ingestion-core/src/metadata/_version.py @@ -7,5 +7,5 @@ Provides metadata version information. from incremental import Version -__version__ = Version("metadata", 0, 9, 0, dev=11) +__version__ = Version("metadata", 0, 9, 0, dev=12) __all__ = ["__version__"]