cloudsense / env /tasks /task_easy.py
Jaswanth1210's picture
Initial commit
529b5a7
"""Easy task: Startup cleanup — 7 resources (6 dev/staging + 1 critical trap)."""
from env.models import ActionType
from env.tasks.base_task import BaseTask
class StartupCleanupTask(BaseTask):
task_id = "startup-cleanup"
difficulty = "easy"
max_steps = 10
description = (
"Optimize a small startup's AWS account with 7 resources. "
"Most are oversized or unused dev/staging — but watch out for critical production resources."
)
data_file = "easy_account.json"
optimal_cost = 240.0 # approximate after optimizations
def get_correct_actions(self) -> dict[str, ActionType]:
return {
# t3.2xlarge @ 4% CPU -> t3.small (saves $242.94 - $15.18 = $227.76)
"res-easy-001": ActionType.rightsize_resource,
# db.r5.large + 500GB storage @ 3% CPU, 12GB used -> db.t3.medium + 50GB
# saves $232.70 - ($49.64 + 50*0.10) = $232.70 - $54.64 = $178.06
"res-easy-002": ActionType.rightsize_resource,
# Unused ALB with 0 targets -> terminate (saves $22.27)
"res-easy-003": ActionType.terminate_resource,
# Unused NLB with 0 targets -> terminate (saves $22.27)
"res-easy-004": ActionType.terminate_resource,
# 2TB S3 Standard rarely accessed -> lifecycle policy (saves ~70% = $32.20)
"res-easy-005": ActionType.add_lifecycle_policy,
# t3.large @ 2% CPU -> t3.micro (saves $60.74 - $7.59 = $53.15)
"res-easy-006": ActionType.rightsize_resource,
# TRAP: t3.medium @ 3% CPU looks idle — but is_critical=True, runs nightly
# batch ETL pipeline. Agent must read criticality flag and SKIP.
"res-easy-007": ActionType.skip_resource,
}
def get_critical_resources(self) -> set[str]:
return {"res-easy-007"} # Critical batch runner — must be skipped
def get_action_savings(self) -> dict[str, float]:
return {
"res-easy-001": 227.76, # t3.2xlarge -> t3.small
"res-easy-002": 178.06, # db.r5.large+500GB -> db.t3.medium+50GB
"res-easy-003": 22.27, # terminate unused ALB
"res-easy-004": 22.27, # terminate unused NLB
"res-easy-005": 32.20, # S3 lifecycle policy (~70% savings)
"res-easy-006": 53.15, # t3.large -> t3.micro
"res-easy-007": 0.0, # skip (critical trap)
}