Skip to content

Commit c6cb1dd

Browse files
committed
Check Docker client version before setting ContainerSpec.Init flag
1 parent ba24e4e commit c6cb1dd

File tree

2 files changed

+22
-16
lines changed

2 files changed

+22
-16
lines changed

internal/provider/resource_docker_service_funcs.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func resourceDockerServiceCreate(ctx context.Context, d *schema.ResourceData, me
3333
var err error
3434
client := meta.(*ProviderConfig).DockerClient
3535

36-
serviceSpec, err := createServiceSpec(d)
36+
serviceSpec, err := createServiceSpec(d, meta)
3737
if err != nil {
3838
return diag.FromErr(err)
3939
}
@@ -132,7 +132,7 @@ func resourceDockerServiceReadRefreshFunc(ctx context.Context,
132132
d.Set("name", service.Spec.Name)
133133
d.Set("labels", mapToLabelSet(service.Spec.Labels))
134134

135-
if err = d.Set("task_spec", flattenTaskSpec(service.Spec.TaskTemplate, d)); err != nil {
135+
if err = d.Set("task_spec", flattenTaskSpec(service.Spec.TaskTemplate, d, meta)); err != nil {
136136
log.Printf("[WARN] failed to set task spec from API: %s", err)
137137
}
138138
if err = d.Set("mode", flattenServiceMode(service.Spec.Mode)); err != nil {
@@ -169,7 +169,7 @@ func resourceDockerServiceUpdate(ctx context.Context, d *schema.ResourceData, me
169169
return diag.FromErr(err)
170170
}
171171

172-
serviceSpec, err := createServiceSpec(d)
172+
serviceSpec, err := createServiceSpec(d, meta)
173173
if err != nil {
174174
return diag.FromErr(err)
175175
}

internal/provider/resource_docker_service_structures.go

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ import (
1818
// flatten API objects to the terraform schema
1919
// ////////////
2020
// see https://learn.hashicorp.com/tutorials/terraform/provider-create?in=terraform/providers#add-flattening-functions
21-
func flattenTaskSpec(in swarm.TaskSpec, d *schema.ResourceData) []interface{} {
21+
func flattenTaskSpec(in swarm.TaskSpec, d *schema.ResourceData, meta interface{}) []interface{} {
2222
m := make(map[string]interface{})
2323
if in.ContainerSpec != nil {
24-
m["container_spec"] = flattenContainerSpec(in.ContainerSpec)
24+
m["container_spec"] = flattenContainerSpec(in.ContainerSpec, meta)
2525
}
2626
if in.Resources != nil {
2727
m["resources"] = flattenTaskResources(in.Resources)
@@ -111,7 +111,8 @@ func flattenServiceEndpointSpec(in *swarm.EndpointSpec) []interface{} {
111111
}
112112

113113
// /// start TaskSpec
114-
func flattenContainerSpec(in *swarm.ContainerSpec) []interface{} {
114+
func flattenContainerSpec(in *swarm.ContainerSpec, meta interface{}) []interface{} {
115+
client := meta.(*ProviderConfig).DockerClient
115116
out := make([]interface{}, 0)
116117
m := make(map[string]interface{})
117118
if len(in.Image) > 0 {
@@ -183,8 +184,10 @@ func flattenContainerSpec(in *swarm.ContainerSpec) []interface{} {
183184
if len(in.CapabilityDrop) > 0 {
184185
m["cap_drop"] = in.CapabilityDrop
185186
}
186-
if in.Init != nil {
187-
m["init"] = *in.Init
187+
if client.ClientVersion() >= "1.37" {
188+
if in.Init != nil {
189+
m["init"] = *in.Init
190+
}
188191
}
189192
out = append(out, m)
190193
return out
@@ -577,7 +580,7 @@ func flattenServicePorts(in []swarm.PortConfig) []interface{} {
577580
// create API object from the terraform resource schema
578581
// ////////////
579582
// createServiceSpec creates the service spec: https://docs.docker.com/engine/api/v1.32/#operation/ServiceCreate
580-
func createServiceSpec(d *schema.ResourceData) (swarm.ServiceSpec, error) {
583+
func createServiceSpec(d *schema.ResourceData, meta interface{}) (swarm.ServiceSpec, error) {
581584
serviceSpec := swarm.ServiceSpec{
582585
Annotations: swarm.Annotations{
583586
Name: d.Get("name").(string),
@@ -590,7 +593,7 @@ func createServiceSpec(d *schema.ResourceData) (swarm.ServiceSpec, error) {
590593
}
591594
serviceSpec.Labels = labels
592595

593-
taskTemplate, err := createServiceTaskSpec(d)
596+
taskTemplate, err := createServiceTaskSpec(d, meta)
594597
if err != nil {
595598
return serviceSpec, err
596599
}
@@ -633,15 +636,15 @@ func createServiceLabels(d *schema.ResourceData) (map[string]string, error) {
633636

634637
// == start taskSpec
635638
// createServiceTaskSpec creates the task template for the service
636-
func createServiceTaskSpec(d *schema.ResourceData) (swarm.TaskSpec, error) {
639+
func createServiceTaskSpec(d *schema.ResourceData, meta interface{}) (swarm.TaskSpec, error) {
637640
taskSpec := swarm.TaskSpec{}
638641
if v, ok := d.GetOk("task_spec"); ok {
639642
if len(v.([]interface{})) > 0 {
640643
for _, rawTaskSpec := range v.([]interface{}) {
641644
rawTaskSpec := rawTaskSpec.(map[string]interface{})
642645

643646
if rawContainerSpec, ok := rawTaskSpec["container_spec"]; ok {
644-
containerSpec, err := createContainerSpec(rawContainerSpec)
647+
containerSpec, err := createContainerSpec(rawContainerSpec, meta)
645648
if err != nil {
646649
return taskSpec, err
647650
}
@@ -696,7 +699,8 @@ func createServiceTaskSpec(d *schema.ResourceData) (swarm.TaskSpec, error) {
696699
}
697700

698701
// createContainerSpec creates the container spec
699-
func createContainerSpec(v interface{}) (*swarm.ContainerSpec, error) {
702+
func createContainerSpec(v interface{}, meta interface{}) (*swarm.ContainerSpec, error) {
703+
client := meta.(*ProviderConfig).DockerClient
700704
containerSpec := swarm.ContainerSpec{}
701705
if len(v.([]interface{})) > 0 {
702706
for _, rawContainerSpec := range v.([]interface{}) {
@@ -968,9 +972,11 @@ func createContainerSpec(v interface{}) (*swarm.ContainerSpec, error) {
968972
containerSpec.CapabilityDrop = append(containerSpec.CapabilityDrop, cap.(string))
969973
}
970974
}
971-
if value, ok := rawContainerSpec["init"]; ok {
972-
v := value.(bool)
973-
containerSpec.Init = &v
975+
if client.ClientVersion() >= "1.37" {
976+
if value, ok := rawContainerSpec["init"]; ok {
977+
v := value.(bool)
978+
containerSpec.Init = &v
979+
}
974980
}
975981

976982
}

0 commit comments

Comments
 (0)