Skip to content
This repository was archived by the owner on Feb 5, 2024. It is now read-only.

Commit d4c8af2

Browse files
committed
Add removeFromKeygroup
1 parent 6560e30 commit d4c8af2

File tree

2 files changed

+100
-37
lines changed

2 files changed

+100
-37
lines changed

src/main/java/client/KeygroupRequest.java

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package client;
22

3+
import model.data.NodeID;
34
import org.apache.log4j.Logger;
45

56
import com.mashape.unirest.http.HttpResponse;
@@ -24,7 +25,7 @@ public KeygroupRequest(String address, int port) {
2425

2526
public KeygroupConfig updateLocalKeygroupConfig(KeygroupID keygroupID) throws UnirestException {
2627
String target = target(keygroupID.getApp(), keygroupID.getTenant(), keygroupID.getGroup(), "update");
27-
logger.info("Running get request targeting " + target);
28+
logger.debug("Running get request targeting " + target);
2829

2930
HttpResponse<String> response =
3031
Unirest.get(target).asString();
@@ -34,7 +35,7 @@ public KeygroupConfig updateLocalKeygroupConfig(KeygroupID keygroupID) throws Un
3435

3536
public boolean createKeygroup(KeygroupConfig keygroupConfig) throws UnirestException {
3637
String target = target();
37-
logger.info("Running post request targeting " + target);
38+
logger.debug("Running post request targeting " + target);
3839

3940
HttpResponse<String> response =
4041
Unirest.post(target).header("Content-Type", "application/json")
@@ -45,7 +46,7 @@ public boolean createKeygroup(KeygroupConfig keygroupConfig) throws UnirestExcep
4546

4647
public boolean addClient(KeygroupID keygroupID, ClientID clientID) throws UnirestException {
4748
String target = target(keygroupID.getApp(), keygroupID.getTenant(), keygroupID.getGroup(), "addClient");
48-
logger.info("Running put request targeting " + target);
49+
logger.debug("Running put request targeting " + target);
4950

5051
HttpResponse<String> response =
5152
Unirest.put(target).header("Content-Type", "application/json")
@@ -56,7 +57,7 @@ public boolean addClient(KeygroupID keygroupID, ClientID clientID) throws Unires
5657

5758
public boolean deleteClient(KeygroupID keygroupID, ClientID clientID) throws UnirestException {
5859
String target = target(keygroupID.getApp(), keygroupID.getTenant(), keygroupID.getGroup(), "deleteClient");
59-
logger.info("Running delete request targeting " + target);
60+
logger.debug("Running delete request targeting " + target);
6061

6162
HttpResponse<String> response =
6263
Unirest.put(target).header("Content-Type", "application/json")
@@ -67,7 +68,7 @@ public boolean deleteClient(KeygroupID keygroupID, ClientID clientID) throws Uni
6768

6869
public boolean addReplicaNode(KeygroupID keygroupID, ReplicaNodeConfig repNC) throws UnirestException {
6970
String target = target(keygroupID.getApp(), keygroupID.getTenant(), keygroupID.getGroup(), "addReplicaNode");
70-
logger.info("Running put request targeting " + target);
71+
logger.debug("Running put request targeting " + target);
7172

7273
HttpResponse<String> response =
7374
Unirest.put(target).header("Content-Type", "application/json")
@@ -78,7 +79,7 @@ public boolean addReplicaNode(KeygroupID keygroupID, ReplicaNodeConfig repNC) th
7879

7980
public boolean addTriggerNode(KeygroupID keygroupID, TriggerNodeConfig triggerNC) throws UnirestException {
8081
String target = target(keygroupID.getApp(), keygroupID.getTenant(), keygroupID.getGroup(), "addTriggerNode");
81-
logger.info("Running put request targeting " + target);
82+
logger.debug("Running put request targeting " + target);
8283

8384
HttpResponse<String> response =
8485
Unirest.put(target).header("Content-Type", "application/json")
@@ -87,5 +88,14 @@ public boolean addTriggerNode(KeygroupID keygroupID, TriggerNodeConfig triggerNC
8788
return handleBoolResponse(response, logger);
8889
}
8990

90-
91+
public boolean deleteNode(KeygroupID keygroupID, NodeID nodeID) throws UnirestException {
92+
String target = target(keygroupID.getApp(), keygroupID.getTenant(), keygroupID.getGroup(), "deleteNode");
93+
logger.debug("Running delete request targeting " + target);
94+
95+
HttpResponse<String> response =
96+
Unirest.put(target).header("Content-Type", "application/json")
97+
.body(JSONable.toJSON(nodeID)).asString();
98+
99+
return handleBoolResponse(response, logger);
100+
}
91101
}

src/main/kotlin/client/SimpleClient.kt

Lines changed: 83 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,13 @@ class Client(val address: String, val port: Int) {
3434
* @param ttl - the time to live value in seconds that is used for newly added replica nodes (default = infinite)
3535
* @param triggerNodeIds - list of new trigger node ids
3636
*/
37-
fun addToKeygroup(keygroupId: String, clientIds: List<String>? = null, replicaNodeIds: List<String>? = null,
38-
ttl: Int = -1, triggerNodeIds: List<String>? = null) {
37+
fun addToKeygroup(keygroupId: String, clientIds: List<String> = emptyList(),
38+
replicaNodeIds: List<String> = emptyList(), ttl: Int = -1,
39+
triggerNodeIds: List<String> = emptyList()) {
3940

40-
val keygroupID: KeygroupID? = KeygroupID.createFromString(keygroupId)
41-
if (keygroupID == null) {
42-
logger.info("Cannot update keygroup with the id $keygroupId as the id is not valid")
41+
// check whether valid keygroupID
42+
val keygroupID = KeygroupID.createFromString(keygroupId)?: run {
43+
logger.warn("Cannot update keygroup with the id $keygroupId as the id is not valid")
4344
return
4445
}
4546

@@ -56,44 +57,89 @@ class Client(val address: String, val port: Int) {
5657
}
5758

5859
// add clients
59-
if (clientIds != null) {
60-
for (c in clientIds.map { ClientID(it) }) {
60+
for (c in clientIds.map { ClientID(it) }) {
6161

62-
if (c in keygroupConfig.clients) {
63-
logger.info("Client $c has already access to the keygroup")
64-
continue
65-
}
66-
67-
logger.info("Added client to keygroup: ${request.addClient(keygroupID, c)}")
62+
if (c in keygroupConfig.clients) {
63+
logger.info("Client $c has already access to the keygroup")
64+
continue
6865
}
66+
67+
logger.info("Added client $c to keygroup: ${request.addClient(keygroupID, c)}")
6968
}
7069

7170
// add replica nodes
72-
if (replicaNodeIds != null) {
73-
for (r in replicaNodeIds.map { NodeID(it) }) {
71+
for (r in replicaNodeIds.map { NodeID(it) }) {
7472

75-
if (keygroupConfig.containsReplicaNode(r)) {
76-
logger.info("Replica node is already part of the keygroup")
77-
continue
78-
}
79-
80-
val replicaNodeConfig = ReplicaNodeConfig(r, ttl)
81-
logger.info("Added replica node to keygroup: ${request.addReplicaNode(keygroupID, replicaNodeConfig)}")
73+
if (keygroupConfig.containsReplicaNode(r)) {
74+
logger.info("Replica node $r is already part of the keygroup")
75+
continue
8276
}
77+
78+
val replicaNodeConfig = ReplicaNodeConfig(r, ttl)
79+
logger.info("Added replica node $r to keygroup: ${request.addReplicaNode(keygroupID, replicaNodeConfig)}")
8380
}
8481

8582
// add trigger nodes
86-
if (triggerNodeIds != null) {
87-
for (t in triggerNodeIds.map { NodeID(it) }) {
83+
for (t in triggerNodeIds.map { NodeID(it) }) {
84+
85+
if (keygroupConfig.containsTriggerNode(t)) {
86+
logger.info("Trigger node $t is already part of the keygroup")
87+
continue
88+
}
89+
90+
val triggerNodeConfig = TriggerNodeConfig(t)
91+
logger.info("Added trigger node $t to keygroup: ${request.addTriggerNode(keygroupID, triggerNodeConfig)}")
92+
}
93+
}
94+
95+
fun removeFromKeygroup(keygroupId: String, clientIds: List<String> = emptyList(),
96+
replicaNodeIds: List<String> = emptyList(), triggerNodeIds: List<String> = emptyList()) {
97+
98+
// check whether valid keygroupID
99+
val keygroupID = KeygroupID.createFromString(keygroupId)?: run {
100+
logger.warn("Cannot remove items from keygroup with the id $keygroupId as the id is not valid")
101+
return
102+
}
103+
104+
val request = KeygroupRequest(address, port)
105+
106+
// get current config first, return if not null
107+
val keygroupConfig = request.updateLocalKeygroupConfig(keygroupID)?: run {
108+
logger.warn("Keygroup $keygroupId does not exist")
109+
return
110+
}
111+
112+
// remove clients
113+
for (c in clientIds.map { ClientID(it) }) {
114+
115+
if (c !in keygroupConfig.clients) {
116+
logger.info("Keygroup has no client $c")
117+
continue
118+
}
119+
120+
logger.info("Removed client $c from keygroup: ${request.deleteClient(keygroupID, c)}")
121+
}
122+
123+
// remove replica nodes
124+
for (r in replicaNodeIds.map { NodeID(it) }) {
88125

89-
if (keygroupConfig.containsTriggerNode(t)) {
90-
logger.info("Trigger node is already part of the keygroup")
91-
continue
92-
}
126+
if (!keygroupConfig.containsReplicaNode(r)) {
127+
logger.info("Keygroup has no replica node $r")
128+
continue
129+
}
130+
131+
logger.info("Removed replica node $r from keygroup: ${request.deleteNode(keygroupID, r)}")
132+
}
133+
134+
// remove trigger nodes
135+
for (t in triggerNodeIds.map { NodeID(it) }) {
93136

94-
val triggerNodeConfig = TriggerNodeConfig(t)
95-
logger.info("Added trigger node to keygroup: ${request.addTriggerNode(keygroupID, triggerNodeConfig)}")
137+
if (keygroupConfig.containsTriggerNode(t)) {
138+
logger.info("Keygroup has no trigger node $t")
139+
continue
96140
}
141+
142+
logger.info("Removed trigger node $t from keygroup: ${request.deleteNode(keygroupID, t)}")
97143
}
98144
}
99145

@@ -113,4 +159,11 @@ fun main(args: Array<String>) {
113159
nr.createNodeConfig(nodeConfig)
114160

115161
c.addToKeygroup(keygroupId, replicaNodeIds = listOf("N2"), ttl = 120)
162+
163+
// remove N3 (must fail)
164+
c.removeFromKeygroup(keygroupId, replicaNodeIds = listOf("N3"))
165+
166+
// remove ourselves N1
167+
c.removeFromKeygroup(keygroupId, replicaNodeIds = listOf("N1"))
168+
116169
}

0 commit comments

Comments
 (0)