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 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287
|
// API on Network
package ecs
import (
"time"
"github.com/denverdino/aliyungo/common"
"github.com/denverdino/aliyungo/util"
)
type AllocatePublicIpAddressArgs struct {
InstanceId string
}
type AllocatePublicIpAddressResponse struct {
common.Response
IpAddress string
}
// AllocatePublicIpAddress allocates Public Ip Address
//
// You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/network&allocatepublicipaddress
func (client *Client) AllocatePublicIpAddress(instanceId string) (ipAddress string, err error) {
args := AllocatePublicIpAddressArgs{
InstanceId: instanceId,
}
response := AllocatePublicIpAddressResponse{}
err = client.Invoke("AllocatePublicIpAddress", &args, &response)
if err != nil {
return "", err
}
return response.IpAddress, nil
}
type ModifyInstanceNetworkSpec struct {
InstanceId string
InternetMaxBandwidthOut *int
InternetMaxBandwidthIn *int
NetworkChargeType common.InternetChargeType
}
type ModifyInstanceNetworkSpecResponse struct {
common.Response
}
// ModifyInstanceNetworkSpec modifies instance network spec
//
// You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/network&modifyinstancenetworkspec
func (client *Client) ModifyInstanceNetworkSpec(args *ModifyInstanceNetworkSpec) error {
response := ModifyInstanceNetworkSpecResponse{}
return client.Invoke("ModifyInstanceNetworkSpec", args, &response)
}
type AllocateEipAddressArgs struct {
RegionId common.Region
Bandwidth int
InternetChargeType common.InternetChargeType
ISP string
ClientToken string
}
type AllocateEipAddressResponse struct {
common.Response
EipAddress string
AllocationId string
}
// AllocateEipAddress allocates Eip Address
//
// You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/network&allocateeipaddress
func (client *Client) AllocateEipAddress(args *AllocateEipAddressArgs) (EipAddress string, AllocationId string, err error) {
if args.Bandwidth == 0 {
args.Bandwidth = 5
}
response := AllocateEipAddressResponse{}
err = client.Invoke("AllocateEipAddress", args, &response)
if err != nil {
return "", "", err
}
return response.EipAddress, response.AllocationId, nil
}
type EipInstanceType string
const (
EcsInstance = "EcsInstance"
SlbInstance = "SlbInstance"
Nat = "Nat"
HaVip = "HaVip"
)
type AssociateEipAddressArgs struct {
AllocationId string
InstanceId string
InstanceType EipInstanceType
}
type AssociateEipAddressResponse struct {
common.Response
}
// AssociateEipAddress associates EIP address to VM instance
//
// You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/network&associateeipaddress
func (client *Client) AssociateEipAddress(allocationId string, instanceId string) error {
args := AssociateEipAddressArgs{
AllocationId: allocationId,
InstanceId: instanceId,
}
response := ModifyInstanceNetworkSpecResponse{}
return client.Invoke("AssociateEipAddress", &args, &response)
}
func (client *Client) NewAssociateEipAddress(args *AssociateEipAddressArgs) error {
response := ModifyInstanceNetworkSpecResponse{}
return client.Invoke("AssociateEipAddress", args, &response)
}
// Status of disks
type EipStatus string
const (
EipStatusAssociating = EipStatus("Associating")
EipStatusUnassociating = EipStatus("Unassociating")
EipStatusInUse = EipStatus("InUse")
EipStatusAvailable = EipStatus("Available")
)
type AssociatedInstanceType string
const (
AssociatedInstanceTypeEcsInstance = AssociatedInstanceType("EcsInstance")
AssociatedInstanceTypeSlbInstance = AssociatedInstanceType("SlbInstance")
AssociatedInstanceTypeNat = AssociatedInstanceType("Nat")
AssociatedInstanceTypeHaVip = AssociatedInstanceType("HaVip")
)
type DescribeEipAddressesArgs struct {
RegionId common.Region
Status EipStatus //enum Associating | Unassociating | InUse | Available
EipAddress string
AllocationId string
AssociatedInstanceType AssociatedInstanceType //enum EcsInstance | SlbInstance | Nat | HaVip
AssociatedInstanceId string //绑定的资源的Id。 这是一个过滤器性质的参数,若不指定,则表示不适用该条件对结果进行过滤。 如果要使用该过滤器,必须同时使用AssociatedInstanceType。若InstanceType为EcsInstance,则此处填写ECS实例Id。若InstanceType为SlbInstance,则此处填写VPC类型的私网SLB 的实例ID。若InstanceType为Nat,则此处填写NAT 的实例ID。。若InstanceType为HaVip,则此处填写HaVipId。
common.Pagination
}
//
// You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/datatype&eipaddresssettype
type EipAddressSetType struct {
RegionId common.Region
IpAddress string
AllocationId string
Status EipStatus
InstanceId string
InstanceType string
Bandwidth string // Why string
InternetChargeType common.InternetChargeType
OperationLocks OperationLocksType
AllocationTime util.ISO6801Time
}
type DescribeEipAddressesResponse struct {
common.Response
common.PaginationResult
EipAddresses struct {
EipAddress []EipAddressSetType
}
}
// DescribeInstanceStatus describes instance status
//
// You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/network&describeeipaddresses
func (client *Client) DescribeEipAddresses(args *DescribeEipAddressesArgs) (eipAddresses []EipAddressSetType, pagination *common.PaginationResult, err error) {
response, err := client.DescribeEipAddressesWithRaw(args)
if err == nil {
return response.EipAddresses.EipAddress, &response.PaginationResult, nil
}
return nil, nil, err
}
func (client *Client) DescribeEipAddressesWithRaw(args *DescribeEipAddressesArgs) (response *DescribeEipAddressesResponse, err error) {
args.Validate()
response = &DescribeEipAddressesResponse{}
err = client.Invoke("DescribeEipAddresses", args, response)
if err == nil {
return response, nil
}
return nil, err
}
type ModifyEipAddressAttributeArgs struct {
AllocationId string
Bandwidth int
}
type ModifyEipAddressAttributeResponse struct {
common.Response
}
// ModifyEipAddressAttribute Modifies EIP attribute
//
// You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/network&modifyeipaddressattribute
func (client *Client) ModifyEipAddressAttribute(allocationId string, bandwidth int) error {
args := ModifyEipAddressAttributeArgs{
AllocationId: allocationId,
Bandwidth: bandwidth,
}
response := ModifyEipAddressAttributeResponse{}
return client.Invoke("ModifyEipAddressAttribute", &args, &response)
}
type UnallocateEipAddressArgs struct {
AllocationId string
InstanceId string
}
type UnallocateEipAddressResponse struct {
common.Response
}
// UnassociateEipAddress unallocates Eip Address from instance
//
// You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/network&unassociateeipaddress
func (client *Client) UnassociateEipAddress(allocationId string, instanceId string) error {
args := UnallocateEipAddressArgs{
AllocationId: allocationId,
InstanceId: instanceId,
}
response := UnallocateEipAddressResponse{}
return client.Invoke("UnassociateEipAddress", &args, &response)
}
type ReleaseEipAddressArgs struct {
AllocationId string
}
type ReleaseEipAddressResponse struct {
common.Response
}
// ReleaseEipAddress releases Eip address
//
// You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/network&releaseeipaddress
func (client *Client) ReleaseEipAddress(allocationId string) error {
args := ReleaseEipAddressArgs{
AllocationId: allocationId,
}
response := ReleaseEipAddressResponse{}
return client.Invoke("ReleaseEipAddress", &args, &response)
}
// WaitForVSwitchAvailable waits for VSwitch to given status
func (client *Client) WaitForEip(regionId common.Region, allocationId string, status EipStatus, timeout int) error {
if timeout <= 0 {
timeout = DefaultTimeout
}
args := DescribeEipAddressesArgs{
RegionId: regionId,
AllocationId: allocationId,
}
for {
eips, _, err := client.DescribeEipAddresses(&args)
if err != nil {
return err
}
if len(eips) == 0 {
return common.GetClientErrorFromString("Not found")
}
if eips[0].Status == status {
break
}
timeout = timeout - DefaultWaitForInterval
if timeout <= 0 {
return common.GetClientErrorFromString("Timeout")
}
time.Sleep(DefaultWaitForInterval * time.Second)
}
return nil
}
|