Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions ansi/code.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@ import (

const csi = "\x1b["

// const OSC = "\x1b]"
// const BEL = "\x07"
const sep = ";"

//CursorLeft move cursor to the left side
Expand All @@ -17,11 +15,20 @@ var CursorLeft = fmt.Sprintf("%sG", csi)
//EraseDown Erase the screen from the current line down to the bottom of the
var EraseDown = fmt.Sprintf("%sJ", csi)

//EraseUp Erase the screen from the current line up to the top of the screen
var EraseUp = fmt.Sprintf("%s1J", csi)

//CursorUp Move cursor up a specific amount of rows.
func CursorUp(count int) string {
return fmt.Sprintf("%s%dA", csi, count)
}

//CursorTo
//CursorPrevLine Move cursor up a specific amount of rows.
func CursorPrevLine(count int) string {
return fmt.Sprintf("%s%dF", csi, count)
}

//CursorTo Set the absolute position of the cursor. `x` `y` is the top left of the screen.
func CursorTo(x, y int) string {
return fmt.Sprintf("%s%d;%dH", csi, y+1, x+1)
}
3 changes: 3 additions & 0 deletions base/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"github.com/ucloud/ucloud-sdk-go/services/ulb"
"github.com/ucloud/ucloud-sdk-go/services/umem"
"github.com/ucloud/ucloud-sdk-go/services/unet"
"github.com/ucloud/ucloud-sdk-go/services/uphost"
"github.com/ucloud/ucloud-sdk-go/services/vpc"
"github.com/ucloud/ucloud-sdk-go/ucloud"
"github.com/ucloud/ucloud-sdk-go/ucloud/auth"
Expand All @@ -39,6 +40,7 @@ type Client struct {
ulb.ULBClient
udb.UDBClient
umem.UMemClient
uphost.UPHostClient
PrivateUHostClient
PrivateUDBClient
PrivateUMemClient
Expand All @@ -57,6 +59,7 @@ func NewClient(config *ucloud.Config, credential *auth.Credential) *Client {
*ulb.NewClient(config, credential),
*udb.NewClient(config, credential),
*umem.NewClient(config, credential),
*uphost.NewClient(config, credential),
*puhost.NewClient(config, credential),
*pudb.NewClient(config, credential),
*pumem.NewClient(config, credential),
Expand Down
112 changes: 112 additions & 0 deletions base/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,15 @@ import (
"runtime"
"strconv"
"strings"
"sync"
"time"
"unicode"

sdk "github.com/ucloud/ucloud-sdk-go/ucloud"
uerr "github.com/ucloud/ucloud-sdk-go/ucloud/error"
"github.com/ucloud/ucloud-sdk-go/ucloud/helpers/waiter"
"github.com/ucloud/ucloud-sdk-go/ucloud/log"
"github.com/ucloud/ucloud-sdk-go/ucloud/request"
"github.com/ucloud/ucloud-sdk-go/ucloud/response"

"github.com/ucloud/ucloud-cli/model"
Expand All @@ -39,6 +41,38 @@ var SdkClient *sdk.Client
//BizClient 用于调用业务接口
var BizClient *Client

//Logger 日志
var Logger = log.New()
var mu sync.Mutex

func init() {
file, err := os.Create(GetHomePath() + fmt.Sprintf("/%s/cli.log", ConfigPath))
if err != nil {
return
}
Logger.SetOutput(file)
}

//Log 记录日志
func Log(logs []string) {
mu.Lock()
defer mu.Unlock()
Logger.Info("=============================================================")
for _, line := range logs {
Logger.Info(line)
}
}

//ToQueryMap tranform request to map
func ToQueryMap(req request.Common) map[string]string {
reqMap, err := request.ToQueryMap(req)
if err != nil {
return nil
}
// delete(reqMap, "Password")
return reqMap
}

//GetHomePath 获取家目录
func GetHomePath() string {
if runtime.GOOS == "windows" {
Expand Down Expand Up @@ -129,6 +163,19 @@ func HandleError(err error) {
}
}

//ParseError 解析错误为字符串
func ParseError(err error) string {
if uErr, ok := err.(uerr.Error); ok && uErr.Code() != 0 {
format := "Something wrong. RetCode:%d. Message:%s"
message := uErr.Message()
if uErr.Code() == -1 || uErr.Code() == -2 {
message = "request timeout, retry later please"
}
return fmt.Sprintf(format, uErr.Code(), message)
}
return fmt.Sprintf("Error:%v", err)
}

//PrintJSON 以JSON格式打印数据集合
func PrintJSON(dataSet interface{}) error {
bytes, err := json.MarshalIndent(dataSet, "", " ")
Expand Down Expand Up @@ -294,6 +341,7 @@ var RegionLabel = map[string]string{
"cn-bj2": "Beijing2",
"cn-sh2": "Shanghai2",
"cn-gd": "Guangzhou",
"cn-qz": "Quanzhou",
"hk": "Hongkong",
"us-ca": "LosAngeles",
"us-ws": "Washington",
Expand Down Expand Up @@ -322,6 +370,70 @@ type Poller struct {
SdescribeFunc func(string) (interface{}, error)
}

//Sspoll 简化版, 支持并发
func (p *Poller) Sspoll(resourceID, pollText string, targetStates []string, block *ux.Block) {
w := waiter.StateWaiter{
Pending: []string{"pending"},
Target: []string{"avaliable"},
Refresh: func() (interface{}, string, error) {
inst, err := p.SdescribeFunc(resourceID)
if err != nil {
return nil, "", err
}

if inst == nil {
return nil, "pending", nil
}
instValue := reflect.ValueOf(inst)
instValue = reflect.Indirect(instValue)
instType := instValue.Type()
if instValue.Kind() != reflect.Struct {
return nil, "", fmt.Errorf("Instance is not struct")
}
state := ""
for i := 0; i < instValue.NumField(); i++ {
for _, sf := range p.stateFields {
if instType.Field(i).Name == sf {
state = instValue.Field(i).String()
}
}
}
if state != "" {
for _, t := range targetStates {
if t == state {
return inst, "avaliable", nil
}
}
}
return nil, "pending", nil

},
Timeout: p.Timeout,
}

done := make(chan bool)
go func() {
if _, err := w.Wait(); err != nil {
log.Error(err)
if _, ok := err.(*waiter.TimeoutError); ok {
done <- false
return
}
}
done <- true
}()

spin := ux.NewDotSpin(p.Out, pollText)
block.SetSpin(spin)

ret := <-done
if ret {
spin.Stop()
} else {
spin.Timeout()
}
}

//Spoll 简化版
func (p *Poller) Spoll(resourceID, pollText string, targetStates []string) {
w := waiter.StateWaiter{
Expand Down
23 changes: 23 additions & 0 deletions cmd/eip.go
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,29 @@ func bindEIP(resourceID, resourceType, eipID, projectID, region *string) {
}
}

func sbindEIP(resourceID, resourceType, eipID, projectID, region *string) string {
ip := net.ParseIP(*eipID)
if ip != nil {
eipID, err := getEIPIDbyIP(ip, *projectID, *region)
if err != nil {
base.HandleError(err)
} else {
*resourceID = eipID
}
}
req := base.BizClient.NewBindEIPRequest()
req.ResourceId = resourceID
req.ResourceType = resourceType
req.EIPId = sdk.String(base.PickResourceID(*eipID))
req.ProjectId = sdk.String(base.PickResourceID(*projectID))
req.Region = region
_, err := base.BizClient.BindEIP(req)
if err != nil {
return base.ParseError(err)
}
return fmt.Sprintf("bind EIP[%s] with %s[%s]", *req.EIPId, *req.ResourceType, *req.ResourceId)
}

//NewCmdEIPUnbind ucloud eip unbind
func NewCmdEIPUnbind() *cobra.Command {
eipIDs := []string{}
Expand Down
1 change: 1 addition & 0 deletions cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ func NewCmdRoot() *cobra.Command {
cmd.AddCommand(NewCmdRegion())
cmd.AddCommand(NewCmdProject())
cmd.AddCommand(NewCmdUHost())
cmd.AddCommand(NewCmdUPHost())
cmd.AddCommand(NewCmdEIP())
cmd.AddCommand(NewCmdGssh())
cmd.AddCommand(NewCmdUImage())
Expand Down
6 changes: 0 additions & 6 deletions cmd/root_test.go

This file was deleted.

Loading