Skip to content

docs(v1.1): Enable Iceberg REST Catalog — milestone PR description - #2

Merged
eperrella merged 12 commits into
developfrom
copilot/update-documentation-for-iceberg-rest-catalog
Feb 20, 2026
Merged

docs(v1.1): Enable Iceberg REST Catalog — milestone PR description#2
eperrella merged 12 commits into
developfrom
copilot/update-documentation-for-iceberg-rest-catalog

Conversation

Copilot AI commented Feb 20, 2026

Copy link
Copy Markdown

Updates the PR description for the v1.1 milestone to a structured, information-dense summary covering all phases, acceptance criteria, key files, and known gaps for the Iceberg REST Catalog feature.

Changes

  • PR description: Replaced placeholder text with full milestone documentation including acceptance criteria table, phase breakdown (1–8), key files changed, deferred work (native credential vending), and test evidence against Lakekeeper and Nessie
Original prompt

Context

This is a documentation-only PR: create a pull request from branch milestones/enable_iceberg_rest_catalog into develop. Do not modify any source code. The only task is to open the PR with a rich, accurate description summarising all the activities carried out in the milestones/enable_iceberg_rest_catalog milestone (v1.1).


Pull Request Description to write

Write the PR body in Markdown. It must cover all of the phases and commits found in the milestone branch, as reconstructed below from the commit history. The description should be structured as follows:


🎯 Summary

This PR merges milestone v1.1 — Enable Iceberg REST Catalog into develop.

It wires a brand-new Iceberg REST Catalog source type into Dremio OSS, enabling read-only SQL connectivity to any Iceberg REST Catalog server (Lakekeeper, Nessie) without modifying upstream Dremio Java code beyond the plugin boundary.


✅ Acceptance Criteria — all passed

ID Criterion Result
CONN-01 Source reaches GOOD state after creation ✅ Passed
READ-01 Namespace testns browsable in UI ✅ Passed
READ-02 Table users listed under namespace ✅ Passed
READ-03 SELECT * FROM ... returns 10 rows ✅ Passed
CONN-02 rest.token listed in secretPropertyList ✅ Passed
CONN-03 Static fs.s3a.* credentials workaround validated ✅ Passed (workaround documented; native credential vending deferred)

🗂️ Milestone phases completed

Phase 1–6 — Foundation (carried over from upstream branch)

Upstream Dremio OSS codebase was used as the base. Phases 1–6 covered repository analysis, architecture scoping, plugin framework understanding, REST catalog Java API research, initial RestIcebergCatalogPluginConfig and RestIcebergCatalogPlugin implementation, and iterative compilation fixes.

Phase 7 — Plugin Wiring (07-plugin-wiring)

  • Added @SourceType("RESTCATALOG") annotation to RestIcebergCatalogPluginConfig
  • Created restcatalog-layout.json (3-tab UI form: General, Advanced, Metadata) in the icebergcatalog plugin resources
  • Added RESTCATALOG.svg source icon at the classpath root
  • Plugin JAR rebuilt and confirmed to contain all Phase 7 artifacts

Key commits:

  • 0f6b172docs(07-plugin-wiring): phase plan creation
  • Several intermediate commits wiring the @SourceType annotation and UI form JSON
  • Final commit: plugin wired and discoverable via Dremio API

Phase 8 — End-to-End Validation (08-end-to-end-validation)

Plan 08-01 — Infrastructure Setup

  • Rebuilt icebergcatalog plugin JAR and deployed to Dremio distribution (replaced stale Feb 18 JAR)
  • Stood up Lakekeeper + PostgreSQL + MinIO Docker stack (warehouse demo)
  • Seeded test data via PyIceberg: namespace testns, table users (10 rows: id, name, city)
  • Started Dremio and confirmed RESTCATALOG source type discoverable
  • Added deploy-plugin-jar.sh reproducibility script

