Files
J Logan 356c8d2f88 Reorganize client libraries. (#1020)
- Closes #461.
- Extract core types into ContainerResources target.
- Extract ContainerNetworkServiceClient from ContainerNetworkService.
- Relocate sandbox client from ContainerClient to
ContainerSandboxServiceClient.
- Relocate ContainerClient to ContainerAPIServiceClient.
- Common structure from services and clients under Source/Services.

Updated project hierarchy:

```
Sources/CAuditToken - audit token access wrapper
Sources/CLI - CLI executable
Sources/ContainerBuild - builder
Sources/ContainerCommands - CLI command implementations
Sources/ContainerLog - logging helpers
Sources/ContainerPersistence - persistent data and system property helpers
Sources/ContainerPlugin - plugin system
Sources/ContainerResource - resource (container, image, volume, network) types
Sources/ContainerVersion - version helpers
Sources/ContainerXPC - XPC helpers
Sources/CVersion - injected project version
Sources/DNSServer - container DNS resolver
Sources/Helpers - service executables
Sources/Services/*/Client - service clients
Sources/Services/*/Server - service implementations
Sources/SocketForwarder - port forwarding
Sources/TerminalProgress - progress bar
```

## Type of Change
- [ ] Bug fix
- [ ] New feature  
- [x] Breaking change
- [ ] Documentation update

## Motivation and Context
The ContainerClient library was a bit of a grab bag. This refactor
applies a more sensible project and library structure for resource data
types, services, and clients.

## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
2026-01-06 08:27:14 -08:00

82 lines
3.0 KiB
Swift

//===----------------------------------------------------------------------===//
// Copyright © 2026 Apple Inc. and the container 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 ContainerAPIClient
import Logging
/// Service for calculating disk usage across all resource types
public actor DiskUsageService {
private let containersService: ContainersService
private let volumesService: VolumesService
private let log: Logger
public init(
containersService: ContainersService,
volumesService: VolumesService,
log: Logger
) {
self.containersService = containersService
self.volumesService = volumesService
self.log = log
}
/// Calculate disk usage for all resource types
public func calculateDiskUsage() async throws -> DiskUsageStats {
log.debug("calculating disk usage for all resources")
// Get active image references first (needed for image calculation)
let activeImageRefs = await containersService.getActiveImageReferences()
// Query all services concurrently
async let imageStats = ClientImage.calculateDiskUsage(activeReferences: activeImageRefs)
async let containerStats = containersService.calculateDiskUsage()
async let volumeStats = volumesService.calculateDiskUsage()
let (imageData, containerData, volumeData) = try await (imageStats, containerStats, volumeStats)
let stats = DiskUsageStats(
images: ResourceUsage(
total: imageData.totalCount,
active: imageData.activeCount,
sizeInBytes: imageData.totalSize,
reclaimable: imageData.reclaimableSize
),
containers: ResourceUsage(
total: containerData.0,
active: containerData.1,
sizeInBytes: containerData.2,
reclaimable: containerData.3
),
volumes: ResourceUsage(
total: volumeData.0,
active: volumeData.1,
sizeInBytes: volumeData.2,
reclaimable: volumeData.3
)
)
log.debug(
"disk usage calculation complete",
metadata: [
"images_total": "\(imageData.totalCount)",
"containers_total": "\(containerData.0)",
"volumes_total": "\(volumeData.0)",
])
return stats
}
}