Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions generate-scrolls.go
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,9 @@ func ParsePorts(spec string) []PortSpec {
if protocol == "" {
protocol = "tcp"
}
if port == "0" {
port = ""
}
ports = append(ports, PortSpec{
Name: name,
Port: port,
Expand Down
127 changes: 127 additions & 0 deletions generate-scrolls_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
package main

import (
"os"
"testing"

"gopkg.in/yaml.v3"
)

func TestParsePortsSupportsDynamicPorts(t *testing.T) {
ports := ParsePorts("main=/udp;query=0/udp;rcon;fixed=27015;zero=0")
if len(ports) != 5 {
t.Fatalf("ports = %#v", ports)
}
if ports[0].Name != "main" || ports[0].Port != "" || ports[0].Protocol != "udp" {
t.Fatalf("main = %#v", ports[0])
}
if ports[1].Name != "query" || ports[1].Port != "" || ports[1].Protocol != "udp" {
t.Fatalf("query = %#v", ports[1])
}
if ports[2].Name != "rcon" || ports[2].Port != "" || ports[2].Protocol != "tcp" {
t.Fatalf("rcon = %#v", ports[2])
}
if ports[3].Port != "27015" {
t.Fatalf("fixed = %#v", ports[3])
}
if ports[4].Name != "zero" || ports[4].Port != "" || ports[4].Protocol != "tcp" {
t.Fatalf("zero = %#v", ports[4])
}
}

func TestGeneratedARKHandsRCONToRuntimeServer(t *testing.T) {
scroll := readGeneratedScroll(t, "scrolls/lgsm/arkserver/scroll.yaml")
console := scroll.Commands["console"]
for _, procedureID := range []string{"coldstart", "start"} {
procedure := findGeneratedProcedure(t, console.Procedures, procedureID)
if !hasGeneratedExpectedPort(procedure.ExpectedPorts, "rcon") {
t.Fatalf("%s expectedPorts = %#v, want rcon", procedureID, procedure.ExpectedPorts)
}
}
}

func TestGeneratedSharedPortsRemainConcrete(t *testing.T) {
tests := []struct {
path string
want map[string]int
}{
{
path: "scrolls/lgsm/cs2server/scroll.yaml",
want: map[string]int{"main": 27015, "rcon": 27015},
},
{
path: "scrolls/lgsm/pzserver/scroll.yaml",
want: map[string]int{"main": 16261, "main2": 16262, "maintcp": 16261},
},
}
for _, test := range tests {
t.Run(test.path, func(t *testing.T) {
scroll := readGeneratedScroll(t, test.path)
got := make(map[string]int, len(scroll.Ports))
for _, port := range scroll.Ports {
got[port.Name] = port.Port
}
for name, want := range test.want {
if got[name] != want {
t.Fatalf("port %s = %d, want %d", name, got[name], want)
}
}
})
}
}

type generatedScroll struct {
Ports []generatedPort `yaml:"ports"`
Commands map[string]generatedCommand `yaml:"commands"`
}

type generatedPort struct {
Name string `yaml:"name"`
Port int `yaml:"port"`
}

type generatedCommand struct {
Procedures []generatedProcedure `yaml:"procedures"`
}

type generatedProcedure struct {
ID string `yaml:"id"`
ExpectedPorts []generatedExpectedPort `yaml:"expectedPorts"`
}

type generatedExpectedPort struct {
Name string `yaml:"name"`
}

func readGeneratedScroll(t *testing.T, path string) generatedScroll {
t.Helper()
content, err := os.ReadFile(path)
if err != nil {
t.Fatal(err)
}
var scroll generatedScroll
if err := yaml.Unmarshal(content, &scroll); err != nil {
t.Fatal(err)
}
return scroll
}

func findGeneratedProcedure(t *testing.T, procedures []generatedProcedure, id string) generatedProcedure {
t.Helper()
for _, procedure := range procedures {
if procedure.ID == id {
return procedure
}
}
t.Fatalf("procedure %q not found", id)
return generatedProcedure{}
}

func hasGeneratedExpectedPort(ports []generatedExpectedPort, name string) bool {
for _, port := range ports {
if port.Name == name {
return true
}
}
return false
}
12 changes: 6 additions & 6 deletions scripts/prebuild/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -641,16 +641,16 @@ func allSpecs() []prebuildSpec {
steamImage := getenv("DRUID_STEAM_RUNTIME_IMAGE", "artifacts.druid.gg/druid-team/druid:v0.1.249-steamcmd")
specs := []prebuildSpec{
{Target: "pwserver", Artifact: "artifacts.druid.gg/druid-team/scroll-lgsm:pwserver-prebuild", Source: "./scrolls/lgsm/pwserver", Image: steamImage, Ports: []string{"main=8211/udp", "rcon=25575"}, MinDisk: "7Gi", MinRAM: "2Gi", MinCPU: "0.5", Category: "palworld", Smart: true, PackMeta: true},
{Target: "arkserver", Artifact: "artifacts.druid.gg/druid-team/scroll-lgsm:arkserver-prebuild", Source: "./scrolls/lgsm/arkserver", Image: steamImage, Ports: []string{"main=7777/udp", "query=27015/udp", "rcon=27020"}, MinDisk: "25Gi", MinRAM: "7Gi", MinCPU: "0.5", Category: "ark", Smart: true, PackMeta: true},
{Target: "dayzserver", Artifact: "artifacts.druid.gg/druid-team/scroll-lgsm:dayzserver-prebuild", Source: "./scrolls/lgsm/dayzserver", Image: steamImage, Ports: []string{"main=2302/udp", "battle-eye=2304/udp", "query=27016/udp"}, MinDisk: "7Gi", MinRAM: "5Gi", MinCPU: "1", Category: "dayz", PackMeta: true, RequiredEnv: []string{"STEAM_USER", "STEAM_PASS"}},
{Target: "untserver", Artifact: "artifacts.druid.gg/druid-team/scroll-lgsm:untserver-prebuild", Source: "./scrolls/lgsm/untserver", Image: steamImage, Ports: []string{"main=27015/udp", "mainv6=27016"}, MinDisk: "7Gi", MinRAM: "1Gi", MinCPU: "0.5", Category: "unturned", Smart: true, PackMeta: true},
{Target: "arkserver", Artifact: "artifacts.druid.gg/druid-team/scroll-lgsm:arkserver-prebuild", Source: "./scrolls/lgsm/arkserver", Image: steamImage, Ports: []string{"main=/udp", "query=/udp", "rcon"}, MinDisk: "25Gi", MinRAM: "7Gi", MinCPU: "0.5", Category: "ark", Smart: true, PackMeta: true},
{Target: "dayzserver", Artifact: "artifacts.druid.gg/druid-team/scroll-lgsm:dayzserver-prebuild", Source: "./scrolls/lgsm/dayzserver", Image: steamImage, Ports: []string{"main=/udp", "battle-eye=2304/udp", "query=27016/udp"}, MinDisk: "7Gi", MinRAM: "5Gi", MinCPU: "1", Category: "dayz", PackMeta: true, RequiredEnv: []string{"STEAM_USER", "STEAM_PASS"}},
{Target: "untserver", Artifact: "artifacts.druid.gg/druid-team/scroll-lgsm:untserver-prebuild", Source: "./scrolls/lgsm/untserver", Image: steamImage, Ports: []string{"main=/udp", "mainv6=27016"}, MinDisk: "7Gi", MinRAM: "1Gi", MinCPU: "0.5", Category: "unturned", Smart: true, PackMeta: true},
{Target: "sdtdserver", Artifact: "artifacts.druid.gg/druid-team/scroll-lgsm:sdtdserver-prebuild", Source: "./scrolls/lgsm/sdtdserver", Image: steamImage, Ports: []string{"query=26900/udp", "main=26900/udp", "main2=26902/udp", "maintcp=26900"}, MinDisk: "20Gi", MinRAM: "2Gi", MinCPU: "0.5", Category: "7days", PackMeta: true},
{Target: "gmodserver", Artifact: "artifacts.druid.gg/druid-team/scroll-lgsm:gmodserver-prebuild", Source: "./scrolls/lgsm/gmodserver", Image: steamImage, Ports: []string{"query=27005/udp", "main=27015/udp", "sourcetv=27020/udp", "steam=27015"}, MinDisk: "8Gi", MinRAM: "512Mi", MinCPU: "0.25", Category: "gmod", Smart: true, PackMeta: true},
{Target: "gmodserver", Artifact: "artifacts.druid.gg/druid-team/scroll-lgsm:gmodserver-prebuild", Source: "./scrolls/lgsm/gmodserver", Image: steamImage, Ports: []string{"query=27005/udp", "main=/udp", "sourcetv=27020/udp", "steam=27015"}, MinDisk: "8Gi", MinRAM: "512Mi", MinCPU: "0.25", Category: "gmod", Smart: true, PackMeta: true},
{Target: "cs2server", Artifact: "artifacts.druid.gg/druid-team/scroll-lgsm:cs2server-prebuild", Source: "./scrolls/lgsm/cs2server", Image: steamImage, Ports: []string{"main=27015/udp", "rcon=27015"}, MinDisk: "70Gi", BuildDisk: "95Gi", MinRAM: "1Gi", MinCPU: "0.5", Category: "cs2", Smart: true, PackMeta: true},
{Target: "pzserver", Artifact: "artifacts.druid.gg/druid-team/scroll-lgsm:pzserver-prebuild", Source: "./scrolls/lgsm/pzserver", Image: steamImage, Ports: []string{"main=16261/udp", "main2=16262/udp", "maintcp=16261"}, MinDisk: "3Gi", MinRAM: "512Mi", MinCPU: "0.25", Category: "zomboid", Smart: true, PackMeta: true},
{Target: "csgoserver", Artifact: "artifacts.druid.gg/druid-team/scroll-lgsm:csgoserver-prebuild", Source: "./scrolls/lgsm/csgoserver", Image: steamImage, Ports: []string{"query=27005/udp", "main=27015/udp", "sourcetv=27020/udp", "steam=27015"}, BuildDisk: "45Gi", Category: "csgo", Smart: true, PackMeta: true},
{Target: "rust-vanilla", Artifact: "artifacts.druid.gg/druid-team/scroll-rust-vanilla:latest-prebuild", Source: "./scrolls/rust/rust-vanilla/latest", Image: steamImage, Ports: []string{"main=28015/udp", "query=28017/udp", "rcon=28016", "rustplus=28082"}, MinDisk: "10Gi", BuildDisk: "25Gi", MinRAM: "6Gi", MinCPU: "1", Category: "rust", Smart: true},
{Target: "rust-oxide", Artifact: "artifacts.druid.gg/druid-team/scroll-rust-oxide:latest-prebuild", Source: "./scrolls/rust/rust-oxide/latest", Image: steamImage, Ports: []string{"main=28015/udp", "query=28017/udp", "rcon=28016", "rustplus=28082"}, MinDisk: "10Gi", BuildDisk: "25Gi", MinRAM: "6Gi", MinCPU: "1", Category: "rust", Smart: true},
{Target: "rust-vanilla", Artifact: "artifacts.druid.gg/druid-team/scroll-rust-vanilla:latest-prebuild", Source: "./scrolls/rust/rust-vanilla/latest", Image: steamImage, Ports: []string{"main=/udp", "query=/udp", "rcon", "rustplus"}, MinDisk: "10Gi", BuildDisk: "25Gi", MinRAM: "6Gi", MinCPU: "1", Category: "rust", Smart: true},
{Target: "rust-oxide", Artifact: "artifacts.druid.gg/druid-team/scroll-rust-oxide:latest-prebuild", Source: "./scrolls/rust/rust-oxide/latest", Image: steamImage, Ports: []string{"main=/udp", "query=/udp", "rcon", "rustplus"}, MinDisk: "10Gi", BuildDisk: "25Gi", MinRAM: "6Gi", MinCPU: "1", Category: "rust", Smart: true},
}
sort.Slice(specs, func(i, j int) bool { return specs[i].Target < specs[j].Target })
return specs
Expand Down
38 changes: 34 additions & 4 deletions scripts/prebuild/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,20 +89,50 @@ func TestDayZPrebuildRequiresSteamCredentials(t *testing.T) {
}
}

func TestRustPrebuildPortsAreConcrete(t *testing.T) {
func TestRustPrebuildPortsAreDynamic(t *testing.T) {
specs, err := selectSpecs("rust-vanilla,rust-oxide")
if err != nil {
t.Fatal(err)
}
for _, spec := range specs {
for _, port := range spec.Ports {
if port == "main=/udp" || port == "query=/udp" || port == "rcon" || port == "rustplus" {
t.Fatalf("%s has non-concrete port %q", spec.Target, port)
want := []string{"main=/udp", "query=/udp", "rcon", "rustplus"}
if len(spec.Ports) != len(want) {
t.Fatalf("%s ports = %#v", spec.Target, spec.Ports)
}
for index := range want {
if spec.Ports[index] != want[index] {
t.Fatalf("%s ports = %#v, want %#v", spec.Target, spec.Ports, want)
}
}
}
}

func TestSharedPortPrebuildsRemainConcrete(t *testing.T) {
tests := []struct {
target string
want []string
}{
{target: "cs2server", want: []string{"main=27015/udp", "rcon=27015"}},
{target: "pzserver", want: []string{"main=16261/udp", "main2=16262/udp", "maintcp=16261"}},
}
for _, test := range tests {
t.Run(test.target, func(t *testing.T) {
specs, err := selectSpecs(test.target)
if err != nil {
t.Fatal(err)
}
if len(specs) != 1 || len(specs[0].Ports) != len(test.want) {
t.Fatalf("specs = %#v", specs)
}
for index := range test.want {
if specs[0].Ports[index] != test.want[index] {
t.Fatalf("ports = %#v, want %#v", specs[0].Ports, test.want)
}
}
})
}
}

func TestValidateRequiredEnvFailsBeforePrebuild(t *testing.T) {
t.Setenv("PREBUILD_TEST_REQUIRED", "")
err := validateRequiredEnv(prebuildSpec{Target: "test", RequiredEnv: []string{"PREBUILD_TEST_REQUIRED"}})
Expand Down
16 changes: 8 additions & 8 deletions scripts/push.sh
Original file line number Diff line number Diff line change
Expand Up @@ -174,16 +174,16 @@ push_release_artifacts() {
run druid push artifacts.druid.gg/druid-team/scroll-minecraft-forge:1.21.6 ./scrolls/minecraft/forge/1.21.6 -p main=25565 -p rcon=25575 -i artifacts.druid.gg/druid-team/druid:v0.1.249 --min-disk 3Gi --min-ram 512Mi --min-cpu 0.25 --smart --category minecraft
run druid push artifacts.druid.gg/druid-team/scroll-minecraft-forge:1.21.7 ./scrolls/minecraft/forge/1.21.7 -p main=25565 -p rcon=25575 -i artifacts.druid.gg/druid-team/druid:v0.1.249 --min-disk 3Gi --min-ram 512Mi --min-cpu 0.25 --smart --category minecraft
run druid push artifacts.druid.gg/druid-team/scroll-minecraft-cuberite:latest ./scrolls/minecraft/cuberite/latest -p main=25565 -p webpanel=8080 -i artifacts.druid.gg/druid-team/druid:v0.1.249 --min-disk 3Gi --min-ram 512Mi --min-cpu 0.25 --smart --category minecraft
run druid push artifacts.druid.gg/druid-team/scroll-rust-oxide:latest ./scrolls/rust/rust-oxide/latest -p main=28015/udp -p query=28017/udp -p rcon=28016 -p rustplus=28082 -i artifacts.druid.gg/druid-team/druid:v0.1.249-steamcmd --min-disk 10Gi --min-ram 6Gi --min-cpu 1 --smart --category rust
run druid push artifacts.druid.gg/druid-team/scroll-rust-vanilla:latest ./scrolls/rust/rust-vanilla/latest -p main=28015/udp -p query=28017/udp -p rcon=28016 -p rustplus=28082 -i artifacts.druid.gg/druid-team/druid:v0.1.249-steamcmd --min-disk 10Gi --min-ram 6Gi --min-cpu 1 --smart --category rust
run druid push artifacts.druid.gg/druid-team/scroll-rust-oxide:latest ./scrolls/rust/rust-oxide/latest -p main=/udp -p query=/udp -p rcon -p rustplus -i artifacts.druid.gg/druid-team/druid:v0.1.249-steamcmd --min-disk 10Gi --min-ram 6Gi --min-cpu 1 --smart --category rust
run druid push artifacts.druid.gg/druid-team/scroll-rust-vanilla:latest ./scrolls/rust/rust-vanilla/latest -p main=/udp -p query=/udp -p rcon -p rustplus -i artifacts.druid.gg/druid-team/druid:v0.1.249-steamcmd --min-disk 10Gi --min-ram 6Gi --min-cpu 1 --smart --category rust
run druid push artifacts.druid.gg/druid-team/scroll-lgsm:pwserver ./scrolls/lgsm/pwserver -p main=8211/udp -p rcon=25575 -i artifacts.druid.gg/druid-team/druid:v0.1.249-steamcmd -m --min-disk 7Gi --min-ram 2Gi --min-cpu 0.5 --smart --category palworld
run druid push artifacts.druid.gg/druid-team/scroll-lgsm:arkserver ./scrolls/lgsm/arkserver -p main=7777/udp -p query=27015/udp -p rcon=27020 -i artifacts.druid.gg/druid-team/druid:v0.1.249-steamcmd -m --min-disk 25Gi --min-ram 7Gi --min-cpu 0.5 --smart --category ark
run druid push artifacts.druid.gg/druid-team/scroll-lgsm:untserver ./scrolls/lgsm/untserver -p main=27015/udp -p mainv6=27016 -i artifacts.druid.gg/druid-team/druid:v0.1.249-steamcmd -m --min-disk 7Gi --min-ram 1Gi --min-cpu 0.5 --smart --category unturned
run druid push artifacts.druid.gg/druid-team/scroll-lgsm:dayzserver ./scrolls/lgsm/dayzserver -p main=2302/udp -p battle-eye=2304/udp -p query=27016/udp -i artifacts.druid.gg/druid-team/druid:v0.1.249-steamcmd -m --min-disk 7Gi --min-ram 5Gi --min-cpu 1 --category dayz
run druid push artifacts.druid.gg/druid-team/scroll-lgsm:arkserver ./scrolls/lgsm/arkserver -p main=/udp -p query=/udp -p rcon -i artifacts.druid.gg/druid-team/druid:v0.1.249-steamcmd -m --min-disk 25Gi --min-ram 7Gi --min-cpu 0.5 --smart --category ark
run druid push artifacts.druid.gg/druid-team/scroll-lgsm:untserver ./scrolls/lgsm/untserver -p main=/udp -p mainv6=27016 -i artifacts.druid.gg/druid-team/druid:v0.1.249-steamcmd -m --min-disk 7Gi --min-ram 1Gi --min-cpu 0.5 --smart --category unturned
run druid push artifacts.druid.gg/druid-team/scroll-lgsm:dayzserver ./scrolls/lgsm/dayzserver -p main=/udp -p battle-eye=2304/udp -p query=27016/udp -i artifacts.druid.gg/druid-team/druid:v0.1.249-steamcmd -m --min-disk 7Gi --min-ram 5Gi --min-cpu 1 --category dayz
run druid push artifacts.druid.gg/druid-team/scroll-lgsm:sdtdserver ./scrolls/lgsm/sdtdserver -p main=26900/udp -p main2=26902/udp -p maintcp=26900 -i artifacts.druid.gg/druid-team/druid:v0.1.249-steamcmd -m --min-disk 20Gi --min-ram 2Gi --min-cpu 0.5 --category 7days
run druid push artifacts.druid.gg/druid-team/scroll-lgsm:gmodserver ./scrolls/lgsm/gmodserver -p query=27005/udp -p main=27015/udp -p sourcetv=27020/udp -p steam=27015 -i artifacts.druid.gg/druid-team/druid:v0.1.249-steamcmd -m --min-disk 8Gi --min-ram 512Mi --min-cpu 0.25 --smart --category gmod
run druid push artifacts.druid.gg/druid-team/scroll-lgsm:cs2server ./scrolls/lgsm/cs2server -p main=27015/udp -p rcon=27015 -i artifacts.druid.gg/druid-team/druid:v0.1.249-steamcmd -m --min-disk 38Gi --min-ram 1Gi --min-cpu 0.5 --smart --category cs2
run druid push artifacts.druid.gg/druid-team/scroll-lgsm:pzserver ./scrolls/lgsm/pzserver -p main=16261/udp -p main2=16262/udp -p maintcp=16261 -i artifacts.druid.gg/druid-team/druid:v0.1.249-steamcmd -m --min-disk 3Gi --min-ram 512Mi --min-cpu 0.25 --smart --category zomboid
run druid push artifacts.druid.gg/druid-team/scroll-lgsm:gmodserver ./scrolls/lgsm/gmodserver -p query=27005/udp -p main=/udp -p sourcetv=27020/udp -p steam=27015 -i artifacts.druid.gg/druid-team/druid:v0.1.249-steamcmd -m --min-disk 8Gi --min-ram 512Mi --min-cpu 0.25 --smart --category gmod
run druid push artifacts.druid.gg/druid-team/scroll-lgsm:cs2server ./scrolls/lgsm/cs2server -p main=/udp -p rcon=27015 -i artifacts.druid.gg/druid-team/druid:v0.1.249-steamcmd -m --min-disk 38Gi --min-ram 1Gi --min-cpu 0.5 --smart --category cs2
run druid push artifacts.druid.gg/druid-team/scroll-lgsm:pzserver ./scrolls/lgsm/pzserver -p main=/udp -p main2=/udp -i artifacts.druid.gg/druid-team/druid:v0.1.249-steamcmd -m --min-disk 3Gi --min-ram 512Mi --min-cpu 0.25 --smart --category zomboid
run druid push artifacts.druid.gg/druid-team/scroll-lgsm:csgoserver ./scrolls/lgsm/csgoserver -p query=27005/udp -p main=27015/udp -p sourcetv=27020/udp -p steam=27015 -i artifacts.druid.gg/druid-team/druid:v0.1.249-steamcmd -m --smart --category csgo
run druid push artifacts.druid.gg/druid-team/scroll-hytale:standalone ./scrolls/hytale/hytale-standalone -p main=5520/udp -i artifacts.druid.gg/druid-team/druid:v0.1.249 --min-disk 10Gi --min-ram 4Gi --min-cpu 1 -m --smart --category hytale
run druid push artifacts.druid.gg/druid-team/scroll-hytale:latest ./scrolls/hytale/hytale-druid-gg -p main=5520/udp -i artifacts.druid.gg/druid-team/druid:v0.1.249 --min-disk 10Gi --min-ram 4Gi --min-cpu 1 -m --smart --category hytale
Expand Down
Loading
Loading