package com.eucalyptus.address; import java.util.List; import org.apache.log4j.Logger; import com.eucalyptus.bootstrap.Component; import com.eucalyptus.cluster.VmInstance; import com.eucalyptus.util.NotEnoughResourcesAvailable; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; public class DynamicSystemAddressManager extends AbstractSystemAddressManager { private static Logger LOG = Logger.getLogger( DynamicSystemAddressManager.class ); @Override public List<Address> allocateSystemAddresses( String cluster, int count ) throws NotEnoughResourcesAvailable { List<Address> addressList = Lists.newArrayList( ); if ( Addresses.getInstance( ).listDisabledValues( ).size( ) < count ) throw new NotEnoughResourcesAvailable( "Not enough resources available: addresses (try --addressing private)" ); for ( Address addr : Addresses.getInstance( ).listDisabledValues( ) ) { try { if ( cluster.equals( addr.getCluster( ) ) && addressList.add( addr.pendingAssignment( ) ) && --count == 0 ) break; } catch ( IllegalStateException e ) { LOG.trace( e , e ); } } if ( count != 0 ) { for( Address addr : addressList ) { try { addr.release( ); } catch ( IllegalStateException e ) { LOG.error( e , e ); } } throw new NotEnoughResourcesAvailable( "Not enough resources available: addresses (try --addressing private)" ); } return addressList; } @Override public void assignSystemAddress( VmInstance vm ) throws NotEnoughResourcesAvailable { Address addr = this.allocateSystemAddresses( vm.getPlacement( ), 1 ).get( 0 ); AddressCategory.assign( addr, vm ).dispatch( addr.getCluster( ) ); } @Override public List<Address> getReservedAddresses( ) { return Lists.newArrayList( Iterables.filter( Addresses.getInstance( ).listValues( ), new Predicate<Address>( ) { @Override public boolean apply( Address arg0 ) { return arg0.isSystemOwned( ); } } ) ); } @SuppressWarnings( "unchecked" ) @Override public void inheritReservedAddresses( List<Address> previouslyReservedAddresses ) { for ( final Address addr : previouslyReservedAddresses ) { if( !addr.isAssigned( ) && !addr.isPending() && addr.isSystemOwned() && Address.UNASSIGNED_INSTANCEID.equals( addr.getInstanceId() ) ) { Addresses.release( addr ); } } } }