Skip to content

Commit 689c718

Browse files
committed
Initial commit of some concept builder stuff
1 parent 6149905 commit 689c718

File tree

4 files changed

+260
-0
lines changed

4 files changed

+260
-0
lines changed

examples/builder/builder.go

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package builder
2+
3+
import (
4+
"archive/tar"
5+
"bytes"
6+
"embed"
7+
_ "embed"
8+
"golang.org/x/xerrors"
9+
"html/template"
10+
"strings"
11+
"time"
12+
)
13+
14+
//go:embed templates/*.tmpl
15+
var templates embed.FS
16+
17+
func buildTemplate(input ContainerInput) (file, error) {
18+
tpl, err := template.ParseFS(templates, "templates/*.tmpl")
19+
if err != nil {
20+
return file{}, xerrors.Errorf("parse template: %w", err)
21+
}
22+
23+
tpl = tpl.Funcs(template.FuncMap{
24+
"join": strings.Join,
25+
})
26+
27+
var buf bytes.Buffer
28+
// TODO: Change the name based on the input
29+
err = tpl.ExecuteTemplate(&buf, "docker", input)
30+
if err != nil {
31+
return file{}, xerrors.Errorf("execute template: %w", err)
32+
}
33+
34+
return file{
35+
name: "main.tf",
36+
content: buf.Bytes(),
37+
}, nil
38+
}
39+
40+
type file struct {
41+
name string
42+
content []byte
43+
}
44+
45+
func writeFiles(w *tar.Writer, files ...file) error {
46+
for _, f := range files {
47+
err := w.WriteHeader(&tar.Header{
48+
Typeflag: 0,
49+
Name: f.name,
50+
Size: int64(len(f.content)),
51+
Mode: 0644,
52+
ModTime: time.Now(),
53+
})
54+
55+
if err != nil {
56+
return err
57+
}
58+
}
59+
60+
return nil
61+
}
62+
63+
func BuildReadme() {
64+
65+
}
66+
67+
func dockerTemplate() (*template.Template, error) {
68+
return template.ParseFS(templates, "templates/docker.tpl")
69+
}
70+
71+
type ContainerInput struct {
72+
DockerImage string `json:"docker-image"`
73+
}
74+
75+
type KubernetesInput struct {
76+
ContainerInput
77+
}
78+
79+
func BuildDocker(input interface{}) {
80+
81+
}
82+
83+
func build(input interface{}) (string, error) {
84+
tpl, err := dockerTemplate()
85+
if err != nil {
86+
return "", err
87+
}
88+
89+
var buf bytes.Buffer
90+
err = tpl.Execute(&buf, input)
91+
if err != nil {
92+
return "", err
93+
}
94+
95+
return buf.String(), nil
96+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package builder
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/stretchr/testify/require"
8+
)
9+
10+
func TestBuilder(t *testing.T) {
11+
out, err := buildTemplate(ContainerInput{})
12+
require.NoError(t, err)
13+
fmt.Println(out)
14+
}
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
{{ define "docker" }}
2+
terraform {
3+
required_providers {
4+
coder = {
5+
source = "coder/coder"
6+
version = "0.6.12"
7+
}
8+
docker = {
9+
source = "kreuzwerker/docker"
10+
version = "~> 3.0.1"
11+
}
12+
}
13+
}
14+
15+
16+
provider "docker" {
17+
}
18+
19+
provider "coder" {
20+
}
21+
22+
data "coder_workspace" "me" {
23+
}
24+
25+
data "coder_provisioner" "me" {
26+
}
27+
28+
resource "coder_agent" "main" {
29+
arch = data.coder_provisioner.me.arch
30+
os = "linux"
31+
32+
login_before_ready = false
33+
startup_script_timeout = 180
34+
startup_script = <<-EOT
35+
set -e
36+
code-server --auth none >/tmp/code-server.log 2>&1 &
37+
EOT
38+
39+
# These environment variables allow you to make Git commits right away after creating a
40+
# workspace. Note that they take precedence over configuration defined in ~/.gitconfig!
41+
# You can remove this block if you'd prefer to configure Git manually or using
42+
# dotfiles. (see docs/dotfiles.md)
43+
env = {
44+
GIT_AUTHOR_NAME = "${data.coder_workspace.me.owner}"
45+
GIT_COMMITTER_NAME = "${data.coder_workspace.me.owner}"
46+
GIT_AUTHOR_EMAIL = "${data.coder_workspace.me.owner_email}"
47+
GIT_COMMITTER_EMAIL = "${data.coder_workspace.me.owner_email}"
48+
}
49+
}
50+
51+
{{ if .Data.CodeServer.Enabled }}
52+
resource "coder_app" "code-server" {
53+
agent_id = coder_agent.main.id
54+
slug = "code-server"
55+
display_name = "code-server"
56+
url = "http://localhost:8080/?folder=/home/coder"
57+
icon = "/icon/code.svg"
58+
subdomain = false
59+
share = "owner"
60+
61+
healthcheck {
62+
url = "http://localhost:8080/healthz"
63+
interval = 3
64+
threshold = 10
65+
}
66+
}
67+
{{ end }}
68+
69+
resource "docker_volume" "home_volume" {
70+
name = "coder-${data.coder_workspace.me.id}-home"
71+
# Protect the volume from being deleted due to changes in attributes.
72+
lifecycle {
73+
ignore_changes = all
74+
}
75+
# Add labels in Docker to keep track of orphan resources.
76+
labels {
77+
label = "coder.owner"
78+
value = data.coder_workspace.me.owner
79+
}
80+
labels {
81+
label = "coder.owner_id"
82+
value = data.coder_workspace.me.owner_id
83+
}
84+
labels {
85+
label = "coder.workspace_id"
86+
value = data.coder_workspace.me.id
87+
}
88+
# This field becomes outdated if the workspace is renamed but can
89+
# be useful for debugging or cleaning out dangling volumes.
90+
labels {
91+
label = "coder.workspace_name_at_creation"
92+
value = data.coder_workspace.me.name
93+
}
94+
}
95+
96+
resource "docker_container" "workspace" {
97+
count = data.coder_workspace.me.start_count
98+
image = "{{ .Data.ImageURL }}"
99+
# Uses lower() to avoid Docker restriction on container names.
100+
name = "coder-${data.coder_workspace.me.owner}-${lower(data.coder_workspace.me.name)}"
101+
# Hostname makes the shell more user friendly: coder@my-workspace:~$
102+
hostname = data.coder_workspace.me.name
103+
# Use the docker gateway if the access URL is 127.0.0.1
104+
entrypoint = ["sh", "-c", replace(coder_agent.main.init_script, "/localhost|127\\.0\\.0\\.1/", "host.docker.internal")]
105+
env = ["CODER_AGENT_TOKEN=${coder_agent.main.token}"]
106+
host {
107+
host = "host.docker.internal"
108+
ip = "host-gateway"
109+
}
110+
volumes {
111+
contoainer_path = "/home/coder/"
112+
volume_name = docker_volume.home_volume.name
113+
read_only = false
114+
}
115+
# Add labels in Docker to keep track of orphan resources.
116+
labels {
117+
label = "coder.owner"
118+
value = data.coder_workspace.me.owner
119+
}
120+
labels {
121+
label = "coder.owner_id"
122+
value = data.coder_workspace.me.owner_id
123+
}
124+
labels {
125+
label = "coder.workspace_id"
126+
value = data.coder_workspace.me.id
127+
}
128+
labels {
129+
label = "coder.workspace_name"
130+
value = data.coder_workspace.me.name
131+
}
132+
}
133+
134+
135+
{{ end }}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{{- define "readme" -}}
2+
---
3+
name: {{ .Data.Readme.Name }}
4+
description: {{ .Data.Readme.Desc }}
5+
tags: [{{ join .Data.Readme.Tags "," }}]
6+
icon: /icon/docker.png
7+
---
8+
9+
# {{ .Template.Platform }} Template
10+
11+
// TODO: Put in a url to get back to the wizard with pre-filled values
12+
13+
14+
15+
{{ end }}

0 commit comments

Comments
 (0)