亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

與 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 關注
  • 81 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號