-
Notifications
You must be signed in to change notification settings - Fork 54
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
test(robot): migrate test_replica_auto_balance_disk_in_pressure #2167
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,5 +1,6 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import time | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import re | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import os | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
from kubernetes import client | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
from robot.libraries.BuiltIn import BuiltIn | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -9,15 +10,27 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
from utility.utility import get_longhorn_client | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
from utility.utility import get_retry_count_and_interval | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
from utility.utility import logging | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
from node_exec import NodeExec | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
class Node: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DEFAULT_DISK_PATH = "/var/lib/longhorn/" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DEFAULT_VOLUME_PATH = "/dev/longhorn/" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def __init__(self): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.retry_count, self.retry_interval = get_retry_count_and_interval() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def mount_disk(self, disk_name, node_name): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
mount_path = os.path.join(self.DEFAULT_DISK_PATH, disk_name) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
device_path = os.path.join(self.DEFAULT_VOLUME_PATH, disk_name) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cmd = f"mkdir -p {mount_path}" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
res = NodeExec(node_name).issue_cmd(cmd) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cmd = f"mkfs.ext4 {device_path}" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
res = NodeExec(node_name).issue_cmd(cmd) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cmd = f"mount {device_path} {mount_path}" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
res = NodeExec(node_name).issue_cmd(cmd) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return mount_path | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def update_disks(self, node_name, disks): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
node = get_longhorn_client().by_id_node(node_name) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for _ in range(self.retry_count): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -37,9 +50,9 @@ def wait_for_disk_update(self, node_name, disk_num): | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
disks = node.disks | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for d in disks: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if disks[d]["diskUUID"] == "" or \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
not disks[d]["conditions"] or \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
disks[d]["conditions"]["Ready"]["status"] != "True" or \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
disks[d]["conditions"]["Schedulable"]["status"] != "True": | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(disks[d]["allowScheduling"] and | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(not disks[d]["conditions"] or | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
disks[d]["conditions"]["Ready"]["status"] != "True")): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
all_updated = False | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
break | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if all_updated: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -59,15 +72,20 @@ def reset_disks(self, node_name): | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for disk_name, disk in iter(node.disks.items()): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if disk.path != self.DEFAULT_DISK_PATH: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
disk.allowScheduling = False | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
logging(f"Disabling scheduling disk {disk_name} on node {node_name}") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
else: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
disk.allowScheduling = True | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
logging(f"Enabling scheduling disk {disk_name} on node {node_name}") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.update_disks(node_name, node.disks) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
disks = {} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for disk_name, disk in iter(node.disks.items()): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if disk.path == self.DEFAULT_DISK_PATH: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
disks[disk_name] = disk | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
disk.allowScheduling = True | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
logging(f"Keeping disk {disk_name} on node {node_name}") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
else: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
logging(f"Try to remove disk {disk_name} from node {node_name}") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
logging(f"Removing disk {disk_name} from node {node_name}") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.update_disks(node_name, disks) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def is_accessing_node_by_index(self, node): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -183,6 +201,14 @@ def set_default_disk_scheduling(self, node_name, allowScheduling): | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
disk.allowScheduling = allowScheduling | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.update_disks(node_name, node.disks) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def set_disk_scheduling(self, node_name, disk_name, allowScheduling): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
node = get_longhorn_client().by_id_node(node_name) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for name, disk in iter(node.disks.items()): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if name == disk_name: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
disk.allowScheduling = allowScheduling | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.update_disks(node_name, node.disks) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+204
to
+211
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Check for existence of the specified disk before updating scheduling. In Apply this diff to add a check for disk existence: def set_disk_scheduling(self, node_name, disk_name, allowScheduling):
node = get_longhorn_client().by_id_node(node_name)
+ if disk_name not in node.disks:
+ raise KeyError(f"Disk '{disk_name}' not found on node '{node_name}'")
for name, disk in iter(node.disks.items()):
if name == disk_name:
disk.allowScheduling = allowScheduling
self.update_disks(node_name, node.disks) 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def check_node_schedulable(self, node_name, schedulable): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
node = get_longhorn_client().by_id_node(node_name) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for _ in range(self.retry_count): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -194,3 +220,29 @@ def check_node_schedulable(self, node_name, schedulable): | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def is_node_schedulable(self, node_name): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
node = get_longhorn_client().by_id_node(node_name) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return node["conditions"]["Schedulable"]["status"] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def is_disk_in_pressure(self, node_name, disk_name): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
node = get_longhorn_client().by_id_node(node_name) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return node["disks"][disk_name]["conditions"]["Schedulable"]["reason"] == "DiskPressure" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+224
to
+226
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add error handling for missing disk conditions. The method Apply this diff to safely access the dictionary keys: def is_disk_in_pressure(self, node_name, disk_name):
node = get_longhorn_client().by_id_node(node_name)
- return node["disks"][disk_name]["conditions"]["Schedulable"]["reason"] == "DiskPressure"
+ disk = node["disks"].get(disk_name, {})
+ conditions = disk.get("conditions", {})
+ schedulable = conditions.get("Schedulable", {})
+ reason = schedulable.get("reason", "")
+ return reason == "DiskPressure" 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def wait_for_disk_in_pressure(self, node_name, disk_name): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for i in range(self.retry_count): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
is_in_pressure = self.is_disk_in_pressure(node_name, disk_name) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
logging(f"Waiting for disk {disk_name} on node {node_name} in pressure ... ({i})") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if is_in_pressure: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
break | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
time.sleep(self.retry_interval) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
assert self.is_disk_in_pressure(node_name, disk_name), f"Waiting for node {node_name} disk {disk_name} in pressure failed: {get_longhorn_client().by_id_node(node_name)}" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def wait_for_disk_not_in_pressure(self, node_name, disk_name): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for i in range(self.retry_count): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
is_in_pressure = self.is_disk_in_pressure(node_name, disk_name) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
logging(f"Waiting for disk {disk_name} on node {node_name} not in pressure ... ({i})") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if not is_in_pressure: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
break | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
time.sleep(self.retry_interval) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
assert not self.is_disk_in_pressure(node_name, disk_name), f"Waiting for node {node_name} disk {disk_name} not in pressure failed: {get_longhorn_client().by_id_node(node_name)}" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+228
to
+245
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Handle potential infinite loops in wait methods. In Ensure that the loop respects Apply this diff to enforce maximum retries: def wait_for_disk_in_pressure(self, node_name, disk_name):
for i in range(self.retry_count):
is_in_pressure = self.is_disk_in_pressure(node_name, disk_name)
logging(f"Waiting for disk {disk_name} on node {node_name} in pressure ... ({i})")
if is_in_pressure:
break
time.sleep(self.retry_interval)
- assert self.is_disk_in_pressure(node_name, disk_name), f"Waiting for node {node_name} disk {disk_name} in pressure failed: {get_longhorn_client().by_id_node(node_name)}"
+ else:
+ raise TimeoutError(f"Disk {disk_name} on node {node_name} did not enter pressure state within the expected time.")
def wait_for_disk_not_in_pressure(self, node_name, disk_name):
for i in range(self.retry_count):
is_in_pressure = self.is_disk_in_pressure(node_name, disk_name)
logging(f"Waiting for disk {disk_name} on node {node_name} not in pressure ... ({i})")
if not is_in_pressure:
break
time.sleep(self.retry_interval)
- assert not self.is_disk_in_pressure(node_name, disk_name), f"Waiting for node {node_name} disk {disk_name} not in pressure failed: {get_longhorn_client().by_id_node(node_name)}"
+ else:
+ raise TimeoutError(f"Disk {disk_name} on node {node_name} did not exit pressure state within the expected time.") 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def get_disk_uuid(self, node_name, disk_name): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
node = get_longhorn_client().by_id_node(node_name) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return node["disks"][disk_name]["diskUUID"] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+246
to
+248
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ensure disk existence before accessing disk UUID. In Apply this diff to add a check for disk existence: def get_disk_uuid(self, node_name, disk_name):
node = get_longhorn_client().by_id_node(node_name)
- return node["disks"][disk_name]["diskUUID"]
+ try:
+ return node["disks"][disk_name]["diskUUID"]
+ except KeyError:
+ raise KeyError(f"Disk '{disk_name}' not found on node '{node_name}'") 📝 Committable suggestion
Suggested change
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,7 +4,7 @@ | |
class Base(ABC): | ||
|
||
@abstractmethod | ||
def get(self, volume_name, node_name): | ||
def get(self, volume_name, node_name, disk_uuid): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 💡 Codebase verification Implementation inconsistency found in derived classes The verification reveals that not all implementing classes have been properly updated with the new
The abstract base class requires a mandatory 🔗 Analysis chainLGTM! Verify implementations in derived classes. The addition of Let's verify that all implementing classes have been updated with the new parameter: 🏁 Scripts executedThe following scripts were executed for the analysis: Script: #!/bin/bash
# Description: Check if all implementations of the get() method include the disk_uuid parameter
# Expected: All implementing classes should have the updated signature
# Search for class definitions that inherit from Base
ast-grep --pattern 'class $_ (Base):'
# Search for get method implementations
ast-grep --pattern 'def get(self, volume_name, node_name, $_):'
Length of output: 105 Script: #!/bin/bash
# Let's try a different approach using ripgrep to find implementations
# First, find the base class definition
echo "=== Base class definition ==="
rg -l "class.*Base.*:" e2e/libs/replica/
# Then find all implementations of get method in replica-related files
echo -e "\n=== Get method implementations ==="
rg "def get\(self, volume_name, node_name" -A 1 e2e/libs/replica/
Length of output: 822 |
||
return NotImplemented | ||
|
||
@abstractmethod | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -12,7 +12,7 @@ class Rest(Base): | |
def __init__(self): | ||
pass | ||
|
||
def get(self, volume_name, node_name): | ||
def get(self, volume_name, node_name, disk_uuid): | ||
return NotImplemented | ||
Comment on lines
+15
to
16
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 💡 Codebase verification Breaking change detected in method signature The verification reveals that while the base class
🔗 Analysis chainVerify implementations of the updated method signature The addition of the 🏁 Scripts executedThe following scripts were executed for the analysis: Script: #!/bin/bash
# Description: Find all implementations of the Rest class to verify they implement
# the updated get method signature
# Search for classes that inherit from Rest
ast-grep --pattern 'class $_ (Rest):'
# Search for get method implementations with the new signature
ast-grep --pattern 'def get(self, volume_name, node_name, disk_uuid):'
Length of output: 112 Script: #!/bin/bash
# Let's try a different approach using ripgrep to find implementations
# Search for class definitions inheriting from Rest
rg "class.*\(Rest\)" -l
# Search for all get method implementations in the codebase
rg "def get\(.*volume_name.*node_name.*\):" -l
# Get content of the base class to understand the inheritance
cat e2e/libs/replica/rest.py
Length of output: 3259 Script: #!/bin/bash
# Let's examine the implementation in other files that might be affected
# Check the content of files that might have the get method implementation
cat e2e/libs/replica/crd.py
cat e2e/libs/replica/base.py
cat e2e/libs/replica/replica.py
Length of output: 3895 |
||
|
||
def delete(self, volume_name, node_name): | ||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -10,7 +10,7 @@ | |||||||||||||||||||||||||||||
from utility.utility import logging | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
def create_statefulset(statefulset_name, volume_type, sc_name): | ||||||||||||||||||||||||||||||
def create_statefulset(statefulset_name, volume_type, sc_name, size): | ||||||||||||||||||||||||||||||
filepath = "./templates/workload/statefulset.yaml" | ||||||||||||||||||||||||||||||
with open(filepath, 'r') as f: | ||||||||||||||||||||||||||||||
namespace = 'default' | ||||||||||||||||||||||||||||||
|
@@ -30,6 +30,10 @@ def create_statefulset(statefulset_name, volume_type, sc_name): | |||||||||||||||||||||||||||||
if volume_type == 'RWX': | ||||||||||||||||||||||||||||||
manifest_dict['spec']['volumeClaimTemplates'][0]['spec']['accessModes'][0] = 'ReadWriteMany' | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
# correct request storage size | ||||||||||||||||||||||||||||||
if size: | ||||||||||||||||||||||||||||||
manifest_dict['spec']['volumeClaimTemplates'][0]['spec']['resources']['requests']['storage'] = size | ||||||||||||||||||||||||||||||
Comment on lines
+33
to
+35
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Add validation and improve error handling for storage size. The current implementation could be more robust:
Consider this safer implementation: - # correct request storage size
- if size:
- manifest_dict['spec']['volumeClaimTemplates'][0]['spec']['resources']['requests']['storage'] = size
+ # Set PVC storage size if specified
+ if size:
+ # Validate size format
+ if not isinstance(size, str) or not any(size.endswith(unit) for unit in ['Ki', 'Mi', 'Gi', 'Ti']):
+ raise ValueError(f"Invalid storage size format: {size}. Expected format: '<number>Ki|Mi|Gi|Ti'")
+
+ try:
+ template = manifest_dict['spec']['volumeClaimTemplates'][0]
+ template.setdefault('spec', {}).setdefault('resources', {}).setdefault('requests', {})['storage'] = size
+ except (KeyError, IndexError) as e:
+ raise ValueError(f"Invalid manifest structure: {str(e)}") 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
api = client.AppsV1Api() | ||||||||||||||||||||||||||||||
statefulset = api.create_namespaced_stateful_set( | ||||||||||||||||||||||||||||||
body=manifest_dict, | ||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Handle potential exceptions during disk mounting.
The
mount_disk
method executes system commands that may fail. It's advisable to handle exceptions or check the result of each command to ensure robustness.Apply this diff to handle exceptions:
📝 Committable suggestion
🧰 Tools
🪛 Ruff
31-31: Local variable
res
is assigned to but never usedRemove assignment to unused variable
res
(F841)