feat: add provisioner tags to dynamic-parameters scaletest (#20435)

Since `coder exp scaletest dynamic-parameters` ends up creating template versions, provisioner tags may be required to create the template versions.

On our own scaletest clusters, we tag every provisioner, so an untagged template version won't build and won't get imported.
This commit is contained in:
Spike Curtis
2025-10-23 16:49:09 +04:00
committed by GitHub
parent e62c5db678
commit 0f342ecc04
3 changed files with 46 additions and 27 deletions
+12 -1
View File
@@ -27,6 +27,7 @@ const (
func (r *RootCmd) scaletestDynamicParameters() *serpent.Command { func (r *RootCmd) scaletestDynamicParameters() *serpent.Command {
var ( var (
templateName string templateName string
provisionerTags []string
numEvals int64 numEvals int64
tracingFlags = &scaletestTracingFlags{} tracingFlags = &scaletestTracingFlags{}
prometheusFlags = &scaletestPrometheusFlags{} prometheusFlags = &scaletestPrometheusFlags{}
@@ -56,6 +57,11 @@ func (r *RootCmd) scaletestDynamicParameters() *serpent.Command {
return xerrors.Errorf("template cannot be empty") return xerrors.Errorf("template cannot be empty")
} }
tags, err := ParseProvisionerTags(provisionerTags)
if err != nil {
return err
}
org, err := orgContext.Selected(inv, client) org, err := orgContext.Selected(inv, client)
if err != nil { if err != nil {
return err return err
@@ -99,7 +105,7 @@ func (r *RootCmd) scaletestDynamicParameters() *serpent.Command {
}() }()
tracer := tracerProvider.Tracer(scaletestTracerName) tracer := tracerProvider.Tracer(scaletestTracerName)
partitions, err := dynamicparameters.SetupPartitions(ctx, client, org.ID, templateName, numEvals, logger) partitions, err := dynamicparameters.SetupPartitions(ctx, client, org.ID, templateName, tags, numEvals, logger)
if err != nil { if err != nil {
return xerrors.Errorf("setup dynamic parameters partitions: %w", err) return xerrors.Errorf("setup dynamic parameters partitions: %w", err)
} }
@@ -160,6 +166,11 @@ func (r *RootCmd) scaletestDynamicParameters() *serpent.Command {
Default: "100", Default: "100",
Value: serpent.Int64Of(&numEvals), Value: serpent.Int64Of(&numEvals),
}, },
{
Flag: "provisioner-tag",
Description: "Specify a set of tags to target provisioner daemons.",
Value: serpent.StringArrayOf(&provisionerTags),
},
} }
orgContext.AttachOptions(cmd) orgContext.AttachOptions(cmd)
output.attach(&cmd.Options) output.attach(&cmd.Options)
+23 -19
View File
@@ -168,12 +168,13 @@ type SDKForDynamicParametersSetup interface {
// partitioner is an internal struct to hold context and arguments for partition setup // partitioner is an internal struct to hold context and arguments for partition setup
// and to provide methods for all sub-steps. // and to provide methods for all sub-steps.
type partitioner struct { type partitioner struct {
ctx context.Context ctx context.Context
client SDKForDynamicParametersSetup client SDKForDynamicParametersSetup
orgID uuid.UUID orgID uuid.UUID
templateName string templateName string
numEvals int64 provisionerTags map[string]string
logger slog.Logger numEvals int64
logger slog.Logger
// for testing // for testing
clock quartz.Clock clock quartz.Clock
@@ -181,17 +182,19 @@ type partitioner struct {
func SetupPartitions( func SetupPartitions(
ctx context.Context, client SDKForDynamicParametersSetup, ctx context.Context, client SDKForDynamicParametersSetup,
orgID uuid.UUID, templateName string, numEvals int64, orgID uuid.UUID, templateName string, provisionerTags map[string]string,
numEvals int64,
logger slog.Logger, logger slog.Logger,
) ([]Partition, error) { ) ([]Partition, error) {
p := &partitioner{ p := &partitioner{
ctx: ctx, ctx: ctx,
client: client, client: client,
orgID: orgID, orgID: orgID,
templateName: templateName, templateName: templateName,
numEvals: numEvals, provisionerTags: provisionerTags,
logger: logger, numEvals: numEvals,
clock: quartz.NewReal(), logger: logger,
clock: quartz.NewReal(),
} }
return p.run() return p.run()
} }
@@ -272,11 +275,12 @@ func (p *partitioner) createTemplateVersion(templateID uuid.UUID) (codersdk.Temp
// Create template version // Create template version
versionReq := codersdk.CreateTemplateVersionRequest{ versionReq := codersdk.CreateTemplateVersionRequest{
TemplateID: templateID, TemplateID: templateID,
FileID: uploadResp.ID, FileID: uploadResp.ID,
Message: "Initial version for scaletest dynamic parameters", Message: "Initial version for scaletest dynamic parameters",
StorageMethod: codersdk.ProvisionerStorageMethodFile, StorageMethod: codersdk.ProvisionerStorageMethodFile,
Provisioner: codersdk.ProvisionerTypeTerraform, Provisioner: codersdk.ProvisionerTypeTerraform,
ProvisionerTags: p.provisionerTags,
} }
version, err := p.client.CreateTemplateVersion(p.ctx, p.orgID, versionReq) version, err := p.client.CreateTemplateVersion(p.ctx, p.orgID, versionReq)
if err != nil { if err != nil {
@@ -70,6 +70,7 @@ func TestSetupPartitions_TemplateExists(t *testing.T) {
t: t, t: t,
expectedTemplateName: "test-template", expectedTemplateName: "test-template",
expectedOrgID: orgID, expectedOrgID: orgID,
expectedTags: map[string]string{"foo": "bar"},
matchedProvisioners: 1, matchedProvisioners: 1,
templateVersionJobStatus: codersdk.ProvisionerJobSucceeded, templateVersionJobStatus: codersdk.ProvisionerJobSucceeded,
} }
@@ -77,13 +78,14 @@ func TestSetupPartitions_TemplateExists(t *testing.T) {
trap := mClock.Trap().TickerFunc("waitForTemplateVersionJobs") trap := mClock.Trap().TickerFunc("waitForTemplateVersionJobs")
defer trap.Close() defer trap.Close()
uut := partitioner{ uut := partitioner{
ctx: ctx, ctx: ctx,
client: fClient, client: fClient,
orgID: orgID, orgID: orgID,
templateName: "test-template", templateName: "test-template",
numEvals: 600, provisionerTags: map[string]string{"foo": "bar"},
logger: logger, numEvals: 600,
clock: mClock, logger: logger,
clock: mClock,
} }
var partitions []Partition var partitions []Partition
errCh := make(chan error, 1) errCh := make(chan error, 1)
@@ -234,6 +236,7 @@ type fakeClient struct {
expectedOrgID uuid.UUID expectedOrgID uuid.UUID
templateByNameError error templateByNameError error
expectedTags map[string]string
matchedProvisioners int matchedProvisioners int
templateVersionJobStatus codersdk.ProvisionerJobStatus templateVersionJobStatus codersdk.ProvisionerJobStatus
@@ -270,6 +273,7 @@ func (f *fakeClient) CreateTemplate(ctx context.Context, orgID uuid.UUID, create
func (f *fakeClient) CreateTemplateVersion(ctx context.Context, orgID uuid.UUID, createReq codersdk.CreateTemplateVersionRequest) (codersdk.TemplateVersion, error) { func (f *fakeClient) CreateTemplateVersion(ctx context.Context, orgID uuid.UUID, createReq codersdk.CreateTemplateVersionRequest) (codersdk.TemplateVersion, error) {
f.templateVersionsCount++ f.templateVersionsCount++
require.Equal(f.t, f.expectedTags, createReq.ProvisionerTags)
return codersdk.TemplateVersion{ return codersdk.TemplateVersion{
ID: uuid.New(), ID: uuid.New(),
Name: f.expectedTemplateName, Name: f.expectedTemplateName,