Skip to content

Commit fa26c82

Browse files
authored
Merge branch 'datahub-project:master' into master
2 parents 710ce6d + d303d03 commit fa26c82

File tree

709 files changed

+73497
-8622
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

709 files changed

+73497
-8622
lines changed

.github/.codecov.yml

+9-14
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,19 @@
11
comment:
2-
layout: "header, files, footer" # remove "new" from "header" and "footer"
3-
hide_project_coverage: true # set to false
2+
layout: "condensed_header, condensed_files, condensed_footer"
3+
hide_project_coverage: true
44
require_changes: false # if true: only post the comment if coverage changes
55

66
codecov:
77
#due to ci-optimization, reports for modules that have not changed may be quite old
88
max_report_age: off
99

10+
github_checks:
11+
#Hide annotations that show up in github PR reviews. There still is a red bar next to lines not covered
12+
annotations: false
13+
1014
flag_management:
1115
default_rules: # the rules that will be followed for any flag added, generally
1216
carryforward: true
13-
statuses:
14-
- type: project
15-
target: auto
16-
threshold: 0% #Not enforcing project coverage yet.
17-
- type: patch
18-
target: 90%
1917
individual_flags: # exceptions to the default rules above, stated flag by flag
2018
- name: frontend
2119
paths:
@@ -55,11 +53,8 @@ flag_management:
5553
- "metadata-ingestion-modules/prefect-plugin/**"
5654
coverage:
5755
status:
58-
project:
59-
default:
60-
target: 0% # no threshold enforcement yet
61-
only_pulls: true
56+
project: false
6257
patch:
6358
default:
64-
target: 90% # for new code added in the patch
65-
only_pulls: true
59+
target: 75% # for new code added in the patch
60+
only_pulls: true

.github/workflows/metadata-ingestion.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ concurrency:
2727
jobs:
2828
metadata-ingestion:
2929
runs-on: ubuntu-latest
30-
timeout-minutes: 40
30+
timeout-minutes: 60
3131
env:
3232
DATAHUB_TELEMETRY_ENABLED: false
3333
# TODO: Enable this once the test is fixed.

.github/workflows/pr-labeler.yml

+2-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ jobs:
5151
"acrylJonny",
5252
"chakru-r",
5353
"brock-acryl",
54-
"mminichino"
54+
"mminichino",
55+
"jayacryl"
5556
]'),
5657
github.actor
5758
)

.github/workflows/python-build-pages.yml

+13-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ on:
88
- "metadata-ingestion/**"
99
- "metadata-ingestion-modules/**"
1010
- "metadata-models/**"
11-
pull_request:
11+
pull_request_target:
1212
branches:
1313
- "**"
1414
paths:
@@ -38,7 +38,11 @@ jobs:
3838
distribution: "zulu"
3939
java-version: 17
4040
- uses: gradle/actions/setup-gradle@v4
41-
- uses: acryldata/sane-checkout-action@v3
41+
- uses: actions/checkout@v4
42+
# Note: not using acryldata/sane-checkout-action because this is a
43+
# pull_request_target event, and hence requires `ref`.
44+
with:
45+
ref: ${{ github.event.pull_request.head.sha }}
4246
- uses: actions/setup-python@v5
4347
with:
4448
python-version: "3.10"
@@ -54,11 +58,17 @@ jobs:
5458
env:
5559
GITHUB_TOKEN: ${{ github.token }}
5660
- name: Publish
57-
uses: cloudflare/pages-action@v1
61+
# Cloudflare's pages-action does not support PRs from forks.
62+
# See https://developers.cloudflare.com/pages/platform/known-issues/
63+
# Based on the discussion here https://github.com/json-schema-org/website/issues/330
64+
# we can use a direct upload to work around this limitation.
65+
# See https://github.com/AdrianGonz97/refined-cf-pages-action#enabling-pr-previews-from-forks
66+
uses: AdrianGonz97/refined-cf-pages-action@v1
5867
with:
5968
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
6069
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
6170
projectName: ${{ vars.CLOUDFLARE_WHEELS_PROJECT_NAME }}
71+
deploymentName: ${{ vars.CLOUDFLARE_WHEELS_PROJECT_NAME }}
6272
workingDirectory: python-build
6373
directory: site
6474
gitHubToken: ${{ github.token }}

