diff --git a/cmd/macadam/init.go b/cmd/macadam/init.go index d2c4c303..279350dd 100644 --- a/cmd/macadam/init.go +++ b/cmd/macadam/init.go @@ -32,8 +32,8 @@ var ( ValidArgsFunction: completion.AutocompleteNone, } - initOptsFromFlags = define.InitOptions{} - // initOptionalFlags = InitOptionalFlags{} + initOptsFromFlags = define.InitOptions{} + initOptionalFlags = InitOptionalFlags{} defaultMachineName = "macadam" // now bool ) @@ -82,6 +82,10 @@ func init() { flags.StringSliceVarP(&initOptsFromFlags.CloudInitPaths, CloudInitPathFlagName, "", []string{}, "Path to user-data, meta-data and network-config cloud-init configuration files") _ = initCmd.RegisterFlagCompletionFunc(CloudInitPathFlagName, completion.AutocompleteDefault) + userModeNetFlagName := "user-mode-networking" + flags.BoolVar(&initOptionalFlags.UserModeNetworking, userModeNetFlagName, false, + "Whether this machine should use user-mode networking, routing traffic through a host user-space process (Hyperv-only, requires --provider=hyperv)") + /* flags := initCmd.Flags() cfg := registry.PodmanConfig() @@ -142,11 +146,7 @@ func init() { _ = initCmd.RegisterFlagCompletionFunc(IgnitionPathFlagName, completion.AutocompleteDefault) rootfulFlagName := "rootful" - flags.BoolVar(&initOpts.Rootful, rootfulFlagName, false, "Whether this machine should prefer rootful container execution") - - userModeNetFlagName := "user-mode-networking" - flags.BoolVar(&initOptionalFlags.UserModeNetworking, userModeNetFlagName, false, - "Whether this machine should use user-mode networking, routing traffic through a host user-space process") */ + flags.BoolVar(&initOpts.Rootful, rootfulFlagName, false, "Whether this machine should prefer rootful container execution") */ } func initMachine(cmd *cobra.Command, args []string) error { @@ -155,7 +155,7 @@ func initMachine(cmd *cobra.Command, args []string) error { return err } - if err := preflights.RunPreflights(vmProvider); err != nil { + if err := preflights.RunPreflights(vmProvider, initOptionalFlags.UserModeNetworking); err != nil { slog.Error(err.Error()) os.Exit(1) } @@ -215,6 +215,7 @@ func initMachine(cmd *cobra.Command, args []string) error { HasReadyUnit: false, ForwardSockets: false, } + initOpts.UserModeNetworking = &initOptionalFlags.UserModeNetworking /* _, _, err = shim.VMExists(machineName, []vmconfigs.VMProvider{provider}) if err == nil { diff --git a/cmd/macadam/preflight.go b/cmd/macadam/preflight.go index 3de1fab2..443060a0 100644 --- a/cmd/macadam/preflight.go +++ b/cmd/macadam/preflight.go @@ -29,5 +29,5 @@ func preflight(_ *cobra.Command, args []string) error { if err != nil { return err } - return preflights.RunPreflights(vmProvider) + return preflights.RunPreflights(vmProvider, false) } diff --git a/go.mod b/go.mod index 83817db9..e2f7cc04 100644 --- a/go.mod +++ b/go.mod @@ -191,6 +191,6 @@ require ( tags.cncf.io/container-device-interface/specs-go v1.0.0 // indirect ) -replace github.com/containers/podman/v5 => github.com/cfergeau/podman/v5 v5.0.0-20250924155458-168a7bca9bee +replace github.com/containers/podman/v5 => github.com/cfergeau/podman/v5 v5.0.0-20251015161310-92f0af92dc3e replace github.com/crc-org/machine => github.com/cfergeau/machine v0.0.0-20241127155529-1b8b9b8d1078 diff --git a/go.sum b/go.sum index 8c759670..2a69ec4c 100644 --- a/go.sum +++ b/go.sum @@ -33,8 +33,8 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cfergeau/machine v0.0.0-20241127155529-1b8b9b8d1078 h1:KpgRncgq6ZiWDnLe6R58dJjd6QSuU7RDqRrpl11Dxcg= github.com/cfergeau/machine v0.0.0-20241127155529-1b8b9b8d1078/go.mod h1:trWeQimjfE3dJ8qWOxI4ePtYm13aecK42bf01s6h/Nc= -github.com/cfergeau/podman/v5 v5.0.0-20250924155458-168a7bca9bee h1:FZnjrAe2f40Y+lbGTzs48fwPI5q3zM4PyiTOlVLLtMM= -github.com/cfergeau/podman/v5 v5.0.0-20250924155458-168a7bca9bee/go.mod h1:/M4sKOScoXIFFAfLURDYibSSBDcx67Q+Mi9tdT5guV0= +github.com/cfergeau/podman/v5 v5.0.0-20251015161310-92f0af92dc3e h1:CVsF1j6brKiUWio1eN2lZ+75sZWoUX15eCogz0vkr04= +github.com/cfergeau/podman/v5 v5.0.0-20251015161310-92f0af92dc3e/go.mod h1:/M4sKOScoXIFFAfLURDYibSSBDcx67Q+Mi9tdT5guV0= github.com/checkpoint-restore/checkpointctl v1.3.0 h1:bNz5b6s+lxFdG5ZGDba3qSkBtXDDTCG2494dfAbQJ4E= github.com/checkpoint-restore/checkpointctl v1.3.0/go.mod h1:dqZH4wDvbjnsqFGK2LdUDk21yFQ1dCAtzgRMlG44KDM= github.com/checkpoint-restore/go-criu/v7 v7.2.0 h1:qGiWA4App1gGlEfIJ68WR9jbezV9J7yZdjzglezcqKo= diff --git a/pkg/preflights/preflights.go b/pkg/preflights/preflights.go index 31c1ce23..85c71614 100644 --- a/pkg/preflights/preflights.go +++ b/pkg/preflights/preflights.go @@ -12,8 +12,12 @@ import ( "github.com/containers/podman/v5/pkg/machine/vmconfigs" ) -func RunPreflights(provider vmconfigs.VMProvider) error { - if err := checkGvproxyVersion(provider); err != nil { +func RunPreflights(provider vmconfigs.VMProvider, userModeNetworking bool) error { + if err := validateOptions(provider, userModeNetworking); err != nil { + return err + } + + if err := checkGvproxyVersion(provider, userModeNetworking); err != nil { return fmt.Errorf("invalid gvproxy binary: %w", err) } @@ -28,10 +32,17 @@ func RunPreflights(provider vmconfigs.VMProvider) error { return nil } +func validateOptions(provider vmconfigs.VMProvider, userModeNetworking bool) error { + if provider.VMType() == define.WSLVirt && userModeNetworking { + return fmt.Errorf("user-mode networking is not supported on WSL. Please run the command without the --user-mode-networking flag") + } + return nil +} + // macadam/podman needs a gvproxy version which supports the --services // argument -func checkGvproxyVersion(provider vmconfigs.VMProvider) error { - if provider.VMType() == define.WSLVirt || provider.VMType() == define.HyperVVirt { +func checkGvproxyVersion(provider vmconfigs.VMProvider, userModeNetworking bool) error { + if provider.VMType() == define.WSLVirt || (provider.VMType() == define.HyperVVirt && !userModeNetworking) { return nil } if err := checkBinaryArg(machine.ForwarderBinaryName, "-services"); err != nil { diff --git a/vendor/github.com/containers/podman/v5/pkg/domain/infra/abi/play_linux.go b/vendor/github.com/containers/podman/v5/pkg/domain/infra/abi/play_linux.go new file mode 100644 index 00000000..a0f98115 --- /dev/null +++ b/vendor/github.com/containers/podman/v5/pkg/domain/infra/abi/play_linux.go @@ -0,0 +1,18 @@ +//go:build !remote + +package abi + +import ( + "os" + + securejoin "github.com/cyphar/filepath-securejoin" +) + +// openSymlinkPath opens the path under root using securejoin.OpenatInRoot(). +func openSymlinkPath(root *os.File, unsafePath string, flags int) (*os.File, error) { + file, err := securejoin.OpenatInRoot(root, unsafePath) + if err != nil { + return nil, err + } + return securejoin.Reopen(file, flags) +} diff --git a/vendor/github.com/containers/podman/v5/pkg/domain/infra/abi/play_unsupported.go b/vendor/github.com/containers/podman/v5/pkg/domain/infra/abi/play_unsupported.go new file mode 100644 index 00000000..3ecbae7c --- /dev/null +++ b/vendor/github.com/containers/podman/v5/pkg/domain/infra/abi/play_unsupported.go @@ -0,0 +1,13 @@ +//go:build !linux && !remote + +package abi + +import ( + "errors" + "os" +) + +// openSymlinkPath is not supported on this platform. +func openSymlinkPath(root *os.File, unsafePath string, flags int) (*os.File, error) { + return nil, errors.New("cannot safely open symlink on this platform") +} diff --git a/vendor/github.com/containers/podman/v5/pkg/machine/cloudinit/cloudinit.go b/vendor/github.com/containers/podman/v5/pkg/machine/cloudinit/cloudinit.go index c87a14cc..e9bcdc1a 100644 --- a/vendor/github.com/containers/podman/v5/pkg/machine/cloudinit/cloudinit.go +++ b/vendor/github.com/containers/podman/v5/pkg/machine/cloudinit/cloudinit.go @@ -6,12 +6,10 @@ import ( "os" "path/filepath" - "github.com/containers/podman/v5/pkg/machine" "github.com/containers/podman/v5/pkg/machine/define" "github.com/containers/podman/v5/pkg/machine/vmconfigs" "github.com/kdomanski/iso9660" "github.com/sirupsen/logrus" - "gopkg.in/yaml.v3" ) type User struct { @@ -22,38 +20,24 @@ type User struct { SSHKeys []string `yaml:"ssh_authorized_keys"` } -type UserData struct { - Users []User `yaml:"users"` +type WriteFile struct { + Path string `yaml:"path,omitempty"` + Content string `yaml:"content,omitempty"` + Encoding string `yaml:"encoding,omitempty"` + Owner string `yaml:"owner,omitempty"` + Permissions string `yaml:"permissions,omitempty"` } -func GenerateUserData(mc *vmconfigs.MachineConfig) ([]byte, error) { - sshKey, err := machine.GetSSHKeys(mc.SSH.IdentityPath) - if err != nil { - return nil, err - } - - userData := UserData{ - Users: []User{ - User{ - Name: mc.SSH.RemoteUsername, - Sudo: "ALL=(ALL) NOPASSWD:ALL", - Shell: "/bin/bash", - Groups: []string{"users"}, - SSHKeys: []string{sshKey}, - }, - }, - } - - yamlBytes, err := yaml.Marshal(&userData) - if err != nil { - logrus.Errorf("Error marshaling to YAML: %v", err) - return nil, err - } - - headerLine := "#cloud-config\n" - yamlBytes = append([]byte(headerLine), yamlBytes...) +type UserData struct { + Users []User `yaml:"users"` + WriteFiles []WriteFile `yaml:"write_files,omitempty"` + RunCmd []string `yaml:"runcmd,omitempty"` + Mounts [][]string `yaml:"mounts,omitempty"` +} - return yamlBytes, nil +type EmbeddedResource struct { + Name string `yaml:"name"` + Content []byte `yaml:"content"` } func GenerateUserDataFile(mc *vmconfigs.MachineConfig) (string, error) { @@ -138,6 +122,15 @@ func GenerateISO(mc *vmconfigs.MachineConfig) (*define.VMFile, error) { return nil, err } + resources := GetEmbeddedResources(mc) + if resources != nil { + for _, res := range resources { + if err := writer.AddFile(bytes.NewReader(res.Content), res.Name); err != nil { + return nil, err + } + } + } + vmFile, err := GetCloudInitISOVMFile(mc) if err != nil { return nil, err diff --git a/vendor/github.com/containers/podman/v5/pkg/machine/cloudinit/cloudinit_unix.go b/vendor/github.com/containers/podman/v5/pkg/machine/cloudinit/cloudinit_unix.go new file mode 100644 index 00000000..1deae6e6 --- /dev/null +++ b/vendor/github.com/containers/podman/v5/pkg/machine/cloudinit/cloudinit_unix.go @@ -0,0 +1,44 @@ +//go:build !windows + +package cloudinit + +import ( + "github.com/containers/podman/v5/pkg/machine" + "github.com/containers/podman/v5/pkg/machine/vmconfigs" + "github.com/sirupsen/logrus" + "gopkg.in/yaml.v3" +) + +func GenerateUserData(mc *vmconfigs.MachineConfig) ([]byte, error) { + sshKey, err := machine.GetSSHKeys(mc.SSH.IdentityPath) + if err != nil { + return nil, err + } + + userData := UserData{ + Users: []User{ + User{ + Name: mc.SSH.RemoteUsername, + Sudo: "ALL=(ALL) NOPASSWD:ALL", + Shell: "/bin/bash", + Groups: []string{"users"}, + SSHKeys: []string{sshKey}, + }, + }, + } + + yamlBytes, err := yaml.Marshal(&userData) + if err != nil { + logrus.Errorf("Error marshaling to YAML: %v", err) + return nil, err + } + + headerLine := "#cloud-config\n" + yamlBytes = append([]byte(headerLine), yamlBytes...) + + return yamlBytes, nil +} + +func GetEmbeddedResources(_ *vmconfigs.MachineConfig) []EmbeddedResource { + return nil +} diff --git a/vendor/github.com/containers/podman/v5/pkg/machine/cloudinit/cloudinit_windows.go b/vendor/github.com/containers/podman/v5/pkg/machine/cloudinit/cloudinit_windows.go new file mode 100644 index 00000000..e0c7de5a --- /dev/null +++ b/vendor/github.com/containers/podman/v5/pkg/machine/cloudinit/cloudinit_windows.go @@ -0,0 +1,161 @@ +//go:build windows + +package cloudinit + +import ( + "encoding/json" + "fmt" + "io" + "net/http" + + "github.com/containers/podman/v5/pkg/machine" + "github.com/containers/podman/v5/pkg/machine/hyperv/hutil" + "github.com/containers/podman/v5/pkg/machine/vmconfigs" + "github.com/sirupsen/logrus" + "gopkg.in/yaml.v3" +) + +func GenerateUserData(mc *vmconfigs.MachineConfig) ([]byte, error) { + sshKey, err := machine.GetSSHKeys(mc.SSH.IdentityPath) + if err != nil { + return nil, err + } + + userData := UserData{ + Users: []User{ + User{ + Name: mc.SSH.RemoteUsername, + Sudo: "ALL=(ALL) NOPASSWD:ALL", + Shell: "/bin/bash", + Groups: []string{"users"}, + SSHKeys: []string{sshKey}, + }, + }, + } + + if mc.HyperVHypervisor != nil && mc.HyperVHypervisor.UserModeNetworking { + netUnitFile, err := hutil.CreateNetworkUnit(mc.HyperVHypervisor.NetworkVSock.Port) + if err != nil { + return nil, err + } + + userData.WriteFiles = []WriteFile{ + { + Path: "/etc/NetworkManager/system-connections/vsock0.nmconnection", + Content: hutil.HyperVVsockNMConnection, + Permissions: "0600", + Owner: "root", + }, + { + Path: "/etc/systemd/system/vsock-network.service", + Content: netUnitFile, + Permissions: "0644", + Owner: "root", + }, + } + + userData.RunCmd = []string{ + "install -o root -g root -m 0755 /mnt/gvforwarder /usr/local/bin/gvforwarder", + "nmcli connection reload", + "systemctl daemon-reload", + "systemctl enable --now vsock-network.service", + } + + userData.Mounts = [][]string{ + {"/dev/sr0", "/mnt", "iso9660", "defaults,ro", "0", "0"}, + } + } + + yamlBytes, err := yaml.Marshal(&userData) + if err != nil { + logrus.Errorf("Error marshaling to YAML: %v", err) + return nil, err + } + + headerLine := "#cloud-config\n" + yamlBytes = append([]byte(headerLine), yamlBytes...) + return yamlBytes, nil +} + +func getGvForwarderBytes() ([]byte, error) { + url, err := getGvForwarderDownloadUrl() + if err != nil { + return nil, err + } + + resp, err := http.Get(url) + if err != nil { + return nil, fmt.Errorf("failed to download gvforwarder: %w", err) + } + + defer func() { + if err := resp.Body.Close(); err != nil { + logrus.Error(err) + } + }() + + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("failed to download gvforwarder: %s", resp.Status) + } + + bytes, err := io.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("failed to read gvforwarder response body: %w", err) + } + + return bytes, nil +} + +func getGvForwarderDownloadUrl() (string, error) { + apiURL := "https://api.github.com/repos/containers/gvisor-tap-vsock/releases/latest" + resp, err := http.Get(apiURL) + if err != nil { + return "", err + } + defer func() { + if err := resp.Body.Close(); err != nil { + logrus.Error(err) + } + }() + + if resp.StatusCode != http.StatusOK { + return "", fmt.Errorf("failed to get latest gvforwarder release information: %s", resp.Status) + } + + var releaseInfo struct { + Assets []struct { + Name string `json:"name"` + DownloadUrl string `json:"browser_download_url"` + } `json:"assets"` + } + if err := json.NewDecoder(resp.Body).Decode(&releaseInfo); err != nil { + return "", err + } + + for _, asset := range releaseInfo.Assets { + if asset.Name == "gvforwarder" { + return asset.DownloadUrl, nil + } + } + + return "", fmt.Errorf("gvforwarder latest release not found") +} + +func GetEmbeddedResources(mc *vmconfigs.MachineConfig) []EmbeddedResource { + // Only add gvforwarder if using Hyper-V with user-mode networking + if mc.HyperVHypervisor == nil || !mc.HyperVHypervisor.UserModeNetworking { + return nil + } + + extraFiles := []EmbeddedResource{} + gvforwarderBytes, err := getGvForwarderBytes() + if err != nil { + logrus.Errorf("Failed to get gvforwarder: %v", err) + return extraFiles + } + extraFiles = append(extraFiles, EmbeddedResource{ + Name: "gvforwarder", + Content: gvforwarderBytes, + }) + return extraFiles +} diff --git a/vendor/github.com/containers/podman/v5/pkg/machine/hyperv/hutil/hutil.go b/vendor/github.com/containers/podman/v5/pkg/machine/hyperv/hutil/hutil.go new file mode 100644 index 00000000..3a77de1a --- /dev/null +++ b/vendor/github.com/containers/podman/v5/pkg/machine/hyperv/hutil/hutil.go @@ -0,0 +1,35 @@ +package hutil + +import ( + "fmt" + + "github.com/containers/podman/v5/pkg/systemd/parser" +) + +const HyperVVsockNMConnection = ` +[connection] +id=vsock0 +type=tun +interface-name=vsock0 + +[tun] +mode=2 + +[802-3-ethernet] +cloned-mac-address=5A:94:EF:E4:0C:EE + +[ipv4] +method=auto + +[proxy] +` + +func CreateNetworkUnit(netPort uint64) (string, error) { + netUnit := parser.NewUnitFile() + netUnit.Add("Unit", "Description", "vsock_network") + netUnit.Add("Unit", "After", "NetworkManager.service") + netUnit.Add("Service", "ExecStart", fmt.Sprintf("/usr/libexec/podman/gvforwarder -preexisting -iface vsock0 -url vsock://2:%d/connect", netPort)) + netUnit.Add("Service", "ExecStartPost", "/usr/bin/nmcli c up vsock0") + netUnit.Add("Install", "WantedBy", "multi-user.target") + return netUnit.ToString() +} diff --git a/vendor/github.com/containers/podman/v5/pkg/machine/hyperv/stubber.go b/vendor/github.com/containers/podman/v5/pkg/machine/hyperv/stubber.go index c17e2dd7..c719228b 100644 --- a/vendor/github.com/containers/podman/v5/pkg/machine/hyperv/stubber.go +++ b/vendor/github.com/containers/podman/v5/pkg/machine/hyperv/stubber.go @@ -24,10 +24,10 @@ import ( "github.com/containers/podman/v5/pkg/machine/cloudinit" "github.com/containers/podman/v5/pkg/machine/define" "github.com/containers/podman/v5/pkg/machine/env" + "github.com/containers/podman/v5/pkg/machine/hyperv/hutil" "github.com/containers/podman/v5/pkg/machine/hyperv/vsock" "github.com/containers/podman/v5/pkg/machine/ignition" "github.com/containers/podman/v5/pkg/machine/vmconfigs" - "github.com/containers/podman/v5/pkg/systemd/parser" "github.com/sirupsen/logrus" ) @@ -77,17 +77,9 @@ func (h HyperVStubber) CreateVM(opts define.CreateVMOpts, mc *vmconfigs.MachineC } // Set userModeNetworking based on cloudInit value for backwards compatibility - // Usermode networking with hyperv requires gvforwarder in the guest, and the cloud init code cannot inject it for now, - // so it has to be disabled. - mc.HyperVHypervisor.UserModeNetworking = !mc.CloudInit - if mc.CloudInit { - // Generate cloud-init ISO - iso, err := cloudinit.GenerateISO(mc) - if err != nil { - return fmt.Errorf("generating cloud-init ISO: %w", err) - } - hwConfig.DVDDiskPath = iso.GetPath() - } + // Usermode networking is true by default when working with ignition + // If cloud-init is enabled, use userModeNetworking from options + mc.HyperVHypervisor.UserModeNetworking = !mc.CloudInit || opts.UserModeNetworking if mc.HyperVHypervisor.UserModeNetworking { networkHVSock, err := vsock.NewHVSockRegistryEntry(mc.Name, vsock.Network) @@ -101,6 +93,15 @@ func (h HyperVStubber) CreateVM(opts define.CreateVMOpts, mc *vmconfigs.MachineC hwConfig.Network = true } + if mc.CloudInit { + // Generate cloud-init ISO + iso, err := cloudinit.GenerateISO(mc) + if err != nil { + return fmt.Errorf("generating cloud-init ISO: %w", err) + } + hwConfig.DVDDiskPath = iso.GetPath() + } + // Add vsock port numbers to mounts err = createShares(mc) if err != nil { @@ -119,7 +120,7 @@ func (h HyperVStubber) CreateVM(opts define.CreateVMOpts, mc *vmconfigs.MachineC callbackFuncs.Add(removeRegistrySockets) if builder != nil { - netUnitFile, err := createNetworkUnit(mc.HyperVHypervisor.NetworkVSock.Port) + netUnitFile, err := hutil.CreateNetworkUnit(mc.HyperVHypervisor.NetworkVSock.Port) if err != nil { return err } @@ -137,7 +138,7 @@ func (h HyperVStubber) CreateVM(opts define.CreateVMOpts, mc *vmconfigs.MachineC FileEmbedded1: ignition.FileEmbedded1{ Append: nil, Contents: ignition.Resource{ - Source: ignition.EncodeDataURLPtr(hyperVVsockNMConnection), + Source: ignition.EncodeDataURLPtr(hutil.HyperVVsockNMConnection), }, Mode: ignition.IntToPtr(0600), }, @@ -648,34 +649,6 @@ func logCommandToFile(c *exec.Cmd, filename string) (*os.File, error) { return log, nil } -const hyperVVsockNMConnection = ` -[connection] -id=vsock0 -type=tun -interface-name=vsock0 - -[tun] -mode=2 - -[802-3-ethernet] -cloned-mac-address=5A:94:EF:E4:0C:EE - -[ipv4] -method=auto - -[proxy] -` - -func createNetworkUnit(netPort uint64) (string, error) { - netUnit := parser.NewUnitFile() - netUnit.Add("Unit", "Description", "vsock_network") - netUnit.Add("Unit", "After", "NetworkManager.service") - netUnit.Add("Service", "ExecStart", fmt.Sprintf("/usr/libexec/podman/gvforwarder -preexisting -iface vsock0 -url vsock://2:%d/connect", netPort)) - netUnit.Add("Service", "ExecStartPost", "/usr/bin/nmcli c up vsock0") - netUnit.Add("Install", "WantedBy", "multi-user.target") - return netUnit.ToString() -} - func (h HyperVStubber) GetRosetta(mc *vmconfigs.MachineConfig) (bool, error) { return false, nil } diff --git a/vendor/modules.txt b/vendor/modules.txt index 8ecf683c..09a08fa5 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -317,7 +317,7 @@ github.com/containers/ocicrypt/keywrap/pkcs7 github.com/containers/ocicrypt/spec github.com/containers/ocicrypt/utils github.com/containers/ocicrypt/utils/keyprovider -# github.com/containers/podman/v5 v5.3.1 => github.com/cfergeau/podman/v5 v5.0.0-20250924155458-168a7bca9bee +# github.com/containers/podman/v5 v5.3.1 => github.com/cfergeau/podman/v5 v5.0.0-20251015161310-92f0af92dc3e ## explicit; go 1.23.3 github.com/containers/podman/v5/cmd/podman/parse github.com/containers/podman/v5/cmd/podman/registry @@ -396,6 +396,7 @@ github.com/containers/podman/v5/pkg/machine/connection github.com/containers/podman/v5/pkg/machine/define github.com/containers/podman/v5/pkg/machine/env github.com/containers/podman/v5/pkg/machine/hyperv +github.com/containers/podman/v5/pkg/machine/hyperv/hutil github.com/containers/podman/v5/pkg/machine/hyperv/vsock github.com/containers/podman/v5/pkg/machine/ignition github.com/containers/podman/v5/pkg/machine/libkrun @@ -1321,5 +1322,5 @@ tags.cncf.io/container-device-interface/pkg/parser # tags.cncf.io/container-device-interface/specs-go v1.0.0 ## explicit; go 1.19 tags.cncf.io/container-device-interface/specs-go -# github.com/containers/podman/v5 => github.com/cfergeau/podman/v5 v5.0.0-20250924155458-168a7bca9bee +# github.com/containers/podman/v5 => github.com/cfergeau/podman/v5 v5.0.0-20251015161310-92f0af92dc3e # github.com/crc-org/machine => github.com/cfergeau/machine v0.0.0-20241127155529-1b8b9b8d1078