Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 31 additions & 1 deletion console.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package vz

import (
"errors"

"github.com/Code-Hex/vz/v4/internal/objc"
"github.com/Code-Hex/vz/v4/internal/vzbridge"
)
Expand Down Expand Up @@ -28,8 +30,28 @@ type VirtioConsoleDeviceConfiguration struct {

var _ ConsoleDeviceConfiguration = (*VirtioConsoleDeviceConfiguration)(nil)

// VirtioConsoleDeviceConfigurationOption configures a new Virtio console device.
type VirtioConsoleDeviceConfigurationOption func(*VirtioConsoleDeviceConfiguration) error

// WithVirtioConsoleMaximumPortCount sets the number of ports allocated by the device.
// count must be greater than the highest port index added to the configuration.
// Without this option, Virtualization.framework derives the count from the ports.
// This option applies when creating the configuration, not while a VM is running.
//
// See: https://developer.apple.com/documentation/virtualization/vzvirtioconsoleportconfigurationarray/maximumportcount?language=objc
func WithVirtioConsoleMaximumPortCount(count uint32) VirtioConsoleDeviceConfigurationOption {
return func(config *VirtioConsoleDeviceConfiguration) error {
vzbridge.VZVirtioConsolePortConfigurationArray_SetMaximumPortCount(config.portsPtr, count)
return nil
}
}

// NewVirtioConsoleDeviceConfiguration creates a new VirtioConsoleDeviceConfiguration.
func NewVirtioConsoleDeviceConfiguration() (*VirtioConsoleDeviceConfiguration, error) {
//
// This is only supported on macOS 13 and newer.
//
// See: https://developer.apple.com/documentation/virtualization/vzvirtioconsoledeviceconfiguration?language=objc
func NewVirtioConsoleDeviceConfiguration(opts ...VirtioConsoleDeviceConfigurationOption) (*VirtioConsoleDeviceConfiguration, error) {
if err := macOSAvailable(13); err != nil {
return nil, err
}
Expand All @@ -38,6 +60,14 @@ func NewVirtioConsoleDeviceConfiguration() (*VirtioConsoleDeviceConfiguration, e
consolePorts: make(map[int]*VirtioConsolePortConfiguration),
}
config.portsPtr = vzbridge.VZVirtioConsoleDeviceConfiguration_Ports(config)
for _, opt := range opts {
if opt == nil {
return nil, errors.New("vz: nil console device configuration option")
}
if err := opt(config); err != nil {
return nil, err
}
}
return config, nil
}

Expand Down
47 changes: 47 additions & 0 deletions console_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package vz

import "testing"

func TestVirtioConsoleMaximumPortCount(t *testing.T) {
if macOSAvailable(13) != nil {
t.Skip("requires macOS 13")
}
for _, tt := range []struct {
name string
options []VirtioConsoleDeviceConfigurationOption
want uint32
}{
{
name: "default",
want: 4,
},
{
name: "explicit",
options: []VirtioConsoleDeviceConfigurationOption{WithVirtioConsoleMaximumPortCount(8)},
want: 8,
},
} {
t.Run(tt.name, func(t *testing.T) {
console, err := NewVirtioConsoleDeviceConfiguration(tt.options...)
if err != nil {
t.Fatal(err)
}
port, err := NewVirtioConsolePortConfiguration()
if err != nil {
t.Fatal(err)
}
console.SetVirtioConsolePortConfiguration(3, port)
if got := console.MaximumPortCount(); got != tt.want {
t.Fatalf("maximum port count = %d, want %d", got, tt.want)
}
config := newTestConfig(t)
config.SetConsoleDevicesVirtualMachineConfiguration([]ConsoleDeviceConfiguration{console})
if ok, err := config.Validate(); !ok || err != nil {
t.Fatalf("Validate() = %v, %v", ok, err)
}
})
}
if console, err := NewVirtioConsoleDeviceConfiguration(nil); console != nil || err == nil {
t.Fatalf("nil option returned %v, %v", console, err)
}
}
2 changes: 1 addition & 1 deletion osversion_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,7 @@ func TestAvailableVersion(t *testing.T) {
return err
},
"NewVirtioConsoleDeviceConfiguration": func() error {
_, err := NewVirtioConsoleDeviceConfiguration()
_, err := NewVirtioConsoleDeviceConfiguration(WithVirtioConsoleMaximumPortCount(8))
return err
},
"NewVirtioConsolePortConfiguration": func() error {
Expand Down
Loading