Skip to content

Commit

Permalink
Merge pull request #72 from chengleqi/issue-1106
Browse files Browse the repository at this point in the history
feat: Support set image operation for sidecarsets
  • Loading branch information
hantmac authored Mar 3, 2023
2 parents a27ae8c + b9a1b6f commit debf778
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 3 deletions.
26 changes: 23 additions & 3 deletions pkg/cmd/set/set_image.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package set
import (
"fmt"

kruiseappsv1alpha1 "github.com/openkruise/kruise-api/apps/v1alpha1"
"github.com/openkruise/kruise-tools/pkg/internal/polymorphichelpers"
"github.com/spf13/cobra"
corev1 "k8s.io/api/core/v1"
Expand Down Expand Up @@ -240,9 +241,15 @@ func (o *SetImageOptions) Run() error {
}
continue
}

initContainerFound := setImage(spec.InitContainers, name, resolvedImageName)
containerFound := setImage(spec.Containers, name, resolvedImageName)
var initContainerFound, containerFound bool
// Check if the type is kruiseappsv1alpha1.SidecarSet, and if the placeholder is nil.
if t, ok := obj.(*kruiseappsv1alpha1.SidecarSet); ok && spec == nil {
initContainerFound = setSideCarImage(t.Spec.InitContainers, name, resolvedImageName)
containerFound = setSideCarImage(t.Spec.Containers, name, resolvedImageName)
} else {
initContainerFound = setImage(spec.InitContainers, name, resolvedImageName)
containerFound = setImage(spec.Containers, name, resolvedImageName)
}
if !containerFound && !initContainerFound {
allErrs = append(allErrs, fmt.Errorf("error: unable to find container named %q", name))
}
Expand Down Expand Up @@ -316,6 +323,19 @@ func setImage(containers []corev1.Container, containerName string, image string)
return containerFound
}

// setSideCarImage
func setSideCarImage(containers []kruiseappsv1alpha1.SidecarContainer, containerName string, image string) bool {
containerFound := false
// Find the container to update, and update its image
for i, c := range containers {
if c.Name == containerName || containerName == "*" {
containerFound = true
containers[i].Image = image
}
}
return containerFound
}

// getResourcesAndImages retrieves resources and container name:images pair from given args
func getResourcesAndImages(args []string) (resources []string, containerImages map[string]string, err error) {
pairType := "image"
Expand Down
18 changes: 18 additions & 0 deletions pkg/cmd/set/set_image_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ import (
"strings"
"testing"

kruiseappsv1alpha1 "github.com/openkruise/kruise-api/apps/v1alpha1"

"github.com/stretchr/testify/assert"

appsv1 "k8s.io/api/apps/v1"
Expand Down Expand Up @@ -612,6 +614,22 @@ func TestSetImageRemote(t *testing.T) {
path: "/namespaces/test/replicationcontrollers/nginx",
args: []string{"replicationcontroller", "nginx", "*=thingy"},
},
{
name: "set image kruiseappsv1alpha1.SidecarSet",
object: &kruiseappsv1alpha1.SidecarSet{
ObjectMeta: metav1.ObjectMeta{Name: "nginx"},
Spec: kruiseappsv1alpha1.SidecarSetSpec{
Containers: []kruiseappsv1alpha1.SidecarContainer{
{
Container: corev1.Container{Name: "nginx", Image: "nginx"},
},
},
},
},
groupVersion: corev1.SchemeGroupVersion,
path: "/namespaces/test/sidecarsets/nginx",
args: []string{"sidecarsets", "nginx", "*=thingy"},
},
}
for _, input := range inputs {
t.Run(input.name, func(t *testing.T) {
Expand Down
6 changes: 6 additions & 0 deletions pkg/internal/polymorphichelpers/updatepodspec.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,12 @@ func updatePodSpecForObject(obj runtime.Object, fn func(*v1.PodSpec) error) (boo
return true, fn(&t.Spec.Template.Spec)
case *kruiseappsv1alpha1.DaemonSet:
return true, fn(&t.Spec.Template.Spec)
case *kruiseappsv1alpha1.SidecarSet:
// Because the fn function requires passing v1.PodSpec as a parameter,
// but kruiseappsv1alpha1.SidecarSet only has kruiseappsv1alpha1.SidecarContainer,
// and their types do not match.
// Therefore, passing nil as a placeholder here.
return true, fn(nil)
case *v1.Pod:
return true, fn(&t.Spec)
// ReplicationController
Expand Down

0 comments on commit debf778

Please sign in to comment.