Key commits:

  • 95f4e7echore(08-01): deploy Phase 7 plugin JAR to distribution
  • 9873c3edocs(08-01): infrastructure setup complete — Lakekeeper stack running, test data seeded

Plan 08-02 — Validation

  • Created REST Catalog source in Dremio UI pointing to Lakekeeper
  • Validated CONN-01: source reaches GOOD state
  • Validated READ-01/READ-02/READ-03: namespace testns browsable, table users listed, SELECT * returns 10 rows
  • Validated CONN-02: rest.token masked in secretPropertyList
  • Validated CONN-03: static fs.s3a.* credentials workaround working
  • Validated against both Lakekeeper and Nessie catalog servers

Key commits:

  • d8649dcdocs(08-02): end-to-end validation complete — all 6 success criteria passed

Phase 8 finalisation

  • e7ef756fix(ui): getSourceIcon() now returns sources/{TYPE} for all non-Nessie sources, resolving per-source SVGs (e.g. RESTCATALOG.svg, S3.svg) in source list and catalog tree
  • 079b070docs(phase-8): complete phase execution — v1.1 milestone finished
  • d2b694achore: complete v1.1 Enable Iceberg REST Catalog milestone (final summary commit)

📁 Key files introduced / modified

File Change
plugins/icebergcatalog/src/main/java/.../RestIcebergCatalogPluginConfig.java @SourceType("RESTCATALOG") annotation added
plugins/icebergcatalog/src/main/resources/restcatalog-layout.json New 3-tab UI form (General, Advanced, Metadata)
plugins/icebergcatalog/src/main/resources/RESTCATALOG.svg New source icon
dac/ui/src/utils/iconUtils.js (or similar) getSourceIcon() returns sources/{TYPE} for non-Nessie sources
.planning/phases/08-end-to-end-validation/deploy-plugin-jar.sh Reproducibility script
.planning/phases/08-end-to-end-validation/08-01-SUMMARY.md Phase summary
.planning/STATE.md Updated project state
milestones/v1.1-ROADMAP.md Milestone roadmap archive
`milestones/v1.1...

This pull request was created from Copilot chat.


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

Emanuele Perrella and others added 12 commits February 20, 2026 08:44
Synthesizes findings from parallel research (STACK, FEATURES, ARCHITECTURE,
PITFALLS) into SUMMARY.md. Key conclusion: v1.1 is a two-artifact wiring
task (@SourceType annotation + restcatalog-layout.json) followed by
end-to-end validation against Lakekeeper.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add @SourceType(value="RESTCATALOG", label="Iceberg REST Catalog", uiConfig="restcatalog-layout.json") to RestIcebergCatalogPluginConfig
- Add import for com.dremio.exec.catalog.conf.SourceType
- Create restcatalog-layout.json at classpath root with 3-tab form: General (endpoint URI, namespace filter), Catalog Properties (propertyList, secretPropertyList), Advanced Options (enableAsync, caching)
- All 8 config fields wired with correct config. propName prefixes
- Copy dac/ui-lib/icons/dremio/sources/RESTCATALOG.svg to plugins/icebergcatalog/src/main/resources/RESTCATALOG.svg
- SourceTypeTemplate loads icon via classloader at classpath root; placing here makes the API source type descriptor return a non-null icon field
- Create 07-01-SUMMARY.md documenting @SourceType annotation, restcatalog-layout.json, and RESTCATALOG.svg delivery
- Update STATE.md: Phase 7 plan 01 complete, progress to ~70%, decisions recorded
Two plans for end-to-end validation against Lakekeeper:
- 08-01: Rebuild plugin JAR, Docker infrastructure, test data seeding
- 08-02: Source creation, read operations, OAuth2 auth, credential vending

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Confirmed plugins/icebergcatalog/target/ JAR (2026-02-20) contains
  restcatalog-layout.json and RESTCATALOG.svg from Phase 7
- Copied JAR to distribution/server/target/.../jars/ replacing stale Feb 18 version
- Added deploy-plugin-jar.sh script documenting the cp command for reproducibility
…, test data seeded

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…passed

CONN-01: Source reaches GOOD state
READ-01: Namespace testns browsable
READ-02: Table users listed
READ-03: SELECT returns 10 rows
CONN-02: rest.token in secretPropertyList works
CONN-03: Static fs.s3a.* creds workaround validated

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… icon

getSourceIcon() now returns sources/{TYPE} for all non-Nessie sources,
resolving per-source SVGs (e.g. RESTCATALOG.svg, S3.svg) in the source
list and catalog tree. Status variants (-bad, -degraded) still use
generic entity icons since source-specific variants don't exist.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Delivered: Iceberg REST Catalog source type wired into Dremio OSS,
enabling read-only connectivity to any Iceberg REST catalog server
(Lakekeeper, Nessie) through standard SQL.

Key accomplishments:
- @SourceType annotation on RestIcebergCatalogPluginConfig
- restcatalog-layout.json with 3-tab UI form
- E2E validated: source creation, namespace browsing, SELECT queries
- Validated against both Lakekeeper and Nessie

Archives: milestones/v1.1-ROADMAP.md, milestones/v1.1-REQUIREMENTS.md
Known gap: CONN-03 credential vending (workaround documented)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Copilot AI changed the title [WIP] Update documentation for Iceberg REST Catalog milestone docs(v1.1): Enable Iceberg REST Catalog — milestone PR description Feb 20, 2026
Copilot AI requested a review from eperrella February 20, 2026 15:48
@eperrella
eperrella marked this pull request as ready for review February 20, 2026 15:52
@eperrella
eperrella requested a review from Copilot February 20, 2026 15:52

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot wasn't able to review any files in this pull request.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@eperrella
eperrella changed the base branch from milestones/enable_iceberg_rest_catalog to develop February 20, 2026 16:06
@eperrella
eperrella requested a review from Copilot February 20, 2026 16:06
@eperrella
eperrella removed their request for review February 20, 2026 16:07

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 29 out of 31 changed files in this pull request and generated 5 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines 84 to 89
export const getSourceIcon = (sourceType: string) => {
if (NESSIE === sourceType) {
return "entities/nessie-source";
} else {
return "entities/datalake-source";
}
return `sources/${sourceType}`;
};

Copilot AI Feb 20, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

getSourceIcon() now assumes every source type has a matching icon id "sources/${sourceType}". That’s not true for at least "SAMPLE_SOURCE": the shipped icon id is "sources/SampleSource" (and there is no "sources/SAMPLE_SOURCE"), so Azure sample sources will render with a missing icon. Consider adding a small mapping/normalization layer (e.g., SAMPLE_SOURCE -> SampleSource) and/or a safe fallback to the generic datalake icon when no source icon exists.

Copilot uses AI. Check for mistakes.
Comment on lines 35 to +42
const getIconForSource = (source: SourceCatalogObject) => {
switch (source.type) {
case "NESSIE":
return <dremio-icon name="entities/nessie-source" class="h-3 w-3" />;
default:
return <dremio-icon name="entities/datalake-source" class="h-3 w-3" />;
return (
<dremio-icon name={`sources/${source.type}`} class="h-3 w-3" />
);

Copilot AI Feb 20, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Catalog tree source icons now render as sources/${source.type} directly. This bypasses existing special handling in SourceIcon (e.g., ADX uses an fallback due to gradients/adblocker issues) and also misses any sourceType->iconId normalization (e.g., SAMPLE_SOURCE). Consider reusing the shared getSourceIcon()/SourceIcon rendering path here (or replicating the necessary special-cases) to avoid broken icons for ADX/NETEZZA/sample sources.

Copilot uses AI. Check for mistakes.
Comment on lines +15 to +18
VERSION="26.0.5-202509091642240013-f5051a07"
DIST_NAME="dremio-community-${VERSION}"

SRC_JAR="${REPO_ROOT}/plugins/icebergcatalog/target/dremio-icebergcatalog-plugin-${VERSION}.jar"

Copilot AI Feb 20, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This script hard-codes the Dremio version/build string, which will go stale quickly and make the script fail in future builds. Consider deriving VERSION from the repo (e.g., Maven project.version), accepting it as an argument, or using a glob to locate the built JAR in target/ and the distribution jars/ directory.

Suggested change
VERSION="26.0.5-202509091642240013-f5051a07"
DIST_NAME="dremio-community-${VERSION}"
SRC_JAR="${REPO_ROOT}/plugins/icebergcatalog/target/dremio-icebergcatalog-plugin-${VERSION}.jar"
# Optional: pass the Dremio version as the first argument. If omitted, derive it
# from the built icebergcatalog plugin JAR in the Maven target/ directory.
VERSION="${1:-}"
if [ -z "${VERSION}" ]; then
PLUGIN_TARGET_DIR="${REPO_ROOT}/plugins/icebergcatalog/target"
PLUGIN_JAR_GLOB="${PLUGIN_TARGET_DIR}/dremio-icebergcatalog-plugin-*.jar"
# Use globbing to locate the built plugin JAR and extract VERSION from its name.
shopt -s nullglob
plugin_jars=( ${PLUGIN_JAR_GLOB} )
shopt -u nullglob
if [ "${#plugin_jars[@]}" -eq 0 ]; then
echo "ERROR: No plugin JARs found matching ${PLUGIN_JAR_GLOB}"
echo "Run: mvn package -pl plugins/icebergcatalog -DskipTests"
exit 1
fi
SRC_JAR="${plugin_jars[0]}"
plugin_jar_name="$(basename "${SRC_JAR}")"
VERSION="${plugin_jar_name#dremio-icebergcatalog-plugin-}"
VERSION="${VERSION%.jar}"
else
SRC_JAR="${REPO_ROOT}/plugins/icebergcatalog/target/dremio-icebergcatalog-plugin-${VERSION}.jar"
fi
DIST_NAME="dremio-community-${VERSION}"

Copilot uses AI. Check for mistakes.
Comment thread .planning/STATE.md
### Blockers/Concerns

- [Build]: Maven build requires Java 21 (enforcer [21,22) range); only Java 11/17 available. Full Maven compile blocked until Java 21 JDK is installed.
- [Build]: Maven build requires Java 21 (enforcer [21,22) range); only Java 11/17 available.

Copilot AI Feb 20, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

STATE.md says the Maven build is blocked because only Java 11/17 are available, but the Phase 8 research doc in this PR states Java 21 is already installed/available. Please reconcile these statements (either update STATE.md or adjust the research doc) so the project state is unambiguous for future readers.

Suggested change
- [Build]: Maven build requires Java 21 (enforcer [21,22) range); only Java 11/17 available.
None — Java 21 is now available; Maven build is no longer blocked.

Copilot uses AI. Check for mistakes.
Comment on lines +22 to 28
import com.dremio.exec.catalog.conf.SourceType;
import io.protostuff.Tag;
import java.util.List;
import javax.inject.Provider;

@SourceType(value = "RESTCATALOG", label = "Iceberg REST Catalog", uiConfig = "restcatalog-layout.json")
public class RestIcebergCatalogPluginConfig extends IcebergCatalogPluginConfig {

Copilot AI Feb 20, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR metadata/description says this is a documentation-only PR, but this change adds production code/resources (e.g., new @SourceType annotation and UI/layout/icon wiring). Please update the PR description to reflect the code changes (or split into a docs-only PR + a code PR) so reviewers and release notes aren’t misled.

Copilot uses AI. Check for mistakes.
@eperrella
eperrella merged commit f0f2e67 into develop Feb 20, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants