124 lines
3 KiB
Go
124 lines
3 KiB
Go
package utils
|
|
|
|
import (
|
|
"bufio"
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"runtime"
|
|
"strings"
|
|
)
|
|
|
|
func WriteFile(path, content string) {
|
|
if err := os.WriteFile(path, []byte(content), 0644); err != nil {
|
|
fmt.Printf("[ERROR] Failed to write file %s: %v\n", path, err)
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
|
|
func CommandExists(cmd string) bool {
|
|
_, err := exec.LookPath(cmd)
|
|
return err == nil
|
|
}
|
|
|
|
func RunCommand(name string, args ...string) error {
|
|
cmd := exec.Command(name, args...)
|
|
cmd.Stdout = os.Stdout
|
|
cmd.Stderr = os.Stderr
|
|
return cmd.Run()
|
|
}
|
|
|
|
func RunCommandQuiet(name string, args ...string) error {
|
|
cmd := exec.Command(name, args...)
|
|
cmd.Stderr = os.Stderr
|
|
return cmd.Run()
|
|
}
|
|
|
|
func RunCommandInDir(dir string, name string, args ...string) error {
|
|
cmd := exec.Command(name, args...)
|
|
cmd.Dir = dir
|
|
cmd.Stdout = os.Stdout
|
|
cmd.Stderr = os.Stderr
|
|
return cmd.Run()
|
|
}
|
|
|
|
func RunCommandOutput(name string, args ...string) ([]byte, error) {
|
|
cmd := exec.Command(name, args...)
|
|
var stdout bytes.Buffer
|
|
cmd.Stdout = &stdout
|
|
cmd.Stderr = os.Stderr
|
|
if err := cmd.Run(); err != nil {
|
|
return nil, err
|
|
}
|
|
return stdout.Bytes(), nil
|
|
}
|
|
|
|
func RunCommandOutputInDir(dir string, name string, args ...string) ([]byte, error) {
|
|
cmd := exec.Command(name, args...)
|
|
cmd.Dir = dir
|
|
var stdout bytes.Buffer
|
|
cmd.Stdout = &stdout
|
|
cmd.Stderr = os.Stderr
|
|
if err := cmd.Run(); err != nil {
|
|
return nil, err
|
|
}
|
|
return stdout.Bytes(), nil
|
|
}
|
|
|
|
func RunCommandJSON(target any, name string, args ...string) error {
|
|
output, err := RunCommandOutput(name, args...)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return json.Unmarshal(output, target)
|
|
}
|
|
|
|
func HandleKubectlCacheError(err error) bool {
|
|
if err == nil || !strings.Contains(err.Error(), "no matches for kind") {
|
|
return false
|
|
}
|
|
|
|
fmt.Println("\n[DIAGNOSIS] A common kubectl cache issue was detected.")
|
|
fmt.Println("This happens when kubectl's local cache is out of sync with the cluster, often after installing new CRDs.")
|
|
fmt.Print("Would you like to attempt to clear the cache now? (y/N): ")
|
|
|
|
reader := bufio.NewReader(os.Stdin)
|
|
response, _ := reader.ReadString('\n')
|
|
|
|
if strings.TrimSpace(strings.ToLower(response)) != "y" {
|
|
fmt.Println("[INFO] Operation cancelled by user.")
|
|
return false
|
|
}
|
|
|
|
var cmd *exec.Cmd
|
|
var shell string
|
|
|
|
if runtime.GOOS == "windows" {
|
|
shell = "PowerShell"
|
|
cmd = exec.Command("powershell", "-NoProfile", "-NonInteractive", "-Command", "Remove-Item -Path $env:USERPROFILE\\.kube\\cache -Recurse -Force")
|
|
} else {
|
|
shell = "shell"
|
|
homeDir, homeErr := os.UserHomeDir()
|
|
if homeErr != nil {
|
|
fmt.Printf("[ERROR] Could not determine home directory to clear cache: %v\n", homeErr)
|
|
return false
|
|
}
|
|
cachePath := fmt.Sprintf("%s/.kube/cache", homeDir)
|
|
cmd = exec.Command("rm", "-rf", cachePath)
|
|
}
|
|
|
|
fmt.Printf("[INFO] Attempting to clear kubectl cache using %s...\n", shell)
|
|
cmd.Stdout = os.Stdout
|
|
cmd.Stderr = os.Stderr
|
|
|
|
if err := cmd.Run(); err != nil {
|
|
fmt.Printf("[ERROR] Failed to clear kubectl cache: %v\n", err)
|
|
return false
|
|
}
|
|
|
|
fmt.Println("[SUCCESS] Kubectl cache cleared successfully.")
|
|
return true
|
|
}
|