예제 #1
0
    def invoke_job(self,
                   name,
                   parameters=None,
                   token=None,
                   cause=None,
                   wait_started=True,
                   wait_done=True,
                   output_progress=False,
                   output_done=True,
                   open_browser=False,
                   short_info=True):

        wait_started = wait_started or open_browser or wait_done

        logging.info('invoke job:{} parameters:{}'.format(name, parameters))
        job_info = self.get_job_info(name)
        has_params = _is_parametrized_job(job_info)
        params = parameters or {}

        if has_params and cause:
            params['cause'] = cause

        req_url = self.build_job_url_ex(name,
                                        params,
                                        token,
                                        has_params=has_params)
        logging.info('invoke at {}'.format(req_url))
        response = self.jenkins_open_ex(jenkins.Request(req_url, b''),
                                        add_crumb=False)
        logging.info('running with params: {}'.format(params))
        job_in_queue_url = response.headers['location'] + 'api/json'
        logging.info('enqueued url: {}'.format(job_in_queue_url))

        result = json.loads(
            self.jenkins_open(jenkins.Request(job_in_queue_url)))
        wait_started = wait_started or wait_done
        logging.info("triggered: {}".format(name))

        if wait_started:
            logging.info('\n[wait until:started:{}]\n'.format(name))
            build_number = self._wait_started(job_in_queue_url)
            build_info = self.get_build_info(name, build_number)
            if open_browser:
                webbrowser.open_new_tab('{}/console'.format(build_info['url']))
            if wait_done:
                logging.info("waiting for done: {}".format(name))
                build_info = self.wait_done(name,
                                            build_number,
                                            output_progress=output_progress)
            if output_done:
                logging.info(self.get_build_console_output(name, build_number))
            result = build_info

        if result and short_info:
            info = bunch.bunchify(result)
            result = utils.from_build_info_to_build_short_info(info)
        return result
예제 #2
0
    def test_simple(self, jenkins_mock):
        jenkins_mock.side_effect = jenkins.NotFoundException()
        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)
예제 #3
0
    def test_jenkins_open_timeout(self):
        j = jenkins.Jenkins("http://%s:%s" % self.server.server_address,
                            None,
                            None,
                            timeout=0.1)
        request = jenkins.Request('http://%s:%s/job/TestJob' %
                                  self.server.server_address)

        # assert our request times out when no response
        with testtools.ExpectedException(jenkins.TimeoutException):
            j.jenkins_open(request, add_crumb=False)
예제 #4
0
    def test_with_data(self, jenkins_mock):
        jenkins_mock.return_value = get_mock_urlopen_return_value(
            self.crumb_data)
        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.assertEqual(self.j.crumb, self.crumb_data)
        self.assertEqual(request.headers['.crumb'], self.crumb_data['crumb'])
        self._check_requests(jenkins_mock.call_args_list)
예제 #5
0
    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)
예제 #6
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)
예제 #7
0
    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)
예제 #8
0
    def test_jenkins_open_no_timeout(self):
        j = jenkins.Jenkins("http://%s:%s" % self.server.server_address, None,
                            None)
        request = jenkins.Request('http://%s:%s/job/TestJob' %
                                  self.server.server_address)

        # assert we don't timeout quickly like previous test when
        # no timeout defined.
        with testtools.ExpectedException(TestsTimeoutException):
            time_limit(0.5,
                       self.messages,
                       j.jenkins_open,
                       request,
                       add_crumb=False)
예제 #9
0
    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)
예제 #10
0
    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)
예제 #11
0
    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)
예제 #12
0
    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)
예제 #13
0
 def get_queue_info():
     js = self.jenkins_open(jenkins.Request(job_in_queue_url))
     return json.loads(js)