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)
@data ||= client.blob(repository.name, digest, type)
end
def mount_to(to_repository)
client.repository_mount_blob(to_repository.name, digest, repository.name)
end
end
end

View File

@ -39,7 +39,7 @@ module ImageRegistry
end
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
def repository_tag_digest(name, reference)

View File

@ -29,11 +29,27 @@ module ImageRegistry
@tags = manifest['tags'].map do |tag|
ImageRegistry::Tag.new(self, tag)
end
@tags ||= []
end
def delete_tags
return unless tags
tags.each(:delete)
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

View File

@ -25,11 +25,15 @@ module ImageRegistry
@digest = client.repository_tag_digest(repository.name, name)
end
def config
return @config if defined?(@config)
def config_blob
return @config_blob if defined?(@config_blob)
return unless manifest && manifest['config']
blob = ImageRegistry::Blob.new(repository, manifest['config'])
@config = ImageRegistry::Config.new(self, blob)
@config_blob = ImageRegistry::Blob.new(repository, manifest['config'])
end
def config
return unless config_blob
@config ||= ImageRegistry::Config.new(self, config_blob)
end
def created_at
@ -55,6 +59,15 @@ module ImageRegistry
client.delete_repository_tag(repository.name, digest)
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
@client ||= repository.client
end