diff --git a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/lineage/UpdateLineageResolver.java b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/lineage/UpdateLineageResolver.java index 928e33d44c84e7..e8b227f1327ab8 100644 --- a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/lineage/UpdateLineageResolver.java +++ b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/lineage/UpdateLineageResolver.java @@ -222,16 +222,15 @@ private void checkLineageEdgePrivileges( if (!isAuthorized(context, upstreamUrn, editLineagePrivileges)) { throw new AuthorizationException( String.format( - "Unauthorized to edit %s lineage. Please contact your DataHub administrator.", - upstreamUrn.getEntityType())); + "Unauthorized to edit %s lineage for %s", upstreamUrn, upstreamUrn.getEntityType())); } Urn downstreamUrn = UrnUtils.getUrn(lineageEdge.getDownstreamUrn()); if (!isAuthorized(context, downstreamUrn, editLineagePrivileges)) { throw new AuthorizationException( String.format( - "Unauthorized to edit %s lineage. Please contact your DataHub administrator.", - downstreamUrn.getEntityType())); + "Unauthorized to edit %s lineage for %s", + downstreamUrn, downstreamUrn.getEntityType())); } } diff --git a/datahub-web-react/src/app/lineage/manage/ManageLineageModal.tsx b/datahub-web-react/src/app/lineage/manage/ManageLineageModal.tsx index ed792724ebedf7..5648838bb5e0d6 100644 --- a/datahub-web-react/src/app/lineage/manage/ManageLineageModal.tsx +++ b/datahub-web-react/src/app/lineage/manage/ManageLineageModal.tsx @@ -107,8 +107,8 @@ export default function ManageLineageModal({ }); } }) - .catch(() => { - message.error('Error updating lineage'); + .catch((error) => { + message.error(error.message || 'Error updating lineage'); }); } diff --git a/datahub-web-react/src/app/lineageV2/manualLineage/ManageLineageModal.tsx b/datahub-web-react/src/app/lineageV2/manualLineage/ManageLineageModal.tsx index 9f70de2b6f675e..8cd8b7cb7a65e5 100644 --- a/datahub-web-react/src/app/lineageV2/manualLineage/ManageLineageModal.tsx +++ b/datahub-web-react/src/app/lineageV2/manualLineage/ManageLineageModal.tsx @@ -85,9 +85,8 @@ export default function ManageLineageModal({ node, direction, closeModal, refetc }); } }) - .catch((e) => { - message.error('Error updating lineage'); - console.warn(e); + .catch((error) => { + message.error(error.message || 'Error updating lineage'); }); } diff --git a/docker/datahub-gms/Dockerfile b/docker/datahub-gms/Dockerfile index 232802a6bad8b8..c5e00aa40e471a 100644 --- a/docker/datahub-gms/Dockerfile +++ b/docker/datahub-gms/Dockerfile @@ -49,11 +49,11 @@ COPY --from=binary /go/bin/dockerize /usr/local/bin ENV LD_LIBRARY_PATH="/lib:/lib64" FROM base AS prod-install -COPY war.war /datahub/datahub-gms/bin/war.war COPY metadata-models/src/main/resources/entity-registry.yml /datahub/datahub-gms/resources/entity-registry.yml COPY docker/datahub-gms/start.sh /datahub/datahub-gms/scripts/start.sh COPY docker/monitoring/client-prometheus-config.yaml /datahub/datahub-gms/scripts/prometheus-config.yaml RUN chmod +x /datahub/datahub-gms/scripts/start.sh +COPY war.war /datahub/datahub-gms/bin/war.war FROM base AS dev-install # Dummy stage for development. Assumes code is built on your machine and mounted to this image. diff --git a/docs/features/feature-guides/ui-lineage.md b/docs/features/feature-guides/ui-lineage.md index a91046e7ec5e7a..d137424b3896b4 100644 --- a/docs/features/feature-guides/ui-lineage.md +++ b/docs/features/feature-guides/ui-lineage.md @@ -5,6 +5,8 @@ The UI shows the latest version of the data lineage. The time picker can be used ## Editing from Lineage Graph View +Ensure that you have `Edit lineage` privilege on both upstream and downstream entities before you try to add upstream or downstream lineage. + The first place that you can edit data lineage for entities is from the Lineage Visualization screen. Click on the "Lineage" button on the top right of an entity's profile to get to this view.
diff --git a/metadata-service/auth-impl/src/main/java/com/datahub/authorization/DataHubAuthorizer.java b/metadata-service/auth-impl/src/main/java/com/datahub/authorization/DataHubAuthorizer.java index 54f5c6de37d9f6..29ec33ff646c4b 100644 --- a/metadata-service/auth-impl/src/main/java/com/datahub/authorization/DataHubAuthorizer.java +++ b/metadata-service/auth-impl/src/main/java/com/datahub/authorization/DataHubAuthorizer.java @@ -367,7 +367,7 @@ public void run() { writeLock.unlock(); } - log.debug(String.format("Successfully fetched %s policies.", total)); + log.debug("Successfully fetched {} policies.", total); } catch (Exception e) { log.error( "Caught exception while loading Policy cache. Will retry on next scheduled attempt.", diff --git a/metadata-service/auth-impl/src/main/java/com/datahub/authorization/PolicyEngine.java b/metadata-service/auth-impl/src/main/java/com/datahub/authorization/PolicyEngine.java index e1d2e20de21572..72c33601132eb9 100644 --- a/metadata-service/auth-impl/src/main/java/com/datahub/authorization/PolicyEngine.java +++ b/metadata-service/auth-impl/src/main/java/com/datahub/authorization/PolicyEngine.java @@ -191,11 +191,10 @@ private boolean isResourceMatch( return true; } if (policyResourceFilter == null) { - // No resource defined on the policy. + log.debug("No resource defined on the policy."); return true; } if (requestResource.isEmpty()) { - // Resource filter present in policy, but no resource spec provided. log.debug("Resource filter present in policy, but no resource spec provided."); return false; } diff --git a/metadata-service/auth-impl/src/main/java/com/datahub/authorization/PolicyFetcher.java b/metadata-service/auth-impl/src/main/java/com/datahub/authorization/PolicyFetcher.java index a2b464f819419c..6c281959feb703 100644 --- a/metadata-service/auth-impl/src/main/java/com/datahub/authorization/PolicyFetcher.java +++ b/metadata-service/auth-impl/src/main/java/com/datahub/authorization/PolicyFetcher.java @@ -81,7 +81,7 @@ public PolicyFetchResult fetchPolicies( public PolicyFetchResult fetchPolicies( OperationContext opContext, String query, int count, @Nullable String scrollId, Filter filter) throws RemoteInvocationException, URISyntaxException { - log.debug(String.format("Batch fetching policies. count: %s, scroll: %s", count, scrollId)); + log.debug("Batch fetching policies. count: {}, scroll: {}", count, scrollId); // First fetch all policy urns ScrollResult result =