Decision making inside a for loop and taking certain path based on output from gathered results

橙三吉。 提交于 2020-04-18 01:04:11

问题


I would love to simplify my code, with better utilisation of for loop indexes. The goal is to change out all UP once for new UP once, which means take down each UP one and bring it up again. There should always be one in UP state while this process takes place, so I need to cover the following scenarios:

up - up == delete -> create -> delete -> create

down - down == delete -> create -> delete -> create

up - down == delete -> create -> delete -> create

down - up == delete -> create -> delete -> create

up == create -> delete -> create

down == create -> delete -> create

This is what I have come up with, but I find it a bit cumbersome, and I', sure there is a room for an improvement. For Instance could I go without using slices for holding the indexes countStateAvailable and countStateDown

fun myFunc() {
    var countStateAvailable []int
    var countStateDown []int
    lags := convertToDirectconnect(lagPair, amz.dcLags)
    vi := newVIFProvider(amz.dcRead, amz.dcWrite, bd, amz.trace, amz.pr)
    for i := 0; i < len(lags); i++ {
        if i == 0 {
            for j := 0; j < 2; j++ {
                vis, err := amz.dcRead.DescribeVirtualInterfaces(&directconnect.DescribeVirtualInterfacesInput{ConnectionId: lags[j].LagId})
                if err != nil {
                    return err
                }

                for k := 0; k < len(vis.VirtualInterfaces); k++ {
                    if *vis.VirtualInterfaces[k].OwnerAccount == cfg.RemoteAccountID {
                        if aws.StringValue(vis.VirtualInterfaces[k].VirtualInterfaceState) == directconnect.VirtualInterfaceStateAvailable {
                            countStateAvailable = append(countStateAvailable, j)
                        } else if aws.StringValue(vis.VirtualInterfaces[k].VirtualInterfaceState) == directconnect.VirtualInterfaceStateDown {
                            countStateDown = append(countStateDown, j)
                        }
                    }
                }
            }
        }

        if len(countStateAvailable) == 0 {
            fmt.Println("contains 1 or more down elements")
            err := amz.Create(cfg, nst)
            if err != nil {
                return err
            }
            return nil
        }

        // check if second or both elements are UP
        if countStateAvailable[0] == 1  || len(countStateAvailable) == 2 {
            fmt.Println("second or both elements are UP")
            err = vi.DeleteSingle(cfg, lags[i], i)
            cfg.Neighbors, err = vi.CreateSingle(cfg, lags[i], i)
            if err != nil {
                return err
            }
            err = vi.RestorePollSingle(cfg, lags[i], i)
            if err != nil {
                return err
            }
        } else if countStateAvailable[0] == 0 { // first element is UP, delete second element first
            fmt.Println("first element is UP, delete second element first")
            err = vi.DeleteSingle(cfg, lags[1], 1)
            cfg.Neighbors, err = vi.CreateSingle(cfg, lags[1], 1)
            if err != nil {
                return err
            }
            err = vi.RestorePollSingle(cfg, lags[1], 1)
            if err != nil {
                return err
            }

            err = vi.DeleteSingle(cfg, lags[0], 0)
            cfg.Neighbors, err = vi.CreateSingle(cfg, lags[0], 0)
            if err != nil {
                return err
            }
            err = vi.RestorePollSingle(cfg, lags[0], 0)
            if err != nil {
                return err
            }
            return nil
        } else {
            fmt.Println("contains 1 or more down elements")
            err := amz.Create(cfg, nst)
            if err != nil {
                return err
            }
            return nil
        }
    }

    fmt.Println("countStateAvailable: ", countStateAvailable)
    fmt.Println("countStateDown: ", countStateDown)

    return nil
} 

来源:https://stackoverflow.com/questions/61253247/decision-making-inside-a-for-loop-and-taking-certain-path-based-on-output-from-g

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!