diff --git a/docker/label.go b/docker/label.go index 32b60ec3..2a7ad6fb 100644 --- a/docker/label.go +++ b/docker/label.go @@ -1,6 +1,10 @@ package docker -import "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +import ( + "strings" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) func labelToPair(label map[string]interface{}) (string, string) { return label["label"].(string), label["value"].(string) @@ -51,3 +55,32 @@ var labelSchema = &schema.Resource{ }, }, } + +//gatherImmediateSubkeys given an incomplete attribute identifier, find all +//the strings (if any) that appear after this one in the various dot-separated +//identifiers. +func gatherImmediateSubkeys(attrs map[string]string, partialKey string) []string { + var immediateSubkeys = []string{} + for k := range attrs { + prefix := partialKey + "." + if strings.HasPrefix(k, prefix) { + rest := strings.TrimPrefix(k, prefix) + parts := strings.SplitN(rest, ".", 2) + immediateSubkeys = append(immediateSubkeys, parts[0]) + } + } + + return immediateSubkeys +} + +func getLabelMapForPartialKey(attrs map[string]string, partialKey string) map[string]string { + setIDs := gatherImmediateSubkeys(attrs, partialKey) + + var labelMap = map[string]string{} + for _, id := range setIDs { + prefix := partialKey + "." + id + labelMap[attrs[prefix+".label"]] = attrs[prefix+".value"] + } + + return labelMap +} diff --git a/docker/resource_docker_secret_test.go b/docker/resource_docker_secret_test.go index 5ee2a378..810c6ba9 100644 --- a/docker/resource_docker_secret_test.go +++ b/docker/resource_docker_secret_test.go @@ -6,7 +6,6 @@ import ( "context" - "github.com/davecgh/go-spew/spew" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/terraform" ) @@ -98,13 +97,17 @@ func TestAccDockerSecret_labels(t *testing.T) { `, Check: resource.ComposeTestCheckFunc( func(s *terraform.State) error { - spew.Dump(s.RootModule().Resources["docker_secret.foo"].Primary.Attributes) + attrs := s.RootModule().Resources["docker_secret.foo"].Primary.Attributes + labelMap := getLabelMapForPartialKey(attrs, "labels") + + if len(labelMap) != 2 || + labelMap["test1"] != "foo" || + labelMap["test2"] != "bar" { + return fmt.Errorf("label map had unexpected structure: %v", labelMap) + } + return nil }, - resource.TestCheckResourceAttr("docker_secret.foo", fmt.Sprintf("labels.%v.label", hashStringLabel("test1")), "test1"), - resource.TestCheckResourceAttr("docker_secret.foo", fmt.Sprintf("labels.%v.value", hashStringLabel("test1")), "foo"), - resource.TestCheckResourceAttr("docker_secret.foo", fmt.Sprintf("labels.%v.label", hashStringLabel("test2")), "test1"), - resource.TestCheckResourceAttr("docker_secret.foo", fmt.Sprintf("labels.%v.value", hashStringLabel("test2")), "bar"), ), }, },