@@ -34,12 +34,13 @@ class Client(val address: String, val port: Int) {
34
34
* @param ttl - the time to live value in seconds that is used for newly added replica nodes (default = infinite)
35
35
* @param triggerNodeIds - list of new trigger node ids
36
36
*/
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()) {
39
40
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" )
43
44
return
44
45
}
45
46
@@ -56,44 +57,89 @@ class Client(val address: String, val port: Int) {
56
57
}
57
58
58
59
// add clients
59
- if (clientIds != null ) {
60
- for (c in clientIds.map { ClientID (it) }) {
60
+ for (c in clientIds.map { ClientID (it) }) {
61
61
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
68
65
}
66
+
67
+ logger.info(" Added client $c to keygroup: ${request.addClient(keygroupID, c)} " )
69
68
}
70
69
71
70
// add replica nodes
72
- if (replicaNodeIds != null ) {
73
- for (r in replicaNodeIds.map { NodeID (it) }) {
71
+ for (r in replicaNodeIds.map { NodeID (it) }) {
74
72
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
82
76
}
77
+
78
+ val replicaNodeConfig = ReplicaNodeConfig (r, ttl)
79
+ logger.info(" Added replica node $r to keygroup: ${request.addReplicaNode(keygroupID, replicaNodeConfig)} " )
83
80
}
84
81
85
82
// 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) }) {
88
125
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) }) {
93
136
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
96
140
}
141
+
142
+ logger.info(" Removed trigger node $t from keygroup: ${request.deleteNode(keygroupID, t)} " )
97
143
}
98
144
}
99
145
@@ -113,4 +159,11 @@ fun main(args: Array<String>) {
113
159
nr.createNodeConfig(nodeConfig)
114
160
115
161
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
+
116
169
}
0 commit comments