@@ -61,6 +61,7 @@ import json
61
61
import re
62
62
import shlex
63
63
import subprocess
64
+ import time
64
65
import dxf
65
66
import requests .exceptions
66
67
import dateutil .parser
@@ -132,6 +133,23 @@ def docker_auth(docker, response):
132
133
response = response )
133
134
134
135
136
+ def retry (tries , func , * func_args , ** func_kwargs ):
137
+ """ retry requests based function """
138
+ while True :
139
+ tries -= 1
140
+ try :
141
+ return func (* func_args , ** func_kwargs )
142
+ except (requests .exceptions .ConnectionError ,
143
+ requests .exceptions .Timeout ):
144
+ if tries <= 0 :
145
+ raise
146
+ except requests .exceptions .HTTPError as err :
147
+ if tries <= 0 or err .response .status_code not in \
148
+ (429 , 500 , 502 , 503 , 504 ):
149
+ raise
150
+ time .sleep (3 )
151
+
152
+
135
153
def get_time_layers (repository ):
136
154
"""
137
155
get created time and layer info from the docker registry
@@ -148,16 +166,16 @@ def get_time_layers(repository):
148
166
docker .registry_auth = docker_login .get (registry , [None , None ])
149
167
# get config digest
150
168
try :
151
- digest = docker .get_digest ( tag , platform = "linux/amd64" )
169
+ digest = retry ( 3 , docker .get_digest , tag , platform = "linux/amd64" )
152
170
except dxf .exceptions .DXFUnauthorizedError :
153
171
return None
154
172
except requests .exceptions .HTTPError as err :
155
- if err .response .status_code not in (401 , 403 , 404 ):
156
- raise
157
- return None
173
+ if err .response .status_code in (401 , 403 , 404 ):
174
+ return None
175
+ raise
158
176
159
177
# get config: pull_blob(digest)
160
- data = json .loads (b'' .join (docker .pull_blob ( digest )))
178
+ data = json .loads (b'' .join (retry ( 3 , docker .pull_blob , digest )))
161
179
162
180
return {"created" : dateutil .parser .parse (data ["created" ]),
163
181
"layers" : data ["rootfs" ]["diff_ids" ]}
0 commit comments