Merge pull request #1342 from ggiamarchi/openstack-bugfix-floating-ip

OpenStack provider - Bugfix on floating IP assignment
This commit is contained in:
Paul Hinze 2015-04-01 09:09:11 -05:00
commit 0b84f4b097
4 changed files with 29 additions and 43 deletions

View File

@ -81,6 +81,11 @@ func testAccCheckComputeV2FloatingIPExists(t *testing.T, n string, kp *floatingi
} }
} }
var testAccComputeV2FloatingIP_basic = fmt.Sprintf(` var testAccComputeV2FloatingIP_basic = `
resource "openstack_compute_floatingip_v2" "foo" { resource "openstack_compute_floatingip_v2" "foo" {
}`) }
resource "openstack_compute_instance_v2" "bar" {
name = "terraform-acc-floating-ip-test"
floating_ip = "${openstack_compute_floatingip_v2.foo.address}"
}`

View File

@ -20,7 +20,6 @@ import (
"github.com/rackspace/gophercloud/openstack/compute/v2/images" "github.com/rackspace/gophercloud/openstack/compute/v2/images"
"github.com/rackspace/gophercloud/openstack/compute/v2/servers" "github.com/rackspace/gophercloud/openstack/compute/v2/servers"
"github.com/rackspace/gophercloud/openstack/networking/v2/extensions/layer3/floatingips" "github.com/rackspace/gophercloud/openstack/networking/v2/extensions/layer3/floatingips"
"github.com/rackspace/gophercloud/openstack/networking/v2/networks"
"github.com/rackspace/gophercloud/openstack/networking/v2/ports" "github.com/rackspace/gophercloud/openstack/networking/v2/ports"
"github.com/rackspace/gophercloud/pagination" "github.com/rackspace/gophercloud/pagination"
) )
@ -303,7 +302,7 @@ func resourceComputeInstanceV2Create(d *schema.ResourceData, meta interface{}) e
} }
err = assignFloatingIP(networkingClient, extractFloatingIPFromIP(allFloatingIPs, floatingIP), server.ID) err = assignFloatingIP(networkingClient, extractFloatingIPFromIP(allFloatingIPs, floatingIP), server.ID)
if err != nil { if err != nil {
fmt.Errorf("Error assigning floating IP to OpenStack compute instance: %s", err) return fmt.Errorf("Error assigning floating IP to OpenStack compute instance: %s", err)
} }
} }
@ -770,44 +769,18 @@ func extractFloatingIPFromIP(ips []floatingips.FloatingIP, IP string) *floatingi
} }
func assignFloatingIP(networkingClient *gophercloud.ServiceClient, floatingIP *floatingips.FloatingIP, instanceID string) error { func assignFloatingIP(networkingClient *gophercloud.ServiceClient, floatingIP *floatingips.FloatingIP, instanceID string) error {
networkID, err := getFirstNetworkID(networkingClient, instanceID) portID, err := getInstancePortID(networkingClient, instanceID)
if err != nil { if err != nil {
return err return err
} }
portID, err := getInstancePortID(networkingClient, instanceID, networkID) return floatingips.Update(networkingClient, floatingIP.ID, floatingips.UpdateOpts{
_, err = floatingips.Update(networkingClient, floatingIP.ID, floatingips.UpdateOpts{
PortID: portID, PortID: portID,
}).Extract() }).Err
return err
} }
func getFirstNetworkID(networkingClient *gophercloud.ServiceClient, instanceID string) (string, error) { func getInstancePortID(networkingClient *gophercloud.ServiceClient, instanceID string) (string, error) {
pager := networks.List(networkingClient, networks.ListOpts{})
var networkdID string
err := pager.EachPage(func(page pagination.Page) (bool, error) {
networkList, err := networks.ExtractNetworks(page)
if err != nil {
return false, err
}
if len(networkList) > 0 {
networkdID = networkList[0].ID
return false, nil
}
return false, fmt.Errorf("No network found for the instance %s", instanceID)
})
if err != nil {
return "", err
}
return networkdID, nil
}
func getInstancePortID(networkingClient *gophercloud.ServiceClient, instanceID, networkID string) (string, error) {
pager := ports.List(networkingClient, ports.ListOpts{ pager := ports.List(networkingClient, ports.ListOpts{
DeviceID: instanceID, DeviceID: instanceID,
NetworkID: networkID,
}) })
var portID string var portID string
@ -826,6 +799,11 @@ func getInstancePortID(networkingClient *gophercloud.ServiceClient, instanceID,
if err != nil { if err != nil {
return "", err return "", err
} }
if portID == "" {
return "", fmt.Errorf("Cannot find port for instance %s", instanceID)
}
return portID, nil return portID, nil
} }

View File

@ -31,6 +31,7 @@ func resourceNetworkingFloatingIPV2() *schema.Resource {
Type: schema.TypeString, Type: schema.TypeString,
Required: true, Required: true,
ForceNew: true, ForceNew: true,
DefaultFunc: envDefaultFunc("OS_POOL_NAME"),
}, },
}, },
} }

View File

@ -81,9 +81,11 @@ func testAccCheckNetworkingV2FloatingIPExists(t *testing.T, n string, kp *floati
} }
} }
var testAccNetworkingV2FloatingIP_basic = fmt.Sprintf(` var testAccNetworkingV2FloatingIP_basic = `
resource "openstack_networking_floatingip_v2" "foo" { resource "openstack_networking_floatingip_v2" "foo" {
region = "%s" }
pool = "%s"
}`, resource "openstack_compute_instance_v2" "bar" {
OS_REGION_NAME, OS_POOL_NAME) name = "terraform-acc-floating-ip-test"
floating_ip = "${openstack_networking_floatingip_v2.foo.address}"
}`