blob: 9682d51071ecde6524d0ea80566ffa8fdee0547b [file] [log] [blame]
Pankaj Berde85016ab2013-06-21 11:34:53 -07001package net.onrc.onos.graph;
2
3import java.util.Set;
4
5import org.slf4j.Logger;
6import org.slf4j.LoggerFactory;
7
8import com.thinkaurelius.titan.core.TitanFactory;
9import com.thinkaurelius.titan.core.TitanGraph;
10import com.tinkerpop.blueprints.TransactionalGraph;
11import com.tinkerpop.blueprints.Vertex;
12import com.tinkerpop.blueprints.util.wrappers.event.EventTransactionalGraph;
13import com.tinkerpop.frames.FramedGraph;
Jonathan Hartebfae332014-01-15 10:37:47 -080014import com.tinkerpop.frames.FramedGraphFactory;
Pankaj Berde85016ab2013-06-21 11:34:53 -070015
16public class GraphDBConnection implements IDBConnection {
17 public enum Transaction {
18 COMMIT, ROLLBACK
19 }
20
21 public enum GenerateEvent {
22 TRUE, FALSE
23 }
24
25 class TransactionHandle {
26 protected TransactionalGraph tr;
27
28 public void create() {
29 tr = graph.newTransaction();
30 }
31 }
32
Yuta HIGUCHI6ac8d182013-10-22 15:24:56 -070033 protected final static Logger log = LoggerFactory
Pankaj Berde85016ab2013-06-21 11:34:53 -070034 .getLogger(GraphDBConnection.class);
35 private static GraphDBConnection singleton = new GraphDBConnection();
36 private static TitanGraph graph;
Jonathan Hartebfae332014-01-15 10:37:47 -080037 private static FramedGraphFactory factory;
Yuta HIGUCHIbaa20c92014-01-02 12:11:28 -080038 private static FramedGraph<TitanGraph> fg;
Pankaj Berde85016ab2013-06-21 11:34:53 -070039 private static EventTransactionalGraph<TitanGraph> eg;
40 private static String configFile;
41
42 /*
43 * A private Constructor prevents any other class from instantiating.
44 */
45 private GraphDBConnection() {
46 }
47
48 /* Static 'instance' method */
49 /**
50 * Get the instance of GraphDBConnection class.
51 * @param conf the path to the database configuration file.
52 * @return GraphDBConnection instance.
53 */
54 public static synchronized GraphDBConnection getInstance(final String conf) {
55 if (GraphDBConnection.configFile == null
56 || GraphDBConnection.configFile.isEmpty()) {
57 GraphDBConnection.configFile = conf;
58 log.debug("GraphDBConnection::Setting Config File {}",
59 GraphDBConnection.configFile);
60 }
61 if (!GraphDBConnection.configFile.isEmpty()
62 && (graph == null || graph.isOpen() == Boolean.FALSE)) {
63 graph = TitanFactory.open(GraphDBConnection.configFile);
64 // FIXME: Creation on Indexes should be done only once
65 Set<String> s = graph.getIndexedKeys(Vertex.class);
66 if (!s.contains("dpid")) {
67 graph.createKeyIndex("dpid", Vertex.class);
68 }
Pankaj Berdebbd38612013-06-22 05:59:12 -070069 if (!s.contains("port_id")) {
70 graph.createKeyIndex("port_id", Vertex.class);
71 }
Pankaj Berde85016ab2013-06-21 11:34:53 -070072 if (!s.contains("type")) {
73 graph.createKeyIndex("type", Vertex.class);
74 }
Pavlin Radoslavov3aed4682013-06-21 13:40:48 -070075 if (!s.contains("dl_addr")) {
76 graph.createKeyIndex("dl_addr", Vertex.class);
Pankaj Berde85016ab2013-06-21 11:34:53 -070077 }
78 if (!s.contains("flow_id")) {
79 graph.createKeyIndex("flow_id", Vertex.class);
80 }
81 if (!s.contains("flow_entry_id")) {
82 graph.createKeyIndex("flow_entry_id", Vertex.class);
83 }
84 if (!s.contains("switch_state")) {
85 graph.createKeyIndex("switch_state", Vertex.class);
86 }
Jonathan Hartd6ed62b2013-11-01 13:18:25 -070087 if (!s.contains("ipv4_address")) {
88 graph.createKeyIndex("ipv4_address", Vertex.class);
89 }
Pankaj Berde85016ab2013-06-21 11:34:53 -070090 graph.commit();
Jonathan Hartebfae332014-01-15 10:37:47 -080091 // Make sure you reuse the factory when creating new framed graphs
92 factory = new FramedGraphFactory();
93 fg = factory.create(graph);
Pankaj Berde85016ab2013-06-21 11:34:53 -070094 eg = new EventTransactionalGraph<TitanGraph>(graph);
95 }
96 return singleton;
97 }
98
Yuta HIGUCHId2fcdd92013-10-22 11:18:58 -070099 /**
Pankaj Berde85016ab2013-06-21 11:34:53 -0700100 * Get a FramedGraph instance of the graph.
101 */
Yuta HIGUCHId2fcdd92013-10-22 11:18:58 -0700102 @Override
Pankaj Berde85016ab2013-06-21 11:34:53 -0700103 public FramedGraph<TitanGraph> getFramedGraph() {
Jonathan Hartebfae332014-01-15 10:37:47 -0800104 if (isValid()) {
105 return fg;
106 } else {
107 log.error("New FramedGraph failed");
108 return null;
109 }
Pankaj Berde85016ab2013-06-21 11:34:53 -0700110 }
111
112 /**
113 * Get EventTransactionalGraph of the titan graph.
114 * @return EventTransactionalGraph of the titan graph
115 */
116 protected EventTransactionalGraph<TitanGraph> getEventGraph() {
117 if (isValid()) {
118 return eg;
119 } else {
120 return null;
121 }
122 }
123
124 /**
125 * Add LocalGraphChangedLister for the graph.
126 */
Yuta HIGUCHId2fcdd92013-10-22 11:18:58 -0700127 @Override
Pankaj Berde85016ab2013-06-21 11:34:53 -0700128 public void addEventListener(final LocalGraphChangedListener listener) {
129 EventTransactionalGraph<TitanGraph> eg = this.getEventGraph();
130 eg.addListener(listener);
131 log.debug("Registered listener {}", listener.getClass());
132 }
133
134 /**
135 * Return whether this connection is valid.
136 */
Yuta HIGUCHId2fcdd92013-10-22 11:18:58 -0700137 @Override
Pankaj Berde85016ab2013-06-21 11:34:53 -0700138 public Boolean isValid() {
Yuta HIGUCHI3d30d002013-10-22 11:16:49 -0700139 return (graph != null && graph.isOpen());
Pankaj Berde85016ab2013-06-21 11:34:53 -0700140 }
141
142 /**
143 * Commit changes for the graph operations.
Yuta HIGUCHIbaa20c92014-01-02 12:11:28 -0800144 * @throws Exception
Pankaj Berde85016ab2013-06-21 11:34:53 -0700145 */
Yuta HIGUCHId2fcdd92013-10-22 11:18:58 -0700146 @Override
Pankaj Berde85016ab2013-06-21 11:34:53 -0700147 public void commit() {
Yuta HIGUCHIbaa20c92014-01-02 12:11:28 -0800148// // Should not catch exception here!
Naoki Shiota987a5722013-10-23 11:59:36 -0700149// try {
Pankaj Berde85016ab2013-06-21 11:34:53 -0700150 graph.commit();
Naoki Shiota987a5722013-10-23 11:59:36 -0700151// }
152// catch (Exception e) {
153// log.error("{}", e.toString());
154// }
Pankaj Berde85016ab2013-06-21 11:34:53 -0700155 }
156
157 /**
158 * Rollback changes for the graph operations.
159 */
Yuta HIGUCHId2fcdd92013-10-22 11:18:58 -0700160 @Override
Pankaj Berde85016ab2013-06-21 11:34:53 -0700161 public void rollback() {
Yuta HIGUCHIbaa20c92014-01-02 12:11:28 -0800162 // Should not catch exception here!
Naoki Shiota987a5722013-10-23 11:59:36 -0700163// try {
Pankaj Berde85016ab2013-06-21 11:34:53 -0700164 graph.rollback();
Naoki Shiota987a5722013-10-23 11:59:36 -0700165// }
166// catch (Exception e) {
167// log.error("{}", e.toString());
168// }
Pankaj Berde85016ab2013-06-21 11:34:53 -0700169 }
170
171 /**
172 * Close this database connection.
173 */
Yuta HIGUCHId2fcdd92013-10-22 11:18:58 -0700174 @Override
Pankaj Berde85016ab2013-06-21 11:34:53 -0700175 public void close() {
Naoki Shiota987a5722013-10-23 11:59:36 -0700176 try {
177 commit();
178 } catch (Exception e) {
Yuta HIGUCHI5302ddf2014-01-06 12:53:35 -0800179 log.error("close() failed with exception", e);
Naoki Shiota987a5722013-10-23 11:59:36 -0700180 }
Pankaj Berde85016ab2013-06-21 11:34:53 -0700181 }
182}