diff options
author | Duncan Mac-Vicar P <dmacvicar@suse.de> | 2016-05-26 23:49:59 +0200 |
---|---|---|
committer | Duncan Mac-Vicar P <dmacvicar@suse.de> | 2016-05-26 23:49:59 +0200 |
commit | 3d3088855a3636b52afcd6015f4f3cea2c691753 (patch) | |
tree | 03dd47483fc513581689057587fc843a38db04c6 | |
parent | d91947c545b643f8b73a52da9ea116915f7487f9 (diff) | |
download | terraform-provider-libvirt-3d3088855a3636b52afcd6015f4f3cea2c691753.tar terraform-provider-libvirt-3d3088855a3636b52afcd6015f4f3cea2c691753.tar.gz |
do not rebuild domain due to mac and wait_for_lease values. Closes #23.
-rw-r--r-- | libvirt/network_interface_def.go | 8 | ||||
-rw-r--r-- | libvirt/resource_libvirt_domain.go | 42 |
2 files changed, 31 insertions, 19 deletions
diff --git a/libvirt/network_interface_def.go b/libvirt/network_interface_def.go index 5043ac24..440cbf09 100644 --- a/libvirt/network_interface_def.go +++ b/libvirt/network_interface_def.go @@ -17,6 +17,7 @@ type defNetworkInterface struct { Model struct { Type string `xml:"type,attr"` } `xml:"model"` + waitForLease bool } func networkAddressCommonSchema() map[string]*schema.Schema { @@ -49,16 +50,12 @@ func networkInterfaceCommonSchema() map[string]*schema.Schema { "mac": &schema.Schema{ Type: schema.TypeString, Optional: true, + Computed: true, ForceNew: true, - DefaultFunc: func() (interface{}, error) { - return RandomMACAddress() - }, }, "wait_for_lease": &schema.Schema{ Type: schema.TypeBool, Optional: true, - Default: false, - ForceNew: true, }, "address": &schema.Schema{ Type: schema.TypeList, @@ -77,5 +74,6 @@ func newDefNetworkInterface() defNetworkInterface { //iface.Mac.Address = "52:54:00:36:c0:65" iface.Source.Network = "default" iface.Model.Type = "virtio" + iface.waitForLease = false return iface } diff --git a/libvirt/resource_libvirt_domain.go b/libvirt/resource_libvirt_domain.go index b7efffbe..58fa8154 100644 --- a/libvirt/resource_libvirt_domain.go +++ b/libvirt/resource_libvirt_domain.go @@ -99,6 +99,17 @@ func resourceLibvirtDomainCreate(d *schema.ResourceData, meta interface{}) error if mac, ok := d.GetOk(prefix + ".mac"); ok { netIface.Mac.Address = mac.(string) + } else { + var err error + netIface.Mac.Address, err = RandomMACAddress() + if err != nil { + return fmt.Errorf("Error generating mac address: %s", err) + } + } + + // this is not passes to libvirt, but used by waitForAddress + if waitForLease, ok := d.GetOk(prefix + ".wait_for_lease"); ok { + netIface.waitForLease = waitForLease.(bool) } if network, ok := d.GetOk(prefix + ".network"); ok { @@ -147,7 +158,7 @@ func resourceLibvirtDomainCreate(d *schema.ResourceData, meta interface{}) error return fmt.Errorf("Error waiting for domain to reach RUNNING state: %s", err) } - err = waitForNetworkAddresses(d, domain) + err = waitForNetworkAddresses(netIfaces, domain) if err != nil { return err } @@ -215,7 +226,9 @@ func resourceLibvirtDomainRead(d *schema.ResourceData, meta interface{}) error { } netIfaces := make([]map[string]interface{}, 0) - for _, networkInterfaceDef := range domainDef.Devices.NetworkInterfaces { + for i, networkInterfaceDef := range domainDef.Devices.NetworkInterfaces { + // we need it to read old values + prefix := fmt.Sprintf("network_interface.%d", i) if networkInterfaceDef.Type != "network" { log.Printf("[DEBUG] ignoring interface of type '%s'", networkInterfaceDef.Type) @@ -254,6 +267,12 @@ func resourceLibvirtDomainRead(d *schema.ResourceData, meta interface{}) error { log.Printf("[DEBUG] %d addresses for %s\n", len(netIfaceAddrs), networkInterfaceDef.Mac.Address) netIface["address"] = netIfaceAddrs + + // pass on old wait_for_lease value + if waitForLease, ok := d.GetOk(prefix + ".wait_for_lease"); ok { + netIface["wait_for_lease"] = waitForLease + } + netIfaces = append(netIfaces, netIface) } d.Set("network_interface", netIfaces) @@ -332,30 +351,25 @@ func waitForDomainDestroyed(virConn *libvirt.VirConnection, uuid string) error { } } -func waitForNetworkAddresses(d *schema.ResourceData, domain libvirt.VirDomain) error { +func waitForNetworkAddresses(ifaces []defNetworkInterface, domain libvirt.VirDomain) error { log.Printf("[DEBUG] waiting for network addresses.\n") // wait for network interfaces with 'wait_for_lease' to get an address - netIfacesCount := d.Get("network_interface.#").(int) - for i := 0; i < netIfacesCount; i++ { - prefix := fmt.Sprintf("network_interface.%d", i) - - if wait, ok := d.GetOk(prefix + ".wait_for_lease"); !ok || !wait.(bool) { + for _, iface := range(ifaces) { + if !iface.waitForLease { continue } - var mac string - if v, ok := d.GetOk(prefix + ".mac"); !ok { + if iface.Mac.Address == "" { + log.Printf("[DEBUG] Can't wait without a mac address.\n") // we can't get the ip without a mac address continue - } else { - mac = v.(string) } // loop until address appear, with timeout start := time.Now() waitLoop: for { - log.Printf("[DEBUG] waiting for network address for interface with hwaddr: '%s'\n", mac) + log.Printf("[DEBUG] waiting for network address for interface with hwaddr: '%s'\n", iface.Mac.Address) ifacesWithAddr, err := domain.ListAllInterfaceAddresses(libvirt.VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_LEASE) if err != nil { return fmt.Errorf("Error retrieving interface addresses: %s", err) @@ -363,7 +377,7 @@ func waitForNetworkAddresses(d *schema.ResourceData, domain libvirt.VirDomain) e for _, ifaceWithAddr := range ifacesWithAddr { // found - if mac == ifaceWithAddr.Hwaddr { + if iface.Mac.Address == ifaceWithAddr.Hwaddr { break waitLoop } } |