5
5
"encoding/json"
6
6
"fmt"
7
7
"io"
8
+ "math/rand"
8
9
"net/http"
9
10
"os"
10
11
"strconv"
@@ -1046,9 +1047,10 @@ func (r *RootCmd) scaletestWorkspaceTraffic() *clibase.Cmd {
1046
1047
1047
1048
func (r * RootCmd ) scaletestDashboard () * clibase.Cmd {
1048
1049
var (
1049
- count int64
1050
- minWait time.Duration
1051
- maxWait time.Duration
1050
+ interval time.Duration
1051
+ jitter time.Duration
1052
+ headless bool
1053
+ randSeed int64
1052
1054
1053
1055
client = & codersdk.Client {}
1054
1056
tracingFlags = & scaletestTracingFlags {}
@@ -1065,6 +1067,12 @@ func (r *RootCmd) scaletestDashboard() *clibase.Cmd {
1065
1067
r .InitClient (client ),
1066
1068
),
1067
1069
Handler : func (inv * clibase.Invocation ) error {
1070
+ if ! (interval > 0 ) {
1071
+ return xerrors .Errorf ("--interval must be greater than zero" )
1072
+ }
1073
+ if ! (jitter < interval ) {
1074
+ return xerrors .Errorf ("--jitter must be less than --interval" )
1075
+ }
1068
1076
ctx := inv .Context ()
1069
1077
logger := slog .Make (sloghuman .Sink (inv .Stdout )).Leveled (slog .LevelInfo )
1070
1078
tracerProvider , closeTracing , tracingEnabled , err := tracingFlags .provider (ctx )
@@ -1094,19 +1102,42 @@ func (r *RootCmd) scaletestDashboard() *clibase.Cmd {
1094
1102
1095
1103
th := harness .NewTestHarness (strategy .toStrategy (), cleanupStrategy .toStrategy ())
1096
1104
1097
- for i := int64 (0 ); i < count ; i ++ {
1098
- name := fmt .Sprintf ("dashboard-%d" , i )
1105
+ users , err := getScaletestUsers (ctx , client )
1106
+ if err != nil {
1107
+ return xerrors .Errorf ("get scaletest users" )
1108
+ }
1109
+
1110
+ for _ , usr := range users {
1111
+ //nolint:gosec // not used for cryptographic purposes
1112
+ rndGen := rand .New (rand .NewSource (randSeed ))
1113
+ name := fmt .Sprintf ("dashboard-%s" , usr .Username )
1114
+ userTokResp , err := client .CreateToken (ctx , usr .ID .String (), codersdk.CreateTokenRequest {
1115
+ Lifetime : 30 * 24 * time .Hour ,
1116
+ Scope : "" ,
1117
+ TokenName : fmt .Sprintf ("scaletest-%d" , time .Now ().Unix ()),
1118
+ })
1119
+ if err != nil {
1120
+ return xerrors .Errorf ("create token for user: %w" , err )
1121
+ }
1122
+
1123
+ userClient := codersdk .New (client .URL )
1124
+ userClient .SetSessionToken (userTokResp .Key )
1125
+
1099
1126
config := dashboard.Config {
1100
- MinWait : minWait ,
1101
- MaxWait : maxWait ,
1102
- Trace : tracingEnabled ,
1103
- Logger : logger .Named (name ),
1104
- RollTable : dashboard .DefaultActions ,
1127
+ Interval : interval ,
1128
+ Jitter : jitter ,
1129
+ Trace : tracingEnabled ,
1130
+ Logger : logger .Named (name ),
1131
+ Headless : headless ,
1132
+ ActionFunc : dashboard .ClickRandomElement ,
1133
+ RandIntn : rndGen .Intn ,
1105
1134
}
1135
+ //nolint:gocritic
1136
+ logger .Info (ctx , "runner config" , slog .F ("min_wait" , interval ), slog .F ("max_wait" , jitter ), slog .F ("headless" , headless ), slog .F ("trace" , tracingEnabled ))
1106
1137
if err := config .Validate (); err != nil {
1107
1138
return err
1108
1139
}
1109
- var runner harness.Runnable = dashboard .NewRunner (client , metrics , config )
1140
+ var runner harness.Runnable = dashboard .NewRunner (userClient , metrics , config )
1110
1141
if tracingEnabled {
1111
1142
runner = & runnableTraceWrapper {
1112
1143
tracer : tracer ,
@@ -1143,25 +1174,32 @@ func (r *RootCmd) scaletestDashboard() *clibase.Cmd {
1143
1174
1144
1175
cmd .Options = []clibase.Option {
1145
1176
{
1146
- Flag : "count " ,
1147
- Env : "CODER_SCALETEST_DASHBOARD_COUNT " ,
1148
- Default : "1 " ,
1149
- Description : "Number of concurrent workers ." ,
1150
- Value : clibase .Int64Of ( & count ),
1177
+ Flag : "interval " ,
1178
+ Env : "CODER_SCALETEST_DASHBOARD_INTERVAL " ,
1179
+ Default : "3s " ,
1180
+ Description : "Interval between actions ." ,
1181
+ Value : clibase .DurationOf ( & interval ),
1151
1182
},
1152
1183
{
1153
- Flag : "min-wait " ,
1154
- Env : "CODER_SCALETEST_DASHBOARD_MIN_WAIT " ,
1155
- Default : "100ms " ,
1156
- Description : "Minimum wait between fetches ." ,
1157
- Value : clibase .DurationOf (& minWait ),
1184
+ Flag : "jitter " ,
1185
+ Env : "CODER_SCALETEST_DASHBOARD_JITTER " ,
1186
+ Default : "2s " ,
1187
+ Description : "Jitter between actions ." ,
1188
+ Value : clibase .DurationOf (& jitter ),
1158
1189
},
1159
1190
{
1160
- Flag : "max-wait" ,
1161
- Env : "CODER_SCALETEST_DASHBOARD_MAX_WAIT" ,
1162
- Default : "1s" ,
1163
- Description : "Maximum wait between fetches." ,
1164
- Value : clibase .DurationOf (& maxWait ),
1191
+ Flag : "headless" ,
1192
+ Env : "CODER_SCALETEST_DASHBOARD_HEADLESS" ,
1193
+ Default : "true" ,
1194
+ Description : "Controls headless mode. Setting to false is useful for debugging." ,
1195
+ Value : clibase .BoolOf (& headless ),
1196
+ },
1197
+ {
1198
+ Flag : "rand-seed" ,
1199
+ Env : "CODER_SCALETEST_DASHBOARD_RAND_SEED" ,
1200
+ Default : "0" ,
1201
+ Description : "Seed for the random number generator." ,
1202
+ Value : clibase .Int64Of (& randSeed ),
1165
1203
},
1166
1204
}
1167
1205
0 commit comments