示例#1
0
def jenkins_request_with_headers(jenkins_server, req):
    """
    We need to get the headers in addition to the body answer
    to get the location from them
    This function uses jenkins_request method from python-jenkins library
    with just the return call changed

    :param jenkins_server: The server to query
    :param req: The request to execute
    :return: Dict containing the response body (key body)
        and the headers coming along (headers)
    """
    try:
        response = jenkins_server.jenkins_request(req)
        response_body = response.content
        response_headers = response.headers
        if response_body is None:
            raise jenkins.EmptyResponseException(
                "Error communicating with server[%s]: "
                "empty response" % jenkins_server.server)
        return {'body': response_body.decode('utf-8'), 'headers': response_headers}
    except HTTPError as e:
        # Jenkins's funky authentication means its nigh impossible to distinguish errors.
        if e.code in [401, 403, 500]:
            raise JenkinsException(
                'Error in request. Possibly authentication failed [%s]: %s' % (e.code, e.msg)
            )
        elif e.code == 404:
            raise jenkins.NotFoundException('Requested item could not be found')
        else:
            raise
    except socket.timeout as e:
        raise jenkins.TimeoutException('Error in request: %s' % e)
    except URLError as e:
        raise JenkinsException('Error in request: %s' % e.reason)
示例#2
0
 def jenkins_request_with_headers(self,
                                  jenkins_server,
                                  req,
                                  add_crumb=True):
     """
     We need to get the headers in addition to the body answer
     to get the location from them
     This function is just a copy of the one present in python-jenkins library
     with just the return call changed
     :param jenkins_server: The server to query
     :param req: The request to execute
     :param add_crumb: Boolean to indicate if it should add crumb to the request
     :return:
     """
     try:
         # if jenkins_server.auth:
         #     req.add_header('Authorization', jenkins_server.auth)
         # if add_crumb:
         #     jenkins_server.maybe_add_crumb(req)
         base64string = base64.b64encode(
             '%s:%s' % (self.connection.login, self.connection.password))
         self.log.info("base64string -> %s", base64string)
         req.add_header("Authorization", "Basic %s" % base64string)
         response = urlopen(req, timeout=jenkins_server.timeout)
         response_body = response.read()
         response_headers = response.info()
         if response_body is None:
             raise jenkins.EmptyResponseException(
                 "Error communicating with server[%s]: "
                 "empty response" % jenkins_server.server)
         return {
             'body': response_body.decode('utf-8'),
             'headers': response_headers
         }
     except HTTPError as e:
         # Jenkins's funky authentication means its nigh impossible to
         # distinguish errors.
         if e.code in [401, 403, 500]:
             # six.moves.urllib.error.HTTPError provides a 'reason'
             # attribute for all python version except for ver 2.6
             # Falling back to HTTPError.msg since it contains the
             # same info as reason
             raise JenkinsException(
                 'Error in request. ' +
                 'Possibly authentication failed [%s]: %s' %
                 (e.code, e.msg))
         elif e.code == 404:
             raise jenkins.NotFoundException(
                 'Requested item could not be found')
         else:
             raise
     except socket.timeout as e:
         raise jenkins.TimeoutException('Error in request: %s' % e)
     except URLError as e:
         # python 2.6 compatibility to ensure same exception raised
         # since URLError wraps a socket timeout on python 2.6.
         if str(e.reason) == "timed out":
             raise jenkins.TimeoutException('Error in request: %s' %
                                            e.reason)
         raise JenkinsException('Error in request: %s' % e.reason)
示例#3
0
    def test_return_empty_response(self, jenkins_mock):
        "Don't try to create crumb header from an empty response"
        jenkins_mock.side_effect = jenkins.EmptyResponseException("empty response")
        request = jenkins.requests.Request('GET', 'http://example.com/job/TestJob')

        self.j.maybe_add_crumb(request)

        self.assertEqual(
            jenkins_mock.call_args[0][0].url,
            self.make_url('crumbIssuer/api/json'))
        self.assertFalse(self.j.crumb)
        self.assertFalse('.crumb' in request.headers)
