Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit11bd719

Browse files
Kira-Pilotpull[bot]
authored andcommitted
feat: add deleted_at field to workspace model (#7475)
* added impending_deletion workspace field* gen docs* update golden files* added test* PR comments
1 parent3dadbe8 commit11bd719

File tree

11 files changed

+149
-21
lines changed

11 files changed

+149
-21
lines changed

‎.vscode/settings.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
"codersdk",
2121
"cronstrue",
2222
"databasefake",
23+
"dbfake",
24+
"dbgen",
2325
"dbtype",
2426
"DERP",
2527
"derphttp",

‎cli/testdata/coder_list_--output_json.golden

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
"name": "test-workspace",
4949
"autostart_schedule": "CRON_TZ=US/Central 30 9 * * 1-5",
5050
"ttl_ms": 28800000,
51-
"last_used_at": "[timestamp]"
51+
"last_used_at": "[timestamp]",
52+
"deleting_at": null
5253
}
5354
]

‎coderd/apidoc/docs.go

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

‎coderd/apidoc/swagger.json

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

‎coderd/workspaces.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1169,7 +1169,10 @@ func convertWorkspace(
11691169
autostartSchedule=&workspace.AutostartSchedule.String
11701170
}
11711171

1172-
ttlMillis:=convertWorkspaceTTLMillis(workspace.Ttl)
1172+
var (
1173+
ttlMillis=convertWorkspaceTTLMillis(workspace.Ttl)
1174+
deletingAt=calculateDeletingAt(workspace,template)
1175+
)
11731176
return codersdk.Workspace{
11741177
ID:workspace.ID,
11751178
CreatedAt:workspace.CreatedAt,
@@ -1188,6 +1191,7 @@ func convertWorkspace(
11881191
AutostartSchedule:autostartSchedule,
11891192
TTLMillis:ttlMillis,
11901193
LastUsedAt:workspace.LastUsedAt,
1194+
DeletingAt:deletingAt,
11911195
}
11921196
}
11931197

@@ -1200,6 +1204,22 @@ func convertWorkspaceTTLMillis(i sql.NullInt64) *int64 {
12001204
return&millis
12011205
}
12021206

