package dao import ( "encoding/json" v1 "k8s.io/api/core/v1" ) type JsonPatch struct { Spec Spec `json:"spec"` } type Spec struct { Template Template `json:"template"` } type Template struct { Spec ImagesSpec `json:"spec"` } type ImagesSpec struct { SetElementOrderContainers []Element `json:"$setElementOrder/containers,omitempty"` SetElementOrderInitContainers []Element `json:"$setElementOrder/initContainers,omitempty"` Containers []Element `json:"containers,omitempty"` InitContainers []Element `json:"initContainers,omitempty"` } type Element struct { Image string `json:"image,omitempty"` Name string `json:"name"` } // Build a json patch string to update PodSpec images func SetImageJsonPatch(spec v1.PodSpec) (string, error) { jsonPatch := JsonPatch{ Spec: Spec{ Template: Template{ Spec: ImagesSpec{ SetElementOrderContainers: extractElements(spec.Containers, false), Containers: extractElements(spec.Containers, true), SetElementOrderInitContainers: extractElements(spec.InitContainers, false), InitContainers: extractElements(spec.InitContainers, true), }, }, }, } bytes, err := json.Marshal(jsonPatch) return string(bytes), err } func extractElements(containers []v1.Container, withImage bool) []Element { elements := make([]Element, 0) for _, c := range containers { if withImage { elements = append(elements, Element{Name: c.Name, Image: c.Image}) } else { elements = append(elements, Element{Name: c.Name}) } } return elements }