github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/cloudstack/resource_cloudstack_nic_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 TestAccCloudStackNIC_basic(t *testing.T) {
    13  	var nic cloudstack.Nic
    14  
    15  	resource.Test(t, resource.TestCase{
    16  		PreCheck:     func() { testAccPreCheck(t) },
    17  		Providers:    testAccProviders,
    18  		CheckDestroy: testAccCheckCloudStackNICDestroy,
    19  		Steps: []resource.TestStep{
    20  			resource.TestStep{
    21  				Config: testAccCloudStackNIC_basic,
    22  				Check: resource.ComposeTestCheckFunc(
    23  					testAccCheckCloudStackNICExists(
    24  						"cloudstack_instance.foobar", "cloudstack_nic.foo", &nic),
    25  					testAccCheckCloudStackNICAttributes(&nic),
    26  				),
    27  			},
    28  		},
    29  	})
    30  }
    31  
    32  func TestAccCloudStackNIC_update(t *testing.T) {
    33  	var nic cloudstack.Nic
    34  
    35  	resource.Test(t, resource.TestCase{
    36  		PreCheck:     func() { testAccPreCheck(t) },
    37  		Providers:    testAccProviders,
    38  		CheckDestroy: testAccCheckCloudStackNICDestroy,
    39  		Steps: []resource.TestStep{
    40  			resource.TestStep{
    41  				Config: testAccCloudStackNIC_basic,
    42  				Check: resource.ComposeTestCheckFunc(
    43  					testAccCheckCloudStackNICExists(
    44  						"cloudstack_instance.foobar", "cloudstack_nic.foo", &nic),
    45  					testAccCheckCloudStackNICAttributes(&nic),
    46  				),
    47  			},
    48  
    49  			resource.TestStep{
    50  				Config: testAccCloudStackNIC_ipaddress,
    51  				Check: resource.ComposeTestCheckFunc(
    52  					testAccCheckCloudStackNICExists(
    53  						"cloudstack_instance.foobar", "cloudstack_nic.foo", &nic),
    54  					testAccCheckCloudStackNICIPAddress(&nic),
    55  					resource.TestCheckResourceAttr(
    56  						"cloudstack_nic.foo", "ip_address", CLOUDSTACK_2ND_NIC_IPADDRESS),
    57  				),
    58  			},
    59  		},
    60  	})
    61  }
    62  
    63  func testAccCheckCloudStackNICExists(
    64  	v, n string, nic *cloudstack.Nic) resource.TestCheckFunc {
    65  	return func(s *terraform.State) error {
    66  		rsv, ok := s.RootModule().Resources[v]
    67  		if !ok {
    68  			return fmt.Errorf("Not found: %s", v)
    69  		}
    70  
    71  		if rsv.Primary.ID == "" {
    72  			return fmt.Errorf("No instance ID is set")
    73  		}
    74  
    75  		rsn, ok := s.RootModule().Resources[n]
    76  		if !ok {
    77  			return fmt.Errorf("Not found: %s", n)
    78  		}
    79  
    80  		if rsn.Primary.ID == "" {
    81  			return fmt.Errorf("No NIC ID is set")
    82  		}
    83  
    84  		cs := testAccProvider.Meta().(*cloudstack.CloudStackClient)
    85  		vm, _, err := cs.VirtualMachine.GetVirtualMachineByID(rsv.Primary.ID)
    86  
    87  		if err != nil {
    88  			return err
    89  		}
    90  
    91  		for _, n := range vm.Nic {
    92  			if n.Id == rsn.Primary.ID {
    93  				*nic = n
    94  				return nil
    95  			}
    96  		}
    97  
    98  		return fmt.Errorf("NIC not found")
    99  	}
   100  }
   101  
   102  func testAccCheckCloudStackNICAttributes(
   103  	nic *cloudstack.Nic) resource.TestCheckFunc {
   104  	return func(s *terraform.State) error {
   105  
   106  		if nic.Networkid != CLOUDSTACK_2ND_NIC_NETWORK {
   107  			return fmt.Errorf("Bad network ID: %s", nic.Networkid)
   108  		}
   109  
   110  		return nil
   111  	}
   112  }
   113  
   114  func testAccCheckCloudStackNICIPAddress(
   115  	nic *cloudstack.Nic) resource.TestCheckFunc {
   116  	return func(s *terraform.State) error {
   117  
   118  		if nic.Networkid != CLOUDSTACK_2ND_NIC_NETWORK {
   119  			return fmt.Errorf("Bad network ID: %s", nic.Networkname)
   120  		}
   121  
   122  		if nic.Ipaddress != CLOUDSTACK_2ND_NIC_IPADDRESS {
   123  			return fmt.Errorf("Bad IP address: %s", nic.Ipaddress)
   124  		}
   125  
   126  		return nil
   127  	}
   128  }
   129  
   130  func testAccCheckCloudStackNICDestroy(s *terraform.State) error {
   131  	cs := testAccProvider.Meta().(*cloudstack.CloudStackClient)
   132  
   133  	// Deleting the instance automatically deletes any additional NICs
   134  	for _, rs := range s.RootModule().Resources {
   135  		if rs.Type != "cloudstack_instance" {
   136  			continue
   137  		}
   138  
   139  		if rs.Primary.ID == "" {
   140  			return fmt.Errorf("No instance ID is set")
   141  		}
   142  
   143  		_, _, err := cs.VirtualMachine.GetVirtualMachineByID(rs.Primary.ID)
   144  		if err == nil {
   145  			return fmt.Errorf("Virtual Machine %s still exists", rs.Primary.ID)
   146  		}
   147  	}
   148  
   149  	return nil
   150  }
   151  
   152  var testAccCloudStackNIC_basic = fmt.Sprintf(`
   153  resource "cloudstack_instance" "foobar" {
   154    name = "terraform-test"
   155    display_name = "terraform"
   156    service_offering= "%s"
   157    network_id = "%s"
   158    template = "%s"
   159    zone = "%s"
   160    expunge = true
   161  }
   162  
   163  resource "cloudstack_nic" "foo" {
   164    network_id = "%s"
   165    virtual_machine_id = "${cloudstack_instance.foobar.id}"
   166  }`,
   167  	CLOUDSTACK_SERVICE_OFFERING_1,
   168  	CLOUDSTACK_NETWORK_1,
   169  	CLOUDSTACK_TEMPLATE,
   170  	CLOUDSTACK_ZONE,
   171  	CLOUDSTACK_2ND_NIC_NETWORK)
   172  
   173  var testAccCloudStackNIC_ipaddress = fmt.Sprintf(`
   174  resource "cloudstack_instance" "foobar" {
   175    name = "terraform-test"
   176    display_name = "terraform"
   177    service_offering= "%s"
   178    network_id = "%s"
   179    template = "%s"
   180    zone = "%s"
   181    expunge = true
   182  }
   183  
   184  resource "cloudstack_nic" "foo" {
   185    network_id = "%s"
   186    ip_address = "%s"
   187    virtual_machine_id = "${cloudstack_instance.foobar.id}"
   188  }`,
   189  	CLOUDSTACK_SERVICE_OFFERING_1,
   190  	CLOUDSTACK_NETWORK_1,
   191  	CLOUDSTACK_TEMPLATE,
   192  	CLOUDSTACK_ZONE,
   193  	CLOUDSTACK_2ND_NIC_NETWORK,
   194  	CLOUDSTACK_2ND_NIC_IPADDRESS)