github.com/chalford/terraform@v0.3.7-0.20150113080010-a78c69a8c81f/builtin/providers/cloudstack/resource_cloudstack_nic.go (about)

     1  package cloudstack
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"strings"
     7  
     8  	"github.com/hashicorp/terraform/helper/schema"
     9  	"github.com/xanzy/go-cloudstack/cloudstack"
    10  )
    11  
    12  func resourceCloudStackNIC() *schema.Resource {
    13  	return &schema.Resource{
    14  		Create: resourceCloudStackNICCreate,
    15  		Read:   resourceCloudStackNICRead,
    16  		Delete: resourceCloudStackNICDelete,
    17  
    18  		Schema: map[string]*schema.Schema{
    19  			"network": &schema.Schema{
    20  				Type:     schema.TypeString,
    21  				Required: true,
    22  				ForceNew: true,
    23  			},
    24  
    25  			"ipaddress": &schema.Schema{
    26  				Type:     schema.TypeString,
    27  				Optional: true,
    28  				Computed: true,
    29  				ForceNew: true,
    30  			},
    31  
    32  			"virtual_machine": &schema.Schema{
    33  				Type:     schema.TypeString,
    34  				Required: true,
    35  				ForceNew: true,
    36  			},
    37  		},
    38  	}
    39  }
    40  
    41  func resourceCloudStackNICCreate(d *schema.ResourceData, meta interface{}) error {
    42  	cs := meta.(*cloudstack.CloudStackClient)
    43  
    44  	// Retrieve the network UUID
    45  	networkid, e := retrieveUUID(cs, "network", d.Get("network").(string))
    46  	if e != nil {
    47  		return e.Error()
    48  	}
    49  
    50  	// Retrieve the virtual_machine UUID
    51  	virtualmachineid, e := retrieveUUID(cs, "virtual_machine", d.Get("virtual_machine").(string))
    52  	if e != nil {
    53  		return e.Error()
    54  	}
    55  
    56  	// Create a new parameter struct
    57  	p := cs.VirtualMachine.NewAddNicToVirtualMachineParams(networkid, virtualmachineid)
    58  
    59  	// If there is a ipaddres supplied, add it to the parameter struct
    60  	if ipaddress, ok := d.GetOk("ipaddress"); ok {
    61  		p.SetIpaddress(ipaddress.(string))
    62  	}
    63  
    64  	// Create and attach the new NIC
    65  	r, err := cs.VirtualMachine.AddNicToVirtualMachine(p)
    66  	if err != nil {
    67  		return fmt.Errorf("Error creating the new NIC: %s", err)
    68  	}
    69  
    70  	found := false
    71  	for _, n := range r.Nic {
    72  		if n.Networkid == networkid {
    73  			d.SetId(n.Id)
    74  			found = true
    75  			break
    76  		}
    77  	}
    78  
    79  	if !found {
    80  		return fmt.Errorf("Could not find NIC ID for network: %s", d.Get("network").(string))
    81  	}
    82  
    83  	return resourceCloudStackNICRead(d, meta)
    84  }
    85  
    86  func resourceCloudStackNICRead(d *schema.ResourceData, meta interface{}) error {
    87  	cs := meta.(*cloudstack.CloudStackClient)
    88  
    89  	// Get the virtual machine details
    90  	vm, count, err := cs.VirtualMachine.GetVirtualMachineByName(d.Get("virtual_machine").(string))
    91  	if err != nil {
    92  		if count == 0 {
    93  			log.Printf("[DEBUG] Instance %s does no longer exist", d.Get("virtual_machine").(string))
    94  			d.SetId("")
    95  			return nil
    96  		} else {
    97  			return err
    98  		}
    99  	}
   100  
   101  	// Read NIC info
   102  	found := false
   103  	for _, n := range vm.Nic {
   104  		if n.Id == d.Id() {
   105  			d.Set("network", n.Networkname)
   106  			d.Set("ipaddress", n.Ipaddress)
   107  			d.Set("virtual_machine", vm.Name)
   108  			found = true
   109  			break
   110  		}
   111  	}
   112  
   113  	if !found {
   114  		log.Printf("[DEBUG] NIC for network %s does no longer exist", d.Get("network").(string))
   115  		d.SetId("")
   116  	}
   117  
   118  	return nil
   119  }
   120  
   121  func resourceCloudStackNICDelete(d *schema.ResourceData, meta interface{}) error {
   122  	cs := meta.(*cloudstack.CloudStackClient)
   123  
   124  	// Retrieve the virtual_machine UUID
   125  	virtualmachineid, e := retrieveUUID(cs, "virtual_machine", d.Get("virtual_machine").(string))
   126  	if e != nil {
   127  		return e.Error()
   128  	}
   129  
   130  	// Create a new parameter struct
   131  	p := cs.VirtualMachine.NewRemoveNicFromVirtualMachineParams(d.Id(), virtualmachineid)
   132  
   133  	// Remove the NIC
   134  	_, err := cs.VirtualMachine.RemoveNicFromVirtualMachine(p)
   135  	if err != nil {
   136  		// This is a very poor way to be told the UUID does no longer exist :(
   137  		if strings.Contains(err.Error(), fmt.Sprintf(
   138  			"Invalid parameter id value=%s due to incorrect long value format, "+
   139  				"or entity does not exist", d.Id())) {
   140  			return nil
   141  		}
   142  
   143  		return fmt.Errorf("Error deleting NIC: %s", err)
   144  	}
   145  
   146  	return nil
   147  }