@@ -2,11 +2,13 @@ package rdb
22
33import (
44 "context"
5+ "reflect"
56
67 "github.com/fatih/color"
78 "github.com/scaleway/scaleway-cli/v2/internal/core"
89 "github.com/scaleway/scaleway-cli/v2/internal/human"
910 "github.com/scaleway/scaleway-sdk-go/api/rdb/v1"
11+ "github.com/scaleway/scaleway-sdk-go/scw"
1012)
1113
1214var (
@@ -17,30 +19,101 @@ var (
1719)
1820
1921func aclAddBuilder (c * core.Command ) * core.Command {
22+ type customAddACLRequest struct {
23+ * rdb.AddInstanceACLRulesRequest
24+ Rules []* rdb.ACLRuleRequest
25+ }
26+
27+ c .ArgSpecs .GetByName ("rules.{index}.ip" ).Name = "rules.{index}.ip"
28+ c .ArgSpecs .GetByName ("rules.{index}.description" ).Name = "rules.{index}.description"
29+
30+ c .ArgsType = reflect .TypeOf (customAddACLRequest {})
31+
2032 c .Interceptor = func (ctx context.Context , argsI interface {}, runner core.CommandRunner ) (interface {}, error ) {
21- aclAddResponseI , err := runner (ctx , argsI )
33+ args := argsI .(* customAddACLRequest )
34+
35+ request := args .AddInstanceACLRulesRequest
36+ request .Rules = args .Rules
37+
38+ aclAddResponseI , err := runner (ctx , request )
2239 if err != nil {
2340 return nil , err
2441 }
42+
2543 aclAddResponse := aclAddResponseI .(* rdb.AddInstanceACLRulesResponse )
2644 return aclAddResponse .Rules , nil
2745 }
2846
47+ c .WaitFunc = func (ctx context.Context , argsI , respI interface {}) (interface {}, error ) {
48+ args := argsI .(* customAddACLRequest )
49+
50+ api := rdb .NewAPI (core .ExtractClient (ctx ))
51+ _ , err := api .WaitForInstance (& rdb.WaitForInstanceRequest {
52+ InstanceID : args .InstanceID ,
53+ Region : args .Region ,
54+ Timeout : scw .TimeDurationPtr (instanceActionTimeout ),
55+ RetryInterval : core .DefaultRetryInterval ,
56+ })
57+ if err != nil {
58+ return nil , err
59+ }
60+
61+ return respI .([]* rdb.ACLRule ), nil
62+ }
63+
2964 return c
3065}
3166
3267func aclDeleteBuilder (c * core.Command ) * core.Command {
68+ type deleteRules struct {
69+ IP string `json:"ip"`
70+ }
71+
72+ type customDeleteACLRequest struct {
73+ * rdb.DeleteInstanceACLRulesRequest
74+ Rules []deleteRules
75+ }
76+
77+ c .ArgSpecs .GetByName ("acl-rule-ips.{index}" ).Name = "rules.{index}.ip"
78+
79+ c .ArgsType = reflect .TypeOf (customDeleteACLRequest {})
80+
3381 c .Interceptor = func (ctx context.Context , argsI interface {}, runner core.CommandRunner ) (interface {}, error ) {
34- aclDeleteResponseI , err := runner (ctx , argsI )
82+ args := argsI .(* customDeleteACLRequest )
83+
84+ request := args .DeleteInstanceACLRulesRequest
85+ for _ , ip := range args .Rules {
86+ request .ACLRuleIPs = append (request .ACLRuleIPs , ip .IP )
87+ }
88+
89+ aclDeleteResponseI , err := runner (ctx , request )
3590 if err != nil {
3691 return nil , err
3792 }
93+
3894 aclDeleteResponse := aclDeleteResponseI .(* rdb.DeleteInstanceACLRulesResponse )
3995 return rdb.ListInstanceACLRulesResponse {
4096 Rules : aclDeleteResponse .Rules ,
4197 TotalCount : uint32 (len (aclDeleteResponse .Rules )),
4298 }, nil
4399 }
44100
101+ c .WaitFunc = func (ctx context.Context , argsI , respI interface {}) (interface {}, error ) {
102+ args := argsI .(* customDeleteACLRequest )
103+
104+ api := rdb .NewAPI (core .ExtractClient (ctx ))
105+ _ , err := api .WaitForInstance (& rdb.WaitForInstanceRequest {
106+ InstanceID : args .InstanceID ,
107+ Region : args .Region ,
108+ Timeout : scw .TimeDurationPtr (instanceActionTimeout ),
109+ RetryInterval : core .DefaultRetryInterval ,
110+ })
111+ if err != nil {
112+ return nil , err
113+ }
114+
115+ return respI .(rdb.ListInstanceACLRulesResponse ), nil
116+ }
117+
45118 return c
46119}
0 commit comments