try { logger.debug(">> allocating or reassigning floating ip for node(%s)", node.getId()); ip = floatingIpApi.create(); } catch (InsufficientResourcesException e) { logger.trace("<< [%s] allocating a new floating ip for node(%s)", e.getMessage(), node.getId()); logger.trace(">> searching for existing, unassigned floating ip for node(%s)", node.getId()); ArrayList<FloatingIP> unassignedIps = Lists.newArrayList(Iterables.filter(floatingIpApi.list(), new Predicate<FloatingIP>() { floatingIpApi.addToServer(ip.getIp(), node.getProviderId()); input.set(NodeMetadataBuilder.fromNodeMetadata(node).publicAddresses(ImmutableSet.of(ip.getIp())).build()); floatingIpCache.invalidate(ZoneAndId.fromSlashEncoded(node.getId()));
@Override public ZoneAndId apply(ZoneAndId id) { FloatingIPApi floatingIpApi = novaApi.getFloatingIPExtensionForZone(id.getZone()).get(); for (FloatingIP ip : floatingIpCache.getUnchecked(id)) { logger.debug(">> removing floatingIp(%s) from node(%s)", ip, id); floatingIpApi.removeFromServer(ip.getIp(), id.getId()); logger.debug(">> deallocating floatingIp(%s)", ip); floatingIpApi.delete(ip.getId()); } floatingIpCache.invalidate(id); return id; }
try { logger.debug(">> allocating floating IP from pool %s for node(%s)", poolName, nodeID); ip = floatingIpApi.allocateFromPool(poolName); return Optional.of(ip); } catch (ResourceNotFoundException ex) { ip = floatingIpApi.create(); return Optional.of(ip); } catch (ResourceNotFoundException ex) { List<FloatingIP> unassignedIps = Lists.newArrayList(Iterables.filter(floatingIpApi.list(), new Predicate<FloatingIP>() {
public org.jclouds.openstack.nova.v2_0.domain.FloatingIP associateFloationgIpToServer(String serverId, String poolName) { org.jclouds.openstack.nova.v2_0.domain.FloatingIP floatingIp = novaFloatingIPApi.allocateFromPool(poolName); novaFloatingIPApi.addToServer(floatingIp.getIp(), serverId); return floatingIp; }
@Test public void testAddAndRemoveFloatingIp() throws Exception { for (String zoneId : api.getConfiguredZones()) { Optional<? extends FloatingIPApi> apiOption = api.getFloatingIPExtensionForZone(zoneId); if (!apiOption.isPresent()) continue; FloatingIPApi api = apiOption.get(); ServerApi serverApi = this.api.getServerApiForZone(zoneId); Server server = createServerInZone(zoneId); FloatingIP floatingIP = api.create(); assertNotNull(floatingIP); try { api.addToServer(floatingIP.getIp(), server.getId()); assertEventually(new ServerHasFloatingIP(serverApi, server.getId(), floatingIP.getIp())); } finally { api.removeFromServer(floatingIP.getIp(), server.getId()); serverApi.delete(server.getId()); } } }
@Test public void testAllocateAndDecreateFloatingIPs() throws Exception { for (String zoneId : api.getConfiguredZones()) { Optional<? extends FloatingIPApi> apiOption = api.getFloatingIPExtensionForZone(zoneId); if (!apiOption.isPresent()) continue; FloatingIPApi api = apiOption.get(); FloatingIP floatingIP = api.create(); assertNotNull(floatingIP); Set<? extends FloatingIP> response = api.list().toSet(); boolean ipInSet = false; for (FloatingIP ip : response) { if (ip.getId().equals(floatingIP.getId())) ipInSet = true; } assertTrue(ipInSet); api.delete(floatingIP.getId()); response = api.list().toSet(); ipInSet = false; for (FloatingIP ip : response) { if (ip.getId().equals(floatingIP.getId())) { ipInSet = true; } } assertFalse(ipInSet); } }
@Override public Iterable<? extends FloatingIP> load(final ZoneAndId key) throws Exception { String zone = key.getZone(); Optional<? extends FloatingIPApi> ipApiOptional = api.getFloatingIPExtensionForZone(zone); if (ipApiOptional.isPresent()) { return ipApiOptional.get().list().filter( new Predicate<FloatingIP>() { @Override public boolean apply(FloatingIP input) { return key.getId().equals(input.getInstanceId()); } }); } return ImmutableSet.of(); } }
@Override public AtomicReference<NodeMetadata> apply(AtomicReference<NodeAndNovaTemplateOptions> input) { checkState(nodeRunning.apply(input.get().getNodeMetadata()), "node never achieved state running %s", input.get().getNodeMetadata()); NodeMetadata node = input.get().getNodeMetadata().get(); // node's location is a host String regionId = node.getLocation().getParent().getId(); FloatingIPApi floatingIpApi = novaApi.getFloatingIPApi(regionId).get(); Optional<Set<String>> poolNames = input.get().getNovaTemplateOptions().get().getFloatingIpPoolNames(); Optional<FloatingIP> ip = allocateFloatingIPForNode(floatingIpApi, poolNames, node.getId()); if (!ip.isPresent()) { cleanupServer.apply(node.getId()); throw new InsufficientResourcesException("Failed to allocate a FloatingIP for node(" + node.getId() + ")"); } logger.debug(">> adding floatingIp(%s) to node(%s)", ip.get().getIp(), node.getId()); floatingIpApi.addToServer(ip.get().getIp(), node.getProviderId()); input.get().getNodeMetadata().set(NodeMetadataBuilder.fromNodeMetadata(node).publicAddresses(ImmutableSet.of(ip.get().getIp())).build()); floatingIpCache.asMap().putIfAbsent(RegionAndId.fromSlashEncoded(node.getId()), ImmutableList.of(ip.get())); return input.get().getNodeMetadata(); }
@Test public void testListFloatingIPs() throws Exception { for (String zoneId : api.getConfiguredZones()) { Optional<? extends FloatingIPApi> apiOption = api.getFloatingIPExtensionForZone(zoneId); if (!apiOption.isPresent()) continue; FloatingIPApi api = apiOption.get(); Set<? extends FloatingIP> response = api.list().toSet(); assert null != response; assertTrue(response.size() >= 0); for (FloatingIP ip : response) { FloatingIP newDetails = api.get(ip.getId()); assertEquals(newDetails.getId(), ip.getId()); assertEquals(newDetails.getIp(), ip.getIp()); assertEquals(newDetails.getFixedIp(), ip.getFixedIp()); assertEquals(newDetails.getInstanceId(), ip.getInstanceId()); } } }
public void testAllocateWhenResponseIs404() throws Exception { HttpRequest createFloatingIP = HttpRequest .builder() .method("POST") .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-floating-ips") .addHeader("Accept", "application/json") .addHeader("X-Auth-Token", authToken) .payload(payloadFromStringWithContentType("{}", "application/json")).build(); HttpResponse createFloatingIPResponse = HttpResponse.builder().statusCode(404).build(); NovaApi apiWhenNoServersExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName, responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, createFloatingIP, createFloatingIPResponse); assertNull(apiWhenNoServersExist.getFloatingIPExtensionForZone("az-1.region-a.geo-1").get().create()); }
public void testAllocateWithPoolNameWhenResponseIs2xx() throws Exception { HttpRequest createFloatingIP = HttpRequest .builder() .method("POST") .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-floating-ips") .addHeader("Accept", "application/json") .addHeader("X-Auth-Token", authToken) .payload(payloadFromStringWithContentType("{\"pool\":\"myPool\"}", "application/json")).build(); HttpResponse createFloatingIPResponse = HttpResponse.builder().statusCode(200) .payload(payloadFromResource("/floatingip_details.json")).build(); NovaApi apiWhenFloatingIPsExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName, responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, createFloatingIP, createFloatingIPResponse); assertEquals(apiWhenFloatingIPsExist.getFloatingIPExtensionForZone("az-1.region-a.geo-1").get().allocateFromPool("myPool").toString(), new ParseFloatingIPTest().expected().toString()); } }
public void testGetFloatingIPWhenResponseIs404() throws Exception { HttpRequest get = HttpRequest .builder() .method("GET") .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-floating-ips/1") .addHeader("Accept", "application/json") .addHeader("X-Auth-Token", authToken).build(); HttpResponse getResponse = HttpResponse.builder().statusCode(404).build(); NovaApi apiWhenNoServersExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName, responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, get, getResponse); assertNull(apiWhenNoServersExist.getFloatingIPExtensionForZone("az-1.region-a.geo-1").get().get("1")); }
@Test public void testAddAndRemoveFloatingIp() throws Exception { for (String regionId : api.getConfiguredRegions()) { Optional<? extends FloatingIPApi> apiOption = api.getFloatingIPApi(regionId); if (!apiOption.isPresent()) continue; FloatingIPApi api = apiOption.get(); ServerApi serverApi = this.api.getServerApi(regionId); Server server = createServerInRegion(regionId); FloatingIP floatingIP = api.create(); assertNotNull(floatingIP); try { api.addToServer(floatingIP.getIp(), server.getId()); assertEventually(new ServerHasFloatingIP(serverApi, server.getId(), floatingIP.getIp())); } finally { api.removeFromServer(floatingIP.getIp(), server.getId()); serverApi.delete(server.getId()); } } }
@Test public void testAllocateAndDecreateFloatingIPs() throws Exception { for (String regionId : api.getConfiguredRegions()) { Optional<? extends FloatingIPApi> apiOption = api.getFloatingIPApi(regionId); if (!apiOption.isPresent()) continue; FloatingIPApi api = apiOption.get(); FloatingIP floatingIP = api.create(); assertNotNull(floatingIP); Set<? extends FloatingIP> response = api.list().toSet(); boolean ipInSet = false; for (FloatingIP ip : response) { if (ip.getId().equals(floatingIP.getId())) ipInSet = true; } assertTrue(ipInSet); api.delete(floatingIP.getId()); response = api.list().toSet(); ipInSet = false; for (FloatingIP ip : response) { if (ip.getId().equals(floatingIP.getId())) { ipInSet = true; } } assertFalse(ipInSet); } }
@Override public Iterable<? extends FloatingIP> load(final ZoneAndId key) throws Exception { String zone = key.getZone(); Optional<? extends FloatingIPApi> ipApiOptional = api.getFloatingIPExtensionForZone(zone); if (ipApiOptional.isPresent()) { return ipApiOptional.get().list().filter( new Predicate<FloatingIP>() { @Override public boolean apply(FloatingIP input) { return key.getId().equals(input.getInstanceId()); } }); } return ImmutableSet.of(); } }
floatingIpApi.addToServer(ip.get().getIp(), node.getProviderId()); input.get().getNodeMetadata().set(NodeMetadataBuilder.fromNodeMetadata(node).publicAddresses(ImmutableSet.of(ip.get().getIp())).build()); floatingIpCache.asMap().put(RegionAndId.fromSlashEncoded(node.getId()), ImmutableList.of(FloatingIpForServer.create(RegionAndId.fromSlashEncoded(node.getId()), ip.get().getId(), ip.get().getIp())));
@Test public void testListFloatingIPs() throws Exception { for (String regionId : api.getConfiguredRegions()) { Optional<? extends FloatingIPApi> apiOption = api.getFloatingIPApi(regionId); if (!apiOption.isPresent()) continue; FloatingIPApi api = apiOption.get(); Set<? extends FloatingIP> response = api.list().toSet(); assert null != response; assertTrue(response.size() > 0); for (FloatingIP ip : response) { FloatingIP newDetails = api.get(ip.getId()); assertEquals(newDetails.getId(), ip.getId()); assertEquals(newDetails.getIp(), ip.getIp()); assertEquals(newDetails.getFixedIp(), ip.getFixedIp()); assertEquals(newDetails.getInstanceId(), ip.getInstanceId()); assertEquals(newDetails.getPool(), ip.getPool()); } } }
public void testAllocateWhenResponseIs2xx() throws Exception { HttpRequest createFloatingIP = HttpRequest .builder() .method("POST") .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-floating-ips") .addHeader("Accept", "application/json") .addHeader("X-Auth-Token", authToken) .payload(payloadFromStringWithContentType("{}", "application/json")).build(); HttpResponse createFloatingIPResponse = HttpResponse.builder().statusCode(200) .payload(payloadFromResource("/floatingip_details.json")).build(); NovaApi apiWhenFloatingIPsExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName, responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, createFloatingIP, createFloatingIPResponse); assertEquals(apiWhenFloatingIPsExist.getFloatingIPExtensionForZone("az-1.region-a.geo-1").get().create().toString(), new ParseFloatingIPTest().expected().toString()); }
public void testAllocateWithPoolNameWhenResponseIs2xx() throws Exception { HttpRequest createFloatingIP = HttpRequest .builder() .method("POST") .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v2/3456/os-floating-ips") .addHeader("Accept", "application/json") .addHeader("X-Auth-Token", authToken) .payload(payloadFromStringWithContentType("{\"pool\":\"myPool\"}", "application/json")).build(); HttpResponse createFloatingIPResponse = HttpResponse.builder().statusCode(200) .payload(payloadFromResource("/floatingip_details.json")).build(); NovaApi apiWhenFloatingIPsExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName, responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, createFloatingIP, createFloatingIPResponse); assertEquals(apiWhenFloatingIPsExist.getFloatingIPApi("az-1.region-a.geo-1").get().allocateFromPool("myPool").toString(), new ParseFloatingIPTest().expected().toString()); } }
public void testGetFloatingIPWhenResponseIs2xx() throws Exception { HttpRequest get = HttpRequest .builder() .method("GET") .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-floating-ips/1") .addHeader("Accept", "application/json") .addHeader("X-Auth-Token", authToken).build(); HttpResponse getResponse = HttpResponse.builder().statusCode(200) .payload(payloadFromResource("/floatingip_details.json")).build(); NovaApi apiWhenFloatingIPsExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName, responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, get, getResponse); assertEquals(apiWhenFloatingIPsExist.getFloatingIPExtensionForZone("az-1.region-a.geo-1").get().get("1") .toString(), new ParseFloatingIPTest().expected().toString()); }