Skip to content

Commit

Permalink
Merge pull request #7184 from alkersan/openstack_stop_before_detele
Browse files Browse the repository at this point in the history
provider/openstack stop before destroy
  • Loading branch information
jtopjian authored Jun 23, 2016
2 parents d39760e + c32d152 commit 5ce693d
Show file tree
Hide file tree
Showing 7 changed files with 124 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"github.com/rackspace/gophercloud/openstack/compute/v2/extensions/keypairs"
"github.com/rackspace/gophercloud/openstack/compute/v2/extensions/schedulerhints"
"github.com/rackspace/gophercloud/openstack/compute/v2/extensions/secgroups"
"github.com/rackspace/gophercloud/openstack/compute/v2/extensions/startstop"
"github.com/rackspace/gophercloud/openstack/compute/v2/extensions/tenantnetworks"
"github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach"
"github.com/rackspace/gophercloud/openstack/compute/v2/flavors"
Expand Down Expand Up @@ -318,6 +319,11 @@ func resourceComputeInstanceV2() *schema.Resource {
},
Set: resourceComputeInstancePersonalityHash,
},
"stop_before_destroy": &schema.Schema{
Type: schema.TypeBool,
Optional: true,
Default: false,
},
},
}
}
Expand Down Expand Up @@ -808,6 +814,27 @@ func resourceComputeInstanceV2Delete(d *schema.ResourceData, meta interface{}) e
return fmt.Errorf("Error creating OpenStack compute client: %s", err)
}

if d.Get("stop_before_destroy").(bool) {
err = startstop.Stop(computeClient, d.Id()).ExtractErr()
if err != nil {
log.Printf("[WARN] Error stopping OpenStack instance: %s", err)
} else {
stopStateConf := &resource.StateChangeConf{
Pending: []string{"ACTIVE"},
Target: []string{"SHUTOFF"},
Refresh: ServerV2StateRefreshFunc(computeClient, d.Id()),
Timeout: 3 * time.Minute,
Delay: 10 * time.Second,
MinTimeout: 3 * time.Second,
}
log.Printf("[DEBUG] Waiting for instance (%s) to stop", d.Id())
_, err = stopStateConf.WaitForState()
if err != nil {
log.Printf("[WARN] Error waiting for instance (%s) to stop: %s, proceeding to delete", d.Id(), err)
}
}
}

err = servers.Delete(computeClient, d.Id()).ExtractErr()
if err != nil {
return fmt.Errorf("Error deleting OpenStack server: %s", err)
Expand All @@ -817,7 +844,7 @@ func resourceComputeInstanceV2Delete(d *schema.ResourceData, meta interface{}) e
log.Printf("[DEBUG] Waiting for instance (%s) to delete", d.Id())

stateConf := &resource.StateChangeConf{
Pending: []string{"ACTIVE"},
Pending: []string{"ACTIVE", "SHUTOFF"},
Target: []string{"DELETED"},
Refresh: ServerV2StateRefreshFunc(computeClient, d.Id()),
Timeout: 30 * time.Minute,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -840,3 +840,31 @@ func testAccCheckComputeV2InstanceInstanceIDsDoNotMatch(
return nil
}
}

func TestAccComputeV2Instance_stop_before_destroy(t *testing.T) {
var instance servers.Server
var testAccComputeV2Instance_stop_before_destroy = fmt.Sprintf(`
resource "openstack_compute_instance_v2" "foo" {
name = "terraform-test"
security_groups = ["default"]
network {
uuid = "%s"
}
stop_before_destroy = true
}`,
os.Getenv("OS_NETWORK_ID"))

resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckComputeV2InstanceDestroy,
Steps: []resource.TestStep{
resource.TestStep{
Config: testAccComputeV2Instance_stop_before_destroy,
Check: resource.ComposeTestCheckFunc(
testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.foo", &instance),
),
},
},
})
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions vendor/vendor.json
Original file line number Diff line number Diff line change
Expand Up @@ -1184,6 +1184,12 @@
"revision": "d47105ce4ef90cea9a14b85c8dd172b760085828",
"revisionTime": "2016-06-03T22:34:01Z"
},
{
"checksumSHA1": "jqSmOJoNKVtGwDhuoilAF7iftqA=",
"path": "github.com/rackspace/gophercloud/openstack/compute/v2/extensions/startstop",
"revision": "d47105ce4ef90cea9a14b85c8dd172b760085828",
"revisionTime": "2016-06-03T22:34:01Z"
},
{
"checksumSHA1": "rHEOEAm10HDsfBLU8FqKSUdwqFY=",
"path": "github.com/rackspace/gophercloud/openstack/compute/v2/extensions/tenantnetworks",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,11 @@ The following arguments are supported:
defining one or more files and their contents. The personality structure
is described below.

* `stop_before_destroy` - (Optional) Whether to try stop instance gracefully
before destroying it, thus giving chance for guest OS daemons to stop correctly.
If instance doesn't stop within timeout, it will be destroyed anyway.


The `network` block supports:

* `uuid` - (Required unless `port` or `name` is provided) The network UUID to
Expand Down

0 comments on commit 5ce693d

Please sign in to comment.