.pre-commit-config.yaml

+22-8
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Auto-generated by .github/scripts/generate_pre_commit.py at 2025-01-17 16:43:31 UTC
1+
# Auto-generated by .github/scripts/generate_pre_commit.py at 2025-02-11 10:00:11 UTC
22
# Do not edit this file directly. Run the script to regenerate.
33
# Add additional hooks in .github/scripts/pre-commit-override.yaml
44
repos:
@@ -53,13 +53,6 @@ repos:
5353
files: ^metadata-dao-impl/kafka-producer/.*\.java$
5454
pass_filenames: false
5555

56-
- id: metadata-events-mxe-avro-spotless
57-
name: metadata-events/mxe-avro Spotless Apply
58-
entry: ./gradlew :metadata-events:mxe-avro:spotlessApply
59-
language: system
60-
files: ^metadata-events/mxe-avro/.*\.java$
61-
pass_filenames: false
62-
6356
- id: metadata-events-mxe-registration-spotless
6457
name: metadata-events/mxe-registration Spotless Apply
6558
entry: ./gradlew :metadata-events:mxe-registration:spotlessApply
@@ -312,6 +305,20 @@ repos:
312305
files: ^metadata-service/graphql-servlet-impl/.*\.java$
313306
pass_filenames: false
314307

308+
- id: metadata-service-iceberg-catalog-spotless
309+
name: metadata-service/iceberg-catalog Spotless Apply
310+
entry: ./gradlew :metadata-service:iceberg-catalog:spotlessApply
311+
language: system
312+
files: ^metadata-service/iceberg-catalog/.*\.java$
313+
pass_filenames: false
314+
315+
- id: metadata-service-iceberg-catalog-lint-fix
316+
name: metadata-service/iceberg-catalog Lint Fix
317+
entry: ./gradlew :metadata-service:iceberg-catalog:lintFix
318+
language: system
319+
files: ^metadata-service/iceberg-catalog/.*\.py$
320+
pass_filenames: false
321+
315322
- id: metadata-service-openapi-analytics-servlet-spotless
316323
name: metadata-service/openapi-analytics-servlet Spotless Apply
317324
entry: ./gradlew :metadata-service:openapi-analytics-servlet:spotlessApply
@@ -410,6 +417,13 @@ repos:
410417
files: ^metadata-service/servlet/.*\.java$
411418
pass_filenames: false
412419

420+
- id: metadata-service-war-spotless
421+
name: metadata-service/war Spotless Apply
422+
entry: ./gradlew :metadata-service:war:spotlessApply
423+
language: system
424+
files: ^metadata-service/war/.*\.java$
425+
pass_filenames: false
426+
413427
- id: metadata-utils-spotless
414428
name: metadata-utils Spotless Apply
415429
entry: ./gradlew :metadata-utils:spotlessApply

README.md

