Skip to content

Commit 9be2c52

Browse files
committed
fix: do not panic if monitors undefined
1 parent bb2167e commit 9be2c52

File tree

2 files changed

+37
-6
lines changed

2 files changed

+37
-6
lines changed

provider/agent.go

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -383,16 +383,28 @@ func agentResource() *schema.Resource {
383383
}
384384

385385
if rd.HasChange("resources_monitoring") {
386-
monitors, ok := rd.Get("resources_monitoring").(*schema.Set)
386+
rmResource, ok := rd.Get("resources_monitoring").(*schema.Set)
387387
if !ok {
388-
return xerrors.Errorf("unexpected type %T for resources_monitoring.0.volume, expected []any", rd.Get("resources_monitoring.0.volume"))
388+
return xerrors.Errorf("unexpected type %T for resources_monitoring, expected []any", rd.Get("resources_monitoring"))
389389
}
390390

391-
monitor := monitors.List()[0].(map[string]any)
391+
rmResourceAsList := rmResource.List()
392+
if len(rmResourceAsList) == 0 {
393+
return xerrors.Errorf("developer error: resources_monitoring cannot be empty")
394+
}
395+
rawMonitors := rmResourceAsList[0]
396+
if rawMonitors == nil {
397+
return xerrors.Errorf("resources_monitoring must define at least one monitor")
398+
}
399+
400+
monitors, ok := rawMonitors.(map[string]any)
401+
if !ok {
402+
return xerrors.Errorf("unexpected type %T for resources_monitoring.0.volume, expected []any", rawMonitors)
403+
}
392404

393-
volumes, ok := monitor["volume"].(*schema.Set)
405+
volumes, ok := monitors["volume"].(*schema.Set)
394406
if !ok {
395-
return xerrors.Errorf("unexpected type %T for resources_monitoring.0.volume, expected []any", monitor["volume"])
407+
return xerrors.Errorf("unexpected type %T for resources_monitoring.0.volume, expected []any", monitors["volume"])
396408
}
397409

398410
paths := map[string]bool{}
@@ -403,7 +415,6 @@ func agentResource() *schema.Resource {
403415
}
404416

405417
// print path for debug purpose
406-
407418
path, ok := obj["path"].(string)
408419
if !ok {
409420
return xerrors.Errorf("unexpected type %T for volume path, expected string", obj["path"])

provider/agent_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,26 @@ func TestAgent_ResourcesMonitoring(t *testing.T) {
352352
})
353353
})
354354

355+
t.Run("MissingMonitors", func(t *testing.T) {
356+
resource.Test(t, resource.TestCase{
357+
ProviderFactories: coderFactory(),
358+
IsUnitTest: true,
359+
Steps: []resource.TestStep{{
360+
Config: `
361+
provider "coder" {
362+
url = "https://example.com"
363+
}
364+
resource "coder_agent" "dev" {
365+
os = "linux"
366+
arch = "amd64"
367+
resources_monitoring {}
368+
}`,
369+
Check: nil,
370+
ExpectError: regexp.MustCompile(`resources_monitoring must define at least one monitor`),
371+
}},
372+
})
373+
})
374+
355375
t.Run("DuplicatePaths", func(t *testing.T) {
356376
resource.Test(t, resource.TestCase{
357377
ProviderFactories: coderFactory(),

0 commit comments

Comments
 (0)