diff --git a/enterprise/cli/provisionerdaemonstart.go b/enterprise/cli/provisionerdaemonstart.go index be7a11b6e363b..3c3f1f0712800 100644 --- a/enterprise/cli/provisionerdaemonstart.go +++ b/enterprise/cli/provisionerdaemonstart.go @@ -104,6 +104,22 @@ func (r *RootCmd) provisionerDaemonStart() *serpent.Command { return err } + displayedTags := make(map[string]string, len(tags)) + if provisionerKey != "" { + pkDetails, err := client.GetProvisionerKey(ctx, provisionerKey) + if err != nil { + return xerrors.New("unable to get provisioner key details") + } + + for k, v := range pkDetails.Tags { + displayedTags[k] = v + } + } else { + for key, val := range tags { + displayedTags[key] = val + } + } + if name == "" { name = cliutil.Hostname() } @@ -131,7 +147,7 @@ func (r *RootCmd) provisionerDaemonStart() *serpent.Command { defer closeLogger() } - if len(tags) == 0 { + if len(displayedTags) == 0 { logger.Info(ctx, "note: untagged provisioners can only pick up jobs from untagged templates") } @@ -202,7 +218,7 @@ func (r *RootCmd) provisionerDaemonStart() *serpent.Command { defer closeFunc() } - logger.Info(ctx, "starting provisioner daemon", slog.F("tags", tags), slog.F("name", name)) + logger.Info(ctx, "starting provisioner daemon", slog.F("tags", displayedTags), slog.F("name", name)) connector := provisionerd.LocalProvisioners{ string(database.ProvisionerTypeTerraform): proto.NewDRPCProvisionerClient(terraformClient), diff --git a/enterprise/cli/provisionerdaemonstart_test.go b/enterprise/cli/provisionerdaemonstart_test.go index 763ac49b92996..4829ccc38f23d 100644 --- a/enterprise/cli/provisionerdaemonstart_test.go +++ b/enterprise/cli/provisionerdaemonstart_test.go @@ -294,6 +294,73 @@ func TestProvisionerDaemon_ProvisionerKey(t *testing.T) { require.Equal(t, proto.CurrentVersion.String(), daemons[0].APIVersion) }) + t.Run("OKWithTags", func(t *testing.T) { + t.Parallel() + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + client, user := coderdenttest.New(t, &coderdenttest.Options{ + ProvisionerDaemonPSK: "provisionersftw", + LicenseOptions: &coderdenttest.LicenseOptions{ + Features: license.Features{ + codersdk.FeatureExternalProvisionerDaemons: 1, + codersdk.FeatureMultipleOrganizations: 1, + }, + }, + }) + //nolint:gocritic // ignore This client is operating as the owner user, which has unrestricted permissions + res, err := client.CreateProvisionerKey(ctx, user.OrganizationID, codersdk.CreateProvisionerKeyRequest{ + Name: "dont-TEST-me", + Tags: map[string]string{ + "tag1": "value1", + "tag2": "value2", + }, + }) + require.NoError(t, err) + inv, conf := newCLI(t, "provisionerd", "start", "--key", res.Key, "--name=matt-daemon") + err = conf.URL().Write(client.URL.String()) + require.NoError(t, err) + pty := ptytest.New(t).Attach(inv) + clitest.Start(t, inv) + pty.ExpectNoMatchBefore(ctx, "check entitlement", "starting provisioner daemon") + pty.ExpectMatchContext(ctx, `tags={"tag1":"value1","tag2":"value2"}`) + + var daemons []codersdk.ProvisionerDaemon + require.Eventually(t, func() bool { + daemons, err = client.OrganizationProvisionerDaemons(ctx, user.OrganizationID, nil) + if err != nil { + return false + } + return len(daemons) == 1 + }, testutil.WaitShort, testutil.IntervalSlow) + require.Equal(t, "matt-daemon", daemons[0].Name) + require.Equal(t, provisionersdk.ScopeOrganization, daemons[0].Tags[provisionersdk.TagScope]) + require.Equal(t, buildinfo.Version(), daemons[0].Version) + require.Equal(t, proto.CurrentVersion.String(), daemons[0].APIVersion) + }) + + t.Run("NoProvisionerKeyFound", func(t *testing.T) { + t.Parallel() + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + client, _ := coderdenttest.New(t, &coderdenttest.Options{ + ProvisionerDaemonPSK: "provisionersftw", + LicenseOptions: &coderdenttest.LicenseOptions{ + Features: license.Features{ + codersdk.FeatureExternalProvisionerDaemons: 1, + codersdk.FeatureMultipleOrganizations: 1, + }, + }, + }) + + inv, conf := newCLI(t, "provisionerd", "start", "--key", "ThisKeyDoesNotExist", "--name=matt-daemon") + err := conf.URL().Write(client.URL.String()) + require.NoError(t, err) + err = inv.WithContext(ctx).Run() + require.ErrorContains(t, err, "unable to get provisioner key details") + }) + t.Run("NoPSK", func(t *testing.T) { t.Parallel()