provider/openstack: Fix Access Address Detection

This commit fixes how access ip addresses are detected. The previous
logic used was flawed and would detect the IPs in the wrong order.
This commit is contained in:
Joe Topjian 2016-04-06 19:17:51 +00:00
parent f118e02ecd
commit 9d10028d43
2 changed files with 75 additions and 13 deletions

View File

@ -1009,25 +1009,33 @@ func getInstanceAccessAddresses(d *schema.ResourceData, networks []map[string]in
hostv4 = floatingIP
}
// Loop through all networks and check for the following:
// * If the network is set as an access network.
// * If the network has a floating IP.
// * If the network has a v4/v6 fixed IP.
// Loop through all networks
// If the network has a valid floating, fixed v4, or fixed v6 address
// and hostv4 or hostv6 is not set, set hostv4/hostv6.
// If the network is an "access_network" overwrite hostv4/hostv6.
for _, n := range networks {
if n["floating_ip"] != nil {
hostv4 = n["floating_ip"].(string)
} else {
if hostv4 == "" && n["fixed_ip_v4"] != nil {
hostv4 = n["fixed_ip_v4"].(string)
}
}
if hostv6 == "" && n["fixed_ip_v6"] != nil {
hostv6 = n["fixed_ip_v6"].(string)
}
var accessNetwork bool
if an, ok := n["access_network"].(bool); ok && an {
break
accessNetwork = true
}
if fixedIPv4, ok := n["fixed_ip_v4"].(string); ok && fixedIPv4 != "" {
if hostv4 == "" || accessNetwork {
hostv4 = fixedIPv4
}
}
if floatingIP, ok := n["floating_ip"].(string); ok && floatingIP != "" {
if hostv4 == "" || accessNetwork {
hostv4 = floatingIP
}
}
if fixedIPv6, ok := n["fixed_ip_v6"].(string); ok && fixedIPv6 != "" {
if hostv6 == "" || accessNetwork {
hostv6 = fixedIPv6
}
}
}

View File

@ -503,6 +503,60 @@ func TestAccComputeV2Instance_multiEphemeral(t *testing.T) {
})
}
func TestAccComputeV2Instance_accessIPv4(t *testing.T) {
var instance servers.Server
var testAccComputeV2Instance_accessIPv4 = fmt.Sprintf(`
resource "openstack_compute_floatingip_v2" "myip" {
}
resource "openstack_networking_network_v2" "network_1" {
name = "network_1"
}
resource "openstack_networking_subnet_v2" "subnet_1" {
name = "subnet_1"
network_id = "${openstack_networking_network_v2.network_1.id}"
cidr = "192.168.1.0/24"
ip_version = 4
enable_dhcp = true
no_gateway = true
}
resource "openstack_compute_instance_v2" "instance_1" {
depends_on = ["openstack_networking_subnet_v2.subnet_1"]
name = "instance_1"
security_groups = ["default"]
floating_ip = "${openstack_compute_floatingip_v2.myip.address}"
network {
uuid = "%s"
}
network {
uuid = "${openstack_networking_network_v2.network_1.id}"
fixed_ip_v4 = "192.168.1.100"
access_network = true
}
}`, os.Getenv("OS_NETWORK_ID"))
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckComputeV2InstanceDestroy,
Steps: []resource.TestStep{
resource.TestStep{
Config: testAccComputeV2Instance_accessIPv4,
Check: resource.ComposeTestCheckFunc(
testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.instance_1", &instance),
resource.TestCheckResourceAttr(
"openstack_compute_instance_v2.instance_1", "access_ip_v4", "192.168.1.100"),
),
},
},
})
}
func testAccCheckComputeV2InstanceDestroy(s *terraform.State) error {
config := testAccProvider.Meta().(*Config)
computeClient, err := config.computeV2Client(OS_REGION_NAME)