diff --git a/pkg/machine/applehv/machine.go b/pkg/machine/applehv/machine.go index 91feb8e29a..5b6219efb7 100644 --- a/pkg/machine/applehv/machine.go +++ b/pkg/machine/applehv/machine.go @@ -267,7 +267,7 @@ func (m *MacMachine) Init(opts machine.InitOptions) (bool, error) { return false, err } - readyUnitFile, err := createReadyUnitFile() + readyUnitFile, err := ignition.CreateReadyUnitFile(define.AppleHvVirt, nil) if err != nil { return false, err } @@ -286,13 +286,6 @@ func (m *MacMachine) Init(opts machine.InitOptions) (bool, error) { return err == nil, err } -func createReadyUnitFile() (string, error) { - readyUnit := ignition.DefaultReadyUnitFile() - readyUnit.Add("Unit", "Requires", "dev-virtio\\x2dports-vsock.device") - readyUnit.Add("Service", "ExecStart", "/bin/sh -c '/usr/bin/echo Ready | socat - VSOCK-CONNECT:2:1025'") - return readyUnit.ToString() -} - func (m *MacMachine) removeSystemConnections() error { return machine.RemoveConnections(m.Name, fmt.Sprintf("%s-root", m.Name)) } diff --git a/pkg/machine/hyperv/machine.go b/pkg/machine/hyperv/machine.go index ea8d522144..9857213e4c 100644 --- a/pkg/machine/hyperv/machine.go +++ b/pkg/machine/hyperv/machine.go @@ -245,7 +245,8 @@ func (m *HyperVMachine) Init(opts machine.InitOptions) (bool, error) { return false, err } - readyUnitFile, err := createReadyUnit(m.ReadyHVSock.Port) + readyOpts := ignition.ReadyUnitOpts{Port: m.ReadyHVSock.Port} + readyUnitFile, err := ignition.CreateReadyUnitFile(define.HyperVVirt, &readyOpts) if err != nil { return false, err } @@ -293,13 +294,6 @@ func (m *HyperVMachine) Init(opts machine.InitOptions) (bool, error) { return err == nil, err } -func createReadyUnit(readyPort uint64) (string, error) { - readyUnit := ignition.DefaultReadyUnitFile() - readyUnit.Add("Unit", "After", "systemd-user-sessions.service") - readyUnit.Add("Service", "ExecStart", fmt.Sprintf("/bin/sh -c '/usr/bin/echo Ready | socat - VSOCK-CONNECT:2:%d'", readyPort)) - return readyUnit.ToString() -} - func createNetworkUnit(netPort uint64) (string, error) { netUnit := parser.NewUnitFile() netUnit.Add("Unit", "Description", "vsock_network") diff --git a/pkg/machine/ignition/ready.go b/pkg/machine/ignition/ready.go new file mode 100644 index 0000000000..6fb775ef67 --- /dev/null +++ b/pkg/machine/ignition/ready.go @@ -0,0 +1,39 @@ +package ignition + +import ( + "errors" + "fmt" + + "github.com/containers/podman/v4/pkg/machine/define" +) + +// ReadyUnitOpts are options for creating the ready unit that reports back to podman +// when the system is booted +type ReadyUnitOpts struct { + Port uint64 +} + +// CreateReadyUnitFile makes a the ready unit to report back to the host that the system is running +func CreateReadyUnitFile(provider define.VMType, opts *ReadyUnitOpts) (string, error) { + readyUnit := DefaultReadyUnitFile() + switch provider { + case define.QemuVirt: + readyUnit.Add("Unit", "Requires", "dev-virtio\\x2dports-vport1p1.device") + readyUnit.Add("Unit", "After", "systemd-user-sessions.service") + readyUnit.Add("Service", "ExecStart", "/bin/sh -c '/usr/bin/echo Ready >/dev/vport1p1'") + case define.AppleHvVirt: + readyUnit.Add("Unit", "Requires", "dev-virtio\\x2dports-vsock.device") + readyUnit.Add("Service", "ExecStart", "/bin/sh -c '/usr/bin/echo Ready | socat - VSOCK-CONNECT:2:1025'") + case define.HyperVVirt: + if opts == nil || opts.Port == 0 { + return "", errors.New("no port provided for hyperv ready unit") + } + readyUnit.Add("Unit", "After", "systemd-user-sessions.service") + readyUnit.Add("Service", "ExecStart", fmt.Sprintf("/bin/sh -c '/usr/bin/echo Ready | socat - VSOCK-CONNECT:2:%d'", opts.Port)) + case define.WSLVirt: // WSL does not use ignition + return "", nil + default: + return "", fmt.Errorf("unable to generate ready unit for provider %q", provider.String()) + } + return readyUnit.ToString() +} diff --git a/pkg/machine/qemu/machine.go b/pkg/machine/qemu/machine.go index 14ab01d790..a2f7b3f123 100644 --- a/pkg/machine/qemu/machine.go +++ b/pkg/machine/qemu/machine.go @@ -213,7 +213,7 @@ func (v *MachineVM) Init(opts machine.InitOptions) (bool, error) { return false, err } - readyUnitFile, err := createReadyUnitFile() + readyUnitFile, err := ignition.CreateReadyUnitFile(define.QemuVirt, nil) if err != nil { return false, err } @@ -230,14 +230,6 @@ func (v *MachineVM) Init(opts machine.InitOptions) (bool, error) { return err == nil, err } -func createReadyUnitFile() (string, error) { - readyUnit := ignition.DefaultReadyUnitFile() - readyUnit.Add("Unit", "Requires", "dev-virtio\\x2dports-vport1p1.device") - readyUnit.Add("Unit", "After", "systemd-user-sessions.service") - readyUnit.Add("Service", "ExecStart", "/bin/sh -c '/usr/bin/echo Ready >/dev/vport1p1'") - return readyUnit.ToString() -} - func (v *MachineVM) removeSystemConnections() error { return machine.RemoveConnections(v.Name, fmt.Sprintf("%s-root", v.Name)) }