Skip to content

Commit 3ee2304

Browse files
Copilotmatsu1213
andauthored
Add kuvel loadbalancer register/unregister subcommands
Agent-Logs-Url: https://github.com/AzisabaNetwork/Kuvel/sessions/f0c88feb-5760-41f0-80c1-b94209a0e7b2 Co-authored-by: matsu1213 <85377530+matsu1213@users.noreply.github.com>
1 parent 8c39568 commit 3ee2304

2 files changed

Lines changed: 118 additions & 2 deletions

File tree

src/main/java/net/azisaba/kuvel/KuvelServiceHandler.java

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import io.fabric8.kubernetes.api.model.ContainerPort;
66
import io.fabric8.kubernetes.api.model.Pod;
77
import io.fabric8.kubernetes.api.model.PodList;
8+
import io.fabric8.kubernetes.api.model.apps.ReplicaSet;
9+
import io.fabric8.kubernetes.api.model.apps.ReplicaSetList;
810
import io.fabric8.kubernetes.client.KubernetesClient;
911
import java.net.InetSocketAddress;
1012
import java.util.ArrayList;
@@ -17,11 +19,13 @@
1719

1820
import io.fabric8.kubernetes.client.dsl.FilterWatchListDeletable;
1921
import io.fabric8.kubernetes.client.dsl.PodResource;
22+
import io.fabric8.kubernetes.client.dsl.RollableScalableResource;
2023
import lombok.Getter;
2124
import lombok.RequiredArgsConstructor;
2225
import net.azisaba.kuvel.discovery.LoadBalancerDiscovery;
2326
import net.azisaba.kuvel.discovery.ServerDiscovery;
2427
import net.azisaba.kuvel.loadbalancer.LoadBalancer;
28+
import net.azisaba.kuvel.loadbalancer.strategy.impl.RoundRobinLoadBalancingStrategy;
2529
import net.azisaba.kuvel.util.LabelKeys;
2630
import net.azisaba.kuvel.util.UidAndServerNameMap;
2731

@@ -337,4 +341,63 @@ public void unregisterPod(Pod pod) {
337341
public boolean isPodRegistered(String podId) {
338342
return podUidAndServerNameMap.getServerNameFromUid(podId) != null;
339343
}
344+
345+
/**
346+
* Register a load balancer with ReplicaSet uid and server name.
347+
*
348+
* @param replicaSetUid The ReplicaSet uid to register.
349+
* @param serverName The server name to register.
350+
* @return true if the load balancer is registered successfully.
351+
*/
352+
public boolean registerLoadBalancer(String replicaSetUid, String serverName) {
353+
FilterWatchListDeletable<ReplicaSet, ReplicaSetList, RollableScalableResource<ReplicaSet>> request =
354+
client.apps().replicaSets().inNamespace(namespace);
355+
356+
for (Entry<String, String> e : plugin.getKuvelConfig().getLabelSelectors().entrySet()) {
357+
request = request.withLabel(e.getKey(), e.getValue());
358+
}
359+
360+
Optional<ReplicaSet> replicaSet =
361+
request
362+
.list()
363+
.getItems()
364+
.stream()
365+
.filter(r -> r.getMetadata().getUid().equals(replicaSetUid))
366+
.findFirst();
367+
if (replicaSet.isEmpty()) {
368+
return false;
369+
}
370+
371+
boolean initialServer =
372+
replicaSet
373+
.get()
374+
.getMetadata()
375+
.getLabels()
376+
.getOrDefault(
377+
LabelKeys.INITIAL_SERVER.getKey(plugin.getKuvelConfig().getLabelKeyPrefix()),
378+
"false")
379+
.equalsIgnoreCase("true");
380+
381+
plugin
382+
.getProxy()
383+
.registerServer(new ServerInfo(serverName, new InetSocketAddress("0.0.0.0", 0)));
384+
registerLoadBalancer(
385+
new LoadBalancer(
386+
plugin.getProxy(),
387+
plugin.getProxy().getServer(serverName).orElseThrow(),
388+
new RoundRobinLoadBalancingStrategy(),
389+
replicaSetUid,
390+
initialServer));
391+
return true;
392+
}
393+
394+
/**
395+
* Gets whether the specified load balancer is registered.
396+
*
397+
* @param replicaSetUid The ReplicaSet uid to check.
398+
* @return true if the specified load balancer uid is registered.
399+
*/
400+
public boolean isLoadBalancerRegistered(String replicaSetUid) {
401+
return replicaSetUidAndServerNameMap.getServerNameFromUid(replicaSetUid) != null;
402+
}
340403
}

src/main/java/net/azisaba/kuvel/command/KuvelCommand.java

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,32 @@ public void execute(Invocation invocation) {
9393
}
9494

