Skip to content

Commit f811b7d

Browse files
committed
fix(controller): update registry API calls for 0.10.x+
1 parent a5661da commit f811b7d

2 files changed

Lines changed: 8 additions & 64 deletions

File tree

controller/registry/private.py

Lines changed: 7 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ def publish_release(source, config, target):
7070
def _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

8989
def _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

registry/bin/boot

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ if [[ ! -z $EXTERNAL_PORT ]]; then
9191
|| [[ `etcdctl --no-sync -C $ETCD get ${ETCD_PATH}/masterLock` == "$HOSTNAME" ]] ; then
9292
etcdctl --no-sync -C $ETCD set $ETCD_PATH/host $HOST --ttl $ETCD_TTL >/dev/null
9393
etcdctl --no-sync -C $ETCD set $ETCD_PATH/port $EXTERNAL_PORT --ttl $ETCD_TTL >/dev/null
94-
etcdctl --no-sync -C $ETCD update ${ETCD_PATH}/masterLock $HOSTNAME --ttl $ETCD_TTL >/dev/null
94+
etcdctl --no-sync -C $ETCD update ${ETCD_PATH}/masterLock $HOSTNAME --ttl $ETCD_TTL >/dev/null
9595
fi
9696
etcdctl --no-sync -C $ETCD set $HOST_ETCD_PATH/host $HOST --ttl $ETCD_TTL >/dev/null
9797
etcdctl --no-sync -C $ETCD set $HOST_ETCD_PATH/port $EXTERNAL_PORT --ttl $ETCD_TTL >/dev/null

0 commit comments

Comments
 (0)