blob: c2beb595ff35f03453efa1091162b40ea00a1c90 [file] [log] [blame]
Madan Jampani08822c42014-11-04 17:17:46 -08001package org.onlab.onos.store.service.impl;
2
3import java.util.Arrays;
4import java.util.List;
5import java.util.UUID;
6import java.util.concurrent.CompletableFuture;
7import java.util.concurrent.ExecutionException;
8
9import net.kuujo.copycat.protocol.Response.Status;
10import net.kuujo.copycat.protocol.SubmitRequest;
11import net.kuujo.copycat.protocol.SubmitResponse;
12import net.kuujo.copycat.spi.protocol.ProtocolClient;
13
Madan Jampani08822c42014-11-04 17:17:46 -080014import org.onlab.onos.store.service.DatabaseException;
15import org.onlab.onos.store.service.ReadRequest;
16import org.onlab.onos.store.service.WriteRequest;
17
Madan Jampani686fa182014-11-04 23:16:27 -080018/**
19 * Client for interacting with the Copycat Raft cluster.
20 */
Madan Jampani08822c42014-11-04 17:17:46 -080021public class DatabaseClient {
22
Madan Jampani9b19a822014-11-04 21:37:13 -080023 private final ProtocolClient client;
Madan Jampani08822c42014-11-04 17:17:46 -080024
Madan Jampani9b19a822014-11-04 21:37:13 -080025 public DatabaseClient(ProtocolClient client) {
26 this.client = client;
Madan Jampani08822c42014-11-04 17:17:46 -080027 }
28
29 private static String nextId() {
30 return UUID.randomUUID().toString();
31 }
32
Madan Jampani08822c42014-11-04 17:17:46 -080033 public boolean createTable(String tableName) {
34
35 SubmitRequest request =
36 new SubmitRequest(
37 nextId(),
38 "createTable",
39 Arrays.asList(tableName));
40 CompletableFuture<SubmitResponse> future = client.submit(request);
41 try {
Yuta HIGUCHIb2ab0912014-11-10 11:44:40 -080042 final SubmitResponse submitResponse = future.get();
43 if (submitResponse.status() == Status.OK) {
44 return (boolean) submitResponse.result();
45 } else {
46 throw new DatabaseException(submitResponse.error());
47 }
Madan Jampani08822c42014-11-04 17:17:46 -080048 } catch (InterruptedException | ExecutionException e) {
49 throw new DatabaseException(e);
50 }
51 }
52
53 public void dropTable(String tableName) {
54
55 SubmitRequest request =
56 new SubmitRequest(
57 nextId(),
58 "dropTable",
59 Arrays.asList(tableName));
60 CompletableFuture<SubmitResponse> future = client.submit(request);
61 try {
Yuta HIGUCHIb2ab0912014-11-10 11:44:40 -080062 if (future.get().status() != Status.OK) {
Madan Jampani08822c42014-11-04 17:17:46 -080063 throw new DatabaseException(future.get().toString());
64 }
65
66 } catch (InterruptedException | ExecutionException e) {
67 throw new DatabaseException(e);
68 }
69 }
70
71 public void dropAllTables() {
72
73 SubmitRequest request =
74 new SubmitRequest(
75 nextId(),
76 "dropAllTables",
77 Arrays.asList());
78 CompletableFuture<SubmitResponse> future = client.submit(request);
79 try {
80 if (future.get().status() != Status.OK) {
81 throw new DatabaseException(future.get().toString());
82 }
83 } catch (InterruptedException | ExecutionException e) {
84 throw new DatabaseException(e);
85 }
86 }
87
88 @SuppressWarnings("unchecked")
89 public List<String> listTables() {
90
91 SubmitRequest request =
92 new SubmitRequest(
93 nextId(),
94 "listTables",
95 Arrays.asList());
96 CompletableFuture<SubmitResponse> future = client.submit(request);
97 try {
Yuta HIGUCHIb2ab0912014-11-10 11:44:40 -080098 final SubmitResponse submitResponse = future.get();
99 if (submitResponse.status() == Status.OK) {
100 return (List<String>) submitResponse.result();
101 } else {
102 throw new DatabaseException(submitResponse.error());
103 }
Madan Jampani08822c42014-11-04 17:17:46 -0800104 } catch (InterruptedException | ExecutionException e) {
105 throw new DatabaseException(e);
106 }
107 }
108
109 @SuppressWarnings("unchecked")
110 public List<InternalReadResult> batchRead(List<ReadRequest> requests) {
111
112 SubmitRequest request = new SubmitRequest(
113 nextId(),
114 "read",
115 Arrays.asList(requests));
116
117 CompletableFuture<SubmitResponse> future = client.submit(request);
118 try {
Yuta HIGUCHIb2ab0912014-11-10 11:44:40 -0800119 final SubmitResponse submitResponse = future.get();
120 if (submitResponse.status() == Status.OK) {
121 return (List<InternalReadResult>) submitResponse.result();
122 } else {
123 throw new DatabaseException(submitResponse.error());
124 }
Madan Jampani08822c42014-11-04 17:17:46 -0800125 } catch (InterruptedException | ExecutionException e) {
126 throw new DatabaseException(e);
127 }
128 }
129
130 @SuppressWarnings("unchecked")
131 public List<InternalWriteResult> batchWrite(List<WriteRequest> requests) {
132
133 SubmitRequest request = new SubmitRequest(
134 nextId(),
135 "write",
136 Arrays.asList(requests));
137
138 CompletableFuture<SubmitResponse> future = client.submit(request);
139 try {
Yuta HIGUCHIb2ab0912014-11-10 11:44:40 -0800140 final SubmitResponse submitResponse = future.get();
141 if (submitResponse.status() == Status.OK) {
142 return (List<InternalWriteResult>) submitResponse.result();
143 } else {
144 throw new DatabaseException(submitResponse.error());
145 }
Madan Jampani08822c42014-11-04 17:17:46 -0800146 } catch (InterruptedException | ExecutionException e) {
147 throw new DatabaseException(e);
148 }
149 }
150}