|
9 | 9 | "github.com/Microsoft/go-winio/vhd" |
10 | 10 | "github.com/containers/libhvee/pkg/hypervctl" |
11 | 11 | "github.com/containers/podman/v6/pkg/machine/define" |
| 12 | + "github.com/containers/podman/v6/pkg/machine/hyperv/vsock" |
12 | 13 | . "github.com/onsi/ginkgo/v2" |
13 | 14 | . "github.com/onsi/gomega" |
14 | 15 | . "github.com/onsi/gomega/gexec" |
@@ -125,4 +126,106 @@ var _ = Describe("podman machine init - windows only", func() { |
125 | 126 | Expect(err).ToNot(HaveOccurred()) |
126 | 127 | Expect(checkSession).To(Exit(125)) |
127 | 128 | }) |
| 129 | + |
| 130 | + It("init should create hvsock entries if they do not exist, otherwise should reuse existing ones", func() { |
| 131 | + skipIfNotVmtype(define.HyperVVirt, "HyperV test only") |
| 132 | + |
| 133 | + name := randomString() |
| 134 | + |
| 135 | + // Ensure no HVSock entries exist before we start |
| 136 | + networkHvSocks, err := vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Network) |
| 137 | + Expect(err).ToNot(HaveOccurred()) |
| 138 | + Expect(networkHvSocks).To(BeEmpty()) |
| 139 | + |
| 140 | + readySocks, err := vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Events) |
| 141 | + Expect(err).ToNot(HaveOccurred()) |
| 142 | + Expect(readySocks).To(BeEmpty()) |
| 143 | + |
| 144 | + fileServerVsocks, err := vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Fileserver) |
| 145 | + Expect(err).ToNot(HaveOccurred()) |
| 146 | + Expect(fileServerVsocks).To(BeEmpty()) |
| 147 | + |
| 148 | + // Execute init for the first machine. This should create new HVSock entries |
| 149 | + i := new(initMachine) |
| 150 | + session, err := mb.setName(name).setCmd(i.withImage(mb.imagePath)).run() |
| 151 | + Expect(err).ToNot(HaveOccurred()) |
| 152 | + Expect(session).To(Exit(0)) |
| 153 | + |
| 154 | + // Check that the HVSock entries were created |
| 155 | + networkHvSocks, err = vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Network) |
| 156 | + Expect(err).ToNot(HaveOccurred()) |
| 157 | + Expect(networkHvSocks).To(HaveLen(1)) |
| 158 | + |
| 159 | + readySocks, err = vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Events) |
| 160 | + Expect(err).ToNot(HaveOccurred()) |
| 161 | + Expect(readySocks).To(HaveLen(1)) |
| 162 | + |
| 163 | + fileServerVsocks, err = vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Fileserver) |
| 164 | + countFileServerVsocks := len(fileServerVsocks) |
| 165 | + Expect(err).ToNot(HaveOccurred()) |
| 166 | + // check that many file server vsock was created |
| 167 | + Expect(countFileServerVsocks).To(BeNumerically(">", 1)) |
| 168 | + |
| 169 | + // Execute init for another machine. This should reuse the existing HVSock entries created above |
| 170 | + otherName := randomString() |
| 171 | + i = new(initMachine) |
| 172 | + session, err = mb.setName(otherName).setCmd(i.withImage(mb.imagePath)).run() |
| 173 | + Expect(err).ToNot(HaveOccurred()) |
| 174 | + Expect(session).To(Exit(0)) |
| 175 | + |
| 176 | + newNetworkHvSocks, err := vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Network) |
| 177 | + Expect(err).ToNot(HaveOccurred()) |
| 178 | + Expect(newNetworkHvSocks).To(HaveLen(1)) |
| 179 | + Expect(newNetworkHvSocks[0].Port).To(Equal(networkHvSocks[0].Port)) |
| 180 | + |
| 181 | + newReadySocks, err := vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Events) |
| 182 | + Expect(err).ToNot(HaveOccurred()) |
| 183 | + Expect(newReadySocks).To(HaveLen(1)) |
| 184 | + Expect(newReadySocks[0].Port).To(Equal(readySocks[0].Port)) |
| 185 | + |
| 186 | + newFileServerVsocks, err := vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Fileserver) |
| 187 | + Expect(err).ToNot(HaveOccurred()) |
| 188 | + Expect(newFileServerVsocks).To(HaveLen(countFileServerVsocks)) |
| 189 | + for i := 0; i < countFileServerVsocks; i++ { |
| 190 | + Expect(newFileServerVsocks[i].Port).To(Equal(fileServerVsocks[i].Port)) |
| 191 | + } |
| 192 | + |
| 193 | + // remove first created machine |
| 194 | + rm := rmMachine{} |
| 195 | + removeSession, err := mb.setName(name).setCmd(rm.withForce()).run() |
| 196 | + Expect(err).ToNot(HaveOccurred()) |
| 197 | + Expect(removeSession).To(Exit(0)) |
| 198 | + |
| 199 | + // Check that HVSock entries still exist after removing one machine |
| 200 | + networkHvSocks, err = vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Network) |
| 201 | + Expect(err).ToNot(HaveOccurred()) |
| 202 | + Expect(networkHvSocks).To(HaveLen(1)) |
| 203 | + |
| 204 | + readySocks, err = vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Events) |
| 205 | + Expect(err).ToNot(HaveOccurred()) |
| 206 | + Expect(readySocks).To(HaveLen(1)) |
| 207 | + |
| 208 | + fileServerVsocks, err = vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Fileserver) |
| 209 | + Expect(err).ToNot(HaveOccurred()) |
| 210 | + Expect(fileServerVsocks).To(HaveLen(countFileServerVsocks)) |
| 211 | + |
| 212 | + // remove second created machine |
| 213 | + rm = rmMachine{} |
| 214 | + removeSession, err = mb.setName(otherName).setCmd(rm.withForce()).run() |
| 215 | + Expect(err).ToNot(HaveOccurred()) |
| 216 | + Expect(removeSession).To(Exit(0)) |
| 217 | + |
| 218 | + // Verify all hvsock entries created during the test were removed |
| 219 | + networkHvSocks, err = vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Network) |
| 220 | + Expect(err).ToNot(HaveOccurred()) |
| 221 | + Expect(networkHvSocks).To(BeEmpty()) |
| 222 | + |
| 223 | + readySocks, err = vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Events) |
| 224 | + Expect(err).ToNot(HaveOccurred()) |
| 225 | + Expect(readySocks).To(BeEmpty()) |
| 226 | + |
| 227 | + fileServerVsocks, err = vsock.LoadAllHVSockRegistryEntriesByPurpose(vsock.Fileserver) |
| 228 | + Expect(err).ToNot(HaveOccurred()) |
| 229 | + Expect(fileServerVsocks).To(BeEmpty()) |
| 230 | + }) |
128 | 231 | }) |
0 commit comments