github.com/microsoft/fabrikate@v1.0.0-alpha.1.0.20210115014322-dc09194d0885/internal/installable/helm.go (about) 1 package installable 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "path" 8 "path/filepath" 9 10 "github.com/microsoft/fabrikate/internal/helm" 11 "github.com/microsoft/fabrikate/internal/url" 12 ) 13 14 type Helm struct { 15 URL string 16 Chart string 17 Version string 18 } 19 20 func (h Helm) Install() error { 21 // Pull to a temporary directory 22 tmpHelmDir, err := ioutil.TempDir("", "fabrikate") 23 defer os.RemoveAll(tmpHelmDir) 24 if err != nil { 25 return err 26 } 27 if err := helm.Pull(h.URL, h.Chart, h.Version, tmpHelmDir); err != nil { 28 return err 29 } 30 31 componentPath, err := h.GetInstallPath() 32 if err != nil { 33 return err 34 } 35 if err := os.RemoveAll(componentPath); err != nil { 36 return err 37 } 38 if err := os.MkdirAll(filepath.Dir(componentPath), 0755); err != nil { 39 return err 40 } 41 42 // Move the extracted chart from tmp to the _component dir 43 extractedChartPath := path.Join(tmpHelmDir, h.Chart) 44 if err := os.Rename(extractedChartPath, componentPath); err != nil { 45 return err 46 } 47 48 return nil 49 } 50 51 func (h Helm) GetInstallPath() (string, error) { 52 urlPath, err := url.ToPath(h.URL) 53 if err != nil { 54 return "", err 55 } 56 var version string 57 if h.Version != "" { 58 version = h.Version 59 } else { 60 version = "latest" 61 } 62 63 componentPath := path.Join(installDirName, urlPath, h.Chart, version) 64 return componentPath, nil 65 } 66 67 func (h Helm) Validate() error { 68 if h.URL == "" { 69 return fmt.Errorf(`URL must be non-zero length, "%v" provided`, h.URL) 70 } 71 if h.Chart == "" { 72 return fmt.Errorf(`Chart must be non-zero length, "%v" provided`, h.Chart) 73 } 74 75 return nil 76 }