Example #1
0
    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)
Example #2
0
 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'))