feat(set_image): add set image feature for statefulset
parent
b00c77f477
commit
3905ef7d02
|
|
@ -9,6 +9,7 @@ import (
|
||||||
"github.com/derailed/k9s/internal/client"
|
"github.com/derailed/k9s/internal/client"
|
||||||
"github.com/rs/zerolog/log"
|
"github.com/rs/zerolog/log"
|
||||||
appsv1 "k8s.io/api/apps/v1"
|
appsv1 "k8s.io/api/apps/v1"
|
||||||
|
v1 "k8s.io/api/core/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||||
"k8s.io/apimachinery/pkg/labels"
|
"k8s.io/apimachinery/pkg/labels"
|
||||||
|
|
@ -18,12 +19,13 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
_ Accessor = (*StatefulSet)(nil)
|
_ Accessor = (*StatefulSet)(nil)
|
||||||
_ Nuker = (*StatefulSet)(nil)
|
_ Nuker = (*StatefulSet)(nil)
|
||||||
_ Loggable = (*StatefulSet)(nil)
|
_ Loggable = (*StatefulSet)(nil)
|
||||||
_ Restartable = (*StatefulSet)(nil)
|
_ Restartable = (*StatefulSet)(nil)
|
||||||
_ Scalable = (*StatefulSet)(nil)
|
_ Scalable = (*StatefulSet)(nil)
|
||||||
_ Controller = (*StatefulSet)(nil)
|
_ Controller = (*StatefulSet)(nil)
|
||||||
|
_ ContainsPodSpec = (*StatefulSet)(nil)
|
||||||
)
|
)
|
||||||
|
|
||||||
// StatefulSet represents a K8s sts.
|
// StatefulSet represents a K8s sts.
|
||||||
|
|
@ -219,3 +221,39 @@ func (s *StatefulSet) Scan(ctx context.Context, gvr, fqn string, wait bool) (Ref
|
||||||
|
|
||||||
return refs, nil
|
return refs, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *StatefulSet) GetPodSpec(path string) (*v1.PodSpec, error) {
|
||||||
|
sts, err := s.getStatefulSet(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
podSpec := sts.Spec.Template.Spec
|
||||||
|
return &podSpec, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *StatefulSet) SetImages(ctx context.Context, path string, spec v1.PodSpec) error {
|
||||||
|
ns, n := client.Namespaced(path)
|
||||||
|
auth, err := s.Client().CanI(ns, "apps/v1/statefulset", []string{client.PatchVerb})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !auth {
|
||||||
|
return fmt.Errorf("user is not authorized to patch a statefulset")
|
||||||
|
}
|
||||||
|
jsonPatch, err := GetTemplateJsonPatch(spec)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
dial, err := s.Client().Dial()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = dial.AppsV1().StatefulSets(ns).Patch(
|
||||||
|
ctx,
|
||||||
|
n,
|
||||||
|
types.StrategicMergePatchType,
|
||||||
|
[]byte(jsonPatch),
|
||||||
|
metav1.PatchOptions{},
|
||||||
|
)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,9 @@ func NewStatefulSet(gvr client.GVR) ResourceViewer {
|
||||||
ResourceViewer: NewPortForwardExtender(
|
ResourceViewer: NewPortForwardExtender(
|
||||||
NewRestartExtender(
|
NewRestartExtender(
|
||||||
NewScaleExtender(
|
NewScaleExtender(
|
||||||
NewLogsExtender(NewBrowser(gvr), nil),
|
NewSetImageExtender(
|
||||||
|
NewLogsExtender(NewBrowser(gvr), nil),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue