github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/cli/create_helper.go (about) 1 package cli 2 3 import ( 4 "context" 5 6 "github.com/spf13/cobra" 7 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 8 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" 9 "k8s.io/apimachinery/pkg/runtime" 10 "k8s.io/cli-runtime/pkg/genericclioptions" 11 "k8s.io/cli-runtime/pkg/printers" 12 "k8s.io/client-go/dynamic" 13 14 "github.com/tilt-dev/tilt-apiserver/pkg/server/builder/resource" 15 ) 16 17 // Helper for human-friendly CLI for creating objects. 18 // 19 // See other create commands for usage examples. 20 type createHelper struct { 21 streams genericclioptions.IOStreams 22 printFlags *genericclioptions.PrintFlags 23 dynamicClient dynamic.Interface 24 printer printers.ResourcePrinter 25 } 26 27 func newCreateHelper(streams genericclioptions.IOStreams) *createHelper { 28 return &createHelper{ 29 streams: streams, 30 printFlags: genericclioptions.NewPrintFlags("created"), 31 } 32 } 33 34 func (h *createHelper) addFlags(cmd *cobra.Command) { 35 h.printFlags.AddFlags(cmd) 36 addConnectServerFlags(cmd) 37 } 38 39 func (h *createHelper) interpretFlags(ctx context.Context) error { 40 printer, err := h.printFlags.ToPrinter() 41 if err != nil { 42 return err 43 } 44 h.printer = printer 45 46 dynamicClient, err := h.createDynamicClient(ctx) 47 if err != nil { 48 return err 49 } 50 h.dynamicClient = dynamicClient 51 return nil 52 } 53 54 func (h *createHelper) create(ctx context.Context, resourceObj resource.Object) error { 55 obj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(resourceObj) 56 if err != nil { 57 return err 58 } 59 60 result, err := h.dynamicClient.Resource(resourceObj.GetGroupVersionResource()). 61 Create(ctx, &unstructured.Unstructured{Object: obj}, metav1.CreateOptions{}) 62 if err != nil { 63 return err 64 } 65 66 return h.printer.PrintObj(result, h.streams.Out) 67 } 68 69 // Loads a dynamically typed tilt client. 70 func (h *createHelper) createDynamicClient(ctx context.Context) (dynamic.Interface, error) { 71 getter, err := wireClientGetter(ctx) 72 if err != nil { 73 return nil, err 74 } 75 76 config, err := getter.ToRESTConfig() 77 if err != nil { 78 return nil, err 79 } 80 return dynamic.NewForConfig(config) 81 }