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 hostv4 = floatingIP
} }
// Loop through all networks and check for the following: // Loop through all networks
// * If the network is set as an access network. // If the network has a valid floating, fixed v4, or fixed v6 address
// * If the network has a floating IP. // and hostv4 or hostv6 is not set, set hostv4/hostv6.
// * If the network has a v4/v6 fixed IP. // If the network is an "access_network" overwrite hostv4/hostv6.
for _, n := range networks { for _, n := range networks {
if n["floating_ip"] != nil { var accessNetwork bool
hostv4 = n["floating_ip"].(string)
} else { if an, ok := n["access_network"].(bool); ok && an {
if hostv4 == "" && n["fixed_ip_v4"] != nil { accessNetwork = true
hostv4 = n["fixed_ip_v4"].(string) }
if fixedIPv4, ok := n["fixed_ip_v4"].(string); ok && fixedIPv4 != "" {
if hostv4 == "" || accessNetwork {
hostv4 = fixedIPv4
} }
} }
if hostv6 == "" && n["fixed_ip_v6"] != nil { if floatingIP, ok := n["floating_ip"].(string); ok && floatingIP != "" {
hostv6 = n["fixed_ip_v6"].(string) if hostv4 == "" || accessNetwork {
hostv4 = floatingIP
}
} }
if an, ok := n["access_network"].(bool); ok && an { if fixedIPv6, ok := n["fixed_ip_v6"].(string); ok && fixedIPv6 != "" {
break 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 { func testAccCheckComputeV2InstanceDestroy(s *terraform.State) error {
config := testAccProvider.Meta().(*Config) config := testAccProvider.Meta().(*Config)
computeClient, err := config.computeV2Client(OS_REGION_NAME) computeClient, err := config.computeV2Client(OS_REGION_NAME)