mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
feat(cli): allow specifying name of provisioner daemon (#11077)
- Adds a --name argument to provisionerd start - Plumbs through name to integrated and external provisioners - Defaults to hostname if not specified for external, hostname-N for integrated - Adds cliutil.Hostname
This commit is contained in:
@@ -6,6 +6,7 @@ import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"regexp"
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
@@ -16,6 +17,7 @@ import (
|
||||
agpl "github.com/coder/coder/v2/cli"
|
||||
"github.com/coder/coder/v2/cli/clibase"
|
||||
"github.com/coder/coder/v2/cli/cliui"
|
||||
"github.com/coder/coder/v2/cli/cliutil"
|
||||
"github.com/coder/coder/v2/coderd/database"
|
||||
"github.com/coder/coder/v2/coderd/provisionerdserver"
|
||||
"github.com/coder/coder/v2/codersdk"
|
||||
@@ -41,6 +43,16 @@ func (r *RootCmd) provisionerDaemons() *clibase.Cmd {
|
||||
return cmd
|
||||
}
|
||||
|
||||
func validateProvisionerDaemonName(name string) error {
|
||||
if len(name) > 64 {
|
||||
return xerrors.Errorf("name cannot be greater than 64 characters in length")
|
||||
}
|
||||
if ok, err := regexp.MatchString(`^[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]$`, name); err != nil || !ok {
|
||||
return xerrors.Errorf("name %q is not a valid hostname", name)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *RootCmd) provisionerDaemonStart() *clibase.Cmd {
|
||||
var (
|
||||
cacheDir string
|
||||
@@ -48,6 +60,7 @@ func (r *RootCmd) provisionerDaemonStart() *clibase.Cmd {
|
||||
pollInterval time.Duration
|
||||
pollJitter time.Duration
|
||||
preSharedKey string
|
||||
name string
|
||||
)
|
||||
client := new(codersdk.Client)
|
||||
cmd := &clibase.Cmd{
|
||||
@@ -68,6 +81,14 @@ func (r *RootCmd) provisionerDaemonStart() *clibase.Cmd {
|
||||
return err
|
||||
}
|
||||
|
||||
if name == "" {
|
||||
name = cliutil.Hostname()
|
||||
}
|
||||
|
||||
if err := validateProvisionerDaemonName(name); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
logger := slog.Make(sloghuman.Sink(inv.Stderr))
|
||||
if ok, _ := inv.ParsedFlags().GetBool("verbose"); ok {
|
||||
logger = logger.Leveled(slog.LevelDebug)
|
||||
@@ -122,7 +143,7 @@ func (r *RootCmd) provisionerDaemonStart() *clibase.Cmd {
|
||||
}
|
||||
}()
|
||||
|
||||
logger.Info(ctx, "starting provisioner daemon", slog.F("tags", tags))
|
||||
logger.Info(ctx, "starting provisioner daemon", slog.F("tags", tags), slog.F("name", name))
|
||||
|
||||
connector := provisionerd.LocalProvisioners{
|
||||
string(database.ProvisionerTypeTerraform): proto.NewDRPCProvisionerClient(terraformClient),
|
||||
@@ -130,7 +151,8 @@ func (r *RootCmd) provisionerDaemonStart() *clibase.Cmd {
|
||||
id := uuid.New()
|
||||
srv := provisionerd.New(func(ctx context.Context) (provisionerdproto.DRPCProvisionerDaemonClient, error) {
|
||||
return client.ServeProvisionerDaemon(ctx, codersdk.ServeProvisionerDaemonRequest{
|
||||
ID: id,
|
||||
ID: id,
|
||||
Name: name,
|
||||
Provisioners: []codersdk.ProvisionerType{
|
||||
codersdk.ProvisionerTypeTerraform,
|
||||
},
|
||||
@@ -205,6 +227,13 @@ func (r *RootCmd) provisionerDaemonStart() *clibase.Cmd {
|
||||
Description: "Pre-shared key to authenticate with Coder server.",
|
||||
Value: clibase.StringOf(&preSharedKey),
|
||||
},
|
||||
{
|
||||
Flag: "name",
|
||||
Env: "CODER_PROVISIONER_DAEMON_NAME",
|
||||
Description: "Name of this provisioner daemon. Defaults to the current hostname without FQDN.",
|
||||
Value: clibase.StringOf(&name),
|
||||
Default: "",
|
||||
},
|
||||
}
|
||||
|
||||
return cmd
|
||||
|
||||
@@ -26,7 +26,7 @@ func TestProvisionerDaemon_PSK(t *testing.T) {
|
||||
},
|
||||
},
|
||||
})
|
||||
inv, conf := newCLI(t, "provisionerd", "start", "--psk=provisionersftw")
|
||||
inv, conf := newCLI(t, "provisionerd", "start", "--psk=provisionersftw", "--name=matt-daemon")
|
||||
err := conf.URL().Write(client.URL.String())
|
||||
require.NoError(t, err)
|
||||
pty := ptytest.New(t).Attach(inv)
|
||||
@@ -34,6 +34,7 @@ func TestProvisionerDaemon_PSK(t *testing.T) {
|
||||
defer cancel()
|
||||
clitest.Start(t, inv)
|
||||
pty.ExpectMatchContext(ctx, "starting provisioner daemon")
|
||||
pty.ExpectMatchContext(ctx, "matt-daemon")
|
||||
}
|
||||
|
||||
func TestProvisionerDaemon_SessionToken(t *testing.T) {
|
||||
|
||||
@@ -9,6 +9,10 @@ OPTIONS:
|
||||
-c, --cache-dir string, $CODER_CACHE_DIRECTORY (default: [cache dir])
|
||||
Directory to store cached data.
|
||||
|
||||
--name string, $CODER_PROVISIONER_DAEMON_NAME
|
||||
Name of this provisioner daemon. Defaults to the current hostname
|
||||
without FQDN.
|
||||
|
||||
--poll-interval duration, $CODER_PROVISIONERD_POLL_INTERVAL (default: 1s)
|
||||
Deprecated and ignored.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user