blob: 1ae0888ddf561122c57103dc95a4290e37183c19 [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 "bytes"
8 "embed"
9 "encoding/base64"
giolekva8aa73e82022-07-09 11:34:39 +040010 "fmt"
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +040011 "io"
giolekva8aa73e82022-07-09 11:34:39 +040012 "log"
13 "os"
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +040014 "path"
15 "text/template"
giolekva8aa73e82022-07-09 11:34:39 +040016
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +040017 "golang.org/x/exp/slices"
18
19 "github.com/giolekva/pcloud/core/installer"
giolekva8aa73e82022-07-09 11:34:39 +040020 "github.com/giolekva/pcloud/core/installer/soft"
21 "github.com/spf13/cobra"
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +040022 "sigs.k8s.io/yaml"
giolekva8aa73e82022-07-09 11:34:39 +040023)
24
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +040025//go:embed env-tmpl
26var filesTmpls embed.FS
27
giolekva8aa73e82022-07-09 11:34:39 +040028var createEnvFlags struct {
29 name string
30 adminPrivKey string
31}
32
33func createEnvCmd() *cobra.Command {
34 cmd := &cobra.Command{
35 Use: "create-env",
36 RunE: createEnvCmdRun,
37 }
38 cmd.Flags().StringVar(
39 &createEnvFlags.name,
40 "name",
41 "",
42 "",
43 )
44 cmd.Flags().StringVar(
45 &createEnvFlags.adminPrivKey,
46 "admin-priv-key",
47 "",
48 "",
49 )
50 return cmd
51}
52
53func createEnvCmdRun(cmd *cobra.Command, args []string) error {
54 adminPrivKey, err := os.ReadFile(createEnvFlags.adminPrivKey)
55 if err != nil {
56 return err
57 }
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +040058 ss, err := soft.NewClient("192.168.0.211", 22, adminPrivKey, log.Default())
59 if err != nil {
60 return err
61 }
62 ssPubKey, err := ss.GetPublicKey()
63 if err != nil {
64 return err
65 }
66 fmt.Println(string(ssPubKey))
67 pub, priv, err := installer.GenerateSSHKeys()
68 {
69 _ = priv
70 }
giolekva8aa73e82022-07-09 11:34:39 +040071 if err != nil {
72 return err
73 }
74 readme := fmt.Sprintf("# %s PCloud environment", createEnvFlags.name)
75 if err := ss.AddRepository(createEnvFlags.name, readme); err != nil {
76 return err
77 }
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +040078 fluxUserName := fmt.Sprintf("flux-%s", createEnvFlags.name)
79 if err := ss.AddUser(fluxUserName, pub); err != nil {
80 return err
81 }
82 if err := ss.AddCollaborator(createEnvFlags.name, fluxUserName); err != nil {
83 return err
84 }
85 repo, err := ss.CloneRepository("pcloud")
86 if err != nil {
87 return err
88 }
89 wt, err := repo.Worktree()
90 if err != nil {
91 return err
92 }
93 envKust := "environments/kustomization.yaml"
94 envKustFile, err := wt.Filesystem.Open(envKust)
95 if err != nil {
96 return err
97 }
98 kust, err := installer.ReadKustomization(envKustFile)
99 if err != nil {
100 return err
101 }
102 if slices.Contains(kust.Resources, createEnvFlags.name) {
103 return fmt.Errorf("Environment already exists: %s", createEnvFlags.name)
104 }
105 tmpls, err := template.ParseFS(filesTmpls, "env-tmpl/*.yaml")
106 if err != nil {
107 return err
108 }
109 for _, tmpl := range tmpls.Templates() {
110 dstPath := path.Join("environments", createEnvFlags.name, tmpl.Name())
111 fmt.Println(dstPath)
112 dst, err := wt.Filesystem.Create(dstPath)
113 if err != nil {
114 return err
115 }
116 if err := tmpl.Execute(dst, map[string]string{
117 "Name": createEnvFlags.name,
118 "PrivateKey": base64.StdEncoding.EncodeToString([]byte(priv)),
119 "PublicKey": base64.StdEncoding.EncodeToString([]byte(pub)),
120 "GitHost": "192.168.0.211",
121 "KnownHosts": base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("192.168.0.211 %s", ssPubKey))),
122 }); err != nil {
123 return err
124 }
125 if _, err := wt.Add(dstPath); err != nil {
126 return err
127 }
128 }
129 kust.Resources = append(kust.Resources, createEnvFlags.name)
130 ff, err := wt.Filesystem.Create(envKust)
131 if err != nil {
132 return err
133 }
134 contents, err := yaml.Marshal(kust)
135 if err != nil {
136 return err
137 }
138 if _, err := io.Copy(ff, bytes.NewReader(contents)); err != nil {
139 return err
140 }
141 if _, err := wt.Add(envKust); err != nil {
142 return err
143 }
144 if err := ss.Commit(wt, fmt.Sprintf("%s: new environment", createEnvFlags.name)); err != nil {
145 return err
146 }
147 if err := ss.Push(repo); err != nil {
148 return err
149 }
giolekva8aa73e82022-07-09 11:34:39 +0400150 return nil
151}