Skip to content

Commit 79cc363

Browse files
authored
Relocates API server to Helpers, service to Services. (apple#616)
- Closes apple#615. Improves project organization. Separates service so it can be tested and used separately from the executable target. No functional changes.
1 parent a54be36 commit 79cc363

File tree

14 files changed

+62
-37
lines changed

14 files changed

+62
-37
lines changed

Package.swift

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ let package = Package(
2929
name: "container",
3030
platforms: [.macOS("15")],
3131
products: [
32+
.library(name: "ContainerAPIService", targets: ["ContainerAPIService"]),
3233
.library(name: "ContainerSandboxService", targets: ["ContainerSandboxService"]),
3334
.library(name: "ContainerNetworkService", targets: ["ContainerNetworkService"]),
3435
.library(name: "ContainerImagesService", targets: ["ContainerImagesService", "ContainerImagesServiceClient"]),
@@ -86,21 +87,41 @@ let package = Package(
8687
dependencies: [
8788
.product(name: "ArgumentParser", package: "swift-argument-parser"),
8889
.product(name: "AsyncHTTPClient", package: "async-http-client"),
90+
.product(name: "Containerization", package: "containerization"),
91+
.product(name: "ContainerizationExtras", package: "containerization"),
92+
.product(name: "ContainerizationOS", package: "containerization"),
8993
.product(name: "GRPC", package: "grpc-swift"),
9094
.product(name: "Logging", package: "swift-log"),
95+
"ContainerAPIService",
96+
"ContainerClient",
97+
"ContainerLog",
98+
"ContainerNetworkService",
99+
"ContainerPersistence",
100+
"ContainerPlugin",
101+
"ContainerVersion",
102+
"ContainerXPC",
103+
"DNSServer",
104+
],
105+
path: "Sources/Helpers/APIServer"
106+
),
107+
.target(
108+
name: "ContainerAPIService",
109+
dependencies: [
91110
.product(name: "Containerization", package: "containerization"),
92111
.product(name: "ContainerizationExtras", package: "containerization"),
93112
.product(name: "ContainerizationOS", package: "containerization"),
113+
.product(name: "Logging", package: "swift-log"),
94114
"ContainerClient",
95-
"ContainerLog",
96115
"ContainerNetworkService",
97116
"ContainerPersistence",
98117
"ContainerPlugin",
99118
"ContainerSandboxService",
100119
"ContainerVersion",
101-
"DNSServer",
120+
"ContainerXPC",
121+
"CVersion",
122+
"TerminalProgress",
102123
],
103-
path: "Sources/APIServer"
124+
path: "Sources/Services/ContainerAPIService"
104125
),
105126
.executableTarget(
106127
name: "container-runtime-linux",
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
//===----------------------------------------------------------------------===//
1616

1717
import ArgumentParser
18+
import ContainerAPIService
1819
import ContainerClient
1920
import ContainerLog
2021
import ContainerNetworkService

Sources/APIServer/ContainerDNSHandler.swift renamed to Sources/Helpers/APIServer/ContainerDNSHandler.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
// limitations under the License.
1515
//===----------------------------------------------------------------------===//
1616

17+
import ContainerAPIService
1718
import DNS
1819
import DNSServer
1920

Sources/APIServer/Containers/ContainersHarness.swift renamed to Sources/Services/ContainerAPIService/Containers/ContainersHarness.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,17 @@ import ContainerizationOS
2222
import Foundation
2323
import Logging
2424

25-
struct ContainersHarness {
25+
public struct ContainersHarness: Sendable {
2626
let log: Logging.Logger
2727
let service: ContainersService
2828

29-
init(service: ContainersService, log: Logging.Logger) {
29+
public init(service: ContainersService, log: Logging.Logger) {
3030
self.log = log
3131
self.service = service
3232
}
3333

3434
@Sendable
35-
func list(_ message: XPCMessage) async throws -> XPCMessage {
35+
public func list(_ message: XPCMessage) async throws -> XPCMessage {
3636
let containers = try await service.list()
3737
let data = try JSONEncoder().encode(containers)
3838

@@ -42,7 +42,7 @@ struct ContainersHarness {
4242
}
4343

4444
@Sendable
45-
func create(_ message: XPCMessage) async throws -> XPCMessage {
45+
public func create(_ message: XPCMessage) async throws -> XPCMessage {
4646
let data = message.dataNoCopy(key: .containerConfig)
4747
guard let data else {
4848
throw ContainerizationError(.invalidArgument, message: "container configuration cannot be empty")
@@ -64,7 +64,7 @@ struct ContainersHarness {
6464
}
6565

6666
@Sendable
67-
func delete(_ message: XPCMessage) async throws -> XPCMessage {
67+
public func delete(_ message: XPCMessage) async throws -> XPCMessage {
6868
let id = message.string(key: .id)
6969
guard let id else {
7070
throw ContainerizationError(.invalidArgument, message: "id cannot be empty")
@@ -75,7 +75,7 @@ struct ContainersHarness {
7575
}
7676

7777
@Sendable
78-
func logs(_ message: XPCMessage) async throws -> XPCMessage {
78+
public func logs(_ message: XPCMessage) async throws -> XPCMessage {
7979
let id = message.string(key: .id)
8080
guard let id else {
8181
throw ContainerizationError(
@@ -90,7 +90,7 @@ struct ContainersHarness {
9090
}
9191

9292
@Sendable
93-
func eventHandler(_ message: XPCMessage) async throws -> XPCMessage {
93+
public func eventHandler(_ message: XPCMessage) async throws -> XPCMessage {
9494
let event = try message.containerEvent()
9595
try await service.handleContainerEvents(event: event)
9696
return message.reply()

Sources/APIServer/Containers/ContainersService.swift renamed to Sources/Services/ContainerAPIService/Containers/ContainersService.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import ContainerizationOS
2626
import Foundation
2727
import Logging
2828

29-
actor ContainersService {
29+
public actor ContainersService {
3030
private static let machServicePrefix = "com.apple.container"
3131
private static let launchdDomainString = try! ServiceManager.getDomainString()
3232

Sources/APIServer/HealthCheck/HealthCheckHarness.swift renamed to Sources/Services/ContainerAPIService/HealthCheck/HealthCheckHarness.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import Containerization
2222
import Foundation
2323
import Logging
2424

25-
actor HealthCheckHarness {
25+
public actor HealthCheckHarness {
2626
private let appRoot: URL
2727
private let installRoot: URL
2828
private let log: Logger
@@ -34,7 +34,7 @@ actor HealthCheckHarness {
3434
}
3535

3636
@Sendable
37-
func ping(_ message: XPCMessage) async -> XPCMessage {
37+
public func ping(_ message: XPCMessage) async -> XPCMessage {
3838
let reply = message.reply()
3939
reply.set(key: .appRoot, value: appRoot.absoluteString)
4040
reply.set(key: .installRoot, value: installRoot.absoluteString)

Sources/APIServer/Kernel/KernelHarness.swift renamed to Sources/Services/ContainerAPIService/Kernel/KernelHarness.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,16 @@ import ContainerizationError
2121
import Foundation
2222
import Logging
2323

24-
struct KernelHarness {
24+
public struct KernelHarness: Sendable {
2525
private let log: Logging.Logger
2626
private let service: KernelService
2727

28-
init(service: KernelService, log: Logging.Logger) {
28+
public init(service: KernelService, log: Logging.Logger) {
2929
self.log = log
3030
self.service = service
3131
}
3232

33+
@Sendable
3334
public func install(_ message: XPCMessage) async throws -> XPCMessage {
3435
let kernelFilePath = try message.kernelFilePath()
3536
let platform = try message.platform()
@@ -50,6 +51,7 @@ struct KernelHarness {
5051
return message.reply()
5152
}
5253

54+
@Sendable
5355
public func getDefaultKernel(_ message: XPCMessage) async throws -> XPCMessage {
5456
guard let platformData = message.dataNoCopy(key: .systemPlatform) else {
5557
throw ContainerizationError(.invalidArgument, message: "Missing SystemPlatform")

Sources/APIServer/Kernel/KernelService.swift renamed to Sources/Services/ContainerAPIService/Kernel/KernelService.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import Foundation
2323
import Logging
2424
import TerminalProgress
2525

26-
actor KernelService {
26+
public actor KernelService {
2727
private static let defaultKernelNamePrefix: String = "default.kernel-"
2828

2929
private let log: Logger

Sources/APIServer/Networks/NetworksHarness.swift renamed to Sources/Services/ContainerAPIService/Networks/NetworksHarness.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,17 @@ import ContainerizationOS
2121
import Foundation
2222
import Logging
2323

24-
struct NetworksHarness: Sendable {
24+
public struct NetworksHarness: Sendable {
2525
let log: Logging.Logger
2626
let service: NetworksService
2727

28-
init(service: NetworksService, log: Logging.Logger) {
28+
public init(service: NetworksService, log: Logging.Logger) {
2929
self.log = log
3030
self.service = service
3131
}
3232

3333
@Sendable
34-
func list(_ message: XPCMessage) async throws -> XPCMessage {
34+
public func list(_ message: XPCMessage) async throws -> XPCMessage {
3535
let containers = try await service.list()
3636
let data = try JSONEncoder().encode(containers)
3737

@@ -41,7 +41,7 @@ struct NetworksHarness: Sendable {
4141
}
4242

4343
@Sendable
44-
func create(_ message: XPCMessage) async throws -> XPCMessage {
44+
public func create(_ message: XPCMessage) async throws -> XPCMessage {
4545
let data = message.dataNoCopy(key: .networkConfig)
4646
guard let data else {
4747
throw ContainerizationError(.invalidArgument, message: "network configuration cannot be empty")
@@ -58,7 +58,7 @@ struct NetworksHarness: Sendable {
5858
}
5959

6060
@Sendable
61-
func delete(_ message: XPCMessage) async throws -> XPCMessage {
61+
public func delete(_ message: XPCMessage) async throws -> XPCMessage {
6262
let id = message.string(key: .networkId)
6363
guard let id else {
6464
throw ContainerizationError(.invalidArgument, message: "id cannot be empty")

Sources/APIServer/Networks/NetworksService.swift renamed to Sources/Services/ContainerAPIService/Networks/NetworksService.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import ContainerizationOS
2525
import Foundation
2626
import Logging
2727

28-
actor NetworksService {
28+
public actor NetworksService {
2929
private let pluginLoader: PluginLoader
3030
private let resourceRoot: URL
3131
private let containersService: ContainersService

0 commit comments

Comments
 (0)