blob: 8af567e61856ff6a34db695af254e6a9f156f1cb [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 {
42 return (boolean) future.get().result();
43 } catch (InterruptedException | ExecutionException e) {
44 throw new DatabaseException(e);
45 }
46 }
47
48 public void dropTable(String tableName) {
49
50 SubmitRequest request =
51 new SubmitRequest(
52 nextId(),
53 "dropTable",
54 Arrays.asList(tableName));
55 CompletableFuture<SubmitResponse> future = client.submit(request);
56 try {
57 if (future.get().status() == Status.OK) {
58 throw new DatabaseException(future.get().toString());
59 }
60
61 } catch (InterruptedException | ExecutionException e) {
62 throw new DatabaseException(e);
63 }
64 }
65
66 public void dropAllTables() {
67
68 SubmitRequest request =
69 new SubmitRequest(
70 nextId(),
71 "dropAllTables",
72 Arrays.asList());
73 CompletableFuture<SubmitResponse> future = client.submit(request);
74 try {
75 if (future.get().status() != Status.OK) {
76 throw new DatabaseException(future.get().toString());
77 }
78 } catch (InterruptedException | ExecutionException e) {
79 throw new DatabaseException(e);
80 }
81 }
82
83 @SuppressWarnings("unchecked")
84 public List<String> listTables() {
85
86 SubmitRequest request =
87 new SubmitRequest(
88 nextId(),
89 "listTables",
90 Arrays.asList());
91 CompletableFuture<SubmitResponse> future = client.submit(request);
92 try {
93 return (List<String>) future.get().result();
94 } catch (InterruptedException | ExecutionException e) {
95 throw new DatabaseException(e);
96 }
97 }
98
99 @SuppressWarnings("unchecked")
100 public List<InternalReadResult> batchRead(List<ReadRequest> requests) {
101
102 SubmitRequest request = new SubmitRequest(
103 nextId(),
104 "read",
105 Arrays.asList(requests));
106
107 CompletableFuture<SubmitResponse> future = client.submit(request);
108 try {
109 List<InternalReadResult> internalReadResults = (List<InternalReadResult>) future.get().result();
110 return internalReadResults;
111 } catch (InterruptedException | ExecutionException e) {
112 throw new DatabaseException(e);
113 }
114 }
115
116 @SuppressWarnings("unchecked")
117 public List<InternalWriteResult> batchWrite(List<WriteRequest> requests) {
118
119 SubmitRequest request = new SubmitRequest(
120 nextId(),
121 "write",
122 Arrays.asList(requests));
123
124 CompletableFuture<SubmitResponse> future = client.submit(request);
125 try {
126 List<InternalWriteResult> internalWriteResults = (List<InternalWriteResult>) future.get().result();
127 return internalWriteResults;
128 } catch (InterruptedException | ExecutionException e) {
129 throw new DatabaseException(e);
130 }
131 }
132}