github.com/ggiamarchi/terraform@v0.3.7-0.20150607194748-ed2a66a46a71/builtin/providers/cloudstack/resource_cloudstack_instance_test.go (about)

     1  package cloudstack
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/hashicorp/terraform/helper/resource"
     8  	"github.com/hashicorp/terraform/terraform"
     9  	"github.com/xanzy/go-cloudstack/cloudstack"
    10  )
    11  
    12  func TestAccCloudStackInstance_basic(t *testing.T) {
    13  	var instance cloudstack.VirtualMachine
    14  
    15  	resource.Test(t, resource.TestCase{
    16  		PreCheck:     func() { testAccPreCheck(t) },
    17  		Providers:    testAccProviders,
    18  		CheckDestroy: testAccCheckCloudStackInstanceDestroy,
    19  		Steps: []resource.TestStep{
    20  			resource.TestStep{
    21  				Config: testAccCloudStackInstance_basic,
    22  				Check: resource.ComposeTestCheckFunc(
    23  					testAccCheckCloudStackInstanceExists(
    24  						"cloudstack_instance.foobar", &instance),
    25  					testAccCheckCloudStackInstanceAttributes(&instance),
    26  					resource.TestCheckResourceAttr(
    27  						"cloudstack_instance.foobar",
    28  						"user_data",
    29  						"0cf3dcdc356ec8369494cb3991985ecd5296cdd5"),
    30  					resource.TestCheckResourceAttr(
    31  						"cloudstack_instance.foobar",
    32  						"keypair",
    33  						CLOUDSTACK_SSH_KEYPAIR),
    34  				),
    35  			},
    36  		},
    37  	})
    38  }
    39  
    40  func TestAccCloudStackInstance_update(t *testing.T) {
    41  	var instance cloudstack.VirtualMachine
    42  
    43  	resource.Test(t, resource.TestCase{
    44  		PreCheck:     func() { testAccPreCheck(t) },
    45  		Providers:    testAccProviders,
    46  		CheckDestroy: testAccCheckCloudStackInstanceDestroy,
    47  		Steps: []resource.TestStep{
    48  			resource.TestStep{
    49  				Config: testAccCloudStackInstance_basic,
    50  				Check: resource.ComposeTestCheckFunc(
    51  					testAccCheckCloudStackInstanceExists(
    52  						"cloudstack_instance.foobar", &instance),
    53  					testAccCheckCloudStackInstanceAttributes(&instance),
    54  					resource.TestCheckResourceAttr(
    55  						"cloudstack_instance.foobar",
    56  						"user_data",
    57  						"0cf3dcdc356ec8369494cb3991985ecd5296cdd5"),
    58  					resource.TestCheckResourceAttr(
    59  						"cloudstack_instance.foobar",
    60  						"keypair",
    61  						CLOUDSTACK_SSH_KEYPAIR),
    62  				),
    63  			},
    64  
    65  			resource.TestStep{
    66  				Config: testAccCloudStackInstance_renameAndResize,
    67  				Check: resource.ComposeTestCheckFunc(
    68  					testAccCheckCloudStackInstanceExists(
    69  						"cloudstack_instance.foobar", &instance),
    70  					testAccCheckCloudStackInstanceRenamedAndResized(&instance),
    71  					resource.TestCheckResourceAttr(
    72  						"cloudstack_instance.foobar", "display_name", "terraform-updated"),
    73  					resource.TestCheckResourceAttr(
    74  						"cloudstack_instance.foobar", "service_offering", CLOUDSTACK_SERVICE_OFFERING_2),
    75  				),
    76  			},
    77  		},
    78  	})
    79  }
    80  
    81  func TestAccCloudStackInstance_fixedIP(t *testing.T) {
    82  	var instance cloudstack.VirtualMachine
    83  
    84  	resource.Test(t, resource.TestCase{
    85  		PreCheck:     func() { testAccPreCheck(t) },
    86  		Providers:    testAccProviders,
    87  		CheckDestroy: testAccCheckCloudStackInstanceDestroy,
    88  		Steps: []resource.TestStep{
    89  			resource.TestStep{
    90  				Config: testAccCloudStackInstance_fixedIP,
    91  				Check: resource.ComposeTestCheckFunc(
    92  					testAccCheckCloudStackInstanceExists(
    93  						"cloudstack_instance.foobar", &instance),
    94  					resource.TestCheckResourceAttr(
    95  						"cloudstack_instance.foobar", "ipaddress", CLOUDSTACK_NETWORK_1_IPADDRESS),
    96  				),
    97  			},
    98  		},
    99  	})
   100  }
   101  
   102  func testAccCheckCloudStackInstanceExists(
   103  	n string, instance *cloudstack.VirtualMachine) resource.TestCheckFunc {
   104  	return func(s *terraform.State) error {
   105  		rs, ok := s.RootModule().Resources[n]
   106  		if !ok {
   107  			return fmt.Errorf("Not found: %s", n)
   108  		}
   109  
   110  		if rs.Primary.ID == "" {
   111  			return fmt.Errorf("No instance ID is set")
   112  		}
   113  
   114  		cs := testAccProvider.Meta().(*cloudstack.CloudStackClient)
   115  		vm, _, err := cs.VirtualMachine.GetVirtualMachineByID(rs.Primary.ID)
   116  
   117  		if err != nil {
   118  			return err
   119  		}
   120  
   121  		if vm.Id != rs.Primary.ID {
   122  			return fmt.Errorf("Instance not found")
   123  		}
   124  
   125  		*instance = *vm
   126  
   127  		return nil
   128  	}
   129  }
   130  
   131  func testAccCheckCloudStackInstanceAttributes(
   132  	instance *cloudstack.VirtualMachine) resource.TestCheckFunc {
   133  	return func(s *terraform.State) error {
   134  
   135  		if instance.Name != "terraform-test" {
   136  			return fmt.Errorf("Bad name: %s", instance.Name)
   137  		}
   138  
   139  		if instance.Displayname != "terraform" {
   140  			return fmt.Errorf("Bad display name: %s", instance.Displayname)
   141  		}
   142  
   143  		if instance.Serviceofferingname != CLOUDSTACK_SERVICE_OFFERING_1 {
   144  			return fmt.Errorf("Bad service offering: %s", instance.Serviceofferingname)
   145  		}
   146  
   147  		if instance.Templatename != CLOUDSTACK_TEMPLATE {
   148  			return fmt.Errorf("Bad template: %s", instance.Templatename)
   149  		}
   150  
   151  		if instance.Nic[0].Networkname != CLOUDSTACK_NETWORK_1 {
   152  			return fmt.Errorf("Bad network: %s", instance.Nic[0].Networkname)
   153  		}
   154  
   155  		return nil
   156  	}
   157  }
   158  
   159  func testAccCheckCloudStackInstanceRenamedAndResized(
   160  	instance *cloudstack.VirtualMachine) resource.TestCheckFunc {
   161  	return func(s *terraform.State) error {
   162  
   163  		if instance.Displayname != "terraform-updated" {
   164  			return fmt.Errorf("Bad display name: %s", instance.Displayname)
   165  		}
   166  
   167  		if instance.Serviceofferingname != CLOUDSTACK_SERVICE_OFFERING_2 {
   168  			return fmt.Errorf("Bad service offering: %s", instance.Serviceofferingname)
   169  		}
   170  
   171  		return nil
   172  	}
   173  }
   174  
   175  func testAccCheckCloudStackInstanceDestroy(s *terraform.State) error {
   176  	cs := testAccProvider.Meta().(*cloudstack.CloudStackClient)
   177  
   178  	for _, rs := range s.RootModule().Resources {
   179  		if rs.Type != "cloudstack_instance" {
   180  			continue
   181  		}
   182  
   183  		if rs.Primary.ID == "" {
   184  			return fmt.Errorf("No instance ID is set")
   185  		}
   186  
   187  		p := cs.VirtualMachine.NewDestroyVirtualMachineParams(rs.Primary.ID)
   188  		_, err := cs.VirtualMachine.DestroyVirtualMachine(p)
   189  
   190  		if err != nil {
   191  			return fmt.Errorf(
   192  				"Error deleting instance (%s): %s",
   193  				rs.Primary.ID, err)
   194  		}
   195  	}
   196  
   197  	return nil
   198  }
   199  
   200  var testAccCloudStackInstance_basic = fmt.Sprintf(`
   201  resource "cloudstack_instance" "foobar" {
   202    name = "terraform-test"
   203    display_name = "terraform"
   204    service_offering= "%s"
   205    network = "%s"
   206    template = "%s"
   207    zone = "%s"
   208    keypair = "%s"
   209    user_data = "foobar\nfoo\nbar"
   210    expunge = true
   211  }`,
   212  	CLOUDSTACK_SERVICE_OFFERING_1,
   213  	CLOUDSTACK_NETWORK_1,
   214  	CLOUDSTACK_TEMPLATE,
   215  	CLOUDSTACK_ZONE,
   216  	CLOUDSTACK_SSH_KEYPAIR)
   217  
   218  var testAccCloudStackInstance_renameAndResize = fmt.Sprintf(`
   219  resource "cloudstack_instance" "foobar" {
   220    name = "terraform-test"
   221    display_name = "terraform-updated"
   222    service_offering= "%s"
   223    network = "%s"
   224    template = "%s"
   225    zone = "%s"
   226    keypair = "%s"
   227    user_data = "foobar\nfoo\nbar"
   228    expunge = true
   229  }`,
   230  	CLOUDSTACK_SERVICE_OFFERING_2,
   231  	CLOUDSTACK_NETWORK_1,
   232  	CLOUDSTACK_TEMPLATE,
   233  	CLOUDSTACK_ZONE,
   234  	CLOUDSTACK_SSH_KEYPAIR)
   235  
   236  var testAccCloudStackInstance_fixedIP = fmt.Sprintf(`
   237  resource "cloudstack_instance" "foobar" {
   238    name = "terraform-test"
   239    display_name = "terraform"
   240    service_offering= "%s"
   241    network = "%s"
   242    ipaddress = "%s"
   243    template = "%s"
   244    zone = "%s"
   245    expunge = true
   246  }`,
   247  	CLOUDSTACK_SERVICE_OFFERING_1,
   248  	CLOUDSTACK_NETWORK_1,
   249  	CLOUDSTACK_NETWORK_1_IPADDRESS,
   250  	CLOUDSTACK_TEMPLATE,
   251  	CLOUDSTACK_ZONE)