Commit 6ee77b7
Add database upgrade and rollback compatibility tests (#2084)
## Description
Closes: #1637
Adds automated coverage that a Helm upgrade from a prior release to the
current build is safe: migrations apply cleanly, existing data survives,
the resulting schema matches a fresh install, and the migrations reverse
cleanly. Also covers the rolling-deploy window where prior-release pods
serve against an already-migrated schema, and — at each point in the
upgrade/rollback cycle — drives a real agent invocation through the
controller so kagent's own query paths are exercised, not just raw SQL.
## Tests
- **Upgrade round-trip** (`TestUpgrade`, gated by `RUN_UPGRADE_TESTS`):
installs the prior release, seeds representative data, upgrades to the
current build, then asserts the controller rolls out without crashing,
migrations reach the target version cleanly, the seeded data survives,
the upgraded schema is identical to a clean install, and reversing the
migrations restores the prior schema with data intact. It then redeploys
the previous release over the migrated schema to confirm the old binary
boots and serves rather than crash-looping (ahead-schema tolerance).
- **Rolling compatibility** (`TestRollingUpgradeCompatibility`, gated by
`RUN_ROLLING_UPGRADE_TESTS`): runs the upgrade with two controller
replicas and verifies a prior-release pod can still read and write while
the new image rolls out. It runs regardless of whether migrations
changed — the image swap alone can break a rolling deploy — and
additionally exercises the old-code/new-schema window when the build
adds migrations.
- **Version-matched invocation**: at each state — post-upgrade,
old-code-against-the-new-schema, and post-rollback — a representative
invoke e2e slice (`TestE2EInvokeInlineAgent`) runs from the tree whose
version matches the serving controller (the previous-release slices from
a git worktree at that release's tag), so real deploy/invoke/read paths
are exercised end to end. Self-skips when the harness (mock-LLM host /
previous-release worktree) isn't set up, so a bare `go test` still runs
the DB round-trip.
## Targets
Upgrade-from targets are chosen per branch, mirroring how releases ship
(a CI matrix; a leg is skipped when it doesn't apply):
- on `main` (building the next minor): the previous minor line's latest
patch.
- on a release branch (building a patch): the same line's last patch,
and the previous minor's latest.
The resolved upgrade-from version is printed before the build. Override
locally with `UPGRADE_FROM_VERSION`.
## Running locally
Requires a kind cluster, then:
```
make create-kind-cluster
make run-upgrade-tests
```
or
```
make create-kind-cluster
make run-rolling-upgrade-tests
```
A run leaves the database migrated, so recreate the cluster between
runs.
## Notes
- The previous install pins the bundled Postgres image to whatever the
upgrade-from release's own install target shipped, so the baseline
matches how that release actually runs rather than a hardcoded guess.
- Query-level backward compatibility (a prior release's queries against
the new schema) is covered separately by a static check in #2085.
---------
Signed-off-by: Jeremy Alvis <jeremy.alvis@solo.io>
Co-authored-by: Eitan Yarmush <eitan.yarmush@solo.io>1 parent 6a241b7 commit 6ee77b7
10 files changed
Lines changed: 1528 additions & 4 deletions
File tree
- .claude/skills/kagent-dev/references
- .github
- actions/upgrade-test-setup
- workflows
- go/core/test/upgrade
- scripts
Lines changed: 3 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
133 | 133 | | |
134 | 134 | | |
135 | 135 | | |
136 | | - | |
| 136 | + | |
137 | 137 | | |
138 | 138 | | |
139 | 139 | | |
| |||
205 | 205 | | |
206 | 206 | | |
207 | 207 | | |
208 | | - | |
| 208 | + | |
209 | 209 | | |
210 | | - | |
| 210 | + | |
211 | 211 | | |
212 | 212 | | |
213 | 213 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
167 | 167 | | |
168 | 168 | | |
169 | 169 | | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
170 | 268 | | |
171 | 269 | | |
172 | 270 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
213 | 213 | | |
214 | 214 | | |
215 | 215 | | |
216 | | - | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
0 commit comments