Allow to copy all manifests from one container repository to another

This commit is contained in:
Kamil Trzcinski 2016-05-04 15:15:16 +02:00
parent 7168493e8a
commit e1c8663a3e
4 changed files with 38 additions and 5 deletions

View File

@ -43,5 +43,9 @@ module ImageRegistry
return @data if defined?(@data) return @data if defined?(@data)
@data ||= client.blob(repository.name, digest, type) @data ||= client.blob(repository.name, digest, type)
end end
def mount_to(to_repository)
client.repository_mount_blob(to_repository.name, digest, repository.name)
end
end end
end end

View File

@ -39,7 +39,7 @@ module ImageRegistry
end end
def repository_mount_blob(name, digest, from) def repository_mount_blob(name, digest, from)
@faraday.post("/v2/#{name}/blobls/uploads/?mount=#{digest}&from=#{from}").status == 201 @faraday.post("/v2/#{name}/blobs/uploads/?mount=#{digest}&from=#{from}").status == 201
end end
def repository_tag_digest(name, reference) def repository_tag_digest(name, reference)

View File

@ -29,11 +29,27 @@ module ImageRegistry
@tags = manifest['tags'].map do |tag| @tags = manifest['tags'].map do |tag|
ImageRegistry::Tag.new(self, tag) ImageRegistry::Tag.new(self, tag)
end end
@tags ||= []
end end
def delete_tags def delete_tags
return unless tags return unless tags
tags.each(:delete) tags.each(:delete)
end end
def mount_blob(blob)
return unless blob
client.repository_mount_blob(name, blob.digest, blob.repository.name)
end
def mount_manifest(tag, manifest)
client.put_repository_manifest(name, tag, manifest)
end
def copy_to(other_repository)
tags.all? do |tag|
tag.copy_to(other_repository)
end
end
end end
end end

View File

@ -25,11 +25,15 @@ module ImageRegistry
@digest = client.repository_tag_digest(repository.name, name) @digest = client.repository_tag_digest(repository.name, name)
end end
def config def config_blob
return @config if defined?(@config) return @config_blob if defined?(@config_blob)
return unless manifest && manifest['config'] return unless manifest && manifest['config']
blob = ImageRegistry::Blob.new(repository, manifest['config']) @config_blob = ImageRegistry::Blob.new(repository, manifest['config'])
@config = ImageRegistry::Config.new(self, blob) end
def config
return unless config_blob
@config ||= ImageRegistry::Config.new(self, config_blob)
end end
def created_at def created_at
@ -55,6 +59,15 @@ module ImageRegistry
client.delete_repository_tag(repository.name, digest) client.delete_repository_tag(repository.name, digest)
end end
def copy_to(repository)
return unless manifest
layers.each do |blob|
repository.mount_blob(blob)
end
repository.mount_blob(config_blob)
repository.mount_manifest(name, manifest.to_json)
end
def client def client
@client ||= repository.client @client ||= repository.client
end end