Registry functional/integration tests (#96)

* Registry functional/integration tests

* Remove DockerClientSwift import

* Encodable, Decodable → Codable
This commit is contained in:
Nikolay Edigaryev
2022-05-20 09:52:37 -04:00
committed by GitHub
parent 13b05d75c5
commit fec803277d
5 changed files with 167 additions and 13 deletions
+4 -4
View File
@@ -3,26 +3,26 @@ import Foundation
let ociManifestMediaType = "application/vnd.oci.image.manifest.v1+json"
let ociConfigMediaType = "application/vnd.oci.image.config.v1+json"
struct OCIManifest: Encodable, Decodable {
struct OCIManifest: Codable, Equatable {
var schemaVersion: Int = 2
var mediaType: String = ociManifestMediaType
var config: OCIManifestConfig
var layers: [OCIManifestLayer] = Array()
}
struct OCIManifestConfig: Encodable, Decodable {
struct OCIManifestConfig: Codable, Equatable {
var mediaType: String = ociConfigMediaType
var size: Int
var digest: String
}
struct OCIManifestLayer: Encodable, Decodable {
struct OCIManifestLayer: Codable, Equatable {
var mediaType: String
var size: Int
var digest: String
}
struct Descriptor {
struct Descriptor: Equatable {
var size: Int
var digest: String
}
+16 -6
View File
@@ -60,19 +60,29 @@ class Registry {
var currentAuthToken: TokenResponse? = nil
init(host: String, namespace: String) throws {
init(urlComponents: URLComponents, namespace: String) throws {
baseURL = urlComponents.url!
self.namespace = namespace
}
convenience init(host: String, namespace: String) throws {
var baseURLComponents = URLComponents()
baseURLComponents.scheme = "https"
baseURLComponents.host = host
baseURLComponents.path = "/v2/"
baseURL = baseURLComponents.url!
self.namespace = namespace
try self.init(urlComponents: baseURLComponents, namespace: namespace)
}
func pushManifest(reference: String, config: Descriptor, layers: [OCIManifestLayer]) async throws -> String {
let manifest = OCIManifest(config: OCIManifestConfig(size: config.size, digest: config.digest),
layers: layers)
func ping() async throws {
let (_, response) = try await endpointRequest("GET", "/v2/")
if response.statusCode != 200 {
throw RegistryError.UnexpectedHTTPStatusCode(when: "doing ping", code: response.statusCode)
}
}
func pushManifest(reference: String, manifest: OCIManifest) async throws -> String {
let manifestJSON = try JSONEncoder().encode(manifest)
let (responseData, response) = try await endpointRequest("PUT", "\(namespace)/manifests/\(reference)",
+6 -3
View File
@@ -120,20 +120,23 @@ extension VMDirectory {
layers.append(OCIManifestLayer(mediaType: Self.nvramMediaType, size: nvram.count, digest: nvramDigest))
// Craft a stub OCI config for Docker Hub compatibility
struct OCIConfig: Encodable, Decodable {
struct OCIConfig: Codable {
var architecture: String = "arm64"
var os: String = "darwin"
}
let ociConfigJSON = try JSONEncoder().encode(OCIConfig())
let ociConfigDigest = try await registry.pushBlob(fromData: ociConfigJSON)
let ociConfigDescriptor = Descriptor(size: ociConfigJSON.count, digest: ociConfigDigest)
let manifest = OCIManifest(
config: OCIManifestConfig(size: ociConfigJSON.count, digest: ociConfigDigest),
layers: layers
)
// Manifest
for reference in references {
defaultLogger.appendNewLine("pushing manifest for \(reference)...")
_ = try await registry.pushManifest(reference: reference, config: ociConfigDescriptor, layers: layers)
_ = try await registry.pushManifest(reference: reference, manifest: manifest)
}
}
}