package net.onrc.onos.ofcontroller.core;

import java.util.List;

import net.floodlightcontroller.routing.Link;
import net.onrc.onos.ofcontroller.linkdiscovery.LinkInfo;

public interface ILinkStorage extends INetMapStorage {
	
    /*
     * Link creation
     */
	public void update(Link link, DM_OPERATION op);
	public void update(Link link, LinkInfo linkinfo, DM_OPERATION op);
	public void update(List<Link> List, DM_OPERATION op);

	/*
	 *  Add Linkinfo
	 */
	public void updateLink (Link link, LinkInfo linkinfo, DM_OPERATION op);
	
	/*
	 * Delete a single link
	 */
	public void deleteLink(Link link);

	/*
	 * Delete links associated with dpid and port 
	 * If only dpid is used, All links associated for switch are removed
	 * Useful for port up/down and also switch join/remove events
	 */ 
	public void deleteLinksOnPort(Long dpid, short port);
	
	/*
	 * Delete a list of links
	 */
	public void deleteLinks(List<Link> links);

	/*
	 * Get Links from Storage
	 *  If dpid and port both are specified specific link is retrieved
	 *  If only dpid is set all links associated with Switch are retrieved
	 */
	public List<Link> getLinks(Long dpid, short port);
	public List<Link> getLinks(String dpid);
	public List<Link> getActiveLinks();
	
	/*
	 * Init with Storage conf
	 */
	public void init(String conf);

}
