package net.onrc.onos.core.topology;

import net.floodlightcontroller.util.MACAddress;
import net.onrc.onos.core.topology.web.serializers.HostSerializer;

import org.codehaus.jackson.map.annotate.JsonSerialize;

/**
 * Interface of Host Object exposed to the "NB" read-only Topology.
 * <p/>
 * TODO What a Host Object represent is unclear at the moment.
 * <p/>
 * Everything returned by these interfaces must be either Unmodifiable view,
 * immutable object, or a copy of the original "SB" In-memory Topology.
 */
@JsonSerialize(using = HostSerializer.class)
public interface Host extends ITopologyElement {
    /**
     * Gets the Host MAC address.
     *
     * @return the Host MAC address.
     */
    public MACAddress getMacAddress();

    /**
     * Gets the Host attachment points.
     * <p/>
     * TODO: There is only 1 attachment point right now.
     * TODO: Add requirement for Iteration order? Latest observed port first.
     *
     * @return the Host attachment points.
     */
    public Iterable<Port> getAttachmentPoints();

    /**
     * Gets the Host last seen time.
     * <p/>
     *
     * @return the Host last seen time. (UTC in ms)
     */
    public long getLastSeenTime();
}
