Class: DockerRegistry2::Registry
- Inherits:
-
Object
- Object
- DockerRegistry2::Registry
- Defined in:
- lib/registry/registry.rb
Instance Method Summary collapse
- #_pull_v1(repo, manifest, dir) ⇒ Object
- #_pull_v2(repo, manifest, dir) ⇒ Object
-
#blob_size(repo, blobSum) ⇒ Object
gets the size of a particular blob, given the repo and the content-addressable hash usually unneeded, since manifest includes it.
- #copy(repo, tag, newregistry, newrepo, newtag) ⇒ Object
- #dodelete(url) ⇒ Object
- #doget(url) ⇒ Object
- #dohead(url) ⇒ Object
-
#initialize(uri, options = {}) ⇒ Registry
constructor
A new instance of Registry.
- #manifest(repo, tag) ⇒ Object
- #manifest_sum(manifest) ⇒ Object
- #ping ⇒ Object
- #pull(repo, tag, dir) ⇒ Object
- #push(manifest, dir) ⇒ Object
- #rmtag(image, tag) ⇒ Object
- #search(query = '') ⇒ Object
- #tag(repo, tag, newrepo, newtag) ⇒ Object
- #tags(repo, withHashes = false) ⇒ Object
Constructor Details
#initialize(uri, options = {}) ⇒ Registry
Returns a new instance of Registry.
12 13 14 15 16 17 18 19 |
# File 'lib/registry/registry.rb', line 12 def initialize(uri, = {}) @uri = URI.parse(uri) @base_uri = "#{@uri.scheme}://#{@uri.host}:#{@uri.port}" @user = [:user] @password = [:password] @open_timeout = [:open_timeout] || 2 @read_timeout = [:read_timeout] || 5 end |
Instance Method Details
#_pull_v1(repo, manifest, dir) ⇒ Object
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
# File 'lib/registry/registry.rb', line 122 def _pull_v1(repo, manifest, dir) # make sure the directory exists FileUtils.mkdir_p dir return false unless manifest['schemaVersion'] == 1 # pull each of the layers manifest['fsLayers'].each do |layer| # define path of file to save layer in layer_file = "#{dir}/#{layer['blobSum']}" # skip layer if we already got it next if File.file? layer_file # download layer # puts "getting layer (v1) #{layer['blobSum']}" File.open(layer_file, 'w') do |fd| doreq('get', "/v2/#{repo}/blobs/#{layer['blobSum']}", fd) end # return layer file layer_file end end |
#_pull_v2(repo, manifest, dir) ⇒ Object
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
# File 'lib/registry/registry.rb', line 101 def _pull_v2(repo, manifest, dir) # make sure the directory exists FileUtils.mkdir_p dir return false unless manifest['schemaVersion'] == 2 # pull each of the layers manifest['layers'].each do |layer| # define path of file to save layer in layer_file = "#{dir}/#{layer['digest']}" # skip layer if we already got it next if File.file? layer_file # download layer # puts "getting layer (v2) #{layer['digest']}" File.open(layer_file, 'w') do |fd| doreq('get', "/v2/#{repo}/blobs/#{layer['digest']}", fd) end layer_file end end |
#blob_size(repo, blobSum) ⇒ Object
gets the size of a particular blob, given the repo and the content-addressable hash usually unneeded, since manifest includes it
155 156 157 158 |
# File 'lib/registry/registry.rb', line 155 def blob_size(repo,blobSum) response = dohead "/v2/#{repo}/blobs/#{blobSum}" Integer(response.headers[:content_length],10) end |
#copy(repo, tag, newregistry, newrepo, newtag) ⇒ Object
150 151 |
# File 'lib/registry/registry.rb', line 150 def copy(repo,tag,newregistry,newrepo,newtag) end |
#dodelete(url) ⇒ Object
25 26 27 |
# File 'lib/registry/registry.rb', line 25 def dodelete(url) return doreq "delete", url end |
#doget(url) ⇒ Object
21 22 23 |
# File 'lib/registry/registry.rb', line 21 def doget(url) return doreq "get", url end |
#dohead(url) ⇒ Object
29 30 31 |
# File 'lib/registry/registry.rb', line 29 def dohead(url) return doreq "head", url end |
#manifest(repo, tag) ⇒ Object
75 76 77 78 |
# File 'lib/registry/registry.rb', line 75 def manifest(repo,tag) # first get the manifest JSON.parse doget "/v2/#{repo}/manifests/#{tag}" end |
#manifest_sum(manifest) ⇒ Object
160 161 162 163 164 165 166 |
# File 'lib/registry/registry.rb', line 160 def manifest_sum(manifest) size = 0 manifest["layers"].each { |layer| size += layer["size"] } size end |
#ping ⇒ Object
33 34 35 |
# File 'lib/registry/registry.rb', line 33 def ping response = doget '/v2/' end |
#pull(repo, tag, dir) ⇒ Object
87 88 89 90 91 92 93 94 95 96 97 98 99 |
# File 'lib/registry/registry.rb', line 87 def pull(repo, tag, dir) # make sure the directory exists FileUtils.mkdir_p dir # get the manifest m = manifest repo, tag # puts "pulling #{repo}:#{tag} into #{dir}" # manifest can contain multiple manifests one for each API version downloaded_layers = [] downloaded_layers += _pull_v2(repo, m, dir) if m['schemaVersion'] == 2 downloaded_layers += _pull_v1(repo, m, dir) if m['schemaVersion'] == 1 # return downloaded_layers downloaded_layers end |
#push(manifest, dir) ⇒ Object
144 145 |
# File 'lib/registry/registry.rb', line 144 def push(manifest,dir) end |
#rmtag(image, tag) ⇒ Object
80 81 82 83 84 85 |
# File 'lib/registry/registry.rb', line 80 def rmtag(image, tag) # TODO: Need full response back. Rewrite other manifests() calls without JSON? reference = doget("/v2/#{image}/manifests/#{tag}").headers[:docker_content_digest] return dodelete("/v2/#{image}/manifests/#{reference}").code end |
#search(query = '') ⇒ Object
37 38 39 40 41 42 43 44 45 46 |
# File 'lib/registry/registry.rb', line 37 def search(query = '') response = doget "/v2/_catalog" # parse the response repos = JSON.parse(response)["repositories"] if query.strip.length > 0 re = Regexp.new query repos = repos.find_all {|e| re =~ e } end return repos end |
#tag(repo, tag, newrepo, newtag) ⇒ Object
147 148 |
# File 'lib/registry/registry.rb', line 147 def tag(repo,tag,newrepo,newtag) end |
#tags(repo, withHashes = false) ⇒ Object
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/registry/registry.rb', line 48 def (repo,withHashes = false) response = doget "/v2/#{repo}/tags/list" # parse the response resp = JSON.parse response # do we include the hashes? if withHashes then useGet = false resp["hashes"] = {} resp["tags"].each {|tag| if useGet then head = doget "/v2/#{repo}/manifests/#{tag}" else begin head = dohead "/v2/#{repo}/manifests/#{tag}" rescue DockerRegistry2::InvalidMethod # in case we are in a registry pre-2.3.0, which did not support manifest HEAD useGet = true head = doget "/v2/#{repo}/manifests/#{tag}" end end resp["hashes"][tag] = head.headers[:docker_content_digest] } end return resp end |