Skip to content

Commit 64c3e19

Browse files
Dashboard template id is not always accurate eng 3740 (#2285)
* api: normalize sandbox template and env ids on info
1 parent cde821a commit 64c3e19

File tree

10 files changed

+26
-8
lines changed

10 files changed

+26
-8
lines changed

packages/api/internal/handlers/sandbox.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ func (a *APIStore) startSandboxInternal(
154154
zap.String("end_time", endTime.Format("2006-01-02 15:04:05 -07:00")),
155155
zap.String("auto_resume_policy", autoResumePolicy),
156156
zap.Bool("auto_pause", sbx.AutoPause),
157-
zap.String("parent_template_id", sbx.BaseTemplateID),
157+
zap.String("template_id", sbx.BaseTemplateID),
158158
)
159159

160160
return sbx, nil

packages/api/internal/handlers/sandbox_get.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ func (a *APIStore) GetSandboxesSandboxID(c *gin.Context, id string) {
109109
// Sandbox exists and belongs to the team - return running sandbox sbx
110110
sandbox := api.SandboxDetail{
111111
ClientID: sbx.ClientID,
112-
TemplateID: sbx.TemplateID,
112+
TemplateID: sbx.BaseTemplateID,
113113
Alias: sbx.Alias,
114114
SandboxID: sbx.SandboxID,
115115
StartedAt: sbx.StartTime,
@@ -202,7 +202,7 @@ func (a *APIStore) GetSandboxesSandboxID(c *gin.Context, id string) {
202202

203203
sandbox := api.SandboxDetail{
204204
ClientID: consts.ClientID, // for backwards compatibility we need to return a client id
205-
TemplateID: lastSnapshot.Snapshot.EnvID,
205+
TemplateID: lastSnapshot.Snapshot.BaseEnvID,
206206
SandboxID: lastSnapshot.Snapshot.SandboxID,
207207
StartedAt: lastSnapshot.Snapshot.SandboxStartedAt.Time,
208208
CpuCount: cpuCount,

packages/api/internal/orchestrator/create_instance_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ func TestCreateSandbox_StaleDataAfterConcurrentPause(t *testing.T) {
147147
)
148148
require.Nil(t, apiErr)
149149
assert.Equal(t, "tpl-v1", sbx1.TemplateID)
150+
assert.Equal(t, "base-tpl", sbx1.BaseTemplateID)
150151

151152
// Clean up reservation.
152153
o.sandboxStore.Remove(t.Context(), team.Team.ID, sandboxID)
@@ -172,6 +173,8 @@ func TestCreateSandbox_StaleDataAfterConcurrentPause(t *testing.T) {
172173
// The sandbox SHOULD have been created with V2 (fresh) data.
173174
assert.Equal(t, "tpl-v2", sbx2.TemplateID,
174175
"CreateSandbox must use the latest snapshot data, not stale pre-lock values")
176+
assert.Equal(t, "base-tpl", sbx2.BaseTemplateID,
177+
"CreateSandbox must preserve the base template ID")
175178
assert.Equal(t, "v2", sbx2.Metadata["snapshot"],
176179
"CreateSandbox must use the latest metadata, not stale pre-lock values")
177180
})

packages/api/internal/sandbox/sandbox.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ type Sandbox struct {
111111
func (s Sandbox) ToAPISandbox() *api.Sandbox {
112112
return &api.Sandbox{
113113
SandboxID: s.SandboxID,
114-
TemplateID: s.TemplateID,
114+
TemplateID: s.BaseTemplateID,
115115
ClientID: s.ClientID,
116116
Alias: s.Alias,
117117
EnvdVersion: s.EnvdVersion,

packages/db/queries/get_sandbox_record.sql.go

Lines changed: 5 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/db/queries/sandboxes/get_sandbox_record.sql

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
-- name: GetSandboxRecordByTeamAndSandboxID :one
22
SELECT
33
sl.sandbox_id,
4-
sl.env_id AS template_id,
4+
COALESCE(s.base_env_id, sl.env_id) AS template_id,
55
sl.vcpu,
66
sl.ram_mb,
77
sl.total_disk_size_mb,
@@ -12,10 +12,13 @@ SELECT
1212
FROM billing.sandbox_logs sl
1313
LEFT JOIN public.teams t ON t.id = sl.team_id
1414
LEFT JOIN public.clusters c ON c.id = t.cluster_id
15+
LEFT JOIN public.snapshots s
16+
ON s.sandbox_id = sl.sandbox_id
17+
AND s.team_id = sl.team_id
1518
LEFT JOIN LATERAL (
1619
SELECT ea.alias
1720
FROM public.env_aliases ea
18-
WHERE ea.env_id = sl.env_id
21+
WHERE ea.env_id = COALESCE(s.base_env_id, sl.env_id)
1922
ORDER BY ea.alias
2023
LIMIT 1
2124
) template_alias ON TRUE

tests/integration/internal/tests/api/sandboxes/sandbox_connect_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,15 @@ func TestSandboxConnect(t *testing.T) {
3333
require.Equal(t, http.StatusCreated, sbxConnect.StatusCode())
3434
require.NotNil(t, sbxConnect.JSON201)
3535
assert.Equal(t, sbxConnect.JSON201.SandboxID, sbxId)
36+
assert.Equal(t, sbx.TemplateID, sbxConnect.JSON201.TemplateID)
3637

3738
// Check if the sandbox is running
3839
res, err := c.GetSandboxesSandboxIDWithResponse(t.Context(), sbxId, setup.WithAPIKey())
3940
require.NoError(t, err)
4041
require.Equal(t, http.StatusOK, res.StatusCode())
4142
require.NotNil(t, res.JSON200)
4243
assert.Equal(t, api.Running, res.JSON200.State)
44+
assert.Equal(t, sbx.TemplateID, res.JSON200.TemplateID)
4345
})
4446

4547
t.Run("connect to running sandbox", func(t *testing.T) {

tests/integration/internal/tests/api/sandboxes/sandbox_detail_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ func TestSandboxDetailReturnsLifecycleAndNetworkConfig(t *testing.T) {
6262

6363
returnedSbx := response.JSON200
6464
assert.Equal(t, sbx.SandboxID, returnedSbx.SandboxID)
65+
assert.Equal(t, sbx.TemplateID, returnedSbx.TemplateID)
6566
assert.Equal(t, expectedState, returnedSbx.State)
6667

6768
require.NotNil(t, returnedSbx.AllowInternetAccess)
@@ -98,6 +99,7 @@ func TestSandboxDetailPaused(t *testing.T) {
9899
require.Equal(t, http.StatusOK, response.StatusCode())
99100
returnedSbx := response.JSON200
100101
assert.Equal(t, sbx.SandboxID, returnedSbx.SandboxID)
102+
assert.Equal(t, sbx.TemplateID, returnedSbx.TemplateID)
101103
}
102104

103105
func TestSandboxDetailPausingSandbox(t *testing.T) {

tests/integration/internal/tests/api/sandboxes/sandbox_resume_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ func TestSandboxResume(t *testing.T) {
4242
require.Equal(t, http.StatusCreated, sbxResume.StatusCode())
4343
require.NotNil(t, sbxResume.JSON201)
4444
assert.Equal(t, sbxResume.JSON201.SandboxID, sbxId)
45+
assert.Equal(t, sbx.TemplateID, sbxResume.JSON201.TemplateID)
4546
})
4647

4748
t.Run("concurrent resumes", func(t *testing.T) {
@@ -76,6 +77,7 @@ func TestSandboxResume(t *testing.T) {
7677
require.Equal(t, http.StatusOK, res.StatusCode())
7778
require.NotNil(t, res.JSON200)
7879
assert.Equal(t, api.Running, res.JSON200.State)
80+
assert.Equal(t, sbx.TemplateID, res.JSON200.TemplateID)
7981

8082
assert.True(t, resumed.Load(), "at least one resume should succeed")
8183
})

tests/integration/internal/tests/api/sandboxes/sandbox_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ func TestSandboxCreate(t *testing.T) {
3838
})
3939

4040
assert.Equal(t, http.StatusCreated, resp.StatusCode())
41+
require.NotNil(t, resp.JSON201)
42+
assert.Equal(t, setup.SandboxTemplateID, resp.JSON201.TemplateID)
4143
}
4244

4345
func TestSandboxResumeUnknownSandbox(t *testing.T) {
@@ -96,6 +98,7 @@ func TestSandboxResumeWithSecuredEnvd(t *testing.T) {
9698
})
9799

98100
assert.Equal(t, sbxResume.JSON201.SandboxID, sbxCreate.JSON201.SandboxID)
101+
assert.Equal(t, sbxCreate.JSON201.TemplateID, sbxResume.JSON201.TemplateID)
99102
assert.Equal(t, sbxResume.JSON201.EnvdAccessToken, sbxCreate.JSON201.EnvdAccessToken)
100103
}
101104

0 commit comments

Comments
 (0)