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  }