Skip to content

Commit 3e1720c

Browse files
committed
Merge branch 'main' into org-management-ui
2 parents bdec268 + 78b8264 commit 3e1720c

File tree

360 files changed

+8497
-3175
lines changed

Some content is hidden

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

360 files changed

+8497
-3175
lines changed

.github/actions/setup-go/action.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ description: |
44
inputs:
55
version:
66
description: "The Go version to use."
7-
default: "1.21.9"
7+
default: "1.22.3"
88
runs:
99
using: "composite"
1010
steps:

.github/actions/setup-tf/action.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@ runs:
77
- name: Install Terraform
88
uses: hashicorp/setup-terraform@v3
99
with:
10-
terraform_version: 1.7.5
10+
terraform_version: 1.8.4
1111
terraform_wrapper: false

.github/pr-deployments/template/main.tf

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ provider "kubernetes" {
8686
}
8787

8888
data "coder_workspace" "me" {}
89+
data "coder_workspace_owner" "me" {}
8990

9091
resource "coder_agent" "main" {
9192
os = "linux"
@@ -175,21 +176,21 @@ resource "coder_app" "code-server" {
175176

176177
resource "kubernetes_persistent_volume_claim" "home" {
177178
metadata {
178-
name = "coder-${lower(data.coder_workspace.me.owner)}-${lower(data.coder_workspace.me.name)}-home"
179+
name = "coder-${lower(data.coder_workspace_owner.me.name)}-${lower(data.coder_workspace.me.name)}-home"
179180
namespace = var.namespace
180181
labels = {
181182
"app.kubernetes.io/name" = "coder-pvc"
182-
"app.kubernetes.io/instance" = "coder-pvc-${lower(data.coder_workspace.me.owner)}-${lower(data.coder_workspace.me.name)}"
183+
"app.kubernetes.io/instance" = "coder-pvc-${lower(data.coder_workspace_owner.me.name)}-${lower(data.coder_workspace.me.name)}"
183184
"app.kubernetes.io/part-of" = "coder"
184185
//Coder-specific labels.
185186
"com.coder.resource" = "true"
186187
"com.coder.workspace.id" = data.coder_workspace.me.id
187188
"com.coder.workspace.name" = data.coder_workspace.me.name
188-
"com.coder.user.id" = data.coder_workspace.me.owner_id
189-
"com.coder.user.username" = data.coder_workspace.me.owner
189+
"com.coder.user.id" = data.coder_workspace_owner.me.id
190+
"com.coder.user.username" = data.coder_workspace_owner.me.name
190191
}
191192
annotations = {
192-
"com.coder.user.email" = data.coder_workspace.me.owner_email
193+
"com.coder.user.email" = data.coder_workspace_owner.me.email
193194
}
194195
}
195196
wait_until_bound = false
@@ -210,20 +211,20 @@ resource "kubernetes_deployment" "main" {
210211
]
211212
wait_for_rollout = false
212213
metadata {
213-
name = "coder-${lower(data.coder_workspace.me.owner)}-${lower(data.coder_workspace.me.name)}"
214+
name = "coder-${lower(data.coder_workspace_owner.me.name)}-${lower(data.coder_workspace.me.name)}"
214215
namespace = var.namespace
215216
labels = {
216217
"app.kubernetes.io/name" = "coder-workspace"
217-
"app.kubernetes.io/instance" = "coder-workspace-${lower(data.coder_workspace.me.owner)}-${lower(data.coder_workspace.me.name)}"
218+
"app.kubernetes.io/instance" = "coder-workspace-${lower(data.coder_workspace_owner.me.name)}-${lower(data.coder_workspace.me.name)}"
218219
"app.kubernetes.io/part-of" = "coder"
219220
"com.coder.resource" = "true"
220221
"com.coder.workspace.id" = data.coder_workspace.me.id
221222
"com.coder.workspace.name" = data.coder_workspace.me.name
222-
"com.coder.user.id" = data.coder_workspace.me.owner_id
223-
"com.coder.user.username" = data.coder_workspace.me.owner
223+
"com.coder.user.id" = data.coder_workspace_owner.me.id
224+
"com.coder.user.username" = data.coder_workspace_owner.me.name
224225
}
225226
annotations = {
226-
"com.coder.user.email" = data.coder_workspace.me.owner_email
227+
"com.coder.user.email" = data.coder_workspace_owner.me.email
227228
}
228229
}
229230

.github/workflows/ci.yaml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,9 @@ jobs:
211211
- name: Setup sqlc
212212
uses: ./.github/actions/setup-sqlc
213213

214+
- name: Setup Terraform
215+
uses: ./.github/actions/setup-tf
216+
214217
- name: go install tools
215218
run: |
216219
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.30
@@ -916,11 +919,10 @@ jobs:
916919
uses: actions/checkout@v4
917920
- name: "Dependency Review"
918921
id: review
919-
# TODO: Replace this with the latest release once https://github.com/actions/dependency-review-action/pull/761 is merged.
920-
uses: actions/dependency-review-action@82ab8f69c78827a746628706b5d2c3f87231fd4c
922+
uses: actions/dependency-review-action@v4.3.2
921923
with:
922924
allow-licenses: Apache-2.0, BSD-2-Clause, BSD-3-Clause, CC0-1.0, ISC, MIT, MIT-0, MPL-2.0
923-
allow-dependencies-licenses: "pkg:golang/github.com/pelletier/go-toml/v2"
925+
allow-dependencies-licenses: "pkg:golang/github.com/coder/wgtunnel@0.1.13-0.20240522110300-ade90dfb2da0"
924926
license-check: true
925927
vulnerability-check: false
926928
- name: "Report"

.github/workflows/docker-base.yaml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ on:
88
- scripts/Dockerfile.base
99
- scripts/Dockerfile
1010

11+
pull_request:
12+
paths:
13+
- scripts/Dockerfile.base
14+
- .github/workflows/docker-base.yaml
15+
1116
schedule:
1217
# Run every week at 09:43 on Monday, Wednesday and Friday. We build this
1318
# frequently to ensure that packages are up-to-date.
@@ -57,11 +62,12 @@ jobs:
5762
platforms: linux/amd64,linux/arm64,linux/arm/v7
5863
pull: true
5964
no-cache: true
60-
push: true
65+
push: ${{ github.event_name != 'pull_request' }}
6166
tags: |
6267
ghcr.io/coder/coder-base:latest
6368
6469
- name: Verify that images are pushed properly
70+
if: github.event_name != 'pull_request'
6571
run: |
6672
# retry 10 times with a 5 second delay as the images may not be
6773
# available immediately

.github/workflows/release.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,9 @@ jobs:
178178
env:
179179
EV_SIGNING_CERT: ${{ secrets.EV_SIGNING_CERT }}
180180

181-
# - name: Test migrations from current ref to main
182-
# run: |
183-
# make test-migrations
181+
- name: Test migrations from current ref to main
182+
run: |
183+
make test-migrations
184184
185185
# Setup GCloud for signing Windows binaries.
186186
- name: Authenticate to Google Cloud

.github/workflows/security.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ jobs:
114114
echo "image=$(cat "$image_job")" >> $GITHUB_OUTPUT
115115
116116
- name: Run Trivy vulnerability scanner
117-
uses: aquasecurity/trivy-action@b2933f565dbc598b29947660e66259e3c7bc8561
117+
uses: aquasecurity/trivy-action@fd25fed6972e341ff0007ddb61f77e88103953c2
118118
with:
119119
image-ref: ${{ steps.build.outputs.image }}
120120
format: sarif

.github/workflows/typos.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,5 @@ extend-exclude = [
3333
"**/pnpm-lock.yaml",
3434
"tailnet/testdata/**",
3535
"site/src/pages/SetupPage/countries.tsx",
36+
"provisioner/terraform/testdata/**",
3637
]

Makefile

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,7 @@ gen: \
493493
coderd/apidoc/swagger.json \
494494
.prettierignore.include \
495495
.prettierignore \
496+
provisioner/terraform/testdata/version \
496497
site/.prettierrc.yaml \
497498
site/.prettierignore \
498499
site/.eslintignore \
@@ -614,10 +615,10 @@ site/src/theme/icons.json: $(wildcard scripts/gensite/*) $(wildcard site/static/
614615
examples/examples.gen.json: scripts/examplegen/main.go examples/examples.go $(shell find ./examples/templates)
615616
go run ./scripts/examplegen/main.go > examples/examples.gen.json
616617

617-
coderd/rbac/object_gen.go: scripts/rbacgen/main.go coderd/rbac/object.go
618+
coderd/rbac/object_gen.go: scripts/rbacgen/rbacobject.gotmpl scripts/rbacgen/main.go coderd/rbac/object.go
618619
go run scripts/rbacgen/main.go rbac > coderd/rbac/object_gen.go
619620

620-
codersdk/rbacresources_gen.go: scripts/rbacgen/main.go coderd/rbac/object.go
621+
codersdk/rbacresources_gen.go: scripts/rbacgen/codersdk.gotmpl scripts/rbacgen/main.go coderd/rbac/object.go
621622
go run scripts/rbacgen/main.go codersdk > codersdk/rbacresources_gen.go
622623

623624
docs/admin/prometheus.md: scripts/metricsdocgen/main.go scripts/metricsdocgen/metrics
@@ -684,6 +685,12 @@ provisioner/terraform/testdata/.gen-golden: $(wildcard provisioner/terraform/tes
684685
go test ./provisioner/terraform -run="Test.*Golden$$" -update
685686
touch "$@"
686687

688+
provisioner/terraform/testdata/version:
689+
if [[ "$(shell cat provisioner/terraform/testdata/version.txt)" != "$(shell terraform version -json | jq -r '.terraform_version')" ]]; then
690+
./provisioner/terraform/testdata/generate.sh
691+
fi
692+
.PHONY: provisioner/terraform/testdata/version
693+
687694
scripts/ci-report/testdata/.gen-golden: $(wildcard scripts/ci-report/testdata/*) $(wildcard scripts/ci-report/*.go)
688695
go test ./scripts/ci-report -run=TestOutputMatchesGoldenFile -update
689696
touch "$@"
@@ -797,8 +804,11 @@ test-postgres: test-postgres-docker
797804
test-migrations: test-postgres-docker
798805
echo "--- test migrations"
799806
set -euo pipefail
800-
COMMIT_FROM=$(shell git rev-parse --short HEAD)
801-
COMMIT_TO=$(shell git rev-parse --short main)
807+
COMMIT_FROM=$(shell git log -1 --format='%h' HEAD)
808+
echo "COMMIT_FROM=$${COMMIT_FROM}"
809+
COMMIT_TO=$(shell git log -1 --format='%h' origin/main)
810+
echo "COMMIT_TO=$${COMMIT_TO}"
811+
if [[ "$${COMMIT_FROM}" == "$${COMMIT_TO}" ]]; then echo "Nothing to do!"; exit 0; fi
802812
echo "DROP DATABASE IF EXISTS migrate_test_$${COMMIT_FROM}; CREATE DATABASE migrate_test_$${COMMIT_FROM};" | psql 'postgresql://postgres:postgres@localhost:5432/postgres?sslmode=disable'
803813
go run ./scripts/migrate-test/main.go --from="$$COMMIT_FROM" --to="$$COMMIT_TO" --postgres-url="postgresql://postgres:postgres@localhost:5432/migrate_test_$${COMMIT_FROM}?sslmode=disable"
804814

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,3 +122,7 @@ We are always working on new integrations. Feel free to open an issue to request
122122
We are always happy to see new contributors to Coder. If you are new to the Coder codebase, we have
123123
[a guide on how to get started](https://coder.com/docs/v2/latest/CONTRIBUTING). We'd love to see your
124124
contributions!
125+
126+
## Hiring
127+
128+
Apply [here](https://cdr.co/github-apply) if you're interested in joining our team.

agent/agent.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ func New(options Options) Agent {
176176
ignorePorts: options.IgnorePorts,
177177
portCacheDuration: options.PortCacheDuration,
178178
reportMetadataInterval: options.ReportMetadataInterval,
179-
notificationBannersRefreshInterval: options.ServiceBannerRefreshInterval,
179+
announcementBannersRefreshInterval: options.ServiceBannerRefreshInterval,
180180
sshMaxTimeout: options.SSHMaxTimeout,
181181
subsystems: options.Subsystems,
182182
addresses: options.Addresses,
@@ -193,7 +193,7 @@ func New(options Options) Agent {
193193
// that gets closed on disconnection. This is used to wait for graceful disconnection from the
194194
// coordinator during shut down.
195195
close(a.coordDisconnected)
196-
a.notificationBanners.Store(new([]codersdk.BannerConfig))
196+
a.announcementBanners.Store(new([]codersdk.BannerConfig))
197197
a.sessionToken.Store(new(string))
198198
a.init()
199199
return a
@@ -234,8 +234,8 @@ type agent struct {
234234
manifest atomic.Pointer[agentsdk.Manifest] // manifest is atomic because values can change after reconnection.
235235
reportMetadataInterval time.Duration
236236
scriptRunner *agentscripts.Runner
237-
notificationBanners atomic.Pointer[[]codersdk.BannerConfig] // notificationBanners is atomic because it is periodically updated.
238-
notificationBannersRefreshInterval time.Duration
237+
announcementBanners atomic.Pointer[[]codersdk.BannerConfig] // announcementBanners is atomic because it is periodically updated.
238+
announcementBannersRefreshInterval time.Duration
239239
sessionToken atomic.Pointer[string]
240240
sshServer *agentssh.Server
241241
sshMaxTimeout time.Duration
@@ -274,7 +274,7 @@ func (a *agent) init() {
274274
sshSrv, err := agentssh.NewServer(a.hardCtx, a.logger.Named("ssh-server"), a.prometheusRegistry, a.filesystem, &agentssh.Config{
275275
MaxTimeout: a.sshMaxTimeout,
276276
MOTDFile: func() string { return a.manifest.Load().MOTDFile },
277-
NotificationBanners: func() *[]codersdk.BannerConfig { return a.notificationBanners.Load() },
277+
AnnouncementBanners: func() *[]codersdk.BannerConfig { return a.announcementBanners.Load() },
278278
UpdateEnv: a.updateCommandEnv,
279279
WorkingDirectory: func() string { return a.manifest.Load().Directory },
280280
})
@@ -709,26 +709,26 @@ func (a *agent) setLifecycle(state codersdk.WorkspaceAgentLifecycle) {
709709
// (and must be done before the session actually starts).
710710
func (a *agent) fetchServiceBannerLoop(ctx context.Context, conn drpc.Conn) error {
711711
aAPI := proto.NewDRPCAgentClient(conn)
712-
ticker := time.NewTicker(a.notificationBannersRefreshInterval)
712+
ticker := time.NewTicker(a.announcementBannersRefreshInterval)
713713
defer ticker.Stop()
714714
for {
715715
select {
716716
case <-ctx.Done():
717717
return ctx.Err()
718718
case <-ticker.C:
719-
bannersProto, err := aAPI.GetNotificationBanners(ctx, &proto.GetNotificationBannersRequest{})
719+
bannersProto, err := aAPI.GetAnnouncementBanners(ctx, &proto.GetAnnouncementBannersRequest{})
720720
if err != nil {
721721
if ctx.Err() != nil {
722722
return ctx.Err()
723723
}
724724
a.logger.Error(ctx, "failed to update notification banners", slog.Error(err))
725725
return err
726726
}
727-
banners := make([]codersdk.BannerConfig, 0, len(bannersProto.NotificationBanners))
728-
for _, bannerProto := range bannersProto.NotificationBanners {
727+
banners := make([]codersdk.BannerConfig, 0, len(bannersProto.AnnouncementBanners))
728+
for _, bannerProto := range bannersProto.AnnouncementBanners {
729729
banners = append(banners, agentsdk.BannerConfigFromProto(bannerProto))
730730
}
731-
a.notificationBanners.Store(&banners)
731+
a.announcementBanners.Store(&banners)
732732
}
733733
}
734734
}
@@ -763,15 +763,15 @@ func (a *agent) run() (retErr error) {
763763
connMan.start("init notification banners", gracefulShutdownBehaviorStop,
764764
func(ctx context.Context, conn drpc.Conn) error {
765765
aAPI := proto.NewDRPCAgentClient(conn)
766-
bannersProto, err := aAPI.GetNotificationBanners(ctx, &proto.GetNotificationBannersRequest{})
766+
bannersProto, err := aAPI.GetAnnouncementBanners(ctx, &proto.GetAnnouncementBannersRequest{})
767767
if err != nil {
768768
return xerrors.Errorf("fetch service banner: %w", err)
769769
}
770-
banners := make([]codersdk.BannerConfig, 0, len(bannersProto.NotificationBanners))
771-
for _, bannerProto := range bannersProto.NotificationBanners {
770+
banners := make([]codersdk.BannerConfig, 0, len(bannersProto.AnnouncementBanners))
771+
for _, bannerProto := range bannersProto.AnnouncementBanners {
772772
banners = append(banners, agentsdk.BannerConfigFromProto(bannerProto))
773773
}
774-
a.notificationBanners.Store(&banners)
774+
a.announcementBanners.Store(&banners)
775775
return nil
776776
},
777777
)

agent/agent_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -614,7 +614,7 @@ func TestAgent_Session_TTY_MOTD_Update(t *testing.T) {
614614
// Set new banner func and wait for the agent to call it to update the
615615
// banner.
616616
ready := make(chan struct{}, 2)
617-
client.SetNotificationBannersFunc(func() ([]codersdk.BannerConfig, error) {
617+
client.SetAnnouncementBannersFunc(func() ([]codersdk.BannerConfig, error) {
618618
select {
619619
case ready <- struct{}{}:
620620
default:
@@ -2200,7 +2200,7 @@ func setupSSHSession(
22002200
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
22012201
defer cancel()
22022202
opts = append(opts, func(c *agenttest.Client, o *agent.Options) {
2203-
c.SetNotificationBannersFunc(func() ([]codersdk.BannerConfig, error) {
2203+
c.SetAnnouncementBannersFunc(func() ([]codersdk.BannerConfig, error) {
22042204
return []codersdk.BannerConfig{banner}, nil
22052205
})
22062206
})

agent/agentssh/agentssh.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ type Config struct {
6363
// file will be displayed to the user upon login.
6464
MOTDFile func() string
6565
// ServiceBanner returns the configuration for the Coder service banner.
66-
NotificationBanners func() *[]codersdk.BannerConfig
66+
AnnouncementBanners func() *[]codersdk.BannerConfig
6767
// UpdateEnv updates the environment variables for the command to be
6868
// executed. It can be used to add, modify or replace environment variables.
6969
UpdateEnv func(current []string) (updated []string, err error)
@@ -123,8 +123,8 @@ func NewServer(ctx context.Context, logger slog.Logger, prometheusRegistry *prom
123123
if config.MOTDFile == nil {
124124
config.MOTDFile = func() string { return "" }
125125
}
126-
if config.NotificationBanners == nil {
127-
config.NotificationBanners = func() *[]codersdk.BannerConfig { return &[]codersdk.BannerConfig{} }
126+
if config.AnnouncementBanners == nil {
127+
config.AnnouncementBanners = func() *[]codersdk.BannerConfig { return &[]codersdk.BannerConfig{} }
128128
}
129129
if config.WorkingDirectory == nil {
130130
config.WorkingDirectory = func() string {
@@ -441,13 +441,13 @@ func (s *Server) startPTYSession(logger slog.Logger, session ptySession, magicTy
441441
session.DisablePTYEmulation()
442442

443443
if isLoginShell(session.RawCommand()) {
444-
banners := s.config.NotificationBanners()
444+
banners := s.config.AnnouncementBanners()
445445
if banners != nil {
446446
for _, banner := range *banners {
447-
err := showNotificationBanner(session, banner)
447+
err := showAnnouncementBanner(session, banner)
448448
if err != nil {
449-
logger.Error(ctx, "agent failed to show service banner", slog.Error(err))
450-
s.metrics.sessionErrors.WithLabelValues(magicTypeLabel, "yes", "notification_banner").Add(1)
449+
logger.Error(ctx, "agent failed to show announcement banner", slog.Error(err))
450+
s.metrics.sessionErrors.WithLabelValues(magicTypeLabel, "yes", "announcement_banner").Add(1)
451451
break
452452
}
453453
}
@@ -894,9 +894,9 @@ func isQuietLogin(fs afero.Fs, rawCommand string) bool {
894894
return err == nil
895895
}
896896

897-
// showNotificationBanner will write the service banner if enabled and not blank
897+
// showAnnouncementBanner will write the service banner if enabled and not blank
898898
// along with a blank line for spacing.
899-
func showNotificationBanner(session io.Writer, banner codersdk.BannerConfig) error {
899+
func showAnnouncementBanner(session io.Writer, banner codersdk.BannerConfig) error {
900900
if banner.Enabled && banner.Message != "" {
901901
// The banner supports Markdown so we might want to parse it but Markdown is
902902
// still fairly readable in its raw form.

0 commit comments

Comments
 (0)