=== STEP_034C2 WGPAY RUNBOOK CLEAN === timestamp=20260708-113830 mode=read-only / package only goal: cleanly extract exact test-peer creation/cancel runbook from VM121 WG Access tooling remote_changes=none === host/backend === wg-access-dev Wed Jul 8 11:38:31 UTC 2026 NAMES STATUS PORTS wgaccess-backend Up 41 hours 0.0.0.0:18080->8000/tcp wgaccess-postgres Up 41 hours (healthy) 127.0.0.1:15432->5432/tcp === health === {"status":"ok","service":"wg-access-backend","environment":"dev"} {"status":"ok","db":1} === openapi relevant paths === /admin/invites ['get', 'post'] /admin/jobs ['get'] /admin/maintenance/expire-subscriptions ['post'] /admin/peers ['get'] /admin/peers/{peer_id}/disable ['post'] /admin/subscriptions ['post'] /admin/subscriptions/{subscription_id}/cancel ['post'] /admin/users ['get'] /admin/users/by-email/{email} ['get'] /admin/users/{user_id} ['get'] /agent/jobs ['get'] /agent/jobs/{job_id}/complete ['post'] /agent/jobs/{job_id}/fail ['post'] /agent/jobs/{job_id}/start ['post'] /agent/peers ['get'] /dev/create-test-peer ['post'] === openapi relevant schemas === SCHEMA AdminSubscriptionResponse { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id" }, "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, "status": { "type": "string", "title": "Status" }, "plan_code": "type": "string", "title": "Plan Code" }, "auto_renew": { "type": "boolean", "title": "Auto Renew" }, "paid_until": { "type": "string", "format": "date-time", "title": "Paid Until" }, "created_at": { "type": "string", "format": "date-time", "title": "Created At" }, "canceled_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Canceled At" } }, "type": "object", "required": [ "id", "user_id", "status", "plan_code", "auto_renew", "paid_until", "created_at", "canceled_at" ], "title": "AdminSubscriptionResponse" } SCHEMA AdminUserJobResponse { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id" }, "node_id": { "type": "string", "title": "Node Id" }, "action": { "type": "string", "title": "Action" }, "peer_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Peer Id" }, "status": { "type": "string", "title": "Status" }, "attempts": { "type": "integer", "title": "Attempts" }, "created_at": { "type": "string", "format": "date-time", "title": "Created At" }, "last_error": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Last Error" } }, "type": "object", "required": [ "id", "node_id", "action", "peer_id", "status", "attempts", "created_at", "last_error" ], "title": "AdminUserJobResponse" } SCHEMA AdminUserPeerResponse { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id" }, "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, "node_id": { "type": "string", "title": "Node Id" }, "public_key": { "type": "string", "title": "Public Key" }, "tunnel_ip": { "type": "string", "title": "Tunnel Ip" }, "paid_until": { "type": "string", "format": "date-time", "title": "Paid Until" }, "enabled": { "type": "boolean", "title": "Enabled" }, "created_at": { "type": "string", "format": "date-time", "title": "Created At" }, "disabled_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Disabled At" } }, "type": "object", "required": [ "id", "user_id", "node_id", "public_key", "tunnel_ip", "paid_until", "enabled", "created_at", "disabled_at" ], "title": "AdminUserPeerResponse" } SCHEMA AgentJobResponse { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id" }, "node_id": { "type": "string", "title": "Node Id" }, "action": { "type": "string", "title": "Action" }, "peer_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Peer Id" }, "payload_json": { "additionalProperties": true, "type": "object", "title": "Payload Json" }, "status": { "type": "string", "title": "Status" }, "attempts": { "type": "integer", "title": "Attempts" }, "created_at": { "type": "string", "format": "date-time", "title": "Created At" } }, "type": "object", "required": [ "id", "node_id", "action", "peer_id", "payload_json", "status", "attempts", "created_at" ], "title": "AgentJobResponse" } SCHEMA AgentPeerResponse { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id" }, "node_id": { "type": "string", "title": "Node Id" }, "public_key": { "type": "string", "title": "Public Key" }, "preshared_key": "type": "string", "title": "Preshared Key" }, "tunnel_ip": { "type": "string", "title": "Tunnel Ip" }, "paid_until": { "type": "string", "format": "date-time", "title": "Paid Until" }, "enabled": { "type": "boolean", "title": "Enabled" } }, "type": "object", "required": [ "id", "node_id", "public_key", "preshared_key", "tunnel_ip", "paid_until", "enabled" ], "title": "AgentPeerResponse" } SCHEMA CancelSubscriptionResponse { "properties": { "subscription_id": { "type": "string", "format": "uuid", "title": "Subscription Id" }, "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, "status": { "type": "string", "title": "Status" }, "canceled_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Canceled At" }, "disabled_peer_count": { "type": "integer", "title": "Disabled Peer Count" }, "job_ids": { "items": { "type": "string", "format": "uuid" }, "type": "array", "title": "Job Ids" } }, "type": "object", "required": [ "subscription_id", "user_id", "status", "canceled_at", "disabled_peer_count", "job_ids" ], "title": "CancelSubscriptionResponse" } SCHEMA DisablePeerResponse { "properties": { "peer_id": { "type": "string", "format": "uuid", "title": "Peer Id" }, "job_id": { "type": "string", "format": "uuid", "title": "Job Id" }, "node_id": { "type": "string", "title": "Node Id" }, "public_key": { "type": "string", "title": "Public Key" }, "tunnel_ip": { "type": "string", "title": "Tunnel Ip" }, "enabled": { "type": "boolean", "title": "Enabled" } }, "type": "object", "required": [ "peer_id", "job_id", "node_id", "public_key", "tunnel_ip", "enabled" ], "title": "DisablePeerResponse" } SCHEMA ExpireSubscriptionsResponse { "properties": { "expired_subscription_count": { "type": "integer", "title": "Expired Subscription Count" }, "disabled_peer_count": { "type": "integer", "title": "Disabled Peer Count" }, "job_ids": { "items": { "type": "string", "format": "uuid" }, "type": "array", "title": "Job Ids" }, "subscription_ids": { "items": { "type": "string", "format": "uuid" }, "type": "array", "title": "Subscription Ids" } }, "type": "object", "required": [ "expired_subscription_count", "disabled_peer_count", "job_ids", "subscription_ids" ], "title": "ExpireSubscriptionsResponse" } SCHEMA InviteCreateRequest { "properties": { "note": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Note" }, "max_uses": { "type": "integer", "title": "Max Uses", "default": 1 } }, "type": "object", "title": "InviteCreateRequest" } SCHEMA JobResponse { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id" }, "node_id": { "type": "string", "title": "Node Id" }, "action": { "type": "string", "title": "Action" }, "status": { "type": "string", "title": "Status" }, "attempts": { "type": "integer", "title": "Attempts" }, "created_at": { "type": "string", "format": "date-time", "title": "Created At" }, "last_error": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Last Error" } }, "type": "object", "required": [ "id", "node_id", "action", "status", "attempts", "created_at", "last_error" ], "title": "JobResponse" } SCHEMA PeerResponse { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id" }, "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, "node_id": { "type": "string", "title": "Node Id" }, "public_key": { "type": "string", "title": "Public Key" }, "tunnel_ip": { "type": "string", "title": "Tunnel Ip" }, "paid_until": { "type": "string", "format": "date-time", "title": "Paid Until" }, "enabled": { "type": "boolean", "title": "Enabled" }, "created_at": { "type": "string", "format": "date-time", "title": "Created At" } }, "type": "object", "required": [ "id", "user_id", "node_id", "public_key", "tunnel_ip", "paid_until", "enabled", "created_at" ], "title": "PeerResponse" } SCHEMA SubscriptionCreateRequest { "properties": { "email": { "anyOf": [ { "type": "string", "format": "email" }, { "type": "null" } ], "title": "Email" }, "months": { "type": "integer", "maximum": 36.0, "minimum": 1.0, "title": "Months", "default": 1 }, "plan_code": "type": "string", "title": "Plan Code", "default": "manual" }, "node_id": { "type": "string", "title": "Node Id", "default": "ddn-test" }, "auto_renew": { "type": "boolean", "title": "Auto Renew", "default": false } }, "type": "object", "title": "SubscriptionCreateRequest" } SCHEMA SubscriptionCreateResponse { "properties": { "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, "subscription_id": { "type": "string", "format": "uuid", "title": "Subscription Id" }, "peer_id": { "type": "string", "format": "uuid", "title": "Peer Id" }, "job_id": { "type": "string", "format": "uuid", "title": "Job Id" }, "node_id": { "type": "string", "title": "Node Id" }, "tunnel_ip": { "type": "string", "title": "Tunnel Ip" }, "paid_until": { "type": "string", "format": "date-time", "title": "Paid Until" }, "private_key": "type": "string", "title": "Private Key" }, "public_key": { "type": "string", "title": "Public Key" }, "preshared_key": "type": "string", "title": "Preshared Key" }, "client_config": { "type": "string", "title": "Client Config" } }, "type": "object", "required": [ "user_id", "subscription_id", "peer_id", "job_id", "node_id", "tunnel_ip", "paid_until", "private_key", "public_key", "preshared_key", "client_config" ], "title": "SubscriptionCreateResponse" } SCHEMA TestPeerRequest { "properties": { "email": { "anyOf": [ { "type": "string", "format": "email" }, { "type": "null" } ], "title": "Email" }, "months": { "type": "integer", "title": "Months", "default": 2 }, "node_id": { "type": "string", "title": "Node Id", "default": "ddn-test" } }, "type": "object", "title": "TestPeerRequest" } SCHEMA TestPeerResponse { "properties": { "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, "peer_id": { "type": "string", "format": "uuid", "title": "Peer Id" }, "job_id": { "type": "string", "format": "uuid", "title": "Job Id" }, "tunnel_ip": { "type": "string", "title": "Tunnel Ip" }, "paid_until": { "type": "string", "format": "date-time", "title": "Paid Until" }, "private_key": "type": "string", "title": "Private Key" }, "public_key": { "type": "string", "title": "Public Key" }, "preshared_key": "type": "string", "title": "Preshared Key" }, "client_config": { "type": "string", "title": "Client Config" } }, "type": "object", "required": [ "user_id", "peer_id", "job_id", "tunnel_ip", "paid_until", "private_key", "public_key", "preshared_key", "client_config" ], "title": "TestPeerResponse" } === admin create/cancel/disable source excerpt === class SubscriptionCreateRequest(BaseModel): email: EmailStr | None = None months: int = Field(default=1, ge=1, le=36) plan_code: = "manual" node_id: str = "ddn-test" auto_renew: bool = False class SubscriptionCreateResponse(BaseModel): user_id: UUID subscription_id: UUID peer_id: UUID job_id: UUID node_id: str tunnel_ip: str paid_until: datetime private_key: public_key: str preshared_key: client_config: str @router.post("/subscriptions", response_model=SubscriptionCreateResponse) def create_subscription(payload: SubscriptionCreateRequest, db: Session = Depends(get_db)): # MVP admin/manual subscription endpoint. # It creates a user, an active subscription, a WG peer and a pending enable_peer job. # The private key intentionally returned once and not stored in DB. paid_until = datetime.now(timezone.utc) + timedelta(days=30 * payload.months) user = User(email=payload.email) db.add(user) db.flush() subscription = Subscription( user_id=user.id, status="active", plan_code=, auto_renew=payload.auto_renew, paid_until=paid_until, ) db.add(subscription) db.flush() tunnel_ip = next_tunnel_ip(db, payload.node_id) private_key, public_key = generate_wg_keypair() preshared_key = client_config = build_client_config(private_key, tunnel_ip, preshared_key) peer = Peer( user_id=user.id, node_id=payload.node_id, public_key=public_key, preshared_key=, tunnel_ip=tunnel_ip, paid_until=paid_until, enabled=True, ) db.add(peer) db.flush() job = ProvisioningJob( node_id=payload.node_id, action="enable_peer", peer_id=peer.id, payload_json={ "public_key": peer.public_key, "preshared_key": , "tunnel_ip": peer.tunnel_ip, "paid_until": peer.paid_until.isoformat(), }, status="pending", attempts=0, ) db.add(job) db.commit() db.refresh(subscription) db.refresh(peer) db.refresh(job) return SubscriptionCreateResponse( user_id=user.id, subscription_id=subscription.id, peer_id=peer.id, job_id=job.id, node_id=peer.node_id, tunnel_ip=peer.tunnel_ip, paid_until=peer.paid_until, private_key=, public_key=peer.public_key, preshared_key=, client_config=client_config, ) --- class CancelSubscriptionResponse(BaseModel): subscription_id: UUID user_id: UUID status: str canceled_at: datetime | None disabled_peer_count: int job_ids: list[UUID] @router.post("/subscriptions/{subscription_id}/cancel", response_model=CancelSubscriptionResponse) def cancel_subscription(subscription_id: UUID, db: Session = Depends(get_db)): subscription = db.get(Subscription, subscription_id) if not subscription: raise HTTPException(status_code=, detail="subscription not found") now = datetime.now(timezone.utc) # Idempotent business-level cancel: # cancel subscription once, then disable any currently enabled peers for this user. subscription.status = "canceled" subscription.auto_renew = False if subscription.canceled_at is None: subscription.canceled_at = now enabled_peers = db.execute( select(Peer) .where(Peer.user_id == subscription.user_id) .where(Peer.enabled == True) # noqa: E712 .order_by(Peer.created_at.desc()) ).scalars().all() jobs = [] for peer in enabled_peers: peer.enabled = False peer.disabled_at = now job = ProvisioningJob( node_id=peer.node_id, action="disable_peer", peer_id=peer.id, payload_json={ "public_key": peer.public_key, "tunnel_ip": peer.tunnel_ip, }, status="pending", attempts=0, ) db.add(job) jobs.append(job) db.commit() db.refresh(subscription) for job in jobs: db.refresh(job) return CancelSubscriptionResponse( subscription_id=subscription.id, user_id=subscription.user_id, status=subscription.status, canceled_at=subscription.canceled_at, disabled_peer_count=len(enabled_peers), job_ids=[job.id for job in jobs], ) class DisablePeerResponse(BaseModel): peer_id: UUID job_id: UUID node_id: str public_key: str tunnel_ip: str enabled: bool @router.post("/peers/{peer_id}/disable", response_model=DisablePeerResponse) def disable_peer(peer_id: UUID, db: Session = Depends(get_db)): peer = db.get(Peer, peer_id) if not peer: from fastapi import HTTPException raise HTTPException(status_code=, detail="peer not found") peer.enabled = False peer.disabled_at = datetime.now(timezone.utc) job = ProvisioningJob( node_id=peer.node_id, action="disable_peer", peer_id=peer.id, payload_json={ "public_key": peer.public_key, "tunnel_ip": peer.tunnel_ip, }, status="pending", attempts=0, ) db.add(job) db.commit() db.refresh(peer) db.refresh(job) return DisablePeerResponse( peer_id=peer.id, job_id=job.id, node_id=peer.node_id, public_key=peer.public_key, tunnel_ip=peer.tunnel_ip, enabled=peer.enabled, ) === dev create-test-peer source excerpt if exists === /opt/wg-access/backend/app/main.py:7:from app.api.dev import router as dev_router /opt/wg-access/backend/app/main.py:13:app.include_router(dev_router) /opt/wg-access/backend/app/config.py:6: environment: str = "dev" /opt/wg-access/backend/app/config.py:7: agent_token: = "dev-agent-token" /opt/wg-access/backend/app/api/dev.py.BEFORE_CLIENT_CONFIG_RESPONSE.20260704-151636:16:router = APIRouter(prefix="/dev", tags=["dev"]) /opt/wg-access/backend/app/api/dev.py.BEFORE_CLIENT_CONFIG_RESPONSE.20260704-151636:71:@router.post("/create-test-peer", response_model=TestPeerResponse) /opt/wg-access/backend/app/api/dev.py:18:router = APIRouter(prefix="/dev", tags=["dev"]) /opt/wg-access/backend/app/api/dev.py:20:def require_dev_environment(): /opt/wg-access/backend/app/api/dev.py:21: if settings.environment != "dev": /opt/wg-access/backend/app/api/dev.py:44:@router.post("/create-test-peer", response_model=TestPeerResponse) /opt/wg-access/backend/app/api/dev.py:48: _: None = Depends(require_dev_environment), /opt/wg-access/backend/app/api/dev.py.BEFORE_REAL_WG_KEYS.20260704-132545:13:router = APIRouter(prefix="/dev", tags=["dev"]) /opt/wg-access/backend/app/api/dev.py.BEFORE_REAL_WG_KEYS.20260704-132545:44:@router.post("/create-test-peer", response_model=TestPeerResponse) === node_id / mgts hints in statuses and smoke artifacts === /opt/wg-access/STATUS-STEP-005_API_DB_OK.txt:32: GET /agent/jobs?node_id=... /opt/wg-access/STATUS-STEP-005_API_DB_OK.txt:33: POST /agent/jobs/{job_id}/start /opt/wg-access/STATUS-STEP-005_API_DB_OK.txt:34: POST /agent/jobs/{job_id}/complete /opt/wg-access/STATUS-STEP-005_API_DB_OK.txt:35: POST /agent/jobs/{job_id}/fail /opt/wg-access/STATUS-STEP-006_AGENT_PULL_API_OK.txt:8: - GET /agent/jobs?node_id=... /opt/wg-access/STATUS-STEP-006_AGENT_PULL_API_OK.txt:9: - POST /agent/jobs/{job_id}/start /opt/wg-access/STATUS-STEP-006_AGENT_PULL_API_OK.txt:10: - POST /agent/jobs/{job_id}/complete /opt/wg-access/STATUS-STEP-006_AGENT_PULL_API_OK.txt:11: - POST /agent/jobs/{job_id}/fail /opt/wg-access/STATUS-STEP-006_AGENT_PULL_API_OK.txt:14: - pending job fetched by node_id /opt/wg-access/STATUS-STEP-010_AGENT_SSH_TO_VM100_OK.txt:18: ip -br addr show wg_paid /opt/wg-access/STATUS-STEP-010_AGENT_SSH_TO_VM100_OK.txt:19: wg show wg_paid /opt/wg-access/STATUS-STEP-010_AGENT_SSH_TO_VM100_OK.txt:23: interface: wg_paid /opt/wg-access/STATUS-STEP-010_AGENT_SSH_TO_VM100_OK.txt:31: - add real peers to VM100 wg_paid /opt/wg-access/STATUS-STEP-011_MANUAL_WG_SET_VM100_OK.txt:14: interface: wg_paid /opt/wg-access/STATUS-STEP-011_MANUAL_WG_SET_VM100_OK.txt:18: 2. Added peer to VM100 wg_paid using SSH + wg set. /opt/wg-access/STATUS-STEP-011_MANUAL_WG_SET_VM100_OK.txt:19: 3. Confirmed peer appeared in wg show wg_paid: /opt/wg-access/STATUS-STEP-011_MANUAL_WG_SET_VM100_OK.txt:22: wg set wg_paid peer remove /opt/wg-access/STATUS-STEP-011_MANUAL_WG_SET_VM100_OK.txt:23: 5. Confirmed wg_paid is clean again. /opt/wg-access/STATUS-STEP-011_MANUAL_WG_SET_VM100_OK.txt:25:Current VM100 wg_paid state: /opt/wg-access/STATUS-STEP-012_REAL_AGENT_PROVISION_VM100_OK.txt:13: 5. Agent executed wg set on VM100 wg_paid. /opt/wg-access/STATUS-STEP-012_REAL_AGENT_PROVISION_VM100_OK.txt:14: 6. Peer appeared in VM100 wg_paid. /opt/wg-access/STATUS-STEP-012_REAL_AGENT_PROVISION_VM100_OK.txt:32: interface: wg_paid /opt/wg-access/STATUS-STEP-012_REAL_AGENT_PROVISION_VM100_OK.txt:37: tunnel_ip: 10.253.1.14/32 /opt/wg-access/STATUS-STEP-012_REAL_AGENT_PROVISION_VM100_OK.txt:44: One real test peer remains active on VM100 wg_paid. /opt/wg-access/STATUS-STEP-013_WG_HANDSHAKE_VM121_TO_VM100_OK.txt:17: interface: wg_paid /opt/wg-access/STATUS-STEP-013_WG_HANDSHAKE_VM121_TO_VM100_OK.txt:29: - VM100 wg show wg_paid showed endpoint 192.168.30.83: /opt/wg-access/STATUS-STEP-013_WG_HANDSHAKE_VM121_TO_VM100_OK.txt:30: - VM100 wg show wg_paid showed latest handshake /opt/wg-access/STATUS-STEP-014_AGENT_RECONCILE_SYNC_OK.txt:9: VM100 wg_paid peers added with runtime wg set are not persistent across reboot, /opt/wg-access/STATUS-STEP-014_AGENT_RECONCILE_SYNC_OK.txt:14: GET /agent/peers?node_id=ddn-test /opt/wg-access/STATUS-STEP-014_AGENT_RECONCILE_SYNC_OK.txt:19: - tunnel_ip /opt/wg-access/STATUS-STEP-014_AGENT_RECONCILE_SYNC_OK.txt:26: wg show wg_paid allowed-ips /opt/wg-access/STATUS-STEP-014_AGENT_RECONCILE_SYNC_OK.txt:28: wg set wg_paid peer ... preshared-key allowed-ips ... /opt/wg-access/STATUS-STEP-014_AGENT_RECONCILE_SYNC_OK.txt:33: 1. Manually removed real peer from VM100 wg_paid. /opt/wg-access/STATUS-STEP-014_AGENT_RECONCILE_SYNC_OK.txt:39: tunnel_ip: 10.253.1.14/32 /opt/wg-access/STATUS-STEP-014_AGENT_RECONCILE_SYNC_OK.txt:44: sync set peer tunnel_ip=10.253.1.14 /opt/wg-access/STATUS-STEP-014_AGENT_RECONCILE_SYNC_OK.txt:50: - VM100 wg_paid contains the enabled real peer. /opt/wg-access/STATUS-STEP-015_DISABLE_DEPROVISION_OK.txt:10: POST /admin/peers/{peer_id}/disable /opt/wg-access/STATUS-STEP-015_DISABLE_DEPROVISION_OK.txt:20: tunnel_ip /opt/wg-access/STATUS-STEP-015_DISABLE_DEPROVISION_OK.txt:23: peer_id: 813515db-bf25-46c9-bc83-c9c45d51ba68 /opt/wg-access/STATUS-STEP-015_DISABLE_DEPROVISION_OK.txt:25: tunnel_ip: 10.253.1.14 /opt/wg-access/STATUS-STEP-015_DISABLE_DEPROVISION_OK.txt:32: - agent removed runtime peer from VM100 wg_paid /opt/wg-access/STATUS-STEP-015_DISABLE_DEPROVISION_OK.txt:35: - VM100 wg_paid has no peers after agent run /opt/wg-access/STATUS-STEP-015_DISABLE_DEPROVISION_OK.txt:41: wg_paid is up /opt/wg-access/STATUS-STEP-015_DISABLE_DEPROVISION_OK.txt:42: wg_paid has no peers /opt/wg-access/STATUS-STEP-016_CLIENT_CONFIG_RESPONSE_OK.txt:30: tunnel_ip: 10.253.1.15/32 /opt/wg-access/STATUS-STEP-016_CLIENT_CONFIG_RESPONSE_OK.txt:32: job_id: ca3e15c1-91ba-435c-8a40-37faa9e101c9 /opt/wg-access/STATUS-STEP-016_CLIENT_CONFIG_RESPONSE_OK.txt:40: wg_paid contains peer: /opt/wg-access/STATUS-STEP-016_CLIENT_CONFIG_RESPONSE_OK.txt:45: wg_paid is up /opt/wg-access/STATUS-STEP-017_GENERATED_CLIENT_CONFIG_HANDSHAKE_OK.txt:14: 5. Agent provisioned the peer to VM100 wg_paid. /opt/wg-access/STATUS-STEP-017_GENERATED_CLIENT_CONFIG_HANDSHAKE_OK.txt:21: peer_id: 1b19ed83-1cad-4d57-be9f-fded5270213c /opt/wg-access/STATUS-STEP-017_GENERATED_CLIENT_CONFIG_HANDSHAKE_OK.txt:22: job_id: 7a8fe618-7dc9-4eea-80e7-c4fd09ac2172 /opt/wg-access/STATUS-STEP-017_GENERATED_CLIENT_CONFIG_HANDSHAKE_OK.txt:23: tunnel_ip: 10.253.1.16/32 /opt/wg-access/STATUS-STEP-017_GENERATED_CLIENT_CONFIG_HANDSHAKE_OK.txt:40: VM100 wg_paid is up. /opt/wg-access/STATUS-STEP-017_GENERATED_CLIENT_CONFIG_HANDSHAKE_OK.txt:44: VM100 wg_paid has both peers. /opt/wg-access/STATUS-STEP-018_POOL_16_AND_REUSE_ALLOCATOR_OK.txt:9: wg_paid address changed from: /opt/wg-access/STATUS-STEP-018_POOL_16_AND_REUSE_ALLOCATOR_OK.txt:15: 10.253.0.0/16 dev wg_paid /opt/wg-access/STATUS-STEP-018_POOL_16_AND_REUSE_ALLOCATOR_OK.txt:17: After wg_paid reload runtime peers disappeared as expected. /opt/wg-access/STATUS-STEP-018_POOL_16_AND_REUSE_ALLOCATOR_OK.txt:22: uq_peers_node_tunnel_ip UNIQUE (node_id, tunnel_ip) /opt/wg-access/STATUS-STEP-018_POOL_16_AND_REUSE_ALLOCATOR_OK.txt:25: uq_peers_node_tunnel_ip_enabled /opt/wg-access/STATUS-STEP-018_POOL_16_AND_REUSE_ALLOCATOR_OK.txt:26: ON peers (node_id, tunnel_ip) /opt/wg-access/STATUS-STEP-018_POOL_16_AND_REUSE_ALLOCATOR_OK.txt:30: Disabled historical peers may keep old tunnel_ip values. /opt/wg-access/STATUS-STEP-018_POOL_16_AND_REUSE_ALLOCATOR_OK.txt:31: Enabled peers cannot duplicate tunnel_ip on the same node. /opt/wg-access/STATUS-STEP-018_POOL_16_AND_REUSE_ALLOCATOR_OK.txt:34: backend/app/api/dev.py next_tunnel_ip() changed from count-based allocation /opt/wg-access/STATUS-STEP-018_POOL_16_AND_REUSE_ALLOCATOR_OK.txt:46: backend/app/models/core.py old global tunnel_ip UniqueConstraint removed/commented. /opt/wg-access/STATUS-STEP-018_POOL_16_AND_REUSE_ALLOCATOR_OK.txt:51: tunnel_ip: 10.253.1.10 /opt/wg-access/STATUS-STEP-018_POOL_16_AND_REUSE_ALLOCATOR_OK.txt:55: peer_id: 9298ec04-26cf-44a7-8079-7a13664612fa /opt/wg-access/STATUS-STEP-018_POOL_16_AND_REUSE_ALLOCATOR_OK.txt:56: job_id: bda6e96e-ef56-44f6-8bc0-867b91ac59bb /opt/wg-access/STATUS-STEP-018_POOL_16_AND_REUSE_ALLOCATOR_OK.txt:57: tunnel_ip: 10.253.1.10 /opt/wg-access/STATUS-STEP-018_POOL_16_AND_REUSE_ALLOCATOR_OK.txt:64: VM100 wg_paid contains enabled peers: /opt/wg-access/STATUS-STEP-018_POOL_16_AND_REUSE_ALLOCATOR_OK.txt:70: VM100 wg_paid is /16 and up. /opt/wg-access/STATUS-STEP-019A_TEST_PEERS_CLEANED_OK.txt:10: peer_id: 9298ec04-26cf-44a7-8079-7a13664612fa /opt/wg-access/STATUS-STEP-019A_TEST_PEERS_CLEANED_OK.txt:11: disable_job_id: fb2c12a5-3f22-4c55-94f1-091240e0019a /opt/wg-access/STATUS-STEP-019A_TEST_PEERS_CLEANED_OK.txt:14: peer_id: 13543224-39f7-4cfc-917d-66a16e2e0e55 /opt/wg-access/STATUS-STEP-019A_TEST_PEERS_CLEANED_OK.txt:15: disable_job_id: 652f82c5-4243-4618-bf17-ccfea3e44d54 /opt/wg-access/STATUS-STEP-019A_TEST_PEERS_CLEANED_OK.txt:18: peer_id: 1b19ed83-1cad-4d57-be9f-fded5270213c /opt/wg-access/STATUS-STEP-019A_TEST_PEERS_CLEANED_OK.txt:19: disable_job_id: d607c313-cacd-4650-9d39-47c7d43817d6 /opt/wg-access/STATUS-STEP-019A_TEST_PEERS_CLEANED_OK.txt:23: removed all extra runtime peers from VM100 wg_paid /opt/wg-access/STATUS-STEP-019A_TEST_PEERS_CLEANED_OK.txt:28: wg_paid remains up /opt/wg-access/STATUS-STEP-019A_TEST_PEERS_CLEANED_OK.txt:30: route: 10.253.0.0/16 dev wg_paid /opt/wg-access/STATUS-STEP-019A_TEST_PEERS_CLEANED_OK.txt:37: Clean /16 wg_paid network. /opt/wg-access/STATUS-STEP-019B_CLEAN_POOL_SMOKE_OK.txt:10: VM100 wg_paid was clean: /opt/wg-access/STATUS-STEP-019B_CLEAN_POOL_SMOKE_OK.txt:16: peer_id: 6a5f1655-8ebe-435e-bba6-1af2412d40c2 /opt/wg-access/STATUS-STEP-019B_CLEAN_POOL_SMOKE_OK.txt:17: enable_job_id: cb23b57d-7ec7-4804-a045-495a23705f5d /opt/wg-access/STATUS-STEP-019B_CLEAN_POOL_SMOKE_OK.txt:18: tunnel_ip: 10.253.1.10 /opt/wg-access/STATUS-STEP-019B_CLEAN_POOL_SMOKE_OK.txt:26: Agent added peer to VM100 wg_paid. /opt/wg-access/STATUS-STEP-019B_CLEAN_POOL_SMOKE_OK.txt:49: peer_id: 6a5f1655-8ebe-435e-bba6-1af2412d40c2 /opt/wg-access/STATUS-STEP-019B_CLEAN_POOL_SMOKE_OK.txt:50: disable_job_id: 8b21d24d-d575-4224-a281-bd2456cccb37 /opt/wg-access/STATUS-STEP-019B_CLEAN_POOL_SMOKE_OK.txt:51: tunnel_ip: 10.253.1.10 /opt/wg-access/STATUS-STEP-019B_CLEAN_POOL_SMOKE_OK.txt:56: Agent removed runtime peer from VM100 wg_paid. /opt/wg-access/STATUS-STEP-019B_CLEAN_POOL_SMOKE_OK.txt:61: VM100 wg_paid: /opt/wg-access/STATUS-STEP-019B_CLEAN_POOL_SMOKE_OK.txt:68: VM100 wg_paid is clean and ready. /opt/wg-access/STATUS-STEP-020C_AGENT_TIMER_REAL_PERIODIC_OK.txt:44: VM100 wg_paid: /opt/wg-access/STATUS-STEP-020C_AGENT_TIMER_REAL_PERIODIC_OK.txt:46: route: 10.253.0.0/16 dev wg_paid /opt/wg-access/STATUS-STEP-020D_TIMER_AUTO_PROVISION_DEPROVISION_OK.txt:19: peer_id: 267835b6-84b6-4527-bd47-eee963e7a5c9 /opt/wg-access/STATUS-STEP-020D_TIMER_AUTO_PROVISION_DEPROVISION_OK.txt:20: enable_job_id: 1912c96e-bda5-4af1-a9ea-9a81a27344fd /opt/wg-access/STATUS-STEP-020D_TIMER_AUTO_PROVISION_DEPROVISION_OK.txt:21: tunnel_ip: 10.253.1.10 /opt/wg-access/STATUS-STEP-020D_TIMER_AUTO_PROVISION_DEPROVISION_OK.txt:32: wg_paid had peer: /opt/wg-access/STATUS-STEP-020D_TIMER_AUTO_PROVISION_DEPROVISION_OK.txt:55: peer_id: 267835b6-84b6-4527-bd47-eee963e7a5c9 /opt/wg-access/STATUS-STEP-020D_TIMER_AUTO_PROVISION_DEPROVISION_OK.txt:56: disable_job_id: 9057b4c7-68b5-4b9e-8cf0-f624a07e30d0 /opt/wg-access/STATUS-STEP-020D_TIMER_AUTO_PROVISION_DEPROVISION_OK.txt:57: tunnel_ip: 10.253.1.10 /opt/wg-access/STATUS-STEP-020D_TIMER_AUTO_PROVISION_DEPROVISION_OK.txt:70: VM100 wg_paid: /opt/wg-access/STATUS-STEP-020D_TIMER_AUTO_PROVISION_DEPROVISION_OK.txt:72: route: 10.253.0.0/16 dev wg_paid /opt/wg-access/STATUS-STEP-020D_TIMER_AUTO_PROVISION_DEPROVISION_OK.txt:77: VM100 wg_paid clean. /opt/wg-access/STATUS-STEP-021C_ADMIN_SUBSCRIPTION_FLOW_OK.txt:31: subscription_id: 54b8c5b7-430d-425a-8fc0-909eeb0cab9d /opt/wg-access/STATUS-STEP-021C_ADMIN_SUBSCRIPTION_FLOW_OK.txt:32: peer_id: 00fde00e-a169-4397-841f-5cc99de475d5 /opt/wg-access/STATUS-STEP-021C_ADMIN_SUBSCRIPTION_FLOW_OK.txt:33: enable_job_id: bb71b4cd-a615-45f5-9135-4aa0efca9cb7 /opt/wg-access/STATUS-STEP-021C_ADMIN_SUBSCRIPTION_FLOW_OK.txt:34: node_id: ddn-test /opt/wg-access/STATUS-STEP-021C_ADMIN_SUBSCRIPTION_FLOW_OK.txt:35: tunnel_ip: 10.253.1.10 /opt/wg-access/STATUS-STEP-021C_ADMIN_SUBSCRIPTION_FLOW_OK.txt:63: POST /admin/peers/{peer_id}/disable /opt/wg-access/STATUS-STEP-021C_ADMIN_SUBSCRIPTION_FLOW_OK.txt:66: disable_job_id: 6e273fdf-781f-4992-ad42-4bf83bc7b6f5 /opt/wg-access/STATUS-STEP-021C_ADMIN_SUBSCRIPTION_FLOW_OK.txt:73: VM100 wg_paid: /opt/wg-access/STATUS-STEP-021C_ADMIN_SUBSCRIPTION_FLOW_OK.txt:75: route: 10.253.0.0/16 dev wg_paid /opt/wg-access/STATUS-STEP-021C_ADMIN_SUBSCRIPTION_FLOW_OK.txt:84: VM100 wg_paid clean. /opt/wg-access/STATUS-STEP-022B_DEV_ENDPOINT_USES_SHARED_WG_SERVICE_OK.txt:18: next_tunnel_ip /opt/wg-access/STATUS-STEP-022B_DEV_ENDPOINT_USES_SHARED_WG_SERVICE_OK.txt:29: peer_id: da134a09-caa8-4209-bbfa-93dd06f310fb /opt/wg-access/STATUS-STEP-022B_DEV_ENDPOINT_USES_SHARED_WG_SERVICE_OK.txt:30: enable_job_id: 13a61a08-8eeb-4402-8a5c-624bc606c023 /opt/wg-access/STATUS-STEP-022B_DEV_ENDPOINT_USES_SHARED_WG_SERVICE_OK.txt:31: node_id: ddn-test /opt/wg-access/STATUS-STEP-022B_DEV_ENDPOINT_USES_SHARED_WG_SERVICE_OK.txt:32: tunnel_ip: 10.253.1.10 /opt/wg-access/STATUS-STEP-022B_DEV_ENDPOINT_USES_SHARED_WG_SERVICE_OK.txt:57: POST /admin/peers/{peer_id}/disable /opt/wg-access/STATUS-STEP-022B_DEV_ENDPOINT_USES_SHARED_WG_SERVICE_OK.txt:60: disable_job_id: ef0e8472-6e80-45eb-9bcb-ec0a9d7be598 /opt/wg-access/STATUS-STEP-022B_DEV_ENDPOINT_USES_SHARED_WG_SERVICE_OK.txt:67: VM100 wg_paid: /opt/wg-access/STATUS-STEP-022B_DEV_ENDPOINT_USES_SHARED_WG_SERVICE_OK.txt:69: route: 10.253.0.0/16 dev wg_paid /opt/wg-access/STATUS-STEP-022B_DEV_ENDPOINT_USES_SHARED_WG_SERVICE_OK.txt:78: VM100 wg_paid clean. /opt/wg-access/STATUS-STEP-023A_DEV_ENDPOINT_GUARD_OK.txt:32: peer_id: 486ee88e-2515-4203-8541-44f89cdaba89 /opt/wg-access/STATUS-STEP-023A_DEV_ENDPOINT_GUARD_OK.txt:33: enable_job_id: cef3e913-d69a-4f61-a5af-7d10eeb8b2da /opt/wg-access/STATUS-STEP-023A_DEV_ENDPOINT_GUARD_OK.txt:34: node_id: ddn-test /opt/wg-access/STATUS-STEP-023A_DEV_ENDPOINT_GUARD_OK.txt:35: tunnel_ip: 10.253.1.10 /opt/wg-access/STATUS-STEP-023A_DEV_ENDPOINT_GUARD_OK.txt:44: peer appeared on wg_paid: /opt/wg-access/STATUS-STEP-023A_DEV_ENDPOINT_GUARD_OK.txt:50: POST /admin/peers/{peer_id}/disable /opt/wg-access/STATUS-STEP-023A_DEV_ENDPOINT_GUARD_OK.txt:53: disable_job_id: de335c08-7807-465b-9065-bce2c77a955f /opt/wg-access/STATUS-STEP-023A_DEV_ENDPOINT_GUARD_OK.txt:61: VM100 wg_paid: /opt/wg-access/STATUS-STEP-023A_DEV_ENDPOINT_GUARD_OK.txt:63: route: 10.253.0.0/16 dev wg_paid /opt/wg-access/STATUS-STEP-024A_ADMIN_USER_VIEW_OK.txt:50: peer_id: 486ee88e-2515-4203-8541-44f89cdaba89 /opt/wg-access/STATUS-STEP-024A_ADMIN_USER_VIEW_OK.txt:52: tunnel_ip: 10.253.1.10 /opt/wg-access/STATUS-STEP-024A_ADMIN_USER_VIEW_OK.txt:57: job_id: de335c08-7807-465b-9065-bce2c77a955f /opt/wg-access/STATUS-STEP-024A_ADMIN_USER_VIEW_OK.txt:62: job_id: cef3e913-d69a-4f61-a5af-7d10eeb8b2da /opt/wg-access/STATUS-STEP-024A_ADMIN_USER_VIEW_OK.txt:77: VM100 wg_paid: /opt/wg-access/STATUS-STEP-024A_ADMIN_USER_VIEW_OK.txt:79: route: 10.253.0.0/16 dev wg_paid /opt/wg-access/STATUS-STEP-024A_ADMIN_USER_VIEW_OK.txt:88: VM100 wg_paid clean. /opt/wg-access/STATUS-STEP-025A_CANCEL_SUBSCRIPTION_OK.txt:12: POST /admin/subscriptions/{subscription_id}/cancel /opt/wg-access/STATUS-STEP-025A_CANCEL_SUBSCRIPTION_OK.txt:28: subscription_id /opt/wg-access/STATUS-STEP-025A_CANCEL_SUBSCRIPTION_OK.txt:33: job_ids /opt/wg-access/STATUS-STEP-025A_CANCEL_SUBSCRIPTION_OK.txt:40: POST /admin/subscriptions/{subscription_id}/cancel /opt/wg-access/STATUS-STEP-025A_CANCEL_SUBSCRIPTION_OK.txt:51: subscription_id: 26794caf-ab42-4cb7-8270-5e87e7b1d47d /opt/wg-access/STATUS-STEP-025A_CANCEL_SUBSCRIPTION_OK.txt:52: peer_id: 3460b486-358c-44d6-8f47-c960d6254e3a /opt/wg-access/STATUS-STEP-025A_CANCEL_SUBSCRIPTION_OK.txt:53: enable_job_id: 74ccc2cf-bbb2-4621-8bbe-ce3096d8366d /opt/wg-access/STATUS-STEP-025A_CANCEL_SUBSCRIPTION_OK.txt:54: node_id: ddn-test /opt/wg-access/STATUS-STEP-025A_CANCEL_SUBSCRIPTION_OK.txt:55: tunnel_ip: 10.253.1.10 /opt/wg-access/STATUS-STEP-025A_CANCEL_SUBSCRIPTION_OK.txt:64: peer appeared on wg_paid: /opt/wg-access/STATUS-STEP-025A_CANCEL_SUBSCRIPTION_OK.txt:69: subscription_id: 26794caf-ab42-4cb7-8270-5e87e7b1d47d /opt/wg-access/STATUS-STEP-025A_CANCEL_SUBSCRIPTION_OK.txt:74: job_ids: /opt/wg-access/STATUS-STEP-025A_CANCEL_SUBSCRIPTION_OK.txt:94: Second POST /admin/subscriptions/{subscription_id}/cancel returned: /opt/wg-access/STATUS-STEP-025A_CANCEL_SUBSCRIPTION_OK.txt:97: job_ids: [] /opt/wg-access/STATUS-STEP-025A_CANCEL_SUBSCRIPTION_OK.txt:102: VM100 wg_paid: /opt/wg-access/STATUS-STEP-025A_CANCEL_SUBSCRIPTION_OK.txt:104: route: 10.253.0.0/16 dev wg_paid /opt/wg-access/STATUS-STEP-025A_CANCEL_SUBSCRIPTION_OK.txt:113: VM100 wg_paid clean. /opt/wg-access/STATUS-STEP-026A_EXPIRE_SUBSCRIPTIONS_OK.txt:29: job_ids /opt/wg-access/STATUS-STEP-026A_EXPIRE_SUBSCRIPTIONS_OK.txt:30: subscription_ids /opt/wg-access/STATUS-STEP-026A_EXPIRE_SUBSCRIPTIONS_OK.txt:38: POST /admin/subscriptions/{subscription_id}/cancel /opt/wg-access/STATUS-STEP-026A_EXPIRE_SUBSCRIPTIONS_OK.txt:47: subscription_id: 7a3dfe11-ebf3-4f5e-966b-73fdbe464426 /opt/wg-access/STATUS-STEP-026A_EXPIRE_SUBSCRIPTIONS_OK.txt:48: peer_id: f45a349d-25a7-426d-b88a-4479b28aec18 /opt/wg-access/STATUS-STEP-026A_EXPIRE_SUBSCRIPTIONS_OK.txt:49: enable_job_id: 838a2aaf-64ed-4346-9996-1ef7889fda2f /opt/wg-access/STATUS-STEP-026A_EXPIRE_SUBSCRIPTIONS_OK.txt:50: node_id: ddn-test /opt/wg-access/STATUS-STEP-026A_EXPIRE_SUBSCRIPTIONS_OK.txt:51: tunnel_ip: 10.253.1.10 /opt/wg-access/STATUS-STEP-026A_EXPIRE_SUBSCRIPTIONS_OK.txt:60: peer appeared on wg_paid: /opt/wg-access/STATUS-STEP-026A_EXPIRE_SUBSCRIPTIONS_OK.txt:71: job_ids: /opt/wg-access/STATUS-STEP-026A_EXPIRE_SUBSCRIPTIONS_OK.txt:73: subscription_ids: /opt/wg-access/STATUS-STEP-026A_EXPIRE_SUBSCRIPTIONS_OK.txt:96: job_ids: [] /opt/wg-access/STATUS-STEP-026A_EXPIRE_SUBSCRIPTIONS_OK.txt:97: subscription_ids: [] /opt/wg-access/STATUS-STEP-026A_EXPIRE_SUBSCRIPTIONS_OK.txt:102: VM100 wg_paid: /opt/wg-access/STATUS-STEP-026A_EXPIRE_SUBSCRIPTIONS_OK.txt:104: route: 10.253.0.0/16 dev wg_paid /opt/wg-access/STATUS-STEP-026A_EXPIRE_SUBSCRIPTIONS_OK.txt:113: VM100 wg_paid clean. /opt/wg-access/STATUS-STEP-028A_MGTS_WG_PAID_E2E_OK.txt:7: MGTS wg_paid production lifecycle and E2E routing smoke passed. /opt/wg-access/STATUS-STEP-028A_MGTS_WG_PAID_E2E_OK.txt:12: REMOTE_WG_INTERFACE=wg_paid /opt/wg-access/STATUS-STEP-028A_MGTS_WG_PAID_E2E_OK.txt:24: -> agent executed runtime wg set on MGTS VM100 wg_paid /opt/wg-access/STATUS-STEP-028A_MGTS_WG_PAID_E2E_OK.txt:25: -> peer appeared on MGTS VM100 wg_paid /opt/wg-access/STATUS-STEP-028A_MGTS_WG_PAID_E2E_OK.txt:49: -> peer removed from MGTS VM100 wg_paid /opt/wg-access/tmp/mgts-smoke-20260706-184120/smoke.env:1:WORK=/opt/wg-access/tmp/mgts-smoke-20260706-184120 /opt/wg-access/tmp/mgts-smoke-20260706-184120/create.json:1:{"user_id":"13783bf9-94bb-4c90-b1c6-685a956a5c43","subscription_id":"8adb06a9-713a-46b0-8759-d11c28a797fc","peer_id":"3d03a7a2-c009-48a4-b6ff-214326d26fc0","job_id":"814ba665-f6e5-4ba4-b1ba-8af1ec4954e6","node_id":"ddn-test","tunnel_ip":"10.253.1.10","paid_until":"2026-08-05T18:41:20.288079Z","private_key":"","public_key":"zUUEdc+Lac9C6fmMDVosuO3ZIYHIUDWi34UVgdjhbCU=","preshared_key":"","client_config":"[Interface]\nPrivateKey = = 10.253.1.10/32\n\n[Peer]\nPublicKey = rNdcZimQJKT6nb4wPmUFN/95bZfKDDsXsp1ie8nn1SU=\nPresharedKey = = 192.168.30.1:51830\nAllowedIPs = 10.253.1.1/32\nPersistentKeepalive = 25\n"} /opt/wg-access/tmp/mgts-smoke-20260706-183921/peers-before.json:1:[{"id":"0f808400-74ad-437b-a716-c6389aa3f057","user_id":"2cc7ce32-acc1-4258-92c6-bccd2febb7b6","node_id":"ddn-test","public_key":"Y9RXkNshIhljMAjSX9nyGZQLephRVV0TfIZfMhFn6R0=","tunnel_ip":"10.253.1.10","paid_until":"2026-07-03T10:37:18.258073Z","enabled":false,"created_at":"2026-07-05T10:37:15.949762Z"},{"id":"28aefe9e-25b0-434a-aedc-a4df15609e98","user_id":"a1957370-4921-4639-b4a9-6e6e05ab8c95","node_id":"ddn-test","public_key":"4U6GMvepAeuuXDaGryZQ9RSeomQfBCBbuKRdvNqbIQw=","tunnel_ip":"10.253.1.10","paid_until":"2026-07-03T10:35:48.458083Z","enabled":false,"created_at":"2026-07-05T10:35:47.463427Z"},{"id":"40b76a1d-e1ef-4a26-ac11-f39043a6a190","user_id":"07f03547-19ee-4068-ba4b-3ba504490337","node_id":"ddn-test","public_key":"7unzXkfaw3lD0tiSVT9UlMWesbD2OrzuT/CwLc10klE=","tunnel_ip":"10.253.1.10","paid_until":"2026-07-03T10:30:53.275935Z","enabled":false,"created_at":"2026-07-05T10:30:52.304156Z"},{"id":"f45a349d-25a7-426d-b88a-4479b28aec18","user_id":"7c1eb9f8-f220-43ae-840b-14f4cb362c1e","node_id":"ddn-test","public_key":"239TtHnxaJefv7kKJeNOVjW6YLchjRcTdctI3nJrAXE=","tunnel_ip":"10.253.1.10","paid_until":"2026-07-04T18:20:43.380875Z","enabled":false,"created_at":"2026-07-04T18:21:22.899633Z"},{"id":"3460b486-358c-44d6-8f47-c960d6254e3a","user_id":"1b42ec72-1f39-483d-ae1e-85669d3ecad2","node_id":"ddn-test","public_key":"dYuBNktWxl/PIqV49T9BIiHIvP4ZumswWZIEFD/Cwxg=","tunnel_ip":"10.253.1.10","paid_until":"2026-08-03T18:07:51.577444Z","enabled":false,"created_at":"2026-07-04T18:07:51.596325Z"},{"id":"486ee88e-2515-4203-8541-44f89cdaba89","user_id":"cd6b00a0-8cc5-48df-8413-8e645505db8c","node_id":"ddn-test","public_key":"WkjrGK7JKsYkhzFz5Bggunzlw5BNY+WxkcYp4D7IulA=","tunnel_ip":"10.253.1.10","paid_until":"2026-08-03T17:28:05.654224Z","enabled":false,"created_at":"2026-07-04T17:28:05.667811Z"},{"id":"da134a09-caa8-4209-bbfa-93dd06f310fb","user_id":"ead942f1-f354-496a-b2e6-857604fea5c3","node_id":"ddn-test","public_key":"OtlMSSUslhQufF939tNN3quNVY0Y+bqmfyohE1K6sBE=","tunnel_ip":"10.253.1.10","paid_until":"2026-09-02T17:22:24.372601Z","enabled":false,"created_at":"2026-07-04T17:22:24.373856Z"},{"id":"966f8262-b25c-4a13-ae1d-694b0378910a","user_id":"2096c7ba-76f1-4c39-8bb4-53d629e23387","node_id":"ddn-test","public_key":"lAQxl4ykPcSpXxFNfz+pGS5Pn+im/uXlVmc+fd3UPB8=","tunnel_ip":"10.253.1.10","paid_until":"2026-09-02T16:38:53.198957Z","enabled":false,"created_at":"2026-07-04T16:38:53.204965Z"},{"id":"00fde00e-a169-4397-841f-5cc99de475d5","user_id":"3303b0a8-450a-4154-9322-9ddfc5757208","node_id":"ddn-test","public_key":"H+yLpZTzxVq4o9RSD6b70hu6JTIY5WkH6Tx74qP1dwM=","tunnel_ip":"10.253.1.10","paid_until":"2026-09-02T16:32:01.766833Z","enabled":false,"created_at":"2026-07-04T16:32:01.782547Z"},{"id":"267835b6-84b6-4527-bd47-eee963e7a5c9","user_id":"6a7eeddb-d012-403c-bf31-ea29a82c1d13","node_id":"ddn-test","public_key":"gXUwVRUraYFaUDv1BJ6GdxbZi6IoliYNBUe8wYRNERU=","tunnel_ip":"10.253.1.10","paid_until":"2026-09-02T16:19:03.151534Z","enabled":false,"created_at":"2026-07-04T16:19:03.152686Z"},{"id":"6a5f1655-8ebe-435e-bba6-1af2412d40c2","user_id":"46a582e8-3822-4686-b9b9-8751061fde97","node_id":"ddn-test","public_key":"TuuRNB7urYUrpRq9gHqqMlqWfte0jSJooLXjZIIYKjs=","tunnel_ip":"10.253.1.10","paid_until":"2026-09-02T16:01:57.735658Z","enabled":false,"created_at":"2026-07-04T16:01:57.736841Z"},{"id":"9298ec04-26cf-44a7-8079-7a13664612fa","user_id":"9bc16072-f8e5-489f-8817-c6778237d6d0","node_id":"ddn-test","public_key":"CJMx+fPoiz5TUmUHKF7JcKo9IrxBZZMEDk7aS/Temwk=","tunnel_ip":"10.253.1.10","paid_until":"2026-09-02T15:56:30.168829Z","enabled":false,"created_at":"2026-07-04T15:56:30.178510Z"},{"id":"1b19ed83-1cad-4d57-be9f-fded5270213c","user_id":"2109fe84-fde0-4856-8268-030a43112782","node_id":"ddn-test","public_key":"mh6GsB55dOEZZCxiWy5PHGxcNSRcBLLNAUfgq4NV3jg=","tunnel_ip":"10.253.1.16","paid_until":"2026-09-02T15:26:17.089248Z","enabled":false,"created_at":"2026-07-04T15:26:17.090574Z"},{"id":"13543224-39f7-4cfc-917d-66a16e2e0e55","user_id":"d360d32e-c7db-4688-846b-ecef626f12db","node_id":"ddn-test","public_key":"cMqUn9gKKZo0oh7vNotjs7s/UtuKVbl081arn6BPKik=","tunnel_ip":"10.253.1.15","paid_until":"2026-09-02T15:17:46.085909Z","enabled":false,"created_at":"2026-07-04T15:17:46.096446Z"},{"id":"813515db-bf25-46c9-bc83-c9c45d51ba68","user_id":"ade5215e-4229-4e83-9012-f09f4691b4e6","node_id":"ddn-test","public_key":"TdYIwRgGjStiQW1gyZjgsaPP+/6WE1U0NcmK0eVEVXM=","tunnel_ip":"10.253.1.14","paid_until":"2026-09-02T13:28:02.954738Z","enabled":false,"created_at":"2026-07-04T13:28:02.964577Z"},{"id":"754b76bd-0e69-4184-ac0b-a9c5706dbf19","user_id":"8c8e9a3f-740d-4f24-baa1-801904b4b50e","node_id":"ddn-test","public_key":"pub_cdnODJUM3pZBIS_Z3dOyBsHVi-Jq-4j_WiDuve84qDw","tunnel_ip":"10.253.1.13","paid_until":"2026-08-03T10:41:13.816901Z","enabled":false,"created_at":"2026-07-04T10:41:13.818018Z"},{"id":"4b39aa87-4b59-4c71-950b-cf2dca3e606f","user_id":"1f0b0e4a-e3ea-4d11-89d1-18d0db370ba7","node_id":"ddn-test","public_key":"pub_BFUhgsp-ejx-tAwttmNzzPupN-c0-5sSS3YRaevqpes","tunnel_ip":"10.253.1.12","paid_until":"2026-08-03T10:37:34.525170Z","enabled":false,"created_at":"2026-07-04T10:37:34.530114Z"},{"id":"37361fae-0ad5-4a7a-8096-a59e1dde2d78","user_id":"abe41583-990e-4d08-9572-a586acaf816f","node_id":"ddn-test","public_key":"pub_X1c2s8NhHk-msYA4Pe25gvmnZmhSRSsmrVob-exBUaw","tunnel_ip":"10.253.1.11","paid_until":"2026-09-02T10:28:54.187046Z","enabled":false,"created_at":"2026-07-04T10:28:54.188090Z"},{"id":"1c152b56-8f35-4bee-bdd7-154ff551077e","user_id":"10de9cee-ffc9-4065-96fe-401ec593e250","node_id":"ddn-test","public_key":"pub_2aWI36SAPwbgiUQLZCVeTmoOAPSd2gjMX_uVNgYN1ag","tunnel_ip":"10.253.1.10","paid_until":"2026-09-02T10:28:02.539201Z","enabled":false,"created_at":"2026-07-04T10:28:02.545211Z"}] /opt/wg-access/tmp/mgts-smoke-20260706-183921/create.json:1:{"detail":[{"type":"value_error","loc":["body","email"],"msg":"value is not a valid email address: The part after the @-sign is a special-use or reserved name that cannot be used with email.","input":"wg-paid-mgts-smoke-20260706-183921@example.invalid","ctx":{"reason":"The part after the @-sign is a special-use or reserved name that cannot be used with email."}}]} === latest mgts-smoke summary === latest_mgts_smoke=/opt/wg-access/tmp/mgts-smoke-20260706-184120 allowed-ips-after-cancel.txt allowed-ips-after-enable.txt client.conf client.mgts.conf create.json smoke.env --- smoke.env redacted --- WORK=/opt/wg-access/tmp/mgts-smoke-20260706-184120 SUB_ID=8adb06a9-713a-46b0-8759-d11c28a797fc PEER_ID=3d03a7a2-c009-48a4-b6ff-214326d26fc0 TUNNEL_IP=10.253.1.10 PUBLIC_KEY=zUUEdc+Lac9C6fmMDVosuO3ZIYHIUDWi34UVgdjhbCU= --- create.json redacted important fields --- user_id=13783bf9-94bb-4c90-b1c6-685a956a5c43 subscription_id=8adb06a9-713a-46b0-8759-d11c28a797fc peer_id=3d03a7a2-c009-48a4-b6ff-214326d26fc0 job_id=814ba665-f6e5-4ba4-b1ba-8af1ec4954e6 node_id=ddn-test tunnel_ip=10.253.1.10 paid_until=2026-08-05T18:41:20.288079Z public_key=zUUEdc+Lac9C6fmMDVosuO3ZIYHIUDWi34UVgdjhbCU= has_private_key= has_preshared_key= has_client_config= True === API peers/jobs read-only summary === peers_curl_rc=0 peer_count 20 PEER 3d03a7a2-c009-48a4-b6ff-214326d26fc0 user 13783bf9-94bb-4c90-b1c6-685a956a5c43 node ddn-test tunnel 10.253.1.10 enabled False paid_until 2026-08-05T18:41:20.288079Z PEER 0f808400-74ad-437b-a716-c6389aa3f057 user 2cc7ce32-acc1-4258-92c6-bccd2febb7b6 node ddn-test tunnel 10.253.1.10 enabled False paid_until 2026-07-03T10:37:18.258073Z PEER 28aefe9e-25b0-434a-aedc-a4df15609e98 user a1957370-4921-4639-b4a9-6e6e05ab8c95 node ddn-test tunnel 10.253.1.10 enabled False paid_until 2026-07-03T10:35:48.458083Z PEER 40b76a1d-e1ef-4a26-ac11-f39043a6a190 user 07f03547-19ee-4068-ba4b-3ba504490337 node ddn-test tunnel 10.253.1.10 enabled False paid_until 2026-07-03T10:30:53.275935Z PEER f45a349d-25a7-426d-b88a-4479b28aec18 user 7c1eb9f8-f220-43ae-840b-14f4cb362c1e node ddn-test tunnel 10.253.1.10 enabled False paid_until 2026-07-04T18:20:43.380875Z PEER 3460b486-358c-44d6-8f47-c960d6254e3a user 1b42ec72-1f39-483d-ae1e-85669d3ecad2 node ddn-test tunnel 10.253.1.10 enabled False paid_until 2026-08-03T18:07:51.577444Z PEER 486ee88e-2515-4203-8541-44f89cdaba89 user cd6b00a0-8cc5-48df-8413-8e645505db8c node ddn-test tunnel 10.253.1.10 enabled False paid_until 2026-08-03T17:28:05.654224Z PEER da134a09-caa8-4209-bbfa-93dd06f310fb user ead942f1-f354-496a-b2e6-857604fea5c3 node ddn-test tunnel 10.253.1.10 enabled False paid_until 2026-09-02T17:22:24.372601Z PEER 966f8262-b25c-4a13-ae1d-694b0378910a user 2096c7ba-76f1-4c39-8bb4-53d629e23387 node ddn-test tunnel 10.253.1.10 enabled False paid_until 2026-09-02T16:38:53.198957Z PEER 00fde00e-a169-4397-841f-5cc99de475d5 user 3303b0a8-450a-4154-9322-9ddfc5757208 node ddn-test tunnel 10.253.1.10 enabled False paid_until 2026-09-02T16:32:01.766833Z PEER 267835b6-84b6-4527-bd47-eee963e7a5c9 user 6a7eeddb-d012-403c-bf31-ea29a82c1d13 node ddn-test tunnel 10.253.1.10 enabled False paid_until 2026-09-02T16:19:03.151534Z PEER 6a5f1655-8ebe-435e-bba6-1af2412d40c2 user 46a582e8-3822-4686-b9b9-8751061fde97 node ddn-test tunnel 10.253.1.10 enabled False paid_until 2026-09-02T16:01:57.735658Z PEER 9298ec04-26cf-44a7-8079-7a13664612fa user 9bc16072-f8e5-489f-8817-c6778237d6d0 node ddn-test tunnel 10.253.1.10 enabled False paid_until 2026-09-02T15:56:30.168829Z PEER 1b19ed83-1cad-4d57-be9f-fded5270213c user 2109fe84-fde0-4856-8268-030a43112782 node ddn-test tunnel 10.253.1.16 enabled False paid_until 2026-09-02T15:26:17.089248Z PEER 13543224-39f7-4cfc-917d-66a16e2e0e55 user d360d32e-c7db-4688-846b-ecef626f12db node ddn-test tunnel 10.253.1.15 enabled False paid_until 2026-09-02T15:17:46.085909Z PEER 813515db-bf25-46c9-bc83-c9c45d51ba68 user ade5215e-4229-4e83-9012-f09f4691b4e6 node ddn-test tunnel 10.253.1.14 enabled False paid_until 2026-09-02T13:28:02.954738Z PEER 754b76bd-0e69-4184-ac0b-a9c5706dbf19 user 8c8e9a3f-740d-4f24-baa1-801904b4b50e node ddn-test tunnel 10.253.1.13 enabled False paid_until 2026-08-03T10:41:13.816901Z PEER 4b39aa87-4b59-4c71-950b-cf2dca3e606f user 1f0b0e4a-e3ea-4d11-89d1-18d0db370ba7 node ddn-test tunnel 10.253.1.12 enabled False paid_until 2026-08-03T10:37:34.525170Z PEER 37361fae-0ad5-4a7a-8096-a59e1dde2d78 user abe41583-990e-4d08-9572-a586acaf816f node ddn-test tunnel 10.253.1.11 enabled False paid_until 2026-09-02T10:28:54.187046Z PEER 1c152b56-8f35-4bee-bdd7-154ff551077e user 10de9cee-ffc9-4065-96fe-401ec593e250 node ddn-test tunnel 10.253.1.10 enabled False paid_until 2026-09-02T10:28:02.539201Z jobs_curl_rc=0 job_count 36 JOB 5983e13b-738d-4723-aee0-cfd8a51566f1 node ddn-test action disable_peer peer None status completed attempts 1 last_error None JOB 96fcd41d-94a0-4432-a685-9171b0235ff1 node ddn-test action enable_peer peer None status completed attempts 1 last_error None JOB f6431127-27e3-49fe-9da0-ef03fc52c2d9 node ddn-test action disable_peer peer None status completed attempts 1 last_error None JOB 838a2aaf-64ed-4346-9996-1ef7889fda2f node ddn-test action enable_peer peer None status completed attempts 1 last_error None JOB 8aa5d01c-1a51-48e9-8b86-834f379e829d node ddn-test action disable_peer peer None status completed attempts 1 last_error None JOB 74ccc2cf-bbb2-4621-8bbe-ce3096d8366d node ddn-test action enable_peer peer None status completed attempts 1 last_error None JOB de335c08-7807-465b-9065-bce2c77a955f node ddn-test action disable_peer peer None status completed attempts 1 last_error None JOB cef3e913-d69a-4f61-a5af-7d10eeb8b2da node ddn-test action enable_peer peer None status completed attempts 1 last_error None JOB ef0e8472-6e80-45eb-9bcb-ec0a9d7be598 node ddn-test action disable_peer peer None status completed attempts 1 last_error None JOB 13a61a08-8eeb-4402-8a5c-624bc606c023 node ddn-test action enable_peer peer None status completed attempts 1 last_error None JOB 279dd804-7951-47a0-876a-1262f27aa629 node ddn-test action disable_peer peer None status completed attempts 1 last_error None JOB 15b8a865-a437-4222-9f5b-6427aeaf75b3 node ddn-test action enable_peer peer None status completed attempts 1 last_error None JOB 6e273fdf-781f-4992-ad42-4bf83bc7b6f5 node ddn-test action disable_peer peer None status completed attempts 1 last_error None JOB bb71b4cd-a615-45f5-9135-4aa0efca9cb7 node ddn-test action enable_peer peer None status completed attempts 1 last_error None JOB 9057b4c7-68b5-4b9e-8cf0-f624a07e30d0 node ddn-test action disable_peer peer None status completed attempts 1 last_error None JOB 1912c96e-bda5-4af1-a9ea-9a81a27344fd node ddn-test action enable_peer peer None status completed attempts 1 last_error None JOB 8b21d24d-d575-4224-a281-bd2456cccb37 node ddn-test action disable_peer peer None status completed attempts 1 last_error None JOB cb23b57d-7ec7-4804-a045-495a23705f5d node ddn-test action enable_peer peer None status completed attempts 1 last_error None JOB d607c313-cacd-4650-9d39-47c7d43817d6 node ddn-test action disable_peer peer None status completed attempts 1 last_error None JOB 652f82c5-4243-4618-bf17-ccfea3e44d54 node ddn-test action disable_peer peer None status completed attempts 1 last_error None JOB fb2c12a5-3f22-4c55-94f1-091240e0019a node ddn-test action disable_peer peer None status completed attempts 1 last_error None JOB bda6e96e-ef56-44f6-8bc0-867b91ac59bb node ddn-test action enable_peer peer None status completed attempts 1 last_error None JOB 7a8fe618-7dc9-4eea-80e7-c4fd09ac2172 node ddn-test action enable_peer peer None status completed attempts 1 last_error None JOB ca3e15c1-91ba-435c-8a40-37faa9e101c9 node ddn-test action enable_peer peer None status completed attempts 1 last_error None JOB 8594e558-1c0d-4c49-872e-a1c47dc0f377 node ddn-test action disable_peer peer None status completed attempts 1 last_error None JOB a16ef565-d195-4302-acb3-c7d963b2f3a5 node ddn-test action enable_peer peer None status completed attempts 1 last_error None JOB 338006fa-9b17-45ac-b53f-bc2383421e70 node ddn-test action enable_peer peer None status completed attempts 1 last_error None JOB 7196bb14-b3ba-4aaf-85f8-aa393fe1b4dc node ddn-test action enable_peer peer None status completed attempts 1 last_error None JOB cf0a4771-2fc3-4ae1-9a11-c6417057d048 node ddn-test action enable_peer peer None status completed attempts 1 last_error None JOB d2fe3317-bb1e-452e-ab29-6bdf6364c817 node ddn-test action enable_peer peer None status completed attempts 1 last_error None === no changes check === read_only_done=1 === STEP_034C2 RESULT === remote_rc=0 health_ok_lines=2 subscription_schema_lines=10 cancel_related_lines=25 disable_related_lines=46 mgts_hint_lines=85 tunnel_hint_lines=54 api_peers_ok_lines=2 api_jobs_ok_lines=2 package=/opt/router-ops/apply-packages/20260708-113830_step034c2_wgpay_runbook_clean decision=PASS_WGPAY_RUNBOOK_CLEAN