Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
0a1e5b4
Fix Payload Size issue, increase bufer
mohityadav766 Apr 13, 2026
8065041
Handle single entitiy with > 10 mb
mohityadav766 Apr 13, 2026
877d2c7
Single entity push
mohityadav766 Apr 13, 2026
fcf5127
Normalize SQl Queries
mohityadav766 Apr 14, 2026
edcff68
Update generated TypeScript types
github-actions[bot] Apr 14, 2026
cef9a72
Add Tests
mohityadav766 Apr 14, 2026
08d6bc9
Merge remote-tracking branch 'origin/fix-payload-issue' into fix-payl…
mohityadav766 Apr 14, 2026
a245171
Fix Failing Test
mohityadav766 Apr 14, 2026
71d7b31
Revert fixes
mohityadav766 Apr 14, 2026
72a8996
Fix Tests
mohityadav766 Apr 14, 2026
4a375e2
Strip Lineage
mohityadav766 Apr 14, 2026
c01e484
Strip lIneage and make default 9 mb
mohityadav766 Apr 14, 2026
9093eca
Merge branch 'main' into fix-payload-issue
mohityadav766 Apr 14, 2026
724fa21
Add Warn log on Large entity size
mohityadav766 Apr 14, 2026
394f380
Review Comments
mohityadav766 Apr 14, 2026
cac39e6
Merge branch 'main' into fix-payload-issue
mohityadav766 Apr 14, 2026
9e6831a
Remove hierarchical fields
mohityadav766 Apr 14, 2026
c1f6773
Merge remote-tracking branch 'origin/fix-payload-issue' into fix-payl…
mohityadav766 Apr 14, 2026
b8f8401
remove team containing users
mohityadav766 Apr 14, 2026
d8602e3
Merge origin/main into fix-service-issue
mohityadav766 Apr 14, 2026
e336f28
revert unwanted changes
mohityadav766 Apr 14, 2026
e873c9d
MINOR: Address review comments from PR #27236 (#27255)
ulixius9 Apr 14, 2026
bb0daa1
RDF, cleanup relations and remove unnecessary bindings, add distribut…
harshach Apr 14, 2026
4f8e722
Fixed the component re-rendering issue which causes the Entity test f…
Rohit0301 Apr 14, 2026
3c4f602
fix flaky search index application specs (#27349)
shrabantipaul-collate Apr 15, 2026
64e254d
feat: implement Content Security Policy nonce handling for enhanced s…
chirag-madlani Apr 15, 2026
bb64349
fix(playwright): replace flaky toast assertion with search-based dele…
harsh-vador Apr 15, 2026
c2a75de
Fix Parquet Reader to use boto3 client (#27361)
harshach Apr 15, 2026
52a5dec
Merge remote-tracking branch 'origin/fix-payload-issue' into claude/n…
mohityadav766 Apr 15, 2026
aaeb05a
Fix test failures from payload size default change
mohityadav766 Apr 15, 2026
100f715
Fix hardcoded payload size fallback in DistributedJobParticipant
mohityadav766 Apr 15, 2026
a732c8b
Spotless
mohityadav766 Apr 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
docker/development/docker-volume
docker/docker-compose-quickstart/docker-volume
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ inputs:
description: Arguments to pass to run_local_docker.sh
required: false
default: "-m no-ui -d mysql" # Use "-d postgresql" for postgres and Opensearch
startup-script:
description: Startup script used to launch the local OpenMetadata test environment
required: false
default: "./docker/run_local_docker.sh"
ingestion_dependency:
description: Ingestion dependency to pass to run_local_docker.sh
required: false
Expand Down Expand Up @@ -97,4 +101,4 @@ runs:
timeout_minutes: 60
max_attempts: 2
retry_on: error
command: ./docker/run_local_docker.sh ${{ inputs.args }}
command: ${{ inputs.startup-script }} ${{ inputs.args }}
224 changes: 224 additions & 0 deletions .github/workflows/playwright-knowledge-graph-postgresql-e2e.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,224 @@
# Copyright 2021 Collate
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

name: Postgresql PR Knowledge Graph E2E Tests
on:
workflow_dispatch:
pull_request:
types:
- opened
- synchronize
- reopened
- ready_for_review
paths:
- ".github/actions/setup-openmetadata-test-environment/action.yml"
- ".github/workflows/playwright-knowledge-graph-postgresql-e2e.yml"
- "docker/run_local_docker.sh"
- "docker/run_local_docker_common.sh"
- "docker/run_local_docker_rdf.sh"
- "docker/validate_compose.py"
- "docker/development/docker-compose-fuseki.yml"
- "docker/development/docker-compose-postgres-fuseki.yml"
- "docs/rdf-local-development.md"
- "openmetadata-service/src/main/java/org/openmetadata/service/apps/bundles/rdf/**"
- "openmetadata-service/src/main/java/org/openmetadata/service/rdf/**"
- "openmetadata-service/src/main/java/org/openmetadata/service/resources/rdf/**"
- "openmetadata-service/src/test/java/org/openmetadata/service/apps/bundles/rdf/**"
- "openmetadata-service/src/test/java/org/openmetadata/service/rdf/**"
- "openmetadata-service/src/test/java/org/openmetadata/service/resources/rdf/**"
- "openmetadata-spec/src/main/resources/rdf/**"
- "openmetadata-ui/src/main/resources/ui/playwright/e2e/Features/KnowledgeGraph.spec.ts"
- "openmetadata-ui/src/main/resources/ui/playwright.config.ts"
- "openmetadata-ui/src/main/resources/ui/src/components/KnowledgeGraph/**"
- "openmetadata-ui/src/main/resources/ui/src/components/OntologyExplorer/**"
- "openmetadata-ui/src/main/resources/ui/src/rest/rdfAPI.ts"
- "openmetadata-ui/src/main/resources/ui/src/types/knowledgeGraph.types.ts"
- "openmetadata-ui/src/main/resources/ui/src/utils/TableUtils.tsx"

permissions:
contents: read

concurrency:
group: playwright-knowledge-graph-pr-postgresql-${{ github.event.pull_request.number || github.run_id }}
cancel-in-progress: true

jobs:
build:
runs-on: ubuntu-latest
if: ${{ github.event_name != 'pull_request' || !github.event.pull_request.draft }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}

- name: Setup JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'

- name: Cache Maven Dependencies
uses: actions/cache@v4
with:
path: ~/.m2
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-

- name: Install antlr cli
run: sudo make install_antlr_cli

- name: Build with Maven
run: mvn -DskipTests clean package

- name: Upload Maven build artifact
uses: actions/upload-artifact@v4
with:
name: openmetadata-build
path: openmetadata-dist/target/openmetadata-*.tar.gz
retention-days: 1

playwright-knowledge-graph-postgresql:
needs: [build]
runs-on: ubuntu-latest
if: ${{ !cancelled() && needs.build.result == 'success' && (github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork) }}
environment: test
steps:
- name: Free Disk Space (Ubuntu)
uses: jlumbroso/free-disk-space@main
with:
tool-cache: false
android: true
dotnet: true
haskell: true
large-packages: false
swap-storage: true
docker-images: false

- name: Checkout
uses: actions/checkout@v4
with:
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}

- name: Prepare temporary directory for Maven build artifact
run: mkdir -p "${{ runner.temp }}/openmetadata-build-artifact"

- name: Download Maven build artifact
uses: actions/download-artifact@v4
with:
name: openmetadata-build
path: ${{ runner.temp }}/openmetadata-build-artifact

- name: Copy Maven build artifact into workspace
run: |
mkdir -p openmetadata-dist/target
cp -a "${{ runner.temp }}/openmetadata-build-artifact/." openmetadata-dist/target/

- name: Setup Openmetadata Test Environment
uses: ./.github/actions/setup-openmetadata-test-environment
with:
python-version: "3.10"
args: "-d postgresql -s true"
startup-script: "./docker/run_local_docker_rdf.sh"
ingestion_dependency: "all"

- name: Wait for Fuseki to be healthy
run: |
echo "Verifying Fuseki is healthy before running tests..."
for i in $(seq 1 30); do
if curl -sf "http://localhost:3030/\$/ping" > /dev/null 2>&1; then
echo "Fuseki is healthy"
exit 0
fi
echo "Waiting for Fuseki ($i/30)..."
sleep 10
done
echo "Fuseki failed health check. Container logs:"
docker logs openmetadata-fuseki --tail 100
exit 1

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version-file: "openmetadata-ui/src/main/resources/ui/.nvmrc"

- name: Install dependencies
working-directory: openmetadata-ui/src/main/resources/ui/
run: yarn --ignore-scripts --frozen-lockfile

- name: Install Playwright Browsers
run: npx playwright@1.57.0 install chromium --with-deps

- name: Run Knowledge Graph Playwright tests
working-directory: openmetadata-ui/src/main/resources/ui/
run: npx playwright test --project="Knowledge Graph"
env:
PLAYWRIGHT_IS_OSS: true
PLAYWRIGHT_SNOWFLAKE_USERNAME: ${{ secrets.TEST_SNOWFLAKE_USERNAME }}
PLAYWRIGHT_SNOWFLAKE_PASSWORD: ${{ secrets.TEST_SNOWFLAKE_PASSWORD }}
PLAYWRIGHT_SNOWFLAKE_ACCOUNT: ${{ secrets.TEST_SNOWFLAKE_ACCOUNT }}
PLAYWRIGHT_SNOWFLAKE_DATABASE: ${{ secrets.TEST_SNOWFLAKE_DATABASE }}
PLAYWRIGHT_SNOWFLAKE_WAREHOUSE: ${{ secrets.TEST_SNOWFLAKE_WAREHOUSE }}
PLAYWRIGHT_SNOWFLAKE_PASSPHRASE: ${{ secrets.TEST_SNOWFLAKE_PASSPHRASE }}
PLAYWRIGHT_BQ_PRIVATE_KEY: ${{ secrets.TEST_BQ_PRIVATE_KEY }}
PLAYWRIGHT_BQ_PROJECT_ID: ${{ secrets.PLAYWRIGHT_BQ_PROJECT_ID }}
PLAYWRIGHT_BQ_PRIVATE_KEY_ID: ${{ secrets.TEST_BQ_PRIVATE_KEY_ID }}
PLAYWRIGHT_BQ_PROJECT_ID_TAXONOMY: ${{ secrets.TEST_BQ_PROJECT_ID_TAXONOMY }}
PLAYWRIGHT_BQ_CLIENT_EMAIL: ${{ secrets.TEST_BQ_CLIENT_EMAIL }}
PLAYWRIGHT_BQ_CLIENT_ID: ${{ secrets.TEST_BQ_CLIENT_ID }}
PLAYWRIGHT_REDSHIFT_HOST: ${{ secrets.E2E_REDSHIFT_HOST_PORT }}
PLAYWRIGHT_REDSHIFT_USERNAME: ${{ secrets.E2E_REDSHIFT_USERNAME }}
PLAYWRIGHT_REDSHIFT_PASSWORD: ${{ secrets.E2E_REDSHIFT_PASSWORD }}
PLAYWRIGHT_REDSHIFT_DATABASE: ${{ secrets.TEST_REDSHIFT_DATABASE }}
PLAYWRIGHT_METABASE_USERNAME: ${{ secrets.TEST_METABASE_USERNAME }}
PLAYWRIGHT_METABASE_PASSWORD: ${{ secrets.TEST_METABASE_PASSWORD }}
PLAYWRIGHT_METABASE_DB_SERVICE_NAME: ${{ secrets.TEST_METABASE_DB_SERVICE_NAME }}
PLAYWRIGHT_METABASE_HOST_PORT: ${{ secrets.TEST_METABASE_HOST_PORT }}
PLAYWRIGHT_SUPERSET_USERNAME: ${{ secrets.TEST_SUPERSET_USERNAME }}
PLAYWRIGHT_SUPERSET_PASSWORD: ${{ secrets.TEST_SUPERSET_PASSWORD }}
PLAYWRIGHT_SUPERSET_HOST_PORT: ${{ secrets.TEST_SUPERSET_HOST_PORT }}
PLAYWRIGHT_KAFKA_BOOTSTRAP_SERVERS: ${{ secrets.TEST_KAFKA_BOOTSTRAP_SERVERS }}
PLAYWRIGHT_KAFKA_SCHEMA_REGISTRY_URL: ${{ secrets.TEST_KAFKA_SCHEMA_REGISTRY_URL }}
PLAYWRIGHT_GLUE_ACCESS_KEY: ${{ secrets.TEST_GLUE_ACCESS_KEY }}
PLAYWRIGHT_GLUE_SECRET_KEY: ${{ secrets.TEST_GLUE_SECRET_KEY }}
PLAYWRIGHT_GLUE_AWS_REGION: ${{ secrets.TEST_GLUE_AWS_REGION }}
PLAYWRIGHT_GLUE_ENDPOINT: ${{ secrets.TEST_GLUE_ENDPOINT }}
PLAYWRIGHT_GLUE_STORAGE_SERVICE: ${{ secrets.TEST_GLUE_STORAGE_SERVICE }}
PLAYWRIGHT_MYSQL_USERNAME: ${{ secrets.TEST_MYSQL_USERNAME }}
PLAYWRIGHT_MYSQL_PASSWORD: ${{ secrets.TEST_MYSQL_PASSWORD }}
PLAYWRIGHT_MYSQL_HOST_PORT: ${{ secrets.TEST_MYSQL_HOST_PORT }}
PLAYWRIGHT_MYSQL_DATABASE_SCHEMA: ${{ secrets.TEST_MYSQL_DATABASE_SCHEMA }}
PLAYWRIGHT_POSTGRES_USERNAME: ${{ secrets.TEST_POSTGRES_USERNAME }}
PLAYWRIGHT_POSTGRES_PASSWORD: ${{ secrets.TEST_POSTGRES_PASSWORD }}
PLAYWRIGHT_POSTGRES_HOST_PORT: ${{ secrets.TEST_POSTGRES_HOST_PORT }}
PLAYWRIGHT_POSTGRES_DATABASE: ${{ secrets.TEST_POSTGRES_DATABASE }}
PLAYWRIGHT_AIRFLOW_HOST_PORT: ${{ secrets.TEST_AIRFLOW_HOST_PORT }}
PLAYWRIGHT_ML_MODEL_TRACKING_URI: ${{ secrets.TEST_ML_MODEL_TRACKING_URI }}
PLAYWRIGHT_ML_MODEL_REGISTRY_URI: ${{ secrets.TEST_ML_MODEL_REGISTRY_URI }}
PLAYWRIGHT_S3_STORAGE_ACCESS_KEY_ID: ${{ secrets.TEST_S3_STORAGE_ACCESS_KEY_ID }}
PLAYWRIGHT_S3_STORAGE_SECRET_ACCESS_KEY: ${{ secrets.TEST_S3_STORAGE_SECRET_ACCESS_KEY }}
PLAYWRIGHT_S3_STORAGE_END_POINT_URL: ${{ secrets.TEST_S3_STORAGE_END_POINT_URL }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- uses: actions/upload-artifact@v4
if: ${{ !cancelled() }}
with:
name: playwright-knowledge-graph-report
path: openmetadata-ui/src/main/resources/ui/playwright/output/playwright-report
retention-days: 5

- name: Clean Up
if: always()
run: |
docker compose -f docker/development/docker-compose-postgres.yml -f docker/development/docker-compose-fuseki.yml down --remove-orphans || true
docker compose -f docker/development/docker-compose-postgres.yml down --remove-orphans || true
sudo rm -rf ${PWD}/docker/development/docker-volume
79 changes: 79 additions & 0 deletions bootstrap/sql/migrations/native/1.13.0/mysql/schemaChanges.sql
Original file line number Diff line number Diff line change
Expand Up @@ -129,3 +129,82 @@ SELECT ue.id, re.id, 'user', 'role', 10
FROM user_entity ue, role_entity re
WHERE ue.name = 'mcpapplicationbot'
AND re.name = 'ApplicationBotImpersonationRole';

-- RDF distributed indexing state tables
CREATE TABLE IF NOT EXISTS rdf_index_job (
id VARCHAR(36) NOT NULL,
status VARCHAR(32) NOT NULL,
jobConfiguration JSON NOT NULL,
totalRecords BIGINT NOT NULL DEFAULT 0,
processedRecords BIGINT NOT NULL DEFAULT 0,
successRecords BIGINT NOT NULL DEFAULT 0,
failedRecords BIGINT NOT NULL DEFAULT 0,
stats JSON,
createdBy VARCHAR(256) NOT NULL,
createdAt BIGINT NOT NULL,
startedAt BIGINT,
completedAt BIGINT,
updatedAt BIGINT NOT NULL,
errorMessage TEXT,
PRIMARY KEY (id),
INDEX idx_rdf_index_job_status (status),
INDEX idx_rdf_index_job_created (createdAt DESC)
);

CREATE TABLE IF NOT EXISTS rdf_index_partition (
id VARCHAR(36) NOT NULL,
jobId VARCHAR(36) NOT NULL,
entityType VARCHAR(128) NOT NULL,
partitionIndex INT NOT NULL,
rangeStart BIGINT NOT NULL,
rangeEnd BIGINT NOT NULL,
estimatedCount BIGINT NOT NULL,
workUnits BIGINT NOT NULL,
priority INT NOT NULL DEFAULT 50,
status VARCHAR(32) NOT NULL DEFAULT 'PENDING',
processingCursor BIGINT NOT NULL DEFAULT 0,
processedCount BIGINT NOT NULL DEFAULT 0,
successCount BIGINT NOT NULL DEFAULT 0,
failedCount BIGINT NOT NULL DEFAULT 0,
assignedServer VARCHAR(255),
claimedAt BIGINT,
startedAt BIGINT,
completedAt BIGINT,
lastUpdateAt BIGINT,
lastError TEXT,
retryCount INT NOT NULL DEFAULT 0,
claimableAt BIGINT NOT NULL DEFAULT 0,
PRIMARY KEY (id),
UNIQUE KEY uk_rdf_partition_job_entity_idx (jobId, entityType, partitionIndex),
INDEX idx_rdf_partition_job (jobId),
INDEX idx_rdf_partition_status_priority (status, priority DESC),
INDEX idx_rdf_partition_claimable (jobId, status, claimableAt),
INDEX idx_rdf_partition_assigned_server (jobId, assignedServer),
CONSTRAINT fk_rdf_partition_job FOREIGN KEY (jobId) REFERENCES rdf_index_job(id) ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS rdf_reindex_lock (
lockKey VARCHAR(64) NOT NULL,
jobId VARCHAR(36) NOT NULL,
serverId VARCHAR(255) NOT NULL,
acquiredAt BIGINT NOT NULL,
lastHeartbeat BIGINT NOT NULL,
expiresAt BIGINT NOT NULL,
PRIMARY KEY (lockKey)
);

CREATE TABLE IF NOT EXISTS rdf_index_server_stats (
id VARCHAR(36) NOT NULL,
jobId VARCHAR(36) NOT NULL,
serverId VARCHAR(256) NOT NULL,
entityType VARCHAR(128) NOT NULL,
processedRecords BIGINT DEFAULT 0,
successRecords BIGINT DEFAULT 0,
failedRecords BIGINT DEFAULT 0,
partitionsCompleted INT DEFAULT 0,
partitionsFailed INT DEFAULT 0,
lastUpdatedAt BIGINT NOT NULL,
PRIMARY KEY (id),
UNIQUE INDEX idx_rdf_index_server_stats_job_server_entity (jobId, serverId, entityType),
INDEX idx_rdf_index_server_stats_job_id (jobId)
);
Loading
Loading