@@ -12,6 +12,7 @@ import (
12
12
"github.com/google/uuid"
13
13
"github.com/stretchr/testify/assert"
14
14
"github.com/stretchr/testify/require"
15
+ "golang.org/x/xerrors"
15
16
16
17
"github.com/coder/coder/coderd/audit"
17
18
"github.com/coder/coder/coderd/coderdtest"
@@ -1154,76 +1155,115 @@ func TestMigrateLegacyToRichParameters(t *testing.T) {
1154
1155
1155
1156
func TestWorkspaceBuildDebugMode (t * testing.T ) {
1156
1157
t .Parallel ()
1157
- client := coderdtest .New (t , & coderdtest.Options {IncludeProvisionerDaemon : true })
1158
- user := coderdtest .CreateFirstUser (t , client )
1159
- version := coderdtest .CreateTemplateVersion (t , client , user .OrganizationID , & echo.Responses {
1160
- Parse : echo .ParseComplete ,
1161
- ProvisionPlan : echo .ProvisionComplete ,
1162
- ProvisionApply : []* proto.Provision_Response {{
1163
- Type : & proto.Provision_Response_Log {
1164
- Log : & proto.Log {
1165
- Level : proto .LogLevel_DEBUG ,
1166
- Output : "want-it" ,
1158
+
1159
+ t .Run ("AsRegularUser" , func (t * testing.T ) {
1160
+ t .Parallel ()
1161
+
1162
+ // Create users
1163
+ templateAuthorClient := coderdtest .New (t , & coderdtest.Options {IncludeProvisionerDaemon : true })
1164
+ templateAuthor := coderdtest .CreateFirstUser (t , templateAuthorClient )
1165
+ regularUserClient , _ := coderdtest .CreateAnotherUser (t , templateAuthorClient , templateAuthor .OrganizationID )
1166
+
1167
+ // Template owner: create a template
1168
+ version := coderdtest .CreateTemplateVersion (t , templateAuthorClient , templateAuthor .OrganizationID , nil )
1169
+ template := coderdtest .CreateTemplate (t , templateAuthorClient , templateAuthor .OrganizationID , version .ID )
1170
+ coderdtest .AwaitTemplateVersionJob (t , templateAuthorClient , version .ID )
1171
+
1172
+ // Regular user: create a workspace
1173
+ workspace := coderdtest .CreateWorkspace (t , regularUserClient , templateAuthor .OrganizationID , template .ID )
1174
+ coderdtest .AwaitWorkspaceBuildJob (t , regularUserClient , workspace .LatestBuild .ID )
1175
+
1176
+ // Regular user: try to start a workspace build in debug mode
1177
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
1178
+ defer cancel ()
1179
+
1180
+ _ , err := regularUserClient .CreateWorkspaceBuild (ctx , workspace .ID , codersdk.CreateWorkspaceBuildRequest {
1181
+ TemplateVersionID : workspace .LatestBuild .TemplateVersionID ,
1182
+ Transition : codersdk .WorkspaceTransitionStart ,
1183
+ LogLevel : "debug" ,
1184
+ })
1185
+
1186
+ // Regular user: expect an error
1187
+ require .NotNil (t , err )
1188
+ var sdkError * codersdk.Error
1189
+ isSdkError := xerrors .As (err , & sdkError )
1190
+ require .True (t , isSdkError )
1191
+ require .Contains (t , sdkError .Message , "Workspace builds with a custom log level are restricted to template authors only." )
1192
+ })
1193
+ t .Run ("AsTemplateAuthor" , func (t * testing.T ) {
1194
+ t .Parallel ()
1195
+
1196
+ client := coderdtest .New (t , & coderdtest.Options {IncludeProvisionerDaemon : true })
1197
+ user := coderdtest .CreateFirstUser (t , client )
1198
+ version := coderdtest .CreateTemplateVersion (t , client , user .OrganizationID , & echo.Responses {
1199
+ Parse : echo .ParseComplete ,
1200
+ ProvisionPlan : echo .ProvisionComplete ,
1201
+ ProvisionApply : []* proto.Provision_Response {{
1202
+ Type : & proto.Provision_Response_Log {
1203
+ Log : & proto.Log {
1204
+ Level : proto .LogLevel_DEBUG ,
1205
+ Output : "want-it" ,
1206
+ },
1167
1207
},
1168
- },
1169
- }, {
1170
- Type : & proto.Provision_Response_Log {
1171
- Log : & proto.Log {
1172
- Level : proto . LogLevel_TRACE ,
1173
- Output : "dont-want-it" ,
1208
+ }, {
1209
+ Type : & proto. Provision_Response_Log {
1210
+ Log : & proto.Log {
1211
+ Level : proto .LogLevel_TRACE ,
1212
+ Output : "dont-want-it" ,
1213
+ } ,
1174
1214
},
1175
- },
1176
- }, {
1177
- Type : & proto.Provision_Response_Log {
1178
- Log : & proto.Log {
1179
- Level : proto . LogLevel_DEBUG ,
1180
- Output : "done" ,
1215
+ }, {
1216
+ Type : & proto. Provision_Response_Log {
1217
+ Log : & proto.Log {
1218
+ Level : proto .LogLevel_DEBUG ,
1219
+ Output : "done" ,
1220
+ } ,
1181
1221
},
1182
- },
1183
- }, {
1184
- Type : & proto.Provision_Response_Complete {
1185
- Complete : & proto.Provision_Complete {},
1186
- },
1187
- }},
1188
- })
1189
- template := coderdtest .CreateTemplate (t , client , user .OrganizationID , version .ID )
1190
- coderdtest .AwaitTemplateVersionJob (t , client , version .ID )
1222
+ }, {
1223
+ Type : & proto.Provision_Response_Complete {
1224
+ Complete : & proto.Provision_Complete {},
1225
+ },
1226
+ }},
1227
+ })
1228
+ template := coderdtest .CreateTemplate (t , client , user .OrganizationID , version .ID )
1229
+ coderdtest .AwaitTemplateVersionJob (t , client , version .ID )
1191
1230
1192
- // Create workspace
1193
- workspace := coderdtest .CreateWorkspace (t , client , user .OrganizationID , template .ID )
1194
- coderdtest .AwaitWorkspaceBuildJob (t , client , workspace .LatestBuild .ID )
1231
+ // Create workspace
1232
+ workspace := coderdtest .CreateWorkspace (t , client , user .OrganizationID , template .ID )
1233
+ coderdtest .AwaitWorkspaceBuildJob (t , client , workspace .LatestBuild .ID )
1195
1234
1196
- // Create workspace build
1197
- ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
1198
- defer cancel ()
1235
+ // Create workspace build
1236
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
1237
+ defer cancel ()
1199
1238
1200
- build , err := client .CreateWorkspaceBuild (ctx , workspace .ID , codersdk.CreateWorkspaceBuildRequest {
1201
- TemplateVersionID : workspace .LatestBuild .TemplateVersionID ,
1202
- Transition : codersdk .WorkspaceTransitionStart ,
1203
- ProvisionerState : []byte (" " ),
1204
- LogLevel : "debug" ,
1205
- })
1206
- require .Nil (t , err )
1239
+ build , err := client .CreateWorkspaceBuild (ctx , workspace .ID , codersdk.CreateWorkspaceBuildRequest {
1240
+ TemplateVersionID : workspace .LatestBuild .TemplateVersionID ,
1241
+ Transition : codersdk .WorkspaceTransitionStart ,
1242
+ ProvisionerState : []byte (" " ),
1243
+ LogLevel : "debug" ,
1244
+ })
1245
+ require .Nil (t , err )
1207
1246
1208
- build = coderdtest .AwaitWorkspaceBuildJob (t , client , build .ID )
1247
+ build = coderdtest .AwaitWorkspaceBuildJob (t , client , build .ID )
1209
1248
1210
- // Watch for incoming logs
1211
- logs , closer , err := client .WorkspaceBuildLogsAfter (ctx , build .ID , 0 )
1212
- require .NoError (t , err )
1213
- defer closer .Close ()
1249
+ // Watch for incoming logs
1250
+ logs , closer , err := client .WorkspaceBuildLogsAfter (ctx , build .ID , 0 )
1251
+ require .NoError (t , err )
1252
+ defer closer .Close ()
1214
1253
1215
- for {
1216
- log , ok := <- logs
1217
- if ! ok {
1218
- break
1219
- }
1254
+ for {
1255
+ log , ok := <- logs
1256
+ if ! ok {
1257
+ break
1258
+ }
1220
1259
1221
- if log .Output == "dont-want-it" {
1222
- require .Failf (t , "unexpected log message" , "%s log message shouldn't be logged: %s" , log .Level , log .Output )
1223
- }
1260
+ if log .Output == "dont-want-it" {
1261
+ require .Failf (t , "unexpected log message" , "%s log message shouldn't be logged: %s" , log .Level , log .Output )
1262
+ }
1224
1263
1225
- if log .Output == "done" {
1226
- return
1264
+ if log .Output == "done" {
1265
+ return
1266
+ }
1227
1267
}
1228
- }
1268
+ })
1229
1269
}
0 commit comments