Initial cut at Leadership Manager

Change-Id: I658c6fca3dc6f686e0f7facc9e7b443679ebae1e

Change-Id: I293906add41ff4310e3584847d806345e0312703

Change-Id: I7fb13a72ba4aef10d7c2262b96e0df64efecfcef
diff --git a/core/api/src/main/java/org/onlab/onos/cluster/Leadership.java b/core/api/src/main/java/org/onlab/onos/cluster/Leadership.java
new file mode 100644
index 0000000..c370ab5
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/cluster/Leadership.java
@@ -0,0 +1,59 @@
+package org.onlab.onos.cluster;
+
+import java.util.Objects;
+
+import com.google.common.base.MoreObjects;
+
+/**
+ * Abstract leadership concept.
+ */
+public class Leadership {
+
+    private final String topic;
+    private final ControllerNode leader;
+    private final long term;
+
+    public Leadership(String topic, ControllerNode leader, long term) {
+        this.topic = topic;
+        this.leader = leader;
+        this.term = term;
+    }
+
+    /**
+     * The topic for which this leadership applies.
+     * @return leadership topic.
+     */
+    public String topic() {
+        return topic;
+    }
+
+    /**
+     * The leader for this topic.
+     * @return leader node.
+     */
+    public ControllerNode leader() {
+        return leader;
+    }
+
+    /**
+     * The term number associated with this leadership.
+     * @return leadership term
+     */
+    public long term() {
+        return term;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(topic, leader, term);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this.getClass())
+            .add("topic", topic)
+            .add("leader", leader)
+            .add("term", term)
+            .toString();
+    }
+}
\ No newline at end of file