1111import httplib
1212import json
1313import re
14+ import time
1415import urlparse
1516
1617from chef_rsa import Key
@@ -22,7 +23,7 @@ def ruby_b64encode(value):
2223 """
2324 b64 = base64 .b64encode (value )
2425 for i in xrange (0 , len (b64 ), 60 ):
25- yield b64 [i :i + 60 ]
26+ yield b64 [i :i + 60 ]
2627
2728
2829class UTC (datetime .tzinfo ):
@@ -116,12 +117,20 @@ def __init__(self, server_url, client_name, client_key):
116117 self .conn = httplib .HTTPSConnection (self .hostname )
117118 self .conn .connect ()
118119
119- def request (self , verb , path , body = '' ):
120+ def request (self , verb , path , body = '' , attempts = 5 , interval = 5 ):
120121 url = self .path + path
121122 headers = create_authorization (
122123 self .headers , verb , url , self .client_key , self .client_name , body )
123- self .conn .request (verb , url , body = body , headers = headers )
124- resp = self .conn .getresponse ()
124+ # retry all chef api requests
125+ for _ in range (attempts ):
126+ self .conn .request (verb , url , body = body , headers = headers )
127+ resp = self .conn .getresponse ()
128+ if resp .status != 500 :
129+ break
130+ time .sleep (interval )
131+ else :
132+ errmsg = 'Chef API requests failed: {}' .format (path )
133+ raise RuntimeError (errmsg )
125134 return resp .read (), resp .status
126135
127136 def create_databag (self , name ):
0 commit comments