Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion internal/command/jobs/printers.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ func waitForJob(ctx context.Context, cfg *config.JobSubmit, outW, errW io.Writer
lastErrCursor := ""
looped := false

err := retry.Until(func() bool {
err := retry.Until(ctx, func(ctx context.Context) bool {
defer func() {
looped = true
}()
Expand Down
171 changes: 1 addition & 170 deletions internal/command/local/override/command.go
Original file line number Diff line number Diff line change
@@ -1,24 +1,7 @@
package override

import (
"context"
"fmt"
"io"
"net"
"net/http"
"os"
"os/signal"
"syscall"
"time"

"github.com/fatih/color"
"github.com/signadot/cli/internal/config"
sbmgr "github.com/signadot/cli/internal/locald/sandboxmanager"
"github.com/signadot/cli/internal/poll"
"github.com/signadot/cli/internal/utils"
"github.com/signadot/go-sdk/client/sandboxes"
"github.com/signadot/go-sdk/models"
"github.com/signadot/libconnect/common/override"
"github.com/spf13/cobra"
)

Expand Down Expand Up @@ -63,7 +46,7 @@ original sandboxed destination.`,
# Delete a specific override
signadot local override delete <name> --sandbox=<sandbox>`,
RunE: func(cmd *cobra.Command, args []string) error {
return runOverride(cmd.OutOrStdout(), cmd.ErrOrStderr(), cfg)
return runOverride(cmd.Context(), cmd.OutOrStdout(), cmd.ErrOrStderr(), cfg)
},
}

Expand All @@ -78,155 +61,3 @@ original sandboxed destination.`,

return cmd
}

func runOverride(out, errOut io.Writer, cfg *config.LocalOverrideCreate) error {
yellow := color.New(color.FgHiMagenta).SprintFunc()

if err := cfg.InitLocalConfig(); err != nil {
return err
}

if err := cfg.Validate(); err != nil {
return err
}

// Initialize API client
if err := cfg.API.InitAPIConfig(); err != nil {
return err
}

sandbox, err := getSandbox(cfg)
if err != nil {
return err
}

if err := validateWorkload(sandbox, cfg.Workload); err != nil {
return err
}

_, err = sbmgr.ValidateSandboxManager(sandbox.Spec.Cluster)
if err != nil {
return err
}

var (
logServer *http.Server
logListener net.Listener
)
logPort := 0
if !cfg.Detach {
logServer, logListener, logPort = createLogServer(cfg.Sandbox, cfg.To)
}

_, overrideName, unedit, err := createSandboxWithMiddleware(cfg, sandbox, cfg.Workload, logPort)
if err != nil {
return err
}

sandbox, err = utils.WaitForSandboxReady(cfg.API, out, cfg.Sandbox, cfg.WaitTimeout)
if err != nil {
unedit(errOut)
return err
}

if cfg.Detach {
fmt.Fprintf(out, "Overriding traffic from sandbox %q, workload %q, port %d to %s\n",
cfg.Sandbox, cfg.Workload, cfg.Port, cfg.To)

fmt.Fprintf(out, "Traffic override will persist after this session ends\n")

helperMessage := fmt.Sprintf("%s local override delete %s --sandbox=%s", os.Args[0], overrideName, cfg.Sandbox)
fmt.Fprintf(out, "To remove override, run:\n\t%s\n", yellow(helperMessage))

return nil
}
defer unedit(errOut)
// Set up signal handling for graceful shutdown
ctx, cancel := context.WithCancel(context.Background())
defer cancel()

startLogServer(ctx, logServer, logListener)
readiness := poll.NewPoll().Readiness(ctx, 5*time.Second, ckMatch(cfg, sandbox, overrideName))
defer readiness.Stop()
go readyLoop(ctx, cancel, readiness, errOut)

// Channel to listen for interrupt signal
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP)

// Wait for signal or context cancellation
select {
case <-sigChan:
fmt.Fprintf(out, "\nSession terminated\n")
printOverrideProgress(out, fmt.Sprintf("Removing override in %s", cfg.Sandbox))
if err := deleteMiddlewareFromSandbox(cfg, sandbox, overrideName); err != nil {
return err
}

case <-ctx.Done():
}

return nil
}

func printFormattedLogEntry(logEntry *override.LogEntry, sandboxName string, localAddress string) {
var status string
var routing string

switch {
case logEntry.StatusCode >= 200 && logEntry.StatusCode < 300:
status = color.New(color.FgGreen).Sprintf("%d", logEntry.StatusCode)
case logEntry.StatusCode >= 300 && logEntry.StatusCode < 400:
status = color.New(color.FgYellow).Sprintf("%d", logEntry.StatusCode)
case logEntry.StatusCode >= 400:
status = color.New(color.FgRed).Sprintf("%d", logEntry.StatusCode)
default:
status = fmt.Sprintf("%d", logEntry.StatusCode)
}

if logEntry.Overridden {
routing = color.New(color.FgCyan).Sprint("(" + localAddress + ")")
} else {
routing = color.New(color.FgBlue).Sprint("(" + sandboxName + ")")
}

fmt.Printf("%-20s %-7s %s -> %s\n",
routing,
logEntry.Method,
logEntry.Path,
status,
)
}

func getSandbox(cfg *config.LocalOverrideCreate) (*models.Sandbox, error) {
sandboxParams := sandboxes.NewGetSandboxParams().WithOrgName(cfg.Org).WithSandboxName(cfg.Sandbox)

resp, err := cfg.Client.Sandboxes.
GetSandbox(sandboxParams, nil)
if err != nil {
return nil, err
}
return resp.Payload, nil
}

func validateWorkload(sandbox *models.Sandbox, workload string) error {
for _, virtual := range sandbox.Spec.Virtual {
if virtual.Name == workload {
return nil
}
}

for _, fork := range sandbox.Spec.Forks {
if fork.Name == workload {
return nil
}
}

for _, local := range sandbox.Spec.Local {
if local.Name == workload {
return nil
}
}

return fmt.Errorf("workload %s not found in sandbox %s", workload, sandbox.Name)
}
53 changes: 13 additions & 40 deletions internal/command/local/override/delete.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
package override

import (
"context"
"fmt"
"io"
"os"
"os/signal"
"syscall"

"github.com/signadot/cli/internal/builder"
"github.com/signadot/cli/internal/config"
"github.com/signadot/go-sdk/client/sandboxes"
"github.com/signadot/cli/internal/utils"
"github.com/signadot/go-sdk/models"
"github.com/spf13/cobra"
)
Expand All @@ -32,6 +36,10 @@ Example:
}

func runDelete(out io.Writer, cfg *config.LocalOverrideDelete, name string) error {
ctx, cancel := signal.NotifyContext(context.Background(),
os.Interrupt, syscall.SIGTERM, syscall.SIGTERM, syscall.SIGHUP)
defer cancel()

if err := cfg.InitLocalConfig(); err != nil {
return err
}
Expand All @@ -41,16 +49,15 @@ func runDelete(out io.Writer, cfg *config.LocalOverrideDelete, name string) erro
return err
}

printOverrideProgress(out, fmt.Sprintf("Removing override %s from sandbox %s", name, cfg.Sandbox))

// Get the sandbox
sandbox, err := getSandboxForDelete(cfg)
sb, err := utils.GetSandbox(ctx, cfg.API, cfg.Sandbox)
if err != nil {
return err
}
printOverrideProgress(out, fmt.Sprintf("Removing override %s from sandbox %s", name, cfg.Sandbox))

// Verify the override exists in the sandbox and is not attached
overrideDetails := getOverrideDetails(sandbox, name)
overrideDetails := getOverrideDetails(sb, name)
switch {
case overrideDetails == nil:
return fmt.Errorf("override %s not found in sandbox %s", name, cfg.Sandbox)
Expand All @@ -59,7 +66,7 @@ func runDelete(out io.Writer, cfg *config.LocalOverrideDelete, name string) erro
}

// Delete the override from the sandbox
if err := deleteOverrideFromSandbox(cfg, sandbox, name); err != nil {
if err := deleteOverrideFromSandbox(ctx, cfg.API, sb, name); err != nil {
return err
}

Expand All @@ -68,17 +75,6 @@ func runDelete(out io.Writer, cfg *config.LocalOverrideDelete, name string) erro
return nil
}

func getSandboxForDelete(cfg *config.LocalOverrideDelete) (*models.Sandbox, error) {
sandboxParams := sandboxes.NewGetSandboxParams().WithOrgName(cfg.Org).WithSandboxName(cfg.Sandbox)

resp, err := cfg.Client.Sandboxes.
GetSandbox(sandboxParams, nil)
if err != nil {
return nil, err
}
return resp.Payload, nil
}

func getOverrideDetails(sandbox *models.Sandbox, overrideName string) *builder.DetailedOverrideMiddleware {
if sandbox.Spec.Routing == nil || sandbox.Spec.Routing.Forwards == nil {
return nil
Expand All @@ -95,26 +91,3 @@ func getOverrideDetails(sandbox *models.Sandbox, overrideName string) *builder.D

return detailsOverride
}

func deleteOverrideFromSandbox(cfg *config.LocalOverrideDelete, sandbox *models.Sandbox, overrideName string) error {
// Use the sandbox builder to delete the override
sbBuilder := builder.
BuildSandbox(cfg.Sandbox, builder.WithData(*sandbox)).
SetMachineID().
DeleteOverrideMiddleware(overrideName)

sb, err := sbBuilder.Build()
if err != nil {
return err
}

// Apply the updated sandbox
sbParams := sandboxes.
NewApplySandboxParams().
WithOrgName(cfg.Org).
WithSandboxName(cfg.Sandbox).
WithData(&sb)

_, err = cfg.Client.Sandboxes.ApplySandbox(sbParams, nil)
return err
}
Loading