104 lines
4.0 KiB
Swift
104 lines
4.0 KiB
Swift
//===----------------------------------------------------------------------===//
|
|
// Copyright © 2025-2026 Apple Inc. and the Containerization project authors.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// https://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
import ContainerizationOCI
|
|
import Foundation
|
|
|
|
/// Destination for boot log (serial console) output.
|
|
public struct BootLog: Sendable {
|
|
/// The underlying representation of the boot log destination.
|
|
internal enum Representation: Sendable {
|
|
case file(path: URL, append: Bool)
|
|
case fileHandle(FileHandle)
|
|
}
|
|
|
|
internal var base: Representation
|
|
|
|
/// Write boot logs to a file at the specified path.
|
|
///
|
|
/// - Parameters:
|
|
/// - path: The URL of the file to write boot logs to.
|
|
/// - append: Whether to append to an existing file or overwrite it. Defaults to true.
|
|
///
|
|
/// - Returns: A boot log destination that writes to a file.
|
|
public static func file(path: URL, append: Bool = true) -> BootLog {
|
|
self.init(base: .file(path: path, append: append))
|
|
}
|
|
|
|
/// Write boot logs to a file handle.
|
|
///
|
|
/// - Parameter fileHandle: The file handle to write boot logs to.
|
|
///
|
|
/// - Returns: A boot log destination that writes to a file handle.
|
|
public static func fileHandle(_ fileHandle: FileHandle) -> BootLog {
|
|
self.init(base: .fileHandle(fileHandle))
|
|
}
|
|
}
|
|
|
|
/// Protocol for VM creation configuration. Allows VMMs to extend with specific settings
|
|
/// while maintaining a common core configuration.
|
|
public protocol VMCreationConfig: Sendable {
|
|
/// The common VM configuration that all VMMs must support.
|
|
var configuration: VMConfiguration { get }
|
|
}
|
|
|
|
/// Standard VM creation configuration with only common settings.
|
|
public struct StandardVMConfig: VMCreationConfig {
|
|
public var configuration: VMConfiguration
|
|
|
|
public init(configuration: VMConfiguration) {
|
|
self.configuration = configuration
|
|
}
|
|
}
|
|
|
|
/// Configuration for creating a virtual machine instance.
|
|
public struct VMConfiguration: Sendable {
|
|
/// The amount of CPUs to allocate.
|
|
public var cpus: Int
|
|
/// The memory in bytes to allocate.
|
|
public var memoryInBytes: UInt64
|
|
/// The network interfaces to attach.
|
|
public var interfaces: [any Interface]
|
|
/// Mounts organized by metadata ID (e.g. container ID).
|
|
/// Each ID maps to an array of mounts for that workload.
|
|
public var mountsByID: [String: [Mount]]
|
|
/// Optional destination for serial boot logs.
|
|
public var bootLog: BootLog?
|
|
/// Enable nested virtualization support. If the VirtualMachineManager
|
|
/// does not support this feature, it MUST return an .unsupported ContainerizationError.
|
|
public var nestedVirtualization: Bool
|
|
/// Extension objects that participate in the VM instance lifecycle.
|
|
/// Extension packages append their types here; VZ-aware extensions
|
|
/// should conform to ``VZInstanceExtension``.
|
|
public var extensions: [any Sendable] = []
|
|
|
|
public init(
|
|
cpus: Int = 4,
|
|
memoryInBytes: UInt64 = 1024 * 1024 * 1024,
|
|
interfaces: [any Interface] = [],
|
|
mountsByID: [String: [Mount]] = [:],
|
|
bootLog: BootLog? = nil,
|
|
nestedVirtualization: Bool = false
|
|
) {
|
|
self.cpus = cpus
|
|
self.memoryInBytes = memoryInBytes
|
|
self.interfaces = interfaces
|
|
self.mountsByID = mountsByID
|
|
self.bootLog = bootLog
|
|
self.nestedVirtualization = nestedVirtualization
|
|
}
|
|
}
|