github.com/grafana/tanka@v0.26.1-0.20240506093700-c22cfc35c21a/cmd/tk/toolCharts.go (about) 1 package main 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "os" 7 "path/filepath" 8 9 "github.com/go-clix/cli" 10 "github.com/grafana/tanka/pkg/helm" 11 "gopkg.in/yaml.v2" 12 ) 13 14 const repoConfigFlagUsage = "specify a local helm repository config file to use instead of the repositories in the chartfile.yaml. For use with private repositories" 15 16 func chartsCmd() *cli.Command { 17 cmd := &cli.Command{ 18 Use: "charts", 19 Short: "Declarative vendoring of Helm Charts", 20 Args: cli.ArgsMin(1), // Make sure we print out the help if no subcommand is given, `tk tool charts` is not valid 21 } 22 23 addCommandsWithLogLevelOption( 24 cmd, 25 chartsInitCmd(), 26 chartsAddCmd(), 27 chartsAddRepoCmd(), 28 chartsVendorCmd(), 29 chartsConfigCmd(), 30 chartsVersionCheckCmd(), 31 ) 32 33 return cmd 34 } 35 36 func chartsVendorCmd() *cli.Command { 37 cmd := &cli.Command{ 38 Use: "vendor", 39 Short: "Download Charts to a local folder", 40 } 41 prune := cmd.Flags().Bool("prune", false, "also remove non-vendored files from the destination directory") 42 repoConfigPath := cmd.Flags().String("repository-config", "", repoConfigFlagUsage) 43 44 cmd.Run = func(cmd *cli.Command, args []string) error { 45 c, err := loadChartfile() 46 if err != nil { 47 return err 48 } 49 50 return c.Vendor(*prune, *repoConfigPath) 51 } 52 53 return cmd 54 } 55 56 func chartsAddCmd() *cli.Command { 57 cmd := &cli.Command{ 58 Use: "add [chart@version] [...]", 59 Short: "Adds Charts to the chartfile", 60 } 61 repoConfigPath := cmd.Flags().String("repository-config", "", repoConfigFlagUsage) 62 63 cmd.Run = func(cmd *cli.Command, args []string) error { 64 c, err := loadChartfile() 65 if err != nil { 66 return err 67 } 68 69 return c.Add(args, *repoConfigPath) 70 } 71 72 return cmd 73 } 74 75 func chartsAddRepoCmd() *cli.Command { 76 cmd := &cli.Command{ 77 Use: "add-repo [NAME] [URL]", 78 Short: "Adds a repository to the chartfile", 79 Args: cli.ArgsExact(2), 80 } 81 82 cmd.Run = func(cmd *cli.Command, args []string) error { 83 c, err := loadChartfile() 84 if err != nil { 85 return err 86 } 87 88 return c.AddRepos(helm.Repo{ 89 Name: args[0], 90 URL: args[1], 91 }) 92 } 93 94 return cmd 95 } 96 97 func chartsConfigCmd() *cli.Command { 98 cmd := &cli.Command{ 99 Use: "config", 100 Short: "Displays the current manifest", 101 } 102 103 cmd.Run = func(cmd *cli.Command, args []string) error { 104 c, err := loadChartfile() 105 if err != nil { 106 return err 107 } 108 109 data, err := yaml.Marshal(c.Manifest) 110 if err != nil { 111 return err 112 } 113 114 fmt.Print(string(data)) 115 116 return nil 117 } 118 119 return cmd 120 } 121 122 func chartsInitCmd() *cli.Command { 123 cmd := &cli.Command{ 124 Use: "init", 125 Short: "Create a new Chartfile", 126 } 127 128 cmd.Run = func(cmd *cli.Command, args []string) error { 129 wd, err := os.Getwd() 130 if err != nil { 131 return err 132 } 133 134 path := filepath.Join(wd, helm.Filename) 135 if _, err := os.Stat(path); err == nil { 136 return fmt.Errorf("chartfile at '%s' already exists. Aborting", path) 137 } 138 139 if _, err := helm.InitChartfile(path); err != nil { 140 return err 141 } 142 143 fmt.Fprintf(os.Stderr, "Success! New Chartfile created at '%s'", path) 144 return nil 145 } 146 147 return cmd 148 } 149 150 func chartsVersionCheckCmd() *cli.Command { 151 cmd := &cli.Command{ 152 Use: "version-check", 153 Short: "Check required charts for updated versions", 154 } 155 repoConfigPath := cmd.Flags().String("repository-config", "", repoConfigFlagUsage) 156 prettyPrint := cmd.Flags().Bool("pretty-print", false, "pretty print json output with indents") 157 158 cmd.Run = func(cmd *cli.Command, args []string) error { 159 c, err := loadChartfile() 160 if err != nil { 161 return err 162 } 163 164 data, err := c.VersionCheck(*repoConfigPath) 165 if err != nil { 166 return err 167 } 168 169 enc := json.NewEncoder(os.Stdout) 170 if *prettyPrint { 171 enc.SetIndent("", " ") 172 } 173 return enc.Encode(data) 174 } 175 176 return cmd 177 } 178 179 func loadChartfile() (*helm.Charts, error) { 180 wd, err := os.Getwd() 181 if err != nil { 182 return nil, err 183 } 184 185 return helm.LoadChartfile(wd) 186 }