pkg/controller/diagnose/diagnose.go (73 lines of code) (raw):

package diagnose import ( "context" "fmt" "os" "os/exec" "strconv" skoopContext "github.com/alibaba/kubeskoop/pkg/skoop/context" ) type Config struct { KubeConfig string `yaml:"kubeConfig"` CloudProvider string `yaml:"cloudProvider"` NetworkPlugin string `yaml:"networkPlugin"` ProxyModel string `yaml:"proxyModel"` ClusterCidr string `yaml:"clusterCidr"` ExtraArgs []string `yaml:"extraArgs"` } type Controller interface { Diagnose(ctx context.Context, taskConfig *skoopContext.TaskConfig) (string, error) } func NewDiagnoseController(namespace string, config *Config) Controller { // 1. build skoop global context return &Diagnostor{ namespace: namespace, config: config, } } type Diagnostor struct { namespace string config *Config } func (d *Diagnostor) Diagnose(ctx context.Context, taskConfig *skoopContext.TaskConfig) (string, error) { tempDir, err := os.MkdirTemp("/tmp", "skoop") if err != nil { return "", fmt.Errorf("failed create temp dir: %v", err) } defer os.RemoveAll(tempDir) resultStorage := fmt.Sprintf("%v/result.json", tempDir) args := []string{"--output", resultStorage, "--format", "json", "-s", taskConfig.Source, "-d", taskConfig.Destination.Address, "--dport", strconv.FormatUint(uint64(taskConfig.Destination.Port), 10), "--protocol", taskConfig.Protocol, "--collector-namespace", d.namespace, } if d.config != nil { args = append(args, buildArgsFromConfig(d.config)...) } cmd := exec.CommandContext(ctx, "skoop", args...) output, err := cmd.CombinedOutput() if err != nil { return "", fmt.Errorf("failed to diagnose: %v, output: %v", err, string(output)) } diagnoseResult, err := os.ReadFile(resultStorage) if err != nil { return "", fmt.Errorf("failed to read diagnose result: %v", err) } return string(diagnoseResult), nil } func buildArgsFromConfig(config *Config) []string { var args []string m := map[string]string{ "--cloud-provider": config.CloudProvider, "--network-plugin": config.NetworkPlugin, "--proxy-mode": config.ProxyModel, "--cluster-cidr": config.ClusterCidr, } for k, v := range m { if v != "" { args = append(args, k, v) } } return append(args, config.ExtraArgs...) }