为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
人到中年有点甜 2022-08-24 16:47:22
我使用以下代码,该代码可以工作并安装头盔图表。我得到了一个图表列表,它安装每个图表(通过循环)并等待(,见下文)图表启动并运行(使用头盔的标志),然后安装下一个图表,问题是需要花费大量时间来等待每个图表都正常运行,然后继续下一个图表, 有没有办法并行安装所有设备,并在最后(所有图表安装)验证它是否有效(就像等待的工作方式,但对于图表列表)。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 = &kcfgFilePathfor _, 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
查看完整描述

1 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

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


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/


查看完整回答
反对 回复 2022-08-24
  • 1 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号