From f51d03525660cf6c75655666aa003f2b4e8a8fe3 Mon Sep 17 00:00:00 2001 From: Tim Gross Date: Fri, 29 Jan 2021 10:16:07 -0500 Subject: [PATCH] interpolate maps in dynamic blocks (#9921) Update hcl2 for patch to fix map interpolation in dynamic blocks --- go.mod | 2 +- go.sum | 4 +- jobspec2/parse_test.go | 46 +++++++++++++++---- .../hcl/v2/ext/dynblock/expand_body.go | 10 ++-- vendor/modules.txt | 2 +- 5 files changed, 48 insertions(+), 16 deletions(-) diff --git a/go.mod b/go.mod index f6d2d0dd0041..98507fe679cd 100644 --- a/go.mod +++ b/go.mod @@ -74,7 +74,7 @@ require ( github.com/hashicorp/go-version v1.2.1-0.20191009193637-2046c9d0f0b0 github.com/hashicorp/golang-lru v0.5.4 github.com/hashicorp/hcl v1.0.1-0.20201016140508-a07e7d50bbee - github.com/hashicorp/hcl/v2 v2.7.1-0.20201020204811-68a97f93bb48 + github.com/hashicorp/hcl/v2 v2.7.1-0.20210129140708-3000d85e32a9 github.com/hashicorp/logutils v1.0.0 github.com/hashicorp/memberlist v0.2.2 github.com/hashicorp/net-rpc-msgpackrpc v0.0.0-20151116020338-a14192a58a69 diff --git a/go.sum b/go.sum index d2caaa5e9f2a..0382f78c3fe6 100644 --- a/go.sum +++ b/go.sum @@ -411,8 +411,8 @@ github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+l github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.1-0.20201016140508-a07e7d50bbee h1:8B4HqvMUtYSjsGkYjiQGStc9pXffY2J+Z2SPQAj+wMY= github.com/hashicorp/hcl v1.0.1-0.20201016140508-a07e7d50bbee/go.mod h1:gwlu9+/P9MmKtYrMsHeFRZPXj2CTPm11TDnMeaRHS7g= -github.com/hashicorp/hcl/v2 v2.7.1-0.20201020204811-68a97f93bb48 h1:iaau0VStfX9CgOlpbceawI94uVEM3sliqnjpHSVQqUo= -github.com/hashicorp/hcl/v2 v2.7.1-0.20201020204811-68a97f93bb48/go.mod h1:bQTN5mpo+jewjJgh8jr0JUguIi7qPHUF6yIfAEN3jqY= +github.com/hashicorp/hcl/v2 v2.7.1-0.20210129140708-3000d85e32a9 h1:5s4yY6Efzd33dTozKsEe6PeqPPN1jhXb8ijCBZllS1c= +github.com/hashicorp/hcl/v2 v2.7.1-0.20210129140708-3000d85e32a9/go.mod h1:bQTN5mpo+jewjJgh8jr0JUguIi7qPHUF6yIfAEN3jqY= github.com/hashicorp/hil v0.0.0-20160711231837-1e86c6b523c5/go.mod h1:KHvg/R2/dPtaePb16oW4qIyzkMxXOL38xjRN64adsts= github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= diff --git a/jobspec2/parse_test.go b/jobspec2/parse_test.go index e54d50cfaa78..a1020a785482 100644 --- a/jobspec2/parse_test.go +++ b/jobspec2/parse_test.go @@ -280,18 +280,39 @@ func TestParseDynamic(t *testing.T) { hcl := ` job "example" { -dynamic "group" { - for_each = ["groupA", "groupB", "groupC"] - labels = [group.value] - - content { - task "simple" { - driver = "raw_exec" + dynamic "group" { + for_each = [ + { name = "groupA", idx = 1 }, + { name = "groupB", idx = 2 }, + { name = "groupC", idx = 3 }, + ] + labels = [group.value.name] + + content { + count = group.value.idx + + service { + port = group.value.name + } + task "simple" { + driver = "raw_exec" + config { + command = group.value.name + } + meta { + VERSION = group.value.idx + } + env { + ID = format("id:%s", group.value.idx) + } + resources { + cpu = group.value.idx + } + } } } } -} ` out, err := ParseWithConfig(&ParseConfig{ Path: "input.hcl", @@ -305,6 +326,15 @@ dynamic "group" { require.Equal(t, "groupA", *out.TaskGroups[0].Name) require.Equal(t, "groupB", *out.TaskGroups[1].Name) require.Equal(t, "groupC", *out.TaskGroups[2].Name) + require.Equal(t, 1, *out.TaskGroups[0].Tasks[0].Resources.CPU) + require.Equal(t, "groupA", out.TaskGroups[0].Services[0].PortLabel) + + // interpolation inside maps + require.Equal(t, "groupA", out.TaskGroups[0].Tasks[0].Config["command"]) + require.Equal(t, "1", out.TaskGroups[0].Tasks[0].Meta["VERSION"]) + require.Equal(t, "id:1", out.TaskGroups[0].Tasks[0].Env["ID"]) + require.Equal(t, "id:2", out.TaskGroups[1].Tasks[0].Env["ID"]) + require.Equal(t, "3", out.TaskGroups[2].Tasks[0].Meta["VERSION"]) } func TestParse_InvalidScalingSyntax(t *testing.T) { diff --git a/vendor/github.com/hashicorp/hcl/v2/ext/dynblock/expand_body.go b/vendor/github.com/hashicorp/hcl/v2/ext/dynblock/expand_body.go index 65a9eab2df40..ff577d9509f0 100644 --- a/vendor/github.com/hashicorp/hcl/v2/ext/dynblock/expand_body.go +++ b/vendor/github.com/hashicorp/hcl/v2/ext/dynblock/expand_body.go @@ -251,10 +251,12 @@ func (b *expandBody) expandChild(child hcl.Body, i *iteration) hcl.Body { } func (b *expandBody) JustAttributes() (hcl.Attributes, hcl.Diagnostics) { - // blocks aren't allowed in JustAttributes mode and this body can - // only produce blocks, so we'll just pass straight through to our - // underlying body here. - return b.original.JustAttributes() + // TODO: the original comment in upstream says that blocks aren't allowed + // here, but we pass them in when dynamic blocks include + // map[string]interface{} + attrs, diags := b.original.JustAttributes() + attrs = b.prepareAttributes(attrs) + return attrs, diags } func (b *expandBody) MissingItemRange() hcl.Range { diff --git a/vendor/modules.txt b/vendor/modules.txt index 2a11bd33ef8a..d4f690026e67 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -470,7 +470,7 @@ github.com/hashicorp/hcl/hcl/token github.com/hashicorp/hcl/json/parser github.com/hashicorp/hcl/json/scanner github.com/hashicorp/hcl/json/token -# github.com/hashicorp/hcl/v2 v2.7.1-0.20201020204811-68a97f93bb48 +# github.com/hashicorp/hcl/v2 v2.7.1-0.20210129140708-3000d85e32a9 ## explicit github.com/hashicorp/hcl/v2 github.com/hashicorp/hcl/v2/ext/customdecode