Skip to content

Commit 06a7207

Browse files
authored
Merge branch 'main' into dependabot/npm_and_yarn/site/eslint-plugin-jest-26.6.0
2 parents e589775 + 3f2cbc9 commit 06a7207

File tree

44 files changed

+779
-273
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+779
-273
lines changed

.editorconfig

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ trim_trailing_whitespace = true
77
insert_final_newline = true
88
indent_style = tab
99

10-
[*.{md,json,yaml,tf,tfvars}]
10+
[*.{md,json,yaml,yml,tf,tfvars}]
1111
indent_style = space
1212
indent_size = 2
1313

.github/codecov.yml

+4
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,7 @@ ignore:
3434
- scripts
3535
- site/.storybook
3636
- rules.go
37+
# Packages used for writing tests.
38+
- cli/clitest
39+
- coderd/coderdtest
40+
- pty/ptytest

.github/workflows/coder.yaml

+4-3
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,8 @@ jobs:
8585
env:
8686
GITHUB_CONTEXT: ${{ toJSON(github) }}
8787
run: |
88-
go run github.com/coder/coder/.github/workflows/prcontext
88+
(cd .github/workflows/prcontext && go build)
89+
./.github/workflows/prcontext/prcontext
8990
9091
style-lint-golangci:
9192
name: style/lint/golangci
@@ -148,7 +149,7 @@ jobs:
148149

149150
gen:
150151
name: "style/gen"
151-
timeout-minutes: 5
152+
timeout-minutes: 8
152153
runs-on: ubuntu-latest
153154
needs: changes
154155
if: needs.changes.outputs.docs-only == 'false'
@@ -297,7 +298,7 @@ jobs:
297298
# systems.
298299
if [ "${{ matrix.os }}" == "ubuntu-latest" ]; then
299300
echo ::set-output name=cover::true
300-
export COVERAGE_FLAGS='-covermode=atomic -coverprofile="gotests.coverage" -coverpkg=./...,github.com/coder/coder/codersdk'
301+
export COVERAGE_FLAGS='-covermode=atomic -coverprofile="gotests.coverage" -coverpkg=./...'
301302
else
302303
echo ::set-output name=cover::false
303304
fi

.github/workflows/prcontext/go.mod

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
module github.com/coder/coder/.github/workflows/prcontext
2+
3+
go 1.18
4+
5+
require github.com/coder/flog v1.0.0
6+
7+
require (
8+
github.com/fatih/color v1.13.0 // indirect
9+
github.com/mattn/go-colorable v0.1.12 // indirect
10+
github.com/mattn/go-isatty v0.0.14 // indirect
11+
golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27 // indirect
12+
)

.github/workflows/prcontext/go.sum

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
github.com/coder/flog v1.0.0 h1:gqr4jYDQWYmsvFD0RV6Vs+SAj1Kbn0HGlV7UghfxP+8=
2+
github.com/coder/flog v1.0.0/go.mod h1:UQlQvrkJBvnRGo69Le8E24Tcl5SJleAAR7gYEHzAmdQ=
3+
github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
4+
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
5+
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
6+
github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
7+
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
8+
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
9+
github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
10+
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
11+
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
12+
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
13+
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
14+
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
15+
golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27 h1:XDXtA5hveEEV8JB2l7nhMTp3t3cHp9ZpwcdjqyEWLlo=
16+
golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

