From 249d048d34853a1e4f0ae904ecb52165fc3395fe Mon Sep 17 00:00:00 2001 From: technofab Date: Wed, 24 Apr 2024 16:45:10 +0200 Subject: [PATCH] bak --- .envrc | 8 + .gitignore | 7 + README.md | 2 + Taskfile.yaml | 28 +++ flake.lock | 369 ++++++++++++++++++++++++++++++++++++ flake.nix | 74 ++++++++ image.nix | 27 +++ jsonnetfile.json | 33 ++++ jsonnetfile.lock.json | 46 +++++ nix-docker/main.jsonnet | 111 +++++++++++ nix-kubernetes/main.jsonnet | 39 ++++ 11 files changed, 744 insertions(+) create mode 100644 .envrc create mode 100644 .gitignore create mode 100644 README.md create mode 100644 Taskfile.yaml create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 image.nix create mode 100644 jsonnetfile.json create mode 100644 jsonnetfile.lock.json create mode 100644 nix-docker/main.jsonnet create mode 100644 nix-kubernetes/main.jsonnet diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..6403885 --- /dev/null +++ b/.envrc @@ -0,0 +1,8 @@ +if ! has nix_direnv_version || ! nix_direnv_version 2.2.1; then + source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/2.2.1/direnvrc" "sha256-zelF0vLbEl5uaqrfIzbgNzJWGmLzCmYAkInj/LNxvKs=" +fi + +if ! use flake . --impure +then + echo "devenv could not be build. The devenv environment was not loaded. Make the necessary changes to devenv.nix and hit enter to try again." >&2 +fi diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b745339 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.idea/ +.devenv/ +.direnv/ +.task/ +vendor/ +*.tf* +result diff --git a/README.md b/README.md new file mode 100644 index 0000000..950a83c --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# Coder Templates + diff --git a/Taskfile.yaml b/Taskfile.yaml new file mode 100644 index 0000000..f964fb9 --- /dev/null +++ b/Taskfile.yaml @@ -0,0 +1,28 @@ +version: 3 +output: prefixed +tasks: + deps: + sources: + - jsonnetfile*.json + generates: + - vendor/**/* + cmds: + - jb install + build: + desc: "Builds the specified template" + summary: | + Example: task build TEMPLATE=nix-docker + deps: [ deps ] + sources: + - "{{ .TEMPLATE }}/*" + generates: + - "{{ .TEMPLATE }}/out.tf.json" + cmds: + - inka export ./{{ .TEMPLATE }} --out ./{{ .TEMPLATE }}/out.tf.json + upload-to-coder: + desc: "Uploads the specified template to coder" + deps: [ build ] + dir: "{{ .TEMPLATE }}" + interactive: true + cmds: + - coder templates push "{{ .TEMPLATE }}" diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..be1fd83 --- /dev/null +++ b/flake.lock @@ -0,0 +1,369 @@ +{ + "nodes": { + "devenv": { + "inputs": { + "flake-compat": "flake-compat", + "nix": "nix", + "nixpkgs": "nixpkgs", + "pre-commit-hooks": "pre-commit-hooks" + }, + "locked": { + "lastModified": 1685013540, + "narHash": "sha256-UM9tPy9fyfXs+knxwk/rCIaNfVC7ggwzbLcY8lkOr+E=", + "owner": "cachix", + "repo": "devenv", + "rev": "5ff14a8f2828a2e607a65e2b16650a8cf950515b", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "devenv", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1673956053, + "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1685662779, + "narHash": "sha256-cKDDciXGpMEjP1n6HlzKinN0H+oLmNpgeCTzYnsA2po=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "71fb97f0d875fd4de4994dfb849f2c75e17eb6c3", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "devenv", + "pre-commit-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1660459072, + "narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "a20de23b925fd8264fd7fad6454652e142fd7f73", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, + "inka": { + "inputs": { + "nixpkgs": "nixpkgs_2", + "systems": "systems" + }, + "locked": { + "lastModified": 1684511970, + "narHash": "sha256-GXE0NrL450vim5nUBlDMbLtEgn4BIo0qGKp9ubB7Lfc=", + "owner": "TECHNOFAB", + "repo": "inka", + "rev": "0af6d3c3e6272d25eec6dad259093a08521f624e", + "type": "gitlab" + }, + "original": { + "owner": "TECHNOFAB", + "repo": "inka", + "type": "gitlab" + } + }, + "jb": { + "inputs": { + "nixpkgs": "nixpkgs_3", + "systems": "systems_2" + }, + "locked": { + "lastModified": 1684946375, + "narHash": "sha256-25U32EUrtHrllbANw2pisrvOd53ZSIXkp1eZAoPI0+M=", + "owner": "TECHNOFAB11", + "repo": "jsonnet-bundler", + "rev": "8ffad5a3ea322f4bb4c95c51b3cd99051a0f802e", + "type": "github" + }, + "original": { + "owner": "TECHNOFAB11", + "repo": "jsonnet-bundler", + "type": "github" + } + }, + "lowdown-src": { + "flake": false, + "locked": { + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "type": "github" + }, + "original": { + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "nix": { + "inputs": { + "lowdown-src": "lowdown-src", + "nixpkgs": [ + "devenv", + "nixpkgs" + ], + "nixpkgs-regression": "nixpkgs-regression" + }, + "locked": { + "lastModified": 1676545802, + "narHash": "sha256-EK4rZ+Hd5hsvXnzSzk2ikhStJnD63odF7SzsQ8CuSPU=", + "owner": "domenkozar", + "repo": "nix", + "rev": "7c91803598ffbcfe4a55c44ac6d49b2cf07a527f", + "type": "github" + }, + "original": { + "owner": "domenkozar", + "ref": "relaxed-flakes", + "repo": "nix", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1678875422, + "narHash": "sha256-T3o6NcQPwXjxJMn2shz86Chch4ljXgZn746c2caGxd8=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "126f49a01de5b7e35a43fd43f891ecf6d3a51459", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-regression": { + "locked": { + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + } + }, + "nixpkgs-stable": { + "locked": { + "lastModified": 1678872516, + "narHash": "sha256-/E1YwtMtFAu2KUQKV/1+KFuReYPANM2Rzehk84VxVoc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "9b8e5abb18324c7fe9f07cb100c3cd4a29cda8b8", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1684398685, + "narHash": "sha256-TRE62m91iZ5ArVMgA+uj22Yda8JoQuuhc9uwZ+NoX+0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "628d4bb6e9f4f0c30cfd9b23d3c1cdcec9d3cb5c", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixos-22.11", + "type": "indirect" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1684661732, + "narHash": "sha256-2/Xo/UmUUoMXc0T5tzoUsYjMLLMjEfzRWDAQB0WwtW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "b0671cbf1e5c443f7fbfd4941ee0f8a151435114", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixos-22.11", + "type": "indirect" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1688392541, + "narHash": "sha256-lHrKvEkCPTUO+7tPfjIcb7Trk6k31rz18vkyqmkeJfY=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ea4c80b39be4c09702b0cb3b42eab59e2ba4f24b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "pre-commit-hooks": { + "inputs": { + "flake-compat": [ + "devenv", + "flake-compat" + ], + "flake-utils": "flake-utils", + "gitignore": "gitignore", + "nixpkgs": [ + "devenv", + "nixpkgs" + ], + "nixpkgs-stable": "nixpkgs-stable" + }, + "locked": { + "lastModified": 1682596858, + "narHash": "sha256-Hf9XVpqaGqe/4oDGr30W8HlsWvJXtMsEPHDqHZA6dDg=", + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "rev": "fb58866e20af98779017134319b5663b8215d912", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "type": "github" + } + }, + "root": { + "inputs": { + "devenv": "devenv", + "flake-parts": "flake-parts", + "inka": "inka", + "jb": "jb", + "nixpkgs": "nixpkgs_4", + "systems": "systems_3" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "id": "systems", + "type": "indirect" + } + }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "id": "systems", + "type": "indirect" + } + }, + "systems_3": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..46c73a5 --- /dev/null +++ b/flake.nix @@ -0,0 +1,74 @@ +{ + description = "Coder Templates"; + + outputs = { + self, + flake-parts, + systems, + jb, + inka, + ... + } @ inputs: + flake-parts.lib.mkFlake {inherit inputs;} { + imports = [ + inputs.devenv.flakeModule + ]; + systems = import systems; + flake = { + }; + perSystem = { + config, + self', + inputs', + pkgs, + system, + ... + }: { + formatter = pkgs.alejandra; + devenv.shells.default = { + packages = [ + pkgs.go-jsonnet + pkgs.go-task + + #(pkgs.coder.override rec { + # buildGoModule = args: pkgs.buildGoModule ( args // rec { + # version = "2.8.2"; + # src = pkgs.fetchFromGitHub { + # owner = "coder"; + # repo = "coder"; + # rev = "v${version}"; + # hash = "sha256-H90pwemW1yMcY65RvERtqJplBPyOSzkD3ip/DGoZ5eQ="; + # }; + # vendorHash = "sha256-oLhQsdIitePPYAuO4m+RKA/zNcFoMZnzsFBTKlt69pk="; + # }); + #}) + + inka.defaultPackage.${system} + # use my fork of jb to support fetching packages via http + jb.defaultPackage.${system} + ]; + }; + + packages = { + nix-coder-image = pkgs.callPackage ./image.nix { + processes = { + test = '' + ${pkgs.hello}/bin/hello + ''; + }; + }; + }; + }; + }; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-22.11"; + + flake-parts.url = "github:hercules-ci/flake-parts"; + systems.url = "github:nix-systems/default"; + devenv.url = "github:cachix/devenv"; + + inka.url = "gitlab:TECHNOFAB/inka"; + jb.url = "github:TECHNOFAB11/jsonnet-bundler"; + }; +} diff --git a/image.nix b/image.nix new file mode 100644 index 0000000..fd8c4ee --- /dev/null +++ b/image.nix @@ -0,0 +1,27 @@ +{ + lib, + pkgs, + processes ? {}, + ... +}: let + # https://github.com/cachix/devenv/blob/5a30b9e5ac7c6167e61b1f4193d5130bb9f8defa/src/modules/processes.nix#L121 + procfile = pkgs.writeText "procfile" (lib.concatStringsSep "\n" (lib.mapAttrsToList (name: process: "${name}: exec ${pkgs.writeShellScript name process}") processes)); + overmind-sys = pkgs.writeShellScriptBin "overmind-sys" '' + OVERMIND_SOCKET=/run/overmind-sys.sock \ + OVERMIND_ANY_CAN_DIE=1 \ + OVERMIND_PROCFILE=${procfile} \ + ${pkgs.overmind}/bin/overmind "$@" + ''; +in + pkgs.dockerTools.buildImage { + name = "nix-coder"; + tag = "latest"; + + copyToRoot = pkgs.buildEnv { + name = "image-root"; + paths = [pkgs.bashInteractive overmind-sys]; + pathsToLink = ["/bin"]; + }; + + config.Cmd = ["/bin/bash"]; + } diff --git a/jsonnetfile.json b/jsonnetfile.json new file mode 100644 index 0000000..906a2b8 --- /dev/null +++ b/jsonnetfile.json @@ -0,0 +1,33 @@ +{ + "version": 1, + "dependencies": [ + { + "source": { + "git": { + "remote": "ssh://git@gitlab.com/technofab/inka.git", + "subdir": "" + } + }, + "version": "main" + }, + { + "source": { + "http": { + "url": "https://gitlab.com/api/v4/projects/44043879/packages/generic/coder-coder/${VERSION}/package.tar.gz", + "target": "coder" + } + }, + "version": "0.17.0" + }, + { + "source": { + "http": { + "url": "https://gitlab.com/api/v4/projects/44043879/packages/generic/kreuzwerker-docker/${VERSION}/package.tar.gz", + "target": "docker" + } + }, + "version": "3.0.2" + } + ], + "legacyImports": true +} diff --git a/jsonnetfile.lock.json b/jsonnetfile.lock.json new file mode 100644 index 0000000..d4d4554 --- /dev/null +++ b/jsonnetfile.lock.json @@ -0,0 +1,46 @@ +{ + "version": 1, + "dependencies": [ + { + "source": { + "http": { + "url": "https://gitlab.com/api/v4/projects/44043879/packages/generic/coder-coder/${VERSION}/package.tar.gz", + "target": "coder" + } + }, + "version": "0.17.0", + "sum": "Nd1oWkTfpjSaIUOAw5cuOUpxNCt90/TJfzE6RzQGK+0=" + }, + { + "source": { + "http": { + "url": "https://gitlab.com/api/v4/projects/44043879/packages/generic/kreuzwerker-docker/${VERSION}/package.tar.gz", + "target": "docker" + } + }, + "version": "3.0.2", + "sum": "WKmK7j5cCM2DPNjeRR8bGaF94J5PXst43BTD2Avc0Jw=" + }, + { + "source": { + "git": { + "remote": "https://github.com/jsonnet-libs/docsonnet.git", + "subdir": "" + } + }, + "version": "6ac6c69685b8c29c54515448eaca583da2d88150", + "sum": "/6J/FSZMka3pQ5hyibN40602ofJbdZiwG+CfQ9tJEK4=" + }, + { + "source": { + "git": { + "remote": "ssh://git@gitlab.com/technofab/inka.git", + "subdir": "" + } + }, + "version": "0af6d3c3e6272d25eec6dad259093a08521f624e", + "sum": "oKeBMjfOqWhSqT7XXBZvVDOEavThjG/P5UY7pVnZkEo=" + } + ], + "legacyImports": false +} diff --git a/nix-docker/main.jsonnet b/nix-docker/main.jsonnet new file mode 100644 index 0000000..b6442e6 --- /dev/null +++ b/nix-docker/main.jsonnet @@ -0,0 +1,111 @@ +local inka = import 'inka/main.libsonnet'; +local docker = import 'docker/main.libsonnet'; +local coder = import 'coder/main.libsonnet'; + +{ + requirements: { + docker: docker.provider.require(), + coder: coder.provider.require(), + }, + providers: { + docker: docker.provider.new(), + coder: coder.provider.new(), + }, + parameters: { + cpu: coder.data.parameter.new( + 'cpu', name='CPU [cores]', default=2048, mutable=true, icon='/icon/memory.svg', + option=[ + coder.data.parameter.option.new('1 Core', value=1024), + coder.data.parameter.option.new('2 Cores', value=2048), + coder.data.parameter.option.new('4 Cores', value=4096), + ], + ), + memory: coder.data.parameter.new( + 'memory', name='Memory [GB]', default=1024, mutable=true, icon='/icon/memory.svg', + option=[ + coder.data.parameter.option.new('1GB', value=1024), + coder.data.parameter.option.new('2GB', value=2048), + coder.data.parameter.option.new('4GB', value=4096), + ], + ), + git_repo: coder.data.parameter.new( + 'git_repo', name='Git Repository', default='', type='string', mutable=true, + ), + #home_disk_size: coder.data.parameter.new( + # 'home_disk_size', name='Home disk size [GB]', default=10, type='number', + # mutable=false, icon='/emojis/1f4be.png', + # validation=[ + # coder.data.parameter.validation.new(min=1, max=100), + # ], + #), + }, + coder: { + auth: coder.data.git_auth.new('git_auth', { id: 'primary-gitlab', }), + provisioner: coder.data.provisioner.new('me'), + workspace: coder.data.workspace.new('me'), + agent: coder.agent.new( + 'main', arch=self.provisioner.arch, os='linux', login_before_ready=false, + startup_script_timeout=180, + startup_script=||| + # install direnv & code-server + nix-env -iA nixpkgs.direnv nixpkgs.code-server + code-server --auth none --port 13337 >/tmp/code-server.log 2>&1 & + |||, + ), + code_server: coder.app.new( + 'code-server', agent_id=self.agent.id, slug='code-server', + display_name='Code Server', icon='/icon/code.svg', share='owner', + url='http://localhost:13337/?folder=/home/%s' % self.workspace.owner, + subdomain=false, healthcheck=[ + coder.app.healthcheck.new(url='http://localhost:13337/healthz', interval=5, threshold=6), + ], + ), + }, + docker: { + volume: docker.volume.new( + 'home', name='coder-%s-home' % $.coder.workspace.id, + # not always supported + #driver_opts={ size: '%sG' % $.parameters.home_disk_size.value }, + labels=[ + docker.volume.labels.new('coder.owner', $.coder.workspace.owner), + docker.volume.labels.new('coder.owner_id', $.coder.workspace.owner_id), + docker.volume.labels.new('coder.workspace_id', $.coder.workspace.id), + docker.volume.labels.new('coder.workspace_name_at_creation', $.coder.workspace.name), + ], + _extra={ + lifecycle: [{ ignore_changes: 'all' }], + } + ), + container: docker.container.new( + 'workspace', name='coder-%s-workspace' % $.coder.workspace.id, cpu_shares=$.parameters.cpu.value, + memory=$.parameters.memory.value, image='nixos/nix:latest', hostname=$.coder.workspace.name, + entrypoint=[ + 'sh', + '-c', + inka.functions.replace( + $.coder.agent.init_script, + '"/localhost|127.0.0.1/"', + '"host.docker.internal"', + ), + ], + #runtime='sysbox-runc', storage_opts={ size: '10G' }, + env=[ + 'CODER_AGENT_TOKEN=%s' % $.coder.agent.token, + ], + host=[ + docker.container.host.new('host.docker.internal', 'host-gateway') + ], + volumes=[ + docker.container.volumes.new( + container_path='/home/%s' % $.coder.workspace.owner, volume_name=self.volume.name, read_only=false, + ), + ], + labels=[ + docker.container.labels.new('coder.owner', $.coder.workspace.owner), + docker.container.labels.new('coder.owner_id', $.coder.workspace.owner_id), + docker.container.labels.new('coder.workspace_id', $.coder.workspace.id), + docker.container.labels.new('coder.workspace_name_at_creation', $.coder.workspace.name), + ], + ), + }, +} diff --git a/nix-kubernetes/main.jsonnet b/nix-kubernetes/main.jsonnet new file mode 100644 index 0000000..ebc5ca5 --- /dev/null +++ b/nix-kubernetes/main.jsonnet @@ -0,0 +1,39 @@ +local inka = import 'inka/main.libsonnet'; +local coder = import 'coder/main.libsonnet'; + +{ + requirements: { + coder: coder.provider.require(), + }, + providers: { + coder: coder.provider.new(true), + }, + parameters: { + cpu: coder.data.parameter.new( + 'cpu', name='CPU [cores]', default='2', mutable=true, icon='/icon/memory.svg', + option=[ + coder.data.parameter.option.new('1 Core', value='1'), + coder.data.parameter.option.new('2 Cores', value='2'), + coder.data.parameter.option.new('4 Cores', value='4'), + ], + ), + memory: coder.data.parameter.new( + 'memory', name='Memory [GB]', default='1', mutable=true, icon='/icon/memory.svg', + option=[ + coder.data.parameter.option.new('1GB', value='1'), + coder.data.parameter.option.new('2GB', value='2'), + coder.data.parameter.option.new('4GB', value='4'), + ], + ), + git_repo: coder.data.parameter.new( + 'git_repo', name='Git Repository', default='', type='string', mutable=true, + ), + home_disk_size: coder.data.parameter.new( + 'home_disk_size', name='Home disk size [GB]', default='10', type='number', + mutable=false, icon='/emojis/1f4be.png', + validation=[ + coder.data.parameter.validation.new(min=1, max=100), + ], + ), + } +}