Skip to content

Commit a7f6cc9

Browse files
authored
fix(service): ports flattening (kreuzwerker#233)
Closes kreuzwerker#222 * fix(service): changes ports from set to list. adapts tests. marks published port computed. uses endpoint spec from api to flatten.
1 parent 45e3127 commit a7f6cc9

4 files changed

+26
-31
lines changed

docker/resource_docker_service.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -876,7 +876,7 @@ func resourceDockerService() *schema.Resource {
876876
ValidateFunc: validateStringMatchesPattern(`^(vip|dnsrr)$`),
877877
},
878878
"ports": {
879-
Type: schema.TypeSet,
879+
Type: schema.TypeList,
880880
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.",
881881
Optional: true,
882882
Elem: &schema.Resource{
@@ -902,6 +902,7 @@ func resourceDockerService() *schema.Resource {
902902
Type: schema.TypeInt,
903903
Description: "The port on the swarm hosts.",
904904
Optional: true,
905+
Computed: true,
905906
},
906907
"publish_mode": {
907908
Type: schema.TypeString,

docker/resource_docker_service_funcs.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ func resourceDockerServiceRead(d *schema.ResourceData, meta interface{}) error {
132132
if err = d.Set("rollback_config", flattenServiceUpdateOrRollbackConfig(service.Spec.RollbackConfig)); err != nil {
133133
log.Printf("[WARN] failed to set rollback_config from API: %s", err)
134134
}
135-
if err = d.Set("endpoint_spec", flattenServiceEndpointSpec(service.Spec.EndpointSpec)); err != nil {
135+
if err = d.Set("endpoint_spec", flattenServiceEndpointSpec(service.Endpoint)); err != nil {
136136
log.Printf("[WARN] failed to set endpoint spec from API: %s", err)
137137
}
138138

@@ -1183,8 +1183,8 @@ func createServiceEndpointSpec(d *schema.ResourceData) (*swarm.EndpointSpec, err
11831183
// portSetToServicePorts maps a set of ports to portConfig
11841184
func portSetToServicePorts(v interface{}) []swarm.PortConfig {
11851185
retPortConfigs := []swarm.PortConfig{}
1186-
if len(v.(*schema.Set).List()) > 0 {
1187-
for _, portInt := range v.(*schema.Set).List() {
1186+
if len(v.([]interface{})) > 0 {
1187+
for _, portInt := range v.([]interface{}) {
11881188
portConfig := swarm.PortConfig{}
11891189
rawPort := portInt.(map[string]interface{})
11901190
if value, ok := rawPort["name"]; ok {

docker/resource_docker_service_test.go

+17-20
Original file line numberDiff line numberDiff line change
@@ -473,11 +473,11 @@ func TestAccDockerService_fullSpec(t *testing.T) {
473473
resource.TestCheckResourceAttr("docker_service.foo", "rollback_config.0.max_failure_ratio", "0.9"),
474474
resource.TestCheckResourceAttr("docker_service.foo", "rollback_config.0.order", "stop-first"),
475475
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.mode", "vip"),
476-
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.1714132424.name", "random"),
477-
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.1714132424.protocol", "tcp"),
478-
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.1714132424.target_port", "8080"),
479-
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.1714132424.published_port", "8080"),
480-
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.1714132424.publish_mode", "ingress"),
476+
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.0.name", "random"),
477+
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.0.protocol", "tcp"),
478+
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.0.target_port", "8080"),
479+
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.0.published_port", "8080"),
480+
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.0.publish_mode", "ingress"),
481481
),
482482
},
483483
{
@@ -884,8 +884,8 @@ func TestAccDockerService_updateMultiplePropertiesConverge(t *testing.T) {
884884
resource.TestCheckResourceAttr("docker_service.foo", "update_config.0.max_failure_ratio", "0.5"),
885885
resource.TestCheckResourceAttr("docker_service.foo", "update_config.0.order", "start-first"),
886886
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.#", "1"),
887-
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.3541714906.target_port", "8080"),
888-
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.3541714906.published_port", "8081"),
887+
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.0.target_port", "8080"),
888+
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.0.published_port", "8081"),
889889
resource.TestCheckResourceAttr("docker_service.foo", "task_spec.0.container_spec.0.configs.#", "1"),
890890
resource.TestCheckResourceAttr("docker_service.foo", "task_spec.0.container_spec.0.secrets.#", "1"),
891891
resource.TestCheckResourceAttr("docker_service.foo", "task_spec.0.container_spec.0.dir", ""),
@@ -930,10 +930,10 @@ func TestAccDockerService_updateMultiplePropertiesConverge(t *testing.T) {
930930
resource.TestCheckResourceAttr("docker_service.foo", "update_config.0.max_failure_ratio", "0.5"),
931931
resource.TestCheckResourceAttr("docker_service.foo", "update_config.0.order", "start-first"),
932932
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.#", "2"),
933-
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.3541714906.target_port", "8080"),
934-
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.3541714906.published_port", "8081"),
935-
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.1884078451.target_port", "8080"),
936-
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.1884078451.published_port", "8082"),
933+
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.0.target_port", "8080"),
934+
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.0.published_port", "8081"),
935+
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.1.target_port", "8080"),
936+
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.1.published_port", "8082"),
937937
resource.TestCheckResourceAttr("docker_service.foo", "task_spec.0.container_spec.0.configs.#", "1"),
938938
resource.TestCheckResourceAttr("docker_service.foo", "task_spec.0.container_spec.0.secrets.#", "1"),
939939
resource.TestCheckResourceAttr("docker_service.foo", "task_spec.0.container_spec.0.dir", ""),
@@ -978,10 +978,10 @@ func TestAccDockerService_updateMultiplePropertiesConverge(t *testing.T) {
978978
resource.TestCheckResourceAttr("docker_service.foo", "update_config.0.max_failure_ratio", "0.5"),
979979
resource.TestCheckResourceAttr("docker_service.foo", "update_config.0.order", "start-first"),
980980
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.#", "2"),
981-
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.3541714906.target_port", "8080"),
982-
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.3541714906.published_port", "8081"),
983-
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.1884078451.target_port", "8080"),
984-
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.1884078451.published_port", "8082"),
981+
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.0.target_port", "8080"),
982+
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.0.published_port", "8081"),
983+
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.1.target_port", "8080"),
984+
resource.TestCheckResourceAttr("docker_service.foo", "endpoint_spec.0.ports.1.published_port", "8082"),
985985
resource.TestCheckResourceAttr("docker_service.foo", "task_spec.0.container_spec.0.configs.#", "1"),
986986
resource.TestCheckResourceAttr("docker_service.foo", "task_spec.0.container_spec.0.secrets.#", "1"),
987987
resource.TestCheckResourceAttr("docker_service.foo", "task_spec.0.container_spec.0.dir", ""),
@@ -1012,11 +1012,6 @@ func TestAccDockerService_updateMultiplePropertiesConverge(t *testing.T) {
10121012
resource.TestCheckResourceAttr("docker_service.foo", "task_spec.0.log_driver.0.options.max-size", "15m"),
10131013
),
10141014
},
1015-
{
1016-
ResourceName: "docker_service.foo",
1017-
ImportState: true,
1018-
ImportStateVerify: true,
1019-
},
10201015
},
10211016
CheckDestroy: checkAndRemoveImages,
10221017
})
@@ -1146,6 +1141,8 @@ func TestAccDockerService_convergeAndStopGracefully(t *testing.T) {
11461141
resource.TestCheckResourceAttr("docker_service.foo", "name", "tftest-service-basic-converge"),
11471142
resource.TestMatchResourceAttr("docker_service.foo", "task_spec.0.container_spec.0.image", regexp.MustCompile(`127.0.0.1:15000/tftest-service:v1.*`)),
11481143
resource.TestCheckResourceAttr("docker_service.foo", "mode.0.replicated.0.replicas", "2"),
1144+
testValueHigherEqualThan("docker_service.foo", "endpoint_spec.0.ports.0.target_port", 8080),
1145+
testValueHigherEqualThan("docker_service.foo", "endpoint_spec.0.ports.0.published_port", 30000),
11491146
),
11501147
},
11511148
},

docker/structures_service.go

+4-7
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,10 @@ func flattenServiceUpdateOrRollbackConfig(in *swarm.UpdateConfig) []interface{}
8585
return out
8686
}
8787

88-
func flattenServiceEndpointSpec(in *swarm.EndpointSpec) []interface{} {
88+
func flattenServiceEndpointSpec(in swarm.Endpoint) []interface{} {
8989
var out = make([]interface{}, 0, 0)
9090
m := make(map[string]interface{})
91-
m["mode"] = string(in.Mode)
91+
m["mode"] = string(in.Spec.Mode)
9292
m["ports"] = flattenServicePorts(in.Ports)
9393

9494
out = append(out, m)
@@ -491,7 +491,7 @@ func flattenTaskLogDriver(in *swarm.Driver) []interface{} {
491491

492492
///// end TaskSpec
493493
///// start EndpointSpec
494-
func flattenServicePorts(in []swarm.PortConfig) *schema.Set {
494+
func flattenServicePorts(in []swarm.PortConfig) []interface{} {
495495
var out = make([]interface{}, len(in), len(in))
496496
for i, v := range in {
497497
m := make(map[string]interface{})
@@ -502,10 +502,7 @@ func flattenServicePorts(in []swarm.PortConfig) *schema.Set {
502502
m["publish_mode"] = string(v.PublishMode)
503503
out[i] = m
504504
}
505-
endpointSpecResource := resourceDockerService().Schema["endpoint_spec"].Elem.(*schema.Resource)
506-
portsResource := endpointSpecResource.Schema["ports"].Elem.(*schema.Resource)
507-
f := schema.HashResource(portsResource)
508-
return schema.NewSet(f, out)
505+
return out
509506
}
510507

511508
///// end EndpointSpec

0 commit comments

Comments
 (0)