Skip to content

Commit 99f725c

Browse files
committed
Avoid overlapping node names in diagrams as pointing out in (#53)
1 parent 9c98493 commit 99f725c

1 file changed

Lines changed: 26 additions & 25 deletions

File tree

bin/kube-diagrams

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -224,35 +224,36 @@ def get_namespace(resource):
224224
"""
225225
return query_path(resource, "metadata.namespace", config.get("default_namespace", "default"))
226226

227+
# Separators in node labels
228+
NODE_LABEL_SEPARATORS = [" ", ":", "-", "."]
229+
230+
def split_node_label(node_label):
231+
"""
232+
Split node labels into multi-lines.
233+
"""
234+
result = ""
235+
last_pos = 0
236+
max_pos = len(node_label) - MAX_NODE_LABEL_LENGTH
237+
while last_pos < max_pos:
238+
part = node_label[last_pos:last_pos+MAX_NODE_LABEL_LENGTH]
239+
idx = MAX_NODE_LABEL_LENGTH - 1
240+
while idx > 0:
241+
if part[idx] in NODE_LABEL_SEPARATORS:
242+
part = part[:idx]
243+
break
244+
idx -= 1
245+
result += part
246+
result += "\n"
247+
last_pos += len(part)
248+
result += node_label[last_pos:]
249+
return result
250+
227251
def create_diagram_node(resource):
228252
"""
229253
Create a diagram node from a Kubernetes resource.
230254
"""
231255
# Format node label
232-
node_label = get_name(resource)
233-
if len(node_label) > MAX_NODE_LABEL_LENGTH:
234-
def split_node_label(node_label, separator):
235-
parts = node_label.split(separator)
236-
node_label = parts[0]
237-
current_length = len(node_label)
238-
for part in parts[1:]:
239-
if current_length + len(part) >= MAX_NODE_LABEL_LENGTH:
240-
node_label += "\n"
241-
current_length = 0
242-
node_label += separator
243-
if len(part) >= MAX_NODE_LABEL_LENGTH:
244-
node_label += part[:MAX_NODE_LABEL_LENGTH]
245-
node_label += "\n"
246-
node_label += part[MAX_NODE_LABEL_LENGTH:]
247-
current_length = len(part[MAX_NODE_LABEL_LENGTH:])
248-
else:
249-
node_label += part
250-
current_length = current_length + 1 + len(part)
251-
return node_label
252-
for separator in [":", "-", "."]:
253-
if separator in node_label:
254-
node_label = split_node_label(node_label, separator)
255-
break
256+
node_label = split_node_label(get_name(resource))
256257
# Format node tooltip
257258
tooltip = f"kind: {resource.get('kind')}\n" \
258259
+ f"apiVersion: {resource.get('apiVersion')}\n" \
@@ -1350,7 +1351,7 @@ def create_custom_node(node_id, node_def):
13501351
module = importlib.import_module(diagram_node_classname[:idx])
13511352
# Get diagram node class
13521353
diagram_node_class = getattr(module, diagram_node_classname[idx+1:])
1353-
node_label = node_def.get("name","")
1354+
node_label = split_node_label(node_def.get("name", ""))
13541355
diagram_nodes[node_id] = diagram_node_class(node_label, tooltip=node_label)
13551356

13561357
def create_custom_cluster(cluster_id, cluster_def):

0 commit comments

Comments
 (0)