diff --git a/builder/triton/driver_triton.go b/builder/triton/driver_triton.go index af0fe8333..cfb3b0e72 100644 --- a/builder/triton/driver_triton.go +++ b/builder/triton/driver_triton.go @@ -3,6 +3,7 @@ package triton import ( "context" "errors" + "net/http" "time" "github.com/hashicorp/packer/packer" @@ -129,15 +130,16 @@ func (d *driverTriton) WaitForMachineState(machineId string, state string, timeo func (d *driverTriton) WaitForMachineDeletion(machineId string, timeout time.Duration) error { return waitFor( func() (bool, error) { - machine, err := d.client.Machines().GetMachine(context.Background(), &triton.GetMachineInput{ + _, err := d.client.Machines().GetMachine(context.Background(), &triton.GetMachineInput{ ID: machineId, }) - if err != nil && triton.IsResourceNotFound(err) { - return true, nil - } - - if machine != nil { - return machine.State == "deleted", nil + if err != nil { + // Return true only when we receive a 410 (Gone) response. A 404 + // indicates that the machine is being deleted whereas a 410 indicates + // that this process has completed. + if triErr, ok := err.(*triton.TritonError); ok && triErr.StatusCode == http.StatusGone { + return true, nil + } } return false, err diff --git a/builder/triton/step_create_source_machine.go b/builder/triton/step_create_source_machine.go index b5a8aec15..46b7d789c 100644 --- a/builder/triton/step_create_source_machine.go +++ b/builder/triton/step_create_source_machine.go @@ -64,5 +64,12 @@ func (s *StepCreateSourceMachine) Cleanup(state multistep.StateBag) { state.Put("error", fmt.Errorf("Problem deleting source machine: %s", err)) return } + + ui.Say(fmt.Sprintf("Waiting for source machine to be destroyed (%s)...", machineId)) + err = driver.WaitForMachineDeletion(machineId, 10*time.Minute) + if err != nil { + state.Put("error", fmt.Errorf("Problem waiting for source machine to be deleted: %s", err)) + return + } } } diff --git a/vendor/github.com/joyent/triton-go/machines.go b/vendor/github.com/joyent/triton-go/machines.go index 64f0d7baf..aba5a984a 100644 --- a/vendor/github.com/joyent/triton-go/machines.go +++ b/vendor/github.com/joyent/triton-go/machines.go @@ -102,7 +102,8 @@ func (client *MachinesClient) GetMachine(ctx context.Context, input *GetMachineI } if response.StatusCode == http.StatusNotFound || response.StatusCode == http.StatusGone { return nil, &TritonError{ - Code: "ResourceNotFound", + StatusCode: response.StatusCode, + Code: "ResourceNotFound", } } if err != nil { @@ -134,7 +135,8 @@ func (client *MachinesClient) ListMachines(ctx context.Context, _ *ListMachinesI } if response.StatusCode == http.StatusNotFound { return nil, &TritonError{ - Code: "ResourceNotFound", + StatusCode: response.StatusCode, + Code: "ResourceNotFound", } } if err != nil { @@ -249,7 +251,7 @@ func (client *MachinesClient) DeleteMachine(ctx context.Context, input *DeleteMa if response.Body != nil { defer response.Body.Close() } - if response.StatusCode == http.StatusNotFound { + if response.StatusCode == http.StatusNotFound || response.StatusCode == http.StatusGone { return nil } if err != nil { diff --git a/vendor/vendor.json b/vendor/vendor.json index 21745eae4..c0c5bb18c 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -520,10 +520,10 @@ "revision": "c01cf91b011868172fdcd9f41838e80c9d716264" }, { - "checksumSHA1": "3yw6Wr66v4WrQyY2hYveEmiFadM=", + "checksumSHA1": "cdoXZmgAhucjxu9V0xuAwwOoN0U=", "path": "github.com/joyent/triton-go", - "revision": "16cef4c2d78ba1d3bf89af75e93ae2dec6e56634", - "revisionTime": "2017-05-04T20:45:05Z" + "revision": "97ccd9f6c0c0652cf87997bcb01955e0329cd37e", + "revisionTime": "2017-05-09T20:29:43Z" }, { "checksumSHA1": "QzUqkCSn/ZHyIK346xb9V6EBw9U=",