"""Seed the isolated load-test database: 500 agents in the six IT teams and a year of tickets (about 20,000) with comments. Runs inside a ServiceOps pod. Environment: LOADTEST_PASSWORD (required), USERS (500), TICKETS (20000).""" import os, random, sys from datetime import timedelta sys.path.insert(0, "/app") from app import create_app from serviceops_core.security import hash_password from serviceops_models import (Comment, GroupMember, SupportGroup, Tenant, Ticket, TicketAssignmentGroup, User, UserRoleGrant, db, now) USERS, TICKETS = int(os.environ.get("USERS", "500")), int(os.environ.get("TICKETS", "20000")) TEAMS = ["CoreApps", "Database", "Network", "Windows", "Unix", "SSD"] random.seed(42) with create_app().app_context(): tenant = Tenant.query.order_by(Tenant.id).first() groups = [] for name in TEAMS: g = SupportGroup.query.filter_by(name=name, tenant_id=tenant.id).first() if not g: g = SupportGroup(name=name, group_type="IT Fulfillment", tenant_id=tenant.id) db.session.add(g); db.session.flush() groups.append(g) pw = hash_password(os.environ["LOADTEST_PASSWORD"]) users = [] for i in range(1, USERS + 1): name = f"loadtest-{i:04d}" u = User.query.filter_by(username=name).first() if not u: u = User(username=name, name=f"Load Test {i:04d}", email=f"{name}@loadtest.invalid", password_hash=pw, role="agent", tenant_id=tenant.id) db.session.add(u); db.session.flush() db.session.add(UserRoleGrant(user_id=u.id, role="agent")) db.session.add(GroupMember(group_id=groups[i % len(groups)].id, user_id=u.id, role="member")) users.append(u) db.session.commit() have = Ticket.query.filter_by(tenant_id=tenant.id).count() start = now() - timedelta(days=365) states_inc = ["New", "In Progress", "On Hold", "Resolved", "Closed", "Closed", "Closed"] for batch in range(have, TICKETS, 1000): for n in range(batch, min(batch + 1000, TICKETS)): kind = "change" if n % 4 == 0 else "incident" created = start + timedelta(minutes=random.randint(0, 365 * 24 * 60)) requester = random.choice(users) t = Ticket(number=f"{'CHG' if kind == 'change' else 'INC'}{n + 1:07d}", kind=kind, title=f"{random.choice(['Disk alert on', 'Login failure on', 'Patch', 'Slow response from', 'Certificate renewal for'])} srv-{random.randint(1, 900):03d}", description="Seeded record for capacity testing. " * random.randint(1, 6), state=random.choice(states_inc) if kind == "incident" else random.choice(["New", "Assess", "Scheduled", "Closed"]), priority=f"P{random.randint(1, 4)}", requester_id=requester.id, assignee_id=random.choice(users).id, tenant_id=tenant.id, created_at=created, updated_at=created) db.session.add(t); db.session.flush() db.session.add(TicketAssignmentGroup(ticket_id=t.id, group_id=random.choice(groups).id)) for c in range(random.randint(0, 4)): db.session.add(Comment(ticket_id=t.id, user_id=random.choice(users).id, tenant_id=tenant.id, body=f"Work note {c + 1}: checked logs and updated the record.", created_at=created + timedelta(hours=c + 1))) db.session.commit() print("tickets", min(batch + 1000, TICKETS), flush=True) print("users", User.query.count(), "tickets", Ticket.query.count(), "comments", Comment.query.count())