package com.eucalyptus.cluster.handlers;
import java.util.List;
import java.util.NoSuchElementException;
import org.apache.log4j.Logger;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelPipelineCoverage;
import org.jboss.netty.channel.MessageEvent;
import com.eucalyptus.address.Address;
import com.eucalyptus.address.Addresses;
import com.eucalyptus.address.ClusterAddressInfo;
import com.eucalyptus.binding.BindingException;
import com.eucalyptus.bootstrap.Component;
import com.eucalyptus.cluster.Cluster;
import com.eucalyptus.cluster.event.NewClusterEvent;
import com.eucalyptus.event.ClockTick;
import com.eucalyptus.event.Event;
import com.eucalyptus.event.GenericEvent;
import com.eucalyptus.http.MappingHttpResponse;
import com.eucalyptus.util.LogUtil;
import edu.ucsb.eucalyptus.cloud.Pair;
import edu.ucsb.eucalyptus.msgs.DescribePublicAddressesResponseType;
import edu.ucsb.eucalyptus.msgs.DescribePublicAddressesType;
@ChannelPipelineCoverage( "one" )
public class AddressStateHandler extends AbstractClusterMessageDispatcher {
private static Logger LOG = Logger.getLogger( NetworkStateHandler.class );
public AddressStateHandler( Cluster cluster ) throws BindingException {
super( cluster );
}
@Override
public void trigger( ) {
DescribePublicAddressesType drMsg = new DescribePublicAddressesType( );
drMsg.setUserId( Component.eucalyptus.name( ) );
drMsg.setEffectiveUserId( Component.eucalyptus.name( ) );
this.write( drMsg );
}
@Override
public void fireEvent( Event event ) {
if ( event instanceof ClockTick ) {
this.trigger( );
} else if ( event instanceof GenericEvent ) {
GenericEvent<Cluster> g = ( GenericEvent<Cluster> ) event;
if ( !g.matches( this.getCluster( ) ) ) {
return;
}
if ( g instanceof NewClusterEvent ) {
this.trigger( );
}
} else {
LOG.trace( "Ignoring unknown event: " + LogUtil.dumpObject( event ) );
}
}
@Override
public void upstreamMessage( ChannelHandlerContext ctx, MessageEvent e ) {
if ( e.getMessage( ) instanceof MappingHttpResponse ) {
MappingHttpResponse resp = ( MappingHttpResponse ) e.getMessage( );
DescribePublicAddressesResponseType reply = ( DescribePublicAddressesResponseType ) resp.getMessage( );
this.getCluster( ).getState( ).setPublicAddressing( reply.get_return( ) );
if ( reply.get_return( ) ) {
List<ClusterAddressInfo> addrInfo = ClusterAddressInfo.fromLists( reply.getAddresses( ), reply.getMapping( ) );
if ( addrInfo != null ) {
Addresses.getAddressManager( ).update( this.getCluster( ), addrInfo );
}
} else {
LOG.warn( "Response from cluster [" + this.getCluster( ).getName( ) + "]: " + reply.getStatusMessage( ) );
}
this.verified = true;
}
}
public static Address getAddress( String cluster, Pair p ) {
Address address;
try {
try {
address = Addresses.getInstance( ).lookup( p.getLeft( ) );
} catch ( NoSuchElementException e1 ) {
address = Addresses.getInstance( ).lookupDisabled( p.getLeft( ) );
}
} catch ( NoSuchElementException e ) {
LOG.debug( e );
address = new Address( p.getLeft( ), cluster );
address.init( );
}
return address;
}
@Override
public void advertiseEvent( Event event ) {}
}