package clientutil
import (
"encoding/json"
"fmt"
v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/util/strategicpatch"
)
func MergePatchContainers(base, patches []v1.Container) ([]v1.Container, error) {
var out []v1.Container
containersToPatch := make(map[string]v1.Container)
for _, c := range patches {
containersToPatch[c.Name] = c
}
for _, container := range base {
if patchContainer, ok := containersToPatch[container.Name]; ok {
containerBytes, err := json.Marshal(container)
if err != nil {
return nil, fmt.Errorf("failed to marshal json for container %s: %w", container.Name, err)
}
patchBytes, err := json.Marshal(patchContainer)
if err != nil {
return nil, fmt.Errorf("failed to marshal json for patch container %s: %w", container.Name, err)
}
jsonResult, err := strategicpatch.StrategicMergePatch(containerBytes, patchBytes, v1.Container{})
if err != nil {
return nil, fmt.Errorf("failed to generate merge patch for %s: %w", container.Name, err)
}
var patchResult v1.Container
if err := json.Unmarshal(jsonResult, &patchResult); err != nil {
return nil, fmt.Errorf("failed to unmarshal merged container %s: %w", container.Name, err)
}
out = append(out, patchResult)
delete(containersToPatch, container.Name)
} else {
out = append(out, container)
}
}
for _, container := range patches {
if _, ok := containersToPatch[container.Name]; ok {
out = append(out, container)
}
}
return out, nil
}