diff --git a/CHANGELOG.md b/CHANGELOG.md index ce6724b0e..33a5a20d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -128,6 +128,13 @@ reaches `1.0.0`. Pre-1.0 minor versions may contain breaking changes. per-server `-rcon` Secret, mounts nothing for the agent and injects no password environment variable. +### Removed + +- **Hell Let Loose module:** `hell-let-loose` is withdrawn from the + official catalog. Its dedicated-server files are distributed only to + Team17's licensed hosting partners, so no public image can install it. + Its hand-run e2e test and probe package are removed with it. + ## [0.3.0] — 2026-10-05 The first Gameplane release without a pre-release suffix, a pre-v1 release. It diff --git a/README.md b/README.md index ab4f6cce0..c33345f38 100644 --- a/README.md +++ b/README.md @@ -185,7 +185,7 @@ Gameplane extends Kubernetes using custom resources under `gameplane.local/v1alp ├── sentinel/ # Wake-on-connect daemon (Go) ├── tunnel/ # Relay client supervisor for frp/Tailscale/playit (Go) ├── web/ # Dashboard frontend (React, Vite, Monaco, xterm.js) -├── modules/ # Submodule: Game templates (30 games shipped) +├── modules/ # Submodule: Game templates (29 games shipped) ├── website/ # Submodule: Public documentation site ├── gameproto/ # Wire-protocol parsing library (Minecraft, Terraria) ├── gameaction/ # Console injection guard & action command renderer @@ -268,7 +268,7 @@ The `make dev-up` target: `kind-registry:5000`), 2. loads every locally-built image (operator, api, web, agent, and every optional component's image), -3. pushes every directory under `modules/` (30 games at last count — see +3. pushes every directory under `modules/` (29 games at last count — see `modules/` for the current list) to the local registry as an OCI module bundle, 4. installs the Helm chart from `charts/gameplane/` with a default diff --git a/docs/game-coverage.md b/docs/game-coverage.md index 1d21bfa24..4f14a37bd 100644 --- a/docs/game-coverage.md +++ b/docs/game-coverage.md @@ -32,7 +32,6 @@ Every Gameplane-shipped game module is listed here with its join-protocol covera | `the-isle` | The Isle | blocked-doc | QUERY | TestGameServer_TheIsleBot_Query | bot-heavy | — | Unreal Engine 4 network protocol variant partially documented; stateless connect handshake requires packet capture | documentation | | `ark-survival-evolved` | ARK: Survival Evolved | blocked-doc | QUERY | TestGameServer_ArkSurvivalEvolvedBot_Query | bot-heavy | — | Unreal Engine 4 custom net driver; A2S query verified but ShooterGame client login handshake requires reverse-engineering | documentation | | `arma-reforger` | Arma Reforger | blocked-doc | QUERY | TestGameServer_ArmaReforgerBot_Query | bot-heavy | — | Bohemia Interactive Enfusion engine proprietary network protocol; A2S query verified but backend authentication format undocumented | documentation | -| `hell-let-loose` | Hell Let Loose | blocked-doc | QUERY | TestGameServer_HellLetLooseBot_Query | bot-heavy | — | Unreal Engine 4 network stack; Steam query verified but join handshake and Easy Anti-Cheat integration require reverse-engineering | documentation | | `squad` | Squad | blocked-doc | QUERY | TestGameServer_SquadBot_Query | bot-heavy | — | Unreal Engine 4 network stack; Steam A2S query verified but client connection handshake format undocumented | documentation | ## Covered (in CI) @@ -75,7 +74,6 @@ These modules lack a join-protocol client. The reason is documented as temporary - **the-isle**: Unreal Engine 4 network protocol variant partially documented. Stateless connect handshake requires packet capture. - **ark-survival-evolved**: Unreal Engine 4 custom net driver. A2S query verified but ShooterGame client login handshake requires reverse-engineering. - **arma-reforger**: Bohemia Interactive Enfusion engine proprietary network protocol. A2S query verified but backend authentication format is undocumented. -- **hell-let-loose**: Unreal Engine 4 network stack. Steam query verified but join handshake and Easy Anti-Cheat integration require reverse-engineering. - **squad**: Unreal Engine 4 network stack. Steam A2S query verified but client connection handshake format is undocumented. ## Out of Scope by Design diff --git a/docs/module-authoring.md b/docs/module-authoring.md index a5cbfd05b..0e54f6566 100644 --- a/docs/module-authoring.md +++ b/docs/module-authoring.md @@ -483,7 +483,7 @@ wizard-managed server-settings.json, portal registry), **palworld** catalog also includes 7-days-to-die, ark-survival-ascended, ark-survival-evolved, arma-reforger, beammp, cs2, dayz, dont-starve-together, enshrouded, euro-truck-simulator-2, farming-simulator-25, fivem, garrys-mod, -hell-let-loose, left-4-dead-2, mount-and-blade-2-bannerlord, nuclear-option, +left-4-dead-2, mount-and-blade-2-bannerlord, nuclear-option, project-zomboid, rust, satisfactory, squad, team-fortress-2, the-isle, tmodloader, and v-rising (see [Game Coverage](game-coverage.md) for full protocol and testing status). diff --git a/modules b/modules index 6512605fb..7f14c44c6 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit 6512605fb4d3c28b86920791e0bd908c0ee8a475 +Subproject commit 7f14c44c6befdd5aab01aae16b99aa0f9bd8723b diff --git a/specs/015-top-steam-game-modules/OPEN-DECISIONS.md b/specs/015-top-steam-game-modules/OPEN-DECISIONS.md index 3af399eb3..4db24a240 100644 --- a/specs/015-top-steam-game-modules/OPEN-DECISIONS.md +++ b/specs/015-top-steam-game-modules/OPEN-DECISIONS.md @@ -305,7 +305,7 @@ Open for maintainer ruling: (a) widen research.md Decision 1 to the six extra ga | `the-isle` | Gameplane-built (`containers/games/the-isle/`) | No community image. SteamCMD app 412680, public `evrima` beta. | | `ark-survival-evolved` | Gameplane-built (`containers/games/ark-survival-evolved/`), maintainer ruling 2026-10-09 | No clearly maintained community image: recent ones are single-maintainer, older popular ones are 2-5 years stale. SteamCMD app 376030, anonymous. | | `mount-and-blade-2-bannerlord` | Gameplane-built (`containers/games/mount-and-blade-2-bannerlord/`) | No community image. Windows-only dedicated server (app 1863440), downloaded with `+@sSteamCmdForcePlatformType windows` and run under Wine; a missing `SERVER_TOKEN` idles with instructions (FR-013). | -| `hell-let-loose` | *Pending maintainer card* (recommended: keep the module, mark it blocked) | The server files go only to Team17's licensed hosting partners; there is no public SteamCMD download, so no image can install it. | +| `hell-let-loose` | **Removed** (maintainer ruling 2026-10-11): module, e2e test and probe package deleted; spec 015 now covers 25 games | The server files go only to Team17's licensed hosting partners; there is no public SteamCMD download, so no image can install it. | Build location (maintainer ruling 2026-10-09): the Gameplane-built images live in this repo's `containers/games//` on the shared SteamCMD base (UID 10000) and are built by `.github/workflows/images.yaml`, which checks each build on PRs and publishes and signs to `ghcr.io/gameplanepanel/gameplane` on merge to `master`, as Nuclear Option does. This supersedes the "`modules//` + `modules/build-images.sh`" wording of the ruling above. `modules/.github/workflows/build-images.yml` still gets the lowercase registry-owner fix for its four existing images. diff --git a/specs/015-top-steam-game-modules/contracts/engine-matrix-contract.md b/specs/015-top-steam-game-modules/contracts/engine-matrix-contract.md index d39e7082a..96c41e8eb 100644 --- a/specs/015-top-steam-game-modules/contracts/engine-matrix-contract.md +++ b/specs/015-top-steam-game-modules/contracts/engine-matrix-contract.md @@ -36,5 +36,4 @@ This matrix defines the required configurations, port specifications, query prot | `the-isle` | 412680 | A2S_INFO (UDP) | 7777 UDP | 7778 UDP | 8888 TCP (Source RCON) | `/serverdata/TheIsle/Saved` | `save` | | `ark-survival-evolved`| 376030 | A2S_INFO (UDP) | 7777 UDP | 27015 UDP | 27020 TCP (Source RCON) | `/serverdata/ShooterGame/Saved` | `SaveWorld` | | `arma-reforger` | 1874900 | A2S_INFO (UDP) | 2001 UDP | 17777 UDP | Stdin Console | `/home/steam/.local/share/ArmaReforgerServer` | `save` | -| `hell-let-loose` | 731790 | A2S_INFO (UDP) | 7787 UDP | 27165 UDP | 22222 TCP (UE4 RCON) | `/serverdata/HLL/Saved` | N/A (Match-based) | | `squad` | 403240 | A2S_INFO (UDP) | 7787 UDP | 27165 UDP | 21114 TCP (Squad RCON) | `/serverdata/Squad/Saved` | N/A (Match-based) | diff --git a/specs/015-top-steam-game-modules/engine-matrix-resolved.md b/specs/015-top-steam-game-modules/engine-matrix-resolved.md index 53e928d7f..dce3fd048 100644 --- a/specs/015-top-steam-game-modules/engine-matrix-resolved.md +++ b/specs/015-top-steam-game-modules/engine-matrix-resolved.md @@ -38,24 +38,23 @@ No module is assigned `cli` pending maintainer ruling on its semantics (T005). | `satisfactory` | Existing | `satisfactory` | `rcon` | `game` (7777/UDP), `game-tcp` (7777/TCP), `messaging` (8888/TCP) | `/config` (OD 7.11) | `["SaveGame"]` | `bot-heavy` | 25Gi storage + multi-GB SteamCMD download | | `ark-survival-evolved` | New | `source` | `rcon` | `game` (7777/UDP), `query` (27015/UDP), `rcon` (27020/TCP) | `/data` | `["SaveWorld", "DoExit"]` | `bot-heavy` | SteamCMD download, cluster travel (>30Gi storage) | | `arma-reforger` | New | `none` | `pty` | `game` (2001/UDP), `query` (17777/UDP) | `/reforger` | `["save"]` | `bot-heavy` | SteamCMD download, Enfusion engine (>25Gi storage) | -| `hell-let-loose` | New | `source` | `rcon` | `game` (7787/UDP), `query` (27165/UDP), `rcon` (22222/TCP) | `/serverdata/HLL/Saved` | `[]` (Match-based) | `bot-heavy` | SteamCMD download (>30Gi storage) | | `squad` | New | `source` | `rcon` | `game` (7787/UDP), `query` (27165/UDP), `rcon` (21114/TCP) | `/data` | `[]` (Match-based) | `bot-heavy` | SteamCMD download (>35Gi storage) | --- -## 2. 13 New Modules Classification Summary +## 2. New Modules Classification Summary (12; `hell-let-loose` withdrawn 2026-10-11) -- **`bot-fast` (0 modules)**: none of the 13 new modules runs in CI's `bot-fast` bucket. -- **`bot-heavy` (13 modules)**: - - `fivem`, `team-fortress-2`, `farming-simulator-25`, `euro-truck-simulator-2`, `mount-and-blade-2-bannerlord`, `tmodloader`, `beammp`, `left-4-dead-2`, `the-isle`, `ark-survival-evolved`, `arma-reforger`, `hell-let-loose`, `squad` (`test/e2e/buckets.sh`, `bucket_bot_heavy`). +- **`bot-fast` (0 modules)**: none of the 12 new modules runs in CI's `bot-fast` bucket. +- **`bot-heavy` (12 modules)**: + - `fivem`, `team-fortress-2`, `farming-simulator-25`, `euro-truck-simulator-2`, `mount-and-blade-2-bannerlord`, `tmodloader`, `beammp`, `left-4-dead-2`, `the-isle`, `ark-survival-evolved`, `arma-reforger`, `squad` (`test/e2e/buckets.sh`, `bucket_bot_heavy`). - All need multi-GB downloads, large volumes or emulation layers (Wine/Proton) beyond a GitHub Actions runner's disk and memory, so the bucket is hand-run only. ## 3. Distinction Between `fastGameSet` and CI Buckets - `fastGameSet` (`test/e2e/gamebot_helpers_e2e_test.go:29`) controls the **local / default developer filter** when `GAMEPLANE_E2E_GAMES` is unset. - `bucket_bot_fast` and `bucket_bot_heavy` in `test/e2e/buckets.sh` control **CI runner job segmentation**. -- For the 13 new modules: +- For the 12 new modules: - `tmodloader` and `beammp` are in `fastGameSet` (`test/e2e/gamebot_helpers_e2e_test.go`) for local runs, but are bucketed in `bucket_bot_heavy`, not `bucket_bot_fast`. - - The other 11 are in `heavyGameSet` and bucketed in `bucket_bot_heavy` with CI-exclusion justification comments. + - The other 10 are in `heavyGameSet` and bucketed in `bucket_bot_heavy` with CI-exclusion justification comments. Table values above (protocol, `consoleMode`, ports, mount path, stop, CI bucket) were re-read from the shipped `modules//template.yaml` files and `test/e2e/buckets.sh` on 2026-10-11 (T143); the templates are authoritative. "unset" means the template leaves `consoleMode` to its default. The justification column is unchanged. diff --git a/specs/015-top-steam-game-modules/plan.md b/specs/015-top-steam-game-modules/plan.md index bcfc6e944..05e282566 100644 --- a/specs/015-top-steam-game-modules/plan.md +++ b/specs/015-top-steam-game-modules/plan.md @@ -126,14 +126,14 @@ docs/ ## Known Gaps (found during the 2026-10-09 refresh) -These were found by comparing the shipped templates with this plan. **Resolved 2026-10-11** by Phase 9 (T132-T146), except `hell-let-loose`, whose image ruling is still pending (T133, T138); see the note under each gap. +These were found by comparing the shipped templates with this plan. **Resolved 2026-10-11** by Phase 9 (T132-T146); `hell-let-loose` was removed by maintainer ruling 2026-10-11 (OPEN-DECISIONS.md §10, T138 withdrawn). See the note under each gap. 1. **Placeholder image digests (FR-003, SC-002).** Ten of the 13 new modules pin `@sha256:0000…0000`: `ark-survival-evolved`, `arma-reforger`, `beammp`, `euro-truck-simulator-2`, `farming-simulator-25`, `fivem`, `hell-let-loose`, `mount-and-blade-2-bannerlord`, `squad`, `the-isle`. T119 (digest-pinning pass) is marked done, but these images were never pinned. - *Resolved (T141, T142):* nine of the ten now pin real digests (GameplanePanel/module#48); `validate.py` reports 0 errors across all 30 modules. `hell-let-loose` keeps its placeholder (a warning) until its ruling. + *Resolved (T141, T142):* nine of the ten now pin real digests (GameplanePanel/module#48); `validate.py` reports 0 errors across all 30 modules. `hell-let-loose` was removed (T138 withdrawn). 2. **Images with no build source.** Six templates reference `ghcr.io/valgulnecron/gameplane/` images that nothing in either repository builds: `mount-and-blade-2-bannerlord`, `the-isle`, `ark-survival-evolved`, `arma-reforger`, `hell-let-loose`, `squad`. `modules/build-images.sh` builds only the four images from research.md Decision 1. Either research.md Decision 1 widens to these six (with Dockerfiles), or the templates move to community images. *Resolved (T133-T140, OPEN-DECISIONS §10):* `arma-reforger` moved to the ACE community image; `squad`, `the-isle`, `ark-survival-evolved` and `mount-and-blade-2-bannerlord` are built in this repo's `containers/games/` (#638), and the four original images moved there too (#651). 3. **Stale registry owner.** All ten Gameplane-owned image refs use `ghcr.io/valgulnecron/gameplane/…`; the repositories moved to `GameplanePanel` in October 2026, and `build-images.sh`'s own usage example pushes to `ghcr.io/gameplanepanel/gameplane`. - *Resolved (T141):* every Gameplane-built ref now points at `ghcr.io/gameplanepanel/gameplane/…`, except `hell-let-loose`. + *Resolved (T141):* every Gameplane-built ref now points at `ghcr.io/gameplanepanel/gameplane/…`; `hell-let-loose` was removed. 4. **Planning matrix drift.** `engine-matrix-resolved.md` no longer matches several shipped templates, for example `palworld` stop (`save`, `shutdown 1`), `rust` stop (`server.save`, `quit`), `ark-survival-ascended` stop (`SaveWorld`, `DoExit`), `tmodloader` mount path (`/opt/terraria/config`), and the CI bucket for `tmodloader`/`beammp` (shipped in `bot-heavy`, matrix says `bot-fast`). The templates are authoritative. *Resolved (T143):* `engine-matrix-resolved.md` was re-read from the shipped templates and `test/e2e/buckets.sh`. diff --git a/specs/015-top-steam-game-modules/research.md b/specs/015-top-steam-game-modules/research.md index 706619aa1..25e2eca60 100644 --- a/specs/015-top-steam-game-modules/research.md +++ b/specs/015-top-steam-game-modules/research.md @@ -38,7 +38,7 @@ This research defines the architectural foundation, container configurations, pr | 22 | `the-isle` | The Isle | 412680 | Unreal Engine 4/5 (Linux) | 7777 UDP (Game), 7778 UDP (Query), 8888 TCP (RCON) | Source RCON | Steam Workshop / `Game.ini` | | 23 | `ark-survival-evolved` | ARK: Survival Evolved | 376030 | Unreal Engine 4 (Linux) | 7777-7778 UDP (Game/Raw), 27015 UDP (Query), 27020 TCP (RCON) | Source RCON | Steam Workshop / Cluster sync | | 24 | `arma-reforger` | Arma Reforger | 1874900 | Enfusion (Linux) | 2001 UDP (Game), 17777 UDP (Query) | Stdin CLI / Bohemia API | Bohemia Interactive Workshop | -| 25 | `hell-let-loose` | Hell Let Loose | 731790 | Unreal Engine 4 (Linux) | 7787 UDP (Game), 27165 UDP (Query), 22222 TCP (RCON) | UE4 RCON Protocol | Community Maps / Vietnam Preset | +| 25 | `hell-let-loose` | Hell Let Loose | 731790 | Unreal Engine 4 (Linux) | 7787 UDP (Game), 27165 UDP (Query), 22222 TCP (RCON) | UE4 RCON Protocol | Community Maps / Vietnam Preset **Withdrawn 2026-10-11** (OPEN-DECISIONS.md §10). | | 26 | `squad` | Squad | 403240 | Unreal Engine 4 (Linux) | 7787 UDP (Game), 27165 UDP (Query), 21114 TCP (RCON) | Squad RCON Protocol | Steam Workshop / `Admins.cfg` | --- diff --git a/specs/015-top-steam-game-modules/spec.md b/specs/015-top-steam-game-modules/spec.md index 151c65771..95ceb5035 100644 --- a/specs/015-top-steam-game-modules/spec.md +++ b/specs/015-top-steam-game-modules/spec.md @@ -13,7 +13,7 @@ ### Session 2026-09-03 - Q: How should Gameplane handle auxiliary dependencies (such as external databases for FiveM or secondary web administration portals for Farming Simulator 25 and txAdmin) within these game modules? → A: Option B (All-in-One Bundles: Include lightweight auxiliary services such as embedded database processes and companion web interfaces within the container runtime for single-pod zero-dependency deployment). -- Q: Should module #25 target the standard official Hell Let Loose dedicated server (Steam AppID 731790) with support for community configurations/maps, or a specific Vietnam modded variant? → A: Option C (Both Variants: Provide standard Hell Let Loose as the default template version with an optional version profile / preset for Vietnam community conversions). +- Q: Should module #25 target the standard official Hell Let Loose dedicated server (Steam AppID 731790) with support for community configurations/maps, or a specific Vietnam modded variant? → A: Option C (Both Variants: Provide standard Hell Let Loose as the default template version with an optional version profile / preset for Vietnam community conversions). *Superseded 2026-10-11: module withdrawn (OPEN-DECISIONS.md §10).* - Q: How should game modules that require external authorization keys or master server registration tokens (such as FiveM CFX keys, BeamMP auth keys, and ETS2 server tokens) behave when launched without a configured token? → A: Option A (Graceful Idle with Diagnostics: Containers missing mandatory registration tokens log a clear step-by-step diagnostic message for obtaining and setting the key, and idle cleanly without crash-looping). --- @@ -141,7 +141,7 @@ Platform monitoring systems and cluster operators need continuous, accurate heal 22. The Isle (`the-isle`) 23. ARK: Survival Evolved (`ark-survival-evolved`) 24. Arma Reforger (`arma-reforger`) - 25. Hell Let Loose with Vietnam community preset (`hell-let-loose`) + 25. ~~Hell Let Loose with Vietnam community preset (`hell-let-loose`)~~ **Withdrawn 2026-10-11** (maintainer ruling, OPEN-DECISIONS.md §10): the server files go only to Team17's licensed hosting partners, so no image can install it. 26. Squad (`squad`) - **FR-002**: Every game module MUST contain the complete, standardized file layout: - `module.yaml`: Module metadata conforming to `module.schema.json` (name, display name, version, categories, summary, homepage, license, gameplaneMinVersion). diff --git a/specs/015-top-steam-game-modules/tasks.md b/specs/015-top-steam-game-modules/tasks.md index dcdf53e85..aadbd5794 100644 --- a/specs/015-top-steam-game-modules/tasks.md +++ b/specs/015-top-steam-game-modules/tasks.md @@ -265,21 +265,21 @@ Of the 13 target *existing* modules, 7 have no `samples/` directory today and ge **Rulings in force**: (a) **Mixed image source**: for each of the six unbuilt images, use a maintained community image pinned by real digest where a suitable one exists, otherwise a Gameplane-owned `Dockerfile` + `entrypoint.sh` under `containers/games//` in this repo, on the shared SteamCMD base and built by `.github/workflows/images.yaml` (amended 2026-10-09 from `modules//`, §10 build-location ruling). (b) **Registry**: images already published under `ghcr.io/valgulnecron/gameplane/…` stay there; every new build is pushed and signed under `ghcr.io/gameplanepanel/gameplane/…`. None of the ten placeholder-digest images was ever published, so all of them are new builds. - [X] T132 [US1] Create a working branch in the `modules/` submodule (`GameplanePanel/module`) off its default branch for this phase's template and image changes — `modules/`. -- [ ] T133 [US1] For each of `mount-and-blade-2-bannerlord`, `the-isle`, `ark-survival-evolved`, `arma-reforger`, `hell-let-loose`, `squad`, evaluate whether a maintained community image exists that runs the dedicated server non-root, keeps saves off the binary path, and has had a release within the last 6 months. Record the per-game choice (community image name, or "Gameplane-built") with its justification under the §10 ruling in `specs/015-top-steam-game-modules/OPEN-DECISIONS.md`. If a game has no clear choice, ask the maintainer as a decision card before T134-T139 start on it. Depends on T132. +- [X] T133 [US1] For each of `mount-and-blade-2-bannerlord`, `the-isle`, `ark-survival-evolved`, `arma-reforger`, `hell-let-loose`, `squad`, evaluate whether a maintained community image exists that runs the dedicated server non-root, keeps saves off the binary path, and has had a release within the last 6 months. Record the per-game choice (community image name, or "Gameplane-built") with its justification under the §10 ruling in `specs/015-top-steam-game-modules/OPEN-DECISIONS.md`. If a game has no clear choice, ask the maintainer as a decision card before T134-T139 start on it. Depends on T132. **Done 2026-10-11** for five games (OPEN-DECISIONS.md §10 per-game table); `hell-let-loose` **withdrawn**: the maintainer removed the module on 2026-10-11 (§10). - [X] T134 [P] [US1] Apply T133's choice for `mount-and-blade-2-bannerlord`. For a community image, update `image`, `spec.versions`, `security`, `storage.mountPath` and `env` (`HOME`) in `modules/mount-and-blade-2-bannerlord/template.yaml` to match the image, then `README.md`, `specs.md` and `samples/gameserver.yaml`. For a Gameplane-built image, author `modules/mount-and-blade-2-bannerlord/Dockerfile` + `entrypoint.sh` in the style of `modules/beammp/` (non-root, SteamCMD install into the PVC, never shadowing the entrypoint). Depends on T133. **Amended 2026-10-09** (OPEN-DECISIONS.md §10 build-location ruling): Gameplane-built images live in `containers/games//` (was `images/games/`) in this repo on the shared SteamCMD base and are built by `.github/workflows/images.yaml` (PR #638), not under `modules//`. - [X] T135 [P] [US1] Same as T134 for `the-isle` — `modules/the-isle/`. Depends on T133. - [X] T136 [P] [US1] Same as T134 for `ark-survival-evolved` — `modules/ark-survival-evolved/`. Depends on T133. - [X] T137 [P] [US1] Same as T134 for `arma-reforger` — `modules/arma-reforger/`. Depends on T133. -- [ ] T138 [P] [US1] Same as T134 for `hell-let-loose`, keeping the default build plus the Vietnam community-preset version (spec.md Clarifications) — `modules/hell-let-loose/`. Depends on T133. +- [X] T138 [P] [US1] Same as T134 for `hell-let-loose`, keeping the default build plus the Vietnam community-preset version (spec.md Clarifications) — `modules/hell-let-loose/`. Depends on T133. **Withdrawn 2026-10-11** (OPEN-DECISIONS.md §10): the maintainer removed the module; `modules/hell-let-loose/`, its e2e test and probe package were deleted. - [X] T139 [P] [US1] Same as T134 for `squad` — `modules/squad/`. Depends on T133. - [X] T140 [US1] Add every game T133 marked Gameplane-built to `KNOWN_IMAGES` and the usage text in `modules/build-images.sh`, and make sure `modules/.github/workflows/build-images.yml` builds, pushes and cosign-signs all Gameplane-owned images (the four from T027-T030 plus T133's) to `ghcr.io/gameplanepanel/gameplane` (verify key: `cosign.pub`). Depends on T134-T139. **Amended 2026-10-09** (§10 build-location ruling): no new entries in `KNOWN_IMAGES`; the four new images are in the `images.yaml` matrix (PR #638), and `build-images.yml` now lowercases the registry owner (module PR #48). -- [X] T141 [US1] After the T140 workflow has published the images (publishing is an outward action and needs the maintainer's go), repoint every Gameplane-owned `image` and `spec.versions[].image` ref in the ten placeholder-digest templates (`ark-survival-evolved`, `arma-reforger`, `beammp`, `euro-truck-simulator-2`, `farming-simulator-25`, `fivem`, `hell-let-loose`, `mount-and-blade-2-bannerlord`, `squad`, `the-isle`) from `ghcr.io/valgulnecron/gameplane/…` to `ghcr.io/gameplanepanel/gameplane/…`. Then run `make module-pin` to replace every `@sha256:0000…0000` with the real digest, reading its diff warning before committing. This redoes T119 for these modules. Afterward, `grep -l "sha256:0000000000000000" modules/*/template.yaml` must return nothing. Depends on T140. **Done 2026-10-11** for nine templates (GameplanePanel/module#48; images from #638 and #651, the four original images moved to `containers/games/` per OPEN-DECISIONS §10). `hell-let-loose` keeps its placeholder until T133/T138's ruling. -- [X] T142 [US1] Run `python3 modules/validate.py` in its default read-only mode (no `--pin`). It must report 0 errors across all 26 in-scope modules (FR-009, SC-002), including rule 5 (image resolves) and rule 10 (image pinned) for the ten modules from T141. Depends on T141. **Done 2026-10-11**: 0 errors across all 30 modules on module#48's head; `hell-let-loose` reports warnings only. +- [X] T141 [US1] After the T140 workflow has published the images (publishing is an outward action and needs the maintainer's go), repoint every Gameplane-owned `image` and `spec.versions[].image` ref in the ten placeholder-digest templates (`ark-survival-evolved`, `arma-reforger`, `beammp`, `euro-truck-simulator-2`, `farming-simulator-25`, `fivem`, `hell-let-loose`, `mount-and-blade-2-bannerlord`, `squad`, `the-isle`) from `ghcr.io/valgulnecron/gameplane/…` to `ghcr.io/gameplanepanel/gameplane/…`. Then run `make module-pin` to replace every `@sha256:0000…0000` with the real digest, reading its diff warning before committing. This redoes T119 for these modules. Afterward, `grep -l "sha256:0000000000000000" modules/*/template.yaml` must return nothing. Depends on T140. **Done 2026-10-11** for nine templates (GameplanePanel/module#48; images from #638 and #651, the four original images moved to `containers/games/` per OPEN-DECISIONS §10). `hell-let-loose` was later removed (T138 withdrawn). +- [X] T142 [US1] Run `python3 modules/validate.py` in its default read-only mode (no `--pin`). It must report 0 errors across all 26 in-scope modules (FR-009, SC-002), including rule 5 (image resolves) and rule 10 (image pinned) for the ten modules from T141. Depends on T141. **Done 2026-10-11**: 0 errors across all 30 modules on module#48's head; `hell-let-loose` has since been removed (T138 withdrawn). - [X] T143 [P] Bring `specs/015-top-steam-game-modules/engine-matrix-resolved.md` in line with the shipped templates (plan.md Known Gaps 4). That covers at least the `palworld`, `rust` and `ark-survival-ascended` stop arrays, the `tmodloader` mount path, the CI-bucket column (all 13 new games are in `bucket_bot_heavy`, `test/e2e/buckets.sh`), and any image, mount or stop changes from T134-T139. Depends on T139. - [X] T144 [P] Update `specs/015-top-steam-game-modules/plan.md`: mark Known Gaps 1-4 resolved, citing T141, T133-T140 and T143, and update the "Shipped state" note under research.md Decision 1 in `specs/015-top-steam-game-modules/research.md` with T133's final image list. Depends on T142, T143. - [X] T145 Commit (signed, conventional prefix), push and open the `GameplanePanel/module` PR for the T132 branch. Its CI (`modules/.github/workflows/validate.yml`) must be green before review is requested. Depends on T142. **Done**: GameplanePanel/module#48, validate green, merged 2026-10-11. - [X] T146 Once the maintainer merges the T145 PR, bump the `modules` submodule pointer in this repo on a fresh branch off `master` (`git add modules`), together with T143/T144's spec updates, and open a PR labeled `type: fix`, `area: modules`, `area: specs` via `gh api` (CLAUDE.md rule 14). Depends on T145, T144. -- [ ] T147 Verify the T146 PR's CI is green on its head, including the e2e bucket coverage job, then hand it to the maintainer for review and merge. Once it is merged, T128-T131 (the `done_015` archive) can start. Depends on T146. +- [X] T147 Verify the T146 PR's CI is green on its head, including the e2e bucket coverage job, then hand it to the maintainer for review and merge. Once it is merged, T128-T131 (the `done_015` archive) can start. Depends on T146. **Done 2026-10-11**: #653 green and merged. **Checkpoint**: no placeholder digests remain, every Gameplane-owned image builds from source in `GameplanePanel/module` and is published under `ghcr.io/gameplanepanel/gameplane`, `validate.py` is clean, and the spec artifacts match the shipped templates. @@ -393,7 +393,7 @@ Task: "T111 [P] [US5] test/e2e/squad_bot_e2e_test.go" - **Phase 7 (US5)**: 17 tasks (T099-T115) — 13 `[P]` - **Phase 8 (Polish)**: 16 tasks (T116-T131) — 3 `[P]`; T126/T127 done via PR #369, T128-T131 wait on Phase 9 - **Phase 9 (Post-merge remediation)**: 16 tasks (T132-T147) — 11 `[US1]` (T132-T142), 8 `[P]` (T134-T139, T143, T144) -- **New modules authored**: 13 (`fivem`, `team-fortress-2`, `farming-simulator-25`, `euro-truck-simulator-2`, `mount-and-blade-2-bannerlord`, `tmodloader`, `beammp`, `left-4-dead-2`, `the-isle`, `ark-survival-evolved`, `arma-reforger`, `hell-let-loose`, `squad`) +- **New modules authored**: 13 (`fivem`, `team-fortress-2`, `farming-simulator-25`, `euro-truck-simulator-2`, `mount-and-blade-2-bannerlord`, `tmodloader`, `beammp`, `left-4-dead-2`, `the-isle`, `ark-survival-evolved`, `arma-reforger`, `hell-let-loose`, `squad`) — `hell-let-loose` withdrawn 2026-10-11 (T138), 12 remain. - **Existing modules verified/updated**: 13 (`cs2`, `palworld`, `rust`, `project-zomboid`, `dayz`, `garrys-mod`, `terraria`, `7-days-to-die`, `ark-survival-ascended`, `factorio`, `dont-starve-together`, `valheim`, `satisfactory`) - **New `samples/gameserver.yaml` authored**: 7 (`project-zomboid`, `dayz`, `garrys-mod`, `7-days-to-die`, `ark-survival-ascended`, `dont-starve-together`, `satisfactory`) - **New e2e wire-protocol probe packages authored**: 13 (`test/e2e/internal//app.go` + `spec.md`, one per new module — T032-T044) diff --git a/test/e2e/arksurvival_cluster_persistence_e2e_test.go b/test/e2e/arksurvival_cluster_persistence_e2e_test.go index e0fc36161..f98389711 100644 --- a/test/e2e/arksurvival_cluster_persistence_e2e_test.go +++ b/test/e2e/arksurvival_cluster_persistence_e2e_test.go @@ -31,7 +31,7 @@ func TestGameServer_ArkSurvival_ClusterPersistence(t *testing.T) { uid := time.Now().UnixNano() % 100000 tmplName := fmt.Sprintf("e2e-ark-cluster-%d", uid) gsName := fmt.Sprintf("ark-shard-01-%d", uid) - const mountPath = "/serverdata/ShooterGame/Saved" + const mountPath = "/data" clusterID := fmt.Sprintf("cluster-%d", uid) marker := fmt.Sprintf("ark-survivor-payload-%d", uid) @@ -43,7 +43,7 @@ func TestGameServer_ArkSurvival_ClusterPersistence(t *testing.T) { "displayName": "E2E ARK Cluster Shard", "game": "ark-survival-evolved", "version": "1.0.0", - "image": "ghcr.io/gameplanepanel/gameplane/ark-survival-evolved:latest@sha256:0000000000000000000000000000000000000000000000000000000000000000", + "image": "ghcr.io/gameplanepanel/gameplane/ark-survival-evolved:latest@sha256:2a4298f8055dbff4107c49c961cace1f2bed42809e6b93fb4924371ae4484e58", "ports": []any{ map[string]any{"name": "game", "containerPort": int64(7777), "protocol": "UDP", "advertise": true}, map[string]any{"name": "query", "containerPort": int64(27015), "protocol": "UDP", "advertise": true}, @@ -105,7 +105,7 @@ func TestGameServer_ArkSurvival_ClusterPersistence(t *testing.T) { waitPVCBound(t, ns, gsName+"-data", 2*time.Minute) waitGameContainerReady(t, ns, gsName+"-0", 5*time.Minute) - clusterDir := fmt.Sprintf("%s/clusters/%s", mountPath, clusterID) + clusterDir := fmt.Sprintf("%s/ShooterGame/Saved/clusters/%s", mountPath, clusterID) markerFile := fmt.Sprintf("%s/survivor.dat", clusterDir) writeCmd := fmt.Sprintf("mkdir -p %s && echo -n %s > %s && sync", clusterDir, marker, markerFile) diff --git a/test/e2e/arksurvivalevolved_bot_e2e_test.go b/test/e2e/arksurvivalevolved_bot_e2e_test.go index dcff153ac..5333011e4 100644 --- a/test/e2e/arksurvivalevolved_bot_e2e_test.go +++ b/test/e2e/arksurvivalevolved_bot_e2e_test.go @@ -25,7 +25,7 @@ func TestGameServer_ArkSurvivalEvolvedBot_Query(t *testing.T) { Game: "ark-survival-evolved", Template: fmt.Sprintf("e2e-ase-bot-%d", time.Now().UnixNano()), DisplayName: "E2E ARK: Survival Evolved", - Image: "ghcr.io/gameplanepanel/gameplane/ark-survival-evolved:latest@sha256:0000000000000000000000000000000000000000000000000000000000000000", + Image: "ghcr.io/gameplanepanel/gameplane/ark-survival-evolved:latest@sha256:2a4298f8055dbff4107c49c961cace1f2bed42809e6b93fb4924371ae4484e58", Env: map[string]string{ "SESSION_NAME": "Gameplane E2E ASE", "RCON_PASSWORD": "secret-rcon-password", @@ -36,7 +36,7 @@ func TestGameServer_ArkSurvivalEvolvedBot_Query(t *testing.T) { {Name: "rcon", Port: 27020, Protocol: "TCP"}, }, StorageSize: "30Gi", - MountPath: "/serverdata/ShooterGame/Saved", + MountPath: "/data", Resources: gameResources{ ReqCPU: "2", ReqMem: "8Gi", LimCPU: "4", LimMem: "16Gi", diff --git a/test/e2e/armareforger_bot_e2e_test.go b/test/e2e/armareforger_bot_e2e_test.go index 583993cc3..2df18ef0e 100644 --- a/test/e2e/armareforger_bot_e2e_test.go +++ b/test/e2e/armareforger_bot_e2e_test.go @@ -25,16 +25,18 @@ func TestGameServer_ArmaReforgerBot_Query(t *testing.T) { Game: "arma-reforger", Template: fmt.Sprintf("e2e-arma-reforger-bot-%d", time.Now().UnixNano()), DisplayName: "E2E Arma Reforger", - Image: "ghcr.io/gameplanepanel/gameplane/arma-reforger:latest@sha256:0000000000000000000000000000000000000000000000000000000000000000", + Image: "ghcr.io/acemod/arma-reforger:latest@sha256:beb50bcaebbc3b3124363ed1c0a5729b514493d72b3cadd52a204ade6105fecd", Env: map[string]string{ - "SERVER_NAME": "Gameplane E2E Arma Reforger", + "GAME_NAME": "Gameplane E2E Arma Reforger", + "ARMA_PROFILE": "/reforger/profile", + "ARMA_WORKSHOP_DIR": "/reforger/workshop", }, Ports: []gamePort{ {Name: "game", Port: 2001, Protocol: "UDP"}, {Name: "query", Port: 17777, Protocol: "UDP"}, }, StorageSize: "25Gi", - MountPath: "/home/steam/.local/share/ArmaReforgerServer", + MountPath: "/reforger", Resources: gameResources{ ReqCPU: "2", ReqMem: "8Gi", LimCPU: "6", LimMem: "16Gi", diff --git a/test/e2e/buckets.sh b/test/e2e/buckets.sh index 3b755fb98..fbc3db1bb 100755 --- a/test/e2e/buckets.sh +++ b/test/e2e/buckets.sh @@ -278,7 +278,6 @@ EOF # TestGameServer_EuroTruckSimulator2Bot_Query: 5Gi storage + SteamCMD download (exceeds runner disk) # TestGameServer_FarmingSimulator25Bot_Query: 20Gi storage + Wine/Xvfb overhead (exceeds runner disk) # TestGameServer_FiveMBot_Query: 10Gi storage + embedded txAdmin database (exceeds runner disk) -# TestGameServer_HellLetLooseBot_Query: 30Gi storage + SteamCMD download (exceeds runner disk) # TestGameServer_Left4Dead2Bot_Query: 15Gi storage + SteamCMD download (exceeds runner disk) # TestGameServer_MountAndBlade2BannerlordBot_Query: 15Gi storage + SteamCMD download (exceeds runner disk) # TestGameServer_SquadBot_Query: 40Gi storage + SteamCMD download (exceeds runner disk) @@ -301,7 +300,6 @@ TestGameServer_FactorioBot_Query TestGameServer_FarmingSimulator25Bot_Query TestGameServer_FiveMBot_Query TestGameServer_FiveM_Persistence -TestGameServer_HellLetLooseBot_Query TestGameServer_Left4Dead2Bot_Query TestGameServer_MountAndBlade2BannerlordBot_Query TestGameServer_PalworldBot_Query diff --git a/test/e2e/gamebot_helpers_e2e_test.go b/test/e2e/gamebot_helpers_e2e_test.go index ca7fb4d2b..fd14d811f 100644 --- a/test/e2e/gamebot_helpers_e2e_test.go +++ b/test/e2e/gamebot_helpers_e2e_test.go @@ -54,7 +54,7 @@ var heavyGameSet = []string{ "enshrouded", "satisfactory", "fivem", "team-fortress-2", "farming-simulator-25", "euro-truck-simulator-2", "mount-and-blade-2-bannerlord", "left-4-dead-2", "the-isle", - "ark-survival-evolved", "arma-reforger", "hell-let-loose", "squad", + "ark-survival-evolved", "arma-reforger", "squad", } // parseGameScope parses GAMEPLANE_E2E_GAMES and returns the set of games to test, diff --git a/test/e2e/hellletloose_bot_e2e_test.go b/test/e2e/hellletloose_bot_e2e_test.go deleted file mode 100644 index 41ea1da2b..000000000 --- a/test/e2e/hellletloose_bot_e2e_test.go +++ /dev/null @@ -1,53 +0,0 @@ -//go:build e2e - -package e2e - -import ( - "fmt" - "testing" - "time" - - "github.com/GameplanePanel/gameplane/test/e2e/internal/protocol/joindepth" -) - -// TestGameServer_HellLetLooseBot_Query boots a Hell Let Loose dedicated server -// and connects via A2S query to verify QUERY depth readiness. -// -// Hell Let Loose is in the HEAVY game set due to SteamCMD download and >30Gi storage requirements. -// This test DELIBERATELY NEVER RUNS IN CI. It is validated only by maintainer hand-run: -// -// GAMEPLANE_E2E_REUSE_CLUSTER=1 GAMEPLANE_E2E_CONTEXT= GAMEPLANE_E2E_GAME_BOT=1 GAMEPLANE_E2E_GAMES=hell-let-loose make test-e2e-keep -func TestGameServer_HellLetLooseBot_Query(t *testing.T) { - skipUnlessGameInScope(t, "hell-let-loose") - t.Parallel() - - runGameBotTest(t, gameBotSpec{ - Game: "hell-let-loose", - Template: fmt.Sprintf("e2e-hll-bot-%d", time.Now().UnixNano()), - DisplayName: "E2E Hell Let Loose", - Image: "ghcr.io/gameplanepanel/gameplane/hell-let-loose:latest@sha256:0000000000000000000000000000000000000000000000000000000000000000", - Env: map[string]string{ - "SERVER_NAME": "Gameplane E2E HLL", - "RCON_PASSWORD": "secret-rcon-password", - }, - Ports: []gamePort{ - {Name: "game", Port: 7787, Protocol: "UDP"}, - {Name: "query", Port: 27165, Protocol: "UDP"}, - {Name: "rcon", Port: 22222, Protocol: "TCP"}, - }, - StorageSize: "30Gi", - MountPath: "/serverdata/HLL/Saved", - Resources: gameResources{ - ReqCPU: "2", ReqMem: "6Gi", - LimCPU: "4", LimMem: "12Gi", - }, - ReadyTimeout: 10 * time.Minute, - ProbePort: 27165, - ProbeDeadline: 4 * time.Minute, - ExpectDepth: joindepth.QUERY, - RCON: map[string]any{ - "protocol": "source", - "port": int64(22222), - }, - }) -} diff --git a/test/e2e/internal/hell-let-loose/app.go b/test/e2e/internal/hell-let-loose/app.go deleted file mode 100644 index 5b5fc11ba..000000000 --- a/test/e2e/internal/hell-let-loose/app.go +++ /dev/null @@ -1,113 +0,0 @@ -// Package main implements a join-depth probe for Hell Let Loose dedicated servers. -package main - -import ( - "context" - "flag" - "fmt" - "log" - "os" - "time" - - a2s "github.com/GameplanePanel/gameplane/test/e2e/internal/protocol/a2sproto" - "github.com/GameplanePanel/gameplane/test/e2e/internal/protocol/joindepth" -) - -// main is the probe entrypoint. -func main() { - log.SetFlags(log.Ltime) - - addr := flag.String("addr", "", "game server host:port (in-cluster Service DNS)") - deadline := flag.Duration("deadline", 4*time.Minute, "overall deadline for probe") - expectDepthStr := flag.String("expect-depth", "QUERY", "expected join depth: QUERY | PARTIAL | JOINED") - expectFail := flag.Bool("expect-fail", false, "if set, probe must NOT reach -expect-depth") - flag.Parse() - - if *addr == "" { - verdict := &joindepth.ProbeVerdict{ - ReachedDepth: joindepth.JOINED, - Detail: "Bad flag: -addr is required", - Err: fmt.Errorf("missing required flag: -addr"), - } - line, _ := verdict.Encode() - fmt.Println(line) - os.Exit(1) - } - - expectedDepth, err := joindepth.Parse(*expectDepthStr) - if err != nil { - verdict := &joindepth.ProbeVerdict{ - ReachedDepth: joindepth.JOINED, - Detail: fmt.Sprintf("Bad flag: -expect-depth must be one of QUERY, PARTIAL, JOINED (got %q)", *expectDepthStr), - Err: err, - } - line, _ := verdict.Encode() - fmt.Println(line) - os.Exit(1) - } - - ctx, cancel := context.WithTimeout(context.Background(), *deadline) - defer cancel() - - depth, evidence, err := probeHLL(ctx, *addr) - - verdict := &joindepth.ProbeVerdict{ - ReachedDepth: depth, - Detail: evidence, - Err: err, - } - - line, encodeErr := verdict.Encode() - if encodeErr != nil { - fmt.Printf("VERDICT\tFAIL_INTERNAL_ERROR\tUNKNOWN\tFailed to encode verdict: %v\n", encodeErr) - os.Exit(1) - } - fmt.Println(line) - - exitCode := joindepth.ExitCodeFromVerdict(verdict, expectedDepth, *expectFail) - os.Exit(exitCode) -} - -// probeHLL executes join-depth probing against the target game server. -func probeHLL(ctx context.Context, addr string) (joindepth.JoinDepth, string, error) { - var info *a2s.Info - err := retryWithContext(ctx, "hll-a2s-query", 15*time.Second, func(actx context.Context) error { - var err error - info, err = a2s.QueryInfo(actx, addr) - if err != nil { - return err - } - return nil - }) - - if err != nil { - return joindepth.JoinDepth(-1), "", fmt.Errorf("hell let loose a2s query failed: %w", err) - } - - evidence := fmt.Sprintf("A2S query response received: server=%q map=%q players=%d/%d", - info.Name, info.Map, info.Players, info.MaxPlayers) - return joindepth.QUERY, evidence, nil -} - -// retryWithContext executes an operation repeatedly until it succeeds or context is canceled. -func retryWithContext(ctx context.Context, opName string, perAttemptTimeout time.Duration, fn func(context.Context) error) error { - ticker := time.NewTicker(2 * time.Second) - defer ticker.Stop() - - var lastErr error - for { - actx, acancel := context.WithTimeout(ctx, perAttemptTimeout) - err := fn(actx) - acancel() - if err == nil { - return nil - } - lastErr = err - - select { - case <-ctx.Done(): - return fmt.Errorf("%s timed out: last error: %w", opName, lastErr) - case <-ticker.C: - } - } -} diff --git a/test/e2e/internal/hell-let-loose/spec.md b/test/e2e/internal/hell-let-loose/spec.md deleted file mode 100644 index d325a6371..000000000 --- a/test/e2e/internal/hell-let-loose/spec.md +++ /dev/null @@ -1,33 +0,0 @@ -# hell-let-loose — E2E Probe Specification - -## Coverage Status - -- **Status**: active -- **Depth**: QUERY -- **Test**: TestGameServer_HellLetLooseBot_Query -- **Bucket**: bot-heavy -- **Last Verified**: — -- **Blocker**: None -- **Blocker Class**: none - -## On-Demand Invocation - -This test is part of the `bot-heavy` bucket and does not run by default in CI. To run it against an operator-provided cluster: - -```bash -GAMEPLANE_E2E_REUSE_CLUSTER=1 GAMEPLANE_E2E_CONTEXT= GAMEPLANE_E2E_GAME_BOT=1 GAMEPLANE_E2E_GAMES=hell-let-loose make test-e2e-keep -``` - -**Status:** pre-v1; probe depth measured: **QUERY** (A2S query response received) -**Module / package:** `github.com/GameplanePanel/gameplane/test/e2e/internal/hell-let-loose` -**Dependencies:** `test/e2e/internal/protocol/{a2sproto,joindepth}` -**Heavy game:** Yes (>30GB SteamCMD download) - -## Purpose - -End-to-end test harness for Hell Let Loose, verifying that a Gameplane-managed HLL dedicated server responds to Steam A2S queries over UDP port 27165. - -## Responsibilities - -1. **A2S Query Protocol:** Issue standard Steam A2S query packets over UDP. -2. **Verdict Reporting:** Emit standard `VERDICT` output conforming to `joindepth.ProbeVerdict`. diff --git a/test/e2e/internal/specs.md b/test/e2e/internal/specs.md index d65676621..50a8b3722 100644 --- a/test/e2e/internal/specs.md +++ b/test/e2e/internal/specs.md @@ -305,7 +305,7 @@ The `buckets.sh verify` step fails CI if any test is unbucketed or double-bucket ### Per-game depth table The canonical, up-to-date per-game join-protocol coverage table — covering -all 29 probe packages under `internal/` (30 modules including +all 28 probe packages under `internal/` (29 modules including `nuclear-option`, which has no probe package yet) — lives in [`docs/game-coverage.md`](../../../docs/game-coverage.md). It lists each module's transport, status, depth, test name, bucket, last-verified date and diff --git a/test/e2e/mountandblade2bannerlord_bot_e2e_test.go b/test/e2e/mountandblade2bannerlord_bot_e2e_test.go index 310830720..4a599e759 100644 --- a/test/e2e/mountandblade2bannerlord_bot_e2e_test.go +++ b/test/e2e/mountandblade2bannerlord_bot_e2e_test.go @@ -25,7 +25,7 @@ func TestGameServer_MountAndBlade2BannerlordBot_Query(t *testing.T) { Game: "mount-and-blade-2-bannerlord", Template: fmt.Sprintf("e2e-bannerlord-bot-%d", time.Now().UnixNano()), DisplayName: "E2E Mount & Blade II: Bannerlord", - Image: "ghcr.io/gameplanepanel/gameplane/mount-and-blade-2-bannerlord:latest@sha256:0000000000000000000000000000000000000000000000000000000000000000", + Image: "ghcr.io/gameplanepanel/gameplane/mount-and-blade-2-bannerlord:latest@sha256:ac4796548429fce3bf1990839b75002f08ee8d6c11260bc4a26329f5a7d93717", Env: map[string]string{ "SERVER_TOKEN": "test-bannerlord-token", "SERVER_NAME": "Gameplane E2E Bannerlord", @@ -35,7 +35,7 @@ func TestGameServer_MountAndBlade2BannerlordBot_Query(t *testing.T) { {Name: "query", Port: 7211, Protocol: "UDP"}, }, StorageSize: "15Gi", - MountPath: "/serverdata", + MountPath: "/data", Resources: gameResources{ ReqCPU: "2", ReqMem: "4Gi", LimCPU: "4", LimMem: "8Gi", diff --git a/test/e2e/squad_bot_e2e_test.go b/test/e2e/squad_bot_e2e_test.go index 41d2126f0..b83ef2203 100644 --- a/test/e2e/squad_bot_e2e_test.go +++ b/test/e2e/squad_bot_e2e_test.go @@ -25,7 +25,7 @@ func TestGameServer_SquadBot_Query(t *testing.T) { Game: "squad", Template: fmt.Sprintf("e2e-squad-bot-%d", time.Now().UnixNano()), DisplayName: "E2E Squad", - Image: "ghcr.io/gameplanepanel/gameplane/squad:latest@sha256:0000000000000000000000000000000000000000000000000000000000000000", + Image: "ghcr.io/gameplanepanel/gameplane/squad:latest@sha256:c96561c975b1cd049668da930582181de7ac8d74e5d8d2251080423ec2ee2748", Env: map[string]string{ "SERVER_NAME": "Gameplane E2E Squad", "RCON_PASSWORD": "secret-rcon-password", @@ -36,7 +36,7 @@ func TestGameServer_SquadBot_Query(t *testing.T) { {Name: "rcon", Port: 21114, Protocol: "TCP"}, }, StorageSize: "40Gi", - MountPath: "/serverdata/Squad/Saved", + MountPath: "/data", Resources: gameResources{ ReqCPU: "2", ReqMem: "8Gi", LimCPU: "6", LimMem: "16Gi", diff --git a/test/e2e/squad_rcon_e2e_test.go b/test/e2e/squad_rcon_e2e_test.go index 21248c980..c5a079814 100644 --- a/test/e2e/squad_rcon_e2e_test.go +++ b/test/e2e/squad_rcon_e2e_test.go @@ -31,7 +31,7 @@ func TestGameServer_Squad_RCON(t *testing.T) { uid := time.Now().UnixNano() tmplName := fmt.Sprintf("e2e-squad-rcon-%d", uid) gsName := fmt.Sprintf("squad-rcon-%d", uid) - const mountPath = "/serverdata/Squad/Saved" + const mountPath = "/data" tmpl := &unstructured.Unstructured{Object: map[string]any{ "apiVersion": "gameplane.local/v1alpha1", @@ -41,15 +41,14 @@ func TestGameServer_Squad_RCON(t *testing.T) { "displayName": "E2E Squad RCON", "game": "squad", "version": "1.0.0", - "image": "ghcr.io/gameplanepanel/gameplane/squad:latest@sha256:0000000000000000000000000000000000000000000000000000000000000000", + "image": "ghcr.io/gameplanepanel/gameplane/squad:latest@sha256:c96561c975b1cd049668da930582181de7ac8d74e5d8d2251080423ec2ee2748", "env": []any{ - map[string]any{"name": "HOME", "value": "/serverdata"}, map[string]any{"name": "RCON_PASSWORD", "value": "secret-rcon-password"}, }, "security": map[string]any{ - "runAsUser": int64(1000), - "runAsGroup": int64(1000), - "fsGroup": int64(1000), + "runAsUser": int64(10000), + "runAsGroup": int64(10000), + "fsGroup": int64(10000), }, "ports": []any{ map[string]any{"name": "game", "containerPort": int64(7787), "protocol": "UDP", "advertise": true}, diff --git a/test/e2e/theisle_bot_e2e_test.go b/test/e2e/theisle_bot_e2e_test.go index dc433c545..c70cc8f93 100644 --- a/test/e2e/theisle_bot_e2e_test.go +++ b/test/e2e/theisle_bot_e2e_test.go @@ -25,7 +25,7 @@ func TestGameServer_TheIsleBot_Query(t *testing.T) { Game: "the-isle", Template: fmt.Sprintf("e2e-the-isle-bot-%d", time.Now().UnixNano()), DisplayName: "E2E The Isle", - Image: "ghcr.io/gameplanepanel/gameplane/the-isle:latest@sha256:0000000000000000000000000000000000000000000000000000000000000000", + Image: "ghcr.io/gameplanepanel/gameplane/the-isle:latest@sha256:229ec85c92f8f722beb0b7c735cfdb5dbe40e6782d537a6c56b32c6baa57d5a8", Env: map[string]string{ "SERVER_NAME": "Gameplane E2E The Isle", "RCON_PASSWORD": "secret-rcon-password", @@ -36,7 +36,7 @@ func TestGameServer_TheIsleBot_Query(t *testing.T) { {Name: "rcon", Port: 8888, Protocol: "TCP"}, }, StorageSize: "20Gi", - MountPath: "/serverdata/TheIsle/Saved", + MountPath: "/data", Resources: gameResources{ ReqCPU: "2", ReqMem: "4Gi", LimCPU: "4", LimMem: "8Gi", diff --git a/website b/website index 299251d07..343920966 160000 --- a/website +++ b/website @@ -1 +1 @@ -Subproject commit 299251d071818cd9085de95ede86e74539c5e444 +Subproject commit 3439209665d815fb19e08dee9221028fb0cbf804