DevOps_Debugger / scenarios /level3 /scenarios.py
printf-sourav's picture
Initial commit
27cdb3e
Raw
History Blame Contribute Delete
6.29 kB
"""
Level 3 Scenarios — Multi-step fixes (3-5 steps).
"""
from __future__ import annotations
from typing import List
from scenarios.registry import Scenario
def _success_venv_rebuilt(output: str) -> bool:
"""Check if the virtualenv was successfully rebuilt."""
o = output.lower()
return ("successfully installed" in o or "requirement already satisfied" in o) and "flask" in o
def _success_config_fixed(output: str) -> bool:
"""Check if the config was fixed and service restarted."""
o = output.lower()
return "running on http://0.0.0.0" in o or "server running" in o or "success" in o
def _success_migration_done(output: str) -> bool:
"""Check if the migration completed successfully."""
o = output.lower()
return "upgrade" in o or "migration complete" in o or "success" in o
def get_level3_scenarios() -> List[Scenario]:
"""Return all Level 3 (multi-step fix) scenarios."""
return [
Scenario(
id="corrupt_venv",
level=3,
description="Virtual environment is broken, must delete + recreate + reinstall deps + verify.",
initial_state={"files": {}, "env_vars": {}, "processes": []},
success_condition=_success_venv_rebuilt,
hint_commands=[
"rm -rf /app/venv",
"python3 -m venv /app/venv",
"source /app/venv/bin/activate && pip install flask",
"source /app/venv/bin/activate && python -c 'import flask; print(\"Success\")'",
],
error_fingerprint=r"No module named|broken.*venv|bad interpreter",
setup_commands=[
"mkdir -p /app",
"python3 -m venv /app/venv",
"rm -rf /app/venv/lib",
"cat > /app/requirements.txt << 'PYEOF'\nflask>=2.0\nPYEOF",
],
initial_error_log=(
"$ source /app/venv/bin/activate && python -c 'import flask'\n"
"Error: /app/venv/bin/python: bad interpreter: No such file or directory\n"
"$ /app/venv/bin/pip install flask\n"
"bash: /app/venv/bin/pip: No such file or directory\n"
"The virtual environment appears to be broken.\n"
),
verification_command="source /app/venv/bin/activate && python -c 'import flask; print(\"flask ok\")'",
),
Scenario(
id="wrong_config_restart",
level=3,
description="App config has wrong host binding. Edit config + restart service + verify.",
initial_state={"files": {}, "env_vars": {}, "processes": []},
success_condition=_success_config_fixed,
hint_commands=[
"sed -i 's/127.0.0.1/0.0.0.0/' /app/config.py",
"kill $(lsof -t -i:8080) 2>/dev/null; true",
"python /app/server.py &",
],
error_fingerprint=r"Connection refused|config.*error|binding.*error",
setup_commands=[
"pip install flask -q",
"mkdir -p /app",
"cat > /app/config.py << 'PYEOF'\nHOST = '127.0.0.1'\nPORT = 8080\nDEBUG = True\nPYEOF",
"cat > /app/server.py << 'PYEOF'\nfrom flask import Flask\nfrom config import HOST, PORT\nimport sys\nsys.path.insert(0, '/app')\napp = Flask(__name__)\n@app.route('/')\ndef hello():\n return 'Server running'\nif __name__ == '__main__':\n print(f'Running on http://{HOST}:{PORT}')\n app.run(host=HOST, port=PORT)\nPYEOF",
],
initial_error_log=(
"$ curl http://0.0.0.0:8080/\n"
"curl: (7) Failed to connect to 0.0.0.0 port 8080: Connection refused\n"
"$ cat /app/config.py\n"
"HOST = '127.0.0.1'\n"
"PORT = 8080\n"
"DEBUG = True\n"
"The app binds to 127.0.0.1 only — not accessible externally.\n"
),
verification_command="curl -s http://0.0.0.0:8080/",
),
Scenario(
id="db_migration_fail",
level=3,
description="SQLAlchemy migration fails — downgrade + fix model + re-migrate + verify.",
initial_state={"files": {}, "env_vars": {}, "processes": []},
success_condition=_success_migration_done,
hint_commands=[
"cat > /app/models.py << 'PYEOF'\nfrom sqlalchemy import Column, Integer, String, create_engine\nfrom sqlalchemy.orm import declarative_base\nBase = declarative_base()\nclass User(Base):\n __tablename__ = 'users'\n id = Column(Integer, primary_key=True)\n name = Column(String(100), nullable=False)\n email = Column(String(200), unique=True)\nPYEOF",
"pip install sqlalchemy -q",
"python /app/migrate.py",
],
error_fingerprint=r"OperationalError|migration.*fail|sqlalchemy.*error",
setup_commands=[
"pip install sqlalchemy -q",
"mkdir -p /app",
"cat > /app/models.py << 'PYEOF'\nfrom sqlalchemy import Column, Integer, String, create_engine\nfrom sqlalchemy.orm import declarative_base\nBase = declarative_base()\nclass User(Base):\n __tablename__ = 'users'\n id = Column(Integer, primary_key=True)\n name = Column(String(100), nullable=False)\n email = Column(INVALID_TYPE, unique=True)\nPYEOF",
"cat > /app/migrate.py << 'PYEOF'\nimport sys\nsys.path.insert(0, '/app')\ntry:\n from models import Base\n from sqlalchemy import create_engine\n engine = create_engine('sqlite:///app.db')\n Base.metadata.create_all(engine)\n print('Migration complete - Success')\nexcept Exception as e:\n print(f'Migration failed: {e}')\n sys.exit(1)\nPYEOF",
],
initial_error_log=(
"$ python /app/migrate.py\n"
"Traceback (most recent call last):\n"
" File \"/app/models.py\", line 8, in <module>\n"
" email = Column(INVALID_TYPE, unique=True)\n"
"NameError: name 'INVALID_TYPE' is not defined\n"
"Migration failed.\n"
),
verification_command="python /app/migrate.py",
),
]