Skip to content

Commit d8b0c13

Browse files
committed
Merge branch 'suzuki-shunsuke-debug-issue-237'
2 parents 1404102 + c39d5f1 commit d8b0c13

File tree

1 file changed

+62
-31
lines changed

1 file changed

+62
-31
lines changed

docker/resource_docker_service_funcs.go

+62-31
Original file line numberDiff line numberDiff line change
@@ -98,45 +98,76 @@ func resourceDockerServiceCreate(d *schema.ResourceData, meta interface{}) error
9898
}
9999

100100
func resourceDockerServiceRead(d *schema.ResourceData, meta interface{}) error {
101-
client := meta.(*ProviderConfig).DockerClient
101+
log.Printf("[INFO] Waiting for service: '%s' to expose all fields: max '%v seconds'", d.Id(), 30)
102102

103-
apiService, err := fetchDockerService(d.Id(), d.Get("name").(string), client)
104-
if err != nil {
105-
return err
103+
stateConf := &resource.StateChangeConf{
104+
Pending: []string{"pending"},
105+
Target: []string{"all_fields", "removed"},
106+
Refresh: resourceDockerServiceReadRefreshFunc(d, meta),
107+
Timeout: 30 * time.Second,
108+
MinTimeout: 5 * time.Second,
109+
Delay: 2 * time.Second,
106110
}
107-
if apiService == nil {
108-
d.SetId("")
109-
return nil
110-
}
111-
service, _, err := client.ServiceInspectWithRaw(context.Background(), apiService.ID, types.ServiceInspectOptions{})
111+
112+
// Wait, catching any errors
113+
_, err := stateConf.WaitForState()
112114
if err != nil {
113-
return fmt.Errorf("Error inspecting service %s: %s", apiService.ID, err)
115+
return err
114116
}
115117

116-
jsonObj, _ := json.MarshalIndent(service, "", "\t")
117-
log.Printf("[DEBUG] Docker service inspect: %s", jsonObj)
118+
return nil
119+
}
118120

119-
d.SetId(service.ID)
120-
d.Set("name", service.Spec.Name)
121-
d.Set("labels", mapToLabelSet(service.Spec.Labels))
121+
func resourceDockerServiceReadRefreshFunc(
122+
d *schema.ResourceData, meta interface{}) resource.StateRefreshFunc {
123+
return func() (interface{}, string, error) {
124+
client := meta.(*ProviderConfig).DockerClient
125+
serviceID := d.Id()
122126

123-
if err = d.Set("task_spec", flattenTaskSpec(service.Spec.TaskTemplate)); err != nil {
124-
log.Printf("[WARN] failed to set task spec from API: %s", err)
125-
}
126-
if err = d.Set("mode", flattenServiceMode(service.Spec.Mode)); err != nil {
127-
log.Printf("[WARN] failed to set mode from API: %s", err)
128-
}
129-
if err := d.Set("update_config", flattenServiceUpdateOrRollbackConfig(service.Spec.UpdateConfig)); err != nil {
130-
log.Printf("[WARN] failed to set update_config from API: %s", err)
131-
}
132-
if err = d.Set("rollback_config", flattenServiceUpdateOrRollbackConfig(service.Spec.RollbackConfig)); err != nil {
133-
log.Printf("[WARN] failed to set rollback_config from API: %s", err)
134-
}
135-
if err = d.Set("endpoint_spec", flattenServiceEndpointSpec(service.Endpoint)); err != nil {
136-
log.Printf("[WARN] failed to set endpoint spec from API: %s", err)
137-
}
127+
apiService, err := fetchDockerService(serviceID, d.Get("name").(string), client)
128+
if err != nil {
129+
return nil, "", err
130+
}
131+
if apiService == nil {
132+
log.Printf("[WARN] Service (%s) not found, removing from state", serviceID)
133+
d.SetId("")
134+
return serviceID, "removed", nil
135+
}
136+
service, _, err := client.ServiceInspectWithRaw(context.Background(), apiService.ID, types.ServiceInspectOptions{})
137+
if err != nil {
138+
return serviceID, "", fmt.Errorf("Error inspecting service %s: %s", apiService.ID, err)
139+
}
138140

139-
return nil
141+
jsonObj, _ := json.MarshalIndent(service, "", "\t")
142+
log.Printf("[DEBUG] Docker service inspect: %s", jsonObj)
143+
144+
if service.Endpoint.Spec.Mode != service.Spec.EndpointSpec.Mode {
145+
log.Printf("[DEBUG] endpoint.Spec of Service %s does not match Spec.EndpointSpec yet", serviceID)
146+
return serviceID, "pending", nil
147+
}
148+
149+
d.SetId(service.ID)
150+
d.Set("name", service.Spec.Name)
151+
d.Set("labels", mapToLabelSet(service.Spec.Labels))
152+
153+
if err = d.Set("task_spec", flattenTaskSpec(service.Spec.TaskTemplate)); err != nil {
154+
log.Printf("[WARN] failed to set task spec from API: %s", err)
155+
}
156+
if err = d.Set("mode", flattenServiceMode(service.Spec.Mode)); err != nil {
157+
log.Printf("[WARN] failed to set mode from API: %s", err)
158+
}
159+
if err := d.Set("update_config", flattenServiceUpdateOrRollbackConfig(service.Spec.UpdateConfig)); err != nil {
160+
log.Printf("[WARN] failed to set update_config from API: %s", err)
161+
}
162+
if err = d.Set("rollback_config", flattenServiceUpdateOrRollbackConfig(service.Spec.RollbackConfig)); err != nil {
163+
log.Printf("[WARN] failed to set rollback_config from API: %s", err)
164+
}
165+
if err = d.Set("endpoint_spec", flattenServiceEndpointSpec(service.Endpoint)); err != nil {
166+
log.Printf("[WARN] failed to set endpoint spec from API: %s", err)
167+
}
168+
169+
return serviceID, "all_fields", nil
170+
}
140171
}
141172

142173
func resourceDockerServiceUpdate(d *schema.ResourceData, meta interface{}) error {

0 commit comments

Comments
 (0)