diff --git a/cmd/minikube/cmd/delete.go b/cmd/minikube/cmd/delete.go index 229fefcf7131..74764207dd65 100644 --- a/cmd/minikube/cmd/delete.go +++ b/cmd/minikube/cmd/delete.go @@ -517,7 +517,23 @@ func deleteMachineDirectories(cc *config.ClusterConfig) { // killMountProcess kills the mount process, if it is running func killMountProcess() error { - pidPath := filepath.Join(localpath.MiniPath(), constants.MountProcessFileName) + profile := viper.GetString("profile") + paths := []string{ + localpath.MiniPath(), // legacy mount-process path for backwards compatibility + localpath.Profile(profile), + } + + for _, path := range paths { + if err := killProcess(path); err != nil { + return err + } + } + + return nil +} + +func killProcess(path string) error { + pidPath := filepath.Join(path, constants.MountProcessFileName) if _, err := os.Stat(pidPath); os.IsNotExist(err) { return nil } diff --git a/pkg/minikube/node/config.go b/pkg/minikube/node/config.go index 5d3d926e7393..81ebe1011b9e 100644 --- a/pkg/minikube/node/config.go +++ b/pkg/minikube/node/config.go @@ -65,7 +65,8 @@ func configureMounts(wg *sync.WaitGroup) { if klog.V(8).Enabled() { mountDebugVal = 1 } - mountCmd := exec.Command(path, "mount", fmt.Sprintf("--v=%d", mountDebugVal), viper.GetString(mountString)) + profile := viper.GetString("profile") + mountCmd := exec.Command(path, "mount", "-p", profile, fmt.Sprintf("--v=%d", mountDebugVal), viper.GetString(mountString)) mountCmd.Env = append(os.Environ(), constants.IsMinikubeChildProcess+"=true") if klog.V(8).Enabled() { mountCmd.Stdout = os.Stdout @@ -74,7 +75,7 @@ func configureMounts(wg *sync.WaitGroup) { if err := mountCmd.Start(); err != nil { exit.Error(reason.GuestMount, "Error starting mount", err) } - if err := lock.WriteFile(filepath.Join(localpath.MiniPath(), constants.MountProcessFileName), []byte(strconv.Itoa(mountCmd.Process.Pid)), 0o644); err != nil { + if err := lock.WriteFile(filepath.Join(localpath.Profile(profile), constants.MountProcessFileName), []byte(strconv.Itoa(mountCmd.Process.Pid)), 0o644); err != nil { exit.Error(reason.HostMountPid, "Error writing mount pid", err) } } diff --git a/site/content/en/docs/contrib/tests.en.md b/site/content/en/docs/contrib/tests.en.md index b33a96a8eced..fe73f90df1cf 100644 --- a/site/content/en/docs/contrib/tests.en.md +++ b/site/content/en/docs/contrib/tests.en.md @@ -243,6 +243,15 @@ verifies the docker driver and run with an existing network ## TestingKicBaseImage will return true if the integraiton test is running against a passed --base-image flag +## TestMountStart +tests using the mount command on start + +#### validateStartWithMount +starts a cluster with mount enabled + +#### validateMount +checks if the cluster has a folder mounted + ## TestMultiNode tests all multi node cluster functionality diff --git a/test/integration/mount_start_test.go b/test/integration/mount_start_test.go new file mode 100644 index 000000000000..104c3095c1ef --- /dev/null +++ b/test/integration/mount_start_test.go @@ -0,0 +1,90 @@ +//go:build integration +// +build integration + +/* +Copyright 2021 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package integration + +import ( + "context" + "os/exec" + "testing" +) + +// TestMountStart tests using the mount command on start +func TestMountStart(t *testing.T) { + if NoneDriver() { + t.Skip("skipping: none driver does not support mount") + } + + MaybeParallel(t) + + type validateFunc func(context.Context, *testing.T, string) + profile1 := UniqueProfileName("mount-start-1") + profile2 := UniqueProfileName("mount-start-2") + ctx, cancel := context.WithTimeout(context.Background(), Minutes(15)) + defer Cleanup(t, profile1, cancel) + defer Cleanup(t, profile2, cancel) + + // Serial tests + t.Run("serial", func(t *testing.T) { + tests := []struct { + name string + validator validateFunc + profile string + }{ + {"StartWithMountFirst", validateStartWithMount, profile1}, + {"StartWithMountSecond", validateStartWithMount, profile2}, + {"VerifyMountFirst", validateMount, profile1}, + {"VerifyMountSecond", validateMount, profile2}, + {"DeleteFirst", validateDelete, profile1}, + {"VerifyMountPostDelete", validateMount, profile2}, + } + + for _, test := range tests { + if ctx.Err() == context.DeadlineExceeded { + t.Fatalf("Unable to run more tests (deadline exceeded)") + } + + t.Run(test.name, func(t *testing.T) { + test.validator(ctx, t, test.profile) + }) + } + }) +} + +// validateStartWithMount starts a cluster with mount enabled +func validateStartWithMount(ctx context.Context, t *testing.T, profile string) { + defer PostMortemLogs(t, profile) + + args := []string{"start", "-p", profile, "--memory=2048", "--mount"} + rr, err := Run(t, exec.CommandContext(ctx, Target(), args...)) + if err != nil { + t.Fatalf("failed to start minikube with args: %q : %v", rr.Command(), err) + } +} + +// validateMount checks if the cluster has a folder mounted +func validateMount(ctx context.Context, t *testing.T, profile string) { + defer PostMortemLogs(t, profile) + + args := []string{"-p", profile, "ssh", "ls", "/minikube-host"} + rr, err := Run(t, exec.CommandContext(ctx, Target(), args...)) + if err != nil { + t.Fatalf("mount failed: %q : %v", rr.Command(), err) + } +}