diff --git a/README.md b/README.md index 399d82a0..f9af6486 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ # k3d-go -https://github.com/zeerorg/k3s-in-docker reimplemented in Golang + +[zeerorg/k3s-in-docker](https://github.com/zeerorg/k3s-in-docker) reimplemented in Golang... just because I didn't have time to learn Rust. diff --git a/main.go b/main.go index d8709b10..b35c83bd 100644 --- a/main.go +++ b/main.go @@ -9,28 +9,78 @@ import ( "github.com/urfave/cli" ) -func checkTools(c *cli.Context) error { - fmt.Println("TEST check") - return nil -} - func createCluster(c *cli.Context) error { - fmt.Println("TEST create") + port := fmt.Sprintf("%s:%s", c.String("port"), c.String("port")) + image := fmt.Sprintf("rancher/k3s:%s", c.String("version")) + cmd := "docker" + args := []string{ + "run", + "--name", c.String("name"), + "-e", "K3S_KUBECONFIG_OUTPUT=/output/kubeconfig.yaml", + "--publish", port, + "--privileged", + } + extraArgs := []string{} + if c.IsSet("volume") { + extraArgs = append(extraArgs, fmt.Sprintf("--volume %s", c.String("volume"))) + } + if len(extraArgs) > 0 { + for _, extra := range extraArgs { + args = append(args, extra) + } + } + args = append(args, + "-d", + image, + "server", // cmd + "--https-listen-port", c.String("port"), //args + ) + log.Printf("Creating cluster [%s]", c.String("name")) + log.Printf("Running command: %+v", exec.Command(cmd, args...).Args) + if err := exec.Command(cmd, args...).Run(); err != nil { + log.Fatalf("FAILURE: couldn't create cluster [%s] Err: %+v", c.String("name"), err) + return err + } + log.Printf("SUCCESS: created cluster [%s]", c.String("name")) return nil } func deleteCluster(c *cli.Context) error { - fmt.Println("TEST delete") + cmd := "docker" + args := []string{"rm", "-f", c.String("name")} + log.Printf("Deleting cluster [%s]", c.String("name")) + log.Printf("Running command: %+v", exec.Command(cmd, args...).Args) + if err := exec.Command(cmd, args...).Run(); err != nil { + log.Fatalf("FAILURE: couldn't delete cluster [%s] Err: %+v", c.String("name"), err) + return err + } + log.Printf("SUCCESS: deleted cluster [%s]", c.String("name")) return nil } func stopCluster(c *cli.Context) error { - fmt.Println("TEST stop") + cmd := "docker" + args := []string{"stop", c.String("name")} + log.Printf("Stopping cluster [%s]", c.String("name")) + log.Printf("Running command: %+v", exec.Command(cmd, args...).Args) + if err := exec.Command(cmd, args...).Run(); err != nil { + log.Fatalf("FAILURE: couldn't stop cluster [%s] Err: %+v", c.String("name"), err) + return err + } + log.Printf("SUCCESS: stopped cluster [%s]", c.String("name")) return nil } func startCluster(c *cli.Context) error { - fmt.Println("TEST start") + cmd := "docker" + args := []string{"start", c.String("name")} + log.Printf("Starting cluster [%s]", c.String("name")) + log.Printf("Running command: %+v", exec.Command(cmd, args...).Args) + if err := exec.Command(cmd, args...).Run(); err != nil { + log.Fatalf("FAILURE: couldn't start cluster [%s] Err: %+v", c.String("name"), err) + return err + } + log.Printf("SUCCESS: started cluster [%s]", c.String("name")) return nil } @@ -40,7 +90,17 @@ func listClusters(c *cli.Context) error { } func getConfig(c *cli.Context) error { - fmt.Println("TEST get") + sourcePath := fmt.Sprintf("%s:/output/kubeconfig.yaml", c.String("name")) + destPath := fmt.Sprintf("./kubeconfig-%s.yaml", c.String("name")) + cmd := "docker" + args := []string{"cp", sourcePath, destPath} + log.Printf("Grabbing kubeconfig for cluster [%s]", c.String("name")) + log.Printf("Running command: %+v", exec.Command(cmd, args...).Args) + if err := exec.Command(cmd, args...).Run(); err != nil { + log.Fatalf("FAILURE: couldn't get kubeconfig for cluster [%s] Err: %+v", c.String("name"), err) + return err + } + log.Printf("SUCCESS: retrieved kubeconfig for cluster [%s]", c.String("name")) return nil } @@ -49,10 +109,18 @@ func main() { var clusterName string var serverPort int var volume string + var k3sVersion string app := cli.NewApp() app.Name = "k3d" app.Usage = "Run k3s in Docker!" + app.Version = "0.0.1" + app.Authors = []cli.Author{ + cli.Author{ + Name: "iwilltry42", + Email: "iwilltry42@gmail.com", + }, + } app.Commands = []cli.Command{ { @@ -87,6 +155,12 @@ func main() { Usage: "Mount a volume into the cluster node (Docker notation: `source:destination`", Destination: &volume, }, + cli.StringFlag{ + Name: "version", + Value: "v0.1.0", + Usage: "Choose the k3s image version", + Destination: &k3sVersion, + }, cli.IntFlag{ Name: "port, p", Value: 6443,