1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
|
package ecs
import (
"time"
"github.com/denverdino/aliyungo/common"
"github.com/denverdino/aliyungo/util"
)
type DescribeRouteTablesArgs struct {
VRouterId string
RouteTableId string
common.Pagination
}
type RouteTableType string
const (
RouteTableSystem = RouteTableType("System")
RouteTableCustom = RouteTableType("Custom")
)
type RouteEntryStatus string
const (
RouteEntryStatusPending = RouteEntryStatus("Pending")
RouteEntryStatusAvailable = RouteEntryStatus("Available")
RouteEntryStatusModifying = RouteEntryStatus("Modifying")
)
type NextHopListType struct {
NextHopList struct {
NextHopItem []NextHopItemType
}
}
type NextHopItemType struct {
NextHopType string
NextHopId string
}
//
// You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/datatype&routeentrysettype
type RouteEntrySetType struct {
RouteTableId string
DestinationCidrBlock string
Type RouteTableType
NextHopType string
NextHopId string
NextHopList NextHopListType
InstanceId string
Status RouteEntryStatus // enum Pending | Available | Modifying
}
//
// You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/datatype&routetablesettype
type RouteTableSetType struct {
VRouterId string
RouteTableId string
RouteEntrys struct {
RouteEntry []RouteEntrySetType
}
RouteTableType RouteTableType
CreationTime util.ISO6801Time
}
type DescribeRouteTablesResponse struct {
common.Response
common.PaginationResult
RouteTables struct {
RouteTable []RouteTableSetType
}
}
// DescribeRouteTables describes Virtual Routers
//
// You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/routertable&describeroutetables
func (client *Client) DescribeRouteTables(args *DescribeRouteTablesArgs) (routeTables []RouteTableSetType, pagination *common.PaginationResult, err error) {
response, err := client.DescribeRouteTablesWithRaw(args)
if err == nil {
return response.RouteTables.RouteTable, &response.PaginationResult, nil
}
return nil, nil, err
}
func (client *Client) DescribeRouteTablesWithRaw(args *DescribeRouteTablesArgs) (response *DescribeRouteTablesResponse, err error) {
args.Validate()
response = &DescribeRouteTablesResponse{}
err = client.Invoke("DescribeRouteTables", args, &response)
if err == nil {
return response, nil
}
return nil, err
}
type NextHopType string
const (
NextHopIntance = NextHopType("Instance") //Default
NextHopTunnel = NextHopType("Tunnel")
NextHopTunnelRouterInterface = NextHopType("RouterInterface")
)
type CreateRouteEntryArgs struct {
RouteTableId string
DestinationCidrBlock string
NextHopType NextHopType
NextHopId string
ClientToken string
}
type CreateRouteEntryResponse struct {
common.Response
}
// CreateRouteEntry creates route entry
//
// You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/routertable&createrouteentry
func (client *Client) CreateRouteEntry(args *CreateRouteEntryArgs) error {
response := CreateRouteEntryResponse{}
return client.Invoke("CreateRouteEntry", args, &response)
}
type DeleteRouteEntryArgs struct {
RouteTableId string
DestinationCidrBlock string
NextHopId string
}
type DeleteRouteEntryResponse struct {
common.Response
}
// DeleteRouteEntry deletes route entry
//
// You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/routertable&deleterouteentry
func (client *Client) DeleteRouteEntry(args *DeleteRouteEntryArgs) error {
response := DeleteRouteEntryResponse{}
return client.Invoke("DeleteRouteEntry", args, &response)
}
// WaitForAllRouteEntriesAvailable waits for all route entries to Available status
func (client *Client) WaitForAllRouteEntriesAvailable(vrouterId string, routeTableId string, timeout int) error {
if timeout <= 0 {
timeout = DefaultTimeout
}
args := DescribeRouteTablesArgs{
VRouterId: vrouterId,
RouteTableId: routeTableId,
}
for {
routeTables, _, err := client.DescribeRouteTables(&args)
if err != nil {
return err
}
if len(routeTables) == 0 {
return common.GetClientErrorFromString("Not found")
}
success := true
loop:
for _, routeTable := range routeTables {
for _, routeEntry := range routeTable.RouteEntrys.RouteEntry {
if routeEntry.Status != RouteEntryStatusAvailable {
success = false
break loop
}
}
}
if success {
break
}
timeout = timeout - DefaultWaitForInterval
if timeout <= 0 {
return common.GetClientErrorFromString("Timeout")
}
time.Sleep(DefaultWaitForInterval * time.Second)
}
return nil
}
|