blob: 8b7dc1e81cced26b380462f44c80895f50827aaa [file] [log] [blame]
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +04001// TODO
2// * flux -n lekva create source git pcloud --url=ssh://192.168.0.211/pcloud-apps --branch=main --private-key-file=/Users/lekva/.ssh/id_rsa
3
giolekva8aa73e82022-07-09 11:34:39 +04004package main
5
6import (
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +04007 "embed"
8 "encoding/base64"
giolekva8aa73e82022-07-09 11:34:39 +04009 "fmt"
10 "log"
11 "os"
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +040012 "path"
13 "text/template"
giolekva8aa73e82022-07-09 11:34:39 +040014
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +040015 "github.com/giolekva/pcloud/core/installer"
giolekva8aa73e82022-07-09 11:34:39 +040016 "github.com/giolekva/pcloud/core/installer/soft"
17 "github.com/spf13/cobra"
18)
19
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +040020//go:embed env-tmpl
21var filesTmpls embed.FS
22
giolekva8aa73e82022-07-09 11:34:39 +040023var createEnvFlags struct {
24 name string
Giorgi Lekveishvili87be4ae2023-06-11 23:41:09 +040025 ip string
26 port int
giolekva8aa73e82022-07-09 11:34:39 +040027 adminPrivKey string
28}
29
30func createEnvCmd() *cobra.Command {
31 cmd := &cobra.Command{
32 Use: "create-env",
33 RunE: createEnvCmdRun,
34 }
35 cmd.Flags().StringVar(
36 &createEnvFlags.name,
37 "name",
38 "",
39 "",
40 )
41 cmd.Flags().StringVar(
Giorgi Lekveishvili87be4ae2023-06-11 23:41:09 +040042 &createEnvFlags.ip,
43 "ip",
44 "",
45 "",
46 )
47 cmd.Flags().IntVar(
48 &createEnvFlags.port,
Giorgi Lekveishviliad59bfb2023-06-12 00:04:17 +040049 "port",
Giorgi Lekveishvili87be4ae2023-06-11 23:41:09 +040050 22,
51 "",
52 )
53 cmd.Flags().StringVar(
giolekva8aa73e82022-07-09 11:34:39 +040054 &createEnvFlags.adminPrivKey,
55 "admin-priv-key",
56 "",
57 "",
58 )
59 return cmd
60}
61
62func createEnvCmdRun(cmd *cobra.Command, args []string) error {
63 adminPrivKey, err := os.ReadFile(createEnvFlags.adminPrivKey)
64 if err != nil {
65 return err
66 }
Giorgi Lekveishvili87be4ae2023-06-11 23:41:09 +040067 ss, err := soft.NewClient(createEnvFlags.ip, createEnvFlags.port, adminPrivKey, log.Default())
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +040068 if err != nil {
69 return err
70 }
71 ssPubKey, err := ss.GetPublicKey()
72 if err != nil {
73 return err
74 }
75 fmt.Println(string(ssPubKey))
76 pub, priv, err := installer.GenerateSSHKeys()
77 {
78 _ = priv
79 }
giolekva8aa73e82022-07-09 11:34:39 +040080 if err != nil {
81 return err
82 }
83 readme := fmt.Sprintf("# %s PCloud environment", createEnvFlags.name)
84 if err := ss.AddRepository(createEnvFlags.name, readme); err != nil {
85 return err
86 }
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +040087 fluxUserName := fmt.Sprintf("flux-%s", createEnvFlags.name)
88 if err := ss.AddUser(fluxUserName, pub); err != nil {
89 return err
90 }
91 if err := ss.AddCollaborator(createEnvFlags.name, fluxUserName); err != nil {
92 return err
93 }
Giorgi Lekveishvili87be4ae2023-06-11 23:41:09 +040094 repo, err := ss.GetRepo("pcloud")
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +040095 if err != nil {
96 return err
97 }
Giorgi Lekveishvili87be4ae2023-06-11 23:41:09 +040098 repoIO := installer.NewRepoIO(repo, ss.Signer)
99 kust, err := repoIO.ReadKustomization("environments/kustomization.yaml")
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400100 if err != nil {
101 return err
102 }
Giorgi Lekveishvili87be4ae2023-06-11 23:41:09 +0400103 kust.AddResources(createEnvFlags.name)
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400104 tmpls, err := template.ParseFS(filesTmpls, "env-tmpl/*.yaml")
105 if err != nil {
106 return err
107 }
108 for _, tmpl := range tmpls.Templates() {
109 dstPath := path.Join("environments", createEnvFlags.name, tmpl.Name())
Giorgi Lekveishvili87be4ae2023-06-11 23:41:09 +0400110 dst, err := repoIO.Writer(dstPath)
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400111 if err != nil {
112 return err
113 }
Giorgi Lekveishvili87be4ae2023-06-11 23:41:09 +0400114 defer dst.Close()
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400115 if err := tmpl.Execute(dst, map[string]string{
116 "Name": createEnvFlags.name,
117 "PrivateKey": base64.StdEncoding.EncodeToString([]byte(priv)),
118 "PublicKey": base64.StdEncoding.EncodeToString([]byte(pub)),
Giorgi Lekveishvili87be4ae2023-06-11 23:41:09 +0400119 "GitHost": createEnvFlags.ip,
120 "KnownHosts": base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s %s", createEnvFlags.ip, ssPubKey))),
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400121 }); err != nil {
122 return err
123 }
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400124 }
Giorgi Lekveishvili87be4ae2023-06-11 23:41:09 +0400125 if err := repoIO.WriteKustomization("environments/kustomization.yaml", *kust); err != nil {
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400126 return err
127 }
Giorgi Lekveishvili87be4ae2023-06-11 23:41:09 +0400128 if err := repoIO.CommitAndPush(fmt.Sprintf("%s: initialize environment", createEnvFlags.name)); err != nil {
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400129 return err
130 }
giolekva8aa73e82022-07-09 11:34:39 +0400131 return nil
132}