+29-18
Original file line numberDiff line numberDiff line change
@@ -18,27 +18,38 @@ export const Logo = (props) => {
1818
<!--
1919
HOSTED_DOCS_ONLY-->
2020
<p align="center">
21+
<a href="https://datahubproject.io">
2122
<img alt="DataHub" src="https://raw.githubusercontent.com/datahub-project/static-assets/main/imgs/datahub-logo-color-mark.svg" height="150" />
23+
</a>
2224
</p>
2325
<!-- -->
2426

2527
# DataHub: The Data Discovery Platform for the Modern Data Stack
26-
## Built with ❤️ by <img src="https://datahubproject.io/img/acryl-logo-light-mark.png" width="25"/> [Acryl Data](https://acryldata.io) and <img src="https://datahubproject.io/img/LI-In-Bug.png" width="25"/> [LinkedIn](https://engineering.linkedin.com)
27-
[![Version](https://img.shields.io/github/v/release/datahub-project/datahub?include_prereleases)](https://github.com/datahub-project/datahub/releases/latest)
28-
[![PyPI version](https://badge.fury.io/py/acryl-datahub.svg)](https://badge.fury.io/py/acryl-datahub)
29-
[![build & test](https://github.com/datahub-project/datahub/workflows/build%20&%20test/badge.svg?branch=master&event=push)](https://github.com/datahub-project/datahub/actions?query=workflow%3A%22build+%26+test%22+branch%3Amaster+event%3Apush)
30-
[![Docker Pulls](https://img.shields.io/docker/pulls/acryldata/datahub-gms.svg)](https://hub.docker.com/r/acryldata/datahub-gms)
31-
[![Slack](https://img.shields.io/badge/slack-join_chat-white.svg?logo=slack&style=social)](https://datahubproject.io/slack?utm_source=github&utm_medium=readme&utm_campaign=github_readme)
32-
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/datahub-project/datahub/blob/master/docs/CONTRIBUTING.md)
33-
[![GitHub commit activity](https://img.shields.io/github/commit-activity/m/datahub-project/datahub)](https://github.com/datahub-project/datahub/pulls?q=is%3Apr)
34-
[![License](https://img.shields.io/github/license/datahub-project/datahub)](https://github.com/datahub-project/datahub/blob/master/LICENSE)
35-
[![YouTube](https://img.shields.io/youtube/channel/subscribers/UC3qFQC5IiwR5fvWEqi_tJ5w?style=social)](https://www.youtube.com/channel/UC3qFQC5IiwR5fvWEqi_tJ5w)
36-
[![Medium](https://img.shields.io/badge/Medium-12100E?style=for-the-badge&logo=medium&logoColor=white)](https://medium.com/datahub-project)
37-
[![Follow](https://img.shields.io/twitter/follow/datahubproject?label=Follow&style=social)](https://twitter.com/datahubproject)
38-
### 🏠 Hosted DataHub Docs (Courtesy of Acryl Data): [datahubproject.io](https://datahubproject.io/docs)
28+
29+
### Built with ❤️ by <img src="https://datahubproject.io/img/acryl-logo-light-mark.png" width="20"/> [Acryl Data](https://acryldata.io) and <img src="https://datahubproject.io/img/LI-In-Bug.png" width="20"/> [LinkedIn](https://engineering.linkedin.com)
30+
31+
<div>
32+
<a target="_blank" href="https://github.com/datahub-project/datahub/blob/master/LICENSE">
33+
<img alt="Apache 2.0 License" src="https://img.shields.io/badge/License-Apache_2.0-blue.svg?label=license&labelColor=133554&color=1890ff" /></a>
34+
<a target="_blank" href="https://pypi.org/project/acryl-datahub/">
35+
<img alt="PyPI" src="https://img.shields.io/pypi/dm/acryl-datahub?label=downloads&labelColor=133554&color=1890ff" /></a>
36+
<a target="_blank" href="https://github.com/datahub-project/datahub/pulse">
37+
<img alt="GitHub commit activity" src="https://img.shields.io/github/commit-activity/m/datahub-project/datahub?label=commits&labelColor=133554&color=1890ff" /></a>
38+
<br />
39+
<a target="_blank" href="https://pages.acryl.io/slack?utm_source=github&utm_medium=readme&utm_campaign=github_readme">
40+
<img alt="Slack" src="https://img.shields.io/badge/slack-join_community-red.svg?logo=slack&labelColor=133554&color=1890ff" /></a>
41+
<a href="https://www.youtube.com/channel/UC3qFQC5IiwR5fvWEqi_tJ5w">
42+
<img alt="YouTube" src="https://img.shields.io/youtube/channel/subscribers/UC3qFQC5IiwR5fvWEqi_tJ5w?style=flat&logo=youtube&label=subscribers&labelColor=133554&color=1890ff"/></a>
43+
<a href="https://blog.datahubproject.io/">
44+
<img alt="Medium" src="https://img.shields.io/badge/blog-DataHub-red.svg?style=flat&logo=medium&logoColor=white&labelColor=133554&color=1890ff" /></a>
45+
<a href="https://x.com/datahubproject">
46+
<img alt="X (formerly Twitter) Follow" src="https://img.shields.io/badge/follow-datahubproject-red.svg?style=flat&logo=x&labelColor=133554&color=1890ff" /></a>
47+
</div>
3948

4049
---
4150

51+
### 🏠 Docs: [datahubproject.io](https://datahubproject.io/docs)
52+
4253
[Quickstart](https://datahubproject.io/docs/quickstart) |
4354
[Features](https://datahubproject.io/docs/) |
4455
[Roadmap](https://feature-requests.datahubproject.io/roadmap) |
@@ -47,6 +58,7 @@ HOSTED_DOCS_ONLY-->
4758
[Town Hall](https://datahubproject.io/docs/townhalls)
4859

4960
---
61+
5062
> 📣 DataHub Town Hall is the 4th Thursday at 9am US PT of every month - [add it to your calendar!](https://rsvp.datahubproject.io/)
5163
>
5264
> - Town-hall Zoom link: [zoom.datahubproject.io](https://zoom.datahubproject.io)
@@ -70,11 +82,11 @@ Check out DataHub's [Features](docs/features.md) & [Roadmap](https://feature-req
7082

7183
## Demo and Screenshots
7284

73-
There's a [hosted demo environment](https://demo.datahubproject.io/) courtesy of [Acryl Data](https://acryldata.io) where you can explore DataHub without installing it locally
85+
There's a [hosted demo environment](https://demo.datahubproject.io/) courtesy of [Acryl Data](https://acryldata.io) where you can explore DataHub without installing it locally.
7486

7587
## Quickstart
7688

77-
Please follow the [DataHub Quickstart Guide](https://datahubproject.io/docs/quickstart) to get a copy of DataHub up & running locally using [Docker](https://docker.com). As the guide assumes some basic knowledge of Docker, we'd recommend you to go through the "Hello World" example of [A Docker Tutorial for Beginners](https://docker-curriculum.com) if Docker is completely foreign to you.
89+
Please follow the [DataHub Quickstart Guide](https://datahubproject.io/docs/quickstart) to run DataHub locally using [Docker](https://docker.com).
7890

7991
## Development
8092

@@ -106,7 +118,7 @@ We welcome contributions from the community. Please refer to our [Contributing G
106118

107119
## Community
108120

109-
Join our [Slack workspace](https://datahubproject.io/slack?utm_source=github&utm_medium=readme&utm_campaign=github_readme) for discussions and important announcements. You can also find out more about our upcoming [town hall meetings](docs/townhalls.md) and view past recordings.
121+
Join our [Slack workspace](https://pages.acryl.io/slack?utm_source=github&utm_medium=readme&utm_campaign=github_readme) for discussions and important announcements. You can also find out more about our upcoming [town hall meetings](docs/townhalls.md) and view past recordings.
110122

111123
## Security
112124

@@ -154,12 +166,11 @@ Here are the companies that have officially adopted DataHub. Please feel free to
154166
- [Udemy](https://www.udemy.com/)
155167
- [Uphold](https://uphold.com)
156168
- [Viasat](https://viasat.com)
169+
- [Wealthsimple](https://www.wealthsimple.com)
157170
- [Wikimedia](https://www.wikimedia.org)
158171
- [Wolt](https://wolt.com)
159172
- [Zynga](https://www.zynga.com)
160173

161-
162-
163174
## Select Articles & Talks
164175

165176
- [DataHub Blog](https://blog.datahubproject.io/)

build.gradle

+2-2
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ project.ext.externalDependency = [
186186
'jsonPatch': 'jakarta.json:jakarta.json-api:2.1.3',
187187
'jsonPathImpl': 'org.eclipse.parsson:parsson:1.1.6',
188188
'jsonSimple': 'com.googlecode.json-simple:json-simple:1.1.1',
189-
'jsonSmart': 'net.minidev:json-smart:2.4.9',
189+
'jsonSmart': 'net.minidev:json-smart:2.5.2',
190190
'json': 'org.json:json:20231013',
191191
'jsonSchemaValidator': 'com.github.java-json-tools:json-schema-validator:2.2.14',
192192
'junit': 'junit:junit:4.13.2',
@@ -419,7 +419,7 @@ subprojects {
419419
implementation externalDependency.annotationApi
420420
constraints {
421421
implementation("com.google.googlejavaformat:google-java-format:$googleJavaFormatVersion")
422-
implementation('io.netty:netty-all:4.1.116.Final')
422+
implementation('io.netty:netty-all:4.1.118.Final')
423423
implementation('org.apache.commons:commons-compress:1.27.1')
424424
implementation('org.apache.velocity:velocity-engine-core:2.4')
425425
implementation('org.hibernate:hibernate-validator:6.0.20.Final')

datahub-frontend/play.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ dependencies {
3232
play(externalDependency.jacksonDataBind)
3333
play("com.typesafe.akka:akka-actor_$playScalaVersion:2.6.20")
3434
play(externalDependency.jsonSmart)
35-
play('io.netty:netty-all:4.1.114.Final')
35+
play('io.netty:netty-all:4.1.118.Final')
3636

3737
implementation(externalDependency.commonsText) {
3838
because("previous versions are vulnerable to CVE-2022-42889")

datahub-graphql-core/build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ dependencies {
2929

3030
testImplementation externalDependency.mockito
3131
testImplementation externalDependency.testng
32+
testImplementation externalDependency.mockitoInline
3233
}
3334

3435
graphqlCodegen {

datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/GmsGraphQLEngine.java

+4
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@
204204
import com.linkedin.datahub.graphql.resolvers.health.EntityHealthResolver;
205205
import com.linkedin.datahub.graphql.resolvers.incident.EntityIncidentsResolver;
206206
import com.linkedin.datahub.graphql.resolvers.incident.RaiseIncidentResolver;
207+
import com.linkedin.datahub.graphql.resolvers.incident.UpdateIncidentResolver;
207208
import com.linkedin.datahub.graphql.resolvers.incident.UpdateIncidentStatusResolver;
208209
import com.linkedin.datahub.graphql.resolvers.ingest.execution.CancelIngestionExecutionRequestResolver;
209210
import com.linkedin.datahub.graphql.resolvers.ingest.execution.CreateIngestionExecutionRequestResolver;
@@ -1397,6 +1398,9 @@ private void configureMutationResolvers(final RuntimeWiring.Builder builder) {
13971398
.dataFetcher(
13981399
"updateIncidentStatus",
13991400
new UpdateIncidentStatusResolver(this.entityClient, this.entityService))
1401+
.dataFetcher(
1402+
"updateIncident",
1403+
new UpdateIncidentResolver(this.entityClient, this.entityService))
14001404
.dataFetcher(
14011405
"createForm", new CreateFormResolver(this.entityClient, this.formService))
14021406
.dataFetcher("deleteForm", new DeleteFormResolver(this.entityClient))

datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/analytics/resolver/GetChartsResolver.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ private Row buildNewUsersRow(@Nonnull final SearchEntity entity) {
186186
private AnalyticsChart getNewUsersChart(OperationContext opContext) {
187187
try {
188188
final List<String> columns = ImmutableList.of("Name", "Title", "Email");
189-
final String newUsersTitle = "Active Users (Last 30 Days)";
189+
final String newUsersTitle = "New Users (Last 30 Days)";
190190
final SearchResult result = searchForNewUsers(opContext);
191191
final List<Row> newUserRows = new ArrayList<>();
192192
for (SearchEntity entity : result.getEntities()) {

datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/businessattribute/AddBusinessAttributeResolver.java

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static com.linkedin.datahub.graphql.resolvers.ResolverUtils.bindArgument;
44
import static com.linkedin.datahub.graphql.resolvers.mutate.MutationUtils.buildMetadataChangeProposalWithUrn;
5+
import static com.linkedin.datahub.graphql.resolvers.mutate.util.BusinessAttributeUtils.validateInputResources;
56
import static com.linkedin.metadata.Constants.BUSINESS_ATTRIBUTE_ASPECT;
67

78
import com.linkedin.businessattribute.BusinessAttributeAssociation;
@@ -43,6 +44,7 @@ public CompletableFuture<Boolean> get(DataFetchingEnvironment environment) throw
4344
return GraphQLConcurrencyUtils.supplyAsync(
4445
() -> {
4546
try {
47+
validateInputResources(resourceRefInputs, context);
4648
addBusinessAttributeToResource(
4749
context.getOperationContext(),
4850
businessAttributeUrn,

datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/businessattribute/BusinessAttributeAuthorizationUtils.java

+21
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
package com.linkedin.datahub.graphql.resolvers.businessattribute;
22

3+
import static com.linkedin.datahub.graphql.authorization.AuthorizationUtils.ALL_PRIVILEGES_GROUP;
4+
35
import com.datahub.authorization.AuthUtil;
46
import com.datahub.authorization.ConjunctivePrivilegeGroup;
57
import com.datahub.authorization.DisjunctivePrivilegeGroup;
68
import com.google.common.collect.ImmutableList;
9+
import com.linkedin.common.urn.Urn;
710
import com.linkedin.datahub.graphql.QueryContext;
11+
import com.linkedin.datahub.graphql.authorization.AuthorizationUtils;
812
import com.linkedin.metadata.authorization.PoliciesConfig;
13+
import java.net.URISyntaxException;
914
import javax.annotation.Nonnull;
1015

1116
public class BusinessAttributeAuthorizationUtils {
@@ -32,4 +37,20 @@ public static boolean canManageBusinessAttribute(@Nonnull QueryContext context)
3237
PoliciesConfig.MANAGE_BUSINESS_ATTRIBUTE_PRIVILEGE.getType()))));
3338
return AuthUtil.isAuthorized(context.getOperationContext(), orPrivilegeGroups, null);
3439
}
40+
41+
public static boolean isAuthorizedToEditBusinessAttribute(
42+
@Nonnull QueryContext context, String targetUrn) throws URISyntaxException {
43+
Urn schemaFieldUrn = Urn.createFromString(targetUrn);
44+
Urn datasetUrn = schemaFieldUrn.getIdAsUrn();
45+
final DisjunctivePrivilegeGroup orPrivilegeGroups =
46+
new DisjunctivePrivilegeGroup(
47+
ImmutableList.of(
48+
ALL_PRIVILEGES_GROUP,
49+
new ConjunctivePrivilegeGroup(
50+
ImmutableList.of(
51+
PoliciesConfig.EDIT_DATASET_COL_BUSINESS_ATTRIBUTE_PRIVILEGE.getType()))));
52+
53+
return AuthorizationUtils.isAuthorized(
54+
context, datasetUrn.getEntityType(), datasetUrn.toString(), orPrivilegeGroups);
55+
}
3556
}

datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/businessattribute/RemoveBusinessAttributeResolver.java

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static com.linkedin.datahub.graphql.resolvers.ResolverUtils.bindArgument;
44
import static com.linkedin.datahub.graphql.resolvers.mutate.MutationUtils.buildMetadataChangeProposalWithUrn;
5+
import static com.linkedin.datahub.graphql.resolvers.mutate.util.BusinessAttributeUtils.validateInputResources;
56
import static com.linkedin.metadata.Constants.BUSINESS_ATTRIBUTE_ASPECT;
67

78
import com.linkedin.businessattribute.BusinessAttributes;
@@ -40,6 +41,7 @@ public CompletableFuture<Boolean> get(DataFetchingEnvironment environment) throw
4041
return GraphQLConcurrencyUtils.supplyAsync(
4142
() -> {
4243
try {
44+
validateInputResources(resourceRefInputs, context);
4345
removeBusinessAttribute(
4446
context.getOperationContext(),
4547
resourceRefInputs,

0 commit comments

Comments
 (0)