From cecc3414f7d677d104367d2ae11af077b14fb790 Mon Sep 17 00:00:00 2001 From: Stavros Kois <47820033+stavros-k@users.noreply.github.com> Date: Fri, 5 May 2023 22:20:09 +0300 Subject: [PATCH] NAS-121620 / 23.10 / Add Terraria to `community` train (#1152) * Add terraria to community train * correct pod/container names * fix probes * add mail * add metadata * let update_strategy handle a single image for now --- library/ix-dev/community/terraria/Chart.lock | 6 + library/ix-dev/community/terraria/Chart.yaml | 26 ++ library/ix-dev/community/terraria/README.md | 17 + .../ix-dev/community/terraria/app-readme.md | 17 + .../terraria/charts/common-1.0.6.tgz | Bin 0 -> 54952 bytes .../terraria/ci/tshock-basic-values.yaml | 19 ++ .../terraria/ci/tshock-password-values.yaml | 19 ++ .../terraria/ci/vanilla-basic-values.yaml | 20 ++ library/ix-dev/community/terraria/item.yaml | 4 + .../ix-dev/community/terraria/metadata.yaml | 8 + .../ix-dev/community/terraria/questions.yaml | 316 ++++++++++++++++++ .../community/terraria/templates/NOTES.txt | 1 + .../terraria/templates/_configuarion.tpl | 78 +++++ .../terraria/templates/_terraria.tpl | 81 +++++ .../community/terraria/templates/common.yaml | 6 + .../community/terraria/upgrade_info.json | 1 + .../community/terraria/upgrade_strategy | 31 ++ library/ix-dev/community/terraria/values.yaml | 44 +++ 18 files changed, 694 insertions(+) create mode 100644 library/ix-dev/community/terraria/Chart.lock create mode 100644 library/ix-dev/community/terraria/Chart.yaml create mode 100644 library/ix-dev/community/terraria/README.md create mode 100644 library/ix-dev/community/terraria/app-readme.md create mode 100644 library/ix-dev/community/terraria/charts/common-1.0.6.tgz create mode 100644 library/ix-dev/community/terraria/ci/tshock-basic-values.yaml create mode 100644 library/ix-dev/community/terraria/ci/tshock-password-values.yaml create mode 100644 library/ix-dev/community/terraria/ci/vanilla-basic-values.yaml create mode 100644 library/ix-dev/community/terraria/item.yaml create mode 100644 library/ix-dev/community/terraria/metadata.yaml create mode 100644 library/ix-dev/community/terraria/questions.yaml create mode 100644 library/ix-dev/community/terraria/templates/NOTES.txt create mode 100644 library/ix-dev/community/terraria/templates/_configuarion.tpl create mode 100644 library/ix-dev/community/terraria/templates/_terraria.tpl create mode 100644 library/ix-dev/community/terraria/templates/common.yaml create mode 100644 library/ix-dev/community/terraria/upgrade_info.json create mode 100755 library/ix-dev/community/terraria/upgrade_strategy create mode 100644 library/ix-dev/community/terraria/values.yaml diff --git a/library/ix-dev/community/terraria/Chart.lock b/library/ix-dev/community/terraria/Chart.lock new file mode 100644 index 0000000000..1aecf89979 --- /dev/null +++ b/library/ix-dev/community/terraria/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: file://../../../common + version: 1.0.6 +digest: sha256:2f1f31c15fb7f92db141a66adbb8d23a8598727730050a3883a211763a4e5472 +generated: "2023-04-21T18:31:42.509470102+03:00" diff --git a/library/ix-dev/community/terraria/Chart.yaml b/library/ix-dev/community/terraria/Chart.yaml new file mode 100644 index 0000000000..7a5402e8ab --- /dev/null +++ b/library/ix-dev/community/terraria/Chart.yaml @@ -0,0 +1,26 @@ +name: terraria +description: Terraria is a land of adventure! A land of mystery! A land that's yours to shape, defend, and enjoy. +annotations: + title: Terraria +type: application +version: 1.0.0 +apiVersion: v2 +appVersion: '1.4.4.9' +kubeVersion: '>=1.16.0-0' +maintainers: + - name: truenas + url: https://www.truenas.com/ + email: dev@ixsystems.com +dependencies: + - name: common + repository: file://../../../common + version: 1.0.6 +home: https://terraria.org/ +icon: https://static.wikia.nocookie.net/terraria_gamepedia/images/a/a4/NewPromoLogo.png/revision/latest +sources: + - https://terraria.org/ + - https://github.com/truenas/charts/tree/master/community/terraria + - https://github.com/ryansheehan/terraria +keywords: + - game + - terraria diff --git a/library/ix-dev/community/terraria/README.md b/library/ix-dev/community/terraria/README.md new file mode 100644 index 0000000000..1d00d35b91 --- /dev/null +++ b/library/ix-dev/community/terraria/README.md @@ -0,0 +1,17 @@ +# Terraria + +[Terraria](https://terraria.org/) is a land of adventure! A land of mystery! A land that's yours to shape, defend, and enjoy. + +This applies only for the `TShock` image. +On the first run, you have to check the logs to get the server token. You will find something like this: + +```text +Login before join enabled. Users may be prompted for an account specific password instead of a server password on connect. +Login using UUID enabled. Users automatically login via UUID. +A malicious server can easily steal a user's UUID. You may consider turning this option off if you run a public server. +TShock Notice: setup-code.txt is still present, and the code located in that file will be used. +To setup the server, join the game and type /setup 424041 +This token will display until disabled by verification. (/setup) +``` + +Join the server and run `/setup ` diff --git a/library/ix-dev/community/terraria/app-readme.md b/library/ix-dev/community/terraria/app-readme.md new file mode 100644 index 0000000000..1d00d35b91 --- /dev/null +++ b/library/ix-dev/community/terraria/app-readme.md @@ -0,0 +1,17 @@ +# Terraria + +[Terraria](https://terraria.org/) is a land of adventure! A land of mystery! A land that's yours to shape, defend, and enjoy. + +This applies only for the `TShock` image. +On the first run, you have to check the logs to get the server token. You will find something like this: + +```text +Login before join enabled. Users may be prompted for an account specific password instead of a server password on connect. +Login using UUID enabled. Users automatically login via UUID. +A malicious server can easily steal a user's UUID. You may consider turning this option off if you run a public server. +TShock Notice: setup-code.txt is still present, and the code located in that file will be used. +To setup the server, join the game and type /setup 424041 +This token will display until disabled by verification. (/setup) +``` + +Join the server and run `/setup ` diff --git a/library/ix-dev/community/terraria/charts/common-1.0.6.tgz b/library/ix-dev/community/terraria/charts/common-1.0.6.tgz new file mode 100644 index 0000000000000000000000000000000000000000..65d08ebfab45ec0f4279e01f31a9d8531b97c7f8 GIT binary patch literal 54952 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 + TShock is a fork of the Terraria server that adds a number of features.
+ Vanilla is the original Terraria server.
+ Only applies to newly generated worlds. + schema: + type: string + default: image + required: true + immutable: true + enum: + - value: image + description: TShock + - value: vanillaImage + description: Vanilla + - variable: worldName + label: World Name + description: | + Sets the world's name.
+ Only applies to newly generated worlds. + schema: + type: string + default: My-World + required: true + immutable: true + - variable: worldSeed + label: World Seed + description: | + Sets the world's seed.
+ Only applies to newly generated worlds. + schema: + type: string + default: '' + immutable: true + - variable: worldEvil + label: World's Evil + description: | + Sets the world's evil state.
+ Only applies to newly generated worlds. + schema: + type: string + default: random + required: true + immutable: true + enum: + - value: random + description: Random + - value: corrupt + description: Corrupt + - value: crimson + description: Crimson + - variable: worldSize + label: World Size + description: | + Sets the world's size.
+ Only applies to newly generated worlds. + schema: + type: string + default: small + required: true + immutable: true + enum: + - value: small + description: Small (1) + - value: medium + description: Medium (2) + - value: large + description: Large (3) + - variable: worldDifficulty + label: World Difficulty + description: | + Sets the world's difficulty.
+ Only applies to newly generated worlds. + schema: + type: string + default: normal + required: true + immutable: true + enum: + - value: normal + description: Normal (0) + - value: expert + description: Expert (1) + - value: master + description: Master (2) + - value: journey + description: Journey (3) + - variable: maxPlayers + label: Maximum Players + description: Starts the server with the given player count as the maximum. + schema: + type: int + default: 8 + min: 1 + max: 255 + required: true + - variable: password + label: Server Password + description: Sets the server password. + schema: + type: string + private: true + default: '' + - variable: secure + label: Secure Server + description: Turns on the base game's "anti-spam" feature. + schema: + type: boolean + default: false + - variable: forceUpdate + label: Force Update + description: | + Forces the server to continue running, and not hibernating when no players are on.
+ This results in time passing, grass growing, and cpu running. + schema: + type: boolean + default: false + - variable: additionalEnvs + label: Additional Environment Variables + description: Configure additional environment variables for Terraria. + schema: + type: list + default: [] + items: + - variable: env + label: Environment Variable + schema: + type: dict + attrs: + - variable: name + label: Name + schema: + type: string + required: true + - variable: value + label: Value + schema: + type: string + required: true + - variable: additionalArgs + label: Additional Arguments + description: | + Configure additional arguments for Terraria.
+ Value is optional for flags like -heaptile
+ For example:
+ Key: -lang
+ Value: en-US + schema: + type: list + default: [] + items: + - variable: arg + label: Argument + schema: + type: dict + attrs: + - variable: key + label: Key + schema: + type: string + required: true + - variable: value + label: Value + schema: + type: string + + - variable: terrariaNetwork + label: "" + group: Network Configuration + schema: + type: dict + attrs: + - variable: serverPort + label: Server Port + description: The port for the Terraria Server. + schema: + type: int + default: 30000 + min: 9000 + max: 65535 + required: true + - variable: hostNetwork + label: Host Network + description: | + Bind to the host network. It's recommended to keep this disabled.
+ schema: + type: boolean + default: false + + - variable: terrariaStorage + label: "" + group: Storage Configuration + schema: + type: dict + attrs: + - variable: world + label: Terraria World Storage + description: The path to store Terraria World. + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + default: "ixVolume" + enum: + - value: "hostPath" + description: Host Path (Path that already exists on the system) + - value: "ixVolume" + description: ixVolume (Dataset created automatically by the system) + - variable: datasetName + label: Dataset Name + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + hidden: true + immutable: true + default: "world" + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + - variable: plugins + label: Terraria Plugins Storage + description: The path to store Terraria Plugins. + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + default: "ixVolume" + enum: + - value: "hostPath" + description: Host Path (Path that already exists on the system) + - value: "ixVolume" + description: ixVolume (Dataset created automatically by the system) + - variable: datasetName + label: Dataset Name + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + hidden: true + immutable: true + default: "plugins" + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + + - variable: resources + group: Resources Configuration + label: "" + schema: + type: dict + attrs: + - variable: limits + label: Limits + schema: + type: dict + attrs: + - variable: cpu + label: CPU + description: CPU limit for Terraria. + schema: + type: string + default: "4000m" + required: true + - variable: memory + label: Memory + description: Memory limit for Terraria. + schema: + type: string + default: "8Gi" + required: true diff --git a/library/ix-dev/community/terraria/templates/NOTES.txt b/library/ix-dev/community/terraria/templates/NOTES.txt new file mode 100644 index 0000000000..ba4e01146c --- /dev/null +++ b/library/ix-dev/community/terraria/templates/NOTES.txt @@ -0,0 +1 @@ +{{ include "ix.v1.common.lib.chart.notes" $ }} diff --git a/library/ix-dev/community/terraria/templates/_configuarion.tpl b/library/ix-dev/community/terraria/templates/_configuarion.tpl new file mode 100644 index 0000000000..2628478f31 --- /dev/null +++ b/library/ix-dev/community/terraria/templates/_configuarion.tpl @@ -0,0 +1,78 @@ +{{- define "terraria.configuration" -}} + {{ include "terraria.validation" $ }} + {{ $sizes := (dict "small" 1 "medium" 2 "large" 3) }} + {{ $difficutlies := (dict "normal" 0 "expert" 1 "master" 2 "journey" 3) }} + {{ $flags := (list "-port" "-world" "-maxplayers" "-password" "-secure" "-forceupdate" "-worldevil" "-difficulty" "-autocreate" "-seed") }} +{{/* worldevil, dificulty and autocreate flags are only used + when a world is generated. According to docs server will + ingore them if a world exists, so we can safely pass + them all the time and let server handle it. + Also -autocreate must come before other flags. +*/}} +- -autocreate +- {{ get $sizes .Values.terrariaConfig.worldSize | quote }} +- -worldevil +- {{ .Values.terrariaConfig.worldEvil | quote }} +- -difficulty +- {{ get $difficutlies .Values.terrariaConfig.worldDifficulty | quote }} +{{ with .Values.terrariaConfig.worldSeed }} +- -seed +- {{ . | quote }} +{{ end }} +- -port +- {{ .Values.terrariaNetwork.serverPort | quote }} +- -world +- {{ printf "/root/.local/share/Terraria/Worlds/%s.wld" .Values.terrariaConfig.worldName | quote }} +- -maxplayers +- {{ .Values.terrariaConfig.maxPlayers | quote }} +{{ with .Values.terrariaConfig.password }} +- -password +- {{ . | quote }} +{{ end }} +{{ if .Values.terrariaConfig.secure }} +- -secure +{{ end }} +{{ if .Values.terrariaConfig.forceUpdate }} +- -forceupdate +{{ end }} +{{ range $arg := .Values.terrariaConfig.additionalArgs }} + {{ if (mustHas $arg.key $flags) }} + {{ fail (printf "Terraria - Argument [%s] is already handled by the app, please use the corresponding field instead" $arg.key) }} + {{ end }} + - {{ $arg.key | quote }} + {{ with $arg.value }} + - {{ . | quote }} + {{ end }} +{{ end }} +{{- end -}} + +{{- define "terraria.validation" -}} + + {{- if not (mustRegexMatch "^[a-zA-Z0-9-]+$" .Values.terrariaConfig.worldName) -}} + {{- fail "Terraria - Expected World Name to only have [letters, numbers, dashes]" -}} + {{- end -}} + + {{- if not .Values.terrariaConfig.maxPlayers -}} + {{- fail "Terraria - Expected non-empty Max Players" -}} + {{- end -}} + + {{- if gt (int .Values.terrariaConfig.maxPlayers) 255 -}} + {{- fail "Terraria - Expected Max Players to be at most 255" -}} + {{- end -}} + + {{- $evils := (list "crimson" "corrupt" "random") -}} + {{- if not (mustHas .Values.terrariaConfig.worldEvil $evils) -}} + {{- fail (printf "Terraria - Expected World Evil to be one of [%s], but got [%s]" (join ", " $evils) .Values.terrariaConfig.worldEvil) -}} + {{- end -}} + + {{- $sizes := (list "small" "medium" "large") -}} + {{- if not (mustHas .Values.terrariaConfig.worldSize $sizes) -}} + {{- fail (printf "Terraria - Expected World Size to be one of [%s], but got [%s]" (join ", " $sizes) .Values.terrariaConfig.worldSize) -}} + {{- end -}} + + {{- $difficutlies := (list "normal" "expert" "master" "journey") -}} + {{- if not (mustHas .Values.terrariaConfig.worldDifficulty $difficutlies) -}} + {{- fail (printf "Terraria - Expected World Difficulty to be one of [%s], but got [%s]" (join ", " $difficutlies) .Values.terrariaConfig.worldDifficulty) -}} + {{- end -}} + +{{- end -}} diff --git a/library/ix-dev/community/terraria/templates/_terraria.tpl b/library/ix-dev/community/terraria/templates/_terraria.tpl new file mode 100644 index 0000000000..2cf89364a6 --- /dev/null +++ b/library/ix-dev/community/terraria/templates/_terraria.tpl @@ -0,0 +1,81 @@ +{{- define "terraria.workload" -}} +workload: + terraria: + enabled: true + primary: true + type: Deployment + podSpec: + hostNetwork: {{ .Values.terrariaNetwork.hostNetwork }} + containers: + terraria: + enabled: true + primary: true + imageSelector: {{ .Values.terrariaConfig.imageSelector }} + tty: true + stdin: true + args: + {{- include "terraria.configuration" $ | nindent 12 }} + securityContext: + runAsUser: 0 + runAsGroup: 0 + runAsNonRoot: false + readOnlyRootFilesystem: false + envList: + {{ with .Values.terrariaConfig.additionalEnvs }} + {{ range $env := . }} + - name: {{ $env.name }} + value: {{ $env.value }} + {{ end }} + {{ end }} + probes: + # Probes are disabled because it fills the logs with + # "login attemps" + liveness: + enabled: {{ .Values.ci }} + type: tcp + port: "{{ .Values.terrariaNetwork.serverPort }}" + readiness: + enabled: {{ .Values.ci }} + type: tcp + port: "{{ .Values.terrariaNetwork.serverPort }}" + startup: + enabled: {{ .Values.ci }} + type: tcp + port: "{{ .Values.terrariaNetwork.serverPort }}" + +{{/* Service */}} +service: + terraria: + enabled: true + primary: true + type: NodePort + targetSelector: terraria + ports: + server: + enabled: true + primary: true + port: {{ .Values.terrariaNetwork.serverPort }} + nodePort: {{ .Values.terrariaNetwork.serverPort }} + targetSelector: terraria + +{{/* Persistence */}} +persistence: + world: + enabled: true + type: {{ .Values.terrariaStorage.world.type }} + datasetName: {{ .Values.terrariaStorage.world.datasetName | default "" }} + hostPath: {{ .Values.terrariaStorage.world.hostPath | default "" }} + targetSelector: + terraria: + terraria: + mountPath: /root/.local/share/Terraria/Worlds + plugins: + enabled: true + type: {{ .Values.terrariaStorage.plugins.type }} + datasetName: {{ .Values.terrariaStorage.plugins.datasetName | default "" }} + hostPath: {{ .Values.terrariaStorage.plugins.hostPath | default "" }} + targetSelector: + terraria: + terraria: + mountPath: /plugins +{{- end -}} diff --git a/library/ix-dev/community/terraria/templates/common.yaml b/library/ix-dev/community/terraria/templates/common.yaml new file mode 100644 index 0000000000..6818d33e27 --- /dev/null +++ b/library/ix-dev/community/terraria/templates/common.yaml @@ -0,0 +1,6 @@ +{{- include "ix.v1.common.loader.init" . -}} + +{{/* Merge the templates with Values */}} +{{- $_ := mustMergeOverwrite .Values (include "terraria.workload" $ | fromYaml) -}} + +{{- include "ix.v1.common.loader.apply" . -}} diff --git a/library/ix-dev/community/terraria/upgrade_info.json b/library/ix-dev/community/terraria/upgrade_info.json new file mode 100644 index 0000000000..767388094a --- /dev/null +++ b/library/ix-dev/community/terraria/upgrade_info.json @@ -0,0 +1 @@ +{"filename": "values.yaml", "keys": ["image"]} diff --git a/library/ix-dev/community/terraria/upgrade_strategy b/library/ix-dev/community/terraria/upgrade_strategy new file mode 100755 index 0000000000..4a1eb2ef48 --- /dev/null +++ b/library/ix-dev/community/terraria/upgrade_strategy @@ -0,0 +1,31 @@ +#!/usr/bin/python3 +import json +import re +import sys + +from catalog_update.upgrade_strategy import semantic_versioning + + +RE_STABLE_VERSION = re.compile(r'tshock-[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+-[0-9]+\.[0-9]+\.[0-9]+(-[0-9]+)?') + + +def newer_mapping(image_tags): + key = list(image_tags.keys())[0] + tags = {t: t for t in image_tags[key] if RE_STABLE_VERSION.fullmatch(t)} + version = semantic_versioning(list(tags)) + if not version: + return {} + + return { + 'tags': {key: tags[version]}, + 'app_version': version, + } + + +if __name__ == '__main__': + try: + versions_json = json.loads(sys.stdin.read()) + except ValueError: + raise ValueError('Invalid json specified') + + print(json.dumps(newer_mapping(versions_json))) diff --git a/library/ix-dev/community/terraria/values.yaml b/library/ix-dev/community/terraria/values.yaml new file mode 100644 index 0000000000..353e8701fa --- /dev/null +++ b/library/ix-dev/community/terraria/values.yaml @@ -0,0 +1,44 @@ +image: + repository: ryshe/terraria + pullPolicy: IfNotPresent + tag: tshock-1.4.4.9-1.5.3-2 + +vanillaImage: + repository: ryshe/terraria + pullPolicy: IfNotPresent + tag: vanilla-1.4.4.9 + +ci: false + +resources: + limits: + cpu: 4000m + memory: 8Gi + +terrariaConfig: + imageSelector: image + worldSeed: '' + worldName: world + worldEvil: random + worldSize: small + worldDifficulty: normal + maxPlayers: 8 + password: '' + secure: false + forceUpdate: false + additionalEnvs: [] + additionalArgs: [] + +terrariaNetwork: + serverPort: 30000 + hostNetwork: false + +terrariaStorage: + world: + type: ixVolume + hostPath: '' + datasetName: world + plugins: + type: ixVolume + hostPath: '' + datasetName: plugins