def request(self, method, path, data=None, allow_empty=False): if data is not None: data = urlencode(data) auth = 'Basic {0}'.format( b64encode("{0}:{1}".format( self.user, self.passwd).encode('ascii')).decode('ascii')) headers = {'Authorization': auth} if data is not None: headers['Content-Type'] = 'application/x-www-form-urlencoded' self.logger.debug("Sending %s request to Robot at %s with data %r.", method, path, data) response = self._request(method, path, data, headers) raw_data = response.read().decode('utf-8') if len(raw_data) == 0 and not allow_empty: msg = "Empty response, status {0}." raise RobotError(msg.format(response.status), response.status) elif not allow_empty: try: data = json.loads(raw_data) except ValueError: msg = "Response is not JSON (status {0}): {1}" raise RobotError(msg.format(response.status, repr(raw_data))) else: data = None self.logger.debug( "Got response from Robot with status %d and data %r.", response.status, data) if 200 <= response.status < 300: return data else: error = data.get('error', None) if error is None: raise RobotError("Unknown error: {0}".format(data), response.status) else: err = "{0} - {1}".format(error['status'], error['message']) missing = error.get('missing', []) invalid = error.get('invalid', []) fields = [] if missing is not None: fields += missing if invalid is not None: fields += invalid if len(fields) > 0: err += ", fields: {0}".format(', '.join(fields)) raise RobotError(err, response.status)
def set(self, ip, new_destination): failovers = self.list() if ip not in failovers.keys(): raise RobotError( "Invalid IP address '%s'. Failover IP addresses are %s" % (ip, failovers.keys())) failover = failovers.get(ip) if new_destination == failover.active_server_ip: raise RobotError( "%s is already the active destination of failover IP %s" % (new_destination, ip)) available_dests = [s.ip for s in list(self.servers)] if new_destination not in available_dests: raise RobotError("Invalid destination '%s'. " "The destination is not in your server list: %s" % (new_destination, available_dests)) result = self.conn.post('/failover/%s' % ip, {'active_server_ip': new_destination}) return Failover(result.get('failover'))