github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/openstack/resource_openstack_compute_floatingip_associate_v2_test.go (about) 1 package openstack 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/gophercloud/gophercloud" 8 "github.com/gophercloud/gophercloud/openstack/compute/v2/servers" 9 "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips" 10 11 "github.com/hashicorp/terraform/helper/resource" 12 "github.com/hashicorp/terraform/terraform" 13 ) 14 15 func TestAccComputeV2FloatingIPAssociate_basic(t *testing.T) { 16 var instance servers.Server 17 var fip floatingips.FloatingIP 18 19 resource.Test(t, resource.TestCase{ 20 PreCheck: func() { testAccPreCheck(t) }, 21 Providers: testAccProviders, 22 CheckDestroy: testAccCheckComputeV2FloatingIPAssociateDestroy, 23 Steps: []resource.TestStep{ 24 resource.TestStep{ 25 Config: testAccComputeV2FloatingIPAssociate_basic, 26 Check: resource.ComposeTestCheckFunc( 27 testAccCheckComputeV2InstanceExists("openstack_compute_instance_v2.instance_1", &instance), 28 testAccCheckNetworkingV2FloatingIPExists("openstack_networking_floatingip_v2.fip_1", &fip), 29 testAccCheckComputeV2FloatingIPAssociateAssociated(&fip, &instance, 1), 30 ), 31 }, 32 }, 33 }) 34 } 35 36 func TestAccComputeV2FloatingIPAssociate_fixedIP(t *testing.T) { 37 var instance servers.Server 38 var fip floatingips.FloatingIP 39 40 resource.Test(t, resource.TestCase{ 41 PreCheck: func() { testAccPreCheck(t) }, 42 Providers: testAccProviders, 43 CheckDestroy: testAccCheckComputeV2FloatingIPAssociateDestroy, 44 Steps: []resource.TestStep{ 45 resource.TestStep{ 46 Config: testAccComputeV2FloatingIPAssociate_fixedIP, 47 Check: resource.ComposeTestCheckFunc( 48 testAccCheckComputeV2InstanceExists("openstack_compute_instance_v2.instance_1", &instance), 49 testAccCheckNetworkingV2FloatingIPExists("openstack_networking_floatingip_v2.fip_1", &fip), 50 testAccCheckComputeV2FloatingIPAssociateAssociated(&fip, &instance, 1), 51 ), 52 }, 53 }, 54 }) 55 } 56 57 func TestAccComputeV2FloatingIPAssociate_attachToFirstNetwork(t *testing.T) { 58 var instance servers.Server 59 var fip floatingips.FloatingIP 60 61 resource.Test(t, resource.TestCase{ 62 PreCheck: func() { testAccPreCheck(t) }, 63 Providers: testAccProviders, 64 CheckDestroy: testAccCheckComputeV2FloatingIPAssociateDestroy, 65 Steps: []resource.TestStep{ 66 resource.TestStep{ 67 Config: testAccComputeV2FloatingIPAssociate_attachToFirstNetwork, 68 Check: resource.ComposeTestCheckFunc( 69 testAccCheckComputeV2InstanceExists("openstack_compute_instance_v2.instance_1", &instance), 70 testAccCheckNetworkingV2FloatingIPExists("openstack_networking_floatingip_v2.fip_1", &fip), 71 testAccCheckComputeV2FloatingIPAssociateAssociated(&fip, &instance, 1), 72 ), 73 }, 74 }, 75 }) 76 } 77 78 func TestAccComputeV2FloatingIPAssociate_attachToSecondNetwork(t *testing.T) { 79 var instance servers.Server 80 var fip floatingips.FloatingIP 81 82 resource.Test(t, resource.TestCase{ 83 PreCheck: func() { testAccPreCheck(t) }, 84 Providers: testAccProviders, 85 CheckDestroy: testAccCheckComputeV2FloatingIPAssociateDestroy, 86 Steps: []resource.TestStep{ 87 resource.TestStep{ 88 Config: testAccComputeV2FloatingIPAssociate_attachToSecondNetwork, 89 Check: resource.ComposeTestCheckFunc( 90 testAccCheckComputeV2InstanceExists("openstack_compute_instance_v2.instance_1", &instance), 91 testAccCheckNetworkingV2FloatingIPExists("openstack_networking_floatingip_v2.fip_1", &fip), 92 testAccCheckComputeV2FloatingIPAssociateAssociated(&fip, &instance, 2), 93 ), 94 }, 95 }, 96 }) 97 } 98 99 func TestAccComputeV2FloatingIPAssociate_attachNew(t *testing.T) { 100 var instance servers.Server 101 var fip_1 floatingips.FloatingIP 102 var fip_2 floatingips.FloatingIP 103 104 resource.Test(t, resource.TestCase{ 105 PreCheck: func() { testAccPreCheck(t) }, 106 Providers: testAccProviders, 107 CheckDestroy: testAccCheckComputeV2FloatingIPAssociateDestroy, 108 Steps: []resource.TestStep{ 109 resource.TestStep{ 110 Config: testAccComputeV2FloatingIPAssociate_attachNew_1, 111 Check: resource.ComposeTestCheckFunc( 112 testAccCheckComputeV2InstanceExists("openstack_compute_instance_v2.instance_1", &instance), 113 testAccCheckNetworkingV2FloatingIPExists("openstack_networking_floatingip_v2.fip_1", &fip_1), 114 testAccCheckNetworkingV2FloatingIPExists("openstack_networking_floatingip_v2.fip_2", &fip_2), 115 testAccCheckComputeV2FloatingIPAssociateAssociated(&fip_1, &instance, 1), 116 ), 117 }, 118 resource.TestStep{ 119 Config: testAccComputeV2FloatingIPAssociate_attachNew_2, 120 Check: resource.ComposeTestCheckFunc( 121 testAccCheckComputeV2InstanceExists("openstack_compute_instance_v2.instance_1", &instance), 122 testAccCheckNetworkingV2FloatingIPExists("openstack_networking_floatingip_v2.fip_1", &fip_1), 123 testAccCheckNetworkingV2FloatingIPExists("openstack_networking_floatingip_v2.fip_2", &fip_2), 124 testAccCheckComputeV2FloatingIPAssociateAssociated(&fip_2, &instance, 1), 125 ), 126 }, 127 }, 128 }) 129 } 130 131 func testAccCheckComputeV2FloatingIPAssociateDestroy(s *terraform.State) error { 132 config := testAccProvider.Meta().(*Config) 133 computeClient, err := config.computeV2Client(OS_REGION_NAME) 134 if err != nil { 135 return fmt.Errorf("Error creating OpenStack compute client: %s", err) 136 } 137 138 for _, rs := range s.RootModule().Resources { 139 if rs.Type != "openstack_compute_floatingip_associate_v2" { 140 continue 141 } 142 143 floatingIP, instanceId, _, err := parseComputeFloatingIPAssociateId(rs.Primary.ID) 144 if err != nil { 145 return err 146 } 147 148 instance, err := servers.Get(computeClient, instanceId).Extract() 149 if err != nil { 150 // If the error is a 404, then the instance does not exist, 151 // and therefore the floating IP cannot be associated to it. 152 if _, ok := err.(gophercloud.ErrDefault404); ok { 153 return nil 154 } 155 return err 156 } 157 158 // But if the instance still exists, then walk through its known addresses 159 // and see if there's a floating IP. 160 for _, networkAddresses := range instance.Addresses { 161 for _, element := range networkAddresses.([]interface{}) { 162 address := element.(map[string]interface{}) 163 if address["OS-EXT-IPS:type"] == "floating" { 164 return fmt.Errorf("Floating IP %s is still attached to instance %s", floatingIP, instanceId) 165 } 166 } 167 } 168 } 169 170 return nil 171 } 172 173 func testAccCheckComputeV2FloatingIPAssociateAssociated( 174 fip *floatingips.FloatingIP, instance *servers.Server, n int) resource.TestCheckFunc { 175 return func(s *terraform.State) error { 176 config := testAccProvider.Meta().(*Config) 177 computeClient, err := config.computeV2Client(OS_REGION_NAME) 178 179 newInstance, err := servers.Get(computeClient, instance.ID).Extract() 180 if err != nil { 181 return err 182 } 183 184 // Walk through the instance's addresses and find the match 185 i := 0 186 for _, networkAddresses := range newInstance.Addresses { 187 i += 1 188 if i != n { 189 continue 190 } 191 for _, element := range networkAddresses.([]interface{}) { 192 address := element.(map[string]interface{}) 193 if address["OS-EXT-IPS:type"] == "floating" && address["addr"] == fip.FloatingIP { 194 return nil 195 } 196 } 197 } 198 return fmt.Errorf("Floating IP %s was not attached to instance %s", fip.FloatingIP, instance.ID) 199 } 200 } 201 202 const testAccComputeV2FloatingIPAssociate_basic = ` 203 resource "openstack_compute_instance_v2" "instance_1" { 204 name = "instance_1" 205 security_groups = ["default"] 206 } 207 208 resource "openstack_networking_floatingip_v2" "fip_1" { 209 } 210 211 resource "openstack_compute_floatingip_associate_v2" "fip_1" { 212 floating_ip = "${openstack_networking_floatingip_v2.fip_1.address}" 213 instance_id = "${openstack_compute_instance_v2.instance_1.id}" 214 } 215 ` 216 217 const testAccComputeV2FloatingIPAssociate_fixedIP = ` 218 resource "openstack_compute_instance_v2" "instance_1" { 219 name = "instance_1" 220 security_groups = ["default"] 221 } 222 223 resource "openstack_networking_floatingip_v2" "fip_1" { 224 } 225 226 resource "openstack_compute_floatingip_associate_v2" "fip_1" { 227 floating_ip = "${openstack_networking_floatingip_v2.fip_1.address}" 228 instance_id = "${openstack_compute_instance_v2.instance_1.id}" 229 fixed_ip = "${openstack_compute_instance_v2.instance_1.access_ip_v4}" 230 } 231 ` 232 233 var testAccComputeV2FloatingIPAssociate_attachToFirstNetwork = fmt.Sprintf(` 234 resource "openstack_compute_instance_v2" "instance_1" { 235 name = "instance_1" 236 security_groups = ["default"] 237 238 network { 239 uuid = "%s" 240 } 241 } 242 243 resource "openstack_networking_floatingip_v2" "fip_1" { 244 } 245 246 resource "openstack_compute_floatingip_associate_v2" "fip_1" { 247 floating_ip = "${openstack_networking_floatingip_v2.fip_1.address}" 248 instance_id = "${openstack_compute_instance_v2.instance_1.id}" 249 fixed_ip = "${openstack_compute_instance_v2.instance_1.network.0.fixed_ip_v4}" 250 } 251 `, OS_NETWORK_ID) 252 253 var testAccComputeV2FloatingIPAssociate_attachToSecondNetwork = fmt.Sprintf(` 254 resource "openstack_networking_network_v2" "network_1" { 255 name = "network_1" 256 } 257 258 resource "openstack_networking_subnet_v2" "subnet_1" { 259 name = "subnet_1" 260 network_id = "${openstack_networking_network_v2.network_1.id}" 261 cidr = "192.168.1.0/24" 262 ip_version = 4 263 enable_dhcp = true 264 no_gateway = true 265 } 266 267 resource "openstack_compute_instance_v2" "instance_1" { 268 name = "instance_1" 269 security_groups = ["default"] 270 271 network { 272 uuid = "${openstack_networking_network_v2.network_1.id}" 273 } 274 275 network { 276 uuid = "%s" 277 } 278 } 279 280 resource "openstack_networking_floatingip_v2" "fip_1" { 281 } 282 283 resource "openstack_compute_floatingip_associate_v2" "fip_1" { 284 floating_ip = "${openstack_networking_floatingip_v2.fip_1.address}" 285 instance_id = "${openstack_compute_instance_v2.instance_1.id}" 286 fixed_ip = "${openstack_compute_instance_v2.instance_1.network.1.fixed_ip_v4}" 287 } 288 `, OS_NETWORK_ID) 289 290 const testAccComputeV2FloatingIPAssociate_attachNew_1 = ` 291 resource "openstack_compute_instance_v2" "instance_1" { 292 name = "instance_1" 293 security_groups = ["default"] 294 } 295 296 resource "openstack_networking_floatingip_v2" "fip_1" { 297 } 298 299 resource "openstack_networking_floatingip_v2" "fip_2" { 300 } 301 302 resource "openstack_compute_floatingip_associate_v2" "fip_1" { 303 floating_ip = "${openstack_networking_floatingip_v2.fip_1.address}" 304 instance_id = "${openstack_compute_instance_v2.instance_1.id}" 305 } 306 ` 307 308 const testAccComputeV2FloatingIPAssociate_attachNew_2 = ` 309 resource "openstack_compute_instance_v2" "instance_1" { 310 name = "instance_1" 311 security_groups = ["default"] 312 } 313 314 resource "openstack_networking_floatingip_v2" "fip_1" { 315 } 316 317 resource "openstack_networking_floatingip_v2" "fip_2" { 318 } 319 320 resource "openstack_compute_floatingip_associate_v2" "fip_1" { 321 floating_ip = "${openstack_networking_floatingip_v2.fip_2.address}" 322 instance_id = "${openstack_compute_instance_v2.instance_1.id}" 323 } 324 `