diff --git a/libcloud/drivers/gogrid.py b/libcloud/drivers/gogrid.py index 2477a28..d80901b 100644 --- a/libcloud/drivers/gogrid.py +++ b/libcloud/drivers/gogrid.py @@ -30,6 +30,8 @@ except: import simplejson as json HOST = 'api.gogrid.com' PORTS_BY_SECURITY = { True: 443, False: 80 } API_VERSION = '1.3' +JSON_RETRIES = 20 +MASHERY_NOT_FOUND = 'ERR_596_SERVICE_NOT_FOUND' STATE = { "Starting": NodeState.PENDING, @@ -71,6 +73,8 @@ GOGRID_INSTANCE_TYPES = {'512MB': {'id': '512MB', 'bandwidth': None, 'price':1.52}} +class MasheryNotFoundError(Exception): + pass class GoGridResponse(Response): def success(self): @@ -78,6 +82,8 @@ class GoGridResponse(Response): raise InvalidCredsException() if not self.body: return None + if self.headers.get('x-mashery-error-code') == MASHERY_NOT_FOUND: + raise MasheryNotFoundError('Mashery Proxy reports Service Not Found') return json.loads(self.body)['status'] == 'success' def parse_body(self): @@ -111,6 +117,16 @@ class GoGridConnection(ConnectionUserAndKey): m = hashlib.md5(key+secret+str(int(time.time()))) return m.hexdigest() + def request(self, *args, **kwargs): + # Ignore the first few failures on GET requests + for i in xrange(JSON_RETRIES - 1): + try: + return super(GoGridConnection, self).request(*args, **kwargs) + except MasheryNotFoundError, e: + time.sleep(10) + pass + return super(GoGridConnection, self).request(*args, **kwargs) + class GoGridNode(Node): # Generating uuid based on public ip to get around missing id on # create_node in gogrid api @@ -216,11 +232,13 @@ class GoGridNodeDriver(NodeDriver): def _server_power(self, id, power): # power in ['start', 'stop', 'restart'] params = {'id': id, 'power': power} - return self.connection.request("/api/grid/server/power", params) + return self.connection.request("/api/grid/server/power", params, + method='POST') def _server_delete(self, id): params = {'id': id} - return self.connection.request("/api/grid/server/delete", params) + return self.connection.request("/api/grid/server/delete", params, + method='POST') def _get_first_ip(self): params = {'ip.state': 'Unassigned', 'ip.type': 'public'} @@ -252,7 +270,7 @@ class GoGridNodeDriver(NodeDriver): 'ip': first_ip} object = self.connection.request('/api/grid/server/add', - params=params).object + params=params, method='POST').object node = self._to_node(object['list'][0]) return node