435c0d9fc8
This PR switches the Nomad repository from using govendor to Go modules for managing dependencies. Aspects of the Nomad workflow remain pretty much the same. The usual Makefile targets should continue to work as they always did. The API submodule simply defers to the parent Nomad version on the repository, keeping the semantics of API versioning that currently exists.
288 lines
8.3 KiB
Go
288 lines
8.3 KiB
Go
// 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
|
||
}
|