Я хотел бы упростить мой код, с лучшим использованием для индексов 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
}