1515package cmd
1616
1717import (
18+ "fmt"
1819 "net"
1920 "strings"
2021
2122 "github.com/spf13/cobra"
2223
23- "github.com/ucloud/ucloud-cli/base"
24- . "github.com/ucloud/ucloud-cli/base"
24+ "github.com/ucloud/ucloud-sdk-go/services/pathx"
2525 sdk "github.com/ucloud/ucloud-sdk-go/ucloud"
26+
27+ "github.com/ucloud/ucloud-cli/base"
2628)
2729
2830//NewCmdGssh ucloud gssh
@@ -52,7 +54,7 @@ type GSSHRow struct {
5254
5355//NewCmdGsshList ucloud gssh list
5456func NewCmdGsshList () * cobra.Command {
55- req := BizClient .NewDescribeGlobalSSHInstanceRequest ()
57+ req := base . BizClient .NewDescribeGlobalSSHInstanceRequest ()
5658 cmd := & cobra.Command {
5759 Use : "list" ,
5860 Short : "List all GlobalSSH instances" ,
@@ -66,11 +68,12 @@ func NewCmdGsshList() *cobra.Command {
6668 "东京" : "Tokyo" ,
6769 "华盛顿" : "Washington" ,
6870 "法兰克福" : "Frankfurt" ,
71+ "拉各斯" : "Lagos" ,
6972 }
7073
71- resp , err := BizClient .DescribeGlobalSSHInstance (req )
74+ resp , err := base . BizClient .DescribeGlobalSSHInstance (req )
7275 if err != nil {
73- HandleError (err )
76+ base . HandleError (err )
7477 } else {
7578 list := make ([]GSSHRow , 0 )
7679 for _ , gssh := range resp .InstanceSet {
@@ -92,22 +95,22 @@ func NewCmdGsshList() *cobra.Command {
9295 },
9396 }
9497 cmd .Flags ().SortFlags = false
95- req .Region = cmd .Flags ().String ("region" , ConfigIns .Region , "Optional. Assign region" )
96- req .ProjectId = cmd .Flags ().String ("project-id" , ConfigIns .ProjectID , "Optional. Assign project-id" )
98+ req .Region = cmd .Flags ().String ("region" , base . ConfigIns .Region , "Optional. Assign region" )
99+ req .ProjectId = cmd .Flags ().String ("project-id" , base . ConfigIns .ProjectID , "Optional. Assign project-id" )
97100 return cmd
98101}
99102
100103//NewCmdGsshArea ucloud gssh area
101104func NewCmdGsshArea () * cobra.Command {
102- req := BizClient .NewDescribeGlobalSSHAreaRequest ()
105+ req := base . BizClient .NewDescribeGlobalSSHAreaRequest ()
103106 cmd := & cobra.Command {
104107 Use : "location" ,
105108 Short : "List SSH server locations and covered areas" ,
106109 Long : "List SSH server locations and covered areas" ,
107110 Run : func (cmd * cobra.Command , args []string ) {
108- resp , err := BizClient .DescribeGlobalSSHArea (req )
111+ resp , err := base . BizClient .DescribeGlobalSSHArea (req )
109112 if err != nil {
110- HandleError (err )
113+ base . HandleError (err )
111114 return
112115 }
113116 list := make ([]GsshLocation , 0 )
@@ -118,13 +121,13 @@ func NewCmdGsshArea() *cobra.Command {
118121 }
119122 regionLabels := make ([]string , 0 )
120123 for _ , region := range item .RegionSet {
121- regionLabels = append (regionLabels , RegionLabel [region ])
124+ regionLabels = append (regionLabels , base . RegionLabel [region ])
122125 }
123126 row .CoveredArea = strings .Join (regionLabels , "," )
124127 list = append (list , row )
125128 }
126129
127- PrintTable (list , []string {"AirportCode" , "SSHServerLocation" , "CoveredArea" })
130+ base . PrintTable (list , []string {"AirportCode" , "SSHServerLocation" , "CoveredArea" })
128131 },
129132 }
130133 return cmd
@@ -144,12 +147,13 @@ var areaCodeMap = map[string]string{
144147 "HND" : "Tokyo" ,
145148 "IAD" : "Washington" ,
146149 "FRA" : "Frankfurt" ,
150+ "LOS" : "Lagos" ,
147151}
148152
149153//NewCmdGsshCreate ucloud gssh create
150154func NewCmdGsshCreate () * cobra.Command {
151155 var targetIP * net.IP
152- req := BizClient .NewCreateGlobalSSHInstanceRequest ()
156+ req := base . BizClient .NewCreateGlobalSSHInstanceRequest ()
153157 cmd := & cobra.Command {
154158 Use : "create" ,
155159 Short : "Create GlobalSSH instance" ,
@@ -163,113 +167,154 @@ func NewCmdGsshCreate() *cobra.Command {
163167 }
164168 }
165169 if port < 1 || port > 65535 || port == 80 || port == 443 {
166- Cxt .Println ("The port number should be between 1 and 65535, and cannot be 80 or 443" )
170+ base . Cxt .Println ("The port number should be between 1 and 65535, and cannot be 80 or 443" )
167171 return
168172 }
169173 req .TargetIP = sdk .String (targetIP .String ())
170- resp , err := BizClient .CreateGlobalSSHInstance (req )
174+ resp , err := base . BizClient .CreateGlobalSSHInstance (req )
171175 if err != nil {
172- HandleError (err )
176+ base . HandleError (err )
173177 } else {
174- Cxt .Printf ("gssh[%s] created\n " , resp .InstanceId )
178+ base . Cxt .Printf ("gssh[%s] created\n " , resp .InstanceId )
175179 }
176180 },
177181 }
178- cmd .Flags ().SortFlags = false
182+ flags := cmd .Flags ()
183+ flags .SortFlags = false
184+
179185 req .AreaCode = cmd .Flags ().String ("location" , "" , "Required. Location of the source server. See 'ucloud gssh location'" )
180186 targetIP = cmd .Flags ().IP ("target-ip" , nil , "Required. IP of the source server. Required" )
181- req .Region = cmd .Flags ().String ("region" , "" , "Optional. Assign region" )
182- req .ProjectId = cmd .Flags ().String ("project-id" , ConfigIns .ProjectID , "Optional. Assign project-id" )
187+ bindProjectID (req , flags )
183188 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." )
184189 req .Remark = cmd .Flags ().String ("remark" , "" , "Optional. Remark of your GlobalSSH." )
185190 req .ChargeType = cmd .Flags ().String ("charge-type" , "Month" , "Optional.'Year',pay yearly;'Month',pay monthly;'Dynamic', pay hourly(requires access)" )
186191 req .Quantity = cmd .Flags ().Int ("quantity" , 1 , "Optional. The duration of the instance. N years/months." )
187- 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" )
192+
188193 cmd .MarkFlagRequired ("location" )
189194 cmd .MarkFlagRequired ("target-ip" )
190- cmd .Flags ().SetFlagValues ("location" , "LosAngeles" , "Singapore" , "HongKong" , "Tokyo" , "Washington" , "Frankfurt" )
195+ cmd .Flags ().SetFlagValues ("location" , "LosAngeles" , "Singapore" , "Lagos" , " HongKong" , "Tokyo" , "Washington" , "Frankfurt" )
191196 cmd .Flags ().SetFlagValues ("charge-type" , "Month" , "Year" , "Dynamic" , "Trial" )
197+ cmd .Flags ().SetFlagValuesFunc ("target-ip" , func () []string {
198+ eips := getAllEip (* req .ProjectId , base .ConfigIns .Region , nil , nil )
199+ for idx , eip := range eips {
200+ eips [idx ] = strings .SplitN (eip , "/" , 2 )[1 ]
201+ }
202+ return eips
203+ })
192204 return cmd
193205}
194206
195207//NewCmdGsshDelete ucloud gssh delete
196208func NewCmdGsshDelete () * cobra.Command {
197- var req = BizClient .NewDeleteGlobalSSHInstanceRequest ()
209+ var req = base . BizClient .NewDeleteGlobalSSHInstanceRequest ()
198210 var gsshIds * []string
199211 var cmd = & cobra.Command {
200212 Use : "delete" ,
201213 Short : "Delete GlobalSSH instance" ,
202214 Long : "Delete GlobalSSH instance" ,
203215 Example : "ucloud gssh delete --gssh-id uga-xx1 --id uga-xx2" ,
204216 Run : func (cmd * cobra.Command , args []string ) {
217+ req .ProjectId = sdk .String (base .PickResourceID (* req .ProjectId ))
205218 for _ , id := range * gsshIds {
206- req .InstanceId = & id
207- _ , err := BizClient .DeleteGlobalSSHInstance (req )
219+ req .InstanceId = sdk . String ( base . PickResourceID ( id ))
220+ _ , err := base . BizClient .DeleteGlobalSSHInstance (req )
208221 if err != nil {
209- HandleError (err )
222+ base . HandleError (err )
210223 } else {
211- Cxt .Printf ("gssh[%s] deleted\n " , id )
224+ base . Cxt .Printf ("gssh[%s] deleted\n " , id )
212225 }
213226 }
214227 },
215228 }
216- cmd .Flags (). SortFlags = false
217- 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" )
218- req . ProjectId = cmd .Flags ().String ( "project -id" , ConfigIns . ProjectID , "Optional. Assign project-id " )
219- req . Region = cmd . Flags (). String ( "region" , ConfigIns . Region , "Optional. Assign region" )
229+ flags := cmd .Flags ()
230+ flags . SortFlags = false
231+ 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 " )
232+ bindProjectID ( req , flags )
220233 cmd .MarkFlagRequired ("gssh-id" )
234+ cmd .Flags ().SetFlagValuesFunc ("gssh-id" , func () []string {
235+ return getAllGsshIDNames (* req .ProjectId )
236+ })
221237 return cmd
222238}
223239
224240//NewCmdGsshModify ucloud gssh modify
225241func NewCmdGsshModify () * cobra.Command {
226- var gsshModifyPortReq = BizClient .NewModifyGlobalSSHPortRequest ()
227- var gsshModifyRemarkReq = BizClient .NewModifyGlobalSSHRemarkRequest ()
228- region := ConfigIns .Region
229- project := ConfigIns . ProjectID
230- var cmd = & cobra.Command {
242+ gsshModifyPortReq := base . BizClient .NewModifyGlobalSSHPortRequest ()
243+ gsshModifyRemarkReq := base . BizClient .NewModifyGlobalSSHRemarkRequest ()
244+ project := base . ConfigIns .ProjectID
245+ gsshIDs := [] string {}
246+ cmd : = & cobra.Command {
231247 Use : "update" ,
232248 Short : "Update GlobalSSH instance" ,
233249 Long : "Update GlobalSSH instance, including port and remark attribute" ,
234250 Example : "ucloud gssh update --gssh-id uga-xxx --port 22" ,
235251 Run : func (cmd * cobra.Command , args []string ) {
236- gsshModifyPortReq .Region = sdk .String (region )
237252 gsshModifyPortReq .ProjectId = sdk .String (project )
238- gsshModifyRemarkReq .Region = sdk .String (region )
239253 gsshModifyRemarkReq .ProjectId = sdk .String (project )
240254 if * gsshModifyPortReq .Port == 0 && * gsshModifyRemarkReq .Remark == "" {
241- Cxt .Println ("port or remark required" )
255+ base . Cxt .Println ("Error, port or remark required" )
242256 }
243257 if * gsshModifyPortReq .Port != 0 {
244258 port := * gsshModifyPortReq .Port
245259 if port <= 1 || port >= 65535 || port == 80 || port == 443 {
246- Cxt .Println ("The port number should be between 1 and 65535, and cannot be equal to 80 or 443" )
260+ base . Cxt .Println ("The port number should be between 1 and 65535, and cannot be equal to 80 or 443" )
247261 return
248262 }
249- gsshModifyPortReq .InstanceId = gsshModifyRemarkReq .InstanceId
250- _ , err := BizClient .ModifyGlobalSSHPort (gsshModifyPortReq )
251- if err != nil {
252- HandleError (err )
253- } else {
254- Cxt .Printf ("gssh[%s] updated\n " , * gsshModifyPortReq .InstanceId )
263+ for _ , idname := range gsshIDs {
264+ gsshModifyPortReq .InstanceId = sdk .String (base .PickResourceID (idname ))
265+ _ , err := base .BizClient .ModifyGlobalSSHPort (gsshModifyPortReq )
266+ if err != nil {
267+ base .HandleError (err )
268+ } else {
269+ base .Cxt .Printf ("gssh[%s]'s port updated\n " , * gsshModifyPortReq .InstanceId )
270+ }
255271 }
256272 }
257273 if * gsshModifyRemarkReq .Remark != "" {
258- _ , err := BizClient .ModifyGlobalSSHRemark (gsshModifyRemarkReq )
259- if err != nil {
260- HandleError (err )
261- } else {
262- Cxt .Printf ("gssh[%s] updated\n " , * gsshModifyRemarkReq .InstanceId )
274+ for _ , idname := range gsshIDs {
275+ gsshModifyRemarkReq .InstanceId = sdk .String (base .PickResourceID (idname ))
276+ _ , err := base .BizClient .ModifyGlobalSSHRemark (gsshModifyRemarkReq )
277+ if err != nil {
278+ base .HandleError (err )
279+ } else {
280+ base .Cxt .Printf ("gssh[%s]'s remark updated\n " , * gsshModifyRemarkReq .InstanceId )
281+ }
263282 }
264283 }
265284 },
266285 }
267- cmd .Flags ().SortFlags = false
268- gsshModifyRemarkReq .InstanceId = cmd .Flags ().String ("gssh-id" , "" , "Required. InstanceID of your GlobalSSH" )
269- cmd .Flags ().StringVar (& region , "region" , ConfigIns .Region , "Optional. Assign region" )
270- cmd .Flags ().StringVar (& project , "project-id" , ConfigIns .ProjectID , "Optional. Assign project-id" )
286+ flags := cmd .Flags ()
287+ flags .SortFlags = false
288+
289+ flags .StringSliceVar (& gsshIDs , "gssh-id" , nil , "Required. ResourceID of your GlobalSSH instances" )
290+ bindProjectIDS (& project , flags )
271291 gsshModifyPortReq .Port = cmd .Flags ().Int ("port" , 0 , "Optional. Port of SSH service." )
272292 gsshModifyRemarkReq .Remark = cmd .Flags ().String ("remark" , "" , "Optional. Remark of your GlobalSSH." )
273293 cmd .MarkFlagRequired ("gssh-id" )
294+ cmd .Flags ().SetFlagValuesFunc ("gssh-id" , func () []string {
295+ return getAllGsshIDNames (project )
296+ })
274297 return cmd
275298}
299+
300+ func getAllGssh (project string ) ([]pathx.GlobalSSHInfo , error ) {
301+ req := base .BizClient .NewDescribeGlobalSSHInstanceRequest ()
302+ req .ProjectId = & project
303+ resp , err := base .BizClient .DescribeGlobalSSHInstance (req )
304+ if err != nil {
305+ return nil , err
306+ }
307+ return resp .InstanceSet , nil
308+ }
309+
310+ func getAllGsshIDNames (project string ) []string {
311+ gsshs , err := getAllGssh (project )
312+ if err != nil {
313+ return nil
314+ }
315+ list := []string {}
316+ for _ , gssh := range gsshs {
317+ list = append (list , fmt .Sprintf ("%s/%s" , gssh .InstanceId , gssh .TargetIP ))
318+ }
319+ return list
320+ }
0 commit comments