示例#4
0
    def test_return_empty_response(self, jenkins_mock):
        "Don't try to create crumb header from an empty response"
        jenkins_mock.side_effect = jenkins.EmptyResponseException(
            "empty response")
        request = jenkins.Request(self.make_url('job/TestJob'))

        self.j.maybe_add_crumb(request)

        self.assertEqual(jenkins_mock.call_args[0][0].get_full_url(),
                         self.make_url('crumbIssuer/api/json'))
        self.assertFalse(self.j.crumb)
        self.assertFalse('.crumb' in request.headers)
        self._check_requests(jenkins_mock.call_args_list)
示例#5
0
def _response_handler(self, response):  # pragma: no cover
    '''Handle response objects'''
    # raise exceptions if occurred
    response.raise_for_status()
    headers = response.headers
    if (headers.get('content-length') is None
            and headers.get('transfer-encoding') is None
            and len(response.content) <= 0):
        # response body should only exist if one of these is provided
        raise jenkins.EmptyResponseException(
            "Error communicating with server[%s]: "
            "empty response" % self.server)
    # Response objects will automatically return unicode encoded
    # when accessing .text property
    return response
示例#6
0
def jenkins_request_with_headers(jenkins_server, req):
    """
    We need to get the headers in addition to the body answer
    to get the location from them
    This function uses jenkins_request method from python-jenkins library
    with just the return call changed

    :param jenkins_server: The server to query
    :param req: The request to execute
    :return: Dict containing the response body (key body)
        and the headers coming along (headers)
    """
    try:
        response = jenkins_server.jenkins_request(req)
        response_body = response.content
        response_headers = response.headers
        if response_body is None:
            raise jenkins.EmptyResponseException(
                "Error communicating with server[%s]: "
                "empty response" % jenkins_server.server)
        return {
            'body': response_body.decode('utf-8'),
            'headers': response_headers
        }
    except HTTPError as e:
        # Jenkins's funky authentication means its nigh impossible to
        # distinguish errors.
        if e.code in [401, 403, 500]:
            # six.moves.urllib.error.HTTPError provides a 'reason'
            # attribute for all python version except for ver 2.6
            # Falling back to HTTPError.msg since it contains the
            # same info as reason
            raise JenkinsException('Error in request. ' +
                                   'Possibly authentication failed [%s]: %s' %
                                   (e.code, e.msg))
        elif e.code == 404:
            raise jenkins.NotFoundException(
                'Requested item could not be found')
        else:
            raise
    except socket.timeout as e:
        raise jenkins.TimeoutException('Error in request: %s' % e)
    except URLError as e:
        # python 2.6 compatibility to ensure same exception raised
        # since URLError wraps a socket timeout on python 2.6.
        if str(e.reason) == "timed out":
            raise jenkins.TimeoutException('Error in request: %s' % e.reason)
        raise JenkinsException('Error in request: %s' % e.reason)
示例#7
0
 def jenkins_open(self, req, add_crumb=True):
     '''Utility routine for opening an HTTP request to a Jenkins server.
     Extended over the original method to allow connections to SF with a
     cookie.
     '''
     self.opener.addheaders = [('Cookie', 'auth_pubtkt=%s' % self.cookie)]
     try:
         if add_crumb:
             self.maybe_add_crumb(req)
         response = self.opener.open(req, timeout=self.timeout).read()
         if response is None:
             raise jenkins.EmptyResponseException(
                 "Error communicating with server[%s]: "
                 "empty response" % self.server)
         return response.decode('utf-8')
     except HTTPError as e:
         # Jenkins's funky authentication means its nigh impossible to
         # distinguish errors.
         if e.code in [401, 403, 500]:
             # six.moves.urllib.error.HTTPError provides a 'reason'
             # attribute for all python version except for ver 2.6
             # Falling back to HTTPError.msg since it contains the
             # same info as reason
             raise jenkins.JenkinsException(
                 'Error in request. ' +
                 'Possibly authentication failed [%s]: %s' %
                 (e.code, e.msg))
         elif e.code == 404:
             raise jenkins.NotFoundException(
                 'Requested item could not be found')
         else:
             raise
     except socket.timeout as e:
         raise jenkins.TimeoutException('Error in request: %s' % (e))
     except URLError as e:
         # python 2.6 compatibility to ensure same exception raised
         # since URLError wraps a socket timeout on python 2.6.
         if str(e.reason) == "timed out":
             raise jenkins.TimeoutException('Error in request: %s' %
                                            (e.reason))
     raise jenkins.JenkinsException('Error in request: %s' % (e.reason))
