Fix --class and --min-size filters being ignored
Lint / Python (flake8) (push) Successful in 1m20s
Security / Python Security (bandit) (push) Successful in 39s

args.device_class and args.min_size were parsed but never passed to
analyze_cluster(), and the function had no parameters to receive them.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-26 18:55:32 -04:00
parent 2b9e235359
commit f53f0c5b40
+19 -10
View File
@@ -430,9 +430,11 @@ def calculate_resilience_score(osd_data, host_name, all_hosts_data, osd_tree):
# Performance metrics removed for simplicity # Performance metrics removed for simplicity
def analyze_cluster(): def analyze_cluster(class_filter=None, min_size=0):
"""Main analysis function""" """Main analysis function"""
print(f"{Colors.BOLD}{Colors.CYAN}=== Ceph OSD Replacement Candidate Analyzer ==={Colors.END}\n") filter_desc = f" [{class_filter.upper()}]" if class_filter else ""
filter_desc += f" [min {min_size}TB]" if min_size else ""
print(f"{Colors.BOLD}{Colors.CYAN}=== Ceph OSD Replacement Candidate Analyzer{filter_desc} ==={Colors.END}\n")
# Gather data # Gather data
print("Gathering cluster data...") print("Gathering cluster data...")
@@ -468,24 +470,31 @@ def analyze_cluster():
print("Analyzing OSDs across all cluster nodes...\n") print("Analyzing OSDs across all cluster nodes...\n")
total_osds = len([n for n in osd_tree['nodes'] if n['type'] == 'osd' and n.get('status') == 'up']) total_osds = len([n for n in osd_tree['nodes']
if n['type'] == 'osd' and n.get('status') == 'up'
and (not class_filter or n.get('device_class', 'hdd') == class_filter)])
current_osd = 0 current_osd = 0
for node in osd_tree['nodes']: for node in osd_tree['nodes']:
if node['type'] != 'osd' or node.get('status') != 'up': if node['type'] != 'osd' or node.get('status') != 'up':
continue continue
current_osd += 1
osd_id = node['id'] osd_id = node['id']
osd_name = node['name'] osd_name = node['name']
device_class = node.get('device_class', 'hdd') device_class = node.get('device_class', 'hdd')
host_name = osd_to_host.get(osd_id, 'unknown') host_name = osd_to_host.get(osd_id, 'unknown')
if class_filter and device_class != class_filter:
continue
osd_df_data = osd_df_map.get(osd_id, {})
if min_size and osd_df_data.get('crush_weight', 0) < min_size:
continue
current_osd += 1
print(f"[{current_osd}/{total_osds}] Analyzing {osd_name} on {host_name} ({device_class})...".ljust(80), end='\r') print(f"[{current_osd}/{total_osds}] Analyzing {osd_name} on {host_name} ({device_class})...".ljust(80), end='\r')
# Get OSD data
osd_df_data = osd_df_map.get(osd_id, {})
# SMART health analysis # SMART health analysis
health_data = get_device_health(osd_id, host_name) health_data = get_device_health(osd_id, host_name)
if not health_data: if not health_data:
@@ -635,7 +644,7 @@ if __name__ == "__main__":
DEBUG = True DEBUG = True
try: try:
analyze_cluster() analyze_cluster(class_filter=args.device_class, min_size=args.min_size)
except KeyboardInterrupt: except KeyboardInterrupt:
print(f"\n{Colors.YELLOW}Analysis interrupted{Colors.END}") print(f"\n{Colors.YELLOW}Analysis interrupted{Colors.END}")
sys.exit(0) sys.exit(0)