From a8becfb7a41fc134fa88fcec2fe63d31a41d5b27 Mon Sep 17 00:00:00 2001 From: Vincent Vielle Date: Mon, 25 Nov 2024 10:11:27 +0100 Subject: [PATCH] fix: improve log on provisioner daemon started with pk (#15588) Resolve #15126 This PR aims to fetch the provisioned key details when starting a provisioned daemon - for now in order to access the tags associated to the provisioned key and display them accordingly in the starting logs. We do not want to change any other logic inside this PR as it was already working as expected. --- enterprise/cli/provisionerdaemonstart.go | 20 +++++- enterprise/cli/provisionerdaemonstart_test.go | 67 +++++++++++++++++++ 2 files changed, 85 insertions(+), 2 deletions(-) diff --git a/enterprise/cli/provisionerdaemonstart.go b/enterprise/cli/provisionerdaemonstart.go index be7a11b6e3..3c3f1f0712 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 763ac49b92..4829ccc38f 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()