示例#8
0
class JenkinsOpenTest(JenkinsTestBase):
    @patch('jenkins.requests.Session.send', autospec=True)
    def test_simple(self, session_send_mock):
        data = {'foo': 'bar'}
        session_send_mock.side_effect = iter([
            build_response_mock(200, self.crumb_data),
            build_response_mock(200, data),
        ])
        request = jenkins.requests.Request('GET', self.make_url('job/TestJob'))

        response = self.j.jenkins_open(request)

        self.assertEqual(session_send_mock.call_args[0][1].url,
                         self.make_url('job/TestJob'))
        self.assertEqual(response, json.dumps(data))
        self.assertEqual(self.j.crumb, self.crumb_data)
        self.assertEqual(request.headers['.crumb'], self.crumb_data['crumb'])

    @patch('jenkins.requests.Session.send', autospec=True)
    def test_response_403(self, session_send_mock):
        request = jenkins.requests.Request('GET', self.make_url('job/TestJob'))
        session_send_mock.return_value = build_response_mock(
            401, reason="basic auth failed")

        with self.assertRaises(jenkins.JenkinsException) as context_manager:
            self.j.jenkins_open(request, add_crumb=False)
        self.assertEqual(
            str(context_manager.exception),
            'Error in request. Possibly authentication failed [401]: '
            'basic auth failed')
        self.assertEqual(session_send_mock.call_args[0][1].url,
                         self.make_url('job/TestJob'))

    @patch('jenkins.requests.Session.send', autospec=True)
    def test_response_404(self, session_send_mock):
        request = jenkins.requests.Request('GET', self.make_url('job/TestJob'))
        session_send_mock.return_value = build_response_mock(
            404, reason="basic auth failed")

        with self.assertRaises(jenkins.NotFoundException) as context_manager:
            self.j.jenkins_open(request, add_crumb=False)
        self.assertEqual(str(context_manager.exception),
                         'Requested item could not be found')
        self.assertEqual(session_send_mock.call_args[0][1].url,
                         self.make_url('job/TestJob'))

    @patch('jenkins.requests.Session.send', autospec=True)
    def test_empty_response(self, session_send_mock):
        request = jenkins.requests.Request('GET', self.make_url('job/TestJob'))
        session_send_mock.return_value = build_response_mock(
            401, reason="basic auth failed")

        with self.assertRaises(jenkins.JenkinsException) as context_manager:
            self.j.jenkins_open(request, False)
        self.assertEqual(
            str(context_manager.exception),
            'Error in request. Possibly authentication failed [401]: '
            'basic auth failed')
        self.assertEqual(session_send_mock.call_args[0][1].url,
                         self.make_url('job/TestJob'))

    @patch('jenkins.requests.Session.send', autospec=True)
    def test_response_501(self, session_send_mock):
        request = jenkins.requests.Request('GET', self.make_url('job/TestJob'))
        session_send_mock.return_value = build_response_mock(
            501, reason="Not implemented")

        with self.assertRaises(jenkins.req_exc.HTTPError) as context_manager:
            self.j.jenkins_open(request, add_crumb=False)
        self.assertEqual(str(context_manager.exception),
                         '501 Server Error: Not implemented for url: None')
        self.assertEqual(session_send_mock.call_args[0][1].url,
                         self.make_url('job/TestJob'))

    @patch('jenkins.requests.Session.send', autospec=True)
    def test_timeout(self, session_send_mock):
        session_send_mock.side_effect = jenkins.URLError(reason="timed out")
        j = jenkins.Jenkins(self.make_url(''),
                            'test',
                            'test',
                            timeout=1,
                            resolve=False)
        request = jenkins.requests.Request('GET', self.make_url('job/TestJob'))

        with self.assertRaises(jenkins.JenkinsException) as context_manager:
            j.jenkins_open(request, add_crumb=False)
        self.assertEqual(str(context_manager.exception),
                         'Error in request: timed out')
        self.assertEqual(session_send_mock.call_args[0][1].url,
                         self.make_url('job/TestJob'))

    @patch.object(jenkins.Jenkins,
                  'jenkins_open',
                  return_value=json.dumps({'mode': 'NORMAL'}))
    @patch.object(jenkins.Jenkins, 'get_version', return_value="Version42")
    def test_wait_for_normal_op(self, version_mock, jenkins_mock):
        j = jenkins.Jenkins('http://example.com',
                            'test',
                            'test',
                            resolve=False)
        self.assertTrue(j.wait_for_normal_op(0))

    @patch.object(jenkins.Jenkins,
                  'jenkins_open',
                  side_effect=jenkins.EmptyResponseException())
    @patch.object(jenkins.Jenkins,
                  'get_version',
                  side_effect=jenkins.EmptyResponseException())
    def test_wait_for_normal_op__empty_response(self, version_mock,
                                                jenkins_mock):
        j = jenkins.Jenkins('http://example.com',
                            'test',
                            'test',
                            resolve=False)
        self.assertFalse(j.wait_for_normal_op(0))

    def test_wait_for_normal_op__negative_timeout(self):
        j = jenkins.Jenkins('http://example.com',
                            'test',
                            'test',
                            resolve=False)
        with self.assertRaises(ValueError) as context_manager:
            j.wait_for_normal_op(-1)
        self.assertEqual(str(context_manager.exception),
                         "Timeout must be >= 0 not -1")
