@@ -70,7 +70,7 @@ def publish_release(source, config, target):
7070def _commit (repository_path , image , layer , tag ):
7171 _put_image (image )
7272 cookies = _put_layer (image ['id' ], layer )
73- _put_checksum (image , cookies )
73+ _put_checksum (image , layer , cookies )
7474 _put_tag (image ['id' ], repository_path , tag )
7575
7676
@@ -87,8 +87,7 @@ def _put_first_image(repository_path):
8787
8888
8989def _api_call (endpoint , data = None , headers = {}, cookies = None , request_type = 'GET' ):
90- # FIXME: update API calls for docker 0.10.0+
91- base_headers = {'user-agent' : 'docker/0.9.0' }
90+ base_headers = {'user-agent' : 'docker/1.0.0' }
9291 r = None
9392 if len (headers ) > 0 :
9493 for header , value in headers .iteritems ():
@@ -138,11 +137,13 @@ def _put_layer(image_id, layer_fileobj):
138137 return r .cookies
139138
140139
141- def _put_checksum (image , cookies ):
140+ def _put_checksum (image , layer , cookies ):
142141 path = "/v1/images/{id}/checksum" .format (** image )
143142 url = urlparse .urljoin (settings .REGISTRY_URL , path )
144- tarsum = TarSum (json .dumps (image )).compute ()
145- headers = {'X-Docker-Checksum' : tarsum }
143+ h = hashlib .sha256 (json .dumps (image ) + '\n ' )
144+ h .update (layer .getvalue ())
145+ layer_checksum = "sha256:{0}" .format (h .hexdigest ())
146+ headers = {'X-Docker-Checksum-Payload' : layer_checksum }
146147 r = _api_call (url , headers = headers , cookies = cookies , request_type = 'PUT' )
147148 if not r .status_code == 200 :
148149 raise RuntimeError ("PUT Checksum Error ({}: {})" .format (r .status_code , r .text ))
@@ -188,60 +189,3 @@ def _empty_tar_archive():
188189 tar .close ()
189190 data .seek (0 )
190191 return data
191-
192-
193- #
194- # Below adapted from https://github.com/dotcloud/docker-registry/blob/master/lib/checksums.py
195- #
196-
197- def sha256_file (fp , data = None ):
198- h = hashlib .sha256 (data or '' )
199- if not fp :
200- return h .hexdigest ()
201- while True :
202- buf = fp .read (4096 )
203- if not buf :
204- break
205- h .update (buf )
206- return h .hexdigest ()
207-
208-
209- def sha256_string (s ):
210- return hashlib .sha256 (s ).hexdigest ()
211-
212-
213- class TarSum (object ):
214-
215- def __init__ (self , json_data ):
216- self .json_data = json_data
217- self .hashes = []
218- self .header_fields = ('name' , 'mode' , 'uid' , 'gid' , 'size' , 'mtime' ,
219- 'type' , 'linkname' , 'uname' , 'gname' , 'devmajor' ,
220- 'devminor' )
221-
222- def append (self , member , tarobj ):
223- header = ''
224- for field in self .header_fields :
225- value = getattr (member , field )
226- if field == 'type' :
227- field = 'typeflag'
228- elif field == 'name' :
229- if member .isdir () and not value .endswith ('/' ):
230- value += '/'
231- header += '{0}{1}' .format (field , value )
232- h = None
233- try :
234- if member .size > 0 :
235- f = tarobj .extractfile (member )
236- h = sha256_file (f , header )
237- else :
238- h = sha256_string (header )
239- except KeyError :
240- h = sha256_string (header )
241- self .hashes .append (h )
242-
243- def compute (self ):
244- self .hashes .sort ()
245- data = self .json_data + '' .join (self .hashes )
246- tarsum = 'tarsum+sha256:{0}' .format (sha256_string (data ))
247- return tarsum
0 commit comments