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  }