code: private boolean associateFloatingIp() {
  
  		// Associating a floating IP requires a client-side synchronization
  		// since Openstack does not provide it. Indeed, it can associate a floating IP to a new
  		// server, even if this address was already associated with another one.
  		String floatingIpPool = this.targetProperties.get( FLOATING_IP_POOL );
  		if (Utils.isEmptyOrWhitespaces(floatingIpPool))
  			return true;
  
  		// Protected section to prevent using a same IP for several machines.
  		// An action is already in progress for this URL?
  		// Then return immediately, we will try in the next scheduled run.
  		String url = this.targetProperties.get( API_URL );
  		if (URL_TO_LOCK.putIfAbsent(url, new Object()) != null)
  			return false;
  
  		// Deal with the association.
  		boolean done = false;
  		try {
  			// Find a floating IP
  			String availableIp = null;
  			String zoneName = OpenstackIaasHandler.findZoneName( this.novaApi, this.targetProperties );
  			FloatingIPApi floatingIPApi = this.novaApi.getFloatingIPExtensionForZone( zoneName ).get();
  			for(FloatingIP ip : floatingIPApi.list().toList()) {
  				if (ip.getFixedIp() == null) {
  					availableIp = ip.getIp();
  					break;
  				}
  			}
  
  			// And associate it
  			if (availableIp != null) {
  				floatingIPApi.addToServer(availableIp, this.machineId);
  				this.scopedInstance.data.put( OpenstackIaasHandler.FLOATING_IP, availableIp );
  
  			} else {
  				this.logger.warning("No floating IP was available in Openstack (pool '" + floatingIpPool + "').");
  			}
  
  			done = true;
  
  		} finally {
  			URL_TO_LOCK.remove(url);
  		}
  
  		return done;
  	}
docs: Associates a floating IP to the VM (if necessary and if possible).
  @return true if this operation successfully completed, false otherwise