97 lines
2.7 KiB
Go
97 lines
2.7 KiB
Go
package utils
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"runtime"
|
|
"strings"
|
|
)
|
|
|
|
// WriteFile writes content to a file, exiting on error.
|
|
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)
|
|
}
|
|
}
|
|
|
|
// CommandExists checks if a command exists in the system's PATH.
|
|
func CommandExists(cmd string) bool {
|
|
_, err := exec.LookPath(cmd)
|
|
return err == nil
|
|
}
|
|
|
|
// RunCommand runs a command with its output visible to the user.
|
|
func RunCommand(name string, args ...string) error {
|
|
cmd := exec.Command(name, args...)
|
|
cmd.Stdout = os.Stdout
|
|
cmd.Stderr = os.Stderr
|
|
return cmd.Run()
|
|
}
|
|
|
|
// RunCommandQuiet runs a command without printing its stdout.
|
|
func RunCommandQuiet(name string, args ...string) error {
|
|
cmd := exec.Command(name, args...)
|
|
cmd.Stderr = os.Stderr
|
|
return cmd.Run()
|
|
}
|
|
|
|
// RunCommandInDir runs a command in a specific directory.
|
|
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()
|
|
}
|
|
|
|
// HandleKubectlCacheError detects a specific kubectl cache error and offers an interactive fix.
|
|
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, err := os.UserHomeDir()
|
|
if err != nil {
|
|
fmt.Printf("[ERROR] Could not determine home directory to clear cache: %v\n", err)
|
|
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
|
|
}
|