summaryrefslogtreecommitdiff
path: root/lib/container_registry/client.rb
diff options
context:
space:
mode:
authorKamil Trzcinski <ayufan@ayufan.eu>2016-05-09 22:14:46 +0300
committerKamil Trzcinski <ayufan@ayufan.eu>2016-05-09 22:14:46 +0300
commit08396be619eee2e71c2f5f7aa27eea6f5ddf10ff (patch)
tree57377cb67bcc8e9eb9d221e24f167485f3e1ed11 /lib/container_registry/client.rb
parent565a5e36fc456831fd08e0627a936855d87eb932 (diff)
downloadgitlab-ce-08396be619eee2e71c2f5f7aa27eea6f5ddf10ff.tar.gz
Rename ImageRegistry to ContainerRegistry
Diffstat (limited to 'lib/container_registry/client.rb')
-rw-r--r--lib/container_registry/client.rb64
1 files changed, 64 insertions, 0 deletions
diff --git a/lib/container_registry/client.rb b/lib/container_registry/client.rb
new file mode 100644
index 00000000000..b823428344b
--- /dev/null
+++ b/lib/container_registry/client.rb
@@ -0,0 +1,64 @@
+require 'faraday'
+require 'faraday_middleware'
+
+module ContainerRegistry
+ class Client
+ attr_accessor :uri
+
+ MANIFEST_VERSION = 'application/vnd.docker.distribution.manifest.v2+json'
+
+ def initialize(base_uri, options = {})
+ @base_uri = base_uri
+ @faraday = Faraday.new(@base_uri) do |builder|
+ builder.request :json
+ builder.headers['Accept'] = MANIFEST_VERSION
+
+ builder.response :json, :content_type => /\bjson$/
+ builder.response :json, :content_type => 'application/vnd.docker.distribution.manifest.v1+prettyjws'
+
+ if options[:user] && options[:password]
+ builder.request(:basic_auth, options[:user].to_s, options[:password].to_s)
+ elsif options[:token]
+ builder.request(:authorization, :bearer, options[:token].to_s)
+ end
+
+ builder.adapter :net_http
+ end
+ end
+
+ def repository_tags(name)
+ @faraday.get("/v2/#{name}/tags/list").body
+ end
+
+ def repository_manifest(name, reference)
+ @faraday.get("/v2/#{name}/manifests/#{reference}").body
+ end
+
+ def put_repository_manifest(name, reference, manifest)
+ @faraday.put("/v2/#{name}/manifests/#{reference}", manifest, { "Content-Type" => MANIFEST_VERSION }).success?
+ end
+
+ def repository_mount_blob(name, digest, from)
+ @faraday.post("/v2/#{name}/blobs/uploads/?mount=#{digest}&from=#{from}").status == 201
+ end
+
+ def repository_tag_digest(name, reference)
+ response = @faraday.head("/v2/#{name}/manifests/#{reference}")
+ response.headers['docker-content-digest'] if response.success?
+ end
+
+ def delete_repository_tag(name, reference)
+ @faraday.delete("/v2/#{name}/manifests/#{reference}").success?
+ end
+
+ def blob(name, digest, type = nil)
+ headers = {}
+ headers['Accept'] = type if type
+ @faraday.get("/v2/#{name}/blobs/#{digest}", nil, headers).body
+ end
+
+ def delete_blob(name, digest)
+ @faraday.delete("/v2/#{name}/blobs/#{digest}").success?
+ end
+ end
+end