package net.onrc.onos.core.linkdiscovery.internal;

import net.floodlightcontroller.core.web.serializers.DPIDSerializer;

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

/**
 * Topology Cluster merge/split event history related classes and members
 *
 * @author subrata
 */
public class EventHistoryTopologyCluster {
    // The following fields are not stored as String to save memory
    // They should be converted to appropriate human-readable strings by
    // the front end (e.g. in cli in Python)
    public long dpid;
    public long clusterIdOld; // Switch with dpid moved from cluster x to y
    public long clusterIdNew;
    public String reason;

    @JsonProperty("Switch")
    @JsonSerialize(using = DPIDSerializer.class)
    public long getDpid() {
        return dpid;
    }

    @JsonProperty("OldClusterId")
    @JsonSerialize(using = DPIDSerializer.class)
    public long getClusterIdOld() {
        return clusterIdOld;
    }

    @JsonProperty("NewClusterId")
    @JsonSerialize(using = DPIDSerializer.class)
    public long getClusterIdNew() {
        return clusterIdNew;
    }

    @JsonProperty("Reason")
    public String getReason() {
        return reason;
    }


}
