qingcloud-sdk-go/client/client.go

220 lines
5.9 KiB
Go
Raw Permalink Normal View History

2017-01-17 09:24:29 +00:00
package client
import (
"errors"
"fmt"
"time"
"github.com/yunify/qingcloud-sdk-go/config"
"github.com/yunify/qingcloud-sdk-go/service"
)
const (
2017-03-27 03:35:18 +00:00
//InstanceStatusPending pending
2017-03-27 03:52:32 +00:00
InstanceStatusPending = "pending"
2017-03-27 03:35:18 +00:00
//InstanceStatusRunning running
2017-03-27 03:52:32 +00:00
InstanceStatusRunning = "running"
2017-03-27 03:35:18 +00:00
//InstanceStatusStopped stopped
2017-03-27 03:52:32 +00:00
InstanceStatusStopped = "stopped"
2017-03-27 03:35:18 +00:00
//InstanceStatusSuspended suspended
2017-03-27 03:52:32 +00:00
InstanceStatusSuspended = "suspended"
2017-03-27 03:35:18 +00:00
//InstanceStatusTerminated terminated
2017-01-17 09:51:33 +00:00
InstanceStatusTerminated = "terminated"
2017-03-27 03:35:18 +00:00
//InstanceStatusCeased ceased
2017-03-27 03:52:32 +00:00
InstanceStatusCeased = "ceased"
2017-01-17 09:51:33 +00:00
2017-03-27 03:35:18 +00:00
//LoadBalancerStatusPending pending
2017-01-17 09:51:33 +00:00
LoadBalancerStatusPending = "pending"
2017-03-27 03:35:18 +00:00
//LoadBalancerStatusActive active
2017-01-17 09:51:33 +00:00
LoadBalancerStatusActive = "active"
2017-03-27 03:35:18 +00:00
//LoadBalancerStatusStopped stopped
2017-01-17 09:51:33 +00:00
LoadBalancerStatusStopped = "stopped"
2017-03-27 03:35:18 +00:00
//LoadBalancerStatusSuspended suspended
2017-01-17 09:51:33 +00:00
LoadBalancerStatusSuspended = "suspended"
2017-03-27 03:35:18 +00:00
//LoadBalancerStatusDeleted deleted
2017-01-17 09:51:33 +00:00
LoadBalancerStatusDeleted = "deleted"
2017-03-27 03:35:18 +00:00
//LoadBalancerStatusCeased ceased
2017-01-17 09:51:33 +00:00
LoadBalancerStatusCeased = "ceased"
2017-01-17 09:24:29 +00:00
//JobStatusUnknown unknown
JobStatusUnknown = "unknown"
//JobStatusSuccessful successful
JobStatusSuccessful = "successful"
//JobStatusFailed failed
JobStatusFailed = "failed"
//JobStatusPending pending
JobStatusPending = "pending"
//JobStatusWorking working
JobStatusWorking = "working"
2017-03-27 03:52:32 +00:00
defaultOpTimeout = 180 * time.Second
defaultWaitInterval = 10 * time.Second
2017-01-17 09:24:29 +00:00
)
2017-03-27 03:03:25 +00:00
// QingCloudClient QingCloud IaaS Advanced Client
2017-01-17 09:24:29 +00:00
type QingCloudClient interface {
RunInstance(arg *service.RunInstancesInput) (*service.Instance, error)
DescribeInstance(instanceID string) (*service.Instance, error)
StartInstance(instanceID string) error
StopInstance(instanceID string, force bool) error
RestartInstance(instanceID string) error
TerminateInstance(instanceID string) error
WaitInstanceStatus(instanceID string, status string) (*service.Instance, error)
}
2017-03-27 02:57:47 +00:00
// NewClient return a new QingCloudClient
2017-01-17 09:24:29 +00:00
func NewClient(config *config.Config, zone string) (QingCloudClient, error) {
qcService, err := service.Init(config)
if err != nil {
return nil, err
}
instanceService, err := qcService.Instance(zone)
if err != nil {
return nil, err
}
jobService, err := qcService.Job(zone)
if err != nil {
return nil, err
}
c := &client{
2017-03-27 03:52:32 +00:00
InstanceService: instanceService,
JobService: jobService,
OperationTimeout: defaultOpTimeout,
WaitInterval: defaultWaitInterval,
zone: zone,
2017-01-17 09:24:29 +00:00
}
return c, nil
}
type client struct {
InstanceService *service.InstanceService
JobService *service.JobService
OperationTimeout time.Duration
2017-03-27 03:52:32 +00:00
WaitInterval time.Duration
2017-01-17 09:24:29 +00:00
zone string
}
2017-03-27 02:57:47 +00:00
// RunInstance
2017-01-17 09:24:29 +00:00
func (c *client) RunInstance(input *service.RunInstancesInput) (*service.Instance, error) {
output, err := c.InstanceService.RunInstances(input)
if err != nil {
return nil, err
}
if len(output.Instances) == 0 {
2017-03-27 02:57:47 +00:00
return nil, errors.New("Create instance response error")
2017-01-17 09:24:29 +00:00
}
jobID := output.JobID
jobErr := c.waitJob(*jobID)
if jobErr != nil {
return nil, jobErr
}
instanceID := *output.Instances[0]
2017-01-17 09:51:33 +00:00
_, waitErr := c.WaitInstanceStatus(instanceID, InstanceStatusRunning)
2017-01-17 09:24:29 +00:00
if waitErr != nil {
return nil, waitErr
}
ins, waitErr := c.waitInstanceNetwork(instanceID)
if waitErr != nil {
return nil, waitErr
}
return ins, nil
}
2017-03-27 02:57:47 +00:00
// DescribeInstance
2017-01-17 09:24:29 +00:00
func (c *client) DescribeInstance(instanceID string) (*service.Instance, error) {
input := &service.DescribeInstancesInput{Instances: []*string{&instanceID}}
output, err := c.InstanceService.DescribeInstances(input)
if err != nil {
return nil, err
}
if len(output.InstanceSet) == 0 {
2017-03-27 02:57:47 +00:00
return nil, fmt.Errorf("Instance with id [%s] not exist", instanceID)
2017-01-17 09:24:29 +00:00
}
return output.InstanceSet[0], nil
}
2017-03-27 02:57:47 +00:00
// StartInstance
2017-01-17 09:24:29 +00:00
func (c *client) StartInstance(instanceID string) error {
input := &service.StartInstancesInput{Instances: []*string{&instanceID}}
output, err := c.InstanceService.StartInstances(input)
if err != nil {
return err
}
jobID := output.JobID
waitErr := c.waitJob(*jobID)
if waitErr != nil {
return waitErr
}
2017-01-17 09:51:33 +00:00
_, err = c.WaitInstanceStatus(instanceID, InstanceStatusRunning)
2017-01-17 09:24:29 +00:00
return err
}
2017-03-27 02:57:47 +00:00
// StopInstance
2017-01-17 09:24:29 +00:00
func (c *client) StopInstance(instanceID string, force bool) error {
var forceParam int
if force {
forceParam = 1
} else {
forceParam = 0
}
input := &service.StopInstancesInput{Instances: []*string{&instanceID}, Force: &forceParam}
output, err := c.InstanceService.StopInstances(input)
if err != nil {
return err
}
jobID := output.JobID
waitErr := c.waitJob(*jobID)
if waitErr != nil {
return waitErr
}
2017-01-17 09:51:33 +00:00
_, err = c.WaitInstanceStatus(instanceID, InstanceStatusStopped)
2017-01-17 09:24:29 +00:00
return err
}
2017-03-27 02:57:47 +00:00
// RestartInstance
2017-01-17 09:24:29 +00:00
func (c *client) RestartInstance(instanceID string) error {
input := &service.RestartInstancesInput{Instances: []*string{&instanceID}}
output, err := c.InstanceService.RestartInstances(input)
if err != nil {
return err
}
jobID := output.JobID
waitErr := c.waitJob(*jobID)
if waitErr != nil {
return waitErr
}
2017-01-17 09:51:33 +00:00
_, err = c.WaitInstanceStatus(instanceID, InstanceStatusRunning)
2017-01-17 09:24:29 +00:00
return err
}
2017-03-27 02:57:47 +00:00
// TerminateInstance
2017-01-17 09:24:29 +00:00
func (c *client) TerminateInstance(instanceID string) error {
input := &service.TerminateInstancesInput{Instances: []*string{&instanceID}}
output, err := c.InstanceService.TerminateInstances(input)
if err != nil {
return err
}
jobID := output.JobID
waitErr := c.waitJob(*jobID)
if waitErr != nil {
return waitErr
}
2017-01-17 09:51:33 +00:00
_, err = c.WaitInstanceStatus(instanceID, InstanceStatusTerminated)
2017-01-17 09:24:29 +00:00
return err
}
func (c *client) waitJob(jobID string) error {
return WaitJob(c.JobService, jobID, c.OperationTimeout, c.WaitInterval)
}
2017-03-27 02:57:47 +00:00
// WaitInstanceStatus
2017-01-17 09:24:29 +00:00
func (c *client) WaitInstanceStatus(instanceID string, status string) (*service.Instance, error) {
return WaitInstanceStatus(c.InstanceService, instanceID, status, c.OperationTimeout, c.WaitInterval)
}
func (c *client) waitInstanceNetwork(instanceID string) (*service.Instance, error) {
return WaitInstanceNetwork(c.InstanceService, instanceID, c.OperationTimeout, c.WaitInterval)
}