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.
This commit is contained in:
Manuel Vogel 2019-12-27 16:48:21 +01:00 committed by GitHub
parent 45e3127fb9
commit a7f6cc9300
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 26 additions and 31 deletions

View file

@ -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,

View file

@ -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 {

View file

@ -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),
),
},
},

View file

@ -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