.vscode/settings.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,9 @@
117117
"go.coverOnSave": true,
118118
// The codersdk is used by coderd another other packages extensively.
119119
// To reduce redundancy in tests, it's covered by other packages.
120-
"go.testFlags": ["-short", "-coverpkg=./.,github.com/coder/coder/codersdk"],
120+
// Since package coverage pairing can't be defined, all packages cover
121+
// all other packages.
122+
"go.testFlags": ["-short", "-coverpkg=./..."],
121123
"go.coverageDecorator": {
122124
"type": "gutter",
123125
"coveredHighlightColor": "rgba(64,128,128,0.5)",

Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ test: test-clean
176176
test-postgres: test-clean test-postgres-docker
177177
DB=ci DB_FROM=$(shell go run scripts/migrate-ci/main.go) gotestsum --junitfile="gotests.xml" --packages="./..." -- \
178178
-covermode=atomic -coverprofile="gotests.coverage" -timeout=20m \
179-
-coverpkg=./...,github.com/coder/coder/codersdk \
179+
-coverpkg=./... \
180180
-count=1 -race -failfast
181181
.PHONY: test-postgres
182182

agent/agent_test.go

+10-5
Original file line numberDiff line numberDiff line change
@@ -120,10 +120,12 @@ func TestAgent(t *testing.T) {
120120
localPort := tcpAddr.Port
121121
done := make(chan struct{})
122122
go func() {
123+
defer close(done)
123124
conn, err := local.Accept()
124-
assert.NoError(t, err)
125+
if !assert.NoError(t, err) {
126+
return
127+
}
125128
_ = conn.Close()
126-
close(done)
127129
}()
128130

129131
err = setupSSHCommand(t, []string{"-L", fmt.Sprintf("%d:127.0.0.1:%d", randomPort, localPort)}, []string{"echo", "test"}).Start()
@@ -399,15 +401,18 @@ func setupSSHCommand(t *testing.T, beforeArgs []string, afterArgs []string) *exe
399401
listener, err := net.Listen("tcp", "127.0.0.1:0")
400402
require.NoError(t, err)
401403
go func() {
404+
defer listener.Close()
402405
for {
403406
conn, err := listener.Accept()
404407
if err != nil {
405408
return
406409
}
407410
ssh, err := agentConn.SSH()
408-
assert.NoError(t, err)
409-
go io.Copy(conn, ssh)
410-
go io.Copy(ssh, conn)
411+
if !assert.NoError(t, err) {
412+
_ = conn.Close()
413+
return
414+
}
415+
go agent.Bicopy(context.Background(), conn, ssh)
411416
}
412417
}()
413418
t.Cleanup(func() {

cli/root.go

+5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package cli
22

33
import (
4+
"flag"
45
"fmt"
56
"net/url"
67
"os"
@@ -175,6 +176,10 @@ func versionCmd() *cobra.Command {
175176
}
176177
}
177178

179+
func isTest() bool {
180+
return flag.Lookup("test.v") != nil
181+
}
182+
178183
// createClient returns a new client from the command context.
179184
// It reads from global configuration files if flags are not set.
180185
func createClient(cmd *cobra.Command) (*codersdk.Client, error) {

cli/root_internal_test.go

+7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package cli
22

33
import (
4+
"os"
45
"testing"
56

67
"github.com/stretchr/testify/require"
@@ -64,3 +65,9 @@ func Test_formatExamples(t *testing.T) {
6465
})
6566
}
6667
}
68+
69+
func TestMain(m *testing.M) {
70+
// Replace with goleak.VerifyTestMain(m) when we enable goleak.
71+
os.Exit(m.Run())
72+
// goleak.VerifyTestMain(m)
73+
}

cli/server.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -566,7 +566,8 @@ func server() *cobra.Command {
566566
"Specifies teams inside organizations the user must be a member of to authenticate with GitHub. Formatted as: <organization-name>/<team-slug>.")
567567
cliflag.BoolVarP(root.Flags(), &oauth2GithubAllowSignups, "oauth2-github-allow-signups", "", "CODER_OAUTH2_GITHUB_ALLOW_SIGNUPS", false,
568568
"Specifies whether new users can sign up with GitHub.")
569-
cliflag.BoolVarP(root.Flags(), &telemetryEnable, "telemetry", "", "CODER_TELEMETRY", true, "Specifies whether telemetry is enabled or not. Coder collects anonymized usage data to help improve our product.")
569+
enableTelemetryByDefault := !isTest()
570+
cliflag.BoolVarP(root.Flags(), &telemetryEnable, "telemetry", "", "CODER_TELEMETRY", enableTelemetryByDefault, "Specifies whether telemetry is enabled or not. Coder collects anonymized usage data to help improve our product.")
570571
cliflag.StringVarP(root.Flags(), &telemetryURL, "telemetry-url", "", "CODER_TELEMETRY_URL", "https://telemetry.coder.com", "Specifies a URL to send telemetry to.")
571572
_ = root.Flags().MarkHidden("telemetry-url")
572573
cliflag.BoolVarP(root.Flags(), &tlsEnable, "tls-enable", "", "CODER_TLS_ENABLE", false, "Specifies if TLS will be enabled")

coderd/devtunnel/tunnel_test.go

+18-8
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ func TestTunnel(t *testing.T) {
7373
err := server.Serve(tun.Listener)
7474
assert.Equal(t, http.ErrServerClosed, err)
7575
}()
76-
t.Cleanup(func() { _ = server.Close() })
77-
t.Cleanup(func() { tun.Listener.Close() })
76+
defer func() { _ = server.Close() }()
77+
defer func() { tun.Listener.Close() }()
7878

7979
require.Eventually(t, func() bool {
8080
res, err := fTunServer.requestHTTP()
@@ -116,9 +116,11 @@ type fakeTunnelServer struct {
116116
}
117117

118118
func newFakeTunnelServer(t *testing.T) *fakeTunnelServer {
119+
t.Helper()
120+
119121
priv, err := wgtypes.GeneratePrivateKey()
120-
privBytes := [32]byte(priv)
121122
require.NoError(t, err)
123+
privBytes := [32]byte(priv)
122124
pub := priv.PublicKey()
123125
pubBytes := [32]byte(pub)
124126
tun, tnet, err := netstack.CreateNetTUN(
@@ -127,17 +129,25 @@ func newFakeTunnelServer(t *testing.T) *fakeTunnelServer {
127129
1280,
128130
)
129131
require.NoError(t, err)
130-
dev := device.NewDevice(tun, conn.NewDefaultBind(), device.NewLogger(device.LogLevelVerbose, "server "))
132+
133+
ctx := context.Background()
134+
slogger := slogtest.Make(t, nil).Leveled(slog.LevelDebug).Named("server")
135+
logger := &device.Logger{
136+
Verbosef: slog.Stdlib(ctx, slogger, slog.LevelDebug).Printf,
137+
Errorf: slog.Stdlib(ctx, slogger, slog.LevelError).Printf,
138+
}
139+
dev := device.NewDevice(tun, conn.NewDefaultBind(), logger)
140+
t.Cleanup(func() {
141+
dev.RemoveAllPeers()
142+
dev.Close()
143+
slogger.Debug(ctx, "dev.Close()")
144+
})
131145
err = dev.IpcSet(fmt.Sprintf(`private_key=%s
132146
listen_port=%d`,
133147
hex.EncodeToString(privBytes[:]),
134148
wgPort,
135149
))
136150
require.NoError(t, err)
137-
t.Cleanup(func() {
138-
dev.RemoveAllPeers()
139-
dev.Close()
140-
})
141151

142152
err = dev.Up()
143153
require.NoError(t, err)

docs/ides/configuring-web-ides.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ be used as a Coder application. For example:
1717
```hcl
1818
# Give template users the portainer.io web UI
1919
resource "coder_app" "portainer" {
20-
agent_id = coder_agent.dev.id
20+
agent_id = coder_agent.main.id
2121
name = "portainer"
2222
icon = "https://simpleicons.org/icons/portainer.svg"
2323
url = "http://localhost:8000"
@@ -69,7 +69,7 @@ You'll also need to specify a `coder_app` resource related to the agent. This is
6969

7070
```hcl
7171
resource "coder_app" "code-server" {
72-
agent_id = coder_agent.dev.id
72+
agent_id = coder_agent.main.id
7373
name = "code-server"
7474
url = "http://localhost:13337/?folder=/home/coder"
7575
icon = "/icon/code.svg"

dogfood/main.tf

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ resource "coder_agent" "main" {
3838
}
3939

4040
resource "coder_app" "code-server" {
41-
agent_id = coder_agent.dev.id
41+
agent_id = coder_agent.main.id
4242
name = "code-server"
4343
url = "http://localhost:13337/?folder=/home/coder"
4444
icon = "/icon/code.svg"

examples/templates/aws-linux/main.tf

+1-1
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ Content-Transfer-Encoding: 7bit
109109
Content-Disposition: attachment; filename="userdata.txt"
110110
111111
#!/bin/bash
112-
sudo -u ${local.linux_user} sh -c '${coder_agent.dev.init_script}'
112+
sudo -u ${local.linux_user} sh -c '${coder_agent.main.init_script}'
113113
--//--
114114
EOT
115115

examples/templates/aws-windows/main.tf

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ locals {
8383
user_data_start = <<EOT
8484
<powershell>
8585
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
86-
${coder_agent.dev.init_script}
86+
${coder_agent.main.init_script}
8787
</powershell>
8888
<persist>true</persist>
8989
EOT

examples/templates/bare/main.tf

+3-3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ terraform {
1515
data "coder_workspace" "me" {
1616
}
1717

18-
resource "coder_agent" "dev1" {
18+
resource "coder_agent" "main" {
1919
os = "linux"
2020
arch = "amd64"
2121
auth = "token"
@@ -32,8 +32,8 @@ resource "null_resource" "fake-compute" {
3232
# Run the Coder agent init script on resources
3333
# to access web apps and SSH:
3434
#
35-
# export CODER_AGENT_TOKEN=${coder_agent.dev1.token}
36-
# ${coder_agent.dev1.init_script}
35+
# export CODER_AGENT_TOKEN=${coder_agent.main.token}
36+
# ${coder_agent.main.init_script}
3737
}
3838

3939
resource "null_resource" "fake-disk" {

examples/templates/do-linux/main.tf

+2-2
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,8 @@ resource "digitalocean_droplet" "workspace" {
116116
user_data = templatefile("cloud-config.yaml.tftpl", {
117117
username = data.coder_workspace.me.owner
118118
home_volume_label = digitalocean_volume.home_volume.initial_filesystem_label
119-
init_script = base64encode(coder_agent.dev.init_script)
120-
coder_agent_token = coder_agent.dev.token
119+
init_script = base64encode(coder_agent.main.init_script)
120+
coder_agent_token = coder_agent.main.token
121121
})
122122
# Required to provision Fedora.
123123
ssh_keys = var.step2_do_admin_ssh_key > 0 ? [var.step2_do_admin_ssh_key] : []

examples/templates/docker-code-server/main.tf

+3-3
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ resource "coder_agent" "main" {
5353
}
5454

5555
resource "coder_app" "code-server" {
56-
agent_id = coder_agent.dev.id
56+
agent_id = coder_agent.main.id
5757
url = "http://localhost:8080/?folder=/home/coder"
5858
icon = "/icon/code.svg"
5959
}
@@ -70,8 +70,8 @@ resource "docker_container" "workspace" {
7070
hostname = lower(data.coder_workspace.me.name)
7171
dns = ["1.1.1.1"]
7272
# Use the docker gateway if the access URL is 127.0.0.1
73-
entrypoint = ["sh", "-c", replace(coder_agent.dev.init_script, "127.0.0.1", "host.docker.internal")]
74-
env = ["CODER_AGENT_TOKEN=${coder_agent.dev.token}"]
73+
entrypoint = ["sh", "-c", replace(coder_agent.main.init_script, "127.0.0.1", "host.docker.internal")]
74+
env = ["CODER_AGENT_TOKEN=${coder_agent.main.token}"]
7575
host {
7676
host = "host.docker.internal"
7777
ip = "host-gateway"

examples/templates/docker-image-builds/main.tf

+2-2
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,8 @@ resource "docker_container" "workspace" {
108108
hostname = lower(data.coder_workspace.me.name)
109109
dns = ["1.1.1.1"]
110110
# Use the docker gateway if the access URL is 127.0.0.1
111-
command = ["sh", "-c", replace(coder_agent.dev.init_script, "127.0.0.1", "host.docker.internal")]
112-
env = ["CODER_AGENT_TOKEN=${coder_agent.dev.token}"]
111+
command = ["sh", "-c", replace(coder_agent.main.init_script, "127.0.0.1", "host.docker.internal")]
112+
env = ["CODER_AGENT_TOKEN=${coder_agent.main.token}"]
113113
host {
114114
host = "host.docker.internal"
115115
ip = "host-gateway"

examples/templates/docker-with-dotfiles/main.tf

+2-2
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ resource "docker_container" "workspace" {
5454
name = "coder-${data.coder_workspace.me.owner}-${lower(data.coder_workspace.me.name)}"
5555
dns = ["1.1.1.1"]
5656
# Refer to Docker host when Coder is on localhost
57-
command = ["sh", "-c", replace(coder_agent.dev.init_script, "127.0.0.1", "host.docker.internal")]
58-
env = ["CODER_AGENT_TOKEN=${coder_agent.dev.token}"]
57+
command = ["sh", "-c", replace(coder_agent.main.init_script, "127.0.0.1", "host.docker.internal")]
58+
env = ["CODER_AGENT_TOKEN=${coder_agent.main.token}"]
5959
host {
6060
host = "host.docker.internal"
6161
ip = "host-gateway"

examples/templates/docker/main.tf

+3-3
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ resource "coder_agent" "main" {
8888
}
8989

9090
resource "coder_app" "code-server" {
91-
agent_id = coder_agent.dev.id
91+
agent_id = coder_agent.main.id
9292
name = "code-server"
9393
url = "http://localhost:13337/?folder=/home/coder"
9494
icon = "/icon/code.svg"
@@ -124,10 +124,10 @@ resource "docker_container" "workspace" {
124124
"sh", "-c",
125125
<<EOT
126126
trap '[ $? -ne 0 ] && echo === Agent script exited with non-zero code. Sleeping infinitely to preserve logs... && sleep infinity' EXIT
127-
${replace(coder_agent.dev.init_script, "localhost", "host.docker.internal")}
127+
${replace(coder_agent.main.init_script, "localhost", "host.docker.internal")}
128128
EOT
129129
]
130-
env = ["CODER_AGENT_TOKEN=${coder_agent.dev.token}"]
130+
env = ["CODER_AGENT_TOKEN=${coder_agent.main.token}"]
131131
host {
132132
host = "host.docker.internal"
133133
ip = "host-gateway"

examples/templates/gcp-linux/main.tf

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ set -eux pipefail
7979
8080
mkdir /root || true
8181
cat <<'EOCODER' > /root/coder_agent.sh
82-
${coder_agent.dev.init_script}
82+
${coder_agent.main.init_script}
8383
EOCODER
8484
chmod +x /root/coder_agent.sh
8585

examples/templates/gcp-vm-container/main.tf

+2-2
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ module "gce-container" {
4848
container = {
4949
image = "mcr.microsoft.com/vscode/devcontainers/go:1"
5050
command = ["sh"]
51-
args = ["-c", coder_agent.dev.init_script]
51+
args = ["-c", coder_agent.main.init_script]
5252
securityContext = {
5353
privileged : true
5454
}
@@ -85,6 +85,6 @@ resource "google_compute_instance" "dev" {
8585

8686
resource "coder_agent_instance" "dev" {
8787
count = data.coder_workspace.me.start_count
88-
agent_id = coder_agent.dev.id
88+
agent_id = coder_agent.main.id
8989
instance_id = google_compute_instance.dev[0].instance_id
9090
}

0 commit comments

Comments
 (0)