providers/digitalocean: updates
This commit is contained in:
parent
0965332b88
commit
7be85deb92
|
@ -88,17 +88,95 @@ func resource_digitalocean_droplet_update(
|
||||||
s *terraform.ResourceState,
|
s *terraform.ResourceState,
|
||||||
d *terraform.ResourceDiff,
|
d *terraform.ResourceDiff,
|
||||||
meta interface{}) (*terraform.ResourceState, error) {
|
meta interface{}) (*terraform.ResourceState, error) {
|
||||||
// p := meta.(*ResourceProvider)
|
p := meta.(*ResourceProvider)
|
||||||
// client := p.client
|
client := p.client
|
||||||
// rs := s.MergeDiff(d)
|
rs := s.MergeDiff(d)
|
||||||
|
|
||||||
// var err error
|
var err error
|
||||||
|
|
||||||
// if _, ok := d.Attributes["size"]; ok {
|
if attr, ok := d.Attributes["size"]; ok {
|
||||||
|
err = client.PowerOff(rs.ID)
|
||||||
|
|
||||||
// }
|
if err != nil && !strings.Contains(err.Error(), "Droplet is already powered off") {
|
||||||
|
return s, err
|
||||||
|
}
|
||||||
|
|
||||||
return nil, nil
|
// Wait for power off
|
||||||
|
_, err = WaitForDropletAttribute(
|
||||||
|
rs.ID, "off", []string{"active"}, "status", client)
|
||||||
|
|
||||||
|
err = client.Resize(rs.ID, attr.New)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return rs, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for the size to change
|
||||||
|
_, err = WaitForDropletAttribute(
|
||||||
|
rs.ID, attr.New, []string{"", attr.Old}, "size", client)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return s, err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = client.PowerOn(rs.ID)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return s, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for power off
|
||||||
|
_, err = WaitForDropletAttribute(
|
||||||
|
rs.ID, "active", []string{"off"}, "status", client)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return s, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if attr, ok := d.Attributes["name"]; ok {
|
||||||
|
err = client.Rename(rs.ID, attr.New)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return s, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for the name to change
|
||||||
|
_, err = WaitForDropletAttribute(
|
||||||
|
rs.ID, attr.New, []string{"", attr.Old}, "name", client)
|
||||||
|
}
|
||||||
|
|
||||||
|
if attr, ok := d.Attributes["private_networking"]; ok {
|
||||||
|
err = client.Rename(rs.ID, attr.New)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return s, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for the private_networking to turn on/off
|
||||||
|
_, err = WaitForDropletAttribute(
|
||||||
|
rs.ID, attr.New, []string{"", attr.Old}, "private_networking", client)
|
||||||
|
}
|
||||||
|
|
||||||
|
if attr, ok := d.Attributes["ipv6"]; ok {
|
||||||
|
err = client.Rename(rs.ID, attr.New)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return s, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for ipv6 to turn on/off
|
||||||
|
_, err = WaitForDropletAttribute(
|
||||||
|
rs.ID, attr.New, []string{"", attr.Old}, "ipv6", client)
|
||||||
|
}
|
||||||
|
|
||||||
|
droplet, err := resource_digitalocean_droplet_retrieve(rs.ID, client)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return s, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return resource_digitalocean_droplet_update_state(rs, droplet)
|
||||||
}
|
}
|
||||||
|
|
||||||
func resource_digitalocean_droplet_destroy(
|
func resource_digitalocean_droplet_destroy(
|
||||||
|
@ -146,7 +224,7 @@ func resource_digitalocean_droplet_diff(
|
||||||
"name": diff.AttrTypeUpdate,
|
"name": diff.AttrTypeUpdate,
|
||||||
"private_networking": diff.AttrTypeUpdate,
|
"private_networking": diff.AttrTypeUpdate,
|
||||||
"region": diff.AttrTypeCreate,
|
"region": diff.AttrTypeCreate,
|
||||||
"size": diff.AttrTypeCreate,
|
"size": diff.AttrTypeUpdate,
|
||||||
"ssh_keys": diff.AttrTypeCreate,
|
"ssh_keys": diff.AttrTypeCreate,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -177,8 +255,12 @@ func resource_digitalocean_droplet_update_state(
|
||||||
s.Attributes["image"] = droplet.ImageSlug()
|
s.Attributes["image"] = droplet.ImageSlug()
|
||||||
}
|
}
|
||||||
|
|
||||||
s.Attributes["ipv4_address"] = droplet.IPV4Address()
|
if droplet.IPV6Address() != "" {
|
||||||
|
s.Attributes["ipv6"] = "true"
|
||||||
s.Attributes["ipv6_address"] = droplet.IPV6Address()
|
s.Attributes["ipv6_address"] = droplet.IPV6Address()
|
||||||
|
}
|
||||||
|
|
||||||
|
s.Attributes["ipv4_address"] = droplet.IPV4Address()
|
||||||
s.Attributes["locked"] = droplet.IsLocked()
|
s.Attributes["locked"] = droplet.IsLocked()
|
||||||
s.Attributes["private_networking"] = droplet.NetworkingType()
|
s.Attributes["private_networking"] = droplet.NetworkingType()
|
||||||
s.Attributes["size"] = droplet.SizeSlug()
|
s.Attributes["size"] = droplet.SizeSlug()
|
||||||
|
@ -220,7 +302,7 @@ func WaitForDropletAttribute(id string, target string, pending []string, attribu
|
||||||
// Wait for the droplet so we can get the networking attributes
|
// Wait for the droplet so we can get the networking attributes
|
||||||
// that show up after a while
|
// that show up after a while
|
||||||
log.Printf(
|
log.Printf(
|
||||||
"[DEBUG] Waiting for Droplet (%s) to have %s of %s",
|
"[INFO] Waiting for Droplet (%s) to have %s of %s",
|
||||||
id, attribute, target)
|
id, attribute, target)
|
||||||
|
|
||||||
stateConf := &resource.StateChangeConf{
|
stateConf := &resource.StateChangeConf{
|
||||||
|
|
|
@ -10,7 +10,7 @@ import (
|
||||||
"github.com/pearkes/digitalocean"
|
"github.com/pearkes/digitalocean"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestAccDigitalOceanDroplet(t *testing.T) {
|
func TestAccDigitalOceanDroplet_Basic(t *testing.T) {
|
||||||
var droplet digitalocean.Droplet
|
var droplet digitalocean.Droplet
|
||||||
|
|
||||||
resource.Test(t, resource.TestCase{
|
resource.Test(t, resource.TestCase{
|
||||||
|
@ -37,6 +37,37 @@ func TestAccDigitalOceanDroplet(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestAccDigitalOceanDroplet_Update(t *testing.T) {
|
||||||
|
var droplet digitalocean.Droplet
|
||||||
|
|
||||||
|
resource.Test(t, resource.TestCase{
|
||||||
|
PreCheck: func() { testAccPreCheck(t) },
|
||||||
|
Providers: testAccProviders,
|
||||||
|
CheckDestroy: testAccCheckDigitalOceanDropletDestroy,
|
||||||
|
Steps: []resource.TestStep{
|
||||||
|
resource.TestStep{
|
||||||
|
Config: testAccCheckDigitalOceanDropletConfig_basic,
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet),
|
||||||
|
testAccCheckDigitalOceanDropletAttributes(&droplet),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
|
||||||
|
resource.TestStep{
|
||||||
|
Config: testAccCheckDigitalOceanDropletConfig_RenameAndResize,
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet),
|
||||||
|
testAccCheckDigitalOceanDropletRenamedAndResized(&droplet),
|
||||||
|
resource.TestCheckResourceAttr(
|
||||||
|
"digitalocean_droplet.foobar", "name", "foo"),
|
||||||
|
resource.TestCheckResourceAttr(
|
||||||
|
"digitalocean_droplet.foobar", "size", "1gb"),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func testAccCheckDigitalOceanDropletDestroy(s *terraform.State) error {
|
func testAccCheckDigitalOceanDropletDestroy(s *terraform.State) error {
|
||||||
client := testAccProvider.client
|
client := testAccProvider.client
|
||||||
|
|
||||||
|
@ -63,7 +94,6 @@ func testAccCheckDigitalOceanDropletDestroy(s *terraform.State) error {
|
||||||
func testAccCheckDigitalOceanDropletAttributes(droplet *digitalocean.Droplet) resource.TestCheckFunc {
|
func testAccCheckDigitalOceanDropletAttributes(droplet *digitalocean.Droplet) resource.TestCheckFunc {
|
||||||
return func(s *terraform.State) error {
|
return func(s *terraform.State) error {
|
||||||
|
|
||||||
fmt.Println("droplet: %v", droplet)
|
|
||||||
if droplet.ImageSlug() != "centos-5-8-x32" {
|
if droplet.ImageSlug() != "centos-5-8-x32" {
|
||||||
return fmt.Errorf("Bad image_slug: %s", droplet.ImageSlug())
|
return fmt.Errorf("Bad image_slug: %s", droplet.ImageSlug())
|
||||||
}
|
}
|
||||||
|
@ -83,6 +113,20 @@ func testAccCheckDigitalOceanDropletAttributes(droplet *digitalocean.Droplet) re
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testAccCheckDigitalOceanDropletRenamedAndResized(droplet *digitalocean.Droplet) resource.TestCheckFunc {
|
||||||
|
return func(s *terraform.State) error {
|
||||||
|
|
||||||
|
if droplet.SizeSlug() != "1gb" {
|
||||||
|
return fmt.Errorf("Bad size_slug: %s", droplet.SizeSlug())
|
||||||
|
}
|
||||||
|
|
||||||
|
if droplet.Name != "baz" {
|
||||||
|
return fmt.Errorf("Bad name: %s", droplet.Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
func testAccCheckDigitalOceanDropletExists(n string, droplet *digitalocean.Droplet) resource.TestCheckFunc {
|
func testAccCheckDigitalOceanDropletExists(n string, droplet *digitalocean.Droplet) resource.TestCheckFunc {
|
||||||
return func(s *terraform.State) error {
|
return func(s *terraform.State) error {
|
||||||
rs, ok := s.Resources[n]
|
rs, ok := s.Resources[n]
|
||||||
|
@ -134,3 +178,12 @@ resource "digitalocean_droplet" "foobar" {
|
||||||
region = "nyc2"
|
region = "nyc2"
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
|
const testAccCheckDigitalOceanDropletConfig_RenameAndResize = `
|
||||||
|
resource "digitalocean_droplet" "foobar" {
|
||||||
|
name = "baz"
|
||||||
|
size = "1gb"
|
||||||
|
image = "centos-5-8-x32"
|
||||||
|
region = "nyc2"
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
Loading…
Reference in New Issue