github.com/tilt-dev/tilt@v0.36.0/internal/k8s/kubeconfig/writer.go (about) 1 package kubeconfig 2 3 import ( 4 "context" 5 "fmt" 6 "os" 7 "path/filepath" 8 9 "github.com/spf13/afero" 10 "k8s.io/apimachinery/pkg/types" 11 "k8s.io/cli-runtime/pkg/printers" 12 "k8s.io/client-go/tools/clientcmd/api" 13 "k8s.io/client-go/tools/clientcmd/api/latest" 14 15 "github.com/tilt-dev/tilt/internal/xdg" 16 "github.com/tilt-dev/tilt/pkg/model" 17 ) 18 19 type Writer struct { 20 base xdg.Base 21 filesystem afero.Fs 22 apiServerName model.APIServerName 23 } 24 25 func NewWriter(base xdg.Base, filesystem afero.Fs, apiServerName model.APIServerName) *Writer { 26 return &Writer{ 27 base: base, 28 filesystem: filesystem, 29 apiServerName: apiServerName, 30 } 31 } 32 33 func (w *Writer) openFrozenKubeConfigFile(ctx context.Context, nn types.NamespacedName) (string, afero.File, error) { 34 path, err := w.base.RuntimeFile( 35 filepath.Join(string(w.apiServerName), "cluster", fmt.Sprintf("%s.yml", nn.Name))) 36 if err == nil { 37 var f afero.File 38 f, err = w.filesystem.OpenFile(path, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0600) 39 if err == nil { 40 return path, f, nil 41 } 42 } 43 44 path, err = w.base.StateFile( 45 filepath.Join(string(w.apiServerName), "cluster", fmt.Sprintf("%s.yml", nn.Name))) 46 if err != nil { 47 return "", nil, fmt.Errorf("storing temp kubeconfigs: %v", err) 48 } 49 50 f, err := w.filesystem.OpenFile(path, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0600) 51 if err != nil { 52 return "", nil, fmt.Errorf("storing temp kubeconfigs: %v", err) 53 } 54 return path, f, nil 55 } 56 57 func (w *Writer) WriteFrozenKubeConfig(ctx context.Context, nn types.NamespacedName, config *api.Config) (string, error) { 58 config = config.DeepCopy() 59 err := api.MinifyConfig(config) 60 if err != nil { 61 return "", fmt.Errorf("minifying Kubernetes config: %v", err) 62 } 63 64 err = api.FlattenConfig(config) 65 if err != nil { 66 return "", fmt.Errorf("flattening Kubernetes config: %v", err) 67 } 68 69 obj, err := latest.Scheme.ConvertToVersion(config, latest.ExternalVersion) 70 if err != nil { 71 return "", fmt.Errorf("converting Kubernetes config: %v", err) 72 } 73 74 printer := printers.YAMLPrinter{} 75 path, f, err := w.openFrozenKubeConfigFile(ctx, nn) 76 if err != nil { 77 return "", err 78 } 79 defer func() { 80 _ = f.Close() 81 }() 82 83 err = printer.PrintObj(obj, f) 84 if err != nil { 85 return "", fmt.Errorf("writing kubeconfig: %v", err) 86 } 87 return path, nil 88 }