Я использую следующий код, который работает и параллельно устанавливаю схему управления (в цикле), он получает kubeconfig
файл (для доступа к k8s) создает клиент helm и устанавливает диаграммы из указанного места и ждет (upgradeAction.Wait = true
), что установка каждой диаграммы будет успешно завершена.
Сначала я делал это по порядку, а теперь добавил wait.group
чтобы можно было сократить время установки и установить ее параллельно, я что-то упускаю? обработка ошибок и т. д.?
package main
import (
"fmt"
"os"
"strings"
"sync"
)
func main() {
log.Info("tools Installation")
kcfgFilePath, err := kubeFile(cfg)
defer os.Remove(kcfgFilePath)
if err != nil {
return err
}
settings := cli.New()
actionConfig := new(action.Configuration)
clientGetter := genericclioptions.NewConfigFlags(false)
clientGetter.KubeConfig = &kcfgFilePath
// install all relevant components
var wg sync.WaitGroup
for _, chartInstallation := range charts {
wg.Add(1)
go installChart(&wg,chartInstallation, releaseName, actionConfig, clientGetter, settings, log)
}
return nil
}
func installChart(wg *sync.WaitGroup,chartInstallation Installation, releaseName string, actionConfig *action.Configuration, clientGetter *genericclioptions.ConfigFlags, settings *cli.EnvSettings, log logr.Logger) (error, bool) {
defer wg.Done()
chart, err := loader.Load(chartInstallation.Path)
if err != nil {
return err, true
}
releaseName = releaseName + "-" + chartInstallation.Name
if err := actionConfig.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
status, err := action.NewStatus(actionConfig).Run(releaseName)
if err != nil {
//if errors.Is(err, driver.ErrReleaseNotFound) {
if strings.Contains(err.Error(), driver.ErrReleaseNotFound.Error()) {
releasePresent = false
} else {
return err, true
}
}
if !releasePresent {
// install chart
installAction := action.NewInstall(actionConfig)
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("installed: ", "releaseName", releaseName)
}
if status != nil {
if releasePresent && status.Info.Status.String() == release.StatusFailed.String() { // upgrade if broken
upgradeAction := action.NewUpgrade(actionConfig)
upgradeAction.Atomic = false
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
}