From 2623bb44232c627610d85a7d3aae7d4a2cde5bae Mon Sep 17 00:00:00 2001 From: Seth Hoenig Date: Tue, 25 Jan 2022 09:29:16 -0600 Subject: [PATCH] connect: fix bug where sidecar_task.resources was ignored with hcl1 The HCL1 parser did not respect connect.sidecar_task.resources if the connect.sidecar_service block was not set (an optimiztion that no longer makes sense with connect gateways). Fixes #10899 --- .changelog/10899.txt | 4 +++ jobspec/parse_service.go | 30 ++++++++----------- jobspec/parse_test.go | 24 +++++++++++++++ .../tg-service-connect-resources.hcl | 20 +++++++++++++ 4 files changed, 60 insertions(+), 18 deletions(-) create mode 100644 .changelog/10899.txt create mode 100644 jobspec/test-fixtures/tg-service-connect-resources.hcl diff --git a/.changelog/10899.txt b/.changelog/10899.txt new file mode 100644 index 000000000000..86a212935bca --- /dev/null +++ b/.changelog/10899.txt @@ -0,0 +1,4 @@ +``` +release-note:bug +Fixed a bug where connect sidecar resources were ignored when using HCL1 +``` diff --git a/jobspec/parse_service.go b/jobspec/parse_service.go index c4c1d33d8780..fe679805bd32 100644 --- a/jobspec/parse_service.go +++ b/jobspec/parse_service.go @@ -104,12 +104,10 @@ func parseService(o *ast.ObjectItem) (*api.Service, error) { if len(co.Items) > 1 { return nil, fmt.Errorf("connect '%s': cannot have more than 1 connect stanza", service.Name) } - c, err := parseConnect(co.Items[0]) if err != nil { return nil, multierror.Prefix(err, fmt.Sprintf("'%s',", service.Name)) } - service.Connect = c } @@ -191,33 +189,29 @@ func parseConnect(co *ast.ObjectItem) (*api.ConsulConnect, error) { // Parse the sidecar_service o = connectList.Filter("sidecar_service") - if len(o.Items) == 0 { - return &connect, nil - } if len(o.Items) > 1 { return nil, fmt.Errorf("only one 'sidecar_service' block allowed per task") } - - r, err := parseSidecarService(o.Items[0]) - if err != nil { - return nil, fmt.Errorf("sidecar_service, %v", err) + if len(o.Items) == 1 { + r, err := parseSidecarService(o.Items[0]) + if err != nil { + return nil, fmt.Errorf("sidecar_service, %v", err) + } + connect.SidecarService = r } - connect.SidecarService = r // Parse the sidecar_task o = connectList.Filter("sidecar_task") - if len(o.Items) == 0 { - return &connect, nil - } if len(o.Items) > 1 { return nil, fmt.Errorf("only one 'sidecar_task' block allowed per task") } - - t, err := parseSidecarTask(o.Items[0]) - if err != nil { - return nil, fmt.Errorf("sidecar_task, %v", err) + if len(o.Items) == 1 { + t, err := parseSidecarTask(o.Items[0]) + if err != nil { + return nil, fmt.Errorf("sidecar_task, %v", err) + } + connect.SidecarTask = t } - connect.SidecarTask = t return &connect, nil } diff --git a/jobspec/parse_test.go b/jobspec/parse_test.go index 63cac85dfd78..aa219c1172eb 100644 --- a/jobspec/parse_test.go +++ b/jobspec/parse_test.go @@ -1285,6 +1285,30 @@ func TestParse(t *testing.T) { }, false, }, + { + "tg-service-connect-resources.hcl", + &api.Job{ + ID: stringToPtr("sidecar_task_resources"), + Name: stringToPtr("sidecar_task_resources"), + Type: stringToPtr("service"), + TaskGroups: []*api.TaskGroup{{ + Name: stringToPtr("group"), + Services: []*api.Service{{ + Name: "example", + Connect: &api.ConsulConnect{ + SidecarTask: &api.SidecarTask{ + Resources: &api.Resources{ + CPU: intToPtr(111), + MemoryMB: intToPtr(222), + MemoryMaxMB: intToPtr(333), + }, + }, + }, + }}, + }}, + }, + false, + }, { "tg-service-connect-proxy.hcl", &api.Job{ diff --git a/jobspec/test-fixtures/tg-service-connect-resources.hcl b/jobspec/test-fixtures/tg-service-connect-resources.hcl new file mode 100644 index 000000000000..166c17fb9cd9 --- /dev/null +++ b/jobspec/test-fixtures/tg-service-connect-resources.hcl @@ -0,0 +1,20 @@ +job "sidecar_task_resources" { + type = "service" + + group "group" { + service { + name = "example" + + connect { + # should still work without sidecar_service being set (i.e. connect gateway) + sidecar_task { + resources { + cpu = 111 + memory = 222 + memory_max = 333 + } + } + } + } + } +}