Skip to content

Commit ce50296

Browse files
authored
feat(lb): add warning on kapsule-tagged lbs (#2671)
1 parent 64e0c85 commit ce50296

27 files changed

Lines changed: 6317 additions & 2385 deletions

internal/namespaces/lb/v1/custom.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,22 @@
11
package lb
22

33
import (
4+
"github.com/fatih/color"
45
"github.com/scaleway/scaleway-cli/v2/internal/core"
56
"github.com/scaleway/scaleway-cli/v2/internal/human"
7+
"github.com/scaleway/scaleway-cli/v2/internal/terminal"
68
"github.com/scaleway/scaleway-sdk-go/api/lb/v1"
79
)
810

11+
const (
12+
warningKapsuleTaggedMessage = "This resource is auto managed by Kapsule, all your modifications will be overwritten."
13+
kapsuleTag = "kapsule"
14+
)
15+
16+
func warningKapsuleTaggedMessageView() string {
17+
return terminal.Style("Warning: ", color.Bold, color.FgRed) + warningKapsuleTaggedMessage
18+
}
19+
920
func GetCommands() *core.Commands {
1021
human.RegisterMarshalerFunc(lb.LBTypeStock(""), human.EnumMarshalFunc(lbTypeStockMarshalSpecs))
1122
human.RegisterMarshalerFunc(lb.LBStatus(""), human.EnumMarshalFunc(lbStatusMarshalSpecs))
@@ -15,6 +26,9 @@ func GetCommands() *core.Commands {
1526
human.RegisterMarshalerFunc(lb.BackendServerStatsServerState(""), human.EnumMarshalFunc(backendServerStatsServerStateMarshalSpecs))
1627
human.RegisterMarshalerFunc(lb.LB{}, lbMarshalerFunc)
1728
human.RegisterMarshalerFunc(lb.Backend{}, lbBackendMarshalerFunc)
29+
human.RegisterMarshalerFunc(lb.Frontend{}, lbFrontendMarshalerFunc)
30+
human.RegisterMarshalerFunc(lb.Certificate{}, lbCertificateMarshalerFunc)
31+
human.RegisterMarshalerFunc(lb.ACL{}, lbACLMarshalerFunc)
1832

1933
cmds := GetGeneratedCommands()
2034

@@ -25,11 +39,33 @@ func GetCommands() *core.Commands {
2539
cmds.MustFind("lb", "lb", "create").Override(lbCreateBuilder)
2640
cmds.MustFind("lb", "lb", "get").Override(lbGetBuilder)
2741
cmds.MustFind("lb", "lb", "migrate").Override(lbMigrateBuilder)
42+
cmds.MustFind("lb", "lb", "update").Override(lbUpdateBuilder)
43+
cmds.MustFind("lb", "lb", "delete").Override(lbDeleteBuilder)
2844
cmds.MustFind("lb", "lb", "get-stats").Override(lbGetStatsBuilder)
2945

46+
cmds.MustFind("lb", "backend", "get").Override(backendGetBuilder)
47+
cmds.MustFind("lb", "backend", "create").Override(backendCreateBuilder)
48+
cmds.MustFind("lb", "backend", "update").Override(backendUpdateBuilder)
49+
cmds.MustFind("lb", "backend", "delete").Override(backendDeleteBuilder)
50+
cmds.MustFind("lb", "backend", "add-servers").Override(backendAddServersBuilder)
51+
cmds.MustFind("lb", "backend", "remove-servers").Override(backendRemoveServersBuilder)
52+
cmds.MustFind("lb", "backend", "set-servers").Override(backendSetServersBuilder)
53+
cmds.MustFind("lb", "backend", "update-healthcheck").Override(backendUpdateHealthcheckBuilder)
54+
3055
cmds.MustFind("lb", "frontend", "get").Override(frontendGetBuilder)
56+
cmds.MustFind("lb", "frontend", "create").Override(frontendCreateBuilder)
57+
cmds.MustFind("lb", "frontend", "update").Override(frontendUpdateBuilder)
58+
cmds.MustFind("lb", "frontend", "delete").Override(frontendDeleteBuilder)
59+
60+
cmds.MustFind("lb", "acl", "get").Override(ACLGetBuilder)
61+
cmds.MustFind("lb", "acl", "create").Override(ACLCreateBuilder)
62+
cmds.MustFind("lb", "acl", "update").Override(ACLUpdateBuilder)
63+
cmds.MustFind("lb", "acl", "delete").Override(ACLDeleteBuilder)
3164

65+
cmds.MustFind("lb", "certificate", "get").Override(certificateGetBuilder)
3266
cmds.MustFind("lb", "certificate", "create").Override(certificateCreateBuilder)
67+
cmds.MustFind("lb", "certificate", "update").Override(certificateUpdateBuilder)
68+
cmds.MustFind("lb", "certificate", "delete").Override(certificateDeleteBuilder)
3369

3470
return cmds
3571
}

internal/namespaces/lb/v1/custom_acl.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package lb
22

33
import (
4+
"context"
5+
"strings"
6+
47
"github.com/fatih/color"
8+
"github.com/scaleway/scaleway-cli/v2/internal/core"
59
"github.com/scaleway/scaleway-cli/v2/internal/human"
610
"github.com/scaleway/scaleway-sdk-go/api/lb/v1"
711
)
@@ -12,3 +16,79 @@ var (
1216
lb.ACLActionTypeDeny: &human.EnumMarshalSpec{Attribute: color.FgRed, Value: "deny"},
1317
}
1418
)
19+
20+
func lbACLMarshalerFunc(i interface{}, opt *human.MarshalOpt) (string, error) {
21+
type tmp lb.ACL
22+
acl := tmp(i.(lb.ACL))
23+
24+
opt.Sections = []*human.MarshalSection{
25+
{
26+
FieldName: "Frontend",
27+
},
28+
}
29+
30+
if len(acl.Frontend.LB.Tags) != 0 && acl.Frontend.LB.Tags[0] == kapsuleTag {
31+
ACLResp, err := human.Marshal(acl, opt)
32+
if err != nil {
33+
return "", err
34+
}
35+
return strings.Join([]string{
36+
ACLResp,
37+
warningKapsuleTaggedMessageView(),
38+
}, "\n\n"), nil
39+
}
40+
41+
str, err := human.Marshal(acl, opt)
42+
if err != nil {
43+
return "", err
44+
}
45+
46+
return str, nil
47+
}
48+
49+
func ACLGetBuilder(c *core.Command) *core.Command {
50+
c.Interceptor = interceptACL()
51+
return c
52+
}
53+
54+
func ACLCreateBuilder(c *core.Command) *core.Command {
55+
c.Interceptor = interceptACL()
56+
return c
57+
}
58+
59+
func ACLUpdateBuilder(c *core.Command) *core.Command {
60+
c.Interceptor = interceptACL()
61+
return c
62+
}
63+
64+
func ACLDeleteBuilder(c *core.Command) *core.Command {
65+
c.Interceptor = interceptACL()
66+
return c
67+
}
68+
69+
func interceptACL() core.CommandInterceptor {
70+
return func(ctx context.Context, argsI interface{}, runner core.CommandRunner) (interface{}, error) {
71+
client := core.ExtractClient(ctx)
72+
api := lb.NewZonedAPI(client)
73+
74+
res, err := runner(ctx, argsI)
75+
if err != nil {
76+
return nil, err
77+
}
78+
79+
if _, ok := res.(*core.SuccessResult); ok {
80+
getACL, err := api.GetACL(&lb.ZonedAPIGetACLRequest{
81+
Zone: argsI.(*lb.ZonedAPIDeleteACLRequest).Zone,
82+
ACLID: argsI.(*lb.ZonedAPIDeleteACLRequest).ACLID,
83+
})
84+
if err != nil {
85+
return nil, err
86+
}
87+
if len(getACL.Frontend.LB.Tags) != 0 && getACL.Frontend.LB.Tags[0] == kapsuleTag {
88+
return warningKapsuleTaggedMessageView(), nil
89+
}
90+
}
91+
92+
return res, nil
93+
}
94+
}

internal/namespaces/lb/v1/custom_backend.go

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package lb
22

33
import (
4+
"context"
5+
"strings"
6+
47
"github.com/fatih/color"
8+
"github.com/scaleway/scaleway-cli/v2/internal/core"
59
"github.com/scaleway/scaleway-cli/v2/internal/human"
610
"github.com/scaleway/scaleway-sdk-go/api/lb/v1"
711
)
@@ -38,10 +42,103 @@ func lbBackendMarshalerFunc(i interface{}, opt *human.MarshalOpt) (string, error
3842
},
3943
}
4044

45+
if len(backend.LB.Tags) != 0 && backend.LB.Tags[0] == kapsuleTag {
46+
backendResp, err := human.Marshal(backend, opt)
47+
if err != nil {
48+
return "", err
49+
}
50+
51+
return strings.Join([]string{
52+
backendResp,
53+
warningKapsuleTaggedMessageView(),
54+
}, "\n\n"), nil
55+
}
56+
4157
str, err := human.Marshal(backend, opt)
4258
if err != nil {
4359
return "", err
4460
}
4561

4662
return str, nil
4763
}
64+
65+
func backendGetBuilder(c *core.Command) *core.Command {
66+
c.Interceptor = interceptBackend()
67+
return c
68+
}
69+
70+
func backendCreateBuilder(c *core.Command) *core.Command {
71+
c.Interceptor = interceptBackend()
72+
return c
73+
}
74+
75+
func backendUpdateBuilder(c *core.Command) *core.Command {
76+
c.Interceptor = interceptBackend()
77+
return c
78+
}
79+
80+
func backendDeleteBuilder(c *core.Command) *core.Command {
81+
c.Interceptor = interceptBackend()
82+
return c
83+
}
84+
85+
func backendAddServersBuilder(c *core.Command) *core.Command {
86+
c.Interceptor = interceptBackend()
87+
return c
88+
}
89+
90+
func backendRemoveServersBuilder(c *core.Command) *core.Command {
91+
c.Interceptor = interceptBackend()
92+
return c
93+
}
94+
95+
func backendSetServersBuilder(c *core.Command) *core.Command {
96+
c.Interceptor = interceptBackend()
97+
return c
98+
}
99+
100+
func backendUpdateHealthcheckBuilder(c *core.Command) *core.Command {
101+
c.Interceptor = interceptBackend()
102+
return c
103+
}
104+
105+
func interceptBackend() core.CommandInterceptor {
106+
return func(ctx context.Context, argsI interface{}, runner core.CommandRunner) (interface{}, error) {
107+
client := core.ExtractClient(ctx)
108+
api := lb.NewZonedAPI(client)
109+
110+
res, err := runner(ctx, argsI)
111+
if err != nil {
112+
return nil, err
113+
}
114+
115+
switch res.(type) {
116+
case *core.SuccessResult:
117+
getBackend, err := api.GetBackend(&lb.ZonedAPIGetBackendRequest{
118+
Zone: argsI.(*lb.ZonedAPIDeleteBackendRequest).Zone,
119+
BackendID: argsI.(*lb.ZonedAPIDeleteBackendRequest).BackendID,
120+
})
121+
if err != nil {
122+
return nil, err
123+
}
124+
125+
if len(getBackend.LB.Tags) != 0 && getBackend.LB.Tags[0] == kapsuleTag {
126+
return warningKapsuleTaggedMessageView(), nil
127+
}
128+
case *lb.HealthCheck:
129+
getBackend, err := api.GetBackend(&lb.ZonedAPIGetBackendRequest{
130+
Zone: argsI.(*lb.ZonedAPIUpdateHealthCheckRequest).Zone,
131+
BackendID: argsI.(*lb.ZonedAPIUpdateHealthCheckRequest).BackendID,
132+
})
133+
if err != nil {
134+
return nil, err
135+
}
136+
137+
if len(getBackend.LB.Tags) != 0 && getBackend.LB.Tags[0] == kapsuleTag {
138+
return warningKapsuleTaggedMessageView(), nil
139+
}
140+
}
141+
142+
return res, nil
143+
}
144+
}

0 commit comments

Comments
 (0)