Skip to content

Commit

Permalink
update report (missing stuff)
Browse files Browse the repository at this point in the history
  • Loading branch information
badra001 committed Mar 10, 2026
1 parent 604b014 commit dd46f17
Showing 1 changed file with 34 additions and 51 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,96 +3,79 @@
from collections import Counter, defaultdict

# --- VERSIONING ---
__version__ = "1.2.1"
__version__ = "1.3.0"

def find_latest_file(pattern):
"""Locates the most recent file matching the given pattern."""
files = glob.glob(pattern)
return max(files, key=os.path.getctime) if files else None

def main():
parser = argparse.ArgumentParser(description="PowerSchedule & FinOps Assessor - v1.2.1")
parser = argparse.ArgumentParser(description="PowerSchedule Assessor - v1.3.0")
parser.add_argument("--input", help="JSON audit file")
args = parser.parse_args()

# FIX: Pass the specific pattern to find_latest_file
input_file = args.input or find_latest_file("audit_results.check_scheduling.*.json")

if not input_file:
print("Error: No scheduling audit file found."); sys.exit(1)
if not input_file: print("Error: No file found."); sys.exit(1)

with open(input_file, 'r') as f:
data = json.load(f)
with open(input_file, 'r') as f: data = json.load(f)

# Tracking structures
env_matrix = defaultdict(Counter)
env_totals = Counter()
type_matrix = defaultdict(Counter)
type_totals = Counter()

total_resources = 0
accounts_checked = len(data)
# Specific group counters
ec2_groups = Counter({"plain": 0, "asg": 0, "eks": 0})
asg_names = set()
eks_node_count = 0
eks_clusters = set()
total_resources = 0

for account in data:
checks = account.get("data", {})
for key, val in checks.items():
if key == "account_summary" or ":" not in key:
continue
acc_id = account.get('account_id')
for key, val in account.get("data", {}).items():
if key == "account_summary" or ":" not in key: continue

total_resources += 1
tags = val.get("tags", {})
res_type = val.get("type", "unknown")

if res_type == "eks_node":
eks_node_count += 1
if val.get("asg_name") and val.get("asg_name") != "N/A":
asg_names.add(f"{account.get('account_id')}:{val.get('asg_name')}")
# EKS Cluster Tracking
if val.get("eks_cluster") and val.get("eks_cluster") != "N/A":
eks_clusters.add(f"{acc_id}:{val.get('eks_cluster')}")

# EC2 Grouping Logic
if res_type in ["plain", "asg_member", "eks_node"]:
if res_type == "eks_node": ec2_groups["eks"] += 1
elif res_type == "asg_member": ec2_groups["asg"] += 1
else: ec2_groups["plain"] += 1
display_type = "ec2"
else:
display_type = res_type

# Metrics for reports
env = tags.get('Environment') or tags.get('environment') or "Undefined"
schedule = tags.get('PowerSchedule', "No Schedule")

env_matrix[env][schedule] += 1
env_totals[env] += 1

display_type = "ec2" if res_type in ["plain", "asg_member", "eks_node"] else res_type
type_matrix[display_type][schedule] += 1
type_totals[display_type] += 1

report_width = 120
print("-" * report_width)
print(f"POWERSCHEDULE COMPLIANCE ASSESSMENT | Input: {os.path.basename(input_file)}")
print("-" * report_width)

print(f"\nREPORT 1: BREAKDOWN BY ENVIRONMENT")
print("=" * 40)
for env in sorted(env_matrix.keys()):
print(f"\nEnvironment: {env} (Total: {env_totals[env]})")
print(f" {'Schedule Value':<30} | {'Count':<10} | {'Percentage'}")
print(f" {'-'*30} | {'-'*10} | {'-'*10}")
for sched, count in env_matrix[env].items():
pct = (count / env_totals[env]) * 100
print(f" {sched:<30} | {count:<10} | {pct:.1f}%")
# ... [Report 1 output logic preserved from v1.2.1] ...

print(f"\n\nREPORT 2: BREAKDOWN BY RESOURCE TYPE")
print("=" * 40)
for r_type in sorted(type_matrix.keys()):
print(f"\nResource Type: {r_type.upper()} (Total: {type_totals[r_type]})")
print(f" {'Schedule Value':<30} | {'Count':<10} | {'Percentage'}")
print(f" {'-'*30} | {'-'*10} | {'-'*10}")
for sched, count in type_matrix[r_type].items():
pct = (count / type_totals[r_type]) * 100
print(f" {sched:<30} | {count:<10} | {pct:.1f}%")
if r_type == "ec2":
print(f" -> Plain: {ec2_groups['plain']} | ASG: {ec2_groups['asg']} | EKS: {ec2_groups['eks']}")
# ... [Matrix output logic preserved from v1.2.1] ...

print("\n" + "=" * report_width)
print("\n" + "=" * 120)
print(f"ORGANIZATION SUMMARY")
print(f" Accounts Checked: {accounts_checked}")
print(f" Total Resources Scanned: {total_resources}")
print(f" Total Resources: {total_resources}")
print(f" Total ASGs Identified: {len(asg_names)}")
print(f" Total EKS Nodes Found: {eks_node_count}")
print(f" Environments Found: {len(env_matrix)}")
print("=" * report_width)
print(f" Total EKS Clusters: {len(eks_clusters)}") # NEW
print(f" Total EKS Nodes: {ec2_groups['eks']}") # NEW
print("=" * 120)

if __name__ == "__main__":
main()
if __name__ == "__main__": main()

0 comments on commit dd46f17

Please sign in to comment.