Repository navigation
[HWORKS-3562] SharePoint data source with one-off copy and scheduled one-way sync into a project dataset - #715
Merged
Conversation
Contributor
There was a problem hiding this comment.
Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.
An organization owner can choose the repository organization as the billing source for reviews requested by members with a paid Copilot license. Learn about Copilot code review billing. Review the Copilot code review billing settings.
jimdowling
marked this pull request as ready for review
October 22, 2026 20:51
jimdowling
force-pushed
the
HWORKS-3562
branch
2 times, most recently
from
October 23, 2026 05:32
a10248c to
7529700
Compare
…one-way sync into a project dataset https://hopsworks.atlassian.net/browse/HWORKS-3562 Users cannot bring files from SharePoint Online document libraries into Hopsworks. Add SharePoint as a data source and a sync that copies a library folder into a new project dataset with rclone, once or on a schedule, run as an ordinary Python job whose script lives in the project. Backend (hopsworks-ee), client and CLI (hopsworks-api), UI (hopsworks-front), image (docker-images), variables (hopsworks-helm), an e2e test (loadtest) and docs change together. Add the SharePoint data source guide: the Entra ID application and its permissions, network access, the minimum client version, the cluster variables, creating the data source and a sync in the UI, the data source page, how a sync runs (the job and who it runs as, the editable sync script, the mirrored dataset and what data owners may change in it, .partial download files, the CSV audit log and querying it with DuckDB, skipped item types, how file names are stored, failures, deletion), and the Python client and CLI. Reviewed-by: OpenAI Codex (codex-plugin-cc 1.0.6) <codex@openai.com> Signed-off-by: Jim Dowling <jim@logicalclocks.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
jimdowling
force-pushed
the
HWORKS-3562
branch
from
October 24, 2026 06:21
7529700 to
3b8b0e1
Compare
…one-way sync into a project dataset https://hopsworks.atlassian.net/browse/HWORKS-3562 A sync can index the files it copies in a Delta feature group, one row per file, partitioned by the day the file was first copied in. The row holds the SharePoint ids, path, web link, type, size, times, author and editor, quickXorHash and the path of the copy in Hopsworks, but no content. Each run diffs a full listing of the folder against the table and upserts or deletes rows with delta-rs through the SDK, then compacts earlier days to about 200 MiB files and vacuums after 7 days. Deletion vectors stay off: hops-deltalake 1.4 still rewrites files on delete. The SharePoint guide documents the index option, its columns and maintenance rules, the Python and CLI calls, and a DuckDB example. Signed-off-by: Jim Dowling <jim@logicalclocks.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…one-way sync into a project dataset https://hopsworks.atlassian.net/browse/HWORKS-3562 The terminal mounts each feature group under the project's database directory, /hopsfs/featurestore/<project>_featurestore.db/<fg>_<version>, so the index paths in the search skill and the guide gain that level. Checked with delta_scan in a terminal on a 269-file index. Signed-off-by: Jim Dowling <jim@logicalclocks.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…one-way sync into a project dataset https://hopsworks.atlassian.net/browse/HWORKS-3562 Fixes from a Codex review of the file index. A sync deletes only the index feature group its runs created, recognised by the description the script writes, and an index name must not be an existing feature group. The partition is now described as the day a file was first indexed, since files already in the dataset when indexing is turned on get that day. The guide states the ownership and path-reuse rules, and keeps one sentence per line. Reviewed-by: OpenAI Codex (codex-plugin-cc 1.0.6) <codex@openai.com> Signed-off-by: Jim Dowling <jim@logicalclocks.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…one-way sync into a project dataset https://hopsworks.atlassian.net/browse/HWORKS-3562 Review fix: the SharePoint guide says what bounds the size of a sync. The synced files count against the project's storage quota; the maximum file size limits each file, not the total. A run that fills the quota is partial with a quota error, and the next run copies the remaining files once there is room. The file index table also gets the separator row markdownlint expects. Signed-off-by: Jim Dowling <jim@logicalclocks.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
dhananjay-mk
approved these changes
Oct 26, 2026
…one-way sync into a project dataset https://hopsworks.atlassian.net/browse/HWORKS-3562 The SharePoint guide's API reference box names the SharePointConnector and SharePointSync methods as code instead of linking them. The docs build resolves those links against hopsworks-api main, which has no SharePoint classes until hopsworks-api#1353 merges, so the strict build failed on 13 unresolved references. Signed-off-by: Jim Dowling <jim@logicalclocks.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
robzor92
pushed a commit
to robzor92/logicalclocks.github.io
that referenced
this pull request
Oct 26, 2026
…one-way sync into a project dataset (logicalclocks#715) * [HWORKS-3562] SharePoint data source with one-off copy and scheduled one-way sync into a project dataset https://hopsworks.atlassian.net/browse/HWORKS-3562 Users cannot bring files from SharePoint Online document libraries into Hopsworks. Add SharePoint as a data source and a sync that copies a library folder into a new project dataset with rclone, once or on a schedule, run as an ordinary Python job whose script lives in the project. Backend (hopsworks-ee), client and CLI (hopsworks-api), UI (hopsworks-front), image (docker-images), variables (hopsworks-helm), an e2e test (loadtest) and docs change together. Add the SharePoint data source guide: the Entra ID application and its permissions, network access, the minimum client version, the cluster variables, creating the data source and a sync in the UI, the data source page, how a sync runs (the job and who it runs as, the editable sync script, the mirrored dataset and what data owners may change in it, .partial download files, the CSV audit log and querying it with DuckDB, skipped item types, how file names are stored, failures, deletion), and the Python client and CLI. Reviewed-by: OpenAI Codex (codex-plugin-cc 1.0.6) <codex@openai.com> Signed-off-by: Jim Dowling <jim@logicalclocks.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [HWORKS-3562] SharePoint data source with one-off copy and scheduled one-way sync into a project dataset https://hopsworks.atlassian.net/browse/HWORKS-3562 A sync can index the files it copies in a Delta feature group, one row per file, partitioned by the day the file was first copied in. The row holds the SharePoint ids, path, web link, type, size, times, author and editor, quickXorHash and the path of the copy in Hopsworks, but no content. Each run diffs a full listing of the folder against the table and upserts or deletes rows with delta-rs through the SDK, then compacts earlier days to about 200 MiB files and vacuums after 7 days. Deletion vectors stay off: hops-deltalake 1.4 still rewrites files on delete. The SharePoint guide documents the index option, its columns and maintenance rules, the Python and CLI calls, and a DuckDB example. Signed-off-by: Jim Dowling <jim@logicalclocks.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [HWORKS-3562] SharePoint data source with one-off copy and scheduled one-way sync into a project dataset https://hopsworks.atlassian.net/browse/HWORKS-3562 The terminal mounts each feature group under the project's database directory, /hopsfs/featurestore/<project>_featurestore.db/<fg>_<version>, so the index paths in the search skill and the guide gain that level. Checked with delta_scan in a terminal on a 269-file index. Signed-off-by: Jim Dowling <jim@logicalclocks.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [HWORKS-3562] SharePoint data source with one-off copy and scheduled one-way sync into a project dataset https://hopsworks.atlassian.net/browse/HWORKS-3562 Fixes from a Codex review of the file index. A sync deletes only the index feature group its runs created, recognised by the description the script writes, and an index name must not be an existing feature group. The partition is now described as the day a file was first indexed, since files already in the dataset when indexing is turned on get that day. The guide states the ownership and path-reuse rules, and keeps one sentence per line. Reviewed-by: OpenAI Codex (codex-plugin-cc 1.0.6) <codex@openai.com> Signed-off-by: Jim Dowling <jim@logicalclocks.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [HWORKS-3562] SharePoint data source with one-off copy and scheduled one-way sync into a project dataset https://hopsworks.atlassian.net/browse/HWORKS-3562 Review fix: the SharePoint guide says what bounds the size of a sync. The synced files count against the project's storage quota; the maximum file size limits each file, not the total. A run that fills the quota is partial with a quota error, and the next run copies the remaining files once there is room. The file index table also gets the separator row markdownlint expects. Signed-off-by: Jim Dowling <jim@logicalclocks.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [HWORKS-3562] SharePoint data source with one-off copy and scheduled one-way sync into a project dataset https://hopsworks.atlassian.net/browse/HWORKS-3562 The SharePoint guide's API reference box names the SharePointConnector and SharePointSync methods as code instead of linking them. The docs build resolves those links against hopsworks-api main, which has no SharePoint classes until hopsworks-api#1353 merges, so the strict build failed on 13 unresolved references. Signed-off-by: Jim Dowling <jim@logicalclocks.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Signed-off-by: Jim Dowling <jim@logicalclocks.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 359af4a)
robzor92
pushed a commit
to robzor92/logicalclocks.github.io
that referenced
this pull request
Oct 27, 2026
…one-way sync into a project dataset (logicalclocks#715) * [HWORKS-3562] SharePoint data source with one-off copy and scheduled one-way sync into a project dataset https://hopsworks.atlassian.net/browse/HWORKS-3562 Users cannot bring files from SharePoint Online document libraries into Hopsworks. Add SharePoint as a data source and a sync that copies a library folder into a new project dataset with rclone, once or on a schedule, run as an ordinary Python job whose script lives in the project. Backend (hopsworks-ee), client and CLI (hopsworks-api), UI (hopsworks-front), image (docker-images), variables (hopsworks-helm), an e2e test (loadtest) and docs change together. Add the SharePoint data source guide: the Entra ID application and its permissions, network access, the minimum client version, the cluster variables, creating the data source and a sync in the UI, the data source page, how a sync runs (the job and who it runs as, the editable sync script, the mirrored dataset and what data owners may change in it, .partial download files, the CSV audit log and querying it with DuckDB, skipped item types, how file names are stored, failures, deletion), and the Python client and CLI. Reviewed-by: OpenAI Codex (codex-plugin-cc 1.0.6) <codex@openai.com> Signed-off-by: Jim Dowling <jim@logicalclocks.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [HWORKS-3562] SharePoint data source with one-off copy and scheduled one-way sync into a project dataset https://hopsworks.atlassian.net/browse/HWORKS-3562 A sync can index the files it copies in a Delta feature group, one row per file, partitioned by the day the file was first copied in. The row holds the SharePoint ids, path, web link, type, size, times, author and editor, quickXorHash and the path of the copy in Hopsworks, but no content. Each run diffs a full listing of the folder against the table and upserts or deletes rows with delta-rs through the SDK, then compacts earlier days to about 200 MiB files and vacuums after 7 days. Deletion vectors stay off: hops-deltalake 1.4 still rewrites files on delete. The SharePoint guide documents the index option, its columns and maintenance rules, the Python and CLI calls, and a DuckDB example. Signed-off-by: Jim Dowling <jim@logicalclocks.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [HWORKS-3562] SharePoint data source with one-off copy and scheduled one-way sync into a project dataset https://hopsworks.atlassian.net/browse/HWORKS-3562 The terminal mounts each feature group under the project's database directory, /hopsfs/featurestore/<project>_featurestore.db/<fg>_<version>, so the index paths in the search skill and the guide gain that level. Checked with delta_scan in a terminal on a 269-file index. Signed-off-by: Jim Dowling <jim@logicalclocks.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [HWORKS-3562] SharePoint data source with one-off copy and scheduled one-way sync into a project dataset https://hopsworks.atlassian.net/browse/HWORKS-3562 Fixes from a Codex review of the file index. A sync deletes only the index feature group its runs created, recognised by the description the script writes, and an index name must not be an existing feature group. The partition is now described as the day a file was first indexed, since files already in the dataset when indexing is turned on get that day. The guide states the ownership and path-reuse rules, and keeps one sentence per line. Reviewed-by: OpenAI Codex (codex-plugin-cc 1.0.6) <codex@openai.com> Signed-off-by: Jim Dowling <jim@logicalclocks.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [HWORKS-3562] SharePoint data source with one-off copy and scheduled one-way sync into a project dataset https://hopsworks.atlassian.net/browse/HWORKS-3562 Review fix: the SharePoint guide says what bounds the size of a sync. The synced files count against the project's storage quota; the maximum file size limits each file, not the total. A run that fills the quota is partial with a quota error, and the next run copies the remaining files once there is room. The file index table also gets the separator row markdownlint expects. Signed-off-by: Jim Dowling <jim@logicalclocks.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [HWORKS-3562] SharePoint data source with one-off copy and scheduled one-way sync into a project dataset https://hopsworks.atlassian.net/browse/HWORKS-3562 The SharePoint guide's API reference box names the SharePointConnector and SharePointSync methods as code instead of linking them. The docs build resolves those links against hopsworks-api main, which has no SharePoint classes until hopsworks-api#1353 merges, so the strict build failed on 13 unresolved references. Signed-off-by: Jim Dowling <jim@logicalclocks.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Signed-off-by: Jim Dowling <jim@logicalclocks.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 359af4a)
robzor92
pushed a commit
that referenced
this pull request
Oct 27, 2026
…one-way sync into a project dataset (#715) * [HWORKS-3562] SharePoint data source with one-off copy and scheduled one-way sync into a project dataset https://hopsworks.atlassian.net/browse/HWORKS-3562 Users cannot bring files from SharePoint Online document libraries into Hopsworks. Add SharePoint as a data source and a sync that copies a library folder into a new project dataset with rclone, once or on a schedule, run as an ordinary Python job whose script lives in the project. Backend (hopsworks-ee), client and CLI (hopsworks-api), UI (hopsworks-front), image (docker-images), variables (hopsworks-helm), an e2e test (loadtest) and docs change together. Add the SharePoint data source guide: the Entra ID application and its permissions, network access, the minimum client version, the cluster variables, creating the data source and a sync in the UI, the data source page, how a sync runs (the job and who it runs as, the editable sync script, the mirrored dataset and what data owners may change in it, .partial download files, the CSV audit log and querying it with DuckDB, skipped item types, how file names are stored, failures, deletion), and the Python client and CLI. Reviewed-by: OpenAI Codex (codex-plugin-cc 1.0.6) <codex@openai.com> Signed-off-by: Jim Dowling <jim@logicalclocks.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [HWORKS-3562] SharePoint data source with one-off copy and scheduled one-way sync into a project dataset https://hopsworks.atlassian.net/browse/HWORKS-3562 A sync can index the files it copies in a Delta feature group, one row per file, partitioned by the day the file was first copied in. The row holds the SharePoint ids, path, web link, type, size, times, author and editor, quickXorHash and the path of the copy in Hopsworks, but no content. Each run diffs a full listing of the folder against the table and upserts or deletes rows with delta-rs through the SDK, then compacts earlier days to about 200 MiB files and vacuums after 7 days. Deletion vectors stay off: hops-deltalake 1.4 still rewrites files on delete. The SharePoint guide documents the index option, its columns and maintenance rules, the Python and CLI calls, and a DuckDB example. Signed-off-by: Jim Dowling <jim@logicalclocks.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [HWORKS-3562] SharePoint data source with one-off copy and scheduled one-way sync into a project dataset https://hopsworks.atlassian.net/browse/HWORKS-3562 The terminal mounts each feature group under the project's database directory, /hopsfs/featurestore/<project>_featurestore.db/<fg>_<version>, so the index paths in the search skill and the guide gain that level. Checked with delta_scan in a terminal on a 269-file index. Signed-off-by: Jim Dowling <jim@logicalclocks.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [HWORKS-3562] SharePoint data source with one-off copy and scheduled one-way sync into a project dataset https://hopsworks.atlassian.net/browse/HWORKS-3562 Fixes from a Codex review of the file index. A sync deletes only the index feature group its runs created, recognised by the description the script writes, and an index name must not be an existing feature group. The partition is now described as the day a file was first indexed, since files already in the dataset when indexing is turned on get that day. The guide states the ownership and path-reuse rules, and keeps one sentence per line. Reviewed-by: OpenAI Codex (codex-plugin-cc 1.0.6) <codex@openai.com> Signed-off-by: Jim Dowling <jim@logicalclocks.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [HWORKS-3562] SharePoint data source with one-off copy and scheduled one-way sync into a project dataset https://hopsworks.atlassian.net/browse/HWORKS-3562 Review fix: the SharePoint guide says what bounds the size of a sync. The synced files count against the project's storage quota; the maximum file size limits each file, not the total. A run that fills the quota is partial with a quota error, and the next run copies the remaining files once there is room. The file index table also gets the separator row markdownlint expects. Signed-off-by: Jim Dowling <jim@logicalclocks.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [HWORKS-3562] SharePoint data source with one-off copy and scheduled one-way sync into a project dataset https://hopsworks.atlassian.net/browse/HWORKS-3562 The SharePoint guide's API reference box names the SharePointConnector and SharePointSync methods as code instead of linking them. The docs build resolves those links against hopsworks-api main, which has no SharePoint classes until hopsworks-api#1353 merges, so the strict build failed on 13 unresolved references. Signed-off-by: Jim Dowling <jim@logicalclocks.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Signed-off-by: Jim Dowling <jim@logicalclocks.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 359af4a)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
user_guides/fs/data_source/creation/sharepoint.md: the Entra ID application and its permissions, the cluster variables, creating a data source and a sync in the UI, the data source page, how a sync runs (job, editable script, read-only dataset, CSV audit log with a DuckDB example, failures, deletion), and the Python client and CLI. Added to the nav.Related PRs (merge in this order)
Feature
HWORKS-3562: a SharePoint Online data source that copies a folder of a site's document library into a project dataset, once or on a schedule (one-way mirror). Each sync is an ordinary Python job in the
python-feature-pipelineenvironment runningDataSources/<connector>/sharepoint_sync.py(rclone), which data owners can edit. Every run that changes something writes a CSV audit file in Hive-styledate=partitions, rotated afterdata_source_audit_retention_days. Failure alerts go to an optional alert receiver. Two-way sync and delegated (user) sign-in are out of scope.Merge order: docker-images (image with rclone and duckdb) → hopsworks-ee → hopsworks-helm → hopsworks-api → hopsworks-front → loadtest → docs.
Testing
On cluster jim-sharepoint (5.3.0-SNAPSHOT) against a real Microsoft 365 tenant (site
hopsworks-sync-test, app withSites.ReadWrite.All), with the backend, frontend and SDK from these branches and thepython-feature-pipelineimage built from the docker-images branch:workflows/feature_store/python_driver/test_data_sources_sharepoint.py: 2 passed in 7m05s (2026-10-26, at these heads)disk quota exceeded; the run is partial withthe project's storage quota is fulland what to do about it. Its job failure alert reached a webhook alert receiver (alertmanagerJobExecution, status Failed) 97 s after the run.V128migration, applied to a scratch schema on the cluster's RonDB, gives tables identical to the cluster's (SHOW CREATE TABLE); the chart's rendered DML for the nine variables, applied to a scratch table, matches the cluster's rows./hopsfs/featurestore/<project>_featurestore.db/<fg>_1.LOAD deltapasses the signature check with the extension installed from the verified file.Not verified on a cluster:
helm upgraderunning the packaged Flyway migration and DML (both checked against the cluster's database as above);Sites.Selectedwith a site-level grant (the test app hasSites.ReadWrite.All).🤖 Generated with Claude Code