示例#9
0
class JenkinsOpenTest(JenkinsTestBase):
    @patch('jenkins.urlopen')
    def test_simple(self, jenkins_mock):
        data = {'foo': 'bar'}
        jenkins_mock.side_effect = [
            get_mock_urlopen_return_value(self.crumb_data),
            get_mock_urlopen_return_value(data),
        ]
        request = jenkins.Request(self.make_url('job/TestJob'))

        response = self.j.jenkins_open(request)

        self.assertEqual(jenkins_mock.call_args[0][0].get_full_url(),
                         self.make_url('job/TestJob'))
        self.assertEqual(response, json.dumps(data))
        self.assertEqual(self.j.crumb, self.crumb_data)
        self.assertEqual(request.headers['.crumb'], self.crumb_data['crumb'])
        self._check_requests(jenkins_mock.call_args_list)

    @patch('jenkins.urlopen')
    def test_response_403(self, jenkins_mock):
        jenkins_mock.side_effect = jenkins.HTTPError(
            self.make_url('job/TestJob'),
            code=401,
            msg="basic auth failed",
            hdrs=[],
            fp=None)
        request = jenkins.Request(self.make_url('job/TestJob'))

        with self.assertRaises(jenkins.JenkinsException) as context_manager:
            self.j.jenkins_open(request, add_crumb=False)
        self.assertEqual(
            str(context_manager.exception),
            'Error in request. Possibly authentication failed [401]: '
            'basic auth failed')
        self.assertEqual(jenkins_mock.call_args[0][0].get_full_url(),
                         self.make_url('job/TestJob'))
        self._check_requests(jenkins_mock.call_args_list)

    @patch('jenkins.urlopen')
    def test_response_404(self, jenkins_mock):
        jenkins_mock.side_effect = jenkins.HTTPError(
            self.make_url('job/TestJob'),
            code=404,
            msg="basic auth failed",
            hdrs=[],
            fp=None)
        request = jenkins.Request(self.make_url('job/TestJob'))

        with self.assertRaises(jenkins.NotFoundException) as context_manager:
            self.j.jenkins_open(request, add_crumb=False)
        self.assertEqual(str(context_manager.exception),
                         'Requested item could not be found')
        self.assertEqual(jenkins_mock.call_args[0][0].get_full_url(),
                         self.make_url('job/TestJob'))
        self._check_requests(jenkins_mock.call_args_list)

    @patch('jenkins.urlopen')
    def test_empty_response(self, jenkins_mock):
        jenkins_mock.return_value = Mock(**{'read.return_value': None})

        request = jenkins.Request(self.make_url('job/TestJob'))

        with self.assertRaises(jenkins.JenkinsException) as context_manager:
            self.j.jenkins_open(request, False)
        self.assertEqual(
            str(context_manager.exception),
            'Error communicating with server[{0}/]: '
            'empty response'.format(self.base_url))
        self.assertEqual(jenkins_mock.call_args[0][0].get_full_url(),
                         self.make_url('job/TestJob'))
        self._check_requests(jenkins_mock.call_args_list)

    @patch('jenkins.urlopen')
    def test_response_501(self, jenkins_mock):
        jenkins_mock.side_effect = jenkins.HTTPError(
            self.make_url('job/TestJob'),
            code=501,
            msg="Not implemented",
            hdrs=[],
            fp=None)
        request = jenkins.Request(self.make_url('job/TestJob'))

        with self.assertRaises(HTTPError) as context_manager:
            self.j.jenkins_open(request, add_crumb=False)
        self.assertEqual(str(context_manager.exception),
                         'HTTP Error 501: Not implemented')
        self.assertEqual(jenkins_mock.call_args[0][0].get_full_url(),
                         self.make_url('job/TestJob'))
        self._check_requests(jenkins_mock.call_args_list)

    @patch('jenkins.urlopen')
    def test_timeout(self, jenkins_mock):
        jenkins_mock.side_effect = jenkins.URLError(reason="timed out")
        j = jenkins.Jenkins(self.make_url(''), 'test', 'test', timeout=1)
        request = jenkins.Request(self.make_url('job/TestJob'))

        with self.assertRaises(jenkins.JenkinsException) as context_manager:
            j.jenkins_open(request, add_crumb=False)
        self.assertEqual(str(context_manager.exception),
                         'Error in request: timed out')
        self.assertEqual(jenkins_mock.call_args[0][0].get_full_url(),
                         self.make_url('job/TestJob'))
        self._check_requests(jenkins_mock.call_args_list)

    @patch.object(jenkins.Jenkins,
                  'jenkins_open',
                  return_value=json.dumps({'mode': 'NORMAL'}))
    @patch.object(jenkins.Jenkins, 'get_version', return_value="Version42")
    def test_wait_for_normal_op(self, version_mock, jenkins_mock):
        j = jenkins.Jenkins('http://example.com', 'test', 'test')
        self.assertTrue(j.wait_for_normal_op(0))

    @patch.object(jenkins.Jenkins,
                  'jenkins_open',
                  side_effect=jenkins.EmptyResponseException())
    @patch.object(jenkins.Jenkins,
                  'get_version',
                  side_effect=jenkins.EmptyResponseException())
    def test_wait_for_normal_op__empty_response(self, version_mock,
                                                jenkins_mock):
        j = jenkins.Jenkins('http://example.com', 'test', 'test')
        self.assertFalse(j.wait_for_normal_op(0))

    def test_wait_for_normal_op__negative_timeout(self):
        j = jenkins.Jenkins('http://example.com', 'test', 'test')
        with self.assertRaises(ValueError) as context_manager:
            j.wait_for_normal_op(-1)
        self.assertEqual(str(context_manager.exception),
                         "Timeout must be >= 0 not -1")