From 23a297198ef9aa79a99aafdd47a284fb18e1d2e2 Mon Sep 17 00:00:00 2001 From: lstocchi Date: Wed, 4 Jun 2025 10:57:48 +0200 Subject: [PATCH] add test to verify init reuse hvsock entries for hyperv machines Signed-off-by: lstocchi --- pkg/machine/e2e/init_windows_test.go | 103 +++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) diff --git a/pkg/machine/e2e/init_windows_test.go b/pkg/machine/e2e/init_windows_test.go index 2032a668f5..4efa6fd384 100644 --- a/pkg/machine/e2e/init_windows_test.go +++ b/pkg/machine/e2e/init_windows_test.go @@ -9,6 +9,7 @@ import ( "github.com/Microsoft/go-winio/vhd" "github.com/containers/libhvee/pkg/hypervctl" "github.com/containers/podman/v6/pkg/machine/define" + "github.com/containers/podman/v6/pkg/machine/hyperv/vsock" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" . "github.com/onsi/gomega/gexec" @@ -125,4 +126,106 @@ var _ = Describe("podman machine init - windows only", func() { Expect(err).ToNot(HaveOccurred()) Expect(checkSession).To(Exit(125)) }) + + It("init should create hvsock entries if they do not exist, otherwise should reuse existing ones", func() { + skipIfNotVmtype(define.HyperVVirt, "HyperV test only") + + name := randomString() + + // Ensure no HVSock entries exist before we start + networkHvSocks, err := vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Network) + Expect(err).ToNot(HaveOccurred()) + Expect(networkHvSocks).To(BeEmpty()) + + readySocks, err := vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Events) + Expect(err).ToNot(HaveOccurred()) + Expect(readySocks).To(BeEmpty()) + + fileServerVsocks, err := vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Fileserver) + Expect(err).ToNot(HaveOccurred()) + Expect(fileServerVsocks).To(BeEmpty()) + + // Execute init for the first machine. This should create new HVSock entries + i := new(initMachine) + session, err := mb.setName(name).setCmd(i.withImage(mb.imagePath)).run() + Expect(err).ToNot(HaveOccurred()) + Expect(session).To(Exit(0)) + + // Check that the HVSock entries were created + networkHvSocks, err = vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Network) + Expect(err).ToNot(HaveOccurred()) + Expect(networkHvSocks).To(HaveLen(1)) + + readySocks, err = vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Events) + Expect(err).ToNot(HaveOccurred()) + Expect(readySocks).To(HaveLen(1)) + + fileServerVsocks, err = vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Fileserver) + countFileServerVsocks := len(fileServerVsocks) + Expect(err).ToNot(HaveOccurred()) + // check that many file server vsock was created + Expect(countFileServerVsocks).To(BeNumerically(">", 1)) + + // Execute init for another machine. This should reuse the existing HVSock entries created above + otherName := randomString() + i = new(initMachine) + session, err = mb.setName(otherName).setCmd(i.withImage(mb.imagePath)).run() + Expect(err).ToNot(HaveOccurred()) + Expect(session).To(Exit(0)) + + newNetworkHvSocks, err := vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Network) + Expect(err).ToNot(HaveOccurred()) + Expect(newNetworkHvSocks).To(HaveLen(1)) + Expect(newNetworkHvSocks[0].Port).To(Equal(networkHvSocks[0].Port)) + + newReadySocks, err := vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Events) + Expect(err).ToNot(HaveOccurred()) + Expect(newReadySocks).To(HaveLen(1)) + Expect(newReadySocks[0].Port).To(Equal(readySocks[0].Port)) + + newFileServerVsocks, err := vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Fileserver) + Expect(err).ToNot(HaveOccurred()) + Expect(newFileServerVsocks).To(HaveLen(countFileServerVsocks)) + for i := 0; i < countFileServerVsocks; i++ { + Expect(newFileServerVsocks[i].Port).To(Equal(fileServerVsocks[i].Port)) + } + + // remove first created machine + rm := rmMachine{} + removeSession, err := mb.setName(name).setCmd(rm.withForce()).run() + Expect(err).ToNot(HaveOccurred()) + Expect(removeSession).To(Exit(0)) + + // Check that HVSock entries still exist after removing one machine + networkHvSocks, err = vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Network) + Expect(err).ToNot(HaveOccurred()) + Expect(networkHvSocks).To(HaveLen(1)) + + readySocks, err = vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Events) + Expect(err).ToNot(HaveOccurred()) + Expect(readySocks).To(HaveLen(1)) + + fileServerVsocks, err = vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Fileserver) + Expect(err).ToNot(HaveOccurred()) + Expect(fileServerVsocks).To(HaveLen(countFileServerVsocks)) + + // remove second created machine + rm = rmMachine{} + removeSession, err = mb.setName(otherName).setCmd(rm.withForce()).run() + Expect(err).ToNot(HaveOccurred()) + Expect(removeSession).To(Exit(0)) + + // Verify all hvsock entries created during the test were removed + networkHvSocks, err = vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Network) + Expect(err).ToNot(HaveOccurred()) + Expect(networkHvSocks).To(BeEmpty()) + + readySocks, err = vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Events) + Expect(err).ToNot(HaveOccurred()) + Expect(readySocks).To(BeEmpty()) + + fileServerVsocks, err = vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Fileserver) + Expect(err).ToNot(HaveOccurred()) + Expect(fileServerVsocks).To(BeEmpty()) + }) })