mirror of
https://github.com/coder/coder.git
synced 2026-06-02 20:48:20 +00:00
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:
@@ -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)
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user