Skip to content

Commit

Permalink
feat(lb): add warning on kapsule-tagged lbs (#2671)
Browse files Browse the repository at this point in the history
  • Loading branch information
yfodil authored Dec 14, 2022
1 parent 64e0c85 commit ce50296
Show file tree
Hide file tree
Showing 27 changed files with 6,317 additions and 2,385 deletions.
36 changes: 36 additions & 0 deletions internal/namespaces/lb/v1/custom.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,22 @@
package lb

import (
"github.com/fatih/color"
"github.com/scaleway/scaleway-cli/v2/internal/core"
"github.com/scaleway/scaleway-cli/v2/internal/human"
"github.com/scaleway/scaleway-cli/v2/internal/terminal"
"github.com/scaleway/scaleway-sdk-go/api/lb/v1"
)

const (
warningKapsuleTaggedMessage = "This resource is auto managed by Kapsule, all your modifications will be overwritten."
kapsuleTag = "kapsule"
)

func warningKapsuleTaggedMessageView() string {
return terminal.Style("Warning: ", color.Bold, color.FgRed) + warningKapsuleTaggedMessage
}

func GetCommands() *core.Commands {
human.RegisterMarshalerFunc(lb.LBTypeStock(""), human.EnumMarshalFunc(lbTypeStockMarshalSpecs))
human.RegisterMarshalerFunc(lb.LBStatus(""), human.EnumMarshalFunc(lbStatusMarshalSpecs))
Expand All @@ -15,6 +26,9 @@ func GetCommands() *core.Commands {
human.RegisterMarshalerFunc(lb.BackendServerStatsServerState(""), human.EnumMarshalFunc(backendServerStatsServerStateMarshalSpecs))
human.RegisterMarshalerFunc(lb.LB{}, lbMarshalerFunc)
human.RegisterMarshalerFunc(lb.Backend{}, lbBackendMarshalerFunc)
human.RegisterMarshalerFunc(lb.Frontend{}, lbFrontendMarshalerFunc)
human.RegisterMarshalerFunc(lb.Certificate{}, lbCertificateMarshalerFunc)
human.RegisterMarshalerFunc(lb.ACL{}, lbACLMarshalerFunc)

cmds := GetGeneratedCommands()

Expand All @@ -25,11 +39,33 @@ func GetCommands() *core.Commands {
cmds.MustFind("lb", "lb", "create").Override(lbCreateBuilder)
cmds.MustFind("lb", "lb", "get").Override(lbGetBuilder)
cmds.MustFind("lb", "lb", "migrate").Override(lbMigrateBuilder)
cmds.MustFind("lb", "lb", "update").Override(lbUpdateBuilder)
cmds.MustFind("lb", "lb", "delete").Override(lbDeleteBuilder)
cmds.MustFind("lb", "lb", "get-stats").Override(lbGetStatsBuilder)

cmds.MustFind("lb", "backend", "get").Override(backendGetBuilder)
cmds.MustFind("lb", "backend", "create").Override(backendCreateBuilder)
cmds.MustFind("lb", "backend", "update").Override(backendUpdateBuilder)
cmds.MustFind("lb", "backend", "delete").Override(backendDeleteBuilder)
cmds.MustFind("lb", "backend", "add-servers").Override(backendAddServersBuilder)
cmds.MustFind("lb", "backend", "remove-servers").Override(backendRemoveServersBuilder)
cmds.MustFind("lb", "backend", "set-servers").Override(backendSetServersBuilder)
cmds.MustFind("lb", "backend", "update-healthcheck").Override(backendUpdateHealthcheckBuilder)

cmds.MustFind("lb", "frontend", "get").Override(frontendGetBuilder)
cmds.MustFind("lb", "frontend", "create").Override(frontendCreateBuilder)
cmds.MustFind("lb", "frontend", "update").Override(frontendUpdateBuilder)
cmds.MustFind("lb", "frontend", "delete").Override(frontendDeleteBuilder)

cmds.MustFind("lb", "acl", "get").Override(ACLGetBuilder)
cmds.MustFind("lb", "acl", "create").Override(ACLCreateBuilder)
cmds.MustFind("lb", "acl", "update").Override(ACLUpdateBuilder)
cmds.MustFind("lb", "acl", "delete").Override(ACLDeleteBuilder)

cmds.MustFind("lb", "certificate", "get").Override(certificateGetBuilder)
cmds.MustFind("lb", "certificate", "create").Override(certificateCreateBuilder)
cmds.MustFind("lb", "certificate", "update").Override(certificateUpdateBuilder)
cmds.MustFind("lb", "certificate", "delete").Override(certificateDeleteBuilder)

return cmds
}
80 changes: 80 additions & 0 deletions internal/namespaces/lb/v1/custom_acl.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package lb

import (
"context"
"strings"

"github.com/fatih/color"
"github.com/scaleway/scaleway-cli/v2/internal/core"
"github.com/scaleway/scaleway-cli/v2/internal/human"
"github.com/scaleway/scaleway-sdk-go/api/lb/v1"
)
Expand All @@ -12,3 +16,79 @@ var (
lb.ACLActionTypeDeny: &human.EnumMarshalSpec{Attribute: color.FgRed, Value: "deny"},
}
)

func lbACLMarshalerFunc(i interface{}, opt *human.MarshalOpt) (string, error) {
type tmp lb.ACL
acl := tmp(i.(lb.ACL))

opt.Sections = []*human.MarshalSection{
{
FieldName: "Frontend",
},
}

if len(acl.Frontend.LB.Tags) != 0 && acl.Frontend.LB.Tags[0] == kapsuleTag {
ACLResp, err := human.Marshal(acl, opt)
if err != nil {
return "", err
}
return strings.Join([]string{
ACLResp,
warningKapsuleTaggedMessageView(),
}, "\n\n"), nil
}

str, err := human.Marshal(acl, opt)
if err != nil {
return "", err
}

return str, nil
}

func ACLGetBuilder(c *core.Command) *core.Command {
c.Interceptor = interceptACL()
return c
}

func ACLCreateBuilder(c *core.Command) *core.Command {
c.Interceptor = interceptACL()
return c
}

func ACLUpdateBuilder(c *core.Command) *core.Command {
c.Interceptor = interceptACL()
return c
}

func ACLDeleteBuilder(c *core.Command) *core.Command {
c.Interceptor = interceptACL()
return c
}

func interceptACL() core.CommandInterceptor {
return func(ctx context.Context, argsI interface{}, runner core.CommandRunner) (interface{}, error) {
client := core.ExtractClient(ctx)
api := lb.NewZonedAPI(client)

res, err := runner(ctx, argsI)
if err != nil {
return nil, err
}

if _, ok := res.(*core.SuccessResult); ok {
getACL, err := api.GetACL(&lb.ZonedAPIGetACLRequest{
Zone: argsI.(*lb.ZonedAPIDeleteACLRequest).Zone,
ACLID: argsI.(*lb.ZonedAPIDeleteACLRequest).ACLID,
})
if err != nil {
return nil, err
}
if len(getACL.Frontend.LB.Tags) != 0 && getACL.Frontend.LB.Tags[0] == kapsuleTag {
return warningKapsuleTaggedMessageView(), nil
}
}

return res, nil
}
}
97 changes: 97 additions & 0 deletions internal/namespaces/lb/v1/custom_backend.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package lb

import (
"context"
"strings"

"github.com/fatih/color"
"github.com/scaleway/scaleway-cli/v2/internal/core"
"github.com/scaleway/scaleway-cli/v2/internal/human"
"github.com/scaleway/scaleway-sdk-go/api/lb/v1"
)
Expand Down Expand Up @@ -38,10 +42,103 @@ func lbBackendMarshalerFunc(i interface{}, opt *human.MarshalOpt) (string, error
},
}

if len(backend.LB.Tags) != 0 && backend.LB.Tags[0] == kapsuleTag {
backendResp, err := human.Marshal(backend, opt)
if err != nil {
return "", err
}

return strings.Join([]string{
backendResp,
warningKapsuleTaggedMessageView(),
}, "\n\n"), nil
}

str, err := human.Marshal(backend, opt)
if err != nil {
return "", err
}

return str, nil
}

