From 47fa7543f9591c967219d08a302b96a15ee7e7a8 Mon Sep 17 00:00:00 2001 From: Dale Grant Date: Mon, 24 Feb 2025 18:19:01 +1100 Subject: [PATCH] Allow setting a custom instance name in Lima. roots/trellis-cli#514 --- README.md | 4 ++++ cli_config/cli_config.go | 1 + cmd/vm_delete.go | 4 ++-- cmd/vm_shell.go | 8 +++++++- cmd/vm_start.go | 10 +++++----- cmd/vm_stop.go | 4 ++-- trellis/trellis.go | 15 +++++++++++++++ 7 files changed, 36 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index a2c2ba61..405dec2a 100644 --- a/README.md +++ b/README.md @@ -228,6 +228,7 @@ Current supported settings: | `manager` | VM manager (Options: `auto` (depends on OS), `lima`)| string | "auto" | | `ubuntu` | Ubuntu OS version (Options: `18.04`, `20.04`, `22.04`, `24.04`)| string | | `hosts_resolver` | VM hosts resolver (Options: `hosts_file`)| string | +| `instance_name` | Custom name for the VM instance | string | First site name alphabetically | | `images` | Custom OS image | object | Set based on `ubuntu` version | #### `images` @@ -246,6 +247,9 @@ open: site: "https://mysite.com" admin: "https://mysite.com/wp/wp-admin" virtualenv_integration: true +vm: + manager: "lima" + instance_name: "custom-instance-name" # Optional: Set a specific VM instance name ``` Example env var usage: diff --git a/cli_config/cli_config.go b/cli_config/cli_config.go index 11b9048a..765af35f 100644 --- a/cli_config/cli_config.go +++ b/cli_config/cli_config.go @@ -21,6 +21,7 @@ type VmConfig struct { HostsResolver string `yaml:"hosts_resolver"` Images []VmImage `yaml:"images"` Ubuntu string `yaml:"ubuntu"` + InstanceName string `yaml:"instance_name"` } type Config struct { diff --git a/cmd/vm_delete.go b/cmd/vm_delete.go index fa00db84..7b53b2eb 100644 --- a/cmd/vm_delete.go +++ b/cmd/vm_delete.go @@ -51,7 +51,7 @@ func (c *VmDeleteCommand) Run(args []string) int { return 1 } - siteName, _, err := c.Trellis.MainSiteFromEnvironment("development") + instanceName, err := c.Trellis.GetVmInstanceName() if err != nil { c.UI.Error(err.Error()) return 1 @@ -64,7 +64,7 @@ func (c *VmDeleteCommand) Run(args []string) int { } if c.force || c.confirmDeletion() { - if err := manager.DeleteInstance(siteName); err != nil { + if err := manager.DeleteInstance(instanceName); err != nil { c.UI.Error("Error: " + err.Error()) return 1 } diff --git a/cmd/vm_shell.go b/cmd/vm_shell.go index be81690c..0b9c6dd6 100644 --- a/cmd/vm_shell.go +++ b/cmd/vm_shell.go @@ -41,6 +41,12 @@ func (c *VmShellCommand) Run(args []string) int { args = c.flags.Args() + instanceName, err := c.Trellis.GetVmInstanceName() + if err != nil { + c.UI.Error(err.Error()) + return 1 + } + siteName, _, err := c.Trellis.MainSiteFromEnvironment("development") if err != nil { c.UI.Error(err.Error()) @@ -60,7 +66,7 @@ func (c *VmShellCommand) Run(args []string) int { shellArgs := []string{"--workdir", c.workdir} shellArgs = append(shellArgs, args...) - if err := manager.OpenShell(siteName, c.workdir, args); err != nil { + if err := manager.OpenShell(instanceName, c.workdir, args); err != nil { c.UI.Error(err.Error()) return 1 } diff --git a/cmd/vm_start.go b/cmd/vm_start.go index 3c2128eb..ce069f00 100644 --- a/cmd/vm_start.go +++ b/cmd/vm_start.go @@ -49,9 +49,9 @@ func (c *VmStartCommand) Run(args []string) int { return 1 } - siteName, _, err := c.Trellis.MainSiteFromEnvironment("development") + instanceName, err := c.Trellis.GetVmInstanceName() if err != nil { - c.UI.Error("Error: could not automatically set VM name: " + err.Error()) + c.UI.Error(err.Error()) return 1 } @@ -61,7 +61,7 @@ func (c *VmStartCommand) Run(args []string) int { return 1 } - err = manager.StartInstance(siteName) + err = manager.StartInstance(instanceName) if err == nil { c.printInstanceInfo() return 0 @@ -74,13 +74,13 @@ func (c *VmStartCommand) Run(args []string) int { } // VM doesn't exist yet, create and start it - if err = manager.CreateInstance(siteName); err != nil { + if err = manager.CreateInstance(instanceName); err != nil { c.UI.Error("Error creating VM.") c.UI.Error(err.Error()) return 1 } - if err = manager.StartInstance(siteName); err != nil { + if err = manager.StartInstance(instanceName); err != nil { c.UI.Error("Error starting VM.") c.UI.Error(err.Error()) return 1 diff --git a/cmd/vm_stop.go b/cmd/vm_stop.go index a0904256..2bd88c34 100644 --- a/cmd/vm_stop.go +++ b/cmd/vm_stop.go @@ -47,7 +47,7 @@ func (c *VmStopCommand) Run(args []string) int { return 1 } - siteName, _, err := c.Trellis.MainSiteFromEnvironment("development") + instanceName, err := c.Trellis.GetVmInstanceName() if err != nil { c.UI.Error(err.Error()) return 1 @@ -59,7 +59,7 @@ func (c *VmStopCommand) Run(args []string) int { return 1 } - if err := manager.StopInstance(siteName); err != nil { + if err := manager.StopInstance(instanceName); err != nil { c.UI.Error(err.Error()) return 1 } diff --git a/trellis/trellis.go b/trellis/trellis.go index 83e229cc..63606e7e 100644 --- a/trellis/trellis.go +++ b/trellis/trellis.go @@ -39,6 +39,7 @@ var DefaultCliConfig = cli_config.Config{ Manager: "auto", HostsResolver: "hosts_file", Ubuntu: "24.04", + InstanceName: "", }, } @@ -234,6 +235,20 @@ func (t *Trellis) ValidateEnvironment(name string) (err error) { return fmt.Errorf("Error: %s is not a valid environment, valid options are %s", name, t.EnvironmentNames()) } +func (t *Trellis) GetVmInstanceName() (string, error) { + if t.CliConfig.Vm.InstanceName != "" { + return t.CliConfig.Vm.InstanceName, nil + } + + // Fallback: get main site from environment if no instance name is set. + siteName, _, err := t.MainSiteFromEnvironment("development") + if err != nil { + return "", fmt.Errorf("Error: could not automatically set VM name: %w", err) + } + return siteName, nil +} + + func (t *Trellis) SiteNamesFromEnvironment(environment string) []string { var names []string