@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(); }
Optional<Set<String>> poolNames = input.get().getNovaTemplateOptions().get().getFloatingIpPoolNames(); String availabilityZone = getAvailabilityZoneFromTemplateOptionsOrDefault(input, regionId); if (isNeutronLinked()) { org.jclouds.openstack.neutron.v2.features.FloatingIPApi neutronFloatingApi = getFloatingIPApi(regionId); final Optional<Port> optionalPort = getPortApi(regionId).list().concat().firstMatch(new Predicate<Port>() { @Override public boolean apply(@Nullable Port input) { Optional<org.jclouds.openstack.neutron.v2.domain.FloatingIP> floatingIPOptional = tryFindExistingFloatingIp(neutronFloatingApi, availabilityZone); org.jclouds.openstack.neutron.v2.domain.FloatingIP floatingIP; if (floatingIPOptional.isPresent()) { floatingIP = floatingIPOptional.get(); } else { floatingIP = createFloatingIpUsingNeutron(neutronFloatingApi, node, poolNames, availabilityZone); FloatingIPApi floatingIpApi = novaApi.getFloatingIPApi(regionId).get(); Optional<FloatingIP> ip = allocateFloatingIPForNodeOnNova(floatingIpApi, poolNames, node.getId()); if (!ip.isPresent()) { cleanupResources.apply(node);
/** * Get all suitable networks to allocate a floating ip * * It will prefer networks specified using the poolNames first and then the external networks in the given availability zone */ private List<Network> getSuitableNetworks(String regionId, final String availabilityZone, final Set<String> poolNames) { List<Network> allNetworks = getNetworkApi(regionId).list().concat().toList(); Iterable<Network> externalNetworks = Iterables.filter(allNetworks, Networks.Predicates.externalNetworks(availabilityZone)); Iterable<Network> networksFromPoolName = Iterables.filter(allNetworks, Networks.Predicates.namedNetworks(poolNames)); return Lists.newArrayList(Iterables.concat(networksFromPoolName, externalNetworks)); }
public void testAllocateWhenAllocationReturnsIpIsAddedToServerAndUpdatesNodeMetadataButSavesCredentials() throws Exception { HttpResponse createFloatingIPResponse = HttpResponse.builder().statusCode(200).payload( payloadFromResource("/floatingip_details.json")).build(); HttpRequest addFloatingIPRequest = addFloatingIPForAddress("10.0.0.3"); AllocateAndAddFloatingIpToNode fn = requestsSendResponses( ImmutableMap.<HttpRequest, HttpResponse> builder().put(keystoneAuthWithUsernameAndPasswordAndTenantName, responseWithKeystoneAccess).put(extensionsOfNovaRequest, extensionsOfNovaResponse).put( createFloatingIP, createFloatingIPResponse) .put(addFloatingIPRequest, addFloatingIPResponse).build()).getContext().utils().injector() .getInstance(AllocateAndAddFloatingIpToNode.class); AtomicReference<NodeMetadata> nodeRef = Atomics.newReference(node); fn.apply(nodeRef); NodeMetadata node1 = nodeRef.get(); assertNotNull(node1); assertEquals(node1.getPublicAddresses(), ImmutableSet.of("10.0.0.3")); assertEquals(node1.getCredentials(), node.getCredentials()); }
private org.jclouds.openstack.neutron.v2.domain.FloatingIP createFloatingIpUsingNeutron(org.jclouds.openstack.neutron.v2.features.FloatingIPApi neutronFloatingApi, NodeMetadata node, Optional<Set<String>> poolNames, final String availabilityZone) { String regionId = node.getLocation().getParent().getId(); List<Network> networks = getSuitableNetworks(regionId, availabilityZone, poolNames.or(Sets.<String>newHashSet())); org.jclouds.openstack.neutron.v2.domain.FloatingIP floatingIP = null; for (Network network : networks) { try { logger.debug(">> allocating floating IP from network %s for node(%s)", network, node); org.jclouds.openstack.neutron.v2.domain.FloatingIP createFloatingIP = org.jclouds.openstack.neutron.v2.domain.FloatingIP.CreateFloatingIP.createBuilder(network.getId()).availabilityZone(network.getAvailabilityZone()).build(); floatingIP = neutronFloatingApi.create((org.jclouds.openstack.neutron.v2.domain.FloatingIP.CreateFloatingIP) createFloatingIP); logger.debug(">> allocated floating IP(%s) from network(%s) for node(%s)", floatingIP, network, node); floatingIpCache.asMap().put(RegionAndId.fromSlashEncoded(node.getId()), ImmutableList.of(FloatingIpForServer.create(RegionAndId.fromSlashEncoded(node.getId()), floatingIP.getId(), floatingIP.getFloatingIpAddress()))); return floatingIP; } catch (Exception ex) { logger.trace("<< [%s] failed to allocate a floating IP from network %s for node(%s)", ex.getMessage(), network, node); } } throw new IllegalStateException("Failed to allocate a floating IP for node " + node + ".\n" + "Failed to find suitable external networks or to allocate from poolNames specified: " + Iterables.toString(poolNames.get())); }
fn.apply(nodeRef); NodeMetadata node1 = nodeRef.get(); assertNotNull(node1);
private org.jclouds.openstack.neutron.v2.domain.FloatingIP createFloatingIpUsingNeutron(org.jclouds.openstack.neutron.v2.features.FloatingIPApi neutronFloatingApi, NodeMetadata node, Optional<Set<String>> poolNames, final String availabilityZone) { String regionId = node.getLocation().getParent().getId(); List<Network> networks = getSuitableNetworks(regionId, availabilityZone, poolNames.or(Sets.<String>newHashSet())); org.jclouds.openstack.neutron.v2.domain.FloatingIP floatingIP = null; for (Network network : networks) { try { logger.debug(">> allocating floating IP from network %s for node(%s)", network, node); org.jclouds.openstack.neutron.v2.domain.FloatingIP createFloatingIP = org.jclouds.openstack.neutron.v2.domain.FloatingIP.CreateFloatingIP.createBuilder(network.getId()).availabilityZone(network.getAvailabilityZone()).build(); floatingIP = neutronFloatingApi.create((org.jclouds.openstack.neutron.v2.domain.FloatingIP.CreateFloatingIP) createFloatingIP); logger.debug(">> allocated floating IP(%s) from network(%s) for node(%s)", floatingIP, network, node); floatingIpCache.asMap().put(RegionAndId.fromSlashEncoded(node.getId()), ImmutableList.of(FloatingIpForServer.create(RegionAndId.fromSlashEncoded(node.getId()), floatingIP.getId(), floatingIP.getFloatingIpAddress()))); return floatingIP; } catch (Exception ex) { logger.trace("<< [%s] failed to allocate a floating IP from network %s for node(%s)", ex.getMessage(), network, node); } } throw new IllegalStateException("Failed to allocate a floating IP for node " + node + ".\n" + "Failed to find suitable external networks or to allocate from poolNames specified: " + Iterables.toString(poolNames.get())); }
Optional<Set<String>> poolNames = input.get().getNovaTemplateOptions().get().getFloatingIpPoolNames(); String availabilityZone = getAvailabilityZoneFromTemplateOptionsOrDefault(input, regionId); if (isNeutronLinked()) { org.jclouds.openstack.neutron.v2.features.FloatingIPApi neutronFloatingApi = getFloatingIPApi(regionId); final Optional<Port> optionalPort = getPortApi(regionId).list().concat().firstMatch(new Predicate<Port>() { @Override public boolean apply(@Nullable Port input) { Optional<org.jclouds.openstack.neutron.v2.domain.FloatingIP> floatingIPOptional = tryFindExistingFloatingIp(neutronFloatingApi, availabilityZone); org.jclouds.openstack.neutron.v2.domain.FloatingIP floatingIP; if (floatingIPOptional.isPresent()) { floatingIP = floatingIPOptional.get(); } else { floatingIP = createFloatingIpUsingNeutron(neutronFloatingApi, node, poolNames, availabilityZone); FloatingIPApi floatingIpApi = novaApi.getFloatingIPApi(regionId).get(); Optional<FloatingIP> ip = allocateFloatingIPForNodeOnNova(floatingIpApi, poolNames, node.getId()); if (!ip.isPresent()) { cleanupResources.apply(node);
AtomicReference<NodeAndNovaTemplateOptions> nodeNovaRef = NodeAndNovaTemplateOptions.newAtomicReference(nodeRef, optionsRef); fn.apply(nodeNovaRef); NodeMetadata node1 = nodeRef.get(); assertNotNull(node1);
/** * Get all suitable networks to allocate a floating ip * * It will prefer networks specified using the poolNames first and then the external networks in the given availability zone */ private List<Network> getSuitableNetworks(String regionId, final String availabilityZone, final Set<String> poolNames) { List<Network> allNetworks = getNetworkApi(regionId).list().concat().toList(); Iterable<Network> externalNetworks = Iterables.filter(allNetworks, Networks.Predicates.externalNetworks(availabilityZone)); Iterable<Network> networksFromPoolName = Iterables.filter(allNetworks, Networks.Predicates.namedNetworks(poolNames)); return Lists.newArrayList(Iterables.concat(networksFromPoolName, externalNetworks)); }
AtomicReference<NodeAndNovaTemplateOptions> nodeNovaRef = NodeAndNovaTemplateOptions.newAtomicReference(nodeRef, optionsRef); fn.apply(nodeNovaRef); NodeMetadata node1 = nodeRef.get(); assertNotNull(node1);
AtomicReference<NodeAndNovaTemplateOptions> nodeNovaRef = NodeAndNovaTemplateOptions.newAtomicReference(nodeRef, optionsRef); fn.apply(nodeNovaRef); NodeMetadata node1 = nodeRef.get(); assertNotNull(node1);