Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
-- Rollback: recreate the deprecated `(aws, sagemaker)` ServiceConfig
-- row from `(aws, savings-plans-sagemaker)` for emergency rollback.
--
-- Lossy by design: the original PR #71 row's term/payment were copied
-- forward into `(aws, savings-plans-sagemaker)` by migration 000040,
-- but any divergence between that row and a hypothetical edited
-- `(aws, sagemaker)` row at the time of 000045 is not recoverable —
-- only the post-040 term/payment survive in the split row.
--
-- Idempotent in two directions:
-- * If `(aws, savings-plans-sagemaker)` does not exist (e.g. someone
-- rolled back past migration 000040 before invoking this down),
-- the SELECT returns zero rows and the INSERT is a no-op.
-- * If `(aws, sagemaker)` already exists (manual restore, or this
-- down was already run), `ON CONFLICT (provider, service) DO
-- NOTHING` keeps the existing row untouched.

INSERT INTO service_configs (
provider, service, enabled, term, payment, coverage, ramp_schedule,
include_engines, exclude_engines, include_regions, exclude_regions,
include_types, exclude_types, created_at, updated_at
)
SELECT 'aws', 'sagemaker',
enabled, term, payment, coverage, ramp_schedule,
include_engines, exclude_engines, include_regions, exclude_regions,
include_types, exclude_types,
NOW(), NOW()
FROM service_configs
WHERE provider = 'aws' AND service = 'savings-plans-sagemaker'
ON CONFLICT (provider, service) DO NOTHING;
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
-- Drop the deprecated `(aws, sagemaker)` ServiceConfig row left behind
-- by migration 000040.
--
-- Background: PR #71 introduced an interim `(aws, sagemaker)` row with
-- its own term/payment selects. Migration 000040 (PR #123) split the
-- legacy `(aws, savings-plans)` umbrella into four per-plan-type rows
-- and copied the sagemaker row's term/payment forward into the new
-- `(aws, savings-plans-sagemaker)` row, but intentionally KEPT the
-- `(aws, sagemaker)` row for one stable release as a backward-compat
-- safety net for users mid-rollout. See the `Deprecation follow-up`
-- comment at the bottom of 000040_split_savingsplans.up.sql.
--
-- This migration removes that deprecated row now that the per-plan-type
-- cards are the canonical source of SageMaker SP defaults.
--
-- Idempotent: the WHERE clause matches zero rows on installations that
-- never had PR #71's row (or that already ran this migration), so the
-- DELETE is a safe no-op.
--
-- Tracked in issue #133.

DELETE FROM service_configs
WHERE provider = 'aws' AND service = 'sagemaker';
12 changes: 9 additions & 3 deletions internal/database/postgres/migrations/split_savingsplans_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -137,14 +137,20 @@ func TestMigration_SplitSavingsPlans(t *testing.T) {
require.NoError(t, migrations.RunMigrations(ctx, pool, migrationsPath, "", ""))

got := queryAWSSPRows(t, pool)
// Expect: 4 split rows + sagemaker (kept). Umbrella deleted.
require.Len(t, got, 5)
// Expect: 4 split rows. Umbrella deleted by 000040; PR #71's
// `(aws, sagemaker)` row is also deleted by 000045 (issue #133)
// after 000040 has copied its term/payment forward into the
// new `savings-plans-sagemaker` slot.
require.Len(t, got, 4)
_, hasUmbrella := got["savings-plans"]
assert.False(t, hasUmbrella, "umbrella should be deleted")
_, hasSagemaker := got["sagemaker"]
assert.True(t, hasSagemaker, "PR #71 sagemaker row must be kept for one release")
assert.False(t, hasSagemaker, "PR #71 sagemaker row should be deleted by 000045 (issue #133)")

// sagemaker slot inherits from PR #71's row (1, partial-upfront).
// The inheritance happens during 000040, which runs before
// 000045 deletes the source row, so the values still flow
// through into the persisted split row.
smRow := got["savings-plans-sagemaker"]
assert.Equal(t, 1, smRow.term, "sagemaker slot should inherit term from (aws, sagemaker)")
assert.Equal(t, "partial-upfront", smRow.payment, "sagemaker slot should inherit payment from (aws, sagemaker)")
Expand Down