@@ -98,45 +98,76 @@ func resourceDockerServiceCreate(d *schema.ResourceData, meta interface{}) error
98
98
}
99
99
100
100
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 )
102
102
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 ,
106
110
}
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 ()
112
114
if err != nil {
113
- return fmt . Errorf ( "Error inspecting service %s: %s" , apiService . ID , err )
115
+ return err
114
116
}
115
117
116
- jsonObj , _ := json . MarshalIndent ( service , "" , " \t " )
117
- log . Printf ( "[DEBUG] Docker service inspect: %s" , jsonObj )
118
+ return nil
119
+ }
118
120
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 ()
122
126
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
+ }
138
140
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
+ }
140
171
}
141
172
142
173
func resourceDockerServiceUpdate (d * schema.ResourceData , meta interface {}) error {
0 commit comments