mirror of
https://github.com/open-metadata/OpenMetadata.git
synced 2025-09-06 15:43:04 +00:00
MINOR: Add Governance Bot to the workflow automated tasks (#19222)
* Add Governance Bot to the workflow automated tasks * Fix tests
This commit is contained in:
parent
08da6d09a1
commit
e5a193d40d
@ -40,7 +40,7 @@ public class SetEntityCertificationImpl implements JavaDelegate {
|
|||||||
.orElse(null);
|
.orElse(null);
|
||||||
String user =
|
String user =
|
||||||
Optional.ofNullable((String) execution.getVariable(RESOLVED_BY_VARIABLE))
|
Optional.ofNullable((String) execution.getVariable(RESOLVED_BY_VARIABLE))
|
||||||
.orElse(entity.getUpdatedBy());
|
.orElse("governance-bot");
|
||||||
|
|
||||||
setStatus(entity, entityType, user, certification);
|
setStatus(entity, entityType, user, certification);
|
||||||
} catch (Exception exc) {
|
} catch (Exception exc) {
|
||||||
|
@ -35,7 +35,7 @@ public class SetGlossaryTermStatusImpl implements JavaDelegate {
|
|||||||
String status = (String) statusExpr.getValue(execution);
|
String status = (String) statusExpr.getValue(execution);
|
||||||
String user =
|
String user =
|
||||||
Optional.ofNullable((String) execution.getVariable(RESOLVED_BY_VARIABLE))
|
Optional.ofNullable((String) execution.getVariable(RESOLVED_BY_VARIABLE))
|
||||||
.orElse(glossaryTerm.getUpdatedBy());
|
.orElse("governance-bot");
|
||||||
|
|
||||||
setStatus(glossaryTerm, user, status);
|
setStatus(glossaryTerm, user, status);
|
||||||
} catch (Exception exc) {
|
} catch (Exception exc) {
|
||||||
|
@ -961,7 +961,8 @@ public class FeedRepository {
|
|||||||
String createdByUserName = thread.getCreatedBy();
|
String createdByUserName = thread.getCreatedBy();
|
||||||
User createdByUser =
|
User createdByUser =
|
||||||
Entity.getEntityByName(USER, createdByUserName, TEAMS_FIELD, NON_DELETED);
|
Entity.getEntityByName(USER, createdByUserName, TEAMS_FIELD, NON_DELETED);
|
||||||
if (Boolean.TRUE.equals(createdByUser.getIsBot())) {
|
if (Boolean.TRUE.equals(createdByUser.getIsBot())
|
||||||
|
&& !createdByUser.getName().equals("governance-bot")) {
|
||||||
throw new IllegalArgumentException("Task cannot be created by bot only by user or teams");
|
throw new IllegalArgumentException("Task cannot be created by bot only by user or teams");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,6 +68,8 @@ import org.junit.jupiter.api.Order;
|
|||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.junit.jupiter.api.TestInfo;
|
import org.junit.jupiter.api.TestInfo;
|
||||||
import org.junit.jupiter.api.TestMethodOrder;
|
import org.junit.jupiter.api.TestMethodOrder;
|
||||||
|
import org.junit.jupiter.api.parallel.Execution;
|
||||||
|
import org.junit.jupiter.api.parallel.ExecutionMode;
|
||||||
import org.openmetadata.schema.api.data.CreateGlossary;
|
import org.openmetadata.schema.api.data.CreateGlossary;
|
||||||
import org.openmetadata.schema.api.data.CreateGlossaryTerm;
|
import org.openmetadata.schema.api.data.CreateGlossaryTerm;
|
||||||
import org.openmetadata.schema.api.data.CreateTable;
|
import org.openmetadata.schema.api.data.CreateTable;
|
||||||
@ -88,6 +90,7 @@ import org.openmetadata.schema.type.TagLabel;
|
|||||||
import org.openmetadata.schema.type.TaskDetails;
|
import org.openmetadata.schema.type.TaskDetails;
|
||||||
import org.openmetadata.schema.type.TaskStatus;
|
import org.openmetadata.schema.type.TaskStatus;
|
||||||
import org.openmetadata.service.Entity;
|
import org.openmetadata.service.Entity;
|
||||||
|
import org.openmetadata.service.governance.workflows.WorkflowHandler;
|
||||||
import org.openmetadata.service.resources.EntityResourceTest;
|
import org.openmetadata.service.resources.EntityResourceTest;
|
||||||
import org.openmetadata.service.resources.databases.TableResourceTest;
|
import org.openmetadata.service.resources.databases.TableResourceTest;
|
||||||
import org.openmetadata.service.resources.feeds.FeedResource.ThreadList;
|
import org.openmetadata.service.resources.feeds.FeedResource.ThreadList;
|
||||||
@ -264,7 +267,11 @@ public class GlossaryTermResourceTest extends EntityResourceTest<GlossaryTerm, C
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@Execution(ExecutionMode.SAME_THREAD)
|
||||||
void patch_addDeleteReviewers(TestInfo test) throws IOException {
|
void patch_addDeleteReviewers(TestInfo test) throws IOException {
|
||||||
|
// Note: We are disabling the GlossaryTermApprovalWorkflow to avoid the Workflow Kicking it and
|
||||||
|
// adding extra ChangeDescriptions.
|
||||||
|
WorkflowHandler.getInstance().suspendWorkflow("GlossaryTermApprovalWorkflow");
|
||||||
CreateGlossaryTerm create =
|
CreateGlossaryTerm create =
|
||||||
createRequest(getEntityName(test), "desc", "", null).withReviewers(null).withSynonyms(null);
|
createRequest(getEntityName(test), "desc", "", null).withReviewers(null).withSynonyms(null);
|
||||||
GlossaryTerm term = createEntity(create, ADMIN_AUTH_HEADERS);
|
GlossaryTerm term = createEntity(create, ADMIN_AUTH_HEADERS);
|
||||||
@ -281,14 +288,11 @@ public class GlossaryTermResourceTest extends EntityResourceTest<GlossaryTerm, C
|
|||||||
term.withReviewers(List.of(USER1_REF))
|
term.withReviewers(List.of(USER1_REF))
|
||||||
.withSynonyms(List.of("synonym1"))
|
.withSynonyms(List.of("synonym1"))
|
||||||
.withReferences(List.of(reference1));
|
.withReferences(List.of(reference1));
|
||||||
patchEntity(term.getId(), origJson, term, ADMIN_AUTH_HEADERS);
|
|
||||||
waitForTaskToBeCreated(term.getFullyQualifiedName());
|
|
||||||
|
|
||||||
ChangeDescription change = getChangeDescription(term, MINOR_UPDATE);
|
ChangeDescription change = getChangeDescription(term, MINOR_UPDATE);
|
||||||
fieldAdded(change, "reviewers", List.of(USER1_REF));
|
fieldAdded(change, "reviewers", List.of(USER1_REF));
|
||||||
fieldAdded(change, "synonyms", List.of("synonym1"));
|
fieldAdded(change, "synonyms", List.of("synonym1"));
|
||||||
fieldAdded(change, "references", List.of(reference1));
|
fieldAdded(change, "references", List.of(reference1));
|
||||||
fieldUpdated(change, "status", Status.APPROVED, Status.IN_REVIEW);
|
|
||||||
term = patchEntityAndCheck(term, origJson, ADMIN_AUTH_HEADERS, MINOR_UPDATE, change);
|
term = patchEntityAndCheck(term, origJson, ADMIN_AUTH_HEADERS, MINOR_UPDATE, change);
|
||||||
|
|
||||||
// Add reviewer USER2, synonym2, reference2 in PATCH request
|
// Add reviewer USER2, synonym2, reference2 in PATCH request
|
||||||
@ -303,7 +307,6 @@ public class GlossaryTermResourceTest extends EntityResourceTest<GlossaryTerm, C
|
|||||||
fieldAdded(change, "reviewers", List.of(USER1_REF, USER2_REF));
|
fieldAdded(change, "reviewers", List.of(USER1_REF, USER2_REF));
|
||||||
fieldAdded(change, "synonyms", List.of("synonym1", "synonym2"));
|
fieldAdded(change, "synonyms", List.of("synonym1", "synonym2"));
|
||||||
fieldAdded(change, "references", List.of(reference1, reference2));
|
fieldAdded(change, "references", List.of(reference1, reference2));
|
||||||
fieldUpdated(change, "status", Status.APPROVED, Status.IN_REVIEW);
|
|
||||||
term = patchEntityAndCheck(term, origJson, ADMIN_AUTH_HEADERS, CHANGE_CONSOLIDATED, change);
|
term = patchEntityAndCheck(term, origJson, ADMIN_AUTH_HEADERS, CHANGE_CONSOLIDATED, change);
|
||||||
|
|
||||||
// Remove a reviewer USER1, synonym1, reference1 in PATCH request
|
// Remove a reviewer USER1, synonym1, reference1 in PATCH request
|
||||||
@ -316,8 +319,10 @@ public class GlossaryTermResourceTest extends EntityResourceTest<GlossaryTerm, C
|
|||||||
fieldAdded(change, "reviewers", List.of(USER2_REF));
|
fieldAdded(change, "reviewers", List.of(USER2_REF));
|
||||||
fieldAdded(change, "synonyms", List.of("synonym2"));
|
fieldAdded(change, "synonyms", List.of("synonym2"));
|
||||||
fieldAdded(change, "references", List.of(reference2));
|
fieldAdded(change, "references", List.of(reference2));
|
||||||
fieldUpdated(change, "status", Status.APPROVED, Status.IN_REVIEW);
|
|
||||||
patchEntityAndCheck(term, origJson, ADMIN_AUTH_HEADERS, CHANGE_CONSOLIDATED, change);
|
patchEntityAndCheck(term, origJson, ADMIN_AUTH_HEADERS, CHANGE_CONSOLIDATED, change);
|
||||||
|
|
||||||
|
// Note: We are re-enabling the GlossaryTermApprovalWorkflow.
|
||||||
|
WorkflowHandler.getInstance().resumeWorkflow("GlossaryTermApprovalWorkflow");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -485,12 +490,19 @@ public class GlossaryTermResourceTest extends EntityResourceTest<GlossaryTerm, C
|
|||||||
String origJson = JsonUtils.pojoToJson(g2t5);
|
String origJson = JsonUtils.pojoToJson(g2t5);
|
||||||
|
|
||||||
// Add reviewer DATA_CONSUMER in PATCH request
|
// Add reviewer DATA_CONSUMER in PATCH request
|
||||||
g2t5.withReviewers(List.of(DATA_CONSUMER_REF, USER1_REF, USER2_REF));
|
List<EntityReference> newReviewers = List.of(DATA_CONSUMER_REF, USER1_REF, USER2_REF);
|
||||||
|
g2t5.withReviewers(newReviewers);
|
||||||
|
|
||||||
ChangeDescription change = getChangeDescription(g2t5, MINOR_UPDATE);
|
double previousVersion = g2t5.getVersion();
|
||||||
fieldAdded(change, "reviewers", List.of(DATA_CONSUMER_REF));
|
g2t5 = patchEntityUsingFqn(g2t5.getFullyQualifiedName(), origJson, g2t5, ADMIN_AUTH_HEADERS);
|
||||||
fieldUpdated(change, "status", Status.DRAFT.value(), Status.IN_REVIEW.value());
|
|
||||||
g2t5 = patchEntityUsingFqnAndCheck(g2t5, origJson, ADMIN_AUTH_HEADERS, MINOR_UPDATE, change);
|
// Due to the Glossary Workflow changing the Status from 'DRAFT' to 'IN_REVIEW' as a
|
||||||
|
// GovernanceBot, two changes are created.
|
||||||
|
assertEquals(g2t5.getVersion(), previousVersion + 0.2, 0.0001);
|
||||||
|
assertTrue(
|
||||||
|
g2t5.getReviewers().containsAll(newReviewers)
|
||||||
|
&& newReviewers.containsAll(g2t5.getReviewers()));
|
||||||
|
assertEquals(g2t5.getStatus(), Status.IN_REVIEW);
|
||||||
|
|
||||||
Thread approvalTask1 =
|
Thread approvalTask1 =
|
||||||
assertApprovalTask(g2t5, TaskStatus.Open); // A Request Approval task is opened
|
assertApprovalTask(g2t5, TaskStatus.Open); // A Request Approval task is opened
|
||||||
|
@ -105,6 +105,9 @@ public final class TestUtils {
|
|||||||
public static String LONG_ENTITY_NAME = "a".repeat(256 + 1);
|
public static String LONG_ENTITY_NAME = "a".repeat(256 + 1);
|
||||||
public static final Map<String, String> ADMIN_AUTH_HEADERS =
|
public static final Map<String, String> ADMIN_AUTH_HEADERS =
|
||||||
authHeaders(ADMIN_USER_NAME + "@open-metadata.org");
|
authHeaders(ADMIN_USER_NAME + "@open-metadata.org");
|
||||||
|
public static final String GOVERNANCE_BOT = "governance-bot";
|
||||||
|
public static final Map<String, String> GOVERNANCE_BOT_AUTH_HEADERS =
|
||||||
|
authHeaders(GOVERNANCE_BOT + "@open-metadata.org");
|
||||||
public static final String INGESTION_BOT = "ingestion-bot";
|
public static final String INGESTION_BOT = "ingestion-bot";
|
||||||
public static final Map<String, String> INGESTION_BOT_AUTH_HEADERS =
|
public static final Map<String, String> INGESTION_BOT_AUTH_HEADERS =
|
||||||
authHeaders(INGESTION_BOT + "@open-metadata.org");
|
authHeaders(INGESTION_BOT + "@open-metadata.org");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user