Skip to content

Commit 210ac04

Browse files
authored
Merge pull request #4815 from XiShanYongYe-Chang/add-image-pull-policy-for-karmadactl-init
Add image-pull-policy flag for karmada init cmd
2 parents d42c2a8 + 4e82522 commit 210ac04

File tree

4 files changed

+43
-12
lines changed

4 files changed

+43
-12
lines changed

pkg/karmadactl/cmdinit/cmdinit.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"strings"
2222

2323
"github.com/spf13/cobra"
24+
corev1 "k8s.io/api/core/v1"
2425
"k8s.io/klog/v2"
2526
"k8s.io/kubectl/pkg/util/templates"
2627

@@ -114,6 +115,7 @@ func NewCmdInit(parentCommand string) *cobra.Command {
114115
}
115116
flags := cmd.Flags()
116117
flags.StringVarP(&opts.ImageRegistry, "private-image-registry", "", "", "Private image registry where pull images from. If set, all required images will be downloaded from it, it would be useful in offline installation scenarios. In addition, you still can use --kube-image-registry to specify the registry for Kubernetes's images.")
118+
flags.StringVarP(&opts.ImagePullPolicy, "image-pull-policy", "", string(corev1.PullIfNotPresent), "The image pull policy for all Karmada components container. One of Always, Never, IfNotPresent. Defaults to IfNotPresent.")
117119
flags.StringSliceVar(&opts.PullSecrets, "image-pull-secrets", nil, "Image pull secrets are used to pull images from the private registry, could be secret list separated by comma (e.g '--image-pull-secrets PullSecret1,PullSecret2', the secrets should be pre-settled in the namespace declared by '--namespace')")
118120
// kube image registry
119121
flags.StringVarP(&opts.KubeImageMirrorCountry, "kube-image-mirror-country", "", "", "Country code of the kube image registry to be used. For Chinese mainland users, set it to cn")

pkg/karmadactl/cmdinit/kubernetes/deploy.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ func init() {
124124
// CommandInitOption holds all flags options for init.
125125
type CommandInitOption struct {
126126
ImageRegistry string
127+
ImagePullPolicy string
127128
KubeImageRegistry string
128129
KubeImageMirrorCountry string
129130
KubeImageTag string
@@ -218,15 +219,20 @@ func (i *CommandInitOption) isExternalEtcdProvided() bool {
218219
}
219220

220221
// Validate Check that there are enough flags to run the command.
221-
//
222-
//nolint:gocyclo
223222
func (i *CommandInitOption) Validate(parentCommand string) error {
224223
if i.KarmadaAPIServerAdvertiseAddress != "" {
225224
if netutils.ParseIPSloppy(i.KarmadaAPIServerAdvertiseAddress) == nil {
226225
return fmt.Errorf("karmada apiserver advertise address is not valid")
227226
}
228227
}
229228

229+
switch i.ImagePullPolicy {
230+
case string(corev1.PullAlways), string(corev1.PullIfNotPresent), string(corev1.PullNever):
231+
// continue
232+
default:
233+
return fmt.Errorf("invalid image pull policy: %s", i.ImagePullPolicy)
234+
}
235+
230236
if i.isExternalEtcdProvided() {
231237
return i.validateExternalEtcd(parentCommand)
232238
}

pkg/karmadactl/cmdinit/kubernetes/deploy_test.go

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"testing"
2424
"time"
2525

26+
corev1 "k8s.io/api/core/v1"
2627
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2728
"k8s.io/client-go/kubernetes/fake"
2829

@@ -75,6 +76,7 @@ func TestCommandInitOption_Validate(t *testing.T) {
7576
name: "Invalid KarmadaAPIServerAdvertiseAddress",
7677
opt: CommandInitOption{
7778
KarmadaAPIServerAdvertiseAddress: "111",
79+
ImagePullPolicy: string(corev1.PullIfNotPresent),
7880
},
7981
wantErr: true,
8082
errorMsg: "CommandInitOption.Validate() does not return err when KarmadaAPIServerAdvertiseAddress is wrong",
@@ -85,6 +87,7 @@ func TestCommandInitOption_Validate(t *testing.T) {
8587
KarmadaAPIServerAdvertiseAddress: "192.0.2.1",
8688
EtcdStorageMode: etcdStorageModeHostPath,
8789
EtcdHostDataPath: "",
90+
ImagePullPolicy: string(corev1.PullIfNotPresent),
8891
},
8992
wantErr: true,
9093
errorMsg: "CommandInitOption.Validate() does not return err when EtcdHostDataPath is empty",
@@ -96,6 +99,7 @@ func TestCommandInitOption_Validate(t *testing.T) {
9699
EtcdStorageMode: etcdStorageModeHostPath,
97100
EtcdHostDataPath: "/data",
98101
EtcdNodeSelectorLabels: "key",
102+
ImagePullPolicy: string(corev1.PullIfNotPresent),
99103
},
100104
wantErr: true,
101105
errorMsg: "CommandInitOption.Validate() does not return err when EtcdNodeSelectorLabels is %v",
@@ -108,6 +112,7 @@ func TestCommandInitOption_Validate(t *testing.T) {
108112
EtcdHostDataPath: "/data",
109113
EtcdNodeSelectorLabels: "key=value",
110114
EtcdReplicas: 2,
115+
ImagePullPolicy: string(corev1.PullIfNotPresent),
111116
},
112117
wantErr: true,
113118
errorMsg: "CommandInitOption.Validate() does not return err when EtcdReplicas is %v",
@@ -121,6 +126,7 @@ func TestCommandInitOption_Validate(t *testing.T) {
121126
EtcdNodeSelectorLabels: "key=value",
122127
EtcdReplicas: 1,
123128
StorageClassesName: "",
129+
ImagePullPolicy: string(corev1.PullIfNotPresent),
124130
},
125131
wantErr: true,
126132
errorMsg: "CommandInitOption.Validate() does not return err when StorageClassesName is empty",
@@ -130,6 +136,7 @@ func TestCommandInitOption_Validate(t *testing.T) {
130136
opt: CommandInitOption{
131137
KarmadaAPIServerAdvertiseAddress: "192.0.2.1",
132138
EtcdStorageMode: "unknown",
139+
ImagePullPolicy: string(corev1.PullIfNotPresent),
133140
},
134141
wantErr: true,
135142
errorMsg: "CommandInitOption.Validate() does not return err when EtcdStorageMode is unknown",
@@ -139,6 +146,7 @@ func TestCommandInitOption_Validate(t *testing.T) {
139146
opt: CommandInitOption{
140147
KarmadaAPIServerAdvertiseAddress: "192.0.2.1",
141148
EtcdStorageMode: etcdStorageModeEmptyDir,
149+
ImagePullPolicy: string(corev1.PullIfNotPresent),
142150
},
143151
wantErr: false,
144152
errorMsg: "CommandInitOption.Validate() returns err when EtcdStorageMode is emptyDir",
@@ -148,16 +156,27 @@ func TestCommandInitOption_Validate(t *testing.T) {
148156
opt: CommandInitOption{
149157
KarmadaAPIServerAdvertiseAddress: "192.0.2.1",
150158
EtcdStorageMode: "",
159+
ImagePullPolicy: string(corev1.PullIfNotPresent),
151160
},
152161
wantErr: false,
153162
errorMsg: "CommandInitOption.Validate() returns err when EtcdStorageMode is empty",
154163
},
164+
{
165+
name: "Invalid ImagePullPolicy",
166+
opt: CommandInitOption{
167+
KarmadaAPIServerAdvertiseAddress: "192.0.2.1",
168+
EtcdStorageMode: "",
169+
ImagePullPolicy: "NotExistImagePullPolicy",
170+
},
171+
wantErr: true,
172+
errorMsg: "CommandInitOption.Validate() returns err when invalid ImagePullPolicy",
173+
},
155174
}
156175

157176
for _, tt := range tests {
158177
t.Run(tt.name, func(t *testing.T) {
159178
if err := tt.opt.Validate("parentCommand"); (err != nil) != tt.wantErr {
160-
t.Errorf(tt.errorMsg)
179+
t.Errorf("%s err = %v, want %v", tt.name, err.Error(), tt.errorMsg)
161180
}
162181
})
163182
}

pkg/karmadactl/cmdinit/kubernetes/deployments.go

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -444,8 +444,9 @@ func (i *CommandInitOption) makeKarmadaSchedulerDeployment() *appsv1.Deployment
444444
},
445445
Containers: []corev1.Container{
446446
{
447-
Name: schedulerDeploymentNameAndServiceAccountName,
448-
Image: i.karmadaSchedulerImage(),
447+
Name: schedulerDeploymentNameAndServiceAccountName,
448+
Image: i.karmadaSchedulerImage(),
449+
ImagePullPolicy: corev1.PullPolicy(i.ImagePullPolicy),
449450
Command: []string{
450451
"/bin/karmada-scheduler",
451452
"--kubeconfig=/etc/kubeconfig",
@@ -559,8 +560,9 @@ func (i *CommandInitOption) makeKarmadaControllerManagerDeployment() *appsv1.Dep
559560
},
560561
Containers: []corev1.Container{
561562
{
562-
Name: controllerManagerDeploymentAndServiceName,
563-
Image: i.karmadaControllerManagerImage(),
563+
Name: controllerManagerDeploymentAndServiceName,
564+
Image: i.karmadaControllerManagerImage(),
565+
ImagePullPolicy: corev1.PullPolicy(i.ImagePullPolicy),
564566
Command: []string{
565567
"/bin/karmada-controller-manager",
566568
"--kubeconfig=/etc/kubeconfig",
@@ -677,8 +679,9 @@ func (i *CommandInitOption) makeKarmadaWebhookDeployment() *appsv1.Deployment {
677679
AutomountServiceAccountToken: pointer.Bool(false),
678680
Containers: []corev1.Container{
679681
{
680-
Name: webhookDeploymentAndServiceAccountAndServiceName,
681-
Image: i.karmadaWebhookImage(),
682+
Name: webhookDeploymentAndServiceAccountAndServiceName,
683+
Image: i.karmadaWebhookImage(),
684+
ImagePullPolicy: corev1.PullPolicy(i.ImagePullPolicy),
682685
Command: []string{
683686
"/bin/karmada-webhook",
684687
"--kubeconfig=/etc/kubeconfig",
@@ -847,9 +850,10 @@ func (i *CommandInitOption) makeKarmadaAggregatedAPIServerDeployment() *appsv1.D
847850
AutomountServiceAccountToken: pointer.Bool(false),
848851
Containers: []corev1.Container{
849852
{
850-
Name: karmadaAggregatedAPIServerDeploymentAndServiceName,
851-
Image: i.karmadaAggregatedAPIServerImage(),
852-
Command: command,
853+
Name: karmadaAggregatedAPIServerDeploymentAndServiceName,
854+
Image: i.karmadaAggregatedAPIServerImage(),
855+
ImagePullPolicy: corev1.PullPolicy(i.ImagePullPolicy),
856+
Command: command,
853857
VolumeMounts: []corev1.VolumeMount{
854858
{
855859
Name: KubeConfigSecretAndMountName,

0 commit comments

Comments
 (0)