From 70271403202823ed1fab8e9eac0b504de4db6878 Mon Sep 17 00:00:00 2001 From: lixiaojun Date: Fri, 12 Jul 2019 17:59:08 +0800 Subject: [PATCH] pathx uga --- Makefile | 2 +- base/client.go | 8 +- base/config.go | 2 +- cmd/configure.go | 4 + cmd/mysql.go | 2 +- cmd/pathx.go | 556 +++++++++++++++++++++++++++++++++++++++++++++++ cmd/root.go | 5 +- go.mod | 2 +- go.sum | 4 +- 9 files changed, 576 insertions(+), 9 deletions(-) create mode 100644 cmd/pathx.go diff --git a/Makefile b/Makefile index 9a4582ef73..9322aa1acf 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -export VERSION=0.1.19 +export VERSION=0.1.20 .PHONY : build build: diff --git a/base/client.go b/base/client.go index a929af3ea9..57d58dde18 100644 --- a/base/client.go +++ b/base/client.go @@ -1,6 +1,7 @@ package base import ( + ppathx "github.com/ucloud/ucloud-sdk-go/private/services/pathx" pudb "github.com/ucloud/ucloud-sdk-go/private/services/udb" puhost "github.com/ucloud/ucloud-sdk-go/private/services/uhost" pumem "github.com/ucloud/ucloud-sdk-go/private/services/umem" @@ -25,9 +26,12 @@ type PrivateUHostClient = puhost.UHostClient //PrivateUDBClient 私有模块的udb client 即未在官网开放的接口 type PrivateUDBClient = pudb.UDBClient -//PrivateUMemClient 私有模块的udb client 即未在官网开放的接口 +//PrivateUMemClient 私有模块的umem client 即未在官网开放的接口 type PrivateUMemClient = pumem.UMemClient +//PrivatePathxClient 私有模块的pathx client 即未在官网开放的接口 +type PrivatePathxClient = ppathx.PathXClient + //Client aggregate client for business type Client struct { uaccount.UAccountClient @@ -44,6 +48,7 @@ type Client struct { PrivateUHostClient PrivateUDBClient PrivateUMemClient + PrivatePathxClient } // NewClient will return a aggregate client @@ -63,5 +68,6 @@ func NewClient(config *ucloud.Config, credential *auth.Credential) *Client { *puhost.NewClient(config, credential), *pudb.NewClient(config, credential), *pumem.NewClient(config, credential), + *ppathx.NewClient(config, credential), } } diff --git a/base/config.go b/base/config.go index 1f42b3b8ab..48d9f608f0 100644 --- a/base/config.go +++ b/base/config.go @@ -31,7 +31,7 @@ const DefaultBaseURL = "https://api.ucloud.cn/" const DefaultProfile = "default" //Version 版本号 -const Version = "0.1.19" +const Version = "0.1.20" //ConfigIns 配置实例, 程序加载时生成 var ConfigIns = &AggConfig{Profile: "default"} diff --git a/cmd/configure.go b/cmd/configure.go index 0d3eb15737..16ee3276d1 100644 --- a/cmd/configure.go +++ b/cmd/configure.go @@ -406,6 +406,10 @@ func NewCmdConfigUpdate() *cobra.Command { cacheConfig.Region = region cacheConfig.Zone = zone + if cfg.ProjectID != "" { + cacheConfig.ProjectID = base.PickResourceID(cfg.ProjectID) + } + project, err := getReasonableProject(cacheConfig) if err != nil { base.HandleError(err) diff --git a/cmd/mysql.go b/cmd/mysql.go index 4f52ceede2..0d257e56e1 100644 --- a/cmd/mysql.go +++ b/cmd/mysql.go @@ -872,7 +872,7 @@ func getUDBList(states []string, dbType, project, region, zone string) ([]udb.UD } } } else { - list = append(list, resp.DataSet...) + list = append(list, ins) } } if offset+limit >= resp.TotalCount { diff --git a/cmd/pathx.go b/cmd/pathx.go new file mode 100644 index 0000000000..d6b00d202d --- /dev/null +++ b/cmd/pathx.go @@ -0,0 +1,556 @@ +// Copyright © 2018 NAME HERE tony.li@ucloud.cn +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package cmd + +import ( + "fmt" + "io" + "strconv" + "strings" + + "github.com/spf13/cobra" + + ppathx "github.com/ucloud/ucloud-sdk-go/private/services/pathx" + sdk "github.com/ucloud/ucloud-sdk-go/ucloud" + uerr "github.com/ucloud/ucloud-sdk-go/ucloud/error" + + "github.com/ucloud/ucloud-cli/base" +) + +//NewCmdPathx ucloud pathx +func NewCmdPathx() *cobra.Command { + cmd := &cobra.Command{ + Use: "pathx", + Short: "Manipulate uga and upath instances", + Long: "Manipulate uga and upath instances", + } + cmd.AddCommand(NewCmdUGA()) + cmd.AddCommand(NewCmdUpath()) + return cmd +} + +//NewCmdUpath ucloud pathx upath +func NewCmdUpath() *cobra.Command { + cmd := &cobra.Command{ + Use: "upath", + Short: "List pathx upath instances", + Long: "List pathx upath instances", + } + out := base.Cxt.GetWriter() + cmd.AddCommand(NewCmdUpathList(out)) + return cmd +} + +type upathRow struct { + ResourceID string + UPathName string + AcceleratedPath string + BoundUGA string +} + +//NewCmdUpathList ucloud pathx upath list +func NewCmdUpathList(out io.Writer) *cobra.Command { + req := base.BizClient.NewDescribeUPathRequest() + cmd := &cobra.Command{ + Use: "list", + Short: "list upath instances", + Long: "list upath instances", + Run: func(c *cobra.Command, args []string) { + resp, err := base.BizClient.DescribeUPath(req) + if err != nil { + base.HandleError(err) + return + } + list := make([]upathRow, 0) + for _, ins := range resp.UPathSet { + row := upathRow{ + ResourceID: ins.UPathId, + UPathName: ins.Name, + AcceleratedPath: fmt.Sprintf("%s->%s %dM", ins.LineFromName, ins.LineToName, ins.Bandwidth), + } + ids := []string{} + for _, ga := range ins.UGAList { + ids = append(ids, ga.UGAId) + } + row.BoundUGA = strings.Join(ids, ",") + list = append(list, row) + } + base.PrintList(list, out) + }, + } + + flags := cmd.Flags() + flags.SortFlags = false + + bindProjectID(req, flags) + req.UPathId = flags.String("upath-id", "", "Optional. Resource ID of upath instance to list") + + return cmd +} + +//NewCmdUGA ucloud uga +func NewCmdUGA() *cobra.Command { + cmd := &cobra.Command{ + Use: "uga", + Short: "Create,list,update and delete pathx uga instances", + Long: `Create,list,update and delete pathx uga instances`, + } + + out := base.Cxt.GetWriter() + cmd.AddCommand(NewCmdUGAList(out)) + cmd.AddCommand(NewCmdUGADescribe(out)) + cmd.AddCommand(NewCmdUGACreate(out)) + cmd.AddCommand(NewCmdUGADelete(out)) + cmd.AddCommand(NewCmdUGAAddPort(out)) + cmd.AddCommand(NewCmdUGARemovePort(out)) + + return cmd +} + +//UGARow 表格行 +type UGARow struct { + ResourceID string + UGAName string + CName string + Origin string + AcceleratedPath string +} + +var protocols = []string{"tcp", "udp"} + +//NewCmdUGAList ucloud uga list +func NewCmdUGAList(out io.Writer) *cobra.Command { + req := base.BizClient.NewDescribeUGAInstanceRequest() + cmd := &cobra.Command{ + Use: "list", + Short: "list uga instances", + Long: "list uga instances", + Run: func(c *cobra.Command, args []string) { + *req.UGAId = base.PickResourceID(*req.UGAId) + resp, err := base.BizClient.DescribeUGAInstance(req) + if err != nil { + base.HandleError(err) + return + } + + list := make([]UGARow, 0) + for _, ins := range resp.UGAList { + row := UGARow{ + ResourceID: ins.UGAId, + UGAName: ins.UGAName, + CName: ins.CName, + Origin: fmt.Sprintf("%s%s", strings.Join(ins.IPList, ","), ins.Domain), + } + row.AcceleratedPath = getUpathStr(ins.UPathSet) + list = append(list, row) + } + base.PrintList(list, out) + }, + } + + flags := cmd.Flags() + flags.SortFlags = false + + req.UGAId = flags.String("uga-id", "", "Optional. Resource ID of uga instance") + bindProjectID(req, flags) + + return cmd +} + +func getUpathStr(list []ppathx.UPathSet) string { + paths := make([]string, 0) + for _, p := range list { + paths = append(paths, fmt.Sprintf("%s->%s %dM", p.LineFromName, p.LineToName, p.Bandwidth)) + } + return strings.Join(paths, "\n") +} + +func getOutIPStr(list []ppathx.OutPublicIpInfo) string { + strs := make([]string, 0) + for _, p := range list { + strs = append(strs, fmt.Sprintf("%s %s", p.IP, base.RegionLabel[p.Area])) + } + return strings.Join(strs, "\n") +} + +func getPortStr(list []ppathx.UGAATask) string { + strs := make([]string, 0) + for _, t := range list { + strs = append(strs, fmt.Sprintf("%s %d", t.Protocol, t.Port)) + } + return strings.Join(strs, "\n") +} + +//NewCmdUGADescribe ucloud uga describe +func NewCmdUGADescribe(out io.Writer) *cobra.Command { + req := base.BizClient.NewDescribeUGAInstanceRequest() + cmd := &cobra.Command{ + Use: "describe", + Short: "Display detail informations about uga instances", + Long: "Display detail informations about uga instances", + Run: func(c *cobra.Command, args []string) { + *req.UGAId = base.PickResourceID(*req.UGAId) + resp, err := base.BizClient.DescribeUGAInstance(req) + if err != nil { + base.HandleError(err) + return + } + if len(resp.UGAList) != 1 { + base.HandleError(fmt.Errorf("uga[%s] may not exist", *req.UGAId)) + return + } + + ins := resp.UGAList[0] + list := []base.DescribeTableRow{ + base.DescribeTableRow{"ResourceID", ins.UGAId}, + base.DescribeTableRow{"UGAName", ins.UGAName}, + base.DescribeTableRow{"Origin", fmt.Sprintf("%s%s", ins.Domain, strings.Join(ins.IPList, ","))}, + base.DescribeTableRow{"CName", ins.CName}, + base.DescribeTableRow{"AcceleratedPath", getUpathStr(ins.UPathSet)}, + base.DescribeTableRow{"OutIP", getOutIPStr(ins.OutPublicIpList)}, + base.DescribeTableRow{"Port", getPortStr(ins.TaskSet)}, + } + base.PrintList(list, out) + }, + } + + flags := cmd.Flags() + flags.SortFlags = false + + req.UGAId = flags.String("uga-id", "", "Required. Resource ID of uga instance") + bindProjectID(req, flags) + + cmd.MarkFlagRequired("uga-id") + flags.SetFlagValuesFunc("uga-id", func() []string { + return getUGAIDList(*req.ProjectId) + }) + + return cmd +} + +func formatPortList(userPorts []string) ([]string, error) { + portList := make([]string, 0) + for _, port := range userPorts { + if strings.Contains(port, "-") { + portRange := strings.Split(port, "-") + if len(portRange) != 2 { + return nil, fmt.Errorf("port %s is invalid, it's pattern should be like 3000-3100", port) + } + min, err := strconv.Atoi(portRange[0]) + if err != nil { + return nil, fmt.Errorf("parse port failed: %v", err) + } + max, err := strconv.Atoi(portRange[1]) + if err != nil { + return nil, fmt.Errorf("parse port failed: %v", err) + } + + for i := min; i <= max; i++ { + portList = append(portList, strconv.Itoa(i)) + } + } else { + portList = append(portList, port) + } + } + return portList, nil +} + +//NewCmdUGACreate ucloud uga create +func NewCmdUGACreate(out io.Writer) *cobra.Command { + var protocol string + var ports, lines []string + req := base.BizClient.NewCreateUGAInstanceRequest() + cmd := &cobra.Command{ + Use: "create", + Short: "Create uga instance", + Long: "Create uga instance", + Example: "ucloud pathx uga create --name testcli1 --protocol tcp --origin-location 中国 --origin-domain lixiaojun.xyz --upath-id upath-auvfexxx/test_0 --port 80-90,100,110-115", + Run: func(c *cobra.Command, args []string) { + if *req.IPList == "" && *req.Domain == "" { + fmt.Fprintln(out, "origin-ip and origin-domain can not be both empty") + return + } + + portList, err := formatPortList(ports) + if err != nil { + base.HandleError(err) + return + } + + switch strings.ToLower(protocol) { + case "tcp": + req.TCP = portList + case "udp": + req.UDP = portList + case "http": + req.HTTP = portList + case "https": + req.HTTPS = portList + default: + fmt.Fprintf(out, "protocol should be one of %s, received:%s\n", strings.Join(protocols, ","), protocol) + } + + resp, err := base.BizClient.CreateUGAInstance(req) + if err != nil { + if uErr, ok := err.(uerr.Error); ok && uErr.Code() == 33756 { + fmt.Fprintf(out, "The number of ports added exceeds the limit(50). We recommend that you could reduce the number of ports, then create an uga instance, \nand then add the remaining ports by executing 'ucloud pathx uga add-port --protocol %s --uga-id --port '\n", protocol) + } + return + } + + fmt.Fprintf(out, "uga[%s] created\n", resp.UGAId) + + for _, path := range lines { + p := base.PickResourceID(path) + bindReq := base.BizClient.NewUGABindUPathRequest() + bindReq.ProjectId = req.ProjectId + bindReq.UGAId = sdk.String(resp.UGAId) + bindReq.UPathId = &p + _, err := base.BizClient.UGABindUPath(bindReq) + if err != nil { + fmt.Fprintf(out, "bind uga[%s] and upath[%s] failed: %v\n", resp.UGAId, p, err) + } else { + fmt.Fprintf(out, "bound uga[%s] and upath[%s]\n", resp.UGAId, p) + } + } + }, + } + + flags := cmd.Flags() + flags.SortFlags = false + + bindProjectID(req, flags) + req.Name = flags.String("name", "", "Required. Name of uga instance to create") + req.IPList = flags.String("origin-ip", "", "Required if origin-domain is empty. IP address of origin. multiple IP address separated by ','") + req.Domain = flags.String("origin-domain", "", "Required if origin-ip is empty.") + req.Location = flags.String("origin-location", "", "Required. Location of origin ip or domain. accpet valeus:'中国','洛杉矶','法兰克福','中国香港','雅加达','孟买','东京','莫斯科','新加坡','曼谷','中国台北','华盛顿','首尔'") + flags.StringVar(&protocol, "protocol", "", fmt.Sprintf("Required. accept values: %s", strings.Join(protocols, ","))) + flags.StringSliceVar(&ports, "port", nil, "Required. Single port or port range, separated by ',', for example 80,3000-3010") + flags.StringSliceVar(&lines, "upath-id", nil, "Required. Accelerated path to bind with the uga instance to create. multiple upath-id separated by ','; see 'ucloud pathx upath list") + + cmd.MarkFlagRequired("name") + cmd.MarkFlagRequired("origin-location") + cmd.MarkFlagRequired("protocol") + cmd.MarkFlagRequired("port") + cmd.MarkFlagRequired("upath-id") + + flags.SetFlagValues("origin-location", "中国", "洛杉矶", "法兰克福", "中国香港", "雅加达", "孟买", "东京", "莫斯科", "新加坡", "曼谷", "中国台北", "华盛顿", "首尔") + flags.SetFlagValues("protocol", protocols...) + flags.SetFlagValuesFunc("upath-id", func() []string { + return getUpathIDList(*req.ProjectId) + }) + + return cmd +} + +//NewCmdUGADelete ucloud uga delete +func NewCmdUGADelete(out io.Writer) *cobra.Command { + idNames := []string{} + req := base.BizClient.NewDeleteUGAInstanceRequest() + cmd := &cobra.Command{ + Use: "delete", + Short: "Delete uga instances", + Long: "Delete uga instances", + Run: func(c *cobra.Command, args []string) { + for _, idname := range idNames { + id := base.PickResourceID(idname) + req.UGAId = &id + _, err := base.BizClient.DeleteUGAInstance(req) + if err != nil { + base.HandleError(err) + } else { + fmt.Fprintf(out, "uga[%s] deleted\n", id) + } + } + }, + } + + flags := cmd.Flags() + flags.SortFlags = false + + bindProjectID(req, flags) + flags.StringSliceVar(&idNames, "uga-id", nil, "Required. Resource ID of uga instances to delete. Multiple resource ids separated by comma") + + cmd.MarkFlagRequired("uga-id") + flags.SetFlagValuesFunc("uga-id", func() []string { + return getUGAIDList(*req.ProjectId) + }) + + return cmd +} + +//NewCmdUGAAddPort ucloud pathx uga add-port +func NewCmdUGAAddPort(out io.Writer) *cobra.Command { + var ports []string + var protocol string + req := base.BizClient.NewAddUGATaskRequest() + cmd := &cobra.Command{ + Use: "add-port", + Short: "Add port for uga instance", + Long: "Add port for uga instance", + Run: func(c *cobra.Command, args []string) { + portList, err := formatPortList(ports) + if err != nil { + base.HandleError(err) + return + } + + switch strings.ToLower(protocol) { + case "tcp": + req.TCP = portList + case "udp": + req.UDP = portList + case "http": + req.HTTP = portList + case "https": + req.HTTPS = portList + default: + fmt.Fprintf(out, "protocol should be one of %s, received:%s\n", strings.Join(protocols, ","), protocol) + } + + *req.UGAId = base.PickResourceID(*req.UGAId) + _, err = base.BizClient.AddUGATask(req) + if err != nil { + base.HandleError(err) + return + } + fmt.Fprintf(out, "port %v added\n", ports) + }, + } + + flags := cmd.Flags() + flags.SortFlags = false + + bindProjectID(req, flags) + req.UGAId = flags.String("uga-id", "", "Required. Resource ID of uga instance to add port") + flags.StringVar(&protocol, "protocol", "", fmt.Sprintf("Required. accept values: %s", strings.Join(protocols, ","))) + flags.StringSliceVar(&ports, "port", nil, "Required. Single port or port range, separated by ',', for example 80,3000-3010") + + cmd.MarkFlagRequired("protocol") + cmd.MarkFlagRequired("uga-id") + cmd.MarkFlagRequired("port") + + flags.SetFlagValues("protocol", protocols...) + flags.SetFlagValuesFunc("uga-id", func() []string { + return getUGAIDList(*req.ProjectId) + }) + + return cmd +} + +//NewCmdUGARemovePort ucloud pathx uga delete-port +func NewCmdUGARemovePort(out io.Writer) *cobra.Command { + var ports []string + var protocol string + req := base.BizClient.NewDeleteUGATaskRequest() + cmd := &cobra.Command{ + Use: "delete-port", + Short: "Delete port for uga instance", + Long: "Delete port for uga instance", + Run: func(c *cobra.Command, args []string) { + portList, err := formatPortList(ports) + if err != nil { + base.HandleError(err) + return + } + + switch strings.ToLower(protocol) { + case "tcp": + req.TCP = portList + case "udp": + req.UDP = portList + case "http": + req.HTTP = portList + case "https": + req.HTTPS = portList + default: + fmt.Fprintf(out, "protocol should be one of %s, received:%s\n", strings.Join(protocols, ","), protocol) + } + + *req.UGAId = base.PickResourceID(*req.UGAId) + _, err = base.BizClient.DeleteUGATask(req) + if err != nil { + base.HandleError(err) + return + } + fmt.Fprintf(out, "port %v deleted\n", ports) + }, + } + + flags := cmd.Flags() + flags.SortFlags = false + + bindProjectID(req, flags) + req.UGAId = flags.String("uga-id", "", "Required. Resource ID of uga instance to delete port") + flags.StringVar(&protocol, "protocol", "", fmt.Sprintf("Required. accept values: %s", strings.Join(protocols, ","))) + flags.StringSliceVar(&ports, "port", nil, "Required. Single port or port range, separated by ',', for example 80,3000-3010") + + cmd.MarkFlagRequired("protocol") + cmd.MarkFlagRequired("uga-id") + cmd.MarkFlagRequired("port") + + flags.SetFlagValues("protocol", protocols...) + flags.SetFlagValuesFunc("uga-id", func() []string { + return getUGAIDList(*req.ProjectId) + }) + + return cmd +} + +func getUGAList(project string) ([]ppathx.UGAAInfo, error) { + req := base.BizClient.NewDescribeUGAInstanceRequest() + req.ProjectId = &project + resp, err := base.BizClient.DescribeUGAInstance(req) + if err != nil { + return nil, err + } + return resp.UGAList, nil +} + +func getUGAIDList(project string) []string { + list, err := getUGAList(project) + if err != nil { + base.LogError(fmt.Sprintf("getUDGAIDList filed:%v", err)) + return nil + } + strs := make([]string, 0) + for _, ins := range list { + strs = append(strs, fmt.Sprintf("%s/%s", ins.UGAId, ins.UGAName)) + } + return strs +} + +func getUpathList(project string) ([]ppathx.UPathInfo, error) { + req := base.BizClient.NewDescribeUPathRequest() + req.ProjectId = &project + resp, err := base.BizClient.DescribeUPath(req) + if err != nil { + return nil, err + } + return resp.UPathSet, nil +} + +func getUpathIDList(project string) []string { + list, err := getUpathList(project) + if err != nil { + base.LogError(fmt.Sprintf("getUpathIDList failed:%v", err)) + return nil + } + strs := make([]string, 0) + for _, ins := range list { + strs = append(strs, fmt.Sprintf("%s/%s", ins.UPathId, ins.Name)) + } + return strs +} diff --git a/cmd/root.go b/cmd/root.go index 970ccba23e..1509992a4c 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -66,16 +66,17 @@ func NewCmdRoot() *cobra.Command { cmd.AddCommand(NewCmdProject()) cmd.AddCommand(NewCmdUHost()) cmd.AddCommand(NewCmdUPHost()) - cmd.AddCommand(NewCmdEIP()) - cmd.AddCommand(NewCmdGssh()) cmd.AddCommand(NewCmdUImage()) cmd.AddCommand(NewCmdSubnet()) cmd.AddCommand(NewCmdVpc()) cmd.AddCommand(NewCmdFirewall()) cmd.AddCommand(NewCmdDisk()) + cmd.AddCommand(NewCmdEIP()) cmd.AddCommand(NewCmdBandwidth()) cmd.AddCommand(NewCmdUDPN(out)) cmd.AddCommand(NewCmdULB()) + cmd.AddCommand(NewCmdGssh()) + cmd.AddCommand(NewCmdPathx()) cmd.AddCommand(NewCmdMysql()) cmd.AddCommand(NewCmdRedis()) cmd.AddCommand(NewCmdMemcache()) diff --git a/go.mod b/go.mod index a6107d55ca..2b3766a1f5 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/sirupsen/logrus v1.3.0 github.com/spf13/cobra v0.0.3 github.com/spf13/pflag v1.0.3 - github.com/ucloud/ucloud-sdk-go v0.8.9 + github.com/ucloud/ucloud-sdk-go v0.8.10 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect ) diff --git a/go.sum b/go.sum index 843bc49ae7..4c5d392d3b 100644 --- a/go.sum +++ b/go.sum @@ -51,8 +51,8 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/ucloud/ucloud-sdk-go v0.8.9 h1:+LsXVJiI7YMqgEsqLAF0VgfgN6ez11jrg5E2Hx/hwJ8= -github.com/ucloud/ucloud-sdk-go v0.8.9/go.mod h1:lM6fpI8y6iwACtlbHUav823/uKPdXsNBlnBpRF2fj3c= +github.com/ucloud/ucloud-sdk-go v0.8.10 h1:CNpVvsGRV2CDeme6pmAg8AcMxxBERYndcOzyu0dRgCg= +github.com/ucloud/ucloud-sdk-go v0.8.10/go.mod h1:lM6fpI8y6iwACtlbHUav823/uKPdXsNBlnBpRF2fj3c= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8 h1:3SVOIvH7Ae1KRYyQWRjXWJEA9sS/c/pjvH++55Gr648= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=