diff --git a/metadata-ingestion/src/datahub/cli/delete_cli.py b/metadata-ingestion/src/datahub/cli/delete_cli.py index 584bfc1f7c..8b852513e0 100644 --- a/metadata-ingestion/src/datahub/cli/delete_cli.py +++ b/metadata-ingestion/src/datahub/cli/delete_cli.py @@ -213,6 +213,17 @@ def references(urn: str, dry_run: bool, force: bool) -> None: logger.info(f"Deleted {references_count} references to {urn}") +@delete.command() +@click.option("--urn", required=True, type=str, help="the urn of the entity") +def undo_by_filter(urn: str) -> None: + """ + Undo a soft deletion of an entity + """ + graph = get_default_graph() + logger.info(f"Using {graph}") + graph.set_soft_delete_status(urn=urn, delete=False) + + @delete.command(no_args_is_help=True) @click.option( "--urn", diff --git a/metadata-ingestion/src/datahub/ingestion/graph/client.py b/metadata-ingestion/src/datahub/ingestion/graph/client.py index 1d2528a24c..c90ac93eee 100644 --- a/metadata-ingestion/src/datahub/ingestion/graph/client.py +++ b/metadata-ingestion/src/datahub/ingestion/graph/client.py @@ -1241,14 +1241,29 @@ class DataHubGraph(DatahubRestEmitter): Args: urn: The urn of the entity to soft-delete. """ + self.set_soft_delete_status( + urn=urn, run_id=run_id, deletion_timestamp=deletion_timestamp, delete=True + ) + def set_soft_delete_status( + self, + urn: str, + delete: bool, + run_id: str = _GRAPH_DUMMY_RUN_ID, + deletion_timestamp: Optional[int] = None, + ) -> None: + """Change status of soft-delete an entity by urn. + + Args: + urn: The urn of the entity to soft-delete. + """ assert urn deletion_timestamp = deletion_timestamp or int(time.time() * 1000) self.emit( MetadataChangeProposalWrapper( entityUrn=urn, - aspect=StatusClass(removed=True), + aspect=StatusClass(removed=delete), systemMetadata=SystemMetadataClass( runId=run_id, lastObserved=deletion_timestamp ),