package com.eucalyptus.address; import java.util.ArrayList; 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 StaticSystemAddressManager extends AbstractSystemAddressManager { private static Logger LOG = Logger.getLogger( StaticSystemAddressManager.class ); public StaticSystemAddressManager( ) { this.inheritReservedAddresses( new ArrayList<Address>() ); } public List<Address> allocateSystemAddresses( String cluster, int count ) throws NotEnoughResourcesAvailable { List<Address> addressList = Lists.newArrayList( ); for ( Address addr : Addresses.getInstance( ).listValues( ) ) { if ( addr.isSystemOwned( ) && !addr.isAssigned( ) ) { addr.pendingAssignment( ); addressList.add( addr ); if ( addressList.size( ) == count ) { break; } } } if ( addressList.size( ) < count ) { for ( Address putBackAddr : addressList ) { putBackAddr.clearPending( ); } throw new NotEnoughResourcesAvailable( "Not enough resources available: addresses (try --addressing private)" ); } return addressList; } @Override public void assignSystemAddress( VmInstance vm ) throws NotEnoughResourcesAvailable { Address addr = this.getNext( ); AddressCategory.assign( addr, vm ).dispatch( addr.getCluster( ) ); } private Address getNext() throws NotEnoughResourcesAvailable { for( Address a : Addresses.getInstance( ).listValues( ) ) { if( a.isSystemOwned( ) && !a.isAssigned( ) ) { return a.pendingAssignment( ); } } throw new NotEnoughResourcesAvailable( "Not enough resources available: addresses (try --addressing private)" ); } @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( ); } })); } @Override public void inheritReservedAddresses( List<Address> reservedAddresses ) { int allocCount = Addresses.getSystemReservedAddressCount( ) - reservedAddresses.size( ); LOG.debug( "Allocating additional " + allocCount + " addresses in static public addresing mode" ); allocCount = Addresses.getInstance( ).listDisabledValues( ).size( ) < allocCount ? Addresses.getInstance( ).listDisabledValues( ).size( ) : allocCount; if ( allocCount > 0 ) { for ( int i = 0; i < allocCount; i++ ) { try { this.allocateNext( Component.eucalyptus.name( ) ); } catch ( NotEnoughResourcesAvailable e ) { break; } } } else { for ( Address addr : Addresses.getInstance( ).listValues( ) ) { if ( Component.eucalyptus.name( ).equals( addr.getUserId( ) ) && !addr.isAssigned( ) && !addr.isPending( ) ) { addr.release( ); if ( allocCount++ >= 0 ) break; } } } } }