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

我使用以下代码,该代码可以工作并安装头盔图表。我得到了一个图表列表,它安装每个图表(通过循环)并等待(,见下文)图表启动并运行(使用头盔的标志),然后安装下一个图表,问题是需要花费大量时间来等待每个图表都正常运行,然后继续下一个图表, 有没有办法并行安装所有设备,并在最后(所有图表安装)验证它是否有效(就像等待的工作方式,但对于图表列表)。upgradeAction.Wait = truewait=true

代码如下:

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)

    }



如果我把它改成,它开始安装所有的图表,而不等待每一个健康检查,但是不确定如何在所有图表安装结束时验证它upgradeAction.Wait = false


人到中年有点甜
浏览 131回答 1
1回答

手掌心

您可以为要安装的每个图表启动 goroutines(在 go 例程中包装图表安装代码),然后用于等待所有 goroutine 完成。像这样:sync.WaitGrouppackage mainimport (    "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/
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go