From 291bbdc2c26ac74459ed49e98f5693ea81fb650c Mon Sep 17 00:00:00 2001 From: lixiaojun Date: Tue, 22 Jan 2019 17:21:45 +0800 Subject: [PATCH 1/3] ulb vserver ssl-certificate --- ansi/code.go | 25 +- base/client.go | 3 + base/util.go | 28 + cmd/eip.go | 87 +- cmd/globalssh.go | 33 +- cmd/image.go | 28 +- cmd/root.go | 7 +- cmd/uhost.go | 135 +- cmd/ulb.go | 1631 +++++++++++++++++ cmd/util.go | 67 + cmd/vpc.go | 4 +- main.go | 4 +- vendor/github.com/spf13/cobra/command.go | 132 +- vendor/github.com/spf13/cobra/doc/man_docs.go | 236 +++ vendor/github.com/spf13/cobra/doc/man_docs.md | 31 + vendor/github.com/spf13/cobra/doc/md_docs.go | 159 ++ vendor/github.com/spf13/cobra/doc/md_docs.md | 115 ++ .../github.com/spf13/cobra/doc/rest_docs.go | 185 ++ .../github.com/spf13/cobra/doc/rest_docs.md | 114 ++ vendor/github.com/spf13/cobra/doc/util.go | 51 + .../github.com/spf13/cobra/doc/yaml_docs.go | 169 ++ .../github.com/spf13/cobra/doc/yaml_docs.md | 112 ++ .../services/ulb/allocate_backend.go | 66 + .../services/ulb/allocate_backend_batch.go | 59 + .../ucloud-sdk-go/services/ulb/bind_ssl.go | 53 + .../ucloud-sdk-go/services/ulb/client.go | 19 + .../services/ulb/create_policy.go | 62 + .../ucloud-sdk-go/services/ulb/create_ssl.go | 65 + .../ucloud-sdk-go/services/ulb/create_ulb.go | 74 + .../services/ulb/create_vserver.go | 83 + .../services/ulb/delete_policy.go | 53 + .../ucloud-sdk-go/services/ulb/delete_ssl.go | 47 + .../ucloud-sdk-go/services/ulb/delete_ulb.go | 50 + .../services/ulb/delete_vserver.go | 50 + .../services/ulb/describe_ssl.go | 59 + .../services/ulb/describe_ulb.go | 68 + .../services/ulb/describe_vserver.go | 62 + .../ucloud/ucloud-sdk-go/services/ulb/doc.go | 11 + .../services/ulb/release_backend.go | 50 + .../services/ulb/types_backend_set.go | 16 + .../services/ulb/types_policy_backend_set.go | 25 + .../ulb/types_sslbinded_target_set.go | 22 + .../services/ulb/types_ulbbackend_set.go | 38 + .../services/ulb/types_ulbipset.go | 19 + .../services/ulb/types_ulbpolicy_set.go | 34 + .../services/ulb/types_ulbset.go | 61 + .../services/ulb/types_ulbsslset.go | 31 + .../services/ulb/types_ulbvserver_set.go | 58 + .../ucloud-sdk-go/services/ulb/unbind_ssl.go | 53 + .../services/ulb/update_backend_attribute.go | 56 + .../services/ulb/update_policy.go | 65 + .../services/ulb/update_ulbattribute.go | 56 + .../services/ulb/update_vserver_attribute.go | 77 + .../ucloud-sdk-go/ucloud/request/common.go | 56 + vendor/vendor.json | 12 + 55 files changed, 4795 insertions(+), 171 deletions(-) create mode 100644 cmd/ulb.go create mode 100644 cmd/util.go create mode 100644 vendor/github.com/spf13/cobra/doc/man_docs.go create mode 100644 vendor/github.com/spf13/cobra/doc/man_docs.md create mode 100644 vendor/github.com/spf13/cobra/doc/md_docs.go create mode 100644 vendor/github.com/spf13/cobra/doc/md_docs.md create mode 100644 vendor/github.com/spf13/cobra/doc/rest_docs.go create mode 100644 vendor/github.com/spf13/cobra/doc/rest_docs.md create mode 100644 vendor/github.com/spf13/cobra/doc/util.go create mode 100644 vendor/github.com/spf13/cobra/doc/yaml_docs.go create mode 100644 vendor/github.com/spf13/cobra/doc/yaml_docs.md create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/allocate_backend.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/allocate_backend_batch.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/bind_ssl.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/client.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/create_policy.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/create_ssl.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/create_ulb.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/create_vserver.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/delete_policy.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/delete_ssl.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/delete_ulb.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/delete_vserver.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/describe_ssl.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/describe_ulb.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/describe_vserver.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/doc.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/release_backend.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_backend_set.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_policy_backend_set.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_sslbinded_target_set.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_ulbbackend_set.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_ulbipset.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_ulbpolicy_set.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_ulbset.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_ulbsslset.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_ulbvserver_set.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/unbind_ssl.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/update_backend_attribute.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/update_policy.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/update_ulbattribute.go create mode 100644 vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/update_vserver_attribute.go diff --git a/ansi/code.go b/ansi/code.go index 0f09f094fa..a837dd9221 100644 --- a/ansi/code.go +++ b/ansi/code.go @@ -1,18 +1,27 @@ -// Reference https://github.com/sindresorhus/ansi-escapes +//Package ansi reference https://github.com/sindresorhus/ansi-escapes package ansi import ( "fmt" ) -const ESC = "\x1b[" -const OSC = "\x1b]" -const BEL = "\x07" -const SEP = ";" +const csi = "\x1b[" -var CursorLeft = fmt.Sprintf("%sG", ESC) -var EraseDown = fmt.Sprintf("%sJ", ESC) +// const OSC = "\x1b]" +// const BEL = "\x07" +const sep = ";" + +//CursorLeft move cursor to the left side +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) func CursorUp(count int) string { - return fmt.Sprintf("%s%dA", ESC, count) + return fmt.Sprintf("%s%dA", csi, count) +} + +//CursorTo +func CursorTo(x, y int) string { + return fmt.Sprintf("%s%d;%dH", csi, y+1, x+1) } diff --git a/base/client.go b/base/client.go index dbdb6d80a5..bb5a713d8b 100644 --- a/base/client.go +++ b/base/client.go @@ -8,6 +8,7 @@ import ( "github.com/ucloud/ucloud-sdk-go/services/udisk" "github.com/ucloud/ucloud-sdk-go/services/udpn" "github.com/ucloud/ucloud-sdk-go/services/uhost" + "github.com/ucloud/ucloud-sdk-go/services/ulb" "github.com/ucloud/ucloud-sdk-go/services/unet" "github.com/ucloud/ucloud-sdk-go/services/vpc" "github.com/ucloud/ucloud-sdk-go/ucloud" @@ -29,6 +30,7 @@ type Client struct { udpn.UDPNClient pathx.PathXClient udisk.UDiskClient + ulb.ULBClient PrivateUHostClient } @@ -42,6 +44,7 @@ func NewClient(config *ucloud.Config, credential *auth.Credential) *Client { *udpn.NewClient(config, credential), *pathx.NewClient(config, credential), *udisk.NewClient(config, credential), + *ulb.NewClient(config, credential), *puhost.NewClient(config, credential), } } diff --git a/base/util.go b/base/util.go index ceab5a02d9..d769a68a12 100644 --- a/base/util.go +++ b/base/util.go @@ -156,6 +156,28 @@ func PrintTableS(dataSet interface{}) { } } +//PrintList 打印表格或者JSON +func PrintList(dataSet interface{}, json bool) { + if json { + PrintJSON(dataSet) + } else { + PrintTableS(dataSet) + } +} + +//PrintDescribe 打印详情 +func PrintDescribe(attrs []DescribeTableRow, json bool) { + if json { + PrintJSON(attrs) + } else { + for _, attr := range attrs { + fmt.Println(attr.Attribute) + fmt.Println(attr.Content) + fmt.Println() + } + } +} + //PrintTable 以表格方式打印数据集合 func PrintTable(dataSet interface{}, fieldList []string) { dataSetVal := reflect.ValueOf(dataSet) @@ -223,6 +245,12 @@ func printTable(rowList []map[string]interface{}, fieldList []string, fieldWidth } } +//DescribeTableRow 详情表格通用表格行 +type DescribeTableRow struct { + Attribute string + Content string +} + func calcCutWidth(text string) int { set := []*unicode.RangeTable{unicode.Han, unicode.Punct} width := 0 diff --git a/cmd/eip.go b/cmd/eip.go index 97ce4c3a9d..f92e402f15 100644 --- a/cmd/eip.go +++ b/cmd/eip.go @@ -226,7 +226,7 @@ func NewCmdEIPAllocate() *cobra.Command { Use: "allocate", Short: "Allocate EIP", Long: "Allocate EIP", - Example: "ucloud eip allocate --line BGP --bandwidth 2", + Example: "ucloud eip allocate --line BGP --bandwidth-mb 2", Run: func(cmd *cobra.Command, args []string) { if *req.OperatorName == "BGP" { *req.OperatorName = "Bgp" @@ -258,7 +258,6 @@ func NewCmdEIPAllocate() *cobra.Command { req.Tag = cmd.Flags().String("group", "Default", "Optional. Group of your EIP.") req.Name = cmd.Flags().String("name", "EIP", "Optional. Name of your EIP.") req.Remark = cmd.Flags().String("remark", "", "Optional. Remark of your EIP.") - req.CouponId = cmd.Flags().String("coupon-id", "", "Optional. Coupon ID, The Coupon can deducte part of the payment") count = cmd.Flags().Int("count", 1, "Optional. Count of EIP to allocate") cmd.Flags().SetFlagValues("line", "BGP", "International") @@ -287,13 +286,28 @@ func NewCmdEIPBind() *cobra.Command { resourceType = cmd.Flags().String("resource-type", "uhost", "Requried. ResourceType, type of resource to bind with eip. 'uhost','vrouter','ulb','upm','hadoophost'.eg..") projectID = cmd.Flags().String("project-id", base.ConfigIns.ProjectID, "Optional. Assign project-id") region = cmd.Flags().String("region", base.ConfigIns.Region, "Optional. Assign region") + + cmd.Flags().SetFlagValues("resource-type", "uhost", "vrouter", "ulb", "upm", "hadoophost", "fortresshost", "udockhost", "udhost", "natgw", "udb", "vpngw", "ucdr", "dbaudit") + cmd.Flags().SetFlagValuesFunc("eip-id", func() []string { + return getAllEip(*projectID, *region, []string{status.EIP_FREE}, nil) + }) + cmd.MarkFlagRequired("eip-id") cmd.MarkFlagRequired("resource-id") - cmd.Flags().SetFlagValues("resource-type", "uhost", "vrouter", "ulb", "upm", "hadoophost", "fortresshost", "udockhost", "udhost", "natgw", "udb", "vpngw", "ucdr", "dbaudit") + return cmd } func bindEIP(resourceID, resourceType, eipID, projectID, region *string) { + ip := net.ParseIP(*resourceID) + 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 @@ -310,30 +324,44 @@ func bindEIP(resourceID, resourceType, eipID, projectID, region *string) { //NewCmdEIPUnbind ucloud eip unbind func NewCmdEIPUnbind() *cobra.Command { - - var req = base.BizClient.NewUnBindEIPRequest() - var cmd = &cobra.Command{ + eipIDs := []string{} + req := base.BizClient.NewUnBindEIPRequest() + cmd := &cobra.Command{ Use: "unbind", Short: "Unbind EIP with uhost", Long: "Unbind EIP with uhost", - Example: "ucloud eip unbind --eip-id eip-xxx --resource-id uhost-xxx", + Example: "ucloud eip unbind --eip-id eip-xxx", Run: func(cmd *cobra.Command, args []string) { - req.ResourceType = sdk.String("uhost") - _, err := base.BizClient.UnBindEIP(req) - if err != nil { - base.HandleError(err) - } else { + req.ProjectId = sdk.String(base.PickResourceID(*req.ProjectId)) + for _, eip := range eipIDs { + eipIns, err := getEIP(base.PickResourceID(eip)) + if err != nil { + base.HandleError(err) + return + } + req.EIPId = sdk.String(base.PickResourceID(eip)) + req.ResourceId = sdk.String(eipIns.Resource.ResourceId) + req.ResourceType = sdk.String(eipIns.Resource.ResourceType) + _, err = base.BizClient.UnBindEIP(req) + if err != nil { + base.HandleError(err) + return + } base.Cxt.Printf("unbind EIP[%s] with %s[%s]\n", *req.EIPId, *req.ResourceType, *req.ResourceId) } }, } - cmd.Flags().SortFlags = false - req.EIPId = cmd.Flags().String("eip-id", "", "Required. EIPId to unbind") - req.ResourceId = cmd.Flags().String("resource-id", "", "Required. ResourceID , which is the UHostId of uhost") - req.ProjectId = cmd.Flags().String("project-id", base.ConfigIns.ProjectID, "Optional. Assign project-id") - req.Region = cmd.Flags().String("region", base.ConfigIns.Region, "Optional. Assign region") + flags := cmd.Flags() + flags.SortFlags = false + + flags.StringSliceVar(&eipIDs, "eip-id", nil, "Required. Resource ID of eips to unbind with some resource") + bindRegion(req, flags) + bindProjectID(req, flags) + cmd.MarkFlagRequired("eip-id") - cmd.MarkFlagRequired("resource-id") + cmd.Flags().SetFlagValuesFunc("eip-id", func() []string { + return getAllEip(*req.ProjectId, *req.Region, []string{status.EIP_USED}, nil) + }) return cmd } @@ -341,30 +369,35 @@ func NewCmdEIPUnbind() *cobra.Command { //NewCmdEIPRelease ucloud eip release func NewCmdEIPRelease() *cobra.Command { var ids []string - var req = base.BizClient.NewReleaseEIPRequest() - var cmd = &cobra.Command{ + req := base.BizClient.NewReleaseEIPRequest() + cmd := &cobra.Command{ Use: "release", Short: "Release EIP", Long: "Release EIP", Example: "ucloud eip release --eip-id eip-xx1,eip-xx2", Run: func(cmd *cobra.Command, args []string) { + req.ProjectId = sdk.String(base.PickResourceID(*req.ProjectId)) for _, id := range ids { - req.EIPId = sdk.String(id) + req.EIPId = sdk.String(base.PickResourceID(id)) _, err := base.BizClient.ReleaseEIP(req) if err != nil { base.HandleError(err) } else { - base.Cxt.Printf("released EIP[%v]\n", *req.EIPId) + base.Cxt.Printf("eip[%s] released\n", *req.EIPId) } } }, } - cmd.Flags().SortFlags = false - cmd.Flags().StringSliceVarP(&ids, "eip-id", "", make([]string, 0), "Required. EIPIds of the EIP you want to release") - req.ProjectId = cmd.Flags().String("project-id", base.ConfigIns.ProjectID, "Optional. Assign project-id") - req.Region = cmd.Flags().String("region", base.ConfigIns.Region, "Optional. Assign region") + flags := cmd.Flags() + flags.SortFlags = false + flags.StringSliceVarP(&ids, "eip-id", "", nil, "Required. Resource ID of the EIPs you want to release") + bindProjectID(req, flags) + bindRegion(req, flags) cmd.MarkFlagRequired("eip-id") - cmd.MarkFlagRequired("bandwidth") + flags.SetFlagValuesFunc("eip-id", func() []string { + return getAllEip(*req.ProjectId, *req.Region, []string{status.EIP_FREE}, nil) + }) + return cmd } diff --git a/cmd/globalssh.go b/cmd/globalssh.go index 5ab336bb9c..2fb9495251 100644 --- a/cmd/globalssh.go +++ b/cmd/globalssh.go @@ -20,6 +20,7 @@ import ( "github.com/spf13/cobra" + "github.com/ucloud/ucloud-cli/base" . "github.com/ucloud/ucloud-cli/base" sdk "github.com/ucloud/ucloud-sdk-go/ucloud" ) @@ -71,26 +72,22 @@ func NewCmdGsshList() *cobra.Command { if err != nil { HandleError(err) } else { - if global.json { - PrintJSON(resp.InstanceSet) - } else { - list := make([]GSSHRow, 0) - for _, gssh := range resp.InstanceSet { - row := GSSHRow{} - row.ResourceID = gssh.InstanceId - row.SSHServerIP = gssh.TargetIP - row.AcceleratingDomain = gssh.AcceleratingDomain - row.SSHPort = gssh.Port - row.Remark = gssh.Remark - if val, ok := areaMap[gssh.Area]; ok { - row.SSHServerLocation = val - } else { - row.SSHServerLocation = gssh.Area - } - list = append(list, row) + list := make([]GSSHRow, 0) + for _, gssh := range resp.InstanceSet { + row := GSSHRow{} + row.ResourceID = gssh.InstanceId + row.SSHServerIP = gssh.TargetIP + row.AcceleratingDomain = gssh.AcceleratingDomain + row.SSHPort = gssh.Port + row.Remark = gssh.Remark + if val, ok := areaMap[gssh.Area]; ok { + row.SSHServerLocation = val + } else { + row.SSHServerLocation = gssh.Area } - PrintTable(list, []string{"ResourceID", "SSHServerIP", "AcceleratingDomain", "SSHServerLocation", "SSHPort", "Remark"}) + list = append(list, row) } + base.PrintList(list, global.json) } }, } diff --git a/cmd/image.go b/cmd/image.go index a571009503..07bdebc18c 100644 --- a/cmd/image.go +++ b/cmd/image.go @@ -71,24 +71,20 @@ func NewCmdUImageList() *cobra.Command { base.HandleError(err) return } - if global.json { - base.PrintJSON(resp.ImageSet) - } else { - list := make([]ImageRow, 0) - for _, image := range resp.ImageSet { - row := ImageRow{} - row.ImageName = image.ImageName - row.ImageID = image.ImageId - row.BasicImage = image.OsName - row.ExtensibleFeature = strings.Join(image.Features, ",") - row.CreationTime = base.FormatDate(image.CreateTime) - row.State = image.State - if row.State == "Available" { - list = append(list, row) - } + list := make([]ImageRow, 0) + for _, image := range resp.ImageSet { + row := ImageRow{} + row.ImageName = image.ImageName + row.ImageID = image.ImageId + row.BasicImage = image.OsName + row.ExtensibleFeature = strings.Join(image.Features, ",") + row.CreationTime = base.FormatDate(image.CreateTime) + row.State = image.State + if row.State == "Available" { + list = append(list, row) } - base.PrintTable(list, []string{"ImageName", "ImageID", "BasicImage", "ExtensibleFeature", "CreationTime"}) } + base.PrintList(list, global.json) }, } req.ProjectId = cmd.Flags().String("project-id", base.ConfigIns.ProjectID, "Optional. Assign project-id") diff --git a/cmd/root.go b/cmd/root.go index b9244c7279..93cbff7ced 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -61,7 +61,7 @@ func NewCmdRoot() *cobra.Command { cmd.PersistentFlags().BoolVarP(&global.debug, "debug", "d", false, "Running in debug mode") cmd.PersistentFlags().BoolVarP(&global.json, "json", "j", false, "Print result in JSON format whenever possible") - cmd.Flags().BoolVar(&global.version, "version", false, "Display version") + cmd.Flags().BoolVarP(&global.version, "version", "v", false, "Display version") cmd.Flags().BoolVar(&global.completion, "completion", false, "Turn on auto completion according to the prompt") cmd.Flags().BoolVar(&global.config, "config", false, "Display configuration") cmd.Flags().BoolVar(&global.signup, "signup", false, "Launch UCloud sign up page in browser") @@ -81,6 +81,9 @@ func NewCmdRoot() *cobra.Command { cmd.AddCommand(NewCmdBandwidthPkg()) cmd.AddCommand(NewCmdSharedBW()) cmd.AddCommand(NewCmdUDPN(out)) + cmd.AddCommand(NewCmdULB()) + cmd.AddCommand(NewCmdULBVserver()) + cmd.AddCommand(NewCmdULBSSL()) return cmd } @@ -132,6 +135,8 @@ func Execute() { rootCmd.SetUsageTemplate(usageTmpl) resetHelpFunc(rootCmd) + // err := doc.GenReSTTree(rootCmd, "./doc") + // fmt.Println(err) if err := rootCmd.Execute(); err != nil { os.Exit(1) } diff --git a/cmd/uhost.go b/cmd/uhost.go index 934bb52a3b..3ffa5fb028 100644 --- a/cmd/uhost.go +++ b/cmd/uhost.go @@ -18,7 +18,6 @@ import ( "encoding/base64" "fmt" "io" - "net" "strings" "github.com/spf13/cobra" @@ -83,42 +82,38 @@ func NewCmdUHostList() *cobra.Command { base.HandleError(err) return } - if global.json { - base.PrintJSON(resp.UHostSet) - } else { - list := make([]UHostRow, 0) - for _, host := range resp.UHostSet { - row := UHostRow{} - row.UHostName = host.Name - row.ResourceID = host.UHostId - row.Group = host.Tag - for _, ip := range host.IPSet { - if row.PublicIP != "" { - row.PublicIP += " | " - } - if ip.Type == "Private" { - row.PrivateIP = ip.IP - } else { - row.PublicIP += fmt.Sprintf("%s %s", ip.IP, ip.Type) - } + list := make([]UHostRow, 0) + for _, host := range resp.UHostSet { + row := UHostRow{} + row.UHostName = host.Name + row.ResourceID = host.UHostId + row.Group = host.Tag + for _, ip := range host.IPSet { + if row.PublicIP != "" { + row.PublicIP += " | " } - osName := strings.SplitN(host.OsName, " ", 2) - cupCore := host.CPU - memorySize := host.Memory / 1024 - diskSize := 0 - for _, disk := range host.DiskSet { - if disk.Type == "Data" || disk.Type == "Udisk" { - diskSize += disk.Size - } + if ip.Type == "Private" { + row.PrivateIP = ip.IP + } else { + row.PublicIP += fmt.Sprintf("%s %s", ip.IP, ip.Type) } - row.Config = fmt.Sprintf("%s cpu:%d memory:%dG disk:%dG", osName[0], cupCore, memorySize, diskSize) - row.CreationTime = base.FormatDate(host.CreateTime) - row.State = host.State - row.Type = host.UHostType + "/" + host.HostType - list = append(list, row) } - base.PrintTableS(list) + osName := strings.SplitN(host.OsName, " ", 2) + cupCore := host.CPU + memorySize := host.Memory / 1024 + diskSize := 0 + for _, disk := range host.DiskSet { + if disk.Type == "Data" || disk.Type == "Udisk" { + diskSize += disk.Size + } + } + row.Config = fmt.Sprintf("%s cpu:%d memory:%dG disk:%dG", osName[0], cupCore, memorySize, diskSize) + row.CreationTime = base.FormatDate(host.CreateTime) + row.State = host.State + row.Type = host.UHostType + "/" + host.HostType + list = append(list, row) } + base.PrintList(list, global.json) }, } cmd.Flags().SortFlags = false @@ -126,9 +121,10 @@ func NewCmdUHostList() *cobra.Command { req.Region = cmd.Flags().String("region", base.ConfigIns.Region, "Optional. Assign region") req.Zone = cmd.Flags().String("zone", "", "Optional. Assign availability zone") cmd.Flags().StringSliceVar(&req.UHostIds, "uhost-id", make([]string, 0), "Optional. UHost Instance ID, multiple values separated by comma(without space)") - req.Tag = cmd.Flags().String("group", "", "Optional. Group") + // req.Tag = cmd.Flags().String("group", "", "Optional. Business group") req.Offset = cmd.Flags().Int("offset", 0, "Optional. Offset default 0") req.Limit = cmd.Flags().Int("limit", 50, "Optional. Limit default 50, max value 100") + bindGroup(req, cmd.Flags()) return cmd } @@ -148,6 +144,8 @@ func NewCmdUHostCreate(out io.Writer) *cobra.Command { *req.Memory *= 1024 req.LoginMode = sdk.String("Password") req.ImageId = sdk.String(base.PickResourceID(*req.ImageId)) + req.VPCId = sdk.String(base.PickResourceID(*req.VPCId)) + req.SecurityGroupId = sdk.String(base.PickResourceID(*req.SecurityGroupId)) resp, err := base.BizClient.CreateUHostInstance(req) if err != nil { @@ -167,21 +165,10 @@ func NewCmdUHostCreate(out io.Writer) *cobra.Command { fmt.Fprintf(out, "expect uhost count 1 , accept %d", len(resp.UHostIds)) return } - + bindEipID = sdk.String(base.PickResourceID(*bindEipID)) if *bindEipID != "" && len(resp.UHostIds) == 1 { - ip := net.ParseIP(*bindEipID) - if ip != nil { - eipID, err := getEIPIDbyIP(ip, *req.ProjectId, *req.Region) - if err != nil { - base.HandleError(err) - } else { - *bindEipID = eipID - } - } bindEIP(sdk.String(resp.UHostIds[0]), sdk.String("uhost"), bindEipID, req.ProjectId, req.Region) - } - - if *eipReq.OperatorName != "" && *eipReq.Bandwidth != 0 { + } else if *eipReq.OperatorName != "" && *eipReq.Bandwidth != 0 { eipReq.ChargeType = req.ChargeType eipReq.Tag = req.Tag eipReq.Quantity = req.Quantity @@ -231,19 +218,20 @@ func NewCmdUHostCreate(out io.Writer) *cobra.Command { req.VPCId = flags.String("vpc-id", "", "Optional. VPC ID. This field is required under VPC2.0. See 'ucloud vpc list'") req.SubnetId = flags.String("subnet-id", "", "Optional. Subnet ID. This field is required under VPC2.0. See 'ucloud subnet list'") req.Name = flags.String("name", "UHost", "Optional. UHost instance name") - bindEipID = flags.String("bind-eip", "", "Optional. Bind eip to uhost. Value could be resource id or IP Address") - eipReq.OperatorName = flags.String("create-eip-line", "", "Optional. Required if you want to create new EIP. Line of created eip to bind with the uhost") - eipReq.Bandwidth = cmd.Flags().Int("create-eip-bandwidth-mb", 0, "Optional. Required if you want to create new EIP. Bandwidth(Unit:Mbps).The range of value related to network charge mode. By traffic [1, 200]; by bandwidth [1,800] (Unit: Mbps); it could be 0 if the eip belong to the shared bandwidth") + bindEipID = flags.String("bind-eip", "", "Optional. Resource ID or IP Address of eip that will be bound to the new created uhost") + eipReq.OperatorName = flags.String("create-eip-line", "", "Optional. Required if you want to create new EIP. Line of the created eip to be bound with the new created uhost") + eipReq.Bandwidth = cmd.Flags().Int("create-eip-bandwidth-mb", 0, "Optional. Required if you want to create new EIP. Bandwidth(Unit:Mbps).The range of value related to network charge mode. By traffic [1, 300]; by bandwidth [1,800] (Unit: Mbps); it could be 0 if the eip belong to the shared bandwidth") eipReq.PayMode = cmd.Flags().String("create-eip-charge-mode", "Bandwidth", "Optional. 'Traffic','Bandwidth' or 'ShareBandwidth'") eipReq.Name = flags.String("create-eip-name", "", "Optional. Name of created eip to bind with the uhost") eipReq.Remark = cmd.Flags().String("create-eip-remark", "", "Optional.Remark of your EIP.") - eipReq.CouponId = cmd.Flags().String("create-eip-coupon-id", "", "Optional.Coupon ID, The Coupon can deducte part of the payment,see https://accountv2.ucloud.cn") - req.ChargeType = flags.String("charge-type", "Month", "Optional.'Year',pay yearly;'Month',pay monthly;'Dynamic', pay hourly(requires access)") + req.ChargeType = flags.String("charge-type", "Month", "Optional.'Year',pay yearly;'Month',pay monthly;'Dynamic', pay hourly") req.Quantity = flags.Int("quantity", 1, "Optional. The duration of the instance. N years/months.") - req.ProjectId = flags.String("project-id", base.ConfigIns.ProjectID, "Optional. Assign project-id") - req.Region = flags.String("region", base.ConfigIns.Region, "Optional. Assign region") - req.Zone = flags.String("zone", base.ConfigIns.Zone, "Optional. Assign availability zone") + bindProjectID(req, flags) + bindRegion(req, flags) + // bindZone(req, flags) + req.Zone = flags.String("zone", base.ConfigIns.Zone, "Optional. Override default available zone, see 'ucloud region'") + req.UHostType = flags.String("type", defaultUhostType, "Optional. Default is 'N2' of which cpu is V4 and sata disk. also support 'N1' means V3 cpu and sata disk;'I2' means V4 cpu and ssd disk;'D1' means big data model;'G1' means GPU type, model for K80;'G2' model for P40; 'G3' model for V100") req.NetCapability = flags.String("net-capability", "Normal", "Optional. Default is 'Normal', also support 'Super' which will enhance multiple times network capability as before") req.Disks[0].Type = flags.String("os-disk-type", "LOCAL_NORMAL", "Optional. Enumeration value. 'LOCAL_NORMAL', Ordinary local disk; 'CLOUD_NORMAL', Ordinary cloud disk; 'LOCAL_SSD',local ssd disk; 'CLOUD_SSD',cloud ssd disk; 'EXCLUSIVE_LOCAL_DISK',big data. The disk only supports a limited combination.") @@ -255,20 +243,29 @@ func NewCmdUHostCreate(out io.Writer) *cobra.Command { req.SecurityGroupId = flags.String("firewall-id", "", "Optional. Firewall Id, default: Web recommended firewall. see 'ucloud firewall list'.") req.Tag = flags.String("group", "Default", "Optional. Business group") - cmd.Flags().SetFlagValues("charge-type", "Month", "Year", "Dynamic", "Trial") - cmd.Flags().SetFlagValues("cpu", "1", "2", "4", "8", "12", "16", "24", "32") - cmd.Flags().SetFlagValues("type", "N2", "N1", "I2", "D1", "G1", "G2", "G3") - cmd.Flags().SetFlagValues("net-capability", "Normal", "Super") - cmd.Flags().SetFlagValues("os-disk-type", "LOCAL_NORMAL", "CLOUD_NORMAL", "LOCAL_SSD", "CLOUD_SSD", "EXCLUSIVE_LOCAL_DISK") - cmd.Flags().SetFlagValues("os-disk-backup-type", "NONE", "DATAARK") - cmd.Flags().SetFlagValues("data-disk-type", "LOCAL_NORMAL", "CLOUD_NORMAL", "LOCAL_SSD", "CLOUD_SSD", "EXCLUSIVE_LOCAL_DISK") - cmd.Flags().SetFlagValues("data-disk-backup-type", "NONE", "DATAARK") - cmd.Flags().SetFlagValues("create-eip-line", "BGP", "International") - cmd.Flags().SetFlagValues("create-eip-charge-mode", "Bandwidth", "Traffic", "ShareBandwidth") - - cmd.Flags().SetFlagValuesFunc("image-id", func() []string { + flags.SetFlagValues("charge-type", "Month", "Year", "Dynamic", "Trial") + flags.SetFlagValues("cpu", "1", "2", "4", "8", "12", "16", "24", "32") + flags.SetFlagValues("type", "N2", "N1", "I2", "D1", "G1", "G2", "G3") + flags.SetFlagValues("net-capability", "Normal", "Super") + flags.SetFlagValues("os-disk-type", "LOCAL_NORMAL", "CLOUD_NORMAL", "LOCAL_SSD", "CLOUD_SSD", "EXCLUSIVE_LOCAL_DISK") + flags.SetFlagValues("os-disk-backup-type", "NONE", "DATAARK") + flags.SetFlagValues("data-disk-type", "LOCAL_NORMAL", "CLOUD_NORMAL", "LOCAL_SSD", "CLOUD_SSD", "EXCLUSIVE_LOCAL_DISK") + flags.SetFlagValues("data-disk-backup-type", "NONE", "DATAARK") + flags.SetFlagValues("create-eip-line", "BGP", "International") + flags.SetFlagValues("create-eip-charge-mode", "Bandwidth", "Traffic", "ShareBandwidth") + + flags.SetFlagValuesFunc("image-id", func() []string { return getImageList([]string{status.IMAGE_AVAILABLE}, cli.IMAGE_BASE, *req.ProjectId, *req.Region, *req.Zone) }) + flags.SetFlagValuesFunc("vpc-id", func() []string { + return getAllVPCIdNames(*req.ProjectId, *req.Region) + }) + flags.SetFlagValuesFunc("bind-eip", func() []string { + return getAllEip(*req.ProjectId, *req.Region, []string{status.EIP_FREE}, nil) + }) + flags.SetFlagValuesFunc("firewall-id", func() []string { + return getFirewallIDNames(*req.ProjectId, *req.Region) + }) cmd.MarkFlagRequired("cpu") cmd.MarkFlagRequired("memory") @@ -336,9 +333,9 @@ func NewCmdUHostDelete(out io.Writer) *cobra.Command { req.ProjectId = cmd.Flags().String("project-id", base.ConfigIns.ProjectID, "Optional. Assign project-id") req.Region = cmd.Flags().String("region", base.ConfigIns.Region, "Optional. Assign region") req.Zone = cmd.Flags().String("zone", "", "Optional. availability zone") - isDestory = cmd.Flags().Bool("destory", false, "Optional. false,the uhost instance will be thrown to UHost recycle If you have permission; true,the uhost instance will be deleted directly") + isDestory = cmd.Flags().Bool("destory", false, "Optional. false,the uhost instance will be thrown to UHost recycle if you have permission; true,the uhost instance will be deleted directly") req.ReleaseEIP = cmd.Flags().Bool("release-eip", false, "Optional. false,Unbind EIP only; true, Unbind EIP and release it") - req.ReleaseUDisk = cmd.Flags().Bool("delete-cloud-disk", false, "Optional.false,Detach cloud disk only; true, Detach cloud disk and delete it") + req.ReleaseUDisk = cmd.Flags().Bool("delete-cloud-disk", false, "Optional. false,Detach cloud disk only; true, Detach cloud disk and delete it") yes = cmd.Flags().BoolP("yes", "y", false, "Optional. Do not prompt for confirmation.") cmd.Flags().SetFlagValues("destory", "true", "false") cmd.Flags().SetFlagValues("release-eip", "true", "false") diff --git a/cmd/ulb.go b/cmd/ulb.go new file mode 100644 index 0000000000..4bfd8a9f67 --- /dev/null +++ b/cmd/ulb.go @@ -0,0 +1,1631 @@ +// 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" + "io/ioutil" + "strings" + + "github.com/spf13/cobra" + + "github.com/ucloud/ucloud-sdk-go/services/ulb" + sdk "github.com/ucloud/ucloud-sdk-go/ucloud" + + "github.com/ucloud/ucloud-cli/base" + "github.com/ucloud/ucloud-cli/model/status" +) + +//NewCmdULB ucloud ulb +func NewCmdULB() *cobra.Command { + cmd := &cobra.Command{ + Use: "ulb", + Short: "List and manipulate ULB instances", + Long: "List and manipulate ULB instances", + } + out := base.Cxt.GetWriter() + + cmd.AddCommand(NewCmdULBList()) + cmd.AddCommand(NewCmdULBCreate(out)) + cmd.AddCommand(NewCmdULBUpdate(out)) + cmd.AddCommand(NewCmdULBDelete(out)) + + return cmd +} + +//ULBRow 表格行 +type ULBRow struct { + Name string + ResourceID string + Group string + Network string + VserverCount int + VPC string + CreationTime string +} + +//NewCmdULBList ucloud ulb list +func NewCmdULBList() *cobra.Command { + req := base.BizClient.NewDescribeULBRequest() + cmd := &cobra.Command{ + Use: "list", + Short: "List ULB instances", + Long: "List ULB instances", + Run: func(c *cobra.Command, args []string) { + req.ProjectId = sdk.String(base.PickResourceID(*req.ProjectId)) + req.VPCId = sdk.String(base.PickResourceID(*req.VPCId)) + resp, err := base.BizClient.DescribeULB(req) + if err != nil { + base.HandleError(err) + return + } + list := []ULBRow{} + for _, ulb := range resp.DataSet { + row := ULBRow{} + row.ResourceID = ulb.ULBId + row.Name = ulb.Name + row.Group = ulb.BusinessId + row.VserverCount = len(ulb.VServerSet) + row.VPC = ulb.VPCId + row.CreationTime = base.FormatDate(ulb.CreateTime) + if ulb.ULBType == "OuterMode" { + ips := []string{} + for _, ip := range ulb.IPSet { + ips = append(ips, fmt.Sprintf("%s(%s)", ip.EIP, ip.EIPId)) + } + row.Network = strings.Join(ips, ",") + } else { + row.Network = ulb.PrivateIP + } + list = append(list, row) + } + + base.PrintList(list, global.json) + }, + } + + flags := cmd.Flags() + flags.SortFlags = false + + bindRegion(req, flags) + bindProjectID(req, flags) + + req.ULBId = flags.String("ulb-id", "", "Optional. Resource ID of ULB instance to list") + req.VPCId = flags.String("vpc-id", "", "Optional. Resource ID of VPC which the ULB instances to list belong to") + req.SubnetId = flags.String("subnet-id", "", "Optional. Resource ID of subnet which the ULB instances to list belong to") + req.BusinessId = flags.String("group", "", "Optional. Business group of ULB instances to list") + req.Offset = flags.Int("offset", 0, "Optional. Offset") + req.Limit = flags.Int("limit", 50, "Optional. Limit") + + flags.SetFlagValuesFunc("vpc-id", func() []string { + return getAllVPCIdNames(*req.ProjectId, *req.Region) + }) + + return cmd +} + +//NewCmdULBCreate ucloud ulb create +func NewCmdULBCreate(out io.Writer) *cobra.Command { + var bindEipID *string + mode := "outer" + req := base.BizClient.NewCreateULBRequest() + eipReq := base.BizClient.NewAllocateEIPRequest() + cmd := &cobra.Command{ + Use: "create", + Short: "Create ULB instance", + Long: "Create ULB instance", + Run: func(c *cobra.Command, args []string) { + req.ProjectId = sdk.String(base.PickResourceID(*req.ProjectId)) + if mode == "outer" { + if *bindEipID == "" && (*eipReq.Bandwidth == 0 || *eipReq.OperatorName == "") { + fmt.Fprintln(out, "Outer mode ULB need a eip to bind, please assign eip by flag 'bind-eip' or create eip by flag 'create-eip-line' and 'create-eip-bandwidth-mb'") + return + } + req.OuterMode = sdk.String("Yes") + } else if mode == "inner" { + req.InnerMode = sdk.String("Yes") + } else { + fmt.Fprintln(out, "Error, flag mode should be 'outer' or 'inner'") + return + } + resp, err := base.BizClient.CreateULB(req) + if err != nil { + base.HandleError(err) + return + } + fmt.Fprintf(out, "ulb[%s] created\n", resp.ULBId) + if mode == "inner" { + return + } + bindEipID = sdk.String(base.PickResourceID(*bindEipID)) + if *bindEipID != "" { + bindEIP(sdk.String(resp.ULBId), sdk.String("ulb"), bindEipID, req.ProjectId, req.Region) + } else if *eipReq.OperatorName != "" && *eipReq.Bandwidth != 0 { + eipReq.ChargeType = req.ChargeType + eipReq.Tag = req.Tag + eipReq.Region = req.Region + eipReq.ProjectId = req.ProjectId + eipResp, err := base.BizClient.AllocateEIP(eipReq) + + if err != nil { + base.HandleError(err) + } else { + for _, eip := range eipResp.EIPSet { + base.Cxt.Printf("allocate EIP[%s] ", eip.EIPId) + for _, ip := range eip.EIPAddr { + base.Cxt.Printf("IP:%s Line:%s \n", ip.IP, ip.OperatorName) + } + bindEIP(sdk.String(resp.ULBId), sdk.String("ulb"), sdk.String(eip.EIPId), req.ProjectId, req.Region) + } + } + } + }, + } + + flags := cmd.Flags() + flags.SortFlags = false + + req.ULBName = flags.String("name", "", "Required. Name of ULB instance to create") + flags.StringVar(&mode, "mode", "outer", "Required. Network mode of ULB instance, outer or inner.") + bindRegion(req, flags) + bindProjectID(req, flags) + req.ChargeType = flags.String("charge-type", "Month", "Optional.'Year',pay yearly;'Month',pay monthly;'Dynamic', pay hourly") + req.Tag = flags.String("group", "Default", "Optional. Business group") + req.Remark = flags.String("remark", "", "Optional. Remark of instance to create.") + bindEipID = flags.String("bind-eip", "", "Optional. Resource ID or IP Address of eip that will be bound to the new created ulb") + eipReq.OperatorName = flags.String("create-eip-line", "", "Optional. Required if you want to create new EIP. Line of created eip to bind with the new created ulb") + eipReq.Bandwidth = cmd.Flags().Int("create-eip-bandwidth-mb", 0, "Optional. Required if you want to create new EIP. Bandwidth(Unit:Mbps).The range of value related to network charge mode. By traffic [1, 300]; by bandwidth [1,800] (Unit: Mbps); it could be 0 if the eip belong to the shared bandwidth") + eipReq.PayMode = cmd.Flags().String("create-eip-charge-mode", "Bandwidth", "Optional. 'Traffic','Bandwidth' or 'ShareBandwidth'") + eipReq.Name = flags.String("create-eip-name", "", "Optional. Name of created eip to bind with the uhost") + eipReq.Remark = cmd.Flags().String("create-eip-remark", "", "Optional. Remark of your EIP.") + + flags.SetFlagValues("mode", "outer", "inner") + flags.SetFlagValues("charge-type", "Month", "Year", "Dynamic") + flags.SetFlagValues("create-eip-line", "BGP", "International") + flags.SetFlagValues("create-eip-charge-mode", "Bandwidth", "Traffic", "ShareBandwidth") + flags.SetFlagValuesFunc("bind-eip", func() []string { + return getAllEip(*req.ProjectId, *req.Region, []string{status.EIP_FREE}, nil) + }) + + cmd.MarkFlagRequired("mode") + cmd.MarkFlagRequired("name") + + return cmd +} + +//NewCmdULBDelete ucloud ulb delete +func NewCmdULBDelete(out io.Writer) *cobra.Command { + idNames := []string{} + req := base.BizClient.NewDeleteULBRequest() + cmd := &cobra.Command{ + Use: "delete", + Short: "Delete ULB instances by resource ID", + Long: "Delete ULB instances by resource ID", + Run: func(c *cobra.Command, args []string) { + req.ProjectId = sdk.String(base.PickResourceID(*req.ProjectId)) + for _, idname := range idNames { + req.ULBId = sdk.String(base.PickResourceID(idname)) + _, err := base.BizClient.DeleteULB(req) + if err != nil { + base.HandleError(err) + return + } + fmt.Fprintf(out, "ulb[%s] deleted\n", idname) + } + }, + } + + flags := cmd.Flags() + flags.SortFlags = false + + flags.StringSliceVar(&idNames, "ulb-id", nil, "Required. Resource ID of the ULB instances to delete") + bindRegion(req, flags) + bindProjectID(req, flags) + + flags.SetFlagValuesFunc("ulb-id", func() []string { + return getAllULBIDNames(*req.ProjectId, *req.Region) + }) + + cmd.MarkFlagRequired("ulb-id") + + return cmd +} + +//NewCmdULBUpdate ucloud ulb update +func NewCmdULBUpdate(out io.Writer) *cobra.Command { + var name, group, remark string + idNames := []string{} + req := base.BizClient.NewUpdateULBAttributeRequest() + cmd := &cobra.Command{ + Use: "update", + Short: "Update ULB instance", + Long: "Update ULB instance", + Run: func(c *cobra.Command, args []string) { + req.ProjectId = sdk.String(base.PickResourceID(*req.ProjectId)) + for _, idname := range idNames { + req.ULBId = sdk.String(base.PickResourceID(idname)) + if name == "" && group == "" && remark == "" { + fmt.Fprintln(out, "Error, name, remark and group can't be all empty") + return + } + if name != "" { + req.Name = &name + } + if group != "" { + req.Tag = &group + } + if remark != "" { + req.Remark = &remark + } + _, err := base.BizClient.UpdateULBAttribute(req) + if err != nil { + base.HandleError(err) + continue + } + fmt.Fprintf(out, "ulb[%s] updated\n", *req.ULBId) + } + }, + } + + flags := cmd.Flags() + flags.SortFlags = false + + bindRegion(req, flags) + bindProjectID(req, flags) + flags.StringSliceVar(&idNames, "ulb-id", nil, "Required. Resource ID of ULB instances to update") + flags.StringVar(&name, "name", "", "Optional, Name of ULB instance") + flags.StringVar(&remark, "remark", "", "Optional, Remark of ULB instance") + flags.StringVar(&group, "group", "", "Optional, Business group of ULB instance") + // bindGroup(&group, flags) + + flags.SetFlagValuesFunc("ulb-id", func() []string { + return getAllULBIDNames(*req.ProjectId, *req.Region) + }) + + cmd.MarkFlagRequired("ulb-id") + + return cmd +} + +func getAllULB(project, region string) ([]ulb.ULBSet, error) { + list := []ulb.ULBSet{} + req := base.BizClient.NewDescribeULBRequest() + req.ProjectId = &project + req.Region = ®ion + + for offset, limit := 0, 50; ; offset += limit { + req.Offset = sdk.Int(offset) + req.Limit = sdk.Int(limit) + resp, err := base.BizClient.DescribeULB(req) + + if err != nil { + return nil, err + } + list = append(list, resp.DataSet...) + + if resp.TotalCount < offset+limit { + break + } + } + return list, nil +} + +func getAllULBIDNames(project, region string) []string { + list := []string{} + ulbList, err := getAllULB(project, region) + if err != nil { + return nil + } + for _, ulb := range ulbList { + list = append(list, fmt.Sprintf("%s/%s", ulb.ULBId, ulb.Name)) + } + return list +} + +//NewCmdULBVserver ucloud ulb-vserver +func NewCmdULBVserver() *cobra.Command { + cmd := &cobra.Command{ + Use: "ulb-vserver", + Short: "List and manipulate ULB Vserver instances", + Long: "List and manipulate ULB Vserver instances", + } + out := base.Cxt.GetWriter() + + cmd.AddCommand(NewCmdULBVServerList(out)) + cmd.AddCommand(NewCmdULBVServerCreate(out)) + cmd.AddCommand(NewCmdULBVServerUpdate(out)) + cmd.AddCommand(NewCmdULBVServerDelete(out)) + cmd.AddCommand(NewCmdULBVServerListNode(out)) + cmd.AddCommand(NewCmdULBVServerAddNode(out)) + cmd.AddCommand(NewCmdULBVServerUpdateNode(out)) + cmd.AddCommand(NewCmdULBVServerDeleteNode(out)) + cmd.AddCommand(NewCmdULBVServerCreatePolicy(out)) + cmd.AddCommand(NewCmdULBVServerListPolicy(out)) + cmd.AddCommand(NewCmdULBVServerUpdatePolicy(out)) + cmd.AddCommand(NewCmdULBVServerDeletePolicy(out)) + + return cmd +} + +//ULBVServerRow 表格行 +type ULBVServerRow struct { + VServerName string + ResourceID string + ListenType string + Protocol string + Port int + LBMethod string + SessionMaintainMode string + SessionMaintainKey string + ClientTimeout string + HealthCheckMode string + HealthCheckDomain string + HealthCheckPath string +} + +//NewCmdULBVServerList ucloud ulb-vserver list +func NewCmdULBVServerList(out io.Writer) *cobra.Command { + req := base.BizClient.NewDescribeVServerRequest() + cmd := &cobra.Command{ + Use: "list", + Short: "List ULB Vserver instances", + Long: "List ULB Vserver instances", + Run: func(c *cobra.Command, args []string) { + req.ProjectId = sdk.String(base.PickResourceID(*req.ProjectId)) + req.ULBId = sdk.String(base.PickResourceID(*req.ULBId)) + resp, err := base.BizClient.DescribeVServer(req) + if err != nil { + base.HandleError(err) + return + } + list := []ULBVServerRow{} + for _, vs := range resp.DataSet { + row := ULBVServerRow{} + row.VServerName = vs.VServerName + row.ResourceID = vs.VServerId + row.ListenType = vs.ListenType + row.Protocol = vs.Protocol + row.Port = vs.FrontendPort + row.LBMethod = vs.Method + row.ClientTimeout = fmt.Sprintf("%ds", vs.ClientTimeout) + row.SessionMaintainMode = vs.PersistenceType + row.SessionMaintainKey = vs.PersistenceInfo + row.HealthCheckMode = vs.MonitorType + row.HealthCheckDomain = vs.Domain + row.HealthCheckPath = vs.Path + list = append(list, row) + } + base.PrintList(list, global.json) + }, + } + + flags := cmd.Flags() + flags.SortFlags = false + + bindRegion(req, flags) + bindProjectID(req, flags) + req.ULBId = flags.String("ulb-id", "", "Required. Resource ID of ULB") + req.VServerId = flags.String("vserver-id", "", "Optional. Resource ID of vserver to list") + + flags.SetFlagValuesFunc("ulb-id", func() []string { + return getAllULBIDNames(*req.ProjectId, *req.Region) + }) + + cmd.MarkFlagRequired("ulb-id") + + return cmd +} + +//NewCmdULBVServerCreate ucloud ulb-vserver create +func NewCmdULBVServerCreate(out io.Writer) *cobra.Command { + sslID := "" + req := base.BizClient.NewCreateVServerRequest() + cmd := &cobra.Command{ + Use: "create", + Short: "Create ULB VServer instance", + Long: "Create ULB VServer instance", + Run: func(c *cobra.Command, args []string) { + if *req.ListenType == "RequestProxy" && (*req.ClientTimeout <= 0 || *req.ClientTimeout > 86400) { + fmt.Println("Error, client-timeout-seconds in the range of (0,86400]") + return + } + if *req.ListenType == "PacketsTransmit" && (*req.ClientTimeout <= 0 || *req.ClientTimeout > 86400) { + fmt.Println("Error, client-timeout-seconds in the range of [60,900]") + return + } + if *req.Protocol == "HTTPS" && sslID == "" { + fmt.Println("Error, SSL Certificate is needed when you choose HTTPS") + return + } + req.ProjectId = sdk.String(base.PickResourceID(*req.ProjectId)) + req.ULBId = sdk.String(base.PickResourceID(*req.ULBId)) + resp, err := base.BizClient.CreateVServer(req) + if err != nil { + base.HandleError(err) + return + } + fmt.Fprintf(out, "ulb-vserver[%s] created\n", resp.VServerId) + if *req.Protocol == "HTTPS" && sslID != "" { + bindReq := base.BizClient.NewBindSSLRequest() + bindReq.Region = req.Region + bindReq.ProjectId = req.ProjectId + bindReq.SSLId = sdk.String(base.PickResourceID(sslID)) + bindReq.VServerId = sdk.String(resp.VServerId) + bindReq.ULBId = req.ULBId + _, err := base.BizClient.BindSSL(bindReq) + if err != nil { + base.HandleError(err) + return + } + fmt.Fprintf(out, "ssl certificate[%s] bind with vserver[%s] of ulb[%s]\n", sslID, *bindReq.VServerId, *bindReq.ULBId) + } + }, + } + + flags := cmd.Flags() + flags.SortFlags = false + + req.ULBId = flags.String("ulb-id", "", "Required. Resource ID of ULB instance which the VServer to create belongs to") + bindRegion(req, flags) + bindProjectID(req, flags) + req.VServerName = flags.String("name", "", "Optional. Name of VServer to create") + req.ListenType = flags.String("listen-type", "RequestProxy", "Optional. Listen type, 'RequestProxy' or 'PacketsTransmit'") + req.Protocol = flags.String("protocol", "HTTP", "Optional. Protocol of VServer instance, 'HTTP','HTTPS','TCP' for listen type 'RequestProxy' and 'TCP','UDP' for listen type 'PacketsTransmit'") + req.FrontendPort = flags.Int("port", 80, "Optional. Port of VServer instance") + flags.StringVar(&sslID, "ssl-id", "", "Optional. Required if you choose HTTPS, Resource ID of SSL Certificate") + req.Method = flags.String("lb-method", "Roundrobin", "Optional. LB methods, accept values:Roundrobin,Source,ConsistentHash,SourcePort,ConsistentHashPort,WeightRoundrobin and Leastconn. \nConsistentHash,SourcePort and ConsistentHashPort are effective for listen type PacketsTransmit only;\nLeastconn is effective for listen type RequestProxy only;\nRoundrobin,Source and WeightRoundrobin are effective for both listen types") + req.PersistenceType = flags.String("session-maintain-mode", "None", "Optional. The method of maintaining user's session. Accept values: 'None','ServerInsert' and 'UserDefined'. 'None' meaning don't maintain user's session'; 'ServerInsert' meaning auto create session key; 'UserDefined' meaning specify session key which accpeted by flag seesion-maintain-key by yourself") + req.PersistenceInfo = flags.String("session-maintain-key", "", "Optional. Specify a key for maintaining session") + req.ClientTimeout = flags.Int("client-timeout-seconds", 60, "Optional.Unit seconds. For 'RequestProxy', it's lifetime for idle connections, range (0,86400]. For 'PacketsTransmit', it's the duration of the connection is maintained, range [60,900]") + req.MonitorType = flags.String("health-check-mode", "", "Optional. Method of checking real server's status of health. Accept values:'Port','Path'") + req.Domain = flags.String("health-check-domain", "", "Optional. Skip this flag if health-check-mode is assigned Port") + req.Path = flags.String("health-check-path", "", "Optional. Skip this flags if health-check-mode is assigned Port") + + flags.SetFlagValues("listen-type", "RequestProxy", "PacketsTransmit") + flags.SetFlagValues("protocol", "HTTP", "HTTPS", "TCP", "UDP") + flags.SetFlagValuesFunc("lb-method", func() []string { + if *req.ListenType == "RequestProxy" { + return []string{"Roundrobin", "Source", "WeightRoundrobin", "Leastconn"} + } else if *req.ListenType == "PacketsTransmit" { + return []string{"Roundrobin", "Source", "WeightRoundrobin", "ConsistentHash", "SourcePort", "ConsistentHashPort"} + } + return []string{"Roundrobin", "Source", "WeightRoundrobin", "ConsistentHash", "SourcePort", "ConsistentHashPort", "Leastconn"} + }) + flags.SetFlagValues("session-maintain-mode", "None", "ServerInsert", "UserDefined") + flags.SetFlagValues("health-check-mode", "Port", "Path") + flags.SetFlagValuesFunc("ulb-id", func() []string { + return getAllULBIDNames(*req.ProjectId, *req.Region) + }) + flags.SetFlagValuesFunc("ssl-id", func() []string { + return getAllSSLCertIDNames(*req.ProjectId, *req.Region) + }) + + cmd.MarkFlagRequired("ulb-id") + + return cmd +} + +//NewCmdULBVServerUpdate ucloud ulb-vserver update +func NewCmdULBVServerUpdate(out io.Writer) *cobra.Command { + req := base.BizClient.NewUpdateVServerAttributeRequest() + vserverIDs := []string{} + cmd := &cobra.Command{ + Use: "update", + Short: "Update attributes of VServer instance", + Long: "Update attributes of VServer instance", + Run: func(c *cobra.Command, args []string) { + if *req.VServerName == "" { + req.VServerName = nil + } + if *req.Method == "" { + req.Method = nil + } + if *req.PersistenceType == "" { + req.PersistenceType = nil + } + if *req.PersistenceInfo == "" { + req.PersistenceInfo = nil + } + if *req.ClientTimeout == -1 { + req.ClientTimeout = nil + } + if *req.MonitorType == "" { + req.MonitorType = nil + } + if *req.Domain == "" { + req.Domain = nil + } + if *req.Path == "" { + req.Path = nil + } + req.ProjectId = sdk.String(base.PickResourceID(*req.ProjectId)) + req.ULBId = sdk.String(base.PickResourceID(*req.ULBId)) + for _, idname := range vserverIDs { + req.VServerId = sdk.String(base.PickResourceID(idname)) + _, err := base.BizClient.UpdateVServerAttribute(req) + if err != nil { + base.HandleError(err) + return + } + fmt.Fprintf(out, "ulb-vserver[%s] updated\n", *req.VServerId) + } + }, + } + flags := cmd.Flags() + flags.SortFlags = false + + req.ULBId = flags.String("ulb-id", "", "Required. Resource ID of ULB instance which the VServer to create belongs to") + flags.StringSliceVar(&vserverIDs, "vserver-id", nil, "Required. Resource ID of Vserver to update") + bindRegion(req, flags) + bindProjectID(req, flags) + req.VServerName = flags.String("name", "", "Optional. Name of VServer") + req.Method = flags.String("lb-method", "", "Optional. LB methods, accept values:Roundrobin,Source,ConsistentHash,SourcePort,ConsistentHashPort,WeightRoundrobin and Leastconn. \nConsistentHash,SourcePort and ConsistentHashPort are effective for listen type PacketsTransmit only;\nLeastconn is effective for listen type RequestProxy only;\nRoundrobin,Source and WeightRoundrobin are effective for both listen types") + req.PersistenceType = flags.String("session-maintain-mode", "", "Optional. The method of maintaining user's session. Accept values: 'None','ServerInsert' and 'UserDefined'. 'None' meaning don't maintain user's session'; 'ServerInsert' meaning auto create session key; 'UserDefined' meaning specify session key which accpeted by flag seesion-maintain-key by yourself") + req.PersistenceInfo = flags.String("session-maintain-key", "", "Optional. Specify a key for maintaining session") + req.ClientTimeout = flags.Int("client-timeout-seconds", -1, "Optional.Unit seconds. For 'RequestProxy', it's lifetime for idle connections, range (0,86400]. For 'PacketsTransmit', it's the duration of the connection is maintained, range [60,900]") + req.MonitorType = flags.String("health-check-mode", "", "Optional. Method of checking real server's status of health. Accept values:'Port','Path'") + req.Domain = flags.String("health-check-domain", "", "Optional. Skip this flag if health-check-mode is assigned Port") + req.Path = flags.String("health-check-path", "", "Optional. Skip this flags if health-check-mode is assigned Port") + + flags.SetFlagValues("lb-method", "Roundrobin", "Source", "WeightRoundrobin", "ConsistentHash", "SourcePort", "ConsistentHashPort", "Leastconn") + flags.SetFlagValues("session-maintain-mode", "None", "ServerInsert", "UserDefined") + flags.SetFlagValues("health-check-mode", "Port", "Path") + flags.SetFlagValuesFunc("ulb-id", func() []string { + return getAllULBIDNames(*req.ProjectId, *req.Region) + }) + flags.SetFlagValuesFunc("vserver-id", func() []string { + ulbID := base.PickResourceID(*req.ULBId) + return getAllULBVServerIDNames(ulbID, *req.ProjectId, *req.Region) + }) + + cmd.MarkFlagRequired("ulb-id") + cmd.MarkFlagRequired("vserver-id") + + return cmd +} + +//NewCmdULBVServerDelete ucloud ulb-vserver delete +func NewCmdULBVServerDelete(out io.Writer) *cobra.Command { + vserverIDs := []string{} + req := base.BizClient.NewDeleteVServerRequest() + cmd := &cobra.Command{ + Use: "delete", + Short: "Delete ULB VServer instances", + Long: "Delete ULB VServer instances", + Run: func(c *cobra.Command, args []string) { + req.ProjectId = sdk.String(base.PickResourceID(*req.ProjectId)) + req.ULBId = sdk.String(base.PickResourceID(*req.ULBId)) + for _, idname := range vserverIDs { + vsid := base.PickResourceID(idname) + req.VServerId = sdk.String(vsid) + _, err := base.BizClient.DeleteVServer(req) + if err != nil { + base.HandleError(err) + return + } + fmt.Fprintf(out, "ulb-vserver[%s] deleted\n", idname) + } + }, + } + + flags := cmd.Flags() + flags.SortFlags = false + + req.ULBId = flags.String("ulb-id", "", "Required. Resource ID of ULB instance which the VServer to create belongs to") + flags.StringSliceVar(&vserverIDs, "vserver-id", nil, "Required. Resource ID of Vserver to update") + bindRegion(req, flags) + bindProjectID(req, flags) + + cmd.MarkFlagRequired("ulb-id") + cmd.MarkFlagRequired("vserver-id") + + flags.SetFlagValuesFunc("ulb-id", func() []string { + return getAllULBIDNames(*req.ProjectId, *req.Region) + }) + flags.SetFlagValuesFunc("vserver-id", func() []string { + ulbID := base.PickResourceID(*req.ULBId) + return getAllULBVServerIDNames(ulbID, *req.ProjectId, *req.Region) + }) + + return cmd +} + +//ULBVServerNode 表格行 +type ULBVServerNode struct { + Name string + ResourceID string + NodeID string + PrivateIP string + Port int + HealthCheck string + NodeMode string + Weight int +} + +//NewCmdULBVServerListNode ucloud ulb-vserver list-node +func NewCmdULBVServerListNode(out io.Writer) *cobra.Command { + req := base.BizClient.NewDescribeVServerRequest() + cmd := &cobra.Command{ + Use: "list-node", + Short: "List ULB VServer backend nodes", + Long: "List ULB VServer backend nodes", + Run: func(c *cobra.Command, args []string) { + req.ProjectId = sdk.String(base.PickResourceID(*req.ProjectId)) + req.ULBId = sdk.String(base.PickResourceID(*req.ULBId)) + req.VServerId = sdk.String(base.PickResourceID(*req.VServerId)) + resp, err := base.BizClient.DescribeVServer(req) + if err != nil { + base.HandleError(err) + return + } + if len(resp.DataSet) != 1 { + fmt.Fprintf(out, "ulb[%s] or vserver[%s] may not exist\n", *req.ULBId, *req.VServerId) + return + } + vs := resp.DataSet[0] + list := []ULBVServerNode{} + for _, node := range vs.BackendSet { + row := ULBVServerNode{} + row.Name = node.ResourceName + row.ResourceID = node.ResourceId + row.NodeID = node.BackendId + row.PrivateIP = node.PrivateIP + row.Weight = node.Weight + row.Port = node.Port + if node.Status == 0 { + row.HealthCheck = "Normal" + } else if node.Status == 1 { + row.HealthCheck = "Failed" + } + if node.Enabled == 1 { + row.NodeMode = "enable" + } else if node.Enabled == 0 { + row.NodeMode = "disable" + } + list = append(list, row) + } + base.PrintList(list, global.json) + }, + } + flags := cmd.Flags() + flags.SortFlags = false + + req.ULBId = flags.String("ulb-id", "", "Required. Resource ID of ULB which the nodes belong to") + req.VServerId = flags.String("vserver-id", "", "Required. Resource ID of VServer which the nodes belong to") + bindRegion(req, flags) + bindProjectID(req, flags) + + cmd.MarkFlagRequired("ulb-id") + cmd.MarkFlagRequired("vserver-id") + + flags.SetFlagValuesFunc("ulb-id", func() []string { + return getAllULBIDNames(*req.ProjectId, *req.Region) + }) + flags.SetFlagValuesFunc("vserver-id", func() []string { + ulbID := base.PickResourceID(*req.ULBId) + return getAllULBVServerIDNames(ulbID, *req.ProjectId, *req.Region) + }) + + return cmd +} + +//NewCmdULBVServerAddNode ucloud ulb-vserver add-node +func NewCmdULBVServerAddNode(out io.Writer) *cobra.Command { + var enable *string + var weight *int + req := base.BizClient.NewAllocateBackendRequest() + cmd := &cobra.Command{ + Use: "add-node", + Short: "Add nodes for ULB Vserver instance", + Long: "Add nodes for ULB Vserver instance", + Run: func(c *cobra.Command, args []string) { + if *enable == "enable" { + req.Enabled = sdk.Int(1) + } else if *enable == "disable" { + req.Enabled = sdk.Int(0) + } else { + fmt.Fprintln(out, "Error, node-mode must be enable or disable") + return + } + if *weight < 1 || *weight > 100 { + fmt.Fprintln(out, "Error, weight must be between 1 and 100") + return + } + req.ProjectId = sdk.String(base.PickResourceID(*req.ProjectId)) + req.ULBId = sdk.String(base.PickResourceID(*req.ULBId)) + req.VServerId = sdk.String(base.PickResourceID(*req.VServerId)) + resp, err := base.BizClient.AllocateBackend(req) + if err != nil { + base.HandleError(err) + return + } + fmt.Fprintf(out, "node[%s] added, node-id:%s\n", *req.ResourceId, resp.BackendId) + }, + } + + flags := cmd.Flags() + flags.SortFlags = false + req.ULBId = flags.String("ulb-id", "", "Required. Resource ID of ULB which the nodes belong to") + req.VServerId = flags.String("vserver-id", "", "Required. Resource ID of VServer which the nodes belong to") + req.ResourceId = flags.String("resource-id", "", "Required. Resource ID of the node to add") + bindRegion(req, flags) + bindProjectID(req, flags) + req.ResourceType = flags.String("resource-type", "UHost", "Optional. Resource type of the node to add. Accept values: UHost,UPM,UDHost,UDocker") + req.Port = flags.Int("port", 80, "Optional. Which port the server on the node listening on") + enable = flags.String("node-mode", "enable", "Optional. Enable node or not. Accept values: enable, disable") + weight = flags.Int("weight", 1, "Optional. effective for lb-method WeightRoundrobin. Rnage [0,100]") + + flags.SetFlagValues("resource-type", "Uhost", "UPM", "UDHost", "UDocker") + flags.SetFlagValues("node-mode", "enable", "disable") + flags.SetFlagValuesFunc("ulb-id", func() []string { + return getAllULBIDNames(*req.ProjectId, *req.Region) + }) + flags.SetFlagValuesFunc("vserver-id", func() []string { + ulbID := base.PickResourceID(*req.ULBId) + return getAllULBVServerIDNames(ulbID, *req.ProjectId, *req.Region) + }) + + cmd.MarkFlagRequired("ulb-id") + cmd.MarkFlagRequired("vserver-id") + cmd.MarkFlagRequired("resource-id") + return cmd +} + +//NewCmdULBVServerUpdateNode ucloud ulb-vserver update-node +func NewCmdULBVServerUpdateNode(out io.Writer) *cobra.Command { + var mode *string + backendIDs := []string{} + req := base.BizClient.NewUpdateBackendAttributeRequest() + cmd := &cobra.Command{ + Use: "update-node", + Short: "Update attributes of ULB nodes", + Long: "Update attributes of ULB nodes", + Run: func(c *cobra.Command, args []string) { + if *mode == "enable" { + req.Enabled = sdk.Int(1) + } else if *mode == "disable" { + req.Enabled = sdk.Int(0) + } else if *mode == "" { + req.Enabled = nil + } else { + fmt.Fprintln(out, "Error, node-mode must be enable or disable") + return + } + + if *req.Port == 0 { + req.Port = nil + } + req.ULBId = sdk.String(base.PickResourceID(*req.ULBId)) + req.ProjectId = sdk.String(base.PickResourceID(*req.ProjectId)) + for _, bid := range backendIDs { + req.BackendId = sdk.String(base.PickResourceID(bid)) + _, err := base.BizClient.UpdateBackendAttribute(req) + if err != nil { + base.HandleError(err) + continue + } + fmt.Fprintf(out, "node[%s] updated\n", bid) + } + }, + } + + flags := cmd.Flags() + flags.SortFlags = false + req.ULBId = flags.String("ulb-id", "", "Required. Resource ID of ULB which the nodes belong to") + flags.StringSliceVar(&backendIDs, "node-id", nil, "Required. BackendID of nodes to update") + req.Port = flags.Int("port", 0, "Optional. Port of nodes to update. Rnage [1,65535]") + mode = flags.String("node-mode", "", "Optional. Enable node or not. Accept values: enable, disable") + + bindRegion(req, flags) + bindProjectID(req, flags) + + flags.SetFlagValues("node-mode", "enable", "disable") + flags.SetFlagValuesFunc("ulb-id", func() []string { + return getAllULBIDNames(*req.ProjectId, *req.Region) + }) + flags.SetFlagValuesFunc("node-id", func() []string { + return getAllULBVServerNodeIDNames(*req.ULBId, "", *req.ProjectId, *req.Region) + }) + + cmd.MarkFlagRequired("ulb-id") + cmd.MarkFlagRequired("node-id") + + return cmd +} + +//NewCmdULBVServerDeleteNode ucloud ulb-vserver delete-node +func NewCmdULBVServerDeleteNode(out io.Writer) *cobra.Command { + backendIDs := []string{} + req := base.BizClient.NewReleaseBackendRequest() + cmd := &cobra.Command{ + Use: "delete-node", + Short: "Delete ULB VServer nodes", + Long: "Delete ULB VServer nodes", + Run: func(c *cobra.Command, args []string) { + req.ProjectId = sdk.String(base.PickResourceID(*req.ProjectId)) + req.ULBId = sdk.String(base.PickResourceID(*req.ULBId)) + for _, idname := range backendIDs { + req.BackendId = sdk.String(base.PickResourceID(idname)) + _, err := base.BizClient.ReleaseBackend(req) + if err != nil { + base.HandleError(err) + continue + } + fmt.Fprintf(out, "node[%s] deleted\n", idname) + } + }, + } + flags := cmd.Flags() + flags.SortFlags = false + req.ULBId = flags.String("ulb-id", "", "Required. Resource ID of ULB which the nodes belong to") + flags.StringSliceVar(&backendIDs, "node-id", nil, "Required. BackendID of nodes to update") + bindRegion(req, flags) + bindProjectID(req, flags) + + cmd.MarkFlagRequired("ulb-id") + cmd.MarkFlagRequired("node-id") + + flags.SetFlagValuesFunc("ulb-id", func() []string { + return getAllULBIDNames(*req.ProjectId, *req.Region) + }) + flags.SetFlagValuesFunc("node-id", func() []string { + return getAllULBVServerNodeIDNames(*req.ULBId, "", *req.ProjectId, *req.Region) + }) + return cmd +} + +//NewCmdULBVServerCreatePolicy ucloud ulb-vserver create-policy +func NewCmdULBVServerCreatePolicy(out io.Writer) *cobra.Command { + backendIDs := []string{} + req := base.BizClient.NewCreatePolicyRequest() + cmd := &cobra.Command{ + Use: "add-policy", + Short: "Add content forward policy for VServer", + Long: "Add content forward policy for VServer", + Run: func(c *cobra.Command, args []string) { + if *req.Type != "Domain" && *req.Type != "Path" { + fmt.Fprintln(out, "Error, forward method must be Domain or Path") + return + } + req.ProjectId = sdk.String(base.PickResourceID(*req.ProjectId)) + req.ULBId = sdk.String(base.PickResourceID(*req.ULBId)) + req.VServerId = sdk.String(base.PickResourceID(*req.VServerId)) + for _, idname := range backendIDs { + req.BackendId = append(req.BackendId, base.PickResourceID(idname)) + } + resp, err := base.BizClient.CreatePolicy(req) + if err != nil { + base.HandleError(err) + return + } + fmt.Fprintf(out, "policy[%s] created\n", resp.PolicyId) + }, + } + + flags := cmd.Flags() + flags.SortFlags = false + + req.ULBId = flags.String("ulb-id", "", "Required. Resource ID of ULB") + req.VServerId = flags.String("vserver-id", "", "Required. Resource ID of VServer") + flags.StringSliceVar(&backendIDs, "node-id", nil, "Required. NodeID of the VServer's nodes") + req.Type = flags.String("forward-method", "", "Required. Forward method, accept values:Domain and Path; Both forwarding methods can be described by using regular expressions or wildcards") + req.Match = flags.String("expression", "", "Required. Expression of domain or path, such as \"www.[123].demo.com\" or \"/path/img/*.jpg\"") + bindRegion(req, flags) + bindProjectID(req, flags) + + flags.SetFlagValues("forward-method", "Domain", "Path") + flags.SetFlagValuesFunc("ulb-id", func() []string { + return getAllULBIDNames(*req.ProjectId, *req.Region) + }) + flags.SetFlagValuesFunc("vserver-id", func() []string { + return getAllULBVServerIDNames(*req.ULBId, *req.ProjectId, *req.Region) + }) + flags.SetFlagValuesFunc("node-id", func() []string { + return getAllULBVServerNodeIDNames(*req.ULBId, *req.VServerId, *req.ProjectId, *req.Region) + }) + + cmd.MarkFlagRequired("ulb-id") + cmd.MarkFlagRequired("vserver-id") + cmd.MarkFlagRequired("node-id") + cmd.MarkFlagRequired("forward-method") + cmd.MarkFlagRequired("expression") + + return cmd +} + +//ULBVServerPolicy 表格行 +type ULBVServerPolicy struct { + ForwardMethod string + Expression string + PolicyID string + PolicyType string + Nodes string +} + +//NewCmdULBVServerListPolicy ucloud ulb-vserver list-policy +func NewCmdULBVServerListPolicy(out io.Writer) *cobra.Command { + var ulbID, vserverID *string + region := base.ConfigIns.Region + project := base.ConfigIns.ProjectID + cmd := &cobra.Command{ + Use: "list-policy", + Short: "List content forward policies of the VServer instance", + Long: "List content forward policies of the VServer instance", + Run: func(c *cobra.Command, args []string) { + ulbID = sdk.String(base.PickResourceID(*ulbID)) + vserverID = sdk.String(base.PickResourceID(*vserverID)) + vsList, err := getAllULBVServer(*ulbID, *vserverID, project, region) + if err != nil { + base.HandleError(err) + return + } + if len(vsList) == 1 { + vs := vsList[0] + list := []ULBVServerPolicy{} + for _, p := range vs.PolicySet { + row := ULBVServerPolicy{} + row.ForwardMethod = p.Type + row.Expression = p.Match + row.PolicyID = p.PolicyId + row.PolicyType = p.PolicyType + nodes := []string{} + for _, b := range p.BackendSet { + nodes = append(nodes, fmt.Sprintf("%s|%s:%d|%s", b.BackendId, b.PrivateIP, b.Port, b.ResourceName)) + } + row.Nodes = strings.Join(nodes, ",") + list = append(list, row) + } + base.PrintList(list, global.json) + } + }, + } + flags := cmd.Flags() + flags.SortFlags = false + bindRegionS(®ion, flags) + bindProjectIDS(&project, flags) + + ulbID = flags.String("ulb-id", "", "Required. Resource ID of ULB") + vserverID = flags.String("vserver-id", "", "Required. Resource ID of VServer") + + flags.SetFlagValuesFunc("ulb-id", func() []string { + return getAllULBIDNames(project, region) + }) + flags.SetFlagValuesFunc("vserver-id", func() []string { + ulb := base.PickResourceID(*ulbID) + return getAllULBVServerIDNames(ulb, project, region) + }) + cmd.MarkFlagRequired("ulb-id") + cmd.MarkFlagRequired("vserver-id") + return cmd +} + +//NewCmdULBVServerUpdatePolicy ucloud ulb-vserver update-policy +func NewCmdULBVServerUpdatePolicy(out io.Writer) *cobra.Command { + policyIDs := []string{} + backendIDs := []string{} + addBackendIDs := []string{} + removeBackendIDs := []string{} + req := base.BizClient.NewUpdatePolicyRequest() + cmd := &cobra.Command{ + Use: "update-policy", + Short: "Update content forward policies of ULB VServer", + Long: "Update content forward policies ULB VServer", + Run: func(c *cobra.Command, args []string) { + req.ProjectId = sdk.String(base.PickResourceID(*req.ProjectId)) + req.ULBId = sdk.String(base.PickResourceID(*req.ULBId)) + req.VServerId = sdk.String(base.PickResourceID(*req.VServerId)) + + vsList, err := getAllULBVServer(*req.ULBId, *req.VServerId, *req.ProjectId, *req.Region) + if err != nil { + base.HandleError(err) + return + } + vs := vsList[0] + + for _, policyID := range policyIDs { + var policy *ulb.ULBPolicySet + for _, p := range vs.PolicySet { + if p.PolicyId == policyID { + policy = &p + break + } + } + if policy == nil { + fmt.Fprintf(out, "policy[%s] not found\n", *req.PolicyId) + continue + } + req.PolicyId = sdk.String(policyID) + if *req.Type == "" { + req.Type = sdk.String(policy.Type) + } else if *req.Type != "Domain" && *req.Type != "Path" { + fmt.Fprintf(out, "Error, forward-method must be Domain or Path") + continue + } + if *req.Match == "" { + req.Match = sdk.String(policy.Match) + } + backendIDMap := map[string]bool{} + if backendIDs == nil { + for _, b := range policy.BackendSet { + backendIDMap[b.BackendId] = true + } + } else { + for _, bid := range backendIDs { + backendIDMap[base.PickResourceID(bid)] = true + } + } + for _, bid := range addBackendIDs { + backendIDMap[base.PickResourceID(bid)] = true + } + for _, bid := range removeBackendIDs { + backendIDMap[base.PickResourceID(bid)] = false + } + for bid, ok := range backendIDMap { + if ok { + req.BackendId = append(req.BackendId, bid) + } + } + resp, err := base.BizClient.UpdatePolicy(req) + if err != nil { + base.HandleError(err) + continue + } + fmt.Fprintf(out, "policy[%s] updated\n", resp.PolicyId) + } + }, + } + + flags := cmd.Flags() + flags.SortFlags = false + + bindRegion(req, flags) + bindProjectID(req, flags) + req.ULBId = flags.String("ulb-id", "", "Required. Resource ID of ULB") + req.VServerId = flags.String("vserver-id", "", "Required. Resource ID of VServer") + flags.StringSliceVar(&policyIDs, "policy-id", nil, "Required. PolicyID of policies to update") + flags.StringSliceVar(&backendIDs, "node-id", nil, "Optional. NodeID of nodes. If assign this flag, it will rewrite all nodes of the policy") + flags.StringSliceVar(&addBackendIDs, "add-node-id", nil, "Optional. NodeID of nodes. Add nodes to the policy") + flags.StringSliceVar(&removeBackendIDs, "remove-node-id", nil, "Optional. NodeID of nodes. Remove those nodes from the policy") + req.Type = flags.String("forward-method", "", "Optional. Forward method of policy, accept values:Domain and Path") + req.Match = flags.String("expression", "", "Optional. Expression of domain or path, such as \"www.[123].demo.com\" or \"/path/img/*.jpg\"") + + cmd.MarkFlagRequired("ulb-id") + cmd.MarkFlagRequired("vserver-id") + cmd.MarkFlagRequired("policy-id") + + flags.SetFlagValues("forward-method", "Domain", "Path") + flags.SetFlagValuesFunc("ulb-id", func() []string { + project := base.PickResourceID(*req.ProjectId) + return getAllULBIDNames(project, *req.Region) + }) + flags.SetFlagValuesFunc("vserver-id", func() []string { + return getAllULBVServerIDNames(*req.ULBId, *req.ProjectId, *req.Region) + }) + flags.SetFlagValuesFunc("node-id", func() []string { + return getAllULBVServerNodeIDNames(*req.ULBId, *req.VServerId, *req.ProjectId, *req.Region) + }) + flags.SetFlagValuesFunc("add-node-id", func() []string { + return getAllULBVServerNodeIDNames(*req.ULBId, *req.VServerId, *req.ProjectId, *req.Region) + }) + flags.SetFlagValuesFunc("remove-node-id", func() []string { + return getAllULBVServerNodeIDNames(*req.ULBId, *req.VServerId, *req.ProjectId, *req.Region) + }) + + return cmd +} + +//NewCmdULBVServerDeletePolicy ucloud ulb-vserver delete-policy +func NewCmdULBVServerDeletePolicy(out io.Writer) *cobra.Command { + policyIDs := []string{} + req := base.BizClient.NewDeletePolicyRequest() + cmd := &cobra.Command{ + Use: "delete-policy", + Short: "Delete content forward policies of ULB VServer", + Long: "Delete content forward policies of ULB VServer", + Run: func(c *cobra.Command, args []string) { + for _, p := range policyIDs { + req.PolicyId = sdk.String(p) + _, err := base.BizClient.DeletePolicy(req) + if err != nil { + base.HandleError(err) + continue + } + fmt.Fprintf(out, "policy[%s] deleted\n", p) + } + }, + } + flags := cmd.Flags() + flags.SortFlags = false + + bindRegion(req, flags) + bindProjectID(req, flags) + + flags.StringSliceVar(&policyIDs, "policy-id", nil, "Required. PolicyID of policies to delete") + req.VServerId = flags.String("vserver-id", "", "Optional. Resource ID of VServer") + + cmd.MarkFlagRequired("policy-id") + + return cmd +} + +//NewCmdULBSSL ucloud ulb-ssl-certificate +func NewCmdULBSSL() *cobra.Command { + cmd := &cobra.Command{ + Use: "ulb-ssl-certificate", + Short: "List and manipulate SSL Certificates for ULB", + Long: "List and manipulate SSL Certificates for ULB", + } + out := base.Cxt.GetWriter() + cmd.AddCommand(NewCmdSSLList()) + cmd.AddCommand(NewCmdSSLDescribe(out)) + cmd.AddCommand(NewCmdSSLAdd(out)) + cmd.AddCommand(NewCmdSSLDelete(out)) + cmd.AddCommand(NewCmdSSLBind(out)) + cmd.AddCommand(NewCmdSSLUnbind(out)) + return cmd +} + +//SSLCertificate 表格行 +type SSLCertificate struct { + Name string + ResourceID string + MD5 string + BindResource string + UploadTime string +} + +//NewCmdSSLList ucloud ulb-ssl-certificate list +func NewCmdSSLList() *cobra.Command { + req := base.BizClient.NewDescribeSSLRequest() + cmd := &cobra.Command{ + Use: "list", + Short: "List SSL Certificates", + Long: "List SSL Certificates", + Run: func(c *cobra.Command, args []string) { + req.ProjectId = sdk.String(base.PickResourceID(*req.ProjectId)) + resp, err := base.BizClient.DescribeSSL(req) + if err != nil { + base.HandleError(err) + return + } + rows := []SSLCertificate{} + for _, ssl := range resp.DataSet { + row := SSLCertificate{} + row.Name = ssl.SSLName + row.ResourceID = ssl.SSLId + row.MD5 = ssl.HashValue + row.UploadTime = base.FormatDateTime(ssl.CreateTime) + targets := []string{} + for _, t := range ssl.BindedTargetSet { + item := fmt.Sprintf("%s/%s(%s/%s)", t.VServerId, t.VServerName, t.ULBId, t.ULBName) + targets = append(targets, item) + } + row.BindResource = strings.Join(targets, ",") + rows = append(rows, row) + } + base.PrintList(rows, global.json) + }, + } + flags := cmd.Flags() + flags.SortFlags = false + + bindRegion(req, flags) + bindProjectID(req, flags) + req.SSLId = flags.String("ssl-id", "", "Optional. ResouceID of ssl certificate to list") + bindLimit(req, flags) + bindOffset(req, flags) + + return cmd +} + +//NewCmdSSLDescribe ucloud ulb-ssl-certificate describe +func NewCmdSSLDescribe(out io.Writer) *cobra.Command { + req := base.BizClient.NewDescribeSSLRequest() + cmd := &cobra.Command{ + Use: "describe", + Short: "Display all data associated with SSL Certificate", + Long: "Display all data associated with SSL Certificate", + Run: func(c *cobra.Command, args []string) { + req.SSLId = sdk.String(base.PickResourceID(*req.SSLId)) + req.ProjectId = sdk.String(base.PickResourceID(*req.ProjectId)) + resp, err := base.BizClient.DescribeSSL(req) + if err != nil { + base.HandleError(err) + return + } + if len(resp.DataSet) <= 0 { + fmt.Fprintf(out, "ssl certificate[%s] is not exists\n", *req.SSLId) + return + } + + sslcf := resp.DataSet[0] + targets := []string{} + for _, t := range sslcf.BindedTargetSet { + item := fmt.Sprintf("%s/%s-%s/%s", t.ULBId, t.ULBName, t.VServerId, t.VServerName) + targets = append(targets, item) + } + rows := []base.DescribeTableRow{ + base.DescribeTableRow{ + Attribute: "ResourceID", + Content: sslcf.SSLId, + }, + base.DescribeTableRow{ + Attribute: "Name", + Content: sslcf.SSLName, + }, + base.DescribeTableRow{ + Attribute: "Type", + Content: sslcf.SSLType, + }, + base.DescribeTableRow{ + Attribute: "UploadTime", + Content: base.FormatDateTime(sslcf.CreateTime), + }, + base.DescribeTableRow{ + Attribute: "BindResource", + Content: strings.Join(targets, ","), + }, + base.DescribeTableRow{ + Attribute: "MD5", + Content: sslcf.HashValue, + }, + base.DescribeTableRow{ + Attribute: "Content", + Content: sslcf.SSLContent, + }, + } + base.PrintDescribe(rows, global.json) + }, + } + flags := cmd.Flags() + flags.SortFlags = false + + req.SSLId = flags.String("ssl-id", "", "Required. ResouceID of ssl certificate to describe") + bindRegion(req, flags) + bindProjectID(req, flags) + flags.SetFlagValuesFunc("ssl-id", func() []string { + return getAllSSLCertIDNames(*req.ProjectId, *req.Region) + }) + cmd.MarkFlagRequired("ssl-id") + return cmd +} + +//NewCmdSSLAdd ucloud ulb-ssl-certificate add +func NewCmdSSLAdd(out io.Writer) *cobra.Command { + var allPath, sitePath, keyPath, caPath *string + req := base.BizClient.NewCreateSSLRequest() + cmd := &cobra.Command{ + Use: "add", + Short: "Add SSL Certificate", + Long: "Add SSL Certificate", + Run: func(c *cobra.Command, args []string) { + if *allPath == "" && (*sitePath == "" || *keyPath == "") { + fmt.Fprintln(out, "if all-in-one-file is omitted, site-certificate-file and private-key-file can't be empty") + return + } + if *allPath != "" { + content, err := readFile(*allPath) + if err != nil { + base.HandleError(err) + return + } + req.SSLContent = &content + } + if *sitePath != "" { + content, err := readFile(*sitePath) + if err != nil { + base.HandleError(err) + return + } + req.UserCert = &content + } + if *keyPath != "" { + content, err := readFile(*keyPath) + if err != nil { + base.HandleError(err) + return + } + req.PrivateKey = &content + } + if *caPath != "" { + content, err := readFile(*caPath) + if err != nil { + base.HandleError(err) + return + } + req.CaCert = &content + } + + req.ProjectId = sdk.String(base.PickResourceID(*req.ProjectId)) + resp, err := base.BizClient.CreateSSL(req) + if err != nil { + base.HandleError(err) + return + } + fmt.Fprintf(out, "ssl certificate[%s] added\n", resp.SSLId) + }, + } + flags := cmd.Flags() + flags.SortFlags = false + + bindRegion(req, flags) + bindProjectID(req, flags) + req.SSLName = flags.String("name", "", "Required. Name of ssl certificate to add") + req.SSLType = flags.String("format", "Pem", "Optional. Format of ssl certificate") + allPath = flags.String("all-in-one-file", "", "Optional. Path of file which contain the complete content of the SSL certificate, including the content of site certificate, the private key which encrypted the site certificate, and the CA certificate. ") + sitePath = flags.String("site-certificate-file", "", "Optional. Path of user's certificate file, *.crt. Required if all-in-one-file is omitted") + keyPath = flags.String("private-key-file", "", "Optional. Path of private key file, *.key. Required if all-in-one-file is omitted") + caPath = flags.String("ca-certificate-file", "", "Optional. Path of CA certificate file, *.crt") + cmd.MarkFlagRequired("name") + return cmd +} + +//NewCmdSSLDelete ucloud ulb-ssl-certificate delete +func NewCmdSSLDelete(out io.Writer) *cobra.Command { + var idNames []string + req := base.BizClient.NewDeleteSSLRequest() + cmd := &cobra.Command{ + Use: "delete", + Short: "Delete SSL Certificates by resource id(ssl id)", + Long: "Delete SSL Certificates by resource id(ssl id)", + Run: func(c *cobra.Command, args []string) { + req.ProjectId = sdk.String(base.PickResourceID(*req.ProjectId)) + for _, idname := range idNames { + req.SSLId = sdk.String(base.PickResourceID(idname)) + _, err := base.BizClient.DeleteSSL(req) + if err != nil { + base.HandleError(err) + continue + } + fmt.Fprintf(out, "ssl certificate[%s] deleted\n", idname) + } + }, + } + flags := cmd.Flags() + flags.SortFlags = false + + bindRegion(req, flags) + bindProjectID(req, flags) + flags.StringSliceVar(&idNames, "ssl-id", nil, "Required. Resource ID of SSL Certificates to delete") + flags.SetFlagValuesFunc("ssl-id", func() []string { + return getAllSSLCertIDNames(*req.ProjectId, *req.Region) + }) + return cmd +} + +//NewCmdSSLBind ucloud ulb-ssl-certificate bind +func NewCmdSSLBind(out io.Writer) *cobra.Command { + req := base.BizClient.NewBindSSLRequest() + cmd := &cobra.Command{ + Use: "bind", + Short: "Bind SSL Certificate with VServer", + Long: "Bind SSL Certificate with VServer", + Run: func(c *cobra.Command, args []string) { + req.ProjectId = sdk.String(base.PickResourceID(*req.ProjectId)) + req.ULBId = sdk.String(base.PickResourceID(*req.ULBId)) + req.VServerId = sdk.String(base.PickResourceID(*req.VServerId)) + req.SSLId = sdk.String(base.PickResourceID(*req.SSLId)) + _, err := base.BizClient.BindSSL(req) + if err != nil { + base.HandleError(err) + return + } + fmt.Fprintf(out, "ssl certificate[%s] bind with vserver[%s] of ulb[%s]\n", *req.SSLId, *req.VServerId, *req.ULBId) + }, + } + flags := cmd.Flags() + flags.SortFlags = false + + bindRegion(req, flags) + bindProjectID(req, flags) + req.SSLId = flags.String("ssl-id", "", "Required. Resource ID of SSL Certificate to bind") + req.ULBId = flags.String("ulb-id", "", "Required. Resource ID of ULB") + req.VServerId = flags.String("vserver-id", "", "Required. Resource ID of VServer") + flags.SetFlagValuesFunc("ssl-id", func() []string { + return getAllSSLCertIDNames(*req.ProjectId, *req.Region) + }) + flags.SetFlagValuesFunc("ulb-id", func() []string { + return getAllULBIDNames(*req.ProjectId, *req.Region) + }) + flags.SetFlagValuesFunc("vserver-id", func() []string { + return getAllULBVServerIDNames(*req.ULBId, *req.ProjectId, *req.Region) + }) + cmd.MarkFlagRequired("ssl-id") + cmd.MarkFlagRequired("ulb-id") + cmd.MarkFlagRequired("vserver-id") + return cmd +} + +//NewCmdSSLUnbind ucloud ulb-ssl-certificate unbind +func NewCmdSSLUnbind(out io.Writer) *cobra.Command { + req := base.BizClient.NewUnbindSSLRequest() + cmd := &cobra.Command{ + Use: "unbind", + Short: "Unbind SSL Certificate with VServer", + Long: "Unbind SSL Certificate with VServer", + Run: func(c *cobra.Command, args []string) { + req.ProjectId = sdk.String(base.PickResourceID(*req.ProjectId)) + req.ULBId = sdk.String(base.PickResourceID(*req.ULBId)) + req.VServerId = sdk.String(base.PickResourceID(*req.VServerId)) + req.SSLId = sdk.String(base.PickResourceID(*req.SSLId)) + _, err := base.BizClient.UnbindSSL(req) + if err != nil { + base.HandleError(err) + return + } + fmt.Fprintf(out, "ssl certificate[%s] unbind with vserver[%s] of ulb[%s]\n", *req.SSLId, *req.VServerId, *req.ULBId) + }, + } + flags := cmd.Flags() + flags.SortFlags = false + + bindRegion(req, flags) + bindProjectID(req, flags) + req.SSLId = flags.String("ssl-id", "", "Required. Resource ID of SSL Certificate to unbind") + req.ULBId = flags.String("ulb-id", "", "Required. Resource ID of ULB") + req.VServerId = flags.String("vserver-id", "", "Required. Resource ID of VServer") + flags.SetFlagValuesFunc("ssl-id", func() []string { + return getAllSSLCertIDNames(*req.ProjectId, *req.Region) + }) + flags.SetFlagValuesFunc("ulb-id", func() []string { + if *req.SSLId == "" { + return getAllULBIDNames(*req.ProjectId, *req.Region) + } + cert, err := getSSLCertByID(*req.SSLId, *req.ProjectId, *req.Region) + if err != nil { + return nil + } + ulbs := []string{} + for _, b := range cert.BindedTargetSet { + ulbs = append(ulbs, fmt.Sprintf("%s/%s", b.ULBId, b.ULBName)) + } + return ulbs + }) + flags.SetFlagValuesFunc("vserver-id", func() []string { + if *req.SSLId == "" { + return getAllULBVServerIDNames(*req.ULBId, *req.ProjectId, *req.Region) + } + cert, err := getSSLCertByID(*req.SSLId, *req.ProjectId, *req.Region) + if err != nil { + return nil + } + vservers := []string{} + for _, b := range cert.BindedTargetSet { + vservers = append(vservers, fmt.Sprintf("%s/%s", b.VServerId, b.VServerName)) + } + return vservers + }) + cmd.MarkFlagRequired("ssl-id") + cmd.MarkFlagRequired("ulb-id") + cmd.MarkFlagRequired("vserver-id") + return cmd +} + +func readFile(file string) (string, error) { + byts, err := ioutil.ReadFile(file) + if err != nil { + return "", err + } + return string(byts), nil +} + +func getAllULBVServerNodes(ulbID, vserverID, project, region string) ([]ulb.ULBBackendSet, error) { + vsList, err := getAllULBVServer(ulbID, vserverID, project, region) + if err != nil { + return nil, err + } + nodeList := []ulb.ULBBackendSet{} + for _, vs := range vsList { + nodeList = append(nodeList, vs.BackendSet...) + } + return nodeList, nil +} + +func getAllULBVServerNodeIDNames(ulbID, vserverID, project, region string) []string { + nodeList, err := getAllULBVServerNodes(ulbID, vserverID, project, region) + if err != nil { + return nil + } + idNames := []string{} + for _, node := range nodeList { + idNames = append(idNames, fmt.Sprintf("%s/%s", node.BackendId, node.ResourceName)) + } + return idNames +} + +func getAllSSLCertIDNames(project, region string) []string { + sslcs, err := getAllSSLCerts(project, region) + if err != nil { + return nil + } + idNames := []string{} + for _, ssl := range sslcs { + idNames = append(idNames, fmt.Sprintf("%s/%s", ssl.SSLId, ssl.SSLName)) + } + return idNames +} + +func getAllSSLCerts(project, region string) ([]ulb.ULBSSLSet, error) { + req := base.BizClient.NewDescribeSSLRequest() + req.ProjectId = sdk.String(base.PickResourceID(project)) + req.Region = sdk.String(region) + list := []ulb.ULBSSLSet{} + for offset, limit := 0, 50; ; offset += limit { + req.Offset = sdk.Int(offset) + req.Limit = sdk.Int(limit) + resp, err := base.BizClient.DescribeSSL(req) + if err != nil { + return nil, err + } + list = append(list, resp.DataSet...) + if resp.TotalCount <= offset+limit { + break + } + } + return list, nil +} + +func getSSLCertByID(sslID, project, region string) (*ulb.ULBSSLSet, error) { + if sslID == "" { + return nil, fmt.Errorf("ssl certificate resource id can't be empty") + } + req := base.BizClient.NewDescribeSSLRequest() + req.ProjectId = sdk.String(base.PickResourceID(project)) + req.Region = sdk.String(region) + req.SSLId = sdk.String(base.PickResourceID(sslID)) + resp, err := base.BizClient.DescribeSSL(req) + if err != nil { + return nil, err + } + if len(resp.DataSet) <= 0 { + return nil, fmt.Errorf("ssl certificate[%s] is not exists", sslID) + } + return &resp.DataSet[0], nil +} + +func getAllULBVServer(ulbID, vserverID, project, region string) ([]ulb.ULBVServerSet, error) { + req := base.BizClient.NewDescribeVServerRequest() + req.ULBId = sdk.String(base.PickResourceID(ulbID)) + req.ProjectId = sdk.String(base.PickResourceID(project)) + req.Region = ®ion + if vserverID != "" { + req.VServerId = sdk.String(base.PickResourceID(vserverID)) + } + resp, err := base.BizClient.DescribeVServer(req) + if err != nil { + return nil, err + } + if vserverID != "" { + if len(resp.DataSet) < 1 { + return nil, fmt.Errorf("VServer[%s] may not exist", vserverID) + } else if len(resp.DataSet) > 1 { + return nil, fmt.Errorf("Internal Error, too many vserver:%#v", resp.DataSet) + } + } + return resp.DataSet, nil +} + +func getAllULBVServerIDNames(ulbID, project, region string) []string { + vservers, err := getAllULBVServer(ulbID, "", project, region) + if err != nil { + return nil + } + idNames := []string{} + for _, vs := range vservers { + idNames = append(idNames, fmt.Sprintf("%s/%s", vs.VServerId, vs.VServerName)) + } + return idNames +} diff --git a/cmd/util.go b/cmd/util.go new file mode 100644 index 0000000000..d0dc06d577 --- /dev/null +++ b/cmd/util.go @@ -0,0 +1,67 @@ +package cmd + +import ( + "reflect" + + "github.com/spf13/pflag" + + "github.com/ucloud/ucloud-sdk-go/ucloud/request" + + "github.com/ucloud/ucloud-cli/base" +) + +func bindRegion(req request.Common, flags *pflag.FlagSet) { + var region string + flags.StringVar(®ion, "region", base.ConfigIns.Region, "Optional. Override default region, see 'ucloud region'") + flags.SetFlagValuesFunc("region", getRegionList) + req.SetRegionRef(®ion) +} + +func bindRegionS(region *string, flags *pflag.FlagSet) { + *region = base.ConfigIns.Region + flags.StringVar(region, "region", base.ConfigIns.Region, "Optional. Override default region, see 'ucloud region'") + flags.SetFlagValuesFunc("region", getRegionList) +} + +func bindZone(req request.Common, flags *pflag.FlagSet) { + var zone string + flags.StringVar(&zone, "zone", base.ConfigIns.Zone, "Optional. Override default available zone, see 'ucloud region'") + flags.SetFlagValuesFunc("zone", func() []string { + return getZoneList(req.GetRegion()) + }) + req.SetZoneRef(&zone) +} + +func bindProjectID(req request.Common, flags *pflag.FlagSet) { + var project string + flags.StringVar(&project, "project-id", base.ConfigIns.ProjectID, "Optional. Override default project-id, see 'ucloud project list'") + flags.SetFlagValuesFunc("project-id", getProjectList) + req.SetProjectIdRef(&project) +} + +func bindProjectIDS(project *string, flags *pflag.FlagSet) { + *project = base.ConfigIns.ProjectID + flags.StringVar(project, "project-id", base.ConfigIns.ProjectID, "Optional. Override default project-id, see 'ucloud project list'") + flags.SetFlagValuesFunc("project-id", getProjectList) +} + +func bindGroup(req interface{}, flags *pflag.FlagSet) { + group := flags.String("group", "", "Optional. Business group") + v := reflect.ValueOf(req).Elem() + f := v.FieldByName("Tag") + f.Set(reflect.ValueOf(group)) +} + +func bindLimit(req interface{}, flags *pflag.FlagSet) { + limit := flags.Int("limit", 100, "Optional. The maximum number of resources per page") + v := reflect.ValueOf(req).Elem() + f := v.FieldByName("Limit") + f.Set(reflect.ValueOf(limit)) +} + +func bindOffset(req interface{}, flags *pflag.FlagSet) { + limit := flags.Int("offset", 0, "Optional. The index(a number) of resource which start to list") + v := reflect.ValueOf(req).Elem() + f := v.FieldByName("Limit") + f.Set(reflect.ValueOf(limit)) +} diff --git a/cmd/vpc.go b/cmd/vpc.go index cdb44f7620..7feaffecad 100644 --- a/cmd/vpc.go +++ b/cmd/vpc.go @@ -343,8 +343,8 @@ func getAllVPCIdNames(project, region string) []string { func NewCmdSubnet() *cobra.Command { cmd := &cobra.Command{ Use: "subnet", - Short: "List subnet", - Long: `List subnet`, + Short: "List, create and delete subnet", + Long: "List, create and delete subnet", Args: cobra.NoArgs, } out := base.Cxt.GetWriter() diff --git a/main.go b/main.go index 9df448afa8..b6ce89c431 100644 --- a/main.go +++ b/main.go @@ -14,9 +14,7 @@ package main -import ( - "github.com/ucloud/ucloud-cli/cmd" -) +import "github.com/ucloud/ucloud-cli/cmd" func main() { cmd.Execute() diff --git a/vendor/github.com/spf13/cobra/command.go b/vendor/github.com/spf13/cobra/command.go index f5c1870444..45b64c4b45 100644 --- a/vendor/github.com/spf13/cobra/command.go +++ b/vendor/github.com/spf13/cobra/command.go @@ -17,10 +17,13 @@ package cobra import ( "bytes" + "encoding/json" "fmt" "io" + "io/ioutil" "os" "path/filepath" + "runtime" "sort" "strconv" "strings" @@ -1072,37 +1075,54 @@ func completeFlagValues(cmd *Command, args []string, word string) { } } - fetchFn := cmd.Flags().GetFlagValuesFunc(_flag.Name) - //async completing is costly, only execute once. - if fetchFn != nil { - fetchChan := make(chan string, 0) - go func() { - for _, item := range fetchFn() { - fetchChan <- item - } - close(fetchChan) - }() - timeoutDur, _ := time.ParseDuration("3s") - timeoutChan := time.After(timeoutDur) - intervalChan := time.Tick(time.Second / 100) - - loop: - for range intervalChan { - select { - case v, ok := <-fetchChan: - if ok == false { - break loop - } - if strings.HasPrefix(v, word) && v != word { - fmt.Fprintln(cmd.OutOrStdout(), v) - os.Stdout.Sync() - hasCompleted = true + compLine := strings.Join(args, " ") + if args[len(args)-1] == word { + compLine = strings.Join(args[:len(args)-1], " ") + } + cache, err := readCompCache() + if err != nil || cache[compLine] == nil { + fetchFn := cmd.Flags().GetFlagValuesFunc(_flag.Name) + //async completing is costly, only execute once. + if fetchFn != nil { + fetchChan := make(chan string, 0) + go func() { + words := fetchFn() + for _, item := range words { + fetchChan <- item } + close(fetchChan) + cache = make(map[string][]string) + cache[compLine] = words + saveCompCache(cache) + }() + timeoutDur, _ := time.ParseDuration("3s") + timeoutChan := time.After(timeoutDur) + intervalChan := time.Tick(time.Second / 100) + + loop: + for range intervalChan { + select { + case v, ok := <-fetchChan: + if ok == false { + break loop + } + if strings.HasPrefix(v, word) && v != word { + fmt.Fprintln(cmd.OutOrStdout(), v) + os.Stdout.Sync() + hasCompleted = true + } - case <-timeoutChan: - break loop + case <-timeoutChan: + break loop + } } } + } else { + words := cache[compLine] + for _, word := range words { + fmt.Fprintln(cmd.OutOrStdout(), word) + } + hasCompleted = true } if !hasCompleted { @@ -1111,6 +1131,64 @@ func completeFlagValues(cmd *Command, args []string, word string) { fmt.Fprintln(cmd.OutOrStdout(), word) } } + +} + +func readCompCache() (map[string][]string, error) { + filePath := getCachePath() + filePath += "/cache" + fileInfo, err := os.Stat(filePath) + if err != nil { + return nil, err + } + if ct := fileInfo.ModTime(); time.Now().Sub(ct) <= 10*1e9 { + byts, err := ioutil.ReadFile(filePath) + if err != nil { + return nil, err + } + cacheMap := map[string][]string{} + err = json.Unmarshal(byts, &cacheMap) + if err != nil { + return nil, err + } + return cacheMap, nil + } + return nil, fmt.Errorf("no available cache") +} + +func saveCompCache(cache map[string][]string) error { + byts, err := json.Marshal(cache) + if err != nil { + return err + } + filePath := getCachePath() + filePath += "/cache" + err = ioutil.WriteFile(filePath, byts, 0600) + return err +} + +//GetHomePath 获取家目录 +func getHomePath() string { + if runtime.GOOS == "windows" { + home := os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH") + if home == "" { + home = os.Getenv("USERPROFILE") + } + return home + } + return os.Getenv("HOME") +} + +//GetConfigPath 获取配置文件的绝对路径 +func getCachePath() string { + path := getHomePath() + "/.ucloud" + if _, err := os.Stat(path); os.IsNotExist(err) { + err = os.MkdirAll(path, 0755) + if err != nil { + panic(err) + } + } + return path } // ResetCommands delete parent, subcommand and help command from c. diff --git a/vendor/github.com/spf13/cobra/doc/man_docs.go b/vendor/github.com/spf13/cobra/doc/man_docs.go new file mode 100644 index 0000000000..e5dbda2dad --- /dev/null +++ b/vendor/github.com/spf13/cobra/doc/man_docs.go @@ -0,0 +1,236 @@ +// Copyright 2015 Red Hat Inc. All rights reserved. +// +// 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 doc + +import ( + "bytes" + "fmt" + "io" + "os" + "path/filepath" + "sort" + "strings" + "time" + + "github.com/cpuguy83/go-md2man/md2man" + "github.com/spf13/cobra" + "github.com/spf13/pflag" +) + +// GenManTree will generate a man page for this command and all descendants +// in the directory given. The header may be nil. This function may not work +// correctly if your command names have `-` in them. If you have `cmd` with two +// subcmds, `sub` and `sub-third`, and `sub` has a subcommand called `third` +// it is undefined which help output will be in the file `cmd-sub-third.1`. +func GenManTree(cmd *cobra.Command, header *GenManHeader, dir string) error { + return GenManTreeFromOpts(cmd, GenManTreeOptions{ + Header: header, + Path: dir, + CommandSeparator: "-", + }) +} + +// GenManTreeFromOpts generates a man page for the command and all descendants. +// The pages are written to the opts.Path directory. +func GenManTreeFromOpts(cmd *cobra.Command, opts GenManTreeOptions) error { + header := opts.Header + if header == nil { + header = &GenManHeader{} + } + for _, c := range cmd.Commands() { + if !c.IsAvailableCommand() || c.IsAdditionalHelpTopicCommand() { + continue + } + if err := GenManTreeFromOpts(c, opts); err != nil { + return err + } + } + section := "1" + if header.Section != "" { + section = header.Section + } + + separator := "_" + if opts.CommandSeparator != "" { + separator = opts.CommandSeparator + } + basename := strings.Replace(cmd.CommandPath(), " ", separator, -1) + filename := filepath.Join(opts.Path, basename+"."+section) + f, err := os.Create(filename) + if err != nil { + return err + } + defer f.Close() + + headerCopy := *header + return GenMan(cmd, &headerCopy, f) +} + +// GenManTreeOptions is the options for generating the man pages. +// Used only in GenManTreeFromOpts. +type GenManTreeOptions struct { + Header *GenManHeader + Path string + CommandSeparator string +} + +// GenManHeader is a lot like the .TH header at the start of man pages. These +// include the title, section, date, source, and manual. We will use the +// current time if Date is unset and will use "Auto generated by spf13/cobra" +// if the Source is unset. +type GenManHeader struct { + Title string + Section string + Date *time.Time + date string + Source string + Manual string +} + +// GenMan will generate a man page for the given command and write it to +// w. The header argument may be nil, however obviously w may not. +func GenMan(cmd *cobra.Command, header *GenManHeader, w io.Writer) error { + if header == nil { + header = &GenManHeader{} + } + fillHeader(header, cmd.CommandPath()) + + b := genMan(cmd, header) + _, err := w.Write(md2man.Render(b)) + return err +} + +func fillHeader(header *GenManHeader, name string) { + if header.Title == "" { + header.Title = strings.ToUpper(strings.Replace(name, " ", "\\-", -1)) + } + if header.Section == "" { + header.Section = "1" + } + if header.Date == nil { + now := time.Now() + header.Date = &now + } + header.date = (*header.Date).Format("Jan 2006") + if header.Source == "" { + header.Source = "Auto generated by spf13/cobra" + } +} + +func manPreamble(buf *bytes.Buffer, header *GenManHeader, cmd *cobra.Command, dashedName string) { + description := cmd.Long + if len(description) == 0 { + description = cmd.Short + } + + buf.WriteString(fmt.Sprintf(`%% %s(%s)%s +%% %s +%% %s +# NAME +`, header.Title, header.Section, header.date, header.Source, header.Manual)) + buf.WriteString(fmt.Sprintf("%s \\- %s\n\n", dashedName, cmd.Short)) + buf.WriteString("# SYNOPSIS\n") + buf.WriteString(fmt.Sprintf("**%s**\n\n", cmd.UseLine())) + buf.WriteString("# DESCRIPTION\n") + buf.WriteString(description + "\n\n") +} + +func manPrintFlags(buf *bytes.Buffer, flags *pflag.FlagSet) { + flags.VisitAll(func(flag *pflag.Flag) { + if len(flag.Deprecated) > 0 || flag.Hidden { + return + } + format := "" + if len(flag.Shorthand) > 0 && len(flag.ShorthandDeprecated) == 0 { + format = fmt.Sprintf("**-%s**, **--%s**", flag.Shorthand, flag.Name) + } else { + format = fmt.Sprintf("**--%s**", flag.Name) + } + if len(flag.NoOptDefVal) > 0 { + format += "[" + } + if flag.Value.Type() == "string" { + // put quotes on the value + format += "=%q" + } else { + format += "=%s" + } + if len(flag.NoOptDefVal) > 0 { + format += "]" + } + format += "\n\t%s\n\n" + buf.WriteString(fmt.Sprintf(format, flag.DefValue, flag.Usage)) + }) +} + +func manPrintOptions(buf *bytes.Buffer, command *cobra.Command) { + flags := command.NonInheritedFlags() + if flags.HasAvailableFlags() { + buf.WriteString("# OPTIONS\n") + manPrintFlags(buf, flags) + buf.WriteString("\n") + } + flags = command.InheritedFlags() + if flags.HasAvailableFlags() { + buf.WriteString("# OPTIONS INHERITED FROM PARENT COMMANDS\n") + manPrintFlags(buf, flags) + buf.WriteString("\n") + } +} + +func genMan(cmd *cobra.Command, header *GenManHeader) []byte { + cmd.InitDefaultHelpCmd() + cmd.InitDefaultHelpFlag() + + // something like `rootcmd-subcmd1-subcmd2` + dashCommandName := strings.Replace(cmd.CommandPath(), " ", "-", -1) + + buf := new(bytes.Buffer) + + manPreamble(buf, header, cmd, dashCommandName) + manPrintOptions(buf, cmd) + if len(cmd.Example) > 0 { + buf.WriteString("# EXAMPLE\n") + buf.WriteString(fmt.Sprintf("```\n%s\n```\n", cmd.Example)) + } + if hasSeeAlso(cmd) { + buf.WriteString("# SEE ALSO\n") + seealsos := make([]string, 0) + if cmd.HasParent() { + parentPath := cmd.Parent().CommandPath() + dashParentPath := strings.Replace(parentPath, " ", "-", -1) + seealso := fmt.Sprintf("**%s(%s)**", dashParentPath, header.Section) + seealsos = append(seealsos, seealso) + cmd.VisitParents(func(c *cobra.Command) { + if c.DisableAutoGenTag { + cmd.DisableAutoGenTag = c.DisableAutoGenTag + } + }) + } + children := cmd.Commands() + sort.Sort(byName(children)) + for _, c := range children { + if !c.IsAvailableCommand() || c.IsAdditionalHelpTopicCommand() { + continue + } + seealso := fmt.Sprintf("**%s-%s(%s)**", dashCommandName, c.Name(), header.Section) + seealsos = append(seealsos, seealso) + } + buf.WriteString(strings.Join(seealsos, ", ") + "\n") + } + if !cmd.DisableAutoGenTag { + buf.WriteString(fmt.Sprintf("# HISTORY\n%s Auto generated by spf13/cobra\n", header.Date.Format("2-Jan-2006"))) + } + return buf.Bytes() +} diff --git a/vendor/github.com/spf13/cobra/doc/man_docs.md b/vendor/github.com/spf13/cobra/doc/man_docs.md new file mode 100644 index 0000000000..3709160f34 --- /dev/null +++ b/vendor/github.com/spf13/cobra/doc/man_docs.md @@ -0,0 +1,31 @@ +# Generating Man Pages For Your Own cobra.Command + +Generating man pages from a cobra command is incredibly easy. An example is as follows: + +```go +package main + +import ( + "log" + + "github.com/spf13/cobra" + "github.com/spf13/cobra/doc" +) + +func main() { + cmd := &cobra.Command{ + Use: "test", + Short: "my test program", + } + header := &doc.GenManHeader{ + Title: "MINE", + Section: "3", + } + err := doc.GenManTree(cmd, header, "/tmp") + if err != nil { + log.Fatal(err) + } +} +``` + +That will get you a man page `/tmp/test.3` diff --git a/vendor/github.com/spf13/cobra/doc/md_docs.go b/vendor/github.com/spf13/cobra/doc/md_docs.go new file mode 100644 index 0000000000..d76f6d5ecb --- /dev/null +++ b/vendor/github.com/spf13/cobra/doc/md_docs.go @@ -0,0 +1,159 @@ +//Copyright 2015 Red Hat Inc. All rights reserved. +// +// 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 doc + +import ( + "bytes" + "fmt" + "io" + "os" + "path/filepath" + "sort" + "strings" + "time" + + "github.com/spf13/cobra" +) + +func printOptions(buf *bytes.Buffer, cmd *cobra.Command, name string) error { + flags := cmd.NonInheritedFlags() + flags.SetOutput(buf) + if flags.HasAvailableFlags() { + buf.WriteString("### Options\n\n```\n") + flags.PrintDefaults() + buf.WriteString("```\n\n") + } + + parentFlags := cmd.InheritedFlags() + parentFlags.SetOutput(buf) + if parentFlags.HasAvailableFlags() { + buf.WriteString("### Options inherited from parent commands\n\n```\n") + parentFlags.PrintDefaults() + buf.WriteString("```\n\n") + } + return nil +} + +// GenMarkdown creates markdown output. +func GenMarkdown(cmd *cobra.Command, w io.Writer) error { + return GenMarkdownCustom(cmd, w, func(s string) string { return s }) +} + +// GenMarkdownCustom creates custom markdown output. +func GenMarkdownCustom(cmd *cobra.Command, w io.Writer, linkHandler func(string) string) error { + cmd.InitDefaultHelpCmd() + cmd.InitDefaultHelpFlag() + + buf := new(bytes.Buffer) + name := cmd.CommandPath() + + short := cmd.Short + long := cmd.Long + if len(long) == 0 { + long = short + } + + buf.WriteString("## " + name + "\n\n") + buf.WriteString(short + "\n\n") + buf.WriteString("### Synopsis\n\n") + buf.WriteString(long + "\n\n") + + if cmd.Runnable() { + buf.WriteString(fmt.Sprintf("```\n%s\n```\n\n", cmd.UseLine())) + } + + if len(cmd.Example) > 0 { + buf.WriteString("### Examples\n\n") + buf.WriteString(fmt.Sprintf("```\n%s\n```\n\n", cmd.Example)) + } + + if err := printOptions(buf, cmd, name); err != nil { + return err + } + if hasSeeAlso(cmd) { + buf.WriteString("### SEE ALSO\n\n") + if cmd.HasParent() { + parent := cmd.Parent() + pname := parent.CommandPath() + link := pname + ".md" + link = strings.Replace(link, " ", "_", -1) + buf.WriteString(fmt.Sprintf("* [%s](%s)\t - %s\n", pname, linkHandler(link), parent.Short)) + cmd.VisitParents(func(c *cobra.Command) { + if c.DisableAutoGenTag { + cmd.DisableAutoGenTag = c.DisableAutoGenTag + } + }) + } + + children := cmd.Commands() + sort.Sort(byName(children)) + + for _, child := range children { + if !child.IsAvailableCommand() || child.IsAdditionalHelpTopicCommand() { + continue + } + cname := name + " " + child.Name() + link := cname + ".md" + link = strings.Replace(link, " ", "_", -1) + buf.WriteString(fmt.Sprintf("* [%s](%s)\t - %s\n", cname, linkHandler(link), child.Short)) + } + buf.WriteString("\n") + } + if !cmd.DisableAutoGenTag { + buf.WriteString("###### Auto generated by spf13/cobra on " + time.Now().Format("2-Jan-2006") + "\n") + } + _, err := buf.WriteTo(w) + return err +} + +// GenMarkdownTree will generate a markdown page for this command and all +// descendants in the directory given. The header may be nil. +// This function may not work correctly if your command names have `-` in them. +// If you have `cmd` with two subcmds, `sub` and `sub-third`, +// and `sub` has a subcommand called `third`, it is undefined which +// help output will be in the file `cmd-sub-third.1`. +func GenMarkdownTree(cmd *cobra.Command, dir string) error { + identity := func(s string) string { return s } + emptyStr := func(s string) string { return "" } + return GenMarkdownTreeCustom(cmd, dir, emptyStr, identity) +} + +// GenMarkdownTreeCustom is the the same as GenMarkdownTree, but +// with custom filePrepender and linkHandler. +func GenMarkdownTreeCustom(cmd *cobra.Command, dir string, filePrepender, linkHandler func(string) string) error { + for _, c := range cmd.Commands() { + if !c.IsAvailableCommand() || c.IsAdditionalHelpTopicCommand() { + continue + } + if err := GenMarkdownTreeCustom(c, dir, filePrepender, linkHandler); err != nil { + return err + } + } + + basename := strings.Replace(cmd.CommandPath(), " ", "_", -1) + ".md" + filename := filepath.Join(dir, basename) + f, err := os.Create(filename) + if err != nil { + return err + } + defer f.Close() + + if _, err := io.WriteString(f, filePrepender(filename)); err != nil { + return err + } + if err := GenMarkdownCustom(cmd, f, linkHandler); err != nil { + return err + } + return nil +} diff --git a/vendor/github.com/spf13/cobra/doc/md_docs.md b/vendor/github.com/spf13/cobra/doc/md_docs.md new file mode 100644 index 0000000000..56ce9fe819 --- /dev/null +++ b/vendor/github.com/spf13/cobra/doc/md_docs.md @@ -0,0 +1,115 @@ +# Generating Markdown Docs For Your Own cobra.Command + +Generating man pages from a cobra command is incredibly easy. An example is as follows: + +```go +package main + +import ( + "log" + + "github.com/spf13/cobra" + "github.com/spf13/cobra/doc" +) + +func main() { + cmd := &cobra.Command{ + Use: "test", + Short: "my test program", + } + err := doc.GenMarkdownTree(cmd, "/tmp") + if err != nil { + log.Fatal(err) + } +} +``` + +That will get you a Markdown document `/tmp/test.md` + +## Generate markdown docs for the entire command tree + +This program can actually generate docs for the kubectl command in the kubernetes project + +```go +package main + +import ( + "log" + "io/ioutil" + "os" + + "k8s.io/kubernetes/pkg/kubectl/cmd" + cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" + + "github.com/spf13/cobra/doc" +) + +func main() { + kubectl := cmd.NewKubectlCommand(cmdutil.NewFactory(nil), os.Stdin, ioutil.Discard, ioutil.Discard) + err := doc.GenMarkdownTree(kubectl, "./") + if err != nil { + log.Fatal(err) + } +} +``` + +This will generate a whole series of files, one for each command in the tree, in the directory specified (in this case "./") + +## Generate markdown docs for a single command + +You may wish to have more control over the output, or only generate for a single command, instead of the entire command tree. If this is the case you may prefer to `GenMarkdown` instead of `GenMarkdownTree` + +```go + out := new(bytes.Buffer) + err := doc.GenMarkdown(cmd, out) + if err != nil { + log.Fatal(err) + } +``` + +This will write the markdown doc for ONLY "cmd" into the out, buffer. + +## Customize the output + +Both `GenMarkdown` and `GenMarkdownTree` have alternate versions with callbacks to get some control of the output: + +```go +func GenMarkdownTreeCustom(cmd *Command, dir string, filePrepender, linkHandler func(string) string) error { + //... +} +``` + +```go +func GenMarkdownCustom(cmd *Command, out *bytes.Buffer, linkHandler func(string) string) error { + //... +} +``` + +The `filePrepender` will prepend the return value given the full filepath to the rendered Markdown file. A common use case is to add front matter to use the generated documentation with [Hugo](http://gohugo.io/): + +```go +const fmTemplate = `--- +date: %s +title: "%s" +slug: %s +url: %s +--- +` + +filePrepender := func(filename string) string { + now := time.Now().Format(time.RFC3339) + name := filepath.Base(filename) + base := strings.TrimSuffix(name, path.Ext(name)) + url := "/commands/" + strings.ToLower(base) + "/" + return fmt.Sprintf(fmTemplate, now, strings.Replace(base, "_", " ", -1), base, url) +} +``` + +The `linkHandler` can be used to customize the rendered internal links to the commands, given a filename: + +```go +linkHandler := func(name string) string { + base := strings.TrimSuffix(name, path.Ext(name)) + return "/commands/" + strings.ToLower(base) + "/" +} +``` diff --git a/vendor/github.com/spf13/cobra/doc/rest_docs.go b/vendor/github.com/spf13/cobra/doc/rest_docs.go new file mode 100644 index 0000000000..051d8dc832 --- /dev/null +++ b/vendor/github.com/spf13/cobra/doc/rest_docs.go @@ -0,0 +1,185 @@ +//Copyright 2015 Red Hat Inc. All rights reserved. +// +// 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 doc + +import ( + "bytes" + "fmt" + "io" + "os" + "path/filepath" + "sort" + "strings" + "time" + + "github.com/spf13/cobra" +) + +func printOptionsReST(buf *bytes.Buffer, cmd *cobra.Command, name string) error { + flags := cmd.NonInheritedFlags() + flags.SetOutput(buf) + if flags.HasAvailableFlags() { + buf.WriteString("Options\n") + buf.WriteString("~~~~~~~\n\n::\n\n") + flags.PrintDefaults() + buf.WriteString("\n") + } + + parentFlags := cmd.InheritedFlags() + parentFlags.SetOutput(buf) + if parentFlags.HasAvailableFlags() { + buf.WriteString("Options inherited from parent commands\n") + buf.WriteString("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n::\n\n") + parentFlags.PrintDefaults() + buf.WriteString("\n") + } + return nil +} + +// linkHandler for default ReST hyperlink markup +func defaultLinkHandler(name, ref string) string { + return fmt.Sprintf("`%s <%s.rst>`_", name, ref) +} + +// GenReST creates reStructured Text output. +func GenReST(cmd *cobra.Command, w io.Writer) error { + return GenReSTCustom(cmd, w, defaultLinkHandler) +} + +// GenReSTCustom creates custom reStructured Text output. +func GenReSTCustom(cmd *cobra.Command, w io.Writer, linkHandler func(string, string) string) error { + cmd.InitDefaultHelpCmd() + cmd.InitDefaultHelpFlag() + + buf := new(bytes.Buffer) + name := cmd.CommandPath() + + short := cmd.Short + long := cmd.Long + if len(long) == 0 { + long = short + } + ref := strings.Replace(name, " ", "_", -1) + + buf.WriteString(".. _" + ref + ":\n\n") + buf.WriteString(name + "\n") + buf.WriteString(strings.Repeat("-", len(name)) + "\n\n") + buf.WriteString(short + "\n\n") + buf.WriteString("Synopsis\n") + buf.WriteString("~~~~~~~~\n\n") + buf.WriteString("\n" + long + "\n\n") + + if cmd.Runnable() { + buf.WriteString(fmt.Sprintf("::\n\n %s\n\n", cmd.UseLine())) + } + + if len(cmd.Example) > 0 { + buf.WriteString("Examples\n") + buf.WriteString("~~~~~~~~\n\n") + buf.WriteString(fmt.Sprintf("::\n\n%s\n\n", indentString(cmd.Example, " "))) + } + + if err := printOptionsReST(buf, cmd, name); err != nil { + return err + } + if hasSeeAlso(cmd) { + buf.WriteString("SEE ALSO\n") + buf.WriteString("~~~~~~~~\n\n") + if cmd.HasParent() { + parent := cmd.Parent() + pname := parent.CommandPath() + ref = strings.Replace(pname, " ", "_", -1) + buf.WriteString(fmt.Sprintf("* %s \t - %s\n", linkHandler(pname, ref), parent.Short)) + cmd.VisitParents(func(c *cobra.Command) { + if c.DisableAutoGenTag { + cmd.DisableAutoGenTag = c.DisableAutoGenTag + } + }) + } + + children := cmd.Commands() + sort.Sort(byName(children)) + + for _, child := range children { + if !child.IsAvailableCommand() || child.IsAdditionalHelpTopicCommand() { + continue + } + cname := name + " " + child.Name() + ref = strings.Replace(cname, " ", "_", -1) + buf.WriteString(fmt.Sprintf("* %s \t - %s\n", linkHandler(cname, ref), child.Short)) + } + buf.WriteString("\n") + } + if !cmd.DisableAutoGenTag { + buf.WriteString("*Auto generated by spf13/cobra on " + time.Now().Format("2-Jan-2006") + "*\n") + } + _, err := buf.WriteTo(w) + return err +} + +// GenReSTTree will generate a ReST page for this command and all +// descendants in the directory given. +// This function may not work correctly if your command names have `-` in them. +// If you have `cmd` with two subcmds, `sub` and `sub-third`, +// and `sub` has a subcommand called `third`, it is undefined which +// help output will be in the file `cmd-sub-third.1`. +func GenReSTTree(cmd *cobra.Command, dir string) error { + emptyStr := func(s string) string { return "" } + return GenReSTTreeCustom(cmd, dir, emptyStr, defaultLinkHandler) +} + +// GenReSTTreeCustom is the the same as GenReSTTree, but +// with custom filePrepender and linkHandler. +func GenReSTTreeCustom(cmd *cobra.Command, dir string, filePrepender func(string) string, linkHandler func(string, string) string) error { + for _, c := range cmd.Commands() { + if !c.IsAvailableCommand() || c.IsAdditionalHelpTopicCommand() { + continue + } + if err := GenReSTTreeCustom(c, dir, filePrepender, linkHandler); err != nil { + return err + } + } + + basename := strings.Replace(cmd.CommandPath(), " ", "_", -1) + ".rst" + filename := filepath.Join(dir, basename) + f, err := os.Create(filename) + if err != nil { + return err + } + defer f.Close() + + if _, err := io.WriteString(f, filePrepender(filename)); err != nil { + return err + } + if err := GenReSTCustom(cmd, f, linkHandler); err != nil { + return err + } + return nil +} + +// adapted from: https://github.com/kr/text/blob/main/indent.go +func indentString(s, p string) string { + var res []byte + b := []byte(s) + prefix := []byte(p) + bol := true + for _, c := range b { + if bol && c != '\n' { + res = append(res, prefix...) + } + res = append(res, c) + bol = c == '\n' + } + return string(res) +} diff --git a/vendor/github.com/spf13/cobra/doc/rest_docs.md b/vendor/github.com/spf13/cobra/doc/rest_docs.md new file mode 100644 index 0000000000..6098430eff --- /dev/null +++ b/vendor/github.com/spf13/cobra/doc/rest_docs.md @@ -0,0 +1,114 @@ +# Generating ReStructured Text Docs For Your Own cobra.Command + +Generating ReST pages from a cobra command is incredibly easy. An example is as follows: + +```go +package main + +import ( + "log" + + "github.com/spf13/cobra" + "github.com/spf13/cobra/doc" +) + +func main() { + cmd := &cobra.Command{ + Use: "test", + Short: "my test program", + } + err := doc.GenReSTTree(cmd, "/tmp") + if err != nil { + log.Fatal(err) + } +} +``` + +That will get you a ReST document `/tmp/test.rst` + +## Generate ReST docs for the entire command tree + +This program can actually generate docs for the kubectl command in the kubernetes project + +```go +package main + +import ( + "log" + "io/ioutil" + "os" + + "k8s.io/kubernetes/pkg/kubectl/cmd" + cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" + + "github.com/spf13/cobra/doc" +) + +func main() { + kubectl := cmd.NewKubectlCommand(cmdutil.NewFactory(nil), os.Stdin, ioutil.Discard, ioutil.Discard) + err := doc.GenReSTTree(kubectl, "./") + if err != nil { + log.Fatal(err) + } +} +``` + +This will generate a whole series of files, one for each command in the tree, in the directory specified (in this case "./") + +## Generate ReST docs for a single command + +You may wish to have more control over the output, or only generate for a single command, instead of the entire command tree. If this is the case you may prefer to `GenReST` instead of `GenReSTTree` + +```go + out := new(bytes.Buffer) + err := doc.GenReST(cmd, out) + if err != nil { + log.Fatal(err) + } +``` + +This will write the ReST doc for ONLY "cmd" into the out, buffer. + +## Customize the output + +Both `GenReST` and `GenReSTTree` have alternate versions with callbacks to get some control of the output: + +```go +func GenReSTTreeCustom(cmd *Command, dir string, filePrepender func(string) string, linkHandler func(string, string) string) error { + //... +} +``` + +```go +func GenReSTCustom(cmd *Command, out *bytes.Buffer, linkHandler func(string, string) string) error { + //... +} +``` + +The `filePrepender` will prepend the return value given the full filepath to the rendered ReST file. A common use case is to add front matter to use the generated documentation with [Hugo](http://gohugo.io/): + +```go +const fmTemplate = `--- +date: %s +title: "%s" +slug: %s +url: %s +--- +` +filePrepender := func(filename string) string { + now := time.Now().Format(time.RFC3339) + name := filepath.Base(filename) + base := strings.TrimSuffix(name, path.Ext(name)) + url := "/commands/" + strings.ToLower(base) + "/" + return fmt.Sprintf(fmTemplate, now, strings.Replace(base, "_", " ", -1), base, url) +} +``` + +The `linkHandler` can be used to customize the rendered links to the commands, given a command name and reference. This is useful while converting rst to html or while generating documentation with tools like Sphinx where `:ref:` is used: + +```go +// Sphinx cross-referencing format +linkHandler := func(name, ref string) string { + return fmt.Sprintf(":ref:`%s <%s>`", name, ref) +} +``` diff --git a/vendor/github.com/spf13/cobra/doc/util.go b/vendor/github.com/spf13/cobra/doc/util.go new file mode 100644 index 0000000000..8d3dbecec8 --- /dev/null +++ b/vendor/github.com/spf13/cobra/doc/util.go @@ -0,0 +1,51 @@ +// Copyright 2015 Red Hat Inc. All rights reserved. +// +// 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 doc + +import ( + "strings" + + "github.com/spf13/cobra" +) + +// Test to see if we have a reason to print See Also information in docs +// Basically this is a test for a parent commend or a subcommand which is +// both not deprecated and not the autogenerated help command. +func hasSeeAlso(cmd *cobra.Command) bool { + if cmd.HasParent() { + return true + } + for _, c := range cmd.Commands() { + if !c.IsAvailableCommand() || c.IsAdditionalHelpTopicCommand() { + continue + } + return true + } + return false +} + +// Temporary workaround for yaml lib generating incorrect yaml with long strings +// that do not contain \n. +func forceMultiLine(s string) string { + if len(s) > 60 && !strings.Contains(s, "\n") { + s = s + "\n" + } + return s +} + +type byName []*cobra.Command + +func (s byName) Len() int { return len(s) } +func (s byName) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s byName) Less(i, j int) bool { return s[i].Name() < s[j].Name() } diff --git a/vendor/github.com/spf13/cobra/doc/yaml_docs.go b/vendor/github.com/spf13/cobra/doc/yaml_docs.go new file mode 100644 index 0000000000..ea00af07e8 --- /dev/null +++ b/vendor/github.com/spf13/cobra/doc/yaml_docs.go @@ -0,0 +1,169 @@ +// Copyright 2016 French Ben. All rights reserved. +// +// 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 doc + +import ( + "fmt" + "io" + "os" + "path/filepath" + "sort" + "strings" + + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "gopkg.in/yaml.v2" +) + +type cmdOption struct { + Name string + Shorthand string `yaml:",omitempty"` + DefaultValue string `yaml:"default_value,omitempty"` + Usage string `yaml:",omitempty"` +} + +type cmdDoc struct { + Name string + Synopsis string `yaml:",omitempty"` + Description string `yaml:",omitempty"` + Options []cmdOption `yaml:",omitempty"` + InheritedOptions []cmdOption `yaml:"inherited_options,omitempty"` + Example string `yaml:",omitempty"` + SeeAlso []string `yaml:"see_also,omitempty"` +} + +// GenYamlTree creates yaml structured ref files for this command and all descendants +// in the directory given. This function may not work +// correctly if your command names have `-` in them. If you have `cmd` with two +// subcmds, `sub` and `sub-third`, and `sub` has a subcommand called `third` +// it is undefined which help output will be in the file `cmd-sub-third.1`. +func GenYamlTree(cmd *cobra.Command, dir string) error { + identity := func(s string) string { return s } + emptyStr := func(s string) string { return "" } + return GenYamlTreeCustom(cmd, dir, emptyStr, identity) +} + +// GenYamlTreeCustom creates yaml structured ref files. +func GenYamlTreeCustom(cmd *cobra.Command, dir string, filePrepender, linkHandler func(string) string) error { + for _, c := range cmd.Commands() { + if !c.IsAvailableCommand() || c.IsAdditionalHelpTopicCommand() { + continue + } + if err := GenYamlTreeCustom(c, dir, filePrepender, linkHandler); err != nil { + return err + } + } + + basename := strings.Replace(cmd.CommandPath(), " ", "_", -1) + ".yaml" + filename := filepath.Join(dir, basename) + f, err := os.Create(filename) + if err != nil { + return err + } + defer f.Close() + + if _, err := io.WriteString(f, filePrepender(filename)); err != nil { + return err + } + if err := GenYamlCustom(cmd, f, linkHandler); err != nil { + return err + } + return nil +} + +// GenYaml creates yaml output. +func GenYaml(cmd *cobra.Command, w io.Writer) error { + return GenYamlCustom(cmd, w, func(s string) string { return s }) +} + +// GenYamlCustom creates custom yaml output. +func GenYamlCustom(cmd *cobra.Command, w io.Writer, linkHandler func(string) string) error { + cmd.InitDefaultHelpCmd() + cmd.InitDefaultHelpFlag() + + yamlDoc := cmdDoc{} + yamlDoc.Name = cmd.CommandPath() + + yamlDoc.Synopsis = forceMultiLine(cmd.Short) + yamlDoc.Description = forceMultiLine(cmd.Long) + + if len(cmd.Example) > 0 { + yamlDoc.Example = cmd.Example + } + + flags := cmd.NonInheritedFlags() + if flags.HasFlags() { + yamlDoc.Options = genFlagResult(flags) + } + flags = cmd.InheritedFlags() + if flags.HasFlags() { + yamlDoc.InheritedOptions = genFlagResult(flags) + } + + if hasSeeAlso(cmd) { + result := []string{} + if cmd.HasParent() { + parent := cmd.Parent() + result = append(result, parent.CommandPath()+" - "+parent.Short) + } + children := cmd.Commands() + sort.Sort(byName(children)) + for _, child := range children { + if !child.IsAvailableCommand() || child.IsAdditionalHelpTopicCommand() { + continue + } + result = append(result, child.Name()+" - "+child.Short) + } + yamlDoc.SeeAlso = result + } + + final, err := yaml.Marshal(&yamlDoc) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + if _, err := w.Write(final); err != nil { + return err + } + return nil +} + +func genFlagResult(flags *pflag.FlagSet) []cmdOption { + var result []cmdOption + + flags.VisitAll(func(flag *pflag.Flag) { + // Todo, when we mark a shorthand is deprecated, but specify an empty message. + // The flag.ShorthandDeprecated is empty as the shorthand is deprecated. + // Using len(flag.ShorthandDeprecated) > 0 can't handle this, others are ok. + if !(len(flag.ShorthandDeprecated) > 0) && len(flag.Shorthand) > 0 { + opt := cmdOption{ + flag.Name, + flag.Shorthand, + flag.DefValue, + forceMultiLine(flag.Usage), + } + result = append(result, opt) + } else { + opt := cmdOption{ + Name: flag.Name, + DefaultValue: forceMultiLine(flag.DefValue), + Usage: forceMultiLine(flag.Usage), + } + result = append(result, opt) + } + }) + + return result +} diff --git a/vendor/github.com/spf13/cobra/doc/yaml_docs.md b/vendor/github.com/spf13/cobra/doc/yaml_docs.md new file mode 100644 index 0000000000..1a9b7c6a3c --- /dev/null +++ b/vendor/github.com/spf13/cobra/doc/yaml_docs.md @@ -0,0 +1,112 @@ +# Generating Yaml Docs For Your Own cobra.Command + +Generating yaml files from a cobra command is incredibly easy. An example is as follows: + +```go +package main + +import ( + "log" + + "github.com/spf13/cobra" + "github.com/spf13/cobra/doc" +) + +func main() { + cmd := &cobra.Command{ + Use: "test", + Short: "my test program", + } + err := doc.GenYamlTree(cmd, "/tmp") + if err != nil { + log.Fatal(err) + } +} +``` + +That will get you a Yaml document `/tmp/test.yaml` + +## Generate yaml docs for the entire command tree + +This program can actually generate docs for the kubectl command in the kubernetes project + +```go +package main + +import ( + "io/ioutil" + "log" + "os" + + "k8s.io/kubernetes/pkg/kubectl/cmd" + cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" + + "github.com/spf13/cobra/doc" +) + +func main() { + kubectl := cmd.NewKubectlCommand(cmdutil.NewFactory(nil), os.Stdin, ioutil.Discard, ioutil.Discard) + err := doc.GenYamlTree(kubectl, "./") + if err != nil { + log.Fatal(err) + } +} +``` + +This will generate a whole series of files, one for each command in the tree, in the directory specified (in this case "./") + +## Generate yaml docs for a single command + +You may wish to have more control over the output, or only generate for a single command, instead of the entire command tree. If this is the case you may prefer to `GenYaml` instead of `GenYamlTree` + +```go + out := new(bytes.Buffer) + doc.GenYaml(cmd, out) +``` + +This will write the yaml doc for ONLY "cmd" into the out, buffer. + +## Customize the output + +Both `GenYaml` and `GenYamlTree` have alternate versions with callbacks to get some control of the output: + +```go +func GenYamlTreeCustom(cmd *Command, dir string, filePrepender, linkHandler func(string) string) error { + //... +} +``` + +```go +func GenYamlCustom(cmd *Command, out *bytes.Buffer, linkHandler func(string) string) error { + //... +} +``` + +The `filePrepender` will prepend the return value given the full filepath to the rendered Yaml file. A common use case is to add front matter to use the generated documentation with [Hugo](http://gohugo.io/): + +```go +const fmTemplate = `--- +date: %s +title: "%s" +slug: %s +url: %s +--- +` + +filePrepender := func(filename string) string { + now := time.Now().Format(time.RFC3339) + name := filepath.Base(filename) + base := strings.TrimSuffix(name, path.Ext(name)) + url := "/commands/" + strings.ToLower(base) + "/" + return fmt.Sprintf(fmTemplate, now, strings.Replace(base, "_", " ", -1), base, url) +} +``` + +The `linkHandler` can be used to customize the rendered internal links to the commands, given a filename: + +```go +linkHandler := func(name string) string { + base := strings.TrimSuffix(name, path.Ext(name)) + return "/commands/" + strings.ToLower(base) + "/" +} +``` diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/allocate_backend.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/allocate_backend.go new file mode 100644 index 0000000000..fb1c8abfe2 --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/allocate_backend.go @@ -0,0 +1,66 @@ +//Code is generated by ucloud code generator, don't modify it by hand, it will cause undefined behaviors. +//go:generate ucloud-gen-go-api ULB AllocateBackend + +package ulb + +import ( + "github.com/ucloud/ucloud-sdk-go/ucloud/request" + "github.com/ucloud/ucloud-sdk-go/ucloud/response" +) + +// AllocateBackendRequest is request schema for AllocateBackend action +type AllocateBackendRequest struct { + request.CommonBase + + // 负载均衡实例的ID + ULBId *string `required:"true"` + + // VServer实例的ID + VServerId *string `required:"true"` + + // 所添加的后端资源的类型,枚举值:UHost -> 云主机;UPM -> 物理云主机; UDHost -> 私有专区主机;UDocker -> 容器,默认值为“UHost” + ResourceType *string `required:"true"` + + // 所添加的后端资源的资源ID + ResourceId *string `required:"true"` + + // 所添加的后端资源服务端口,取值范围[1-65535],默认80 + Port *int `required:"false"` + + // 后端实例状态开关,枚举值: 1:启用; 0:禁用 默认为启用 + Enabled *int `required:"false"` + Weight *int +} + +// AllocateBackendResponse is response schema for AllocateBackend action +type AllocateBackendResponse struct { + response.CommonBase + + // 所添加的后端资源在ULB中的对象ID,(为ULB系统中使用,与资源自身ID无关),可用于 UpdateBackendAttribute/UpdateBackendAttributeBatch/ReleaseBackend + BackendId string +} + +// NewAllocateBackendRequest will create request of AllocateBackend action. +func (c *ULBClient) NewAllocateBackendRequest() *AllocateBackendRequest { + req := &AllocateBackendRequest{} + + // setup request with client config + c.client.SetupRequest(req) + + // setup retryable with default retry policy (retry for non-create action and common error) + req.SetRetryable(true) + return req +} + +// AllocateBackend - 添加ULB后端资源实例 +func (c *ULBClient) AllocateBackend(req *AllocateBackendRequest) (*AllocateBackendResponse, error) { + var err error + var res AllocateBackendResponse + + err = c.client.InvokeAction("AllocateBackend", req, &res) + if err != nil { + return &res, err + } + + return &res, nil +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/allocate_backend_batch.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/allocate_backend_batch.go new file mode 100644 index 0000000000..302d37e374 --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/allocate_backend_batch.go @@ -0,0 +1,59 @@ +//Code is generated by ucloud code generator, don't modify it by hand, it will cause undefined behaviors. +//go:generate ucloud-gen-go-api ULB AllocateBackendBatch + +package ulb + +import ( + "github.com/ucloud/ucloud-sdk-go/ucloud/request" + "github.com/ucloud/ucloud-sdk-go/ucloud/response" +) + +// AllocateBackendBatchRequest is request schema for AllocateBackendBatch action +type AllocateBackendBatchRequest struct { + request.CommonBase + + // 负载均衡实例的ID + ULBId *string `required:"true"` + + // VServer实例的ID + VServerId *string `required:"true"` + + // 用| 分割字段,格式:ResourceId| ResourceType| Port| Enabled|IP。ResourceId:所添加的后端资源的资源ID;ResourceType:所添加的后端资源的类型,枚举值:UHost -> 云主机;UPM -> 物理云主机; UDHost -> 私有专区主机;UDocker -> 容器,默认值为“UHost”;Port:所添加的后端资源服务端口,取值范围[1-65535];Enabled:后端实例状态开关,枚举值: 1:启用; 0:禁用;IP:后端资源内网ip; + Backends []string `required:"true"` + + // 已弃用,指定 Api 版本 + ApiVersion *int `required:"false"` +} + +// AllocateBackendBatchResponse is response schema for AllocateBackendBatch action +type AllocateBackendBatchResponse struct { + response.CommonBase + + // 所添加的后端资源ID,(为ULB系统中使用,与资源自身ID无关),可用于 UpdateBackendAttribute/UpdateBackendAttributeBatch/ReleaseBackend + BackendSet []BackendSet +} + +// NewAllocateBackendBatchRequest will create request of AllocateBackendBatch action. +func (c *ULBClient) NewAllocateBackendBatchRequest() *AllocateBackendBatchRequest { + req := &AllocateBackendBatchRequest{} + + // setup request with client config + c.client.SetupRequest(req) + + // setup retryable with default retry policy (retry for non-create action and common error) + req.SetRetryable(true) + return req +} + +// AllocateBackendBatch - 批量添加VServer后端节点 +func (c *ULBClient) AllocateBackendBatch(req *AllocateBackendBatchRequest) (*AllocateBackendBatchResponse, error) { + var err error + var res AllocateBackendBatchResponse + + err = c.client.InvokeAction("AllocateBackendBatch", req, &res) + if err != nil { + return &res, err + } + + return &res, nil +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/bind_ssl.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/bind_ssl.go new file mode 100644 index 0000000000..654f983a4e --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/bind_ssl.go @@ -0,0 +1,53 @@ +//Code is generated by ucloud code generator, don't modify it by hand, it will cause undefined behaviors. +//go:generate ucloud-gen-go-api ULB BindSSL + +package ulb + +import ( + "github.com/ucloud/ucloud-sdk-go/ucloud/request" + "github.com/ucloud/ucloud-sdk-go/ucloud/response" +) + +// BindSSLRequest is request schema for BindSSL action +type BindSSLRequest struct { + request.CommonBase + + // 所绑定ULB实例ID + ULBId *string `required:"true"` + + // 所绑定VServer实例ID + VServerId *string `required:"true"` + + // SSL证书的Id + SSLId *string `required:"true"` +} + +// BindSSLResponse is response schema for BindSSL action +type BindSSLResponse struct { + response.CommonBase +} + +// NewBindSSLRequest will create request of BindSSL action. +func (c *ULBClient) NewBindSSLRequest() *BindSSLRequest { + req := &BindSSLRequest{} + + // setup request with client config + c.client.SetupRequest(req) + + // setup retryable with default retry policy (retry for non-create action and common error) + req.SetRetryable(true) + return req +} + +// BindSSL - 将SSL证书绑定到VServer +func (c *ULBClient) BindSSL(req *BindSSLRequest) (*BindSSLResponse, error) { + var err error + var res BindSSLResponse + + err = c.client.InvokeAction("BindSSL", req, &res) + if err != nil { + return &res, err + } + + return &res, nil +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/client.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/client.go new file mode 100644 index 0000000000..3f28fc790a --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/client.go @@ -0,0 +1,19 @@ +package ulb + +import ( + "github.com/ucloud/ucloud-sdk-go/ucloud" + "github.com/ucloud/ucloud-sdk-go/ucloud/auth" +) + +// ULBClient is the client of ULB +type ULBClient struct { + client *ucloud.Client +} + +// NewClient will return a instance of ULBClient +func NewClient(config *ucloud.Config, credential *auth.Credential) *ULBClient { + client := ucloud.NewClient(config, credential) + return &ULBClient{ + client: client, + } +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/create_policy.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/create_policy.go new file mode 100644 index 0000000000..f1a2197377 --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/create_policy.go @@ -0,0 +1,62 @@ +//Code is generated by ucloud code generator, don't modify it by hand, it will cause undefined behaviors. +//go:generate ucloud-gen-go-api ULB CreatePolicy + +package ulb + +import ( + "github.com/ucloud/ucloud-sdk-go/ucloud/request" + "github.com/ucloud/ucloud-sdk-go/ucloud/response" +) + +// CreatePolicyRequest is request schema for CreatePolicy action +type CreatePolicyRequest struct { + request.CommonBase + + // 需要添加内容转发策略的负载均衡实例ID + ULBId *string `required:"true"` + + // 需要添加内容转发策略的VServer实例ID + VServerId *string `required:"true"` + + // 内容转发策略应用的后端资源实例的ID,来源于 AllocateBackend 返回的 BackendId + BackendId []string `required:"true"` + + // 内容转发匹配字段 + Match *string `required:"true"` + + // 内容转发匹配字段的类型 + Type *string `required:"false"` +} + +// CreatePolicyResponse is response schema for CreatePolicy action +type CreatePolicyResponse struct { + response.CommonBase + + // 内容转发策略ID + PolicyId string +} + +// NewCreatePolicyRequest will create request of CreatePolicy action. +func (c *ULBClient) NewCreatePolicyRequest() *CreatePolicyRequest { + req := &CreatePolicyRequest{} + + // setup request with client config + c.client.SetupRequest(req) + + // setup retryable with default retry policy (retry for non-create action and common error) + req.SetRetryable(false) + return req +} + +// CreatePolicy - 创建VServer内容转发策略 +func (c *ULBClient) CreatePolicy(req *CreatePolicyRequest) (*CreatePolicyResponse, error) { + var err error + var res CreatePolicyResponse + + err = c.client.InvokeAction("CreatePolicy", req, &res) + if err != nil { + return &res, err + } + + return &res, nil +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/create_ssl.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/create_ssl.go new file mode 100644 index 0000000000..c95d2eb10b --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/create_ssl.go @@ -0,0 +1,65 @@ +//Code is generated by ucloud code generator, don't modify it by hand, it will cause undefined behaviors. +//go:generate ucloud-gen-go-api ULB CreateSSL + +package ulb + +import ( + "github.com/ucloud/ucloud-sdk-go/ucloud/request" + "github.com/ucloud/ucloud-sdk-go/ucloud/response" +) + +// CreateSSLRequest is request schema for CreateSSL action +type CreateSSLRequest struct { + request.CommonBase + + // SSL证书的名字,默认值为空 + SSLName *string `required:"true"` + + // 所添加的SSL证书类型,目前只支持Pem格式 + SSLType *string `required:"false"` + + // SSL证书的完整内容,包括用户证书、加密证书的私钥、CA证书 + SSLContent *string `required:"false"` + + // 用户的证书 + UserCert *string `required:"false"` + + // 加密证书的私钥 + PrivateKey *string `required:"false"` + + // CA证书 + CaCert *string `required:"false"` +} + +// CreateSSLResponse is response schema for CreateSSL action +type CreateSSLResponse struct { + response.CommonBase + + // SSL证书的Id + SSLId string +} + +// NewCreateSSLRequest will create request of CreateSSL action. +func (c *ULBClient) NewCreateSSLRequest() *CreateSSLRequest { + req := &CreateSSLRequest{} + + // setup request with client config + c.client.SetupRequest(req) + + // setup retryable with default retry policy (retry for non-create action and common error) + req.SetRetryable(false) + return req +} + +// CreateSSL - 创建SSL证书,可以把整个 Pem 证书内容传过来,或者把证书、私钥、CA证书分别传过来 +func (c *ULBClient) CreateSSL(req *CreateSSLRequest) (*CreateSSLResponse, error) { + var err error + var res CreateSSLResponse + + err = c.client.InvokeAction("CreateSSL", req, &res) + if err != nil { + return &res, err + } + + return &res, nil +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/create_ulb.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/create_ulb.go new file mode 100644 index 0000000000..5c41030b97 --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/create_ulb.go @@ -0,0 +1,74 @@ +//Code is generated by ucloud code generator, don't modify it by hand, it will cause undefined behaviors. +//go:generate ucloud-gen-go-api ULB CreateULB + +package ulb + +import ( + "github.com/ucloud/ucloud-sdk-go/ucloud/request" + "github.com/ucloud/ucloud-sdk-go/ucloud/response" +) + +// CreateULBRequest is request schema for CreateULB action +type CreateULBRequest struct { + request.CommonBase + + // 负载均衡的名字,默认值为“ULB” + ULBName *string `required:"false"` + + // 业务组 + Tag *string `required:"false"` + + // 备注 + Remark *string `required:"false"` + + // 创建的ULB是否为外网模式,默认即为外网模式 + OuterMode *string `required:"false"` + + // 创建的ULB是否为内网模式 + InnerMode *string `required:"false"` + + // 付费方式 + ChargeType *string `required:"false"` + + // ULB所在的VPC的ID, 如果不传则使用默认的VPC + VPCId *string `required:"false"` + + // 内网ULB 所属的子网ID,如果不传则使用默认的子网 + SubnetId *string `required:"false"` + + // ULB 所属的业务组ID,如果不传则使用默认的业务组 + BusinessId *string `required:"false"` +} + +// CreateULBResponse is response schema for CreateULB action +type CreateULBResponse struct { + response.CommonBase + + // 负载均衡实例的Id + ULBId string +} + +// NewCreateULBRequest will create request of CreateULB action. +func (c *ULBClient) NewCreateULBRequest() *CreateULBRequest { + req := &CreateULBRequest{} + + // setup request with client config + c.client.SetupRequest(req) + + // setup retryable with default retry policy (retry for non-create action and common error) + req.SetRetryable(false) + return req +} + +// CreateULB - 创建负载均衡实例,可以选择内网或者外网 +func (c *ULBClient) CreateULB(req *CreateULBRequest) (*CreateULBResponse, error) { + var err error + var res CreateULBResponse + + err = c.client.InvokeAction("CreateULB", req, &res) + if err != nil { + return &res, err + } + + return &res, nil +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/create_vserver.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/create_vserver.go new file mode 100644 index 0000000000..e75dbef127 --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/create_vserver.go @@ -0,0 +1,83 @@ +//Code is generated by ucloud code generator, don't modify it by hand, it will cause undefined behaviors. +//go:generate ucloud-gen-go-api ULB CreateVServer + +package ulb + +import ( + "github.com/ucloud/ucloud-sdk-go/ucloud/request" + "github.com/ucloud/ucloud-sdk-go/ucloud/response" +) + +// CreateVServerRequest is request schema for CreateVServer action +type CreateVServerRequest struct { + request.CommonBase + + // 负载均衡实例ID + ULBId *string `required:"true"` + + // VServer实例名称,默认为"VServer" + VServerName *string `required:"false"` + + // 监听器类型,枚举值为:RequestProxy -> 请求代理;PacketsTransmit -> 报文转发;默认为"RequestProxy" + ListenType *string `required:"false"` + + // VServer实例的协议,请求代理模式下有 HTTP、HTTPS、TCP,报文转发下有 TCP,UDP。默认为“HTTP" + Protocol *string `required:"false"` + + // VServer后端端口,取值范围[1-65535];默认值为80 + FrontendPort *int `required:"false"` + + // VServer负载均衡模式,枚举值:Roundrobin -> 轮询;Source -> 源地址;ConsistentHash -> 一致性哈希;SourcePort -> 源地址(计算端口);ConsistentHashPort -> 一致性哈希(计算端口)。ConsistentHash,SourcePort,ConsistentHashPort 只在报文转发中使用;Roundrobin和Source在请求代理和报文转发中使用。默认为:"Roundrobin" + Method *string `required:"false"` + + // VServer会话保持方式,默认关闭会话保持。枚举值:None -> 关闭;ServerInsert -> 自动生成KEY;UserDefined -> 用户自定义KEY。 + PersistenceType *string `required:"false"` + + // 根据PersistenceType确认; None和ServerInsert: 此字段无意义; UserDefined:此字段传入自定义会话保持String + PersistenceInfo *string `required:"false"` + + // ListenType为RequestProxy时表示空闲连接的回收时间,单位:秒,取值范围:时(0,86400],默认值为60;ListenType为PacketsTransmit时表示连接保持的时间,单位:秒,取值范围:[60,900],0 表示禁用连接保持 + ClientTimeout *int `required:"false"` + + // 健康检查类型,枚举值:Port -> 端口检查;Path -> 路径检查; + MonitorType *string `required:"false"` + + // 根据MonitorType确认; 当MonitorType为Port时,此字段无意义。当MonitorType为Path时,代表HTTP检查路径 + Domain *string `required:"false"` + + // 根据MonitorType确认; 当MonitorType为Port时,此字段无意义。当MonitorType为Path时,代表HTTP检查域名 + Path *string `required:"false"` +} + +// CreateVServerResponse is response schema for CreateVServer action +type CreateVServerResponse struct { + response.CommonBase + + // VServer实例的Id + VServerId string +} + +// NewCreateVServerRequest will create request of CreateVServer action. +func (c *ULBClient) NewCreateVServerRequest() *CreateVServerRequest { + req := &CreateVServerRequest{} + + // setup request with client config + c.client.SetupRequest(req) + + // setup retryable with default retry policy (retry for non-create action and common error) + req.SetRetryable(false) + return req +} + +// CreateVServer - 创建VServer实例,定义监听的协议和端口以及负载均衡算法 +func (c *ULBClient) CreateVServer(req *CreateVServerRequest) (*CreateVServerResponse, error) { + var err error + var res CreateVServerResponse + + err = c.client.InvokeAction("CreateVServer", req, &res) + if err != nil { + return &res, err + } + + return &res, nil +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/delete_policy.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/delete_policy.go new file mode 100644 index 0000000000..fd0ed2f9d0 --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/delete_policy.go @@ -0,0 +1,53 @@ +//Code is generated by ucloud code generator, don't modify it by hand, it will cause undefined behaviors. +//go:generate ucloud-gen-go-api ULB DeletePolicy + +package ulb + +import ( + "github.com/ucloud/ucloud-sdk-go/ucloud/request" + "github.com/ucloud/ucloud-sdk-go/ucloud/response" +) + +// DeletePolicyRequest is request schema for DeletePolicy action +type DeletePolicyRequest struct { + request.CommonBase + + // 内容转发策略ID + PolicyId *string `required:"true"` + + // 内容转发策略组ID + GroupId *string `required:"false"` + + // VServer 资源ID + VServerId *string `required:"false"` +} + +// DeletePolicyResponse is response schema for DeletePolicy action +type DeletePolicyResponse struct { + response.CommonBase +} + +// NewDeletePolicyRequest will create request of DeletePolicy action. +func (c *ULBClient) NewDeletePolicyRequest() *DeletePolicyRequest { + req := &DeletePolicyRequest{} + + // setup request with client config + c.client.SetupRequest(req) + + // setup retryable with default retry policy (retry for non-create action and common error) + req.SetRetryable(true) + return req +} + +// DeletePolicy - 删除内容转发策略 +func (c *ULBClient) DeletePolicy(req *DeletePolicyRequest) (*DeletePolicyResponse, error) { + var err error + var res DeletePolicyResponse + + err = c.client.InvokeAction("DeletePolicy", req, &res) + if err != nil { + return &res, err + } + + return &res, nil +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/delete_ssl.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/delete_ssl.go new file mode 100644 index 0000000000..2488577293 --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/delete_ssl.go @@ -0,0 +1,47 @@ +//Code is generated by ucloud code generator, don't modify it by hand, it will cause undefined behaviors. +//go:generate ucloud-gen-go-api ULB DeleteSSL + +package ulb + +import ( + "github.com/ucloud/ucloud-sdk-go/ucloud/request" + "github.com/ucloud/ucloud-sdk-go/ucloud/response" +) + +// DeleteSSLRequest is request schema for DeleteSSL action +type DeleteSSLRequest struct { + request.CommonBase + + // SSL证书的ID + SSLId *string `required:"true"` +} + +// DeleteSSLResponse is response schema for DeleteSSL action +type DeleteSSLResponse struct { + response.CommonBase +} + +// NewDeleteSSLRequest will create request of DeleteSSL action. +func (c *ULBClient) NewDeleteSSLRequest() *DeleteSSLRequest { + req := &DeleteSSLRequest{} + + // setup request with client config + c.client.SetupRequest(req) + + // setup retryable with default retry policy (retry for non-create action and common error) + req.SetRetryable(true) + return req +} + +// DeleteSSL - 删除SSL证书 +func (c *ULBClient) DeleteSSL(req *DeleteSSLRequest) (*DeleteSSLResponse, error) { + var err error + var res DeleteSSLResponse + + err = c.client.InvokeAction("DeleteSSL", req, &res) + if err != nil { + return &res, err + } + + return &res, nil +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/delete_ulb.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/delete_ulb.go new file mode 100644 index 0000000000..da7ac6d7c4 --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/delete_ulb.go @@ -0,0 +1,50 @@ +//Code is generated by ucloud code generator, don't modify it by hand, it will cause undefined behaviors. +//go:generate ucloud-gen-go-api ULB DeleteULB + +package ulb + +import ( + "github.com/ucloud/ucloud-sdk-go/ucloud/request" + "github.com/ucloud/ucloud-sdk-go/ucloud/response" +) + +// DeleteULBRequest is request schema for DeleteULB action +type DeleteULBRequest struct { + request.CommonBase + + // 负载均衡实例的ID + ULBId *string `required:"true"` + + // 删除ulb时是否释放绑定的EIP,false标识只解绑EIP,true表示会释放绑定的EIP,默认是false + ReleaseEip *bool `required:"false"` +} + +// DeleteULBResponse is response schema for DeleteULB action +type DeleteULBResponse struct { + response.CommonBase +} + +// NewDeleteULBRequest will create request of DeleteULB action. +func (c *ULBClient) NewDeleteULBRequest() *DeleteULBRequest { + req := &DeleteULBRequest{} + + // setup request with client config + c.client.SetupRequest(req) + + // setup retryable with default retry policy (retry for non-create action and common error) + req.SetRetryable(true) + return req +} + +// DeleteULB - 删除负载均衡实例 +func (c *ULBClient) DeleteULB(req *DeleteULBRequest) (*DeleteULBResponse, error) { + var err error + var res DeleteULBResponse + + err = c.client.InvokeAction("DeleteULB", req, &res) + if err != nil { + return &res, err + } + + return &res, nil +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/delete_vserver.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/delete_vserver.go new file mode 100644 index 0000000000..3456788241 --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/delete_vserver.go @@ -0,0 +1,50 @@ +//Code is generated by ucloud code generator, don't modify it by hand, it will cause undefined behaviors. +//go:generate ucloud-gen-go-api ULB DeleteVServer + +package ulb + +import ( + "github.com/ucloud/ucloud-sdk-go/ucloud/request" + "github.com/ucloud/ucloud-sdk-go/ucloud/response" +) + +// DeleteVServerRequest is request schema for DeleteVServer action +type DeleteVServerRequest struct { + request.CommonBase + + // 负载均衡实例的ID + ULBId *string `required:"true"` + + // VServer实例的ID + VServerId *string `required:"true"` +} + +// DeleteVServerResponse is response schema for DeleteVServer action +type DeleteVServerResponse struct { + response.CommonBase +} + +// NewDeleteVServerRequest will create request of DeleteVServer action. +func (c *ULBClient) NewDeleteVServerRequest() *DeleteVServerRequest { + req := &DeleteVServerRequest{} + + // setup request with client config + c.client.SetupRequest(req) + + // setup retryable with default retry policy (retry for non-create action and common error) + req.SetRetryable(true) + return req +} + +// DeleteVServer - 删除VServer实例 +func (c *ULBClient) DeleteVServer(req *DeleteVServerRequest) (*DeleteVServerResponse, error) { + var err error + var res DeleteVServerResponse + + err = c.client.InvokeAction("DeleteVServer", req, &res) + if err != nil { + return &res, err + } + + return &res, nil +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/describe_ssl.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/describe_ssl.go new file mode 100644 index 0000000000..168060459c --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/describe_ssl.go @@ -0,0 +1,59 @@ +//Code is generated by ucloud code generator, don't modify it by hand, it will cause undefined behaviors. +//go:generate ucloud-gen-go-api ULB DescribeSSL + +package ulb + +import ( + "github.com/ucloud/ucloud-sdk-go/ucloud/request" + "github.com/ucloud/ucloud-sdk-go/ucloud/response" +) + +// DescribeSSLRequest is request schema for DescribeSSL action +type DescribeSSLRequest struct { + request.CommonBase + + // SSL证书的Id + SSLId *string `required:"false"` + + // 数据分页值,默认为20 + Limit *int `required:"false"` + + // 数据偏移量,默认值为0 + Offset *int `required:"false"` +} + +// DescribeSSLResponse is response schema for DescribeSSL action +type DescribeSSLResponse struct { + response.CommonBase + + // 满足条件的SSL证书总数 + TotalCount int + + // SSL证书详细信息,具体结构见 ULBSSLSet + DataSet []ULBSSLSet +} + +// NewDescribeSSLRequest will create request of DescribeSSL action. +func (c *ULBClient) NewDescribeSSLRequest() *DescribeSSLRequest { + req := &DescribeSSLRequest{} + + // setup request with client config + c.client.SetupRequest(req) + + // setup retryable with default retry policy (retry for non-create action and common error) + req.SetRetryable(true) + return req +} + +// DescribeSSL - 获取SSL证书信息 +func (c *ULBClient) DescribeSSL(req *DescribeSSLRequest) (*DescribeSSLResponse, error) { + var err error + var res DescribeSSLResponse + + err = c.client.InvokeAction("DescribeSSL", req, &res) + if err != nil { + return &res, err + } + + return &res, nil +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/describe_ulb.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/describe_ulb.go new file mode 100644 index 0000000000..e12372006d --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/describe_ulb.go @@ -0,0 +1,68 @@ +//Code is generated by ucloud code generator, don't modify it by hand, it will cause undefined behaviors. +//go:generate ucloud-gen-go-api ULB DescribeULB + +package ulb + +import ( + "github.com/ucloud/ucloud-sdk-go/ucloud/request" + "github.com/ucloud/ucloud-sdk-go/ucloud/response" +) + +// DescribeULBRequest is request schema for DescribeULB action +type DescribeULBRequest struct { + request.CommonBase + + // 数据偏移量,默认为0 + Offset *int `required:"false"` + + // 数据分页值,默认为20 + Limit *int `required:"false"` + + // 负载均衡实例的Id。 若指定则返回指定的负载均衡实例的信息; 若不指定则返回当前数据中心中所有的负载均衡实例的信息 + ULBId *string `required:"false"` + + // ULB所属的VPC + VPCId *string `required:"false"` + + // ULB所属的子网ID + SubnetId *string `required:"false"` + + // ULB所属的业务组ID + BusinessId *string `required:"false"` +} + +// DescribeULBResponse is response schema for DescribeULB action +type DescribeULBResponse struct { + response.CommonBase + + // 满足条件的ULB总数 + TotalCount int + + // ULB列表,每项参数详见 ULBSet + DataSet []ULBSet +} + +// NewDescribeULBRequest will create request of DescribeULB action. +func (c *ULBClient) NewDescribeULBRequest() *DescribeULBRequest { + req := &DescribeULBRequest{} + + // setup request with client config + c.client.SetupRequest(req) + + // setup retryable with default retry policy (retry for non-create action and common error) + req.SetRetryable(true) + return req +} + +// DescribeULB - 获取ULB详细信息 +func (c *ULBClient) DescribeULB(req *DescribeULBRequest) (*DescribeULBResponse, error) { + var err error + var res DescribeULBResponse + + err = c.client.InvokeAction("DescribeULB", req, &res) + if err != nil { + return &res, err + } + + return &res, nil +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/describe_vserver.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/describe_vserver.go new file mode 100644 index 0000000000..9ac69bc6cd --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/describe_vserver.go @@ -0,0 +1,62 @@ +//Code is generated by ucloud code generator, don't modify it by hand, it will cause undefined behaviors. +//go:generate ucloud-gen-go-api ULB DescribeVServer + +package ulb + +import ( + "github.com/ucloud/ucloud-sdk-go/ucloud/request" + "github.com/ucloud/ucloud-sdk-go/ucloud/response" +) + +// DescribeVServerRequest is request schema for DescribeVServer action +type DescribeVServerRequest struct { + request.CommonBase + + // 负载均衡实例的Id + ULBId *string `required:"true"` + + // VServer实例的Id;若指定则返回指定的VServer实例的信息; 若不指定则返回当前负载均衡实例下所有VServer的信息 + VServerId *string `required:"false"` + + // 数据分页值 + Limit *string `required:"false"` + + // 数据偏移量 + Offset *string `required:"false"` +} + +// DescribeVServerResponse is response schema for DescribeVServer action +type DescribeVServerResponse struct { + response.CommonBase + + // 满足条件的VServer总数 + TotalCount int + + // VServer列表,每项参数详见 ULBVServerSet + DataSet []ULBVServerSet +} + +// NewDescribeVServerRequest will create request of DescribeVServer action. +func (c *ULBClient) NewDescribeVServerRequest() *DescribeVServerRequest { + req := &DescribeVServerRequest{} + + // setup request with client config + c.client.SetupRequest(req) + + // setup retryable with default retry policy (retry for non-create action and common error) + req.SetRetryable(true) + return req +} + +// DescribeVServer - 获取ULB下的VServer的详细信息 +func (c *ULBClient) DescribeVServer(req *DescribeVServerRequest) (*DescribeVServerResponse, error) { + var err error + var res DescribeVServerResponse + + err = c.client.InvokeAction("DescribeVServer", req, &res) + if err != nil { + return &res, err + } + + return &res, nil +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/doc.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/doc.go new file mode 100644 index 0000000000..c679dcbacf --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/doc.go @@ -0,0 +1,11 @@ +/* +Package ulb include resources of ucloud ulb product + +See also + + - API: https://docs.ucloud.cn/api/ulb-api/index + - Product: https://www.ucloud.cn/site/product/ulb.html + +for detail. +*/ +package ulb diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/release_backend.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/release_backend.go new file mode 100644 index 0000000000..91fae690b6 --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/release_backend.go @@ -0,0 +1,50 @@ +//Code is generated by ucloud code generator, don't modify it by hand, it will cause undefined behaviors. +//go:generate ucloud-gen-go-api ULB ReleaseBackend + +package ulb + +import ( + "github.com/ucloud/ucloud-sdk-go/ucloud/request" + "github.com/ucloud/ucloud-sdk-go/ucloud/response" +) + +// ReleaseBackendRequest is request schema for ReleaseBackend action +type ReleaseBackendRequest struct { + request.CommonBase + + // 负载均衡实例的ID + ULBId *string `required:"true"` + + // 后端资源实例的ID(ULB后端ID,非资源自身ID) + BackendId *string `required:"true"` +} + +// ReleaseBackendResponse is response schema for ReleaseBackend action +type ReleaseBackendResponse struct { + response.CommonBase +} + +// NewReleaseBackendRequest will create request of ReleaseBackend action. +func (c *ULBClient) NewReleaseBackendRequest() *ReleaseBackendRequest { + req := &ReleaseBackendRequest{} + + // setup request with client config + c.client.SetupRequest(req) + + // setup retryable with default retry policy (retry for non-create action and common error) + req.SetRetryable(true) + return req +} + +// ReleaseBackend - 从VServer释放后端资源实例 +func (c *ULBClient) ReleaseBackend(req *ReleaseBackendRequest) (*ReleaseBackendResponse, error) { + var err error + var res ReleaseBackendResponse + + err = c.client.InvokeAction("ReleaseBackend", req, &res) + if err != nil { + return &res, err + } + + return &res, nil +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_backend_set.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_backend_set.go new file mode 100644 index 0000000000..9f61259838 --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_backend_set.go @@ -0,0 +1,16 @@ +package ulb + +/* +BackendSet - ulb添加rs时返回的信息 + +this model is auto created by ucloud code generater for open api, +you can also see https://docs.ucloud.cn for detail. +*/ +type BackendSet struct { + + // rs的资源ID + BackendId string + + // rs对应的UHost ID + ResourceId string +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_policy_backend_set.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_policy_backend_set.go new file mode 100644 index 0000000000..f8f0cbd73e --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_policy_backend_set.go @@ -0,0 +1,25 @@ +package ulb + +/* +PolicyBackendSet - 内容转发下rs详细信息 + +this model is auto created by ucloud code generater for open api, +you can also see https://docs.ucloud.cn for detail. +*/ +type PolicyBackendSet struct { + + // 所添加的后端资源在ULB中的对象ID,(为ULB系统中使用,与资源自身ID无关 + BackendId string + + // 后端资源的对象ID + ObjectId string + + // 所添加的后端资源服务端口 + Port int + + // 后端资源的内网IP + PrivateIP string + + // 后端资源的实例名称 + ResourceName string +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_sslbinded_target_set.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_sslbinded_target_set.go new file mode 100644 index 0000000000..f36d406ca0 --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_sslbinded_target_set.go @@ -0,0 +1,22 @@ +package ulb + +/* +SSLBindedTargetSet - DescribeSSL + +this model is auto created by ucloud code generater for open api, +you can also see https://docs.ucloud.cn for detail. +*/ +type SSLBindedTargetSet struct { + + // SSL证书绑定到的VServer的资源ID + VServerId string + + // 对应的VServer的名字 + VServerName string + + // VServer 所属的ULB实例的资源ID + ULBId string + + // ULB实例的名称 + ULBName string +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_ulbbackend_set.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_ulbbackend_set.go new file mode 100644 index 0000000000..e35fe60bf7 --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_ulbbackend_set.go @@ -0,0 +1,38 @@ +package ulb + +/* +ULBBackendSet - DescribeULB + +this model is auto created by ucloud code generater for open api, +you can also see https://docs.ucloud.cn for detail. +*/ +type ULBBackendSet struct { + + // 后端资源实例的Id + BackendId string + + // 后端资源实例的类型 + ResourceType string + + // 后端资源实例的资源Id + ResourceId string + + // 后端资源实例的资源名字 + ResourceName string + + // 后端资源实例的内网IP + PrivateIP string + + // 后端资源实例服务的端口 + Port int + + // 后端资源实例的启用与否 + Enabled int + + // 后端资源实例的运行状态 + Status int + + // 后端资源实例的资源所在的子网的ID + SubnetId string + Weight int +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_ulbipset.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_ulbipset.go new file mode 100644 index 0000000000..5c5126f4f1 --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_ulbipset.go @@ -0,0 +1,19 @@ +package ulb + +/* +ULBIPSet - DescribeULB + +this model is auto created by ucloud code generater for open api, +you can also see https://docs.ucloud.cn for detail. +*/ +type ULBIPSet struct { + + // 弹性IP的运营商信息,枚举值为: Bgp:BGP IP International:国际IP + OperatorName string + + // 弹性IP地址 + EIP string + + // 弹性IP的ID + EIPId string +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_ulbpolicy_set.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_ulbpolicy_set.go new file mode 100644 index 0000000000..0f4bc4584e --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_ulbpolicy_set.go @@ -0,0 +1,34 @@ +package ulb + +/* +ULBPolicySet - 内容转发详细列表 + +this model is auto created by ucloud code generater for open api, +you can also see https://docs.ucloud.cn for detail. +*/ +type ULBPolicySet struct { + + // 内容转发Id,默认内容转发类型下为空。 + PolicyId string + + // 内容类型,枚举值:Custom -> 客户自定义;Default -> 默认内容转发 + PolicyType string + + // 内容转发匹配字段的类型,枚举值:Domain -> 域名;Path -> 路径; 默认内容转发类型下为空 + Type string + + // 内容转发匹配字段;默认内容转发类型下为空。 + Match string + + // 内容转发优先级,范围[1,9999],数字越大优先级越高。默认内容转发规则下为0。 + PolicyPriority int + + // 所属VServerId + VServerId string + + // 默认内容转发类型下返回当前rs总数 + TotalCount int + + // 内容转发下rs的详细信息,参考PolicyBackendSet + BackendSet []PolicyBackendSet +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_ulbset.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_ulbset.go new file mode 100644 index 0000000000..b2dd521c9f --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_ulbset.go @@ -0,0 +1,61 @@ +package ulb + +/* +ULBSet - DescribeULB + +this model is auto created by ucloud code generater for open api, +you can also see https://docs.ucloud.cn for detail. +*/ +type ULBSet struct { + + // 负载均衡的资源ID + ULBId string + + // 负载均衡的资源名称(内部记载,废弃) + ULBName string + + // 负载均衡的资源名称(资源系统中),缺省值“ULB” + Name string + + // 负载均衡的业务组名称,缺省值“Default” + Tag string + + // 负载均衡的备注,缺省值“” + Remark string + + // 带宽类型,枚举值为: 0,非共享带宽; 1,共享带宽 + BandwidthType int + + // 带宽 + Bandwidth int + + // ULB的创建时间,格式为Unix Timestamp + CreateTime int + + // ULB的到期时间,格式为Unix Timestamp + ExpireTime int + + // ULB的详细信息列表(废弃) + Resource []string + + // ULB的详细信息列表,具体结构见下方 ULBIPSet + IPSet []ULBIPSet + + // 负载均衡实例中存在的VServer实例列表,具体结构见下方 ULBVServerSet + VServerSet []ULBVServerSet + + // ULB 的类型 + ULBType string + + // ULB所在的VPC的ID + VPCId string + + // ULB 为 InnerMode 时,ULB 所属的子网ID,默认为空 + SubnetId string + + // ULB 所属的业务组ID + BusinessId string + + // ULB的内网IP,当ULBType为OuterMode时,该值为空 + PrivateIP string +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_ulbsslset.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_ulbsslset.go new file mode 100644 index 0000000000..66b3b542f5 --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_ulbsslset.go @@ -0,0 +1,31 @@ +package ulb + +/* +ULBSSLSet - DescribeSSL + +this model is auto created by ucloud code generater for open api, +you can also see https://docs.ucloud.cn for detail. +*/ +type ULBSSLSet struct { + + // SSL证书的Id + SSLId string + + // SSL证书的名字 + SSLName string + + // SSL证书类型,暂时只有 Pem 一种类型 + SSLType string + + // SSL证书的内容 + SSLContent string + + // SSL证书的创建时间 + CreateTime int + + // SSL证书绑定到的对象 + BindedTargetSet []SSLBindedTargetSet + + // 证书的 Hash 值 + HashValue string +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_ulbvserver_set.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_ulbvserver_set.go new file mode 100644 index 0000000000..1f7f0dc55b --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/types_ulbvserver_set.go @@ -0,0 +1,58 @@ +package ulb + +/* +ULBVServerSet - DescribeULB + +this model is auto created by ucloud code generater for open api, +you can also see https://docs.ucloud.cn for detail. +*/ +type ULBVServerSet struct { + + // 健康检查类型,枚举值:Port -> 端口检查;Path -> 路径检查; + MonitorType string + + // 根据MonitorType确认; 当MonitorType为Port时,此字段无意义。当MonitorType为Path时,代表HTTP检查路径 + Domain string + + // 根据MonitorType确认; 当MonitorType为Port时,此字段无意义。当MonitorType为Path时,代表HTTP检查域名 + Path string + + // VServer实例的Id + VServerId string + + // VServer实例的名字 + VServerName string + + // VServer实例的协议。 枚举值为:HTTP,TCP,UDP,HTTPS。 + Protocol string + + // VServer服务端口 + FrontendPort int + + // VServer负载均衡的模式,枚举值:Roundrobin -> 轮询;Source -> 源地址;ConsistentHash -> 一致性哈希;SourcePort -> 源地址(计算端口);ConsistentHashPort -> 一致性哈希(计算端口)。 + Method string + + // VServer会话保持方式。枚举值为: None -> 关闭会话保持; ServerInsert -> 自动生成; UserDefined -> 用户自定义。 + PersistenceType string + + // 根据PersistenceType确定: None或ServerInsert,此字段为空; UserDefined,此字段展示用户自定义会话string。 + PersistenceInfo string + + // 空闲连接的回收时间,单位:秒。 + ClientTimeout int + + // VServer的运行状态。枚举值: 0 -> rs全部运行正常;1 -> rs部分运行正常;2 -> rs全部运行异常。 + Status int + + // VServer绑定的SSL证书信息,具体结构见下方 ULBSSLSet + SSLSet []ULBSSLSet + + // 后端资源信息列表,具体结构见下方 ULBBackendSet + BackendSet []ULBBackendSet + + // 监听器类型,枚举值为: RequestProxy -> 请求代理;PacketsTransmit -> 报文转发 + ListenType string + + // 内容转发信息列表,具体结构见下方 ULBPolicySet + PolicySet []ULBPolicySet +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/unbind_ssl.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/unbind_ssl.go new file mode 100644 index 0000000000..4be85058ba --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/unbind_ssl.go @@ -0,0 +1,53 @@ +//Code is generated by ucloud code generator, don't modify it by hand, it will cause undefined behaviors. +//go:generate ucloud-gen-go-api ULB UnbindSSL + +package ulb + +import ( + "github.com/ucloud/ucloud-sdk-go/ucloud/request" + "github.com/ucloud/ucloud-sdk-go/ucloud/response" +) + +// UnbindSSLRequest is request schema for UnbindSSL action +type UnbindSSLRequest struct { + request.CommonBase + + // 所绑定ULB实例ID + ULBId *string `required:"true"` + + // 所绑定VServer实例ID + VServerId *string `required:"true"` + + // SSL证书的Id + SSLId *string `required:"true"` +} + +// UnbindSSLResponse is response schema for UnbindSSL action +type UnbindSSLResponse struct { + response.CommonBase +} + +// NewUnbindSSLRequest will create request of UnbindSSL action. +func (c *ULBClient) NewUnbindSSLRequest() *UnbindSSLRequest { + req := &UnbindSSLRequest{} + + // setup request with client config + c.client.SetupRequest(req) + + // setup retryable with default retry policy (retry for non-create action and common error) + req.SetRetryable(true) + return req +} + +// UnbindSSL - 从VServer解绑SSL证书 +func (c *ULBClient) UnbindSSL(req *UnbindSSLRequest) (*UnbindSSLResponse, error) { + var err error + var res UnbindSSLResponse + + err = c.client.InvokeAction("UnbindSSL", req, &res) + if err != nil { + return &res, err + } + + return &res, nil +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/update_backend_attribute.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/update_backend_attribute.go new file mode 100644 index 0000000000..29ffb8dc18 --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/update_backend_attribute.go @@ -0,0 +1,56 @@ +//Code is generated by ucloud code generator, don't modify it by hand, it will cause undefined behaviors. +//go:generate ucloud-gen-go-api ULB UpdateBackendAttribute + +package ulb + +import ( + "github.com/ucloud/ucloud-sdk-go/ucloud/request" + "github.com/ucloud/ucloud-sdk-go/ucloud/response" +) + +// UpdateBackendAttributeRequest is request schema for UpdateBackendAttribute action +type UpdateBackendAttributeRequest struct { + request.CommonBase + + // 负载均衡资源ID + ULBId *string `required:"true"` + + // 后端资源实例的ID(ULB后端ID,非资源自身ID) + BackendId *string `required:"true"` + + // 后端资源服务端口,取值范围[1-65535] + Port *int `required:"false"` + + // 后端实例状态开关 + Enabled *int `required:"false"` +} + +// UpdateBackendAttributeResponse is response schema for UpdateBackendAttribute action +type UpdateBackendAttributeResponse struct { + response.CommonBase +} + +// NewUpdateBackendAttributeRequest will create request of UpdateBackendAttribute action. +func (c *ULBClient) NewUpdateBackendAttributeRequest() *UpdateBackendAttributeRequest { + req := &UpdateBackendAttributeRequest{} + + // setup request with client config + c.client.SetupRequest(req) + + // setup retryable with default retry policy (retry for non-create action and common error) + req.SetRetryable(true) + return req +} + +// UpdateBackendAttribute - 更新ULB后端资源实例(服务节点)属性 +func (c *ULBClient) UpdateBackendAttribute(req *UpdateBackendAttributeRequest) (*UpdateBackendAttributeResponse, error) { + var err error + var res UpdateBackendAttributeResponse + + err = c.client.InvokeAction("UpdateBackendAttribute", req, &res) + if err != nil { + return &res, err + } + + return &res, nil +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/update_policy.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/update_policy.go new file mode 100644 index 0000000000..6b34c7b85b --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/update_policy.go @@ -0,0 +1,65 @@ +//Code is generated by ucloud code generator, don't modify it by hand, it will cause undefined behaviors. +//go:generate ucloud-gen-go-api ULB UpdatePolicy + +package ulb + +import ( + "github.com/ucloud/ucloud-sdk-go/ucloud/request" + "github.com/ucloud/ucloud-sdk-go/ucloud/response" +) + +// UpdatePolicyRequest is request schema for UpdatePolicy action +type UpdatePolicyRequest struct { + request.CommonBase + + // 需要添加内容转发策略的负载均衡实例ID + ULBId *string `required:"true"` + + // 需要添加内容转发策略的VServer实例ID + VServerId *string `required:"true"` + + // 转发规则的ID + PolicyId *string `required:"true"` + + // 内容转发策略应用的后端资源实例的ID,来源于 AllocateBackend 返回的 BackendId + BackendId []string `required:"true"` + + // 内容转发匹配字段 + Match *string `required:"true"` + + // 内容转发匹配字段的类型 + Type *string `required:"false"` +} + +// UpdatePolicyResponse is response schema for UpdatePolicy action +type UpdatePolicyResponse struct { + response.CommonBase + + // 转发规则的ID + PolicyId string +} + +// NewUpdatePolicyRequest will create request of UpdatePolicy action. +func (c *ULBClient) NewUpdatePolicyRequest() *UpdatePolicyRequest { + req := &UpdatePolicyRequest{} + + // setup request with client config + c.client.SetupRequest(req) + + // setup retryable with default retry policy (retry for non-create action and common error) + req.SetRetryable(true) + return req +} + +// UpdatePolicy - 更新内容转发规则,包括转发规则后的服务节点 +func (c *ULBClient) UpdatePolicy(req *UpdatePolicyRequest) (*UpdatePolicyResponse, error) { + var err error + var res UpdatePolicyResponse + + err = c.client.InvokeAction("UpdatePolicy", req, &res) + if err != nil { + return &res, err + } + + return &res, nil +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/update_ulbattribute.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/update_ulbattribute.go new file mode 100644 index 0000000000..1af3bbfa34 --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/update_ulbattribute.go @@ -0,0 +1,56 @@ +//Code is generated by ucloud code generator, don't modify it by hand, it will cause undefined behaviors. +//go:generate ucloud-gen-go-api ULB UpdateULBAttribute + +package ulb + +import ( + "github.com/ucloud/ucloud-sdk-go/ucloud/request" + "github.com/ucloud/ucloud-sdk-go/ucloud/response" +) + +// UpdateULBAttributeRequest is request schema for UpdateULBAttribute action +type UpdateULBAttributeRequest struct { + request.CommonBase + + // ULB资源ID + ULBId *string `required:"true"` + + // 名字 + Name *string `required:"false"` + + // 业务 + Tag *string `required:"false"` + + // 备注 + Remark *string `required:"false"` +} + +// UpdateULBAttributeResponse is response schema for UpdateULBAttribute action +type UpdateULBAttributeResponse struct { + response.CommonBase +} + +// NewUpdateULBAttributeRequest will create request of UpdateULBAttribute action. +func (c *ULBClient) NewUpdateULBAttributeRequest() *UpdateULBAttributeRequest { + req := &UpdateULBAttributeRequest{} + + // setup request with client config + c.client.SetupRequest(req) + + // setup retryable with default retry policy (retry for non-create action and common error) + req.SetRetryable(true) + return req +} + +// UpdateULBAttribute - 更新ULB名字业务组备注等属性字段 +func (c *ULBClient) UpdateULBAttribute(req *UpdateULBAttributeRequest) (*UpdateULBAttributeResponse, error) { + var err error + var res UpdateULBAttributeResponse + + err = c.client.InvokeAction("UpdateULBAttribute", req, &res) + if err != nil { + return &res, err + } + + return &res, nil +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/update_vserver_attribute.go b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/update_vserver_attribute.go new file mode 100644 index 0000000000..a1120bf13f --- /dev/null +++ b/vendor/github.com/ucloud/ucloud-sdk-go/services/ulb/update_vserver_attribute.go @@ -0,0 +1,77 @@ +//Code is generated by ucloud code generator, don't modify it by hand, it will cause undefined behaviors. +//go:generate ucloud-gen-go-api ULB UpdateVServerAttribute + +package ulb + +import ( + "github.com/ucloud/ucloud-sdk-go/ucloud/request" + "github.com/ucloud/ucloud-sdk-go/ucloud/response" +) + +// UpdateVServerAttributeRequest is request schema for UpdateVServerAttribute action +type UpdateVServerAttributeRequest struct { + request.CommonBase + + // 负载均衡实例ID + ULBId *string `required:"true"` + + // VServer实例ID + VServerId *string `required:"true"` + + // VServer实例名称,若无此字段则不做修改 + VServerName *string `required:"false"` + + // VServer协议类型,请求代理只支持修改为 HTTP/HTTPS,报文转发VServer只支持修改为 TCP/UDP + Protocol *string `required:"false"` + + // VServer负载均衡算法,ConsistentHash,SourcePort,ConsistentHashPort 只在报文转发中使用;Roundrobin和Source在请求代理和报文转发中使用。 + Method *string `required:"false"` + + // VServer会话保持模式,若无此字段则不做修改。枚举值:None:关闭;ServerInsert:自动生成KEY;UserDefined:用户自定义KEY。 + PersistenceType *string `required:"false"` + + // 根据PersistenceType确定: None或ServerInsert, 此字段无意义; UserDefined, 则此字段传入用户自定义会话保持String. 若无此字段则不做修改 + PersistenceInfo *string `required:"false"` + + // 请求代理的VServer下表示空闲连接的回收时间,单位:秒,取值范围:时(0,86400],默认值为60;报文转发的VServer下表示回话保持的时间,单位:秒,取值范围:[60,900],0 表示禁用连接保持 + ClientTimeout *int `required:"false"` + + // 健康检查的类型,Port:端口,Path:路径 + MonitorType *string `required:"false"` + + // MonitorType 为 Path 时指定健康检查发送请求时HTTP HEADER 里的域名 + Domain *string `required:"false"` + + // MonitorType 为 Path 时指定健康检查发送请求时的路径,默认为 / + Path *string `required:"false"` +} + +// UpdateVServerAttributeResponse is response schema for UpdateVServerAttribute action +type UpdateVServerAttributeResponse struct { + response.CommonBase +} + +// NewUpdateVServerAttributeRequest will create request of UpdateVServerAttribute action. +func (c *ULBClient) NewUpdateVServerAttributeRequest() *UpdateVServerAttributeRequest { + req := &UpdateVServerAttributeRequest{} + + // setup request with client config + c.client.SetupRequest(req) + + // setup retryable with default retry policy (retry for non-create action and common error) + req.SetRetryable(true) + return req +} + +// UpdateVServerAttribute - 更新VServer实例属性 +func (c *ULBClient) UpdateVServerAttribute(req *UpdateVServerAttributeRequest) (*UpdateVServerAttributeResponse, error) { + var err error + var res UpdateVServerAttributeResponse + + err = c.client.InvokeAction("UpdateVServerAttribute", req, &res) + if err != nil { + return &res, err + } + + return &res, nil +} diff --git a/vendor/github.com/ucloud/ucloud-sdk-go/ucloud/request/common.go b/vendor/github.com/ucloud/ucloud-sdk-go/ucloud/request/common.go index 2d18a7abe6..eb17917f28 100644 --- a/vendor/github.com/ucloud/ucloud-sdk-go/ucloud/request/common.go +++ b/vendor/github.com/ucloud/ucloud-sdk-go/ucloud/request/common.go @@ -10,15 +10,27 @@ type Common interface { GetAction() string SetAction(string) error + GetActionRef() *string + SetActionRef(*string) error + GetRegion() string SetRegion(string) error + GetRegionRef() *string + SetRegionRef(*string) error + GetProjectId() string SetProjectId(string) error + GetProjectIdRef() *string + SetProjectIdRef(*string) error + GetZone() string SetZone(string) error + GetZoneRef() *string + SetZoneRef(*string) error + SetRetryCount(int) GetRetryCount() int @@ -114,6 +126,17 @@ func (c *CommonBase) SetAction(val string) error { return nil } +// GetActionRef will return a pointer to action of request +func (c *CommonBase) GetActionRef() *string { + return c.Action +} + +// SetActionRef will set a pointer to action of request +func (c *CommonBase) SetActionRef(val *string) error { + c.Action = val + return nil +} + // GetRegion will return region of request func (c *CommonBase) GetRegion() string { if c.Region == nil { @@ -128,6 +151,17 @@ func (c *CommonBase) SetRegion(val string) error { return nil } +// GetRegionRef will return a pointer to region of request +func (c *CommonBase) GetRegionRef() *string { + return c.Region +} + +// SetRegionRef will set a pointer to region of request +func (c *CommonBase) SetRegionRef(val *string) error { + c.Region = val + return nil +} + // GetZone will return zone of request func (c *CommonBase) GetZone() string { if c.Zone == nil { @@ -142,6 +176,17 @@ func (c *CommonBase) SetZone(val string) error { return nil } +// GetZoneRef will return a pointer to zone of request +func (c *CommonBase) GetZoneRef() *string { + return c.Zone +} + +// SetZoneRef will set a pointer to zone of request +func (c *CommonBase) SetZoneRef(val *string) error { + c.Zone = val + return nil +} + // GetProjectId will get project id of request func (c *CommonBase) GetProjectId() string { if c.ProjectId == nil { @@ -155,3 +200,14 @@ func (c *CommonBase) SetProjectId(val string) error { c.ProjectId = &val return nil } + +// GetProjectIdRef will get a pointer to project id of request +func (c *CommonBase) GetProjectIdRef() *string { + return c.ProjectId +} + +// SetProjectIdRef will set a pointer to project id of request +func (c *CommonBase) SetProjectIdRef(val *string) error { + c.ProjectId = val + return nil +} diff --git a/vendor/vendor.json b/vendor/vendor.json index 514c6e790a..87b48f7db1 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -26,6 +26,12 @@ "revision": "8d114be902bc9f08717804830a55c48378108a28", "revisionTime": "2018-09-15T22:22:04Z" }, + { + "checksumSHA1": "8jPcnwUo/UUnNvfFKdcKYtJJUYM=", + "path": "github.com/spf13/cobra/doc", + "revision": "ff9bf816a1557ee800e8afc7299bfa4c05eb7a05", + "revisionTime": "2018-12-27T10:25:35Z" + }, { "checksumSHA1": "9ay5PqAnQlhXvDO8XEmizyHGl2g=", "path": "github.com/spf13/pflag", @@ -86,6 +92,12 @@ "revision": "e4a5beab94162b24b60e41b3df8bc8e565144030", "revisionTime": "2018-11-21T10:11:50Z" }, + { + "checksumSHA1": "PHNVFy9+X1evds8wKHba4tsNROw=", + "path": "github.com/ucloud/ucloud-sdk-go/services/ulb", + "revision": "9ad84960331eeace7b8e427ed07104deadc74217", + "revisionTime": "2019-01-22T02:05:40Z" + }, { "checksumSHA1": "rTHjcXtmwEqyvuTz0gxXANcPoOc=", "path": "github.com/ucloud/ucloud-sdk-go/services/unet", From 0fd0f75cb54a0706afaed58178cdcb6660063daa Mon Sep 17 00:00:00 2001 From: lixiaojun Date: Thu, 24 Jan 2019 17:28:19 +0800 Subject: [PATCH 2/3] update gssh and subnet --- cmd/completion.go | 7 ++- cmd/globalssh.go | 155 ++++++++++++++++++++++++++++++---------------- cmd/region.go | 26 ++++---- cmd/uhost.go | 4 ++ cmd/vpc.go | 98 ++++++++++++++++++++++++++++- 5 files changed, 216 insertions(+), 74 deletions(-) diff --git a/cmd/completion.go b/cmd/completion.go index 386516f5c8..619bd7a61d 100644 --- a/cmd/completion.go +++ b/cmd/completion.go @@ -23,7 +23,8 @@ import ( "strings" "github.com/spf13/cobra" - . "github.com/ucloud/ucloud-cli/base" + + "github.com/ucloud/ucloud-cli/base" ) // NewCmdCompletion ucloud completion @@ -78,7 +79,7 @@ func zshCompletion(cmd *cobra.Command) { autoload -U +X bashcompinit && bashcompinit complete -F /usr/local/bin/ucloud ucloud`) fmt.Println("If the following scripts are included in '~/.bash_profile' or '~/.bashrc', please remove it. The scripts used to auto complete words before ucloud cli v0.1.3") - fmt.Printf("fpath=(~/%s $fpath)\n", ConfigPath) + fmt.Printf("fpath=(~/%s $fpath)\n", base.ConfigPath) fmt.Println("autoload -U +X compinit && compinit") } @@ -86,7 +87,7 @@ func getBashVersion() (version string, err error) { lookupBashVersion := exec.Command("bash", "-version") out, err := lookupBashVersion.Output() if err != nil { - Cxt.PrintErr(err) + base.Cxt.PrintErr(err) } // Example diff --git a/cmd/globalssh.go b/cmd/globalssh.go index 2fb9495251..755acf9c38 100644 --- a/cmd/globalssh.go +++ b/cmd/globalssh.go @@ -15,14 +15,16 @@ package cmd import ( + "fmt" "net" "strings" "github.com/spf13/cobra" - "github.com/ucloud/ucloud-cli/base" - . "github.com/ucloud/ucloud-cli/base" + "github.com/ucloud/ucloud-sdk-go/services/pathx" sdk "github.com/ucloud/ucloud-sdk-go/ucloud" + + "github.com/ucloud/ucloud-cli/base" ) //NewCmdGssh ucloud gssh @@ -52,7 +54,7 @@ type GSSHRow struct { //NewCmdGsshList ucloud gssh list func NewCmdGsshList() *cobra.Command { - req := BizClient.NewDescribeGlobalSSHInstanceRequest() + req := base.BizClient.NewDescribeGlobalSSHInstanceRequest() cmd := &cobra.Command{ Use: "list", Short: "List all GlobalSSH instances", @@ -66,11 +68,12 @@ func NewCmdGsshList() *cobra.Command { "东京": "Tokyo", "华盛顿": "Washington", "法兰克福": "Frankfurt", + "拉各斯": "Lagos", } - resp, err := BizClient.DescribeGlobalSSHInstance(req) + resp, err := base.BizClient.DescribeGlobalSSHInstance(req) if err != nil { - HandleError(err) + base.HandleError(err) } else { list := make([]GSSHRow, 0) for _, gssh := range resp.InstanceSet { @@ -92,22 +95,22 @@ func NewCmdGsshList() *cobra.Command { }, } cmd.Flags().SortFlags = false - req.Region = cmd.Flags().String("region", ConfigIns.Region, "Optional. Assign region") - req.ProjectId = cmd.Flags().String("project-id", ConfigIns.ProjectID, "Optional. Assign project-id") + req.Region = cmd.Flags().String("region", base.ConfigIns.Region, "Optional. Assign region") + req.ProjectId = cmd.Flags().String("project-id", base.ConfigIns.ProjectID, "Optional. Assign project-id") return cmd } //NewCmdGsshArea ucloud gssh area func NewCmdGsshArea() *cobra.Command { - req := BizClient.NewDescribeGlobalSSHAreaRequest() + req := base.BizClient.NewDescribeGlobalSSHAreaRequest() cmd := &cobra.Command{ Use: "location", Short: "List SSH server locations and covered areas", Long: "List SSH server locations and covered areas", Run: func(cmd *cobra.Command, args []string) { - resp, err := BizClient.DescribeGlobalSSHArea(req) + resp, err := base.BizClient.DescribeGlobalSSHArea(req) if err != nil { - HandleError(err) + base.HandleError(err) return } list := make([]GsshLocation, 0) @@ -118,13 +121,13 @@ func NewCmdGsshArea() *cobra.Command { } regionLabels := make([]string, 0) for _, region := range item.RegionSet { - regionLabels = append(regionLabels, RegionLabel[region]) + regionLabels = append(regionLabels, base.RegionLabel[region]) } row.CoveredArea = strings.Join(regionLabels, ",") list = append(list, row) } - PrintTable(list, []string{"AirportCode", "SSHServerLocation", "CoveredArea"}) + base.PrintTable(list, []string{"AirportCode", "SSHServerLocation", "CoveredArea"}) }, } return cmd @@ -144,12 +147,13 @@ var areaCodeMap = map[string]string{ "HND": "Tokyo", "IAD": "Washington", "FRA": "Frankfurt", + "LOS": "Lagos", } //NewCmdGsshCreate ucloud gssh create func NewCmdGsshCreate() *cobra.Command { var targetIP *net.IP - req := BizClient.NewCreateGlobalSSHInstanceRequest() + req := base.BizClient.NewCreateGlobalSSHInstanceRequest() cmd := &cobra.Command{ Use: "create", Short: "Create GlobalSSH instance", @@ -163,38 +167,46 @@ func NewCmdGsshCreate() *cobra.Command { } } if port < 1 || port > 65535 || port == 80 || port == 443 { - Cxt.Println("The port number should be between 1 and 65535, and cannot be 80 or 443") + base.Cxt.Println("The port number should be between 1 and 65535, and cannot be 80 or 443") return } req.TargetIP = sdk.String(targetIP.String()) - resp, err := BizClient.CreateGlobalSSHInstance(req) + resp, err := base.BizClient.CreateGlobalSSHInstance(req) if err != nil { - HandleError(err) + base.HandleError(err) } else { - Cxt.Printf("gssh[%s] created\n", resp.InstanceId) + base.Cxt.Printf("gssh[%s] created\n", resp.InstanceId) } }, } - cmd.Flags().SortFlags = false + flags := cmd.Flags() + flags.SortFlags = false + req.AreaCode = cmd.Flags().String("location", "", "Required. Location of the source server. See 'ucloud gssh location'") targetIP = cmd.Flags().IP("target-ip", nil, "Required. IP of the source server. Required") - req.Region = cmd.Flags().String("region", "", "Optional. Assign region") - req.ProjectId = cmd.Flags().String("project-id", ConfigIns.ProjectID, "Optional. Assign project-id") + bindProjectID(req, flags) req.Port = cmd.Flags().Int("port", 22, "Optional. Port of The SSH service between 1 and 65535. Do not use ports such as 80,443.") req.Remark = cmd.Flags().String("remark", "", "Optional. Remark of your GlobalSSH.") req.ChargeType = cmd.Flags().String("charge-type", "Month", "Optional.'Year',pay yearly;'Month',pay monthly;'Dynamic', pay hourly(requires access)") req.Quantity = cmd.Flags().Int("quantity", 1, "Optional. The duration of the instance. N years/months.") - req.CouponId = cmd.Flags().String("coupon-id", "", "Optional. Coupon ID, The Coupon can deduct part of the payment,see DescribeCoupon or https://accountv2.ucloud.cn") + cmd.MarkFlagRequired("location") cmd.MarkFlagRequired("target-ip") - cmd.Flags().SetFlagValues("location", "LosAngeles", "Singapore", "HongKong", "Tokyo", "Washington", "Frankfurt") + cmd.Flags().SetFlagValues("location", "LosAngeles", "Singapore", "Lagos", "HongKong", "Tokyo", "Washington", "Frankfurt") cmd.Flags().SetFlagValues("charge-type", "Month", "Year", "Dynamic", "Trial") + cmd.Flags().SetFlagValuesFunc("target-ip", func() []string { + eips := getAllEip(*req.ProjectId, base.ConfigIns.Region, nil, nil) + for idx, eip := range eips { + eips[idx] = strings.SplitN(eip, "/", 2)[1] + } + return eips + }) return cmd } //NewCmdGsshDelete ucloud gssh delete func NewCmdGsshDelete() *cobra.Command { - var req = BizClient.NewDeleteGlobalSSHInstanceRequest() + var req = base.BizClient.NewDeleteGlobalSSHInstanceRequest() var gsshIds *[]string var cmd = &cobra.Command{ Use: "delete", @@ -202,74 +214,107 @@ func NewCmdGsshDelete() *cobra.Command { Long: "Delete GlobalSSH instance", Example: "ucloud gssh delete --gssh-id uga-xx1 --id uga-xx2", Run: func(cmd *cobra.Command, args []string) { + req.ProjectId = sdk.String(base.PickResourceID(*req.ProjectId)) for _, id := range *gsshIds { - req.InstanceId = &id - _, err := BizClient.DeleteGlobalSSHInstance(req) + req.InstanceId = sdk.String(base.PickResourceID(id)) + _, err := base.BizClient.DeleteGlobalSSHInstance(req) if err != nil { - HandleError(err) + base.HandleError(err) } else { - Cxt.Printf("gssh[%s] deleted\n", id) + base.Cxt.Printf("gssh[%s] deleted\n", id) } } }, } - cmd.Flags().SortFlags = false - gsshIds = cmd.Flags().StringArray("gssh-id", make([]string, 0), "Required. ID of the GlobalSSH instances you want to delete. Multiple values specified by multiple flags") - req.ProjectId = cmd.Flags().String("project-id", ConfigIns.ProjectID, "Optional. Assign project-id") - req.Region = cmd.Flags().String("region", ConfigIns.Region, "Optional. Assign region") + flags := cmd.Flags() + flags.SortFlags = false + gsshIds = cmd.Flags().StringSlice("gssh-id", make([]string, 0), "Required. ID of the GlobalSSH instances you want to delete. Multiple values specified by multiple commas") + bindProjectID(req, flags) cmd.MarkFlagRequired("gssh-id") + cmd.Flags().SetFlagValuesFunc("gssh-id", func() []string { + return getAllGsshIDNames(*req.ProjectId) + }) return cmd } //NewCmdGsshModify ucloud gssh modify func NewCmdGsshModify() *cobra.Command { - var gsshModifyPortReq = BizClient.NewModifyGlobalSSHPortRequest() - var gsshModifyRemarkReq = BizClient.NewModifyGlobalSSHRemarkRequest() - region := ConfigIns.Region - project := ConfigIns.ProjectID - var cmd = &cobra.Command{ + gsshModifyPortReq := base.BizClient.NewModifyGlobalSSHPortRequest() + gsshModifyRemarkReq := base.BizClient.NewModifyGlobalSSHRemarkRequest() + project := base.ConfigIns.ProjectID + gsshIDs := []string{} + cmd := &cobra.Command{ Use: "update", Short: "Update GlobalSSH instance", Long: "Update GlobalSSH instance, including port and remark attribute", Example: "ucloud gssh update --gssh-id uga-xxx --port 22", Run: func(cmd *cobra.Command, args []string) { - gsshModifyPortReq.Region = sdk.String(region) gsshModifyPortReq.ProjectId = sdk.String(project) - gsshModifyRemarkReq.Region = sdk.String(region) gsshModifyRemarkReq.ProjectId = sdk.String(project) if *gsshModifyPortReq.Port == 0 && *gsshModifyRemarkReq.Remark == "" { - Cxt.Println("port or remark required") + base.Cxt.Println("Error, port or remark required") } if *gsshModifyPortReq.Port != 0 { port := *gsshModifyPortReq.Port if port <= 1 || port >= 65535 || port == 80 || port == 443 { - Cxt.Println("The port number should be between 1 and 65535, and cannot be equal to 80 or 443") + base.Cxt.Println("The port number should be between 1 and 65535, and cannot be equal to 80 or 443") return } - gsshModifyPortReq.InstanceId = gsshModifyRemarkReq.InstanceId - _, err := BizClient.ModifyGlobalSSHPort(gsshModifyPortReq) - if err != nil { - HandleError(err) - } else { - Cxt.Printf("gssh[%s] updated\n", *gsshModifyPortReq.InstanceId) + for _, idname := range gsshIDs { + gsshModifyPortReq.InstanceId = sdk.String(base.PickResourceID(idname)) + _, err := base.BizClient.ModifyGlobalSSHPort(gsshModifyPortReq) + if err != nil { + base.HandleError(err) + } else { + base.Cxt.Printf("gssh[%s]'s port updated\n", *gsshModifyPortReq.InstanceId) + } } } if *gsshModifyRemarkReq.Remark != "" { - _, err := BizClient.ModifyGlobalSSHRemark(gsshModifyRemarkReq) - if err != nil { - HandleError(err) - } else { - Cxt.Printf("gssh[%s] updated\n", *gsshModifyRemarkReq.InstanceId) + for _, idname := range gsshIDs { + gsshModifyRemarkReq.InstanceId = sdk.String(base.PickResourceID(idname)) + _, err := base.BizClient.ModifyGlobalSSHRemark(gsshModifyRemarkReq) + if err != nil { + base.HandleError(err) + } else { + base.Cxt.Printf("gssh[%s]'s remark updated\n", *gsshModifyRemarkReq.InstanceId) + } } } }, } - cmd.Flags().SortFlags = false - gsshModifyRemarkReq.InstanceId = cmd.Flags().String("gssh-id", "", "Required. InstanceID of your GlobalSSH") - cmd.Flags().StringVar(®ion, "region", ConfigIns.Region, "Optional. Assign region") - cmd.Flags().StringVar(&project, "project-id", ConfigIns.ProjectID, "Optional. Assign project-id") + flags := cmd.Flags() + flags.SortFlags = false + + flags.StringSliceVar(&gsshIDs, "gssh-id", nil, "Required. ResourceID of your GlobalSSH instances") + bindProjectIDS(&project, flags) gsshModifyPortReq.Port = cmd.Flags().Int("port", 0, "Optional. Port of SSH service.") gsshModifyRemarkReq.Remark = cmd.Flags().String("remark", "", "Optional. Remark of your GlobalSSH.") cmd.MarkFlagRequired("gssh-id") + cmd.Flags().SetFlagValuesFunc("gssh-id", func() []string { + return getAllGsshIDNames(project) + }) return cmd } + +func getAllGssh(project string) ([]pathx.GlobalSSHInfo, error) { + req := base.BizClient.NewDescribeGlobalSSHInstanceRequest() + req.ProjectId = &project + resp, err := base.BizClient.DescribeGlobalSSHInstance(req) + if err != nil { + return nil, err + } + return resp.InstanceSet, nil +} + +func getAllGsshIDNames(project string) []string { + gsshs, err := getAllGssh(project) + if err != nil { + return nil + } + list := []string{} + for _, gssh := range gsshs { + list = append(list, fmt.Sprintf("%s/%s", gssh.InstanceId, gssh.TargetIP)) + } + return list +} diff --git a/cmd/region.go b/cmd/region.go index f44a5db0e1..ef6124dcc0 100644 --- a/cmd/region.go +++ b/cmd/region.go @@ -24,7 +24,7 @@ import ( "github.com/ucloud/ucloud-sdk-go/services/uaccount" - . "github.com/ucloud/ucloud-cli/base" + "github.com/ucloud/ucloud-cli/base" ) //NewCmdRegion ucloud region @@ -37,7 +37,7 @@ func NewCmdRegion() *cobra.Command { Run: func(cmd *cobra.Command, args []string) { regionMap, err := fetchRegion() if err != nil { - HandleError(err) + base.HandleError(err) return } regionList := make([]RegionTable, 0) @@ -45,9 +45,9 @@ func NewCmdRegion() *cobra.Command { regionList = append(regionList, RegionTable{region, strings.Join(zones, ", ")}) } if global.json { - PrintJSON(regionList) + base.PrintJSON(regionList) } else { - PrintTableS(regionList) + base.PrintTableS(regionList) } }, } @@ -62,7 +62,7 @@ type RegionTable struct { func getDefaultRegion() (string, string, error) { req := &uaccount.GetRegionRequest{} - resp, err := BizClient.GetRegion(req) + resp, err := base.BizClient.GetRegion(req) if err != nil { return "", "", err } @@ -79,7 +79,7 @@ func getDefaultRegion() (string, string, error) { func fetchRegion() (map[string][]string, error) { req := &uaccount.GetRegionRequest{} - resp, err := BizClient.GetRegion(req) + resp, err := base.BizClient.GetRegion(req) if err != nil { return nil, err } @@ -122,9 +122,9 @@ func getZoneList(region string) []string { // req.SetZone() // } func getDefaultProject() (string, string, error) { - req := BizClient.NewGetProjectListRequest() + req := base.BizClient.NewGetProjectListRequest() - resp, err := BizClient.GetProjectList(req) + resp, err := base.BizClient.GetProjectList(req) if err != nil { return "", "", err } @@ -144,9 +144,9 @@ func isUserCertified(userInfo *uaccount.UserInfo) bool { } func getUserInfo() (*uaccount.UserInfo, error) { - req := BizClient.NewGetUserInfoRequest() + req := base.BizClient.NewGetUserInfoRequest() var userInfo uaccount.UserInfo - resp, err := BizClient.GetUserInfo(req) + resp, err := base.BizClient.GetUserInfo(req) if err != nil { return nil, err @@ -157,13 +157,13 @@ func getUserInfo() (*uaccount.UserInfo, error) { } if len(resp.DataSet) == 1 { userInfo = resp.DataSet[0] - Cxt.AppendInfo("userName", userInfo.UserEmail) - Cxt.AppendInfo("companyName", userInfo.CompanyName) + base.Cxt.AppendInfo("userName", userInfo.UserEmail) + base.Cxt.AppendInfo("companyName", userInfo.CompanyName) bytes, err := json.Marshal(userInfo) if err != nil { return nil, err } - fileFullPath := GetConfigPath() + "/user.json" + fileFullPath := base.GetConfigPath() + "/user.json" err = ioutil.WriteFile(fileFullPath, bytes, 0600) if err != nil { return nil, err diff --git a/cmd/uhost.go b/cmd/uhost.go index 3ffa5fb028..e04360d40e 100644 --- a/cmd/uhost.go +++ b/cmd/uhost.go @@ -145,6 +145,7 @@ func NewCmdUHostCreate(out io.Writer) *cobra.Command { req.LoginMode = sdk.String("Password") req.ImageId = sdk.String(base.PickResourceID(*req.ImageId)) req.VPCId = sdk.String(base.PickResourceID(*req.VPCId)) + req.SubnetId = sdk.String(base.PickResourceID(*req.SubnetId)) req.SecurityGroupId = sdk.String(base.PickResourceID(*req.SecurityGroupId)) resp, err := base.BizClient.CreateUHostInstance(req) @@ -266,6 +267,9 @@ func NewCmdUHostCreate(out io.Writer) *cobra.Command { flags.SetFlagValuesFunc("firewall-id", func() []string { return getFirewallIDNames(*req.ProjectId, *req.Region) }) + flags.SetFlagValuesFunc("subnet-id", func() []string { + return getAllSubnetIDNames(*req.VPCId, *req.ProjectId, *req.Region) + }) cmd.MarkFlagRequired("cpu") cmd.MarkFlagRequired("memory") diff --git a/cmd/vpc.go b/cmd/vpc.go index 7feaffecad..d2f4a6187b 100644 --- a/cmd/vpc.go +++ b/cmd/vpc.go @@ -351,6 +351,7 @@ func NewCmdSubnet() *cobra.Command { cmd.AddCommand(NewCmdSubnetList()) cmd.AddCommand(NewCmdSubnetCreate()) cmd.AddCommand(NewCmdSubnetDelete(out)) + cmd.AddCommand(NewCmdSubnetListResource(out)) return cmd } @@ -468,8 +469,9 @@ func NewCmdSubnetDelete(out io.Writer) *cobra.Command { Short: "Delete subnet", Long: "Delete subnet", Run: func(c *cobra.Command, args []string) { + req.ProjectId = sdk.String(base.PickResourceID(*req.ProjectId)) for _, id := range idNames { - req.SubnetId = sdk.String(id) + req.SubnetId = sdk.String(base.PickResourceID(id)) _, err := base.BizClient.DeleteSubnet(req) if err != nil { base.HandleError(err) @@ -484,10 +486,100 @@ func NewCmdSubnetDelete(out io.Writer) *cobra.Command { flags.SortFlags = false flags.StringSliceVar(&idNames, "subnet-id", nil, "Required. Resource ID of subent") - req.Region = cmd.Flags().String("region", base.ConfigIns.Region, "Optional. The region of the subnet") - req.ProjectId = cmd.Flags().String("project-id", base.ConfigIns.ProjectID, "Optional. The project id of the subnet") + bindRegion(req, flags) + bindProjectID(req, flags) + cmd.MarkFlagRequired("subnet-id") + flags.SetFlagValuesFunc("subnet-id", func() []string { + return getAllSubnetIDNames("", *req.ProjectId, *req.Region) + }) + + return cmd +} + +//SubnetResourceRow 表格行 +type SubnetResourceRow struct { + ResourceName string + ResourceID string + ResourceType string + PrivateIP string +} +//NewCmdSubnetListResource ucloud subnet list-resource +func NewCmdSubnetListResource(out io.Writer) *cobra.Command { + req := base.BizClient.NewDescribeSubnetResourceRequest() + cmd := &cobra.Command{ + Use: "list-resource", + Short: "List resources belong to subnet", + Long: "List resources belong to subnet", + Run: func(c *cobra.Command, args []string) { + req.SubnetId = sdk.String(base.PickResourceID(*req.SubnetId)) + resp, err := base.BizClient.DescribeSubnetResource(req) + if err != nil { + base.HandleError(err) + return + } + list := []SubnetResourceRow{} + for _, r := range resp.DataSet { + row := SubnetResourceRow{ + ResourceName: r.Name, + ResourceID: r.ResourceId, + ResourceType: r.ResourceType, + PrivateIP: r.IP, + } + list = append(list, row) + } + base.PrintList(list, global.json) + }, + } + flags := cmd.Flags() + flags.SortFlags = false + req.SubnetId = flags.String("subnet-id", "", "Required. Resource ID of subnet which resources to list belong to") + req.ResourceType = flags.String("resource-type", "", "Optional. Resource type of resources to list. Accept values:'uhost','phost','ulb','uhadoophost','ufortresshost','unatgw','ukafka','umem','docker','udb','udw' and 'vip'") + bindRegion(req, flags) + bindProjectID(req, flags) + bindLimit(req, flags) + bindOffset(req, flags) cmd.MarkFlagRequired("subnet-id") + flags.SetFlagValuesFunc("subnet-id", func() []string { + return getAllSubnetIDNames("", *req.ProjectId, *req.Region) + }) + flags.SetFlagValues("resource-type", "uhost", "phost", "ulb", "uhadoophost", "ufortresshost", "unatgw", "ukafka", "umem", "docker", "udb", "udw", "vip") return cmd } + +func getAllSubnets(vpcID, project, region string) ([]vpc.VPCSubnetInfoSet, error) { + req := base.BizClient.NewDescribeSubnetRequest() + req.ProjectId = sdk.String(base.PickResourceID(project)) + req.Region = sdk.String(region) + if vpcID != "" { + req.VPCId = sdk.String(base.PickResourceID(vpcID)) + } + subnets := []vpc.VPCSubnetInfoSet{} + for limit, offset := 50, 0; ; offset += limit { + req.Limit = sdk.Int(limit) + req.Offset = sdk.Int(offset) + resp, err := base.BizClient.DescribeSubnet(req) + if err != nil { + base.HandleError(err) + return nil, err + } + subnets = append(subnets, resp.DataSet...) + if limit+offset >= resp.TotalCount { + break + } + } + return subnets, nil +} + +func getAllSubnetIDNames(vpcID, project, region string) []string { + subnets, err := getAllSubnets(vpcID, project, region) + if err != nil { + return nil + } + list := []string{} + for _, s := range subnets { + list = append(list, fmt.Sprintf("%s/%s", s.SubnetId, s.SubnetName)) + } + return list +} From 2c019c80d5e7f7168cffb9855c1b2a04d2aad689 Mon Sep 17 00:00:00 2001 From: lixiaojun Date: Thu, 24 Jan 2019 17:34:20 +0800 Subject: [PATCH 3/3] 0.1.8 --- Makefile | 2 +- README.md | 6 +++--- base/config.go | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index e6a09294bf..2a7b04a106 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -export VERSION=0.1.7 +export VERSION=0.1.8 .PHONY : build build: diff --git a/README.md b/README.md index a313d6fa8b..e416cefd3c 100644 --- a/README.md +++ b/README.md @@ -83,9 +83,9 @@ Taking create uhost in Nigeria (region: air-nigeria) and bind a public IP as an First to create an uhost instance: ``` -$ ucloud uhost create --cpu 1 --memory 1 --password mypassword123 --image-id uimage-fya3qr +$ ucloud uhost create --cpu 1 --memory 1 --password **** --image-id uimage-fya3qr -UHost:[uhost-tr1eau] created successfully! +UHost:[uhost-tr1e] created successfully! ``` *Note* @@ -116,7 +116,7 @@ Configure the GlobalSSH to the uhost instance and login the instance via GlobalS ``` $ ucloud gssh create --location Washington --target-ip 152.32.140.92 -ResourceID: uga-pdhxvs +gssh[uga-0psxxx] created $ ssh root@152.32.140.92.ipssh.net root@152.32.140.92.ipssh.net's password: password of the uhost instance diff --git a/base/config.go b/base/config.go index 0de05f19a6..a370e51e97 100644 --- a/base/config.go +++ b/base/config.go @@ -29,7 +29,7 @@ const DefaultBaseURL = "https://api.ucloud.cn/" const DefaultProfile = "default" //Version 版本号 -const Version = "0.1.7" +const Version = "0.1.8" //ConfigIns 配置实例, 程序加载时生成 var ConfigIns = &AggConfig{}