1207+
// Calculate the time of the upcoming workspace deletion, if applicable; otherwise, return nil.
1208+
// Workspaces may have impending deletions if InactivityTTL feature is turned on and the workspace is inactive.
1209+
funccalculateDeletingAt(workspace database.Workspace,template database.Template)*time.Time {
1210+
var (
1211+
year,month,day=time.Now().Date()
1212+
beginningOfToday=time.Date(year,month,day,0,0,0,0,time.Now().Location())
1213+
)
1214+
// If InactivityTTL is turned off (set to 0), if the workspace has already been deleted,
1215+
// or if the workspace was used sometime within the last day, there is no impending deletion
1216+
iftemplate.InactivityTTL==0||workspace.Deleted||workspace.LastUsedAt.After(beginningOfToday) {
1217+
returnnil
1218+
}
1219+
1220+
returnptr.Ref(workspace.LastUsedAt.Add(time.Duration(template.InactivityTTL)*time.Nanosecond))
1221+
}
1222+
12031223
funcvalidWorkspaceTTLMillis(millis*int64,templateDefault,templateMax time.Duration) (sql.NullInt64,error) {
12041224
iftemplateDefault==0&&templateMax!=0|| (templateMax>0&&templateDefault>templateMax) {
12051225
templateDefault=templateMax

‎coderd/workspaces_internal_test.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package coderd
2+
3+
import (
4+
"testing"
5+
"time"
6+
7+
"github.com/stretchr/testify/require"
8+
9+
"github.com/coder/coder/coderd/database"
10+
"github.com/coder/coder/coderd/util/ptr"
11+
)
12+
13+
funcTest_calculateDeletingAt(t*testing.T) {
14+
t.Parallel()
15+
16+
testCases:= []struct {
17+
namestring
18+
workspace database.Workspace
19+
template database.Template
20+
expected*time.Time
21+
}{
22+
{
23+
name:"DeletingAt",
24+
workspace: database.Workspace{
25+
Deleted:false,
26+
LastUsedAt:time.Now().Add(time.Duration(-10)*time.Hour*24),// 10 days ago
27+
},
28+
template: database.Template{
29+
InactivityTTL:int64(9*24*time.Hour),// 9 days
30+
},
31+
expected:ptr.Ref(time.Now().Add(time.Duration(-1)*time.Hour*24)),// yesterday
32+
},
33+
{
34+
name:"InactivityTTLUnset",
35+
workspace: database.Workspace{
36+
Deleted:false,
37+
LastUsedAt:time.Now().Add(time.Duration(-10)*time.Hour*24),
38+
},
39+
template: database.Template{
40+
InactivityTTL:0,
41+
},
42+
expected:nil,
43+
},
44+
{
45+
name:"DeletedWorkspace",
46+
workspace: database.Workspace{
47+
Deleted:true,
48+
LastUsedAt:time.Now().Add(time.Duration(-10)*time.Hour*24),
49+
},
50+
template: database.Template{
51+
InactivityTTL:int64(9*24*time.Hour),
52+
},
53+
expected:nil,
54+
},
55+
{
56+
name:"ActiveWorkspace",
57+
workspace: database.Workspace{
58+
Deleted:true,
59+
LastUsedAt:time.Now().Add(time.Duration(-5)*time.Hour),// 5 hours ago
60+
},
61+
template: database.Template{
62+
InactivityTTL:int64(1*24*time.Hour),// 1 day
63+
},
64+
expected:nil,
65+
},
66+
}
67+
68+
for_,tc:=rangetestCases {
69+
tc:=tc
70+
t.Run(tc.name,func(t*testing.T) {
71+
t.Parallel()
72+
73+
found:=calculateDeletingAt(tc.workspace,tc.template)
74+
iftc.expected==nil {
75+
require.Nil(t,found,"impending deletion should be nil")
76+
}else {
77+
require.NotNil(t,found)
78+
require.WithinDuration(t,*tc.expected,*found,time.Second,"incorrect impending deletion")
79+
}
80+
})
81+
}
82+
}

‎codersdk/workspaces.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ type Workspace struct {
3434
AutostartSchedule*string`json:"autostart_schedule,omitempty"`
3535
TTLMillis*int64`json:"ttl_ms,omitempty"`
3636
LastUsedAt time.Time`json:"last_used_at" format:"date-time"`
37+
38+
// DeletingAt indicates the time of the upcoming workspace deletion, if applicable; otherwise it is nil.
39+
// Workspaces may have impending deletions if Template.InactivityTTL feature is turned on and the workspace is inactive.
40+
DeletingAt*time.Time`json:"deleting_at" format:"date-time"`
3741
}
3842

3943
typeWorkspacesRequeststruct {

‎docs/api/schemas.md

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4594,6 +4594,7 @@ Parameter represents a set value for the scope.
45944594
{
45954595
"autostart_schedule":"string",
45964596
"created_at":"2019-08-24T14:15:22Z",
4597+
"deleting_at":"2019-08-24T14:15:22Z",
45974598
"id":"497f6eca-6276-4993-bfeb-53cbbbba6f08",
45984599
"last_used_at":"2019-08-24T14:15:22Z",
45994600
"latest_build": {
@@ -4731,25 +4732,26 @@ Parameter represents a set value for the scope.
47314732

47324733
###Properties
47334734

4734-
| Name| Type| Required| Restrictions| Description|
4735-
| -------------------------------------------| --------------------------------------------------| --------| ------------| -----------|
4736-
|`autostart_schedule`| string| false|||
4737-
|`created_at`| string| false|||
4738-
|`id`| string| false|||
4739-
|`last_used_at`| string| false|||
4740-
|`latest_build`|[codersdk.WorkspaceBuild](#codersdkworkspacebuild)| false|||
4741-
|`name`| string| false|||
4742-
|`organization_id`| string| false|||
4743-
|`outdated`| boolean| false|||
4744-
|`owner_id`| string| false|||
4745-
|`owner_name`| string| false|||
4746-
|`template_allow_user_cancel_workspace_jobs`| boolean| false|||
4747-
|`template_display_name`| string| false|||
4748-
|`template_icon`| string| false|||
4749-
|`template_id`| string| false|||
4750-
|`template_name`| string| false|||
4751-
|`ttl_ms`| integer| false|||
4752-
|`updated_at`| string| false|||
4735+
| Name| Type| Required| Restrictions| Description|
4736+
| -------------------------------------------| --------------------------------------------------| --------| ------------| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
4737+
|`autostart_schedule`| string| false|||
4738+
|`created_at`| string| false|||
4739+
|`deleting_at`| string| false|| Deleting at indicates the time of the upcoming workspace deletion, if applicable; otherwise it is nil. Workspaces may have impending deletions if Template.InactivityTTL feature is turned on and the workspace is inactive.|
4740+
|`id`| string| false|||
4741+
|`last_used_at`| string| false|||
4742+
|`latest_build`|[codersdk.WorkspaceBuild](#codersdkworkspacebuild)| false|||
4743+
|`name`| string| false|||
4744+
|`organization_id`| string| false|||
4745+
|`outdated`| boolean| false|||
4746+
|`owner_id`| string| false|||
4747+
|`owner_name`| string| false|||
4748+
|`template_allow_user_cancel_workspace_jobs`| boolean| false|||
4749+
|`template_display_name`| string| false|||
4750+
|`template_icon`| string| false|||
4751+
|`template_id`| string| false|||
4752+
|`template_name`| string| false|||
4753+
|`ttl_ms`| integer| false|||
4754+
|`updated_at`| string| false|||
47534755

47544756
##codersdk.WorkspaceAgent
47554757

@@ -5596,6 +5598,7 @@ Parameter represents a set value for the scope.
55965598
{
55975599
"autostart_schedule":"string",
55985600
"created_at":"2019-08-24T14:15:22Z",
5601+
"deleting_at":"2019-08-24T14:15:22Z",
55995602
"id":"497f6eca-6276-4993-bfeb-53cbbbba6f08",
56005603
"last_used_at":"2019-08-24T14:15:22Z",
56015604
"latest_build": {

‎docs/api/workspaces.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ curl -X POST http://coder-server:8080/api/v2/organizations/{organization}/member
5656
{
5757
"autostart_schedule":"string",
5858
"created_at":"2019-08-24T14:15:22Z",
59+
"deleting_at":"2019-08-24T14:15:22Z",
5960
"id":"497f6eca-6276-4993-bfeb-53cbbbba6f08",
6061
"last_used_at":"2019-08-24T14:15:22Z",
6162
"latest_build": {
@@ -228,6 +229,7 @@ curl -X GET http://coder-server:8080/api/v2/users/{user}/workspace/{workspacenam
228229
{
229230
"autostart_schedule":"string",
230231
"created_at":"2019-08-24T14:15:22Z",
232+
"deleting_at":"2019-08-24T14:15:22Z",
231233
"id":"497f6eca-6276-4993-bfeb-53cbbbba6f08",
232234
"last_used_at":"2019-08-24T14:15:22Z",
233235
"latest_build": {
@@ -423,6 +425,7 @@ curl -X GET http://coder-server:8080/api/v2/workspaces \
423425
{
424426
"autostart_schedule":"string",
425427
"created_at":"2019-08-24T14:15:22Z",
428+
"deleting_at":"2019-08-24T14:15:22Z",
426429
"id":"497f6eca-6276-4993-bfeb-53cbbbba6f08",
427430
"last_used_at":"2019-08-24T14:15:22Z",
428431
"latest_build": {
@@ -592,6 +595,7 @@ curl -X GET http://coder-server:8080/api/v2/workspaces/{workspace} \
592595
{
593596
"autostart_schedule":"string",
594597
"created_at":"2019-08-24T14:15:22Z",
598+
"deleting_at":"2019-08-24T14:15:22Z",
595599
"id":"497f6eca-6276-4993-bfeb-53cbbbba6f08",
596600
"last_used_at":"2019-08-24T14:15:22Z",
597601
"latest_build": {

‎site/src/api/typesGenerated.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1113,6 +1113,7 @@ export interface Workspace {
11131113
readonlyautostart_schedule?:string
11141114
readonlyttl_ms?:number
11151115
readonlylast_used_at:string
1116+
readonlydeleting_at?:string
11161117
}
11171118

11181119
// From codersdk/workspaceagents.go

‎site/src/testHelpers/entities.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -721,6 +721,7 @@ export const MockWorkspace: TypesGen.Workspace = {
721721
ttl_ms:2*60*60*1000,
722722
latest_build:MockWorkspaceBuild,
723723
last_used_at:"2022-05-16T15:29:10.302441433Z",
724+
deleting_at:"0001-01-01T00:00:00Z",
724725
}
725726

726727
exportconstMockStoppedWorkspace:TypesGen.Workspace={

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp