Skip to content

Commit ef09091

Browse files
authored
Merge pull request #276 from afbjorklund/start-url
Implement starting instances from a HTTP URL
2 parents e970ff7 + 3b515a9 commit ef09091

File tree

1 file changed

+40
-2
lines changed

1 file changed

+40
-2
lines changed

cmd/limactl/start.go

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,13 @@ package main
33
import (
44
"errors"
55
"fmt"
6+
"io"
67
"io/ioutil"
8+
"net/http"
9+
"net/url"
710
"os"
811
"os/exec"
12+
"path"
913
"path/filepath"
1014
"strings"
1115

@@ -25,7 +29,7 @@ import (
2529

2630
func newStartCommand() *cobra.Command {
2731
var startCommand = &cobra.Command{
28-
Use: "start NAME|FILE.yaml",
32+
Use: "start NAME|FILE.yaml|URL",
2933
Short: fmt.Sprintf("Start an instance of Lima. If the instance does not exist, open an editor for creating new one, with name %q", DefaultInstanceName),
3034
Args: cobra.MaximumNArgs(1),
3135
ValidArgsFunction: startBashComplete,
@@ -49,7 +53,22 @@ func loadOrCreateInstance(cmd *cobra.Command, args []string) (*store.Instance, e
4953
err error
5054
)
5155

52-
if argSeemsYAMLPath(arg) {
56+
if argSeemsHTTPURL(arg) {
57+
instName, err = instNameFromHTTPURL(arg)
58+
if err != nil {
59+
return nil, err
60+
}
61+
logrus.Debugf("interpreting argument %q as a http url for instance %q", arg, instName)
62+
resp, err := http.Get(arg)
63+
if err != nil {
64+
return nil, err
65+
}
66+
defer resp.Body.Close()
67+
yBytes, err = io.ReadAll(resp.Body)
68+
if err != nil {
69+
return nil, err
70+
}
71+
} else if argSeemsYAMLPath(arg) {
5372
instName, err = instNameFromYAMLPath(arg)
5473
if err != nil {
5574
return nil, err
@@ -239,6 +258,17 @@ func startAction(cmd *cobra.Command, args []string) error {
239258
return start.Start(ctx, inst)
240259
}
241260

261+
func argSeemsHTTPURL(arg string) bool {
262+
u, err := url.Parse(arg)
263+
if err != nil {
264+
return false
265+
}
266+
if u.Scheme != "http" && u.Scheme != "https" {
267+
return false
268+
}
269+
return true
270+
}
271+
242272
func argSeemsYAMLPath(arg string) bool {
243273
if strings.Contains(arg, "/") {
244274
return true
@@ -247,6 +277,14 @@ func argSeemsYAMLPath(arg string) bool {
247277
return strings.HasSuffix(lower, ".yml") || strings.HasSuffix(lower, ".yaml")
248278
}
249279

280+
func instNameFromHTTPURL(httpURL string) (string, error) {
281+
u, err := url.Parse(httpURL)
282+
if err != nil {
283+
return "", err
284+
}
285+
return instNameFromYAMLPath(path.Base(u.Path))
286+
}
287+
250288
func instNameFromYAMLPath(yamlPath string) (string, error) {
251289
s := strings.ToLower(filepath.Base(yamlPath))
252290
s = strings.TrimSuffix(strings.TrimSuffix(s, ".yml"), ".yaml")

0 commit comments

Comments
 (0)