From a7f6cc93009c4052f836c279e68ecd4a96ab238d Mon Sep 17 00:00:00 2001 From: Manuel Vogel Date: Fri, 27 Dec 2019 16:48:21 +0100 Subject: [PATCH] fix(service): ports flattening (#233) Closes #222 * fix(service): changes ports from set to list. adapts tests. marks published port computed. uses endpoint spec from api to flatten. --- docker/resource_docker_service.go | 3 +- docker/resource_docker_service_funcs.go | 6 ++-- docker/resource_docker_service_test.go | 37 ++++++++++++------------- docker/structures_service.go | 11 +++----- 4 files changed, 26 insertions(+), 31 deletions(-) diff --git a/docker/resource_docker_service.go b/docker/resource_docker_service.go index 28c0cbb4..a8fa562f 100644 --- a/docker/resource_docker_service.go +++ b/docker/resource_docker_service.go @@ -876,7 +876,7 @@ func resourceDockerService() *schema.Resource { ValidateFunc: validateStringMatchesPattern(`^(vip|dnsrr)$`), }, "ports": { - Type: schema.TypeSet, + Type: schema.TypeList, Description: "List of exposed ports that this service is accessible on from the outside. Ports can only be provided if 'vip' resolution mode is used.", Optional: true, Elem: &schema.Resource{ @@ -902,6 +902,7 @@ func resourceDockerService() *schema.Resource { Type: schema.TypeInt, Description: "The port on the swarm hosts.", Optional: true, + Computed: true, }, "publish_mode": { Type: schema.TypeString, diff --git a/docker/resource_docker_service_funcs.go b/docker/resource_docker_service_funcs.go index eef8d456..db597cb0 100644 --- a/docker/resource_docker_service_funcs.go +++ b/docker/resource_docker_service_funcs.go @@ -132,7 +132,7 @@ func resourceDockerServiceRead(d *schema.ResourceData, meta interface{}) error { if err = d.Set("rollback_config", flattenServiceUpdateOrRollbackConfig(service.Spec.RollbackConfig)); err != nil { log.Printf("[WARN] failed to set rollback_config from API: %s", err) } - if err = d.Set("endpoint_spec", flattenServiceEndpointSpec(service.Spec.EndpointSpec)); err != nil { + if err = d.Set("endpoint_spec", flattenServiceEndpointSpec(service.Endpoint)); err != nil { log.Printf("[WARN] failed to set endpoint spec from API: %s", err) } @@ -1183,8 +1183,8 @@ func createServiceEndpointSpec(d *schema.ResourceData) (*swarm.EndpointSpec, err // portSetToServicePorts maps a set of ports to portConfig func portSetToServicePorts(v interface{}) []swarm.PortConfig { retPortConfigs := []swarm.PortConfig{} - if len(v.(*schema.Set).List()) > 0 { - for _, portInt := range v.(*schema.Set).List() { + if len(v.([]interface{})) > 0 { + for _, portInt := range v.([]interface{}) { portConfig := swarm.PortConfig{} rawPort := portInt.(map[string]interface{}) if value, ok := rawPort["name"]; ok { diff --git a/docker/resource_docker_service_test.go b/docker/resource_docker_service_test.go index 07e3dea0..eba4f89c 100644 --- a/docker/resource_docker_service_test.go +++ b/docker/resource_docker_service_test.go @@ -473,11 +473,11 @@ func TestAccDockerService_fullSpec(t *testing.T) { resource.TestCheckResourceAttr("docker_service.foo", "rollback_config.0.max_failure_ratio", "0.9"), resource.TestCheckResourceAttr("docker_service.foo", "rollback_config.0.order", "stop-first"), resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.mode", "vip"), - resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.1714132424.name", "random"), - resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.1714132424.protocol", "tcp"), - resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.1714132424.target_port", "8080"), - resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.1714132424.published_port", "8080"), - resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.1714132424.publish_mode", "ingress"), + resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.0.name", "random"), + resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.0.protocol", "tcp"), + resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.0.target_port", "8080"), + resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.0.published_port", "8080"), + resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.0.publish_mode", "ingress"), ), }, { @@ -884,8 +884,8 @@ func TestAccDockerService_updateMultiplePropertiesConverge(t *testing.T) { resource.TestCheckResourceAttr("docker_service.foo", "update_config.0.max_failure_ratio", "0.5"), resource.TestCheckResourceAttr("docker_service.foo", "update_config.0.order", "start-first"), resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.#", "1"), - resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.3541714906.target_port", "8080"), - resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.3541714906.published_port", "8081"), + resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.0.target_port", "8080"), + resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.0.published_port", "8081"), resource.TestCheckResourceAttr("docker_service.foo", "task_spec.0.container_spec.0.configs.#", "1"), resource.TestCheckResourceAttr("docker_service.foo", "task_spec.0.container_spec.0.secrets.#", "1"), resource.TestCheckResourceAttr("docker_service.foo", "task_spec.0.container_spec.0.dir", ""), @@ -930,10 +930,10 @@ func TestAccDockerService_updateMultiplePropertiesConverge(t *testing.T) { resource.TestCheckResourceAttr("docker_service.foo", "update_config.0.max_failure_ratio", "0.5"), resource.TestCheckResourceAttr("docker_service.foo", "update_config.0.order", "start-first"), resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.#", "2"), - resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.3541714906.target_port", "8080"), - resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.3541714906.published_port", "8081"), - resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.1884078451.target_port", "8080"), - resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.1884078451.published_port", "8082"), + resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.0.target_port", "8080"), + resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.0.published_port", "8081"), + resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.1.target_port", "8080"), + resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.1.published_port", "8082"), resource.TestCheckResourceAttr("docker_service.foo", "task_spec.0.container_spec.0.configs.#", "1"), resource.TestCheckResourceAttr("docker_service.foo", "task_spec.0.container_spec.0.secrets.#", "1"), resource.TestCheckResourceAttr("docker_service.foo", "task_spec.0.container_spec.0.dir", ""), @@ -978,10 +978,10 @@ func TestAccDockerService_updateMultiplePropertiesConverge(t *testing.T) { resource.TestCheckResourceAttr("docker_service.foo", "update_config.0.max_failure_ratio", "0.5"), resource.TestCheckResourceAttr("docker_service.foo", "update_config.0.order", "start-first"), resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.#", "2"), - resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.3541714906.target_port", "8080"), - resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.3541714906.published_port", "8081"), - resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.1884078451.target_port", "8080"), - resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.1884078451.published_port", "8082"), + resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.0.target_port", "8080"), + resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.0.published_port", "8081"), + resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.1.target_port", "8080"), + resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.1.published_port", "8082"), resource.TestCheckResourceAttr("docker_service.foo", "task_spec.0.container_spec.0.configs.#", "1"), resource.TestCheckResourceAttr("docker_service.foo", "task_spec.0.container_spec.0.secrets.#", "1"), resource.TestCheckResourceAttr("docker_service.foo", "task_spec.0.container_spec.0.dir", ""), @@ -1012,11 +1012,6 @@ func TestAccDockerService_updateMultiplePropertiesConverge(t *testing.T) { resource.TestCheckResourceAttr("docker_service.foo", "task_spec.0.log_driver.0.options.max-size", "15m"), ), }, - { - ResourceName: "docker_service.foo", - ImportState: true, - ImportStateVerify: true, - }, }, CheckDestroy: checkAndRemoveImages, }) @@ -1146,6 +1141,8 @@ func TestAccDockerService_convergeAndStopGracefully(t *testing.T) { resource.TestCheckResourceAttr("docker_service.foo", "name", "tftest-service-basic-converge"), resource.TestMatchResourceAttr("docker_service.foo", "task_spec.0.container_spec.0.image", regexp.MustCompile(`127.0.0.1:15000/tftest-service:v1.*`)), resource.TestCheckResourceAttr("docker_service.foo", "mode.0.replicated.0.replicas", "2"), + testValueHigherEqualThan("docker_service.foo", "endpoint_spec.0.ports.0.target_port", 8080), + testValueHigherEqualThan("docker_service.foo", "endpoint_spec.0.ports.0.published_port", 30000), ), }, }, diff --git a/docker/structures_service.go b/docker/structures_service.go index 788bae69..216bc464 100644 --- a/docker/structures_service.go +++ b/docker/structures_service.go @@ -85,10 +85,10 @@ func flattenServiceUpdateOrRollbackConfig(in *swarm.UpdateConfig) []interface{} return out } -func flattenServiceEndpointSpec(in *swarm.EndpointSpec) []interface{} { +func flattenServiceEndpointSpec(in swarm.Endpoint) []interface{} { var out = make([]interface{}, 0, 0) m := make(map[string]interface{}) - m["mode"] = string(in.Mode) + m["mode"] = string(in.Spec.Mode) m["ports"] = flattenServicePorts(in.Ports) out = append(out, m) @@ -491,7 +491,7 @@ func flattenTaskLogDriver(in *swarm.Driver) []interface{} { ///// end TaskSpec ///// start EndpointSpec -func flattenServicePorts(in []swarm.PortConfig) *schema.Set { +func flattenServicePorts(in []swarm.PortConfig) []interface{} { var out = make([]interface{}, len(in), len(in)) for i, v := range in { m := make(map[string]interface{}) @@ -502,10 +502,7 @@ func flattenServicePorts(in []swarm.PortConfig) *schema.Set { m["publish_mode"] = string(v.PublishMode) out[i] = m } - endpointSpecResource := resourceDockerService().Schema["endpoint_spec"].Elem.(*schema.Resource) - portsResource := endpointSpecResource.Schema["ports"].Elem.(*schema.Resource) - f := schema.HashResource(portsResource) - return schema.NewSet(f, out) + return out } ///// end EndpointSpec