与 ok 状态并行安装图表列表

Install list of charts in parallel with ok status

我使用以下代码运行并安装 helm 图表。 我得到了一个图表列表,它安装了每个图表(通过循环)并等待(upgradeAction.Wait = true,见下文)图表已启动并且 运行(使用掌舵的 wait=true 标志) 然后安装下一个,问题是需要 很多时间 等待每个图表都正常运行 - 运行 并且只是然后继续下一个 ,有没有办法并行安装 all 并在(所有图表安装的)最后验证它是否有效(比如如何等待有效但图表列表)。

代码如下:

mpfile, err := ioutil.TempFile(kp, kcp)
if err != nil {
    log.Error(err, "error")
}

defer os.Remove(tmpfile.Name()) 

if _, err := tmpfile.Write(cfg); err != nil {
    return err
}
if err := tmpfile.Close(); err != nil {
    return err
}

kcfgFilePath := tmpfile.Name()
settings := cli.New()
ac := new(action.Configuration)
clientGetter := genericclioptions.NewConfigFlags(false)
clientGetter.KubeConfig = &kcfgFilePath

for _, chartInstallation := range charts {
    chart, err := loader.Load(chartInstallation.Path)
    if err != nil {
        return err
    }

    releaseName := releaseName + "-" + chartInstallation.Name
    if err := ac.Init(clientGetter, settings.Namespace(), os.Getenv("HELM_DRIVER"), func(format string, v ...interface{}) {
        
    }); err != nil {
        return err
    }
    releasePresent := true
    statusAction := action.NewStatus(ac)
    status, err := statusAction.Run(releaseName)
    if err != nil {
        if strings.Contains(err.Error(), driver.ErrReleaseNotFound.Error()) {
            releasePresent = false
        } else {
            return err
        }
    }

    if !releasePresent {
        // install chart
        installAction := action.NewInstall(ac)
        installAction.CreateNamespace = true
        installAction.Namespace = chartInstallation.Namespace
        installAction.ReleaseName = releaseName

        _, err := installAction.Run(chart, nil)
        if err != nil {
            return err
        }
        log.Info("chart installed: ", "releaseName", releaseName)
    }

    if status != nil {
        if releasePresent && status.Info.Status.String() == release.StatusFailed.String() { 
            upgradeAction := action.NewUpgrade(ac)
            // HERE IT WAIT FOR THE CHART TO VERIFY THAT EVERYTHING IS UP
            upgradeAction.Wait = true
            upgradeAction.ReuseValues = false
            upgradeAction.Recreate = false
            _, err := upgradeAction.Run(releaseName, chart, nil)
            if err != nil {
                return err
            }
        }
    }
}

如果我将其更改为 upgradeAction.Wait = false ,它会开始安装所有图表而无需等待每个健康检查,但不确定如何在所有图表安装结束时验证它

您可以为正在安装的每个图表启动 goroutines(在 go 例程中包装图表安装代码),然后使用 sync.WaitGroup 等待所有 goroutines 完成。像这样:

package main

import (
    "fmt"
    "os"
    "strings"
    "sync"
)

func main() {
    kcfgFilePath := tmpfile.Name()
    settings := cli.New()
    ac := new(action.Configuration)
    clientGetter := genericclioptions.NewConfigFlags(false)
    clientGetter.KubeConfig = &kcfgFilePath
    var wg sync.WaitGroup

    for _, chartInstallation := range charts {
        wg.Add(1)
        go installChart(&wg, chartInstallation.Path)
    }

    fmt.Println("Installing...")
    wg.Wait()
    fmt.Println("Installed!")
}

func installChart(wg *sync.WaitGroup, chartInstallationPath string) error {
    defer wg.Done()

    chart, err := loader.Load(chartInstallationPath)
    if err != nil {
        return err
    }

    releaseName := releaseName + "-" + chartInstallation.Name
    if err := ac.Init(clientGetter, settings.Namespace(), os.Getenv("HELM_DRIVER"), func(format string, v ...interface{}) {

    }); err != nil {
        return err
    }
    releasePresent := true
    statusAction := action.NewStatus(ac)
    status, err := statusAction.Run(releaseName)
    if err != nil {
        if strings.Contains(err.Error(), driver.ErrReleaseNotFound.Error()) {
            releasePresent = false
        } else {
            return err
        }
    }

    if !releasePresent {
        // install chart
        installAction := action.NewInstall(ac)
        installAction.CreateNamespace = true
        installAction.Namespace = chartInstallation.Namespace
        installAction.ReleaseName = releaseName

        _, err := installAction.Run(chart, nil)
        if err != nil {
            return err
        }
        log.Info("chart installed: ", "releaseName", releaseName)
    }

    if status != nil {
        if releasePresent && status.Info.Status.String() == release.StatusFailed.String() {
            upgradeAction := action.NewUpgrade(ac)
            // HERE IT WAIT FOR THE CHART TO VERIFY THAT EVERYTHING IS UP
            upgradeAction.Wait = true
            upgradeAction.ReuseValues = false
            upgradeAction.Recreate = false
            _, err := upgradeAction.Run(releaseName, chart, nil)
            if err != nil {
                return err
            }
        }
    }
}

这里有一个很好的资源:https://goinbigdata.com/golang-wait-for-all-goroutines-to-finish/