diff --git a/operator/pkg/util/patcher/pather.go b/operator/pkg/util/patcher/pather.go index 5c11ab616f31..9e8bd17de540 100644 --- a/operator/pkg/util/patcher/pather.go +++ b/operator/pkg/util/patcher/pather.go @@ -150,26 +150,28 @@ func (p *Patcher) ForDeployment(deployment *appsv1.Deployment) { if len(p.extraArgs) != 0 || len(p.featureGates) != 0 { // It's considered the first container is the karmada component by default. baseArguments := deployment.Spec.Template.Spec.Containers[0].Command - argsMap := parseArgumentListToMap(baseArguments) + if len(baseArguments) != 0 { + argsMap := parseArgumentListToMap(baseArguments) - overrideArgs := map[string]string{} + overrideArgs := map[string]string{} - // merge featureGates and build to an argument. - if len(p.featureGates) != 0 { - baseFeatureGates := map[string]bool{} + // merge featureGates and build to an argument. + if len(p.featureGates) != 0 { + baseFeatureGates := map[string]bool{} - if argument, ok := argsMap["feature-gates"]; ok { - baseFeatureGates = parseFeatrueGatesArgumentToMap(argument) + if argument, ok := argsMap["feature-gates"]; ok { + baseFeatureGates = parseFeatrueGatesArgumentToMap(argument) + } + overrideArgs["feature-gates"] = buildFeatureGatesArgumentFromMap(baseFeatureGates, p.featureGates) } - overrideArgs["feature-gates"] = buildFeatureGatesArgumentFromMap(baseFeatureGates, p.featureGates) - } - maps.Copy(overrideArgs, p.extraArgs) + maps.Copy(overrideArgs, p.extraArgs) - // the first argument is most often the binary name - command := []string{baseArguments[0]} - command = append(command, buildArgumentListFromMap(argsMap, overrideArgs)...) - deployment.Spec.Template.Spec.Containers[0].Command = command + // the first argument is most often the binary name + command := []string{baseArguments[0]} + command = append(command, buildArgumentListFromMap(argsMap, overrideArgs)...) + deployment.Spec.Template.Spec.Containers[0].Command = command + } } deployment.Spec.Template.Spec.Containers = append(deployment.Spec.Template.Spec.Containers, p.sidecarContainers...) // Add extra volumes and volume mounts diff --git a/operator/pkg/util/patcher/pather_test.go b/operator/pkg/util/patcher/pather_test.go index 6a5f3acb85a1..329194cccc7a 100644 --- a/operator/pkg/util/patcher/pather_test.go +++ b/operator/pkg/util/patcher/pather_test.go @@ -180,6 +180,58 @@ func TestPatchForDeployment(t *testing.T) { }, }, }, + { + name: "PatchForDeployment_WithExtraArgsAndEmptyCommand_Patched", + patcher: &Patcher{ + extraArgs: map[string]string{ + "some-arg": "some-value", + }, + }, + deployment: &appsv1.Deployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-deployment", + Namespace: "test", + }, + Spec: appsv1.DeploymentSpec{ + Template: corev1.PodTemplateSpec{ + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Name: "test-container", + Image: "nginx:latest", + Args: []string{"run", "--existing=1"}, + }, + }, + }, + }, + }, + }, + want: &appsv1.Deployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-deployment", + Namespace: "test", + Labels: map[string]string{}, + Annotations: map[string]string{}, + }, + Spec: appsv1.DeploymentSpec{ + Template: corev1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{}, + Annotations: map[string]string{}, + }, + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Name: "test-container", + Image: "nginx:latest", + Args: []string{"run", "--existing=1"}, + }, + }, + }, + }, + }, + }, + }, { name: "PatchForDeployment_WithExtraVolumesAndVolumeMounts_Patched", patcher: &Patcher{