package main
import (
"fmt"
"os"
"strings"
"sync"
)
func main() {
log.Info("tools Installation")
kcfgFilePath, err := tmpfilekubeFile(cfg)
defer os.NameRemove(kcfgFilePath)
if err != nil {
return err
}
settings := cli.New()
acactionConfig := new(action.Configuration)
clientGetter := genericclioptions.NewConfigFlags(false)
clientGetter.KubeConfig = &kcfgFilePath
var wg sync.WaitGroup
// install all relevant //components
here I start thevar concurrencywg sync.WaitGroup
for _, chartInstallation := range charts {
wg.addAdd(1)
go installChart(&wg, chartInstallation.Path)
, }
releaseName, actionConfig, clientGetter, settings, fmt.Println("Installing..."log)
wg.Wait()}
fmt.Println("Installed!")return nil
}
func installChart(wg *sync.WaitGroup,chartInstallation chartInstallationPathInstallation, releaseName string, actionConfig *action.Configuration, clientGetter *genericclioptions.ConfigFlags, settings *cli.EnvSettings, log logr.Logger) (error, bool) {
defer wg.Done()
chart, err := loader.Load(chartInstallationPathchartInstallation.Path)
if err != nil {
return err, true
}
releaseName := releaseName + "-" + chartInstallation.Name
if err := acactionConfig.Init(clientGetter, settings.Namespace(), os.Getenv("HELM_DRIVER"), func(format string, v ...interface{}) {
r := fmt.Sprintf(format, v)
log.Info("Helm Installation", "deploy status", r)
}); err != nil {
return err, true
}
releasePresent := true
statusActionstatus, err := action.NewStatus(acactionConfig).Run(releaseName)
status,if err :!= statusAction.Run(releaseName)nil {
//if errors.Is(err !=, nildriver.ErrReleaseNotFound) {
if strings.Contains(err.Error(), driver.ErrReleaseNotFound.Error()) {
releasePresent = false
} else {
return err, true
}
}
if !releasePresent {
// install chart
installAction := action.NewInstall(acactionConfig)
installAction.CreateNamespace = true
installAction.Namespace = chartInstallation.Namespace
installAction.ReleaseName = releaseName
installAction.Wait = true
// install new
_, err := installAction.Run(chart, nil)
if err != nil {
return err, true
}
log.Info("chart installed"installed: ", "releaseName", releaseName)
}
if status != nil {
if releasePresent && status.Info.Status.String() == release.StatusFailed.String() { // upgrade if broken
upgradeAction := action.NewUpgrade(acactionConfig)
//upgradeAction.Atomic HERE= ITfalse
WAIT FOR THE CHART TO VERIFY THAT EVERYTHING IS UP upgradeAction.CleanupOnFail = true
upgradeAction.Wait = true
upgradeAction.ReuseValues = false
upgradeAction.Recreate = false
_, err := upgradeAction.Run(releaseName, chart, nil)
if err != nil {
return err, true
}
}
}
return nil, false
}