Skip to content

Commit 1ea2fbf

Browse files
authored
Merge branch 'main' into dependabot/npm_and_yarn/site/typescript-5.2.2
2 parents e1a5d28 + aa8652c commit 1ea2fbf

File tree

10 files changed

+305
-163
lines changed

10 files changed

+305
-163
lines changed

cli/exp_scaletest_test.go

+17-8
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import (
77

88
"github.com/stretchr/testify/require"
99

10+
"cdr.dev/slog/sloggers/slogtest"
11+
1012
"github.com/coder/coder/v2/cli/clitest"
1113
"github.com/coder/coder/v2/coderd/coderdtest"
1214
"github.com/coder/coder/v2/pty/ptytest"
@@ -21,7 +23,12 @@ func TestScaleTestCreateWorkspaces(t *testing.T) {
2123
ctx, cancelFunc := context.WithTimeout(context.Background(), testutil.WaitLong)
2224
defer cancelFunc()
2325

24-
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
26+
log := slogtest.Make(t, &slogtest.Options{IgnoreErrors: true})
27+
client := coderdtest.New(t, &coderdtest.Options{
28+
// We are not including any provisioner daemons because we do not actually
29+
// build any workspaces here.
30+
Logger: &log,
31+
})
2532
_ = coderdtest.CreateFirstUser(t, client)
2633

2734
// Write a parameters file.
@@ -59,7 +66,10 @@ func TestScaleTestWorkspaceTraffic(t *testing.T) {
5966
ctx, cancelFunc := context.WithTimeout(context.Background(), testutil.WaitMedium)
6067
defer cancelFunc()
6168

62-
client := coderdtest.New(t, nil)
69+
log := slogtest.Make(t, &slogtest.Options{IgnoreErrors: true})
70+
client := coderdtest.New(t, &coderdtest.Options{
71+
Logger: &log,
72+
})
6373
_ = coderdtest.CreateFirstUser(t, client)
6474

6575
inv, root := clitest.New(t, "exp", "scaletest", "workspace-traffic",
@@ -82,21 +92,20 @@ func TestScaleTestWorkspaceTraffic(t *testing.T) {
8292
// This test just validates that the CLI command accepts its known arguments.
8393
func TestScaleTestDashboard(t *testing.T) {
8494
t.Parallel()
85-
if testutil.RaceEnabled() {
86-
t.Skip("Flakes under race detector, see https://github.com/coder/coder/issues/9168")
87-
}
88-
8995
ctx, cancelFunc := context.WithTimeout(context.Background(), testutil.WaitMedium)
9096
defer cancelFunc()
9197

92-
client := coderdtest.New(t, nil)
98+
log := slogtest.Make(t, &slogtest.Options{IgnoreErrors: true})
99+
client := coderdtest.New(t, &coderdtest.Options{
100+
Logger: &log,
101+
})
93102
_ = coderdtest.CreateFirstUser(t, client)
94103

95104
inv, root := clitest.New(t, "exp", "scaletest", "dashboard",
96105
"--count", "1",
97106
"--min-wait", "100ms",
98107
"--max-wait", "1s",
99-
"--timeout", "1s",
108+
"--timeout", "5s",
100109
"--scaletest-prometheus-address", "127.0.0.1:0",
101110
"--scaletest-prometheus-wait", "0s",
102111
)

coderd/database/dbtestutil/db.go

+7-8
Original file line numberDiff line numberDiff line change
@@ -197,16 +197,15 @@ func pgDump(dbURL string) ([]byte, error) {
197197
return stdout.Bytes(), nil
198198
}
199199

200+
// Unfortunately, some insert expressions span multiple lines.
201+
// The below may be over-permissive but better that than truncating data.
202+
var insertExpr = regexp.MustCompile(`(?s)\bINSERT[^;]+;`)
203+
200204
func filterDump(dump []byte) []byte {
201-
lines := bytes.Split(dump, []byte{'\n'})
202205
var buf bytes.Buffer
203-
for _, line := range lines {
204-
// We dump in column-insert format, so these are the only lines
205-
// we care about
206-
if !bytes.HasPrefix(line, []byte("INSERT")) {
207-
continue
208-
}
209-
_, _ = buf.Write(line)
206+
matches := insertExpr.FindAll(dump, -1)
207+
for _, m := range matches {
208+
_, _ = buf.Write(m)
210209
_, _ = buf.WriteRune('\n')
211210
}
212211
return buf.Bytes()

provisionerd/provisionerd_test.go

+37-19
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func TestProvisionerd(t *testing.T) {
5959
close(done)
6060
})
6161
closer := createProvisionerd(t, func(ctx context.Context) (proto.DRPCProvisionerDaemonClient, error) {
62-
return createProvisionerDaemonClient(t, done, provisionerDaemonTestServer{}), nil
62+
return createProvisionerDaemonClient(ctx, t, done, provisionerDaemonTestServer{}), nil
6363
}, provisionerd.LocalProvisioners{})
6464
require.NoError(t, closer.Close())
6565
})
@@ -91,7 +91,7 @@ func TestProvisionerd(t *testing.T) {
9191
completeChan := make(chan struct{})
9292
closer := createProvisionerd(t, func(ctx context.Context) (proto.DRPCProvisionerDaemonClient, error) {
9393
acquireJobAttempt := 0
94-
return createProvisionerDaemonClient(t, done, provisionerDaemonTestServer{
94+
return createProvisionerDaemonClient(ctx, t, done, provisionerDaemonTestServer{
9595
acquireJob: func(ctx context.Context, _ *proto.Empty) (*proto.AcquiredJob, error) {
9696
if acquireJobAttempt == 1 {
9797
close(completeChan)
@@ -118,7 +118,7 @@ func TestProvisionerd(t *testing.T) {
118118
var closerMutex sync.Mutex
119119
closerMutex.Lock()
120120
closer = createProvisionerd(t, func(ctx context.Context) (proto.DRPCProvisionerDaemonClient, error) {
121-
return createProvisionerDaemonClient(t, done, provisionerDaemonTestServer{
121+
return createProvisionerDaemonClient(ctx, t, done, provisionerDaemonTestServer{
122122
acquireJob: func(ctx context.Context, _ *proto.Empty) (*proto.AcquiredJob, error) {
123123
return &proto.AcquiredJob{
124124
JobId: "test",
@@ -174,7 +174,7 @@ func TestProvisionerd(t *testing.T) {
174174
)
175175

176176
closer := createProvisionerd(t, func(ctx context.Context) (proto.DRPCProvisionerDaemonClient, error) {
177-
return createProvisionerDaemonClient(t, done, provisionerDaemonTestServer{
177+
return createProvisionerDaemonClient(ctx, t, done, provisionerDaemonTestServer{
178178
acquireJob: func(ctx context.Context, _ *proto.Empty) (*proto.AcquiredJob, error) {
179179
return &proto.AcquiredJob{
180180
JobId: "test",
@@ -214,7 +214,7 @@ func TestProvisionerd(t *testing.T) {
214214
)
215215

216216
closer := createProvisionerd(t, func(ctx context.Context) (proto.DRPCProvisionerDaemonClient, error) {
217-
return createProvisionerDaemonClient(t, done, provisionerDaemonTestServer{
217+
return createProvisionerDaemonClient(ctx, t, done, provisionerDaemonTestServer{
218218
acquireJob: func(ctx context.Context, _ *proto.Empty) (*proto.AcquiredJob, error) {
219219
return &proto.AcquiredJob{
220220
JobId: "test",
@@ -269,7 +269,7 @@ func TestProvisionerd(t *testing.T) {
269269
)
270270

271271
closer := createProvisionerd(t, func(ctx context.Context) (proto.DRPCProvisionerDaemonClient, error) {
272-
return createProvisionerDaemonClient(t, done, provisionerDaemonTestServer{
272+
return createProvisionerDaemonClient(ctx, t, done, provisionerDaemonTestServer{
273273
acquireJob: func(ctx context.Context, _ *proto.Empty) (*proto.AcquiredJob, error) {
274274
if !didAcquireJob.CAS(false, true) {
275275
completeOnce.Do(func() { close(completeChan) })
@@ -361,7 +361,7 @@ func TestProvisionerd(t *testing.T) {
361361
)
362362

363363
closer := createProvisionerd(t, func(ctx context.Context) (proto.DRPCProvisionerDaemonClient, error) {
364-
return createProvisionerDaemonClient(t, done, provisionerDaemonTestServer{
364+
return createProvisionerDaemonClient(ctx, t, done, provisionerDaemonTestServer{
365365
acquireJob: func(ctx context.Context, _ *proto.Empty) (*proto.AcquiredJob, error) {
366366
if !didAcquireJob.CAS(false, true) {
367367
completeOnce.Do(func() { close(completeChan) })
@@ -441,7 +441,7 @@ func TestProvisionerd(t *testing.T) {
441441
)
442442

443443
closer := createProvisionerd(t, func(ctx context.Context) (proto.DRPCProvisionerDaemonClient, error) {
444-
return createProvisionerDaemonClient(t, done, provisionerDaemonTestServer{
444+
return createProvisionerDaemonClient(ctx, t, done, provisionerDaemonTestServer{
445445
acquireJob: func(ctx context.Context, _ *proto.Empty) (*proto.AcquiredJob, error) {
446446
if !didAcquireJob.CAS(false, true) {
447447
completeOnce.Do(func() { close(completeChan) })
@@ -513,7 +513,7 @@ func TestProvisionerd(t *testing.T) {
513513
)
514514

515515
closer := createProvisionerd(t, func(ctx context.Context) (proto.DRPCProvisionerDaemonClient, error) {
516-
return createProvisionerDaemonClient(t, done, provisionerDaemonTestServer{
516+
return createProvisionerDaemonClient(ctx, t, done, provisionerDaemonTestServer{
517517
acquireJob: func(ctx context.Context, _ *proto.Empty) (*proto.AcquiredJob, error) {
518518
if !didAcquireJob.CAS(false, true) {
519519
completeOnce.Do(func() { close(completeChan) })
@@ -612,7 +612,7 @@ func TestProvisionerd(t *testing.T) {
612612
)
613613

614614
closer := createProvisionerd(t, func(ctx context.Context) (proto.DRPCProvisionerDaemonClient, error) {
615-
return createProvisionerDaemonClient(t, done, provisionerDaemonTestServer{
615+
return createProvisionerDaemonClient(ctx, t, done, provisionerDaemonTestServer{
616616
acquireJob: func(ctx context.Context, _ *proto.Empty) (*proto.AcquiredJob, error) {
617617
if !didAcquireJob.CAS(false, true) {
618618
completeOnce.Do(func() { close(completeChan) })
@@ -677,7 +677,7 @@ func TestProvisionerd(t *testing.T) {
677677
updateChan := make(chan struct{})
678678
completeChan := make(chan struct{})
679679
server := createProvisionerd(t, func(ctx context.Context) (proto.DRPCProvisionerDaemonClient, error) {
680-
return createProvisionerDaemonClient(t, done, provisionerDaemonTestServer{
680+
return createProvisionerDaemonClient(ctx, t, done, provisionerDaemonTestServer{
681681
acquireJob: func(ctx context.Context, _ *proto.Empty) (*proto.AcquiredJob, error) {
682682
return &proto.AcquiredJob{
683683
JobId: "test",
@@ -755,7 +755,7 @@ func TestProvisionerd(t *testing.T) {
755755
updateChan := make(chan struct{})
756756
completeChan := make(chan struct{})
757757
server := createProvisionerd(t, func(ctx context.Context) (proto.DRPCProvisionerDaemonClient, error) {
758-
return createProvisionerDaemonClient(t, done, provisionerDaemonTestServer{
758+
return createProvisionerDaemonClient(ctx, t, done, provisionerDaemonTestServer{
759759
acquireJob: func(ctx context.Context, _ *proto.Empty) (*proto.AcquiredJob, error) {
760760
return &proto.AcquiredJob{
761761
JobId: "test",
@@ -844,7 +844,7 @@ func TestProvisionerd(t *testing.T) {
844844
completeOnce sync.Once
845845
)
846846
server := createProvisionerd(t, func(ctx context.Context) (proto.DRPCProvisionerDaemonClient, error) {
847-
client := createProvisionerDaemonClient(t, done, provisionerDaemonTestServer{
847+
client := createProvisionerDaemonClient(ctx, t, done, provisionerDaemonTestServer{
848848
acquireJob: func(ctx context.Context, _ *proto.Empty) (*proto.AcquiredJob, error) {
849849
if second.Load() {
850850
return &proto.AcquiredJob{}, nil
@@ -927,7 +927,7 @@ func TestProvisionerd(t *testing.T) {
927927
completeOnce sync.Once
928928
)
929929
server := createProvisionerd(t, func(ctx context.Context) (proto.DRPCProvisionerDaemonClient, error) {
930-
client := createProvisionerDaemonClient(t, done, provisionerDaemonTestServer{
930+
client := createProvisionerDaemonClient(ctx, t, done, provisionerDaemonTestServer{
931931
acquireJob: func(ctx context.Context, _ *proto.Empty) (*proto.AcquiredJob, error) {
932932
if second.Load() {
933933
completeOnce.Do(func() { close(completeChan) })
@@ -1006,7 +1006,7 @@ func TestProvisionerd(t *testing.T) {
10061006
completeOnce := sync.Once{}
10071007

10081008
server := createProvisionerd(t, func(ctx context.Context) (proto.DRPCProvisionerDaemonClient, error) {
1009-
return createProvisionerDaemonClient(t, done, provisionerDaemonTestServer{
1009+
return createProvisionerDaemonClient(ctx, t, done, provisionerDaemonTestServer{
10101010
acquireJob: func(ctx context.Context, _ *proto.Empty) (*proto.AcquiredJob, error) {
10111011
m.Lock()
10121012
defer m.Unlock()
@@ -1118,7 +1118,7 @@ func createProvisionerd(t *testing.T, dialer provisionerd.Dialer, connector prov
11181118

11191119
// Creates a provisionerd protobuf client that's connected
11201120
// to the server implementation provided.
1121-
func createProvisionerDaemonClient(t *testing.T, done <-chan struct{}, server provisionerDaemonTestServer) proto.DRPCProvisionerDaemonClient {
1121+
func createProvisionerDaemonClient(ctx context.Context, t *testing.T, done <-chan struct{}, server provisionerDaemonTestServer) proto.DRPCProvisionerDaemonClient {
11221122
t.Helper()
11231123
if server.failJob == nil {
11241124
// Default to asserting the error from the failure, otherwise
@@ -1137,7 +1137,7 @@ func createProvisionerDaemonClient(t *testing.T, done <-chan struct{}, server pr
11371137
err := proto.DRPCRegisterProvisionerDaemon(mux, &server)
11381138
require.NoError(t, err)
11391139
srv := drpcserver.New(mux)
1140-
ctx, cancelFunc := context.WithCancel(context.Background())
1140+
ctx, cancelFunc := context.WithCancel(ctx)
11411141
closed := make(chan struct{})
11421142
go func() {
11431143
defer close(closed)
@@ -1148,13 +1148,31 @@ func createProvisionerDaemonClient(t *testing.T, done <-chan struct{}, server pr
11481148
<-closed
11491149
select {
11501150
case <-done:
1151-
t.Error("createProvisionerDaemonClient cleanup after test was done!")
1151+
// It's possible to get unlucky since the dialer is run in a retry in a goroutine.
1152+
// The following can occur:
1153+
// 1. The provisionerd.connect goroutine checks if we're closed prior to attempting to establish a connection
1154+
// with coderd, sees that we're not.
1155+
// 2. A test closes the server.
1156+
// 3. The provisionerd.connect goroutine calls the dialer to establish a connection. This
1157+
// function detects that someone has tried to create a client after the test finishes.
1158+
if ctx.Err() == nil {
1159+
t.Error("createProvisionerDaemonClient cleanup after test was done!")
1160+
}
11521161
default:
11531162
}
11541163
})
11551164
select {
11561165
case <-done:
1157-
t.Error("called createProvisionerDaemonClient after test was done!")
1166+
// It's possible to get unlucky since the dialer is run in a retry in a goroutine.
1167+
// The following can occur:
1168+
// 1. The provisionerd.connect goroutine checks if we're closed prior to attempting to establish a connection
1169+
// with coderd, sees that we're not.
1170+
// 2. A test closes the server.
1171+
// 3. The provisionerd.connect goroutine calls the dialer to establish a connection. This
1172+
// function detects that someone has tried to create a client after the test finishes.
1173+
if ctx.Err() == nil {
1174+
t.Error("createProvisionerDaemonClient cleanup after test was done!")
1175+
}
11581176
default:
11591177
}
11601178
return proto.NewDRPCProvisionerDaemonClient(clientPipe)

site/src/components/DAUChart/DAUChart.tsx

+17-13
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@ import {
77
Chart as ChartJS,
88
ChartOptions,
99
defaults,
10+
Filler,
1011
Legend,
1112
LinearScale,
12-
BarElement,
13+
LineElement,
1314
TimeScale,
1415
Title,
1516
Tooltip,
17+
PointElement,
1618
} from "chart.js";
1719
import "chartjs-adapter-date-fns";
1820
import {
@@ -22,13 +24,15 @@ import {
2224
} from "components/HelpTooltip/HelpTooltip";
2325
import dayjs from "dayjs";
2426
import { FC } from "react";
25-
import { Bar } from "react-chartjs-2";
27+
import { Line } from "react-chartjs-2";
2628

2729
ChartJS.register(
2830
CategoryScale,
2931
LinearScale,
3032
TimeScale,
31-
BarElement,
33+
LineElement,
34+
PointElement,
35+
Filler,
3236
Title,
3337
Tooltip,
3438
Legend,
@@ -52,7 +56,7 @@ export const DAUChart: FC<DAUChartProps> = ({ daus }) => {
5256
defaults.font.family = theme.typography.fontFamily as string;
5357
defaults.color = theme.palette.text.secondary;
5458

55-
const options: ChartOptions<"bar"> = {
59+
const options: ChartOptions<"line"> = {
5660
responsive: true,
5761
plugins: {
5862
legend: {
@@ -70,11 +74,12 @@ export const DAUChart: FC<DAUChartProps> = ({ daus }) => {
7074
},
7175
scales: {
7276
y: {
73-
min: 0,
77+
suggestedMin: 0,
7478
ticks: {
7579
precision: 0,
7680
},
7781
},
82+
7883
x: {
7984
ticks: {
8085
stepSize: daus.entries.length > 10 ? 2 : undefined,
@@ -89,20 +94,19 @@ export const DAUChart: FC<DAUChartProps> = ({ daus }) => {
8994
};
9095

9196
return (
92-
<Bar
97+
<Line
9398
data-chromatic="ignore"
9499
data={{
95100
labels: labels,
96101
datasets: [
97102
{
98103
label: "Daily Active Users",
99104
data: data,
100-
backgroundColor: theme.palette.secondary.dark,
101-
borderColor: theme.palette.secondary.dark,
102-
barThickness: 8,
103-
borderWidth: 2,
104-
borderRadius: Number.MAX_VALUE,
105-
borderSkipped: false,
105+
pointBackgroundColor: theme.palette.info.light,
106+
pointBorderColor: theme.palette.info.light,
107+
borderColor: theme.palette.info.light,
108+
backgroundColor: theme.palette.info.dark,
109+
fill: "origin",
106110
},
107111
],
108112
}}
@@ -120,7 +124,7 @@ export const DAUTitle = () => {
120124
How do we calculate daily active users?
121125
</HelpTooltipTitle>
122126
<HelpTooltipText>
123-
When a connection is initiated to a user{"'"}s workspace they are
127+
When a connection is initiated to a user&apos;s workspace they are
124128
considered a daily active user. e.g. apps, web terminal, SSH
125129
</HelpTooltipText>
126130
</HelpTooltip>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { InfoTooltip } from "./InfoTooltip";
2+
import type { Meta, StoryObj } from "@storybook/react";
3+
4+
const meta: Meta<typeof InfoTooltip> = {
5+
title: "components/InfoTooltip",
6+
component: InfoTooltip,
7+
args: {
8+
type: "info",
9+
title: "Hello, friend!",
10+
message: "Today is a lovely day :^)",
11+
},
12+
};
13+
14+
export default meta;
15+
type Story = StoryObj<typeof InfoTooltip>;
16+
17+
export const Example: Story = {};
18+
export const Warning: Story = {
19+
args: {
20+
type: "warning",
21+
message: "Unfortunately, there's a radio connected to my brain",
22+
},
23+
};

0 commit comments

Comments
 (0)