func backendGetBuilder(c *core.Command) *core.Command {
c.Interceptor = interceptBackend()
return c
}

func backendCreateBuilder(c *core.Command) *core.Command {
c.Interceptor = interceptBackend()
return c
}

func backendUpdateBuilder(c *core.Command) *core.Command {
c.Interceptor = interceptBackend()
return c
}

func backendDeleteBuilder(c *core.Command) *core.Command {
c.Interceptor = interceptBackend()
return c
}

func backendAddServersBuilder(c *core.Command) *core.Command {
c.Interceptor = interceptBackend()
return c
}

func backendRemoveServersBuilder(c *core.Command) *core.Command {
c.Interceptor = interceptBackend()
return c
}

func backendSetServersBuilder(c *core.Command) *core.Command {
c.Interceptor = interceptBackend()
return c
}

func backendUpdateHealthcheckBuilder(c *core.Command) *core.Command {
c.Interceptor = interceptBackend()
return c
}

func interceptBackend() core.CommandInterceptor {
return func(ctx context.Context, argsI interface{}, runner core.CommandRunner) (interface{}, error) {
client := core.ExtractClient(ctx)
api := lb.NewZonedAPI(client)

res, err := runner(ctx, argsI)
if err != nil {
return nil, err
}

switch res.(type) {
case *core.SuccessResult:
getBackend, err := api.GetBackend(&lb.ZonedAPIGetBackendRequest{
Zone: argsI.(*lb.ZonedAPIDeleteBackendRequest).Zone,
BackendID: argsI.(*lb.ZonedAPIDeleteBackendRequest).BackendID,
})
if err != nil {
return nil, err
}

if len(getBackend.LB.Tags) != 0 && getBackend.LB.Tags[0] == kapsuleTag {
return warningKapsuleTaggedMessageView(), nil
}
case *lb.HealthCheck:
getBackend, err := api.GetBackend(&lb.ZonedAPIGetBackendRequest{
Zone: argsI.(*lb.ZonedAPIUpdateHealthCheckRequest).Zone,
BackendID: argsI.(*lb.ZonedAPIUpdateHealthCheckRequest).BackendID,
})
if err != nil {
return nil, err
}

if len(getBackend.LB.Tags) != 0 && getBackend.LB.Tags[0] == kapsuleTag {
return warningKapsuleTaggedMessageView(), nil
}
}

return res, nil
}
}
Loading

0 comments on commit ce50296

Please sign in to comment.