9595
if (args[0].equalsIgnoreCase("register")) {
96+
if (args.length >= 2 && args[1].equalsIgnoreCase("loadbalancer")) {
97+
if (args.length < 4) {
98+
source.sendMessage(
99+
Component.text("Usage: /kuvel register loadbalancer <replicaSetUid> <serverName>"));
100+
return;
101+
}
102+
String mappedUid = handler.getReplicaSetUidAndServerNameMap().getUidFromServerName(args[3]);
103+
if (mappedUid != null && !mappedUid.equals(args[2])) {
104+
source.sendMessage(
105+
Component.text("Server name is already mapped to another load balancer uid: " + mappedUid));
106+
return;
107+
}
108+
if (plugin.getProxy().getServer(args[3]).isPresent() && mappedUid == null) {
109+
source.sendMessage(Component.text("Server name is already registered: " + args[3]));
110+
return;
111+
}
112+
113+
if (handler.registerLoadBalancer(args[2], args[3])) {
114+
source.sendMessage(
115+
Component.text("Registered load balancer mapping: " + args[2] + " -> " + args[3]));
116+
} else {
117+
source.sendMessage(Component.text("Failed to register load balancer mapping."));
118+
}
119+
return;
120+
}
121+
96122
if (args.length < 3) {
97123
source.sendMessage(Component.text("Usage: /kuvel register <podUid> <serverName>"));
98124
return;
@@ -117,6 +143,23 @@ public void execute(Invocation invocation) {
117143
}
118144

119145
if (args[0].equalsIgnoreCase("unregister")) {
146+
if (args.length >= 2 && args[1].equalsIgnoreCase("loadbalancer")) {
147+
if (args.length < 3) {
148+
source.sendMessage(Component.text("Usage: /kuvel unregister loadbalancer <replicaSetUid>"));
149+
return;
150+
}
151+
152+
if (!handler.isLoadBalancerRegistered(args[2])) {
153+
source.sendMessage(
154+
Component.text("Load balancer uid is not currently registered: " + args[2]));
155+
return;
156+
}
157+
158+
handler.unregisterLoadBalancer(args[2]);
159+
source.sendMessage(Component.text("Unregistered load balancer mapping: " + args[2]));
160+
return;
161+
}
162+
120163
if (args.length < 2) {
121164
source.sendMessage(Component.text("Usage: /kuvel unregister <podUid>"));
122165
return;
@@ -187,13 +230,19 @@ public void execute(Invocation invocation) {
187230
}
188231

189232
int cleanedLoadBalancerCount = 0;
233+
int repairedLoadBalancerCount = 0;
190234
for (Map.Entry<String, String> entry :
191235
handler.getReplicaSetUidAndServerNameMap().getAllMap().entrySet()) {
192236
if (plugin.getProxy().getServer(entry.getValue()).isPresent()) {
193237
continue;
194238
}
195-
handler.unregisterLoadBalancer(entry.getKey());
196-
cleanedLoadBalancerCount++;
239+
boolean success = handler.registerLoadBalancer(entry.getKey(), entry.getValue());
240+
if (success && plugin.getProxy().getServer(entry.getValue()).isPresent()) {
241+
repairedLoadBalancerCount++;
242+
} else {
243+
handler.unregisterLoadBalancer(entry.getKey());
244+
cleanedLoadBalancerCount++;
245+
}
197246
}
198247

199248
source.sendMessage(
@@ -202,6 +251,8 @@ public void execute(Invocation invocation) {
202251
+ repairedPodCount
203252
+ ", cleanedPod="
204253
+ cleanedPodCount
254+
+ ", repairedLoadBalancer="
255+
+ repairedLoadBalancerCount
205256
+ ", cleanedLoadBalancer="
206257
+ cleanedLoadBalancerCount));
207258
return;
@@ -214,7 +265,9 @@ private void sendHelp(CommandSource source) {
214265
source.sendMessage(Component.text("/kuvel status"));
215266
source.sendMessage(Component.text("/kuvel list <pods|loadbalancers>"));
216267
source.sendMessage(Component.text("/kuvel register <podUid> <serverName>"));
268+
source.sendMessage(Component.text("/kuvel register loadbalancer <replicaSetUid> <serverName>"));
217269
source.sendMessage(Component.text("/kuvel unregister <podUid>"));
270+
source.sendMessage(Component.text("/kuvel unregister loadbalancer <replicaSetUid>"));
218271
source.sendMessage(Component.text("/kuvel setname <podUid> <serverName>"));
219272
source.sendMessage(Component.text("/kuvel repair"));
220273
}

0 commit comments

Comments
 (0)