github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/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_id": &schema.Schema{ 20 Type: schema.TypeString, 21 Required: true, 22 ForceNew: true, 23 }, 24 25 "ip_address": &schema.Schema{ 26 Type: schema.TypeString, 27 Optional: true, 28 Computed: true, 29 ForceNew: true, 30 }, 31 32 "virtual_machine_id": &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 // Create a new parameter struct 45 p := cs.VirtualMachine.NewAddNicToVirtualMachineParams( 46 d.Get("network_id").(string), 47 d.Get("virtual_machine_id").(string), 48 ) 49 50 // If there is a ipaddres supplied, add it to the parameter struct 51 if ipaddress, ok := d.GetOk("ip_address"); ok { 52 p.SetIpaddress(ipaddress.(string)) 53 } 54 55 // Create and attach the new NIC 56 r, err := Retry(10, retryableAddNicFunc(cs, p)) 57 if err != nil { 58 return fmt.Errorf("Error creating the new NIC: %s", err) 59 } 60 61 found := false 62 for _, n := range r.(*cloudstack.AddNicToVirtualMachineResponse).Nic { 63 if n.Networkid == d.Get("network_id").(string) { 64 d.SetId(n.Id) 65 found = true 66 break 67 } 68 } 69 70 if !found { 71 return fmt.Errorf("Could not find NIC ID for network ID: %s", d.Get("network_id").(string)) 72 } 73 74 return resourceCloudStackNICRead(d, meta) 75 } 76 77 func resourceCloudStackNICRead(d *schema.ResourceData, meta interface{}) error { 78 cs := meta.(*cloudstack.CloudStackClient) 79 80 // Get the virtual machine details 81 vm, count, err := cs.VirtualMachine.GetVirtualMachineByID(d.Get("virtual_machine_id").(string)) 82 if err != nil { 83 if count == 0 { 84 log.Printf("[DEBUG] Instance %s does no longer exist", d.Get("virtual_machine_id").(string)) 85 d.SetId("") 86 return nil 87 } 88 89 return err 90 } 91 92 // Read NIC info 93 found := false 94 for _, n := range vm.Nic { 95 if n.Id == d.Id() { 96 d.Set("ip_address", n.Ipaddress) 97 d.Set("network_id", n.Networkid) 98 d.Set("virtual_machine_id", vm.Id) 99 found = true 100 break 101 } 102 } 103 104 if !found { 105 log.Printf("[DEBUG] NIC for network ID %s does no longer exist", d.Get("network_id").(string)) 106 d.SetId("") 107 } 108 109 return nil 110 } 111 112 func resourceCloudStackNICDelete(d *schema.ResourceData, meta interface{}) error { 113 cs := meta.(*cloudstack.CloudStackClient) 114 115 // Create a new parameter struct 116 p := cs.VirtualMachine.NewRemoveNicFromVirtualMachineParams( 117 d.Id(), 118 d.Get("virtual_machine_id").(string), 119 ) 120 121 // Remove the NIC 122 _, err := cs.VirtualMachine.RemoveNicFromVirtualMachine(p) 123 if err != nil { 124 // This is a very poor way to be told the ID does no longer exist :( 125 if strings.Contains(err.Error(), fmt.Sprintf( 126 "Invalid parameter id value=%s due to incorrect long value format, "+ 127 "or entity does not exist", d.Id())) { 128 return nil 129 } 130 131 return fmt.Errorf("Error deleting NIC: %s", err) 132 } 133 134 return nil 135 } 136 137 func retryableAddNicFunc(cs *cloudstack.CloudStackClient, p *cloudstack.AddNicToVirtualMachineParams) func() (interface{}, error) { 138 return func() (interface{}, error) { 139 r, err := cs.VirtualMachine.AddNicToVirtualMachine(p) 140 if err != nil { 141 return nil, err 142 } 143 return r, nil 144 } 145 }