Skip to content

Commit fa01447

Browse files
committed
Add helm flag to download chart and images listed in values.yaml
1 parent 7b7b7d3 commit fa01447

File tree

3 files changed

+63
-21
lines changed

3 files changed

+63
-21
lines changed

cmd/download.go

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ import (
44
"bufio"
55
"context"
66
"fmt"
7+
"log"
78
"os"
9+
"strings"
810

911
"rkd/containers"
1012
"rkd/git"
@@ -24,9 +26,9 @@ var (
2426
// DownloadCommand return downlaod cli command
2527
func DownloadCommand() cli.Command {
2628
DownloadFlags := []cli.Flag{
27-
cli.StringFlag{
29+
cli.StringSliceFlag{
2830
Name: "helm",
29-
Usage: "Download a helm chart list.\n rkd download --helm",
31+
Usage: "Download a helm chart list.\nrkd download --helm https://REPO_URL/REPO_NAME/CHART_NAME \nrkd download --helm https://charts.bitnami.com/bitnami/postgresql-ha",
3032
},
3133
cli.StringSliceFlag{
3234
Name: "image",
@@ -67,6 +69,7 @@ func DownloadDataPack(c *cli.Context) {
6769
}
6870
helpers.CreateDestDir(dest)
6971

72+
// Images
7073
if len(c.StringSlice("image")) > 0 {
7174
var destImg string
7275

@@ -78,19 +81,46 @@ func DownloadDataPack(c *cli.Context) {
7881
containers.DownloadImage(c.StringSlice("image"), destImg)
7982
}
8083

84+
// Helm
85+
if len(c.StringSlice("helm")) > 0 {
86+
for _, el := range c.StringSlice("helm") {
87+
s := strings.Split(el, "/")
88+
chartName := s[len(s)-1]
89+
repoName := s[len(s)-2]
90+
repoURL := strings.Join(s[:len(s)-1], "/")
91+
chartDest := fmt.Sprintf("%s/%s", dest, chartName)
92+
93+
fmt.Printf("Getting %s chart\n", chartName)
94+
95+
helm.RepoAdd(repoName, repoURL)
96+
helm.RepoUpdate()
97+
chartPath := helm.DownloadChart(repoName, chartName, "", chartDest)
98+
99+
// Get chart image list
100+
imgList, err := helm.GetChartImages(chartPath)
101+
if err != nil {
102+
log.Printf("Err getting image list of chart %s.\n%s\n", chartName, err)
103+
continue
104+
}
105+
106+
// Downlaod container images
107+
destImg := fmt.Sprintf("%s/%s-images.tar", chartDest, chartName)
108+
err = containers.DownloadImage(imgList, destImg)
109+
if err != nil {
110+
log.Printf("%s\n", err)
111+
}
112+
}
113+
}
114+
115+
// Rancher
81116
if c.String("rancher") != "" {
82117
fmt.Printf("Getting Rancher %s\n", c.String("rancher"))
83118
GetRancherHelmChart(c.String("rancher"), dest)
84119
GetRancherImages(c.String("rancher"), dest)
85120
}
86121

87-
// if c.String("helm") != "" {
88-
// fmt.Printf("Getting Rancher chart %s\n", c.String("helm"))
89-
// GetRancherHelmChart(c.String("helm"))
90-
// }
91-
92122
// If no flag provided, download latest chart and images
93-
if c.String("rancher") == "" && c.String("image") == "" {
123+
if c.String("rancher") == "" && len(c.StringSlice("image")) == 0 && len(c.StringSlice("helm")) == 0 {
94124
GetRancherHelmChart("latest", dest)
95125
GetRancherImages("latest", dest)
96126
}

containers/image.go

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package containers
33
import (
44
"context"
55
"fmt"
6+
"log"
67
"os"
78
"strings"
89

@@ -15,23 +16,26 @@ import (
1516
)
1617

1718
// DownloadImage download docker images from src and create docker-archive
18-
func DownloadImage(imgList []string, dest string) {
19+
func DownloadImage(imgList []string, dest string) error {
1920

2021
// Contexts
2122
defaultPolicy, err := signature.NewPolicyFromFile("policy.json")
2223
if err != nil {
23-
fmt.Printf("default policy err: %s\n", err)
24+
log.Printf("Default policy err.\n")
25+
return err
2426
}
2527
policyContext, err := signature.NewPolicyContext(defaultPolicy)
2628
if err != nil {
27-
fmt.Printf("Policy context err: %s\n", err)
29+
log.Printf("Policy context err.\n")
30+
return err
2831
}
2932
defer policyContext.Destroy()
3033

3134
// Create new dest archive
3235
aw, err := archive.NewWriter(nil, dest)
3336
if err != nil {
34-
fmt.Printf("%s\n", err)
37+
log.Printf("Error when initializing destination archive.\n")
38+
return err
3539
}
3640
defer aw.Close()
3741

@@ -41,24 +45,26 @@ func DownloadImage(imgList []string, dest string) {
4145
imgRef := fmt.Sprintf("%s%s", "docker://", img)
4246
srcRef, err := alltransports.ParseImageName(imgRef)
4347
if err != nil {
44-
fmt.Printf("%s\n", err)
48+
log.Printf("Error when parsing image name for %s", img)
49+
return err
4550
}
4651

4752
////////// Dest
4853
imgNamed, err := reference.ParseDockerRef(img)
4954
if err != nil {
50-
fmt.Printf("%s\n", err)
55+
log.Printf("Error when parsing image reference for %s", img)
56+
return err
5157
}
52-
5358
imgNameTagged, err := reference.WithTag(imgNamed, getImgTag(img))
5459
if err != nil {
55-
fmt.Printf("%s\n", err)
60+
log.Printf("Error when parsing image reference and tag for %s", img)
61+
return err
5662
}
57-
5863
// Create dest ref
5964
destRef, err := aw.NewReference(imgNameTagged)
6065
if err != nil {
61-
fmt.Printf("%s\n", err)
66+
log.Printf("Error when creating new image reference for %s", img)
67+
return err
6268
}
6369
//////////
6470

@@ -69,15 +75,17 @@ func DownloadImage(imgList []string, dest string) {
6975
}
7076

7177
// Download and create tar
72-
fmt.Printf("Copy %s to %s\n", imgRef, dest)
78+
fmt.Printf("Copy %s to %s\n", img, dest)
7379
_, err = copy.Image(context.Background(), policyContext, destRef, srcRef, &copy.Options{
7480
ReportWriter: os.Stdout,
7581
SourceCtx: sysCtx,
7682
})
7783
if err != nil {
78-
fmt.Printf("%s\n", err)
84+
log.Printf("Error when downloading image %s", img)
85+
return err
7986
}
8087
}
88+
return nil
8189
}
8290

8391
func getImgTag(imgStr string) string {

helm/repo.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ func RepoUpdate() {
130130
}
131131

132132
// DownloadChart download a chart from public repo to local folder
133-
func DownloadChart(repo string, chart string, version string, dest string) {
133+
func DownloadChart(repo string, chart string, version string, dest string) (chartPath string) {
134134

135135
settings := cli.New()
136136

@@ -162,6 +162,8 @@ func DownloadChart(repo string, chart string, version string, dest string) {
162162
}
163163

164164
fmt.Printf("Chart downloaded to %s\n", path)
165+
166+
return path
165167
}
166168

167169
func debug(format string, v ...interface{}) {
@@ -216,6 +218,8 @@ func GetChartImagesFromValues(values map[string]interface{}) ([]string, error) {
216218
if img.Registry != "" {
217219
imgStr = fmt.Sprintf("%s/%s", img.Registry, imgStr)
218220
}
221+
// remove \n to prevent of reference format error
222+
imgStr = strings.TrimSuffix(imgStr, "\n")
219223
imgList = append(imgList, imgStr)
220224
}
221225
} else {

0 commit comments

Comments
 (0)