mirror of https://github.com/containers/podman.git
199 lines
6.3 KiB
Go
199 lines
6.3 KiB
Go
package e2e_test
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/containers/podman/v5/pkg/machine/define"
|
|
. "github.com/onsi/ginkgo/v2"
|
|
. "github.com/onsi/gomega"
|
|
. "github.com/onsi/gomega/gexec"
|
|
)
|
|
|
|
var _ = Describe("podman machine rm", func() {
|
|
var (
|
|
mb *machineTestBuilder
|
|
testDir string
|
|
)
|
|
|
|
BeforeEach(func() {
|
|
testDir, mb = setup()
|
|
})
|
|
AfterEach(func() {
|
|
teardown(originalHomeDir, testDir, mb)
|
|
})
|
|
|
|
It("bad init name", func() {
|
|
i := rmMachine{}
|
|
reallyLongName := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
session, err := mb.setName(reallyLongName).setCmd(&i).run()
|
|
Expect(err).ToNot(HaveOccurred())
|
|
Expect(session).To(Exit(125))
|
|
})
|
|
|
|
It("Remove machine", func() {
|
|
name := randomString()
|
|
i := new(initMachine)
|
|
session, err := mb.setName(name).setCmd(i.withImagePath(mb.imagePath)).run()
|
|
Expect(err).ToNot(HaveOccurred())
|
|
Expect(session).To(Exit(0))
|
|
rm := rmMachine{}
|
|
removeSession, err := mb.setCmd(rm.withForce()).run()
|
|
Expect(err).ToNot(HaveOccurred())
|
|
Expect(removeSession).To(Exit(0))
|
|
|
|
// Inspecting a non-existent machine should fail
|
|
// which means it is gone
|
|
_, ec, err := mb.toQemuInspectInfo()
|
|
Expect(err).ToNot(HaveOccurred())
|
|
Expect(ec).To(Equal(125))
|
|
|
|
// Removing non-existent machine should fail
|
|
removeSession2, err := mb.setCmd(rm.withForce()).run()
|
|
Expect(err).ToNot(HaveOccurred())
|
|
Expect(removeSession2).To(Exit(125))
|
|
Expect(removeSession2.errorToString()).To(ContainSubstring(fmt.Sprintf("%s: VM does not exist", name)))
|
|
})
|
|
|
|
It("Remove running machine", func() {
|
|
name := randomString()
|
|
i := new(initMachine)
|
|
session, err := mb.setName(name).setCmd(i.withImagePath(mb.imagePath).withNow()).run()
|
|
Expect(err).ToNot(HaveOccurred())
|
|
Expect(session).To(Exit(0))
|
|
rm := new(rmMachine)
|
|
|
|
// Removing a running machine should fail
|
|
stop, err := mb.setCmd(rm).run()
|
|
Expect(err).ToNot(HaveOccurred())
|
|
Expect(stop).To(Exit(125))
|
|
Expect(stop.errorToString()).To(ContainSubstring(fmt.Sprintf("vm \"%s\" cannot be destroyed", name)))
|
|
|
|
// Removing again with force
|
|
stopAgain, err := mb.setCmd(rm.withForce()).run()
|
|
Expect(err).ToNot(HaveOccurred())
|
|
Expect(stopAgain).To(Exit(0))
|
|
|
|
// Inspect to be dead sure
|
|
_, ec, err := mb.toQemuInspectInfo()
|
|
Expect(err).ToNot(HaveOccurred())
|
|
Expect(ec).To(Equal(125))
|
|
})
|
|
|
|
It("machine rm --save-ignition --save-image", func() {
|
|
i := new(initMachine)
|
|
session, err := mb.setCmd(i.withImagePath(mb.imagePath)).run()
|
|
Expect(err).ToNot(HaveOccurred())
|
|
Expect(session).To(Exit(0))
|
|
|
|
inspect := new(inspectMachine)
|
|
inspect = inspect.withFormat("{{.SSHConfig.IdentityPath}}")
|
|
inspectSession, err := mb.setCmd(inspect).run()
|
|
Expect(err).ToNot(HaveOccurred())
|
|
key := inspectSession.outputToString()
|
|
pubkey := key + ".pub"
|
|
|
|
inspect = inspect.withFormat("{{.Image.IgnitionFile.Path}}")
|
|
inspectSession, err = mb.setCmd(inspect).run()
|
|
Expect(err).ToNot(HaveOccurred())
|
|
ign := inspectSession.outputToString()
|
|
|
|
inspect = inspect.withFormat("{{.Image.ImagePath.Path}}")
|
|
inspectSession, err = mb.setCmd(inspect).run()
|
|
Expect(err).ToNot(HaveOccurred())
|
|
img := inspectSession.outputToString()
|
|
|
|
rm := rmMachine{}
|
|
removeSession, err := mb.setCmd(rm.withForce().withSaveIgnition().withSaveImage()).run()
|
|
Expect(err).ToNot(HaveOccurred())
|
|
Expect(removeSession).To(Exit(0))
|
|
|
|
// Inspecting a non-existent machine should fail
|
|
// which means it is gone
|
|
_, ec, err := mb.toQemuInspectInfo()
|
|
Expect(err).ToNot(HaveOccurred())
|
|
Expect(ec).To(Equal(125))
|
|
|
|
_, err = os.Stat(key)
|
|
Expect(err).ToNot(HaveOccurred())
|
|
_, err = os.Stat(pubkey)
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
// WSL does not use ignition
|
|
if testProvider.VMType() != define.WSLVirt {
|
|
_, err = os.Stat(ign)
|
|
Expect(err).ToNot(HaveOccurred())
|
|
}
|
|
_, err = os.Stat(img)
|
|
Expect(err).ToNot(HaveOccurred())
|
|
})
|
|
|
|
It("Remove machine sharing ssh key with another machine", func() {
|
|
expectedIdentityPathSuffix := filepath.Join(".local", "share", "containers", "podman", "machine", define.DefaultIdentityName)
|
|
|
|
fooName := "foo"
|
|
foo := new(initMachine)
|
|
session, err := mb.setName(fooName).setCmd(foo.withImagePath(mb.imagePath)).run()
|
|
Expect(err).ToNot(HaveOccurred())
|
|
Expect(session).To(Exit(0))
|
|
|
|
barName := "bar"
|
|
bar := new(initMachine)
|
|
session, err = mb.setName(barName).setCmd(bar.withImagePath(mb.imagePath).withNow()).run()
|
|
Expect(err).ToNot(HaveOccurred())
|
|
Expect(session).To(Exit(0))
|
|
|
|
inspectFoo := new(inspectMachine)
|
|
inspectFoo = inspectFoo.withFormat("{{.SSHConfig.IdentityPath}}")
|
|
inspectSession, err := mb.setName(fooName).setCmd(inspectFoo).run()
|
|
Expect(err).ToNot(HaveOccurred())
|
|
Expect(inspectSession).To(Exit(0))
|
|
Expect(inspectSession.outputToString()).To(ContainSubstring(expectedIdentityPathSuffix))
|
|
fooIdentityPath := inspectSession.outputToString()
|
|
|
|
inspectBar := new(inspectMachine)
|
|
inspectBar = inspectBar.withFormat("{{.SSHConfig.IdentityPath}}")
|
|
inspectSession, err = mb.setName(barName).setCmd(inspectBar).run()
|
|
Expect(err).ToNot(HaveOccurred())
|
|
Expect(inspectSession).To(Exit(0))
|
|
Expect(inspectSession.outputToString()).To(Equal(fooIdentityPath))
|
|
|
|
rmFoo := new(rmMachine)
|
|
stop, err := mb.setName(fooName).setCmd(rmFoo.withForce()).run()
|
|
Expect(err).ToNot(HaveOccurred())
|
|
Expect(stop).To(Exit(0))
|
|
|
|
// removal of foo should not affect the ability to ssh into the bar machine
|
|
sshBar := new(sshMachine)
|
|
sshSession, err := mb.setName(barName).setCmd(sshBar.withSSHCommand([]string{"echo", "foo"})).run()
|
|
Expect(err).ToNot(HaveOccurred())
|
|
Expect(sshSession).To(Exit(0))
|
|
})
|
|
|
|
It("Removing all machines doesn't delete ssh keys", func() {
|
|
fooName := "foo"
|
|
foo := new(initMachine)
|
|
session, err := mb.setName(fooName).setCmd(foo.withImagePath(mb.imagePath)).run()
|
|
Expect(err).ToNot(HaveOccurred())
|
|
Expect(session).To(Exit(0))
|
|
|
|
inspectFoo := new(inspectMachine)
|
|
inspectFoo = inspectFoo.withFormat("{{.SSHConfig.IdentityPath}}")
|
|
inspectSession, err := mb.setName(fooName).setCmd(inspectFoo).run()
|
|
Expect(err).ToNot(HaveOccurred())
|
|
Expect(inspectSession).To(Exit(0))
|
|
fooIdentityPath := inspectSession.outputToString()
|
|
|
|
rmFoo := new(rmMachine)
|
|
stop, err := mb.setName(fooName).setCmd(rmFoo.withForce()).run()
|
|
Expect(err).ToNot(HaveOccurred())
|
|
Expect(stop).To(Exit(0))
|
|
|
|
_, err = os.Stat(fooIdentityPath)
|
|
Expect(err).ToNot(HaveOccurred())
|
|
_, err = os.Stat(fooIdentityPath + ".pub")
|
|
Expect(err).ToNot(HaveOccurred())
|
|
})
|
|
})
|