Принятие решения внутри для l oop и принятие определенного пути на основе результатов из собранных результатов - PullRequest
0 голосов
/ 16 апреля 2020

Я хотел бы упростить мой код, с лучшим использованием для индексов l oop. Цель состоит в том, чтобы заменить все UP один раз на новые UP один раз, что означает снять каждый UP один и поднять его снова. Во время этого процесса всегда должен быть один в состоянии UP, поэтому мне нужно охватить следующий сценарий ios:

up - up == delete -> create -> delete - > создать

вниз - вниз == удалить -> создать -> удалить -> создать

вверх - вниз == удалить -> создать -> удалить -> создать

вниз - вверх == удалить -> создать -> удалить -> создать

вверх == создать -> удалить -> создать

вниз == создать -> удалить -> создать

Это то, что я придумал, но я нахожу это немного громоздким, и я уверен, что есть место для улучшения. Для экземпляра я мог go без использования ломтиков для хранения индексов countStateAvailable и 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
} 
...