Skip to content

Commit 3250b48

Browse files
committed
Merge branch 'main' of https://github.com/coder/coder into bq/improve-template-filter
2 parents d3c9ef5 + 056a697 commit 3250b48

File tree

301 files changed

+6700
-2262
lines changed

Some content is hidden

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

301 files changed

+6700
-2262
lines changed

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

+1-1
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

+11-10
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

+1-1
Original file line numberDiff line numberDiff line change
@@ -922,7 +922,7 @@ jobs:
922922
uses: actions/dependency-review-action@v4.3.2
923923
with:
924924
allow-licenses: Apache-2.0, BSD-2-Clause, BSD-3-Clause, CC0-1.0, ISC, MIT, MIT-0, MPL-2.0
925-
allow-dependencies-licenses: "pkg:golang/github.com/coder/wgtunnel@0.1.13-0.20240522110300-ade90dfb2da0"
925+
allow-dependencies-licenses: "pkg:golang/github.com/coder/wgtunnel@0.1.13-0.20240522110300-ade90dfb2da0, pkg:npm/pako@1.0.11"
926926
license-check: true
927927
vulnerability-check: false
928928
- name: "Report"

.github/workflows/docker-base.yaml

+7-1
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/typos.toml

+1
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

+2-2
Original file line numberDiff line numberDiff line change
@@ -615,10 +615,10 @@ site/src/theme/icons.json: $(wildcard scripts/gensite/*) $(wildcard site/static/
615615
examples/examples.gen.json: scripts/examplegen/main.go examples/examples.go $(shell find ./examples/templates)
616616
go run ./scripts/examplegen/main.go > examples/examples.gen.json
617617

618-
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
619619
go run scripts/rbacgen/main.go rbac > coderd/rbac/object_gen.go
620620

621-
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
622622
go run scripts/rbacgen/main.go codersdk > codersdk/rbacresources_gen.go
623623

624624
docs/admin/prometheus.md: scripts/metricsdocgen/main.go scripts/metricsdocgen/metrics

agent/agent.go

+14-14
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

+2-2
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

+9-9
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.

agent/agenttest/client.go

+10-10
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,8 @@ func (c *Client) GetStartupLogs() []agentsdk.Log {
138138
return c.logs
139139
}
140140

141-
func (c *Client) SetNotificationBannersFunc(f func() ([]codersdk.ServiceBannerConfig, error)) {
142-
c.fakeAgentAPI.SetNotificationBannersFunc(f)
141+
func (c *Client) SetAnnouncementBannersFunc(f func() ([]codersdk.BannerConfig, error)) {
142+
c.fakeAgentAPI.SetAnnouncementBannersFunc(f)
143143
}
144144

145145
func (c *Client) PushDERPMapUpdate(update *tailcfg.DERPMap) error {
@@ -171,7 +171,7 @@ type FakeAgentAPI struct {
171171
lifecycleStates []codersdk.WorkspaceAgentLifecycle
172172
metadata map[string]agentsdk.Metadata
173173

174-
getNotificationBannersFunc func() ([]codersdk.BannerConfig, error)
174+
getAnnouncementBannersFunc func() ([]codersdk.BannerConfig, error)
175175
}
176176

177177
func (f *FakeAgentAPI) GetManifest(context.Context, *agentproto.GetManifestRequest) (*agentproto.Manifest, error) {
@@ -182,28 +182,28 @@ func (*FakeAgentAPI) GetServiceBanner(context.Context, *agentproto.GetServiceBan
182182
return &agentproto.ServiceBanner{}, nil
183183
}
184184

185-
func (f *FakeAgentAPI) SetNotificationBannersFunc(fn func() ([]codersdk.BannerConfig, error)) {
185+
func (f *FakeAgentAPI) SetAnnouncementBannersFunc(fn func() ([]codersdk.BannerConfig, error)) {
186186
f.Lock()
187187
defer f.Unlock()
188-
f.getNotificationBannersFunc = fn
188+
f.getAnnouncementBannersFunc = fn
189189
f.logger.Info(context.Background(), "updated notification banners")
190190
}
191191

192-
func (f *FakeAgentAPI) GetNotificationBanners(context.Context, *agentproto.GetNotificationBannersRequest) (*agentproto.GetNotificationBannersResponse, error) {
192+
func (f *FakeAgentAPI) GetAnnouncementBanners(context.Context, *agentproto.GetAnnouncementBannersRequest) (*agentproto.GetAnnouncementBannersResponse, error) {
193193
f.Lock()
194194
defer f.Unlock()
195-
if f.getNotificationBannersFunc == nil {
196-
return &agentproto.GetNotificationBannersResponse{NotificationBanners: []*agentproto.BannerConfig{}}, nil
195+
if f.getAnnouncementBannersFunc == nil {
196+
return &agentproto.GetAnnouncementBannersResponse{AnnouncementBanners: []*agentproto.BannerConfig{}}, nil
197197
}
198-
banners, err := f.getNotificationBannersFunc()
198+
banners, err := f.getAnnouncementBannersFunc()
199199
if err != nil {
200200
return nil, err
201201
}
202202
bannersProto := make([]*agentproto.BannerConfig, 0, len(banners))
203203
for _, banner := range banners {
204204
bannersProto = append(bannersProto, agentsdk.ProtoFromBannerConfig(banner))
205205
}
206-
return &agentproto.GetNotificationBannersResponse{NotificationBanners: bannersProto}, nil
206+
return &agentproto.GetAnnouncementBannersResponse{AnnouncementBanners: bannersProto}, nil
207207
}
208208

209209
func (f *FakeAgentAPI) UpdateStats(ctx context.Context, req *agentproto.UpdateStatsRequest) (*agentproto.UpdateStatsResponse, error) {

0 commit comments

Comments
 (0)