Skip to content
Open
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
12 changes: 6 additions & 6 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,18 @@ require (
github.com/briandowns/spinner v1.23.0
github.com/cenkalti/backoff/v4 v4.3.0
github.com/fsnotify/fsnotify v1.7.0
github.com/go-openapi/errors v0.20.3
github.com/go-openapi/runtime v0.24.1
github.com/go-openapi/strfmt v0.21.3
github.com/go-openapi/swag v0.22.8
github.com/go-openapi/validate v0.22.0
github.com/google/go-cmp v0.6.0
github.com/google/uuid v1.6.0
github.com/gorilla/handlers v1.5.2
github.com/gorilla/mux v1.8.1
github.com/heimdalr/dag v1.5.0
github.com/interconnectedcloud/go-amqp v0.12.6-0.20200506124159-f51e540008b5
github.com/mattn/go-isatty v0.0.20
github.com/oapi-codegen/oapi-codegen/v2 v2.3.0
github.com/oapi-codegen/runtime v1.1.1
github.com/openshift/api v0.0.0-20210428205234-a8389931bee7
Expand All @@ -29,12 +33,12 @@ require (
golang.org/x/sys v0.28.0
golang.org/x/text v0.21.0
golang.org/x/time v0.5.0
gopkg.in/yaml.v3 v3.0.1
gotest.tools/v3 v3.5.1
k8s.io/api v0.31.0
k8s.io/apimachinery v0.31.0
k8s.io/client-go v0.31.0
k8s.io/code-generator v0.31.0
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8
sigs.k8s.io/yaml v1.4.0
)

Expand All @@ -58,13 +62,10 @@ require (
github.com/getkin/kin-openapi v0.124.0 // indirect
github.com/go-logr/logr v1.4.2 // indirect
github.com/go-openapi/analysis v0.21.2 // indirect
github.com/go-openapi/errors v0.20.3 // indirect
github.com/go-openapi/jsonpointer v0.20.2 // indirect
github.com/go-openapi/jsonreference v0.20.2 // indirect
github.com/go-openapi/loads v0.21.1 // indirect
github.com/go-openapi/spec v0.20.4 // indirect
github.com/go-openapi/swag v0.22.8 // indirect
github.com/go-openapi/validate v0.22.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/google/gnostic-models v0.6.8 // indirect
Expand All @@ -76,7 +77,6 @@ require (
github.com/json-iterator/go v1.1.12 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mitchellh/mapstructure v1.4.3 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
Expand All @@ -101,10 +101,10 @@ require (
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 // indirect
k8s.io/klog/v2 v2.130.1 // indirect
k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
)
111 changes: 111 additions & 0 deletions internal/cmd/skupper/debug/check/check.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
package check

import (
"github.com/skupperproject/skupper/api/types"
"github.com/skupperproject/skupper/internal/cmd/skupper/common/utils"
"github.com/skupperproject/skupper/internal/cmd/skupper/debug/check/cli"
"github.com/skupperproject/skupper/internal/cmd/skupper/debug/check/command"
"github.com/skupperproject/skupper/internal/cmd/skupper/debug/check/kube"
"github.com/skupperproject/skupper/internal/config"
"github.com/spf13/cobra"
"k8s.io/utils/ptr"
)

type cmdCheck struct {
cmd *cobra.Command
platformCommands map[types.Platform][]*command.Check
}

func NewCmdCheck() *cobra.Command {
checkCmd := cmdCheck{
platformCommands: map[types.Platform][]*command.Check{},
}

checkCmd.cmd = &cobra.Command{
Use: "check",
Short: "Run diagnostics",
Long: `Runs diagnostics to identify potential issues in the environment hosting Skupper`,
Example: `skupper debug check -p kubernetes`,
Run: func(cmd *cobra.Command, args []string) {
utils.HandleError(utils.GenericError, checkCmd.Run(cmd, args))
},
}

checkCmd.registerCommand(types.PlatformKubernetes, ptr.To(kube.NewCmdCheckK8sAccess()))
checkCmd.registerCommand(types.PlatformKubernetes, ptr.To(kube.NewCmdCheckK8sVersion()))
for _, cmds := range checkCmd.platformCommands {
for i := range cmds {
subCommand := *cmds[i]
cmd := &cobra.Command{
Use: subCommand.Name(),
Short: "check that " + subCommand.CheckDescription(),
Run: func(cmd *cobra.Command, args []string) {
status := cli.NewReporter()
defer status.End()
runCommandWithDeps(status, subCommand, map[string]bool{}, cmd)
},
}
// TODO Adjust "skupper" to args[0]
cmd.Example = "skupper debug check " + subCommand.Name()
checkCmd.cmd.AddCommand(cmd)
}
}

return checkCmd.cmd
}

func (c *cmdCheck) registerCommand(platform types.Platform, cmd *command.Check) {
c.platformCommands[platform] = append(c.platformCommands[platform], cmd)
}

func (c cmdCheck) Run(cmd *cobra.Command, args []string) error {
platform := config.GetPlatform()

// Run all available sub-commands, in dependency order (falling back to declaration order)
// In the map of processed dependencies, true indicates that the command previously ran successfully,
// false that it failed previously
processedDependencies := make(map[string]bool)

status := cli.NewReporter()
defer status.End()

for i := range c.platformCommands[platform] {
subCommand := *c.platformCommands[platform][i]
if _, seen := processedDependencies[subCommand.Name()]; seen {
// The command has already been run as a dependency, skip it
continue
}
_ = runCommandWithDeps(status, subCommand, processedDependencies, cmd)
}

// For UX consistency, errors are handled internally
return nil
}

func runCommandWithDeps(status cli.Reporter, dc command.Check, processed map[string]bool, cmd *cobra.Command) error {
dependencies := dc.Dependencies()
for i := range dependencies {
dependency := *dependencies[i]
if succeeded, seen := processed[dependency.Name()]; seen {
if succeeded {
// The command previously succeeded, skip it but continue
continue
}
// The command previously failed, stop (assuming that the previous run reported the error)
return nil
}
if err := runCommandWithDeps(status, dependency, processed, cmd); err != nil {
return err
}
}

status.Start("Checking that " + dc.CheckDescription())
if err := dc.Run(status, cmd); err != nil {
processed[dc.Name()] = false
return err
}

processed[dc.Name()] = true
status.Success("")
return nil
}
Loading