Skip to content

Commit 405efc2

Browse files
committed
Merge branch 'master' of github.com:kubernetes/minikube into prbot
2 parents 2ce5ac0 + 489f8f8 commit 405efc2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+1083
-231
lines changed

cmd/minikube/cmd/config/config.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ var settings = []Setting{
9393
{
9494
name: "memory",
9595
set: SetString,
96-
validations: []setFn{IsValidDiskSize},
96+
validations: []setFn{IsValidMemory},
9797
callbacks: []setFn{RequiresRestartMsg},
9898
},
9999
{

cmd/minikube/cmd/config/configure.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,12 @@ var addonsConfigureCmd = &cobra.Command{
108108
}
109109

110110
cname := ClusterFlagValue()
111+
namespace := "kube-system"
111112

112113
// Create ECR Secret
113114
err := service.CreateSecret(
114115
cname,
115-
"kube-system",
116+
namespace,
116117
"registry-creds-ecr",
117118
map[string]string{
118119
"AWS_ACCESS_KEY_ID": awsAccessID,
@@ -134,7 +135,7 @@ var addonsConfigureCmd = &cobra.Command{
134135
// Create GCR Secret
135136
err = service.CreateSecret(
136137
cname,
137-
"kube-system",
138+
namespace,
138139
"registry-creds-gcr",
139140
map[string]string{
140141
"application_default_credentials.json": gcrApplicationDefaultCredentials,
@@ -153,7 +154,7 @@ var addonsConfigureCmd = &cobra.Command{
153154
// Create Docker Secret
154155
err = service.CreateSecret(
155156
cname,
156-
"kube-system",
157+
namespace,
157158
"registry-creds-dpr",
158159
map[string]string{
159160
"DOCKER_PRIVATE_REGISTRY_SERVER": dockerServer,
@@ -173,7 +174,7 @@ var addonsConfigureCmd = &cobra.Command{
173174
// Create Azure Container Registry Secret
174175
err = service.CreateSecret(
175176
cname,
176-
"kube-system",
177+
namespace,
177178
"registry-creds-acr",
178179
map[string]string{
179180
"ACR_URL": acrURL,

cmd/minikube/cmd/config/set_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func TestSetNotAllowed(t *testing.T) {
3939
t.Fatalf("Set did not return error for unallowed value: %+v", err)
4040
}
4141
err = Set("memory", "10a")
42-
if err == nil || err.Error() != "run validations for \"memory\" with value of \"10a\": [invalid disk size: invalid size: '10a']" {
42+
if err == nil || err.Error() != "run validations for \"memory\" with value of \"10a\": [invalid memory size: invalid size: '10a']" {
4343
t.Fatalf("Set did not return error for unallowed value: %+v", err)
4444
}
4545
}

cmd/minikube/cmd/config/validations.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,15 @@ func IsValidDiskSize(name string, disksize string) error {
5353
return nil
5454
}
5555

56+
// IsValidMemory checks if a string is a valid memory size
57+
func IsValidMemory(name string, memsize string) error {
58+
_, err := units.FromHumanSize(memsize)
59+
if err != nil {
60+
return fmt.Errorf("invalid memory size: %v", err)
61+
}
62+
return nil
63+
}
64+
5665
// IsValidURL checks if a location is a valid URL
5766
func IsValidURL(name string, location string) error {
5867
_, err := url.Parse(location)

cmd/minikube/cmd/image.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,9 +145,28 @@ $ minikube image unload image busybox
145145
},
146146
}
147147

148+
var listImageCmd = &cobra.Command{
149+
Use: "list",
150+
Short: "List images",
151+
Example: `
152+
$ minikube image list
153+
`,
154+
Aliases: []string{"ls"},
155+
Run: func(cmd *cobra.Command, args []string) {
156+
profile, err := config.LoadProfile(viper.GetString(config.ProfileName))
157+
if err != nil {
158+
exit.Error(reason.Usage, "loading profile", err)
159+
}
160+
if err := machine.ListImages(profile); err != nil {
161+
exit.Error(reason.GuestImageList, "Failed to list images", err)
162+
}
163+
},
164+
}
165+
148166
func init() {
149167
imageCmd.AddCommand(loadImageCmd)
150168
imageCmd.AddCommand(removeImageCmd)
151169
loadImageCmd.Flags().BoolVar(&imgDaemon, "daemon", false, "Cache image from docker daemon")
152170
loadImageCmd.Flags().BoolVar(&imgRemote, "remote", false, "Cache image from remote registry")
171+
imageCmd.AddCommand(listImageCmd)
153172
}

cmd/minikube/cmd/start_flags.go

Lines changed: 142 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -251,139 +251,8 @@ func generateClusterConfig(cmd *cobra.Command, existing *config.ClusterConfig, k
251251
cc = updateExistingConfigFromFlags(cmd, existing)
252252
} else {
253253
klog.Info("no existing cluster config was found, will generate one from the flags ")
254-
sysLimit, containerLimit, err := memoryLimits(drvName)
255-
if err != nil {
256-
klog.Warningf("Unable to query memory limits: %+v", err)
257-
}
258-
259-
mem := suggestMemoryAllocation(sysLimit, containerLimit, viper.GetInt(nodes))
260-
if cmd.Flags().Changed(memory) {
261-
var err error
262-
mem, err = pkgutil.CalculateSizeInMB(viper.GetString(memory))
263-
if err != nil {
264-
exit.Message(reason.Usage, "Generate unable to parse memory '{{.memory}}': {{.error}}", out.V{"memory": viper.GetString(memory), "error": err})
265-
}
266-
if driver.IsKIC(drvName) && mem > containerLimit {
267-
exit.Message(reason.Usage, "{{.driver_name}} has only {{.container_limit}}MB memory but you specified {{.specified_memory}}MB", out.V{"container_limit": containerLimit, "specified_memory": mem, "driver_name": driver.FullName(drvName)})
268-
}
269-
} else {
270-
validateRequestedMemorySize(mem, drvName)
271-
klog.Infof("Using suggested %dMB memory alloc based on sys=%dMB, container=%dMB", mem, sysLimit, containerLimit)
272-
}
273-
274-
diskSize, err := pkgutil.CalculateSizeInMB(viper.GetString(humanReadableDiskSize))
275-
if err != nil {
276-
exit.Message(reason.Usage, "Generate unable to parse disk size '{{.diskSize}}': {{.error}}", out.V{"diskSize": viper.GetString(humanReadableDiskSize), "error": err})
277-
}
278-
279-
repository := viper.GetString(imageRepository)
280-
mirrorCountry := strings.ToLower(viper.GetString(imageMirrorCountry))
281-
if strings.ToLower(repository) == "auto" || (mirrorCountry != "" && repository == "") {
282-
found, autoSelectedRepository, err := selectImageRepository(mirrorCountry, semver.MustParse(strings.TrimPrefix(k8sVersion, version.VersionPrefix)))
283-
if err != nil {
284-
exit.Error(reason.InetRepo, "Failed to check main repository and mirrors for images", err)
285-
}
286-
287-
if !found {
288-
if autoSelectedRepository == "" {
289-
exit.Message(reason.InetReposUnavailable, "None of the known repositories are accessible. Consider specifying an alternative image repository with --image-repository flag")
290-
} else {
291-
out.WarningT("None of the known repositories in your location are accessible. Using {{.image_repository_name}} as fallback.", out.V{"image_repository_name": autoSelectedRepository})
292-
}
293-
}
254+
cc = generateNewConfigFromFlags(cmd, k8sVersion, drvName)
294255

295-
repository = autoSelectedRepository
296-
}
297-
298-
if cmd.Flags().Changed(imageRepository) || cmd.Flags().Changed(imageMirrorCountry) {
299-
out.Styled(style.Success, "Using image repository {{.name}}", out.V{"name": repository})
300-
}
301-
302-
// Backwards compatibility with --enable-default-cni
303-
chosenCNI := viper.GetString(cniFlag)
304-
if viper.GetBool(enableDefaultCNI) && !cmd.Flags().Changed(cniFlag) {
305-
klog.Errorf("Found deprecated --enable-default-cni flag, setting --cni=bridge")
306-
chosenCNI = "bridge"
307-
}
308-
// networkPlugin cni deprecation warning
309-
chosenNetworkPlugin := viper.GetString(networkPlugin)
310-
if chosenNetworkPlugin == "cni" {
311-
out.WarningT("With --network-plugin=cni, you will need to provide your own CNI. See --cni flag as a user-friendly alternative")
312-
}
313-
314-
if !(driver.IsKIC(drvName) || driver.IsKVM(drvName)) && viper.GetString(network) != "" {
315-
out.WarningT("--network flag is only valid with the docker/podman and KVM drivers, it will be ignored")
316-
}
317-
318-
checkNumaCount(k8sVersion)
319-
320-
cc = config.ClusterConfig{
321-
Name: ClusterFlagValue(),
322-
KeepContext: viper.GetBool(keepContext),
323-
EmbedCerts: viper.GetBool(embedCerts),
324-
MinikubeISO: viper.GetString(isoURL),
325-
KicBaseImage: viper.GetString(kicBaseImage),
326-
Network: viper.GetString(network),
327-
Memory: mem,
328-
CPUs: viper.GetInt(cpus),
329-
DiskSize: diskSize,
330-
Driver: drvName,
331-
ListenAddress: viper.GetString(listenAddress),
332-
HyperkitVpnKitSock: viper.GetString(vpnkitSock),
333-
HyperkitVSockPorts: viper.GetStringSlice(vsockPorts),
334-
NFSShare: viper.GetStringSlice(nfsShare),
335-
NFSSharesRoot: viper.GetString(nfsSharesRoot),
336-
DockerEnv: config.DockerEnv,
337-
DockerOpt: config.DockerOpt,
338-
InsecureRegistry: insecureRegistry,
339-
RegistryMirror: registryMirror,
340-
HostOnlyCIDR: viper.GetString(hostOnlyCIDR),
341-
HypervVirtualSwitch: viper.GetString(hypervVirtualSwitch),
342-
HypervUseExternalSwitch: viper.GetBool(hypervUseExternalSwitch),
343-
HypervExternalAdapter: viper.GetString(hypervExternalAdapter),
344-
KVMNetwork: viper.GetString(kvmNetwork),
345-
KVMQemuURI: viper.GetString(kvmQemuURI),
346-
KVMGPU: viper.GetBool(kvmGPU),
347-
KVMHidden: viper.GetBool(kvmHidden),
348-
KVMNUMACount: viper.GetInt(kvmNUMACount),
349-
DisableDriverMounts: viper.GetBool(disableDriverMounts),
350-
UUID: viper.GetString(uuid),
351-
NoVTXCheck: viper.GetBool(noVTXCheck),
352-
DNSProxy: viper.GetBool(dnsProxy),
353-
HostDNSResolver: viper.GetBool(hostDNSResolver),
354-
HostOnlyNicType: viper.GetString(hostOnlyNicType),
355-
NatNicType: viper.GetString(natNicType),
356-
StartHostTimeout: viper.GetDuration(waitTimeout),
357-
ExposedPorts: viper.GetStringSlice(ports),
358-
SSHIPAddress: viper.GetString(sshIPAddress),
359-
SSHUser: viper.GetString(sshSSHUser),
360-
SSHKey: viper.GetString(sshSSHKey),
361-
SSHPort: viper.GetInt(sshSSHPort),
362-
KubernetesConfig: config.KubernetesConfig{
363-
KubernetesVersion: k8sVersion,
364-
ClusterName: ClusterFlagValue(),
365-
Namespace: viper.GetString(startNamespace),
366-
APIServerName: viper.GetString(apiServerName),
367-
APIServerNames: apiServerNames,
368-
APIServerIPs: apiServerIPs,
369-
DNSDomain: viper.GetString(dnsDomain),
370-
FeatureGates: viper.GetString(featureGates),
371-
ContainerRuntime: viper.GetString(containerRuntime),
372-
CRISocket: viper.GetString(criSocket),
373-
NetworkPlugin: chosenNetworkPlugin,
374-
ServiceCIDR: viper.GetString(serviceCIDR),
375-
ImageRepository: repository,
376-
ExtraOptions: config.ExtraOptions,
377-
ShouldLoadCachedImages: viper.GetBool(cacheImages),
378-
CNI: chosenCNI,
379-
NodePort: viper.GetInt(apiServerPort),
380-
},
381-
MultiNodeRequested: viper.GetInt(nodes) > 1,
382-
}
383-
cc.VerifyComponents = interpretWaitFlag(*cmd)
384-
if viper.GetBool(createMount) && driver.IsKIC(drvName) {
385-
cc.ContainerVolumeMounts = []string{viper.GetString(mountString)}
386-
}
387256
cnm, err := cni.New(cc)
388257
if err != nil {
389258
return cc, config.Node{}, errors.Wrap(err, "cni")
@@ -418,6 +287,147 @@ func generateClusterConfig(cmd *cobra.Command, existing *config.ClusterConfig, k
418287
return createNode(cc, kubeNodeName, existing)
419288
}
420289

290+
// generateNewConfigFromFlags generate a config.ClusterConfig based on flags
291+
func generateNewConfigFromFlags(cmd *cobra.Command, k8sVersion string, drvName string) config.ClusterConfig {
292+
var cc config.ClusterConfig
293+
294+
sysLimit, containerLimit, err := memoryLimits(drvName)
295+
if err != nil {
296+
klog.Warningf("Unable to query memory limits: %+v", err)
297+
}
298+
299+
mem := suggestMemoryAllocation(sysLimit, containerLimit, viper.GetInt(nodes))
300+
if cmd.Flags().Changed(memory) || viper.IsSet(memory) {
301+
var err error
302+
mem, err = pkgutil.CalculateSizeInMB(viper.GetString(memory))
303+
if err != nil {
304+
exit.Message(reason.Usage, "Generate unable to parse memory '{{.memory}}': {{.error}}", out.V{"memory": viper.GetString(memory), "error": err})
305+
}
306+
if driver.IsKIC(drvName) && mem > containerLimit {
307+
exit.Message(reason.Usage, "{{.driver_name}} has only {{.container_limit}}MB memory but you specified {{.specified_memory}}MB", out.V{"container_limit": containerLimit, "specified_memory": mem, "driver_name": driver.FullName(drvName)})
308+
}
309+
} else {
310+
validateRequestedMemorySize(mem, drvName)
311+
klog.Infof("Using suggested %dMB memory alloc based on sys=%dMB, container=%dMB", mem, sysLimit, containerLimit)
312+
}
313+
314+
diskSize, err := pkgutil.CalculateSizeInMB(viper.GetString(humanReadableDiskSize))
315+
if err != nil {
316+
exit.Message(reason.Usage, "Generate unable to parse disk size '{{.diskSize}}': {{.error}}", out.V{"diskSize": viper.GetString(humanReadableDiskSize), "error": err})
317+
}
318+
319+
repository := viper.GetString(imageRepository)
320+
mirrorCountry := strings.ToLower(viper.GetString(imageMirrorCountry))
321+
if strings.ToLower(repository) == "auto" || (mirrorCountry != "" && repository == "") {
322+
found, autoSelectedRepository, err := selectImageRepository(mirrorCountry, semver.MustParse(strings.TrimPrefix(k8sVersion, version.VersionPrefix)))
323+
if err != nil {
324+
exit.Error(reason.InetRepo, "Failed to check main repository and mirrors for images", err)
325+
}
326+
327+
if !found {
328+
if autoSelectedRepository == "" {
329+
exit.Message(reason.InetReposUnavailable, "None of the known repositories are accessible. Consider specifying an alternative image repository with --image-repository flag")
330+
} else {
331+
out.WarningT("None of the known repositories in your location are accessible. Using {{.image_repository_name}} as fallback.", out.V{"image_repository_name": autoSelectedRepository})
332+
}
333+
}
334+
335+
repository = autoSelectedRepository
336+
}
337+
338+
if cmd.Flags().Changed(imageRepository) || cmd.Flags().Changed(imageMirrorCountry) {
339+
out.Styled(style.Success, "Using image repository {{.name}}", out.V{"name": repository})
340+
}
341+
342+
// Backwards compatibility with --enable-default-cni
343+
chosenCNI := viper.GetString(cniFlag)
344+
if viper.GetBool(enableDefaultCNI) && !cmd.Flags().Changed(cniFlag) {
345+
klog.Errorf("Found deprecated --enable-default-cni flag, setting --cni=bridge")
346+
chosenCNI = "bridge"
347+
}
348+
// networkPlugin cni deprecation warning
349+
chosenNetworkPlugin := viper.GetString(networkPlugin)
350+
if chosenNetworkPlugin == "cni" {
351+
out.WarningT("With --network-plugin=cni, you will need to provide your own CNI. See --cni flag as a user-friendly alternative")
352+
}
353+
354+
if !(driver.IsKIC(drvName) || driver.IsKVM(drvName)) && viper.GetString(network) != "" {
355+
out.WarningT("--network flag is only valid with the docker/podman and KVM drivers, it will be ignored")
356+
}
357+
358+
checkNumaCount(k8sVersion)
359+
360+
cc = config.ClusterConfig{
361+
Name: ClusterFlagValue(),
362+
KeepContext: viper.GetBool(keepContext),
363+
EmbedCerts: viper.GetBool(embedCerts),
364+
MinikubeISO: viper.GetString(isoURL),
365+
KicBaseImage: viper.GetString(kicBaseImage),
366+
Network: viper.GetString(network),
367+
Memory: mem,
368+
CPUs: viper.GetInt(cpus),
369+
DiskSize: diskSize,
370+
Driver: drvName,
371+
ListenAddress: viper.GetString(listenAddress),
372+
HyperkitVpnKitSock: viper.GetString(vpnkitSock),
373+
HyperkitVSockPorts: viper.GetStringSlice(vsockPorts),
374+
NFSShare: viper.GetStringSlice(nfsShare),
375+
NFSSharesRoot: viper.GetString(nfsSharesRoot),
376+
DockerEnv: config.DockerEnv,
377+
DockerOpt: config.DockerOpt,
378+
InsecureRegistry: insecureRegistry,
379+
RegistryMirror: registryMirror,
380+
HostOnlyCIDR: viper.GetString(hostOnlyCIDR),
381+
HypervVirtualSwitch: viper.GetString(hypervVirtualSwitch),
382+
HypervUseExternalSwitch: viper.GetBool(hypervUseExternalSwitch),
383+
HypervExternalAdapter: viper.GetString(hypervExternalAdapter),
384+
KVMNetwork: viper.GetString(kvmNetwork),
385+
KVMQemuURI: viper.GetString(kvmQemuURI),
386+
KVMGPU: viper.GetBool(kvmGPU),
387+
KVMHidden: viper.GetBool(kvmHidden),
388+
KVMNUMACount: viper.GetInt(kvmNUMACount),
389+
DisableDriverMounts: viper.GetBool(disableDriverMounts),
390+
UUID: viper.GetString(uuid),
391+
NoVTXCheck: viper.GetBool(noVTXCheck),
392+
DNSProxy: viper.GetBool(dnsProxy),
393+
HostDNSResolver: viper.GetBool(hostDNSResolver),
394+
HostOnlyNicType: viper.GetString(hostOnlyNicType),
395+
NatNicType: viper.GetString(natNicType),
396+
StartHostTimeout: viper.GetDuration(waitTimeout),
397+
ExposedPorts: viper.GetStringSlice(ports),
398+
SSHIPAddress: viper.GetString(sshIPAddress),
399+
SSHUser: viper.GetString(sshSSHUser),
400+
SSHKey: viper.GetString(sshSSHKey),
401+
SSHPort: viper.GetInt(sshSSHPort),
402+
KubernetesConfig: config.KubernetesConfig{
403+
KubernetesVersion: k8sVersion,
404+
ClusterName: ClusterFlagValue(),
405+
Namespace: viper.GetString(startNamespace),
406+
APIServerName: viper.GetString(apiServerName),
407+
APIServerNames: apiServerNames,
408+
APIServerIPs: apiServerIPs,
409+
DNSDomain: viper.GetString(dnsDomain),
410+
FeatureGates: viper.GetString(featureGates),
411+
ContainerRuntime: viper.GetString(containerRuntime),
412+
CRISocket: viper.GetString(criSocket),
413+
NetworkPlugin: chosenNetworkPlugin,
414+
ServiceCIDR: viper.GetString(serviceCIDR),
415+
ImageRepository: repository,
416+
ExtraOptions: config.ExtraOptions,
417+
ShouldLoadCachedImages: viper.GetBool(cacheImages),
418+
CNI: chosenCNI,
419+
NodePort: viper.GetInt(apiServerPort),
420+
},
421+
MultiNodeRequested: viper.GetInt(nodes) > 1,
422+
}
423+
cc.VerifyComponents = interpretWaitFlag(*cmd)
424+
if viper.GetBool(createMount) && driver.IsKIC(drvName) {
425+
cc.ContainerVolumeMounts = []string{viper.GetString(mountString)}
426+
}
427+
428+
return cc
429+
}
430+
421431
// setCNIConfDir sets kubelet's '--cni-conf-dir' flag to custom CNI Config Directory path (same used also by CNI Deployment) to avoid conflicting CNI configs.
422432
// ref: https://github.com/kubernetes/minikube/issues/10984
423433
// Note: currently, this change affects only Kindnet CNI (and all multinodes using it), but it can be easily expanded to other/all CNIs if needed.

0 commit comments

Comments
 (0)