Add plugin lock-file upgrade - #6317
Conversation
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## plugins-lock/04-sync #6317 +/- ##
========================================================
- Coverage 72.95% 72.94% -0.02%
========================================================
Files 747 748 +1
Lines 78910 79144 +234
========================================================
+ Hits 57571 57733 +162
- Misses 17263 17307 +44
- Partials 4076 4104 +28 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
JAORMX
left a comment
There was a problem hiding this comment.
Panel review found inconsistent plain-name resolution, ambiguous preview API status, and missing required CLI coverage/completion. Please address the inline findings before merge. The transaction fixes requested on the earlier stack PRs also apply to this upgrade path.
9459007 to
eb5e5b4
Compare
eb5e5b4 to
d071d5a
Compare
d071d5a to
f51bf78
Compare
JAORMX
left a comment
There was a problem hiding this comment.
Local-store resolution, E2E coverage, and completion were addressed. The local apply path still drops the artifact/reference needed by persisted state and later sync.
| if len(latest.layerData) > 0 { | ||
| // Local-store hit: carry the exact artifact. buildPinnedReference | ||
| // would parse a bare tag as index.docker.io/library/<tag>@digest. | ||
| outcome.Status = plugins.UpgradeStatusUpgraded | ||
| return upgradePlan{ | ||
| entry: entry, | ||
| outcome: outcome, | ||
| pinnedRef: entry.Name, | ||
| layerData: latest.layerData, | ||
| } |
There was a problem hiding this comment.
High — applying a local-store upgrade drops its persisted reference. The local plan keeps latest.layerData but not latest.ref, leaving plan.resolvedRef empty. Apply then passes raw layer data without Reference, and LockResolvedReference becomes empty too; buildInstalledPlugin stores an empty reference and the lock rewrite loses the local tag. Subsequent sync cannot build a pinned reference, and info/upgrade no longer know which local artifact was installed. Carry latest.ref in the plan, pass it as InstallOptions.Reference, and preserve it in the lock (or explicitly retain the previous resolved reference if local tags are intentionally non-restorable). Add DB and lock reference assertions to the local-apply tests.
There was a problem hiding this comment.
Fixed. The local-store plan now carries latest.ref and apply sets InstallOptions.Reference so the DB keeps the local tag. The lock cannot store a bare tag: we keep the previous resolvedReference if any, otherwise leave it empty. f5b5f83fa.
Re-resolve plugins: lock entries and install newer content via thv ai-plugin upgrade and POST /plugins/upgrade.
Plain-name lock entries now resolve the same way Install does, so a local rebuild is visible to upgrade. Also complete upgrade args from lock entries and cover fail-on-changes in the plugin CLI e2e.
A bare local-store tag must not be rewritten as a Docker Hub digest reference; apply the resolved layer bytes instead.
The DB should keep the local tag while the lock file keeps the previous restorable pin instead of a Docker Hub rewrite.
f51bf78 to
f5b5f83
Compare
Summary
thv ai-plugin upgradeandPOST /plugins/upgradere-resolve eachplugins:lock entry'ssourceand install newer content when the digest moved (--preview/--allow-ref-change/--fail-on-changes).Sourceis never rewritten.--allow-ref-changeis passed. Signer-change guarding is Stack 2 / PR9 —--allow-signer-changeis not exposed yet.--fail-on-changesstill fetch OCI artifacts to compare digests (RFC: preview is not side-effect-free) but do not write the lock or install.TOOLHIVE_PLUGINS_LOCK_ENABLED(403 when off).Part of #6300. Stack 5/5 — schema → lock-service → install-hooks → sync → upgrade.
Type of change
Test plan
./pkg/plugins/pluginsvcupgrade tests and./pkg/api/v1upgrade endpoint tests, with the Taskfile race/ldflagsflags)task lint-fix)Does this introduce a user-facing change?
No by default — the feature is inert unless
TOOLHIVE_PLUGINS_LOCK_ENABLED=true. With the gate on,thv ai-plugin upgradere-resolvesplugins:lock entries.Special notes for reviewers
AllowSignerChangefrom skills; this PR does not enforce it and does not add the CLI flag.resolveLatestStatemirrors Install's dispatch (git → OCI → registry name) but stops short of extraction / DB / lock writes.