diff --git a/internal/dao/ds.go b/internal/dao/ds.go index 78e99fdd..38d94ba6 100644 --- a/internal/dao/ds.go +++ b/internal/dao/ds.go @@ -21,11 +21,12 @@ import ( ) var ( - _ Accessor = (*DaemonSet)(nil) - _ Nuker = (*DaemonSet)(nil) - _ Loggable = (*DaemonSet)(nil) - _ Restartable = (*DaemonSet)(nil) - _ Controller = (*DaemonSet)(nil) + _ Accessor = (*DaemonSet)(nil) + _ Nuker = (*DaemonSet)(nil) + _ Loggable = (*DaemonSet)(nil) + _ Restartable = (*DaemonSet)(nil) + _ Controller = (*DaemonSet)(nil) + _ ContainsPodSpec = (*DaemonSet)(nil) ) // DaemonSet represents a K8s daemonset. @@ -225,6 +226,42 @@ func (d *DaemonSet) Scan(ctx context.Context, gvr, fqn string, wait bool) (Refs, return refs, nil } +func (d *DaemonSet) GetPodSpec(path string) (*v1.PodSpec, error) { + ds, err := d.GetInstance(path) + if err != nil { + return nil, err + } + podSpec := ds.Spec.Template.Spec + return &podSpec, nil +} + +func (d *DaemonSet) SetImages(ctx context.Context, path string, spec v1.PodSpec) error { + ns, n := client.Namespaced(path) + auth, err := d.Client().CanI(ns, "apps/v1/daemonset", []string{client.PatchVerb}) + if err != nil { + return err + } + if !auth { + return fmt.Errorf("user is not authorized to patch a daemonset") + } + jsonPatch, err := SetImageJsonPatch(spec) + if err != nil { + return err + } + dial, err := d.Client().Dial() + if err != nil { + return err + } + _, err = dial.AppsV1().DaemonSets(ns).Patch( + ctx, + n, + types.StrategicMergePatchType, + []byte(jsonPatch), + metav1.PatchOptions{}, + ) + return err +} + // ---------------------------------------------------------------------------- // Helpers... diff --git a/internal/view/ds.go b/internal/view/ds.go index 68334e51..587d8049 100644 --- a/internal/view/ds.go +++ b/internal/view/ds.go @@ -17,7 +17,9 @@ func NewDaemonSet(gvr client.GVR) ResourceViewer { d := DaemonSet{ ResourceViewer: NewPortForwardExtender( NewRestartExtender( - NewLogsExtender(NewBrowser(gvr), nil), + NewSetImageExtender( + NewLogsExtender(NewBrowser(gvr), nil), + ), ), ), }