@@ -3,7 +3,9 @@ package gitlab
3
3
import (
4
4
"fmt"
5
5
"log"
6
+ "time"
6
7
8
+ "github.com/hashicorp/terraform/helper/resource"
7
9
"github.com/hashicorp/terraform/helper/schema"
8
10
"github.com/hashicorp/terraform/helper/validation"
9
11
gitlab "github.com/xanzy/go-gitlab"
@@ -196,5 +198,36 @@ func resourceGitlabProjectDelete(d *schema.ResourceData, meta interface{}) error
196
198
log .Printf ("[DEBUG] Delete gitlab project %s" , d .Id ())
197
199
198
200
_ , err := client .Projects .DeleteProject (d .Id ())
199
- return err
201
+ if err != nil {
202
+ return err
203
+ }
204
+
205
+ // Wait for the project to be deleted.
206
+ // Deleting a project in gitlab is async.
207
+ stateConf := & resource.StateChangeConf {
208
+ Pending : []string {"Deleting" },
209
+ Target : []string {"Deleted" },
210
+ Refresh : func () (interface {}, string , error ) {
211
+ out , response , err := client .Projects .GetProject (d .Id ())
212
+ if err != nil {
213
+ if response .StatusCode == 404 {
214
+ return out , "Deleted" , nil
215
+ } else {
216
+ log .Printf ("[ERROR] Received error: %#v" , err )
217
+ return out , "Error" , err
218
+ }
219
+ }
220
+ return out , "Deleting" , nil
221
+ },
222
+
223
+ Timeout : 10 * time .Minute ,
224
+ MinTimeout : 3 * time .Second ,
225
+ Delay : 5 * time .Second ,
226
+ }
227
+
228
+ _ , err = stateConf .WaitForState ()
229
+ if err != nil {
230
+ return fmt .Errorf ("error waiting for project (%s) to become deleted: %s" , d .Id (), err )
231
+ }
232
+ return nil
200
233
}
0 commit comments