Exemplo n.º 1
0
    def test_get_build_data_config_error(self):
        # Recreate the esl to validate parameters aren't set
        with unittest.mock.patch.dict(
                'os.environ', {'JENKINS_URL': 'jenkins_url', 'JENKINS_USER': '******',
                               'JENKINS_PASSWORD': '******', 'ES_JOB_NAME': 'es_job_name',
                               'ES_BUILD_NUMBER': '2', 'GATHER_BUILD_DATA': 'dummy'}):
            self.esl = es_logger.EsLogger(1000, ['dummy'])
        self.esl.es_build_number = '2'
        with unittest.mock.patch('stevedore.driver.DriverManager') as mock_driver_mgr, \
                unittest.mock.patch('jenkins.Jenkins.get_build_info') as mock_build_info, \
                unittest.mock.patch('jenkins.Jenkins.get_build_env_vars') as mock_env_vars, \
                unittest.mock.patch('jenkins.Jenkins.get_build_console_output') as mock_console, \
                unittest.mock.patch('jenkins.Jenkins.get_job_config') as mock_config:
            mock_env_vars.return_value = {'envMap': {'BUILD_NUMBER': '1',
                                                     'JOB_NAME': 'job_name',
                                                     'BUILD_URL': 'url',
                                                     'dummy': 'dummy'}}
            mock_build_info.return_value = {
                'description': 'description',
                'number': '1',
                'url': 'url',
                'actions': [{'_class': 'hudson.model.ParametersAction',
                             'parameters': [{'name': 'param', 'value': 'value'}]},
                            {'_class': 'hudson.plugins.git.util.BuildData',
                             'buildsByBranchName': {'b1': {'buildNumber': '1'},
                                                    'b2': {'buildNumber': '2'}},
                             'remoteUrls': ["repoURL"]}]}
            mock_console.return_value = 'log'
            mock_config.side_effect = JenkinsException("Error from Jenkins Api")

            self.esl.get_build_data()
            mock_driver_mgr.assert_called_once()

            # Job Config recorded
            expetected_error_msg = "Unable to retrieve config.xml."
            nose.tools.ok_(self.esl.es_info['job_config_info'] == expetected_error_msg,
                           "'job_config_info' value {} not '{}'".format(
                               self.esl.es_info['job_config_info'],
                               expetected_error_msg))

            # Console log recorded
            nose.tools.ok_(self.esl.es_info['console_log'] == 'log',
                           "console_log not 'log': {}".format(self.esl.es_info))
            # Parameters pulled out
            nose.tools.ok_(self.esl.es_info['parameters'].get('param') == 'value',
                           "Parameter 'param' not 'value': {}".format(self.esl.es_info))

            # Prevent ES field explosion through rewrite of builds by branch name
            nose.tools.ok_(
                self.esl.es_info['build_info']['actions'][1]['buildsByBranchName'] ==
                'Removed by es-logger',
                "buildsByBranchName not removed by es-logger: {}".format(self.esl.es_info))
            # Make sure the gather of the gather_build_data plugins was called
            nose.tools.ok_('dummy' in self.esl.es_info['build_data'].keys(),
                           "dummy not in build_data keys: {}".format(
                               self.esl.es_info))
            # SCM correctly processed
            nose.tools.ok_('repoURL' in self.esl.es_info['build_data'].keys(),
                           "repoURL not in build_data keys: {}".format(
                               self.esl.es_info['build_data']))
Exemplo n.º 2
0
 def test_get_es_build_number_default(self):
     # Recreate the esl to validate parameters aren't set and default is 0
     self.esl = es_logger.EsLogger(1000, ['dummy'])
     nose.tools.ok_(
         self.esl.es_build_number == '0',
         "self.esl.es_build_number not 0: {} ({})".format(
             self.esl.es_build_number, type(self.esl.es_build_number)))
Exemplo n.º 3
0
def main():
    args = parse_args()
    configure_logging(args)

    if args.list_plugins:
        es_logger.EsLogger.list_plugins()
        sys.exit(0)

    esl = es_logger.EsLogger(console_length=args.console_length,
                             targets=args.target)
    esl.gather_all()

    status = 0
    # Loop over all of the events to send,
    # main job in es_info, then events generated from plugins
    process_events = [esl.es_info] if not args.events_only else []
    process_events += esl.events
    for e in process_events:
        if not args.no_dump:
            esl.dump(e)
        if not args.no_post:
            status += esl.post(e)

    if not args.no_post:
        status += esl.finish()

    sys.exit(status)
Exemplo n.º 4
0
 def test_get_es_build_number(self):
     # Recreate the esl to validate parameters aren't set
     self.esl = es_logger.EsLogger(1000, ['dummy'])
     nose.tools.ok_(self.esl.es_build_number == 0,
                    "self.esl.es_build_number not 0: {}".format(self.esl.es_build_number))
     with unittest.mock.patch.dict('os.environ', {'ES_BUILD_NUMBER': '1000'}):
         self.esl.es_build_number = self.esl.get_es_build_number()
         nose.tools.ok_(self.esl.get_es_build_number() == 1000,
                        "{} not returning {}".format(self.esl.get_es_build_number, 1000))
Exemplo n.º 5
0
 def test_get(self, param):
     # Recreate the esl to validate parameters aren't set
     self.esl = es_logger.EsLogger(1000, ['dummy'])
     nose.tools.ok_(getattr(self.esl, param) is None,
                    "{} not None: {}".format(param, getattr(self.esl, param)))
     getter = getattr(self.esl, 'get_' + param)
     with unittest.mock.patch.dict('os.environ', {param.upper(): param}):
         setattr(self.esl, param, getter())
         nose.tools.ok_(getter() == param,
                        "{} returned {} not {}".format(getter.__name__, getter(), param))
Exemplo n.º 6
0
    def setup(self):
        dep = pkg_resources.EntryPoint.parse(
            'dummy = test.test_plugins:DummyEventTarget')
        d = pkg_resources.Distribution()
        d._ep_map = {'es_logger.plugins.event_target': {'dummy': dep}}
        pkg_resources.working_set.add(d, 'dummy')
        ExtensionManager.ENTRY_POINT_CACHE = {}

        self.esl = es_logger.EsLogger(1000, ['dummy'])
        self.urls = {
            'get_build_env_vars': 'jenkins_url/job/job_name/1/injectedEnvVars/api/json?depth=1',
            'get_build_test_report': 'jenkins_url/job/job_name/1/testReport/api/json?depth=1'}
Exemplo n.º 7
0
    def setup(self):
        dummy_ep = importlib.metadata.EntryPoint(
            'dummy', 'test.test_plugins:DummyEventTarget',
            'es_logger.plugins.event_target')
        ExtensionManager.ENTRY_POINT_CACHE = {
            'es_logger.plugins.event_target': [dummy_ep]
        }
        self.esl = es_logger.EsLogger(1000, ['dummy'])

        self.urls = {
            'get_build_artifact': 'jenkins_url/job/job_name/1/artifact/1',
            'get_build_stages': 'jenkins_url/job/job_name/1/wfapi/describe/'
        }
Exemplo n.º 8
0
 def test_empty_plugin_vars(self):
     dummy_ep = importlib.metadata.EntryPoint(
         'dummy', 'test.test_plugins:DummyEventTarget',
         'es_logger.plugins.event_target')
     ExtensionManager.ENTRY_POINT_CACHE = {
         'es_logger.plugins.event_target': [dummy_ep]
     }
     esl = es_logger.EsLogger(1000, ['dummy'])
     nose.tools.ok_(
         esl.process_console_logs == [],
         "process_console_logs {}".format(esl.process_console_logs))
     nose.tools.ok_(esl.gather_build_data == [],
                    "gather_build_data {}".format(esl.gather_build_data))
     nose.tools.ok_(esl.generate_events == ['commit'],
                    "generate_events {}".format(esl.generate_events))
Exemplo n.º 9
0
 def test_get_plugin(self, param):
     if param == 'generate_events':
         base = ['commit']
     else:
         base = []
     # Recreate the esl to validate parameters aren't set
     self.esl = es_logger.EsLogger(1000, ['dummy'])
     nose.tools.ok_(getattr(self.esl, param) == base,
                    "{} not []: {}".format(param, getattr(self.esl, param)))
     setattr(self.esl, param, None)
     getter = getattr(self.esl, 'get_' + param)
     with unittest.mock.patch.dict('os.environ',
                                   {param.upper(): "{}1 {}2 {}3".format(param, param, param)}):
         plugins = getter()
         expected = [param + '1', param + '2', param + '3'] + base
         nose.tools.ok_(plugins == expected,
                        "{} returned {} not {}".format(getter.__name__, getter(), expected))
Exemplo n.º 10
0
 def test_get_es_build_number(self):
     es_build_number = '999'
     # Validate correct value from env
     with unittest.mock.patch.dict('os.environ',
                                   {'ES_BUILD_NUMBER': es_build_number}):
         self.esl = es_logger.EsLogger(1000, ['dummy'])
         nose.tools.ok_(
             self.esl.get_es_build_number() == es_build_number,
             "{} not returning {}, types: {} {}".format(
                 self.esl.es_build_number, es_build_number,
                 type(self.esl.es_build_number), type(es_build_number)))
     # Validate env change doesn't change our object
     with unittest.mock.patch.dict('os.environ',
                                   {'ES_BUILD_NUMBER': '1000'}):
         nose.tools.ok_(
             self.esl.get_es_build_number() == es_build_number,
             "{} not returning {}, types: {} {}".format(
                 self.esl.es_build_number, es_build_number,
                 type(self.esl.es_build_number), type(es_build_number)))
Exemplo n.º 11
0
 def es_logger_task(self, msg):
     var = json.loads(''.join(msg[0].decode("utf-8").split()[1:]))
     phase = var['build'].get('phase')
     if phase == 'FINISHED':
         job = self.get_project_name(var['url'])
         number = var['build'].get('number')
         logging.info("Process {} number {} on {}".format(
             job, number, self.jenkins_url))
         # Create and configure the ES-Logger instance
         esl = es_logger.EsLogger(console_length=32500,
                                  targets=['logstash'])
         esl.es_job_name = job
         esl.es_build_number = int(number)
         esl.gather_all()
         status = esl.post_all()
         logging.info("{} number {} status {}".format(job, number, status))
     else:
         logging.debug('Not collecting from job in phase {}'.format(phase))
         status = None
     return status
Exemplo n.º 12
0
    def test_get_build_data(self):
        # Recreate the esl to validate parameters aren't set
        with unittest.mock.patch.dict(
                'os.environ', {
                    'JENKINS_URL': 'jenkins_url',
                    'JENKINS_USER': '******',
                    'JENKINS_PASSWORD': '******',
                    'ES_JOB_NAME': 'es_job_name',
                    'ES_BUILD_NUMBER': '2',
                    'GATHER_BUILD_DATA': 'dummy'
                }):
            self.esl = es_logger.EsLogger(1000, ['dummy'])
        self.esl.es_build_number = '2/label=matrix'
        with unittest.mock.patch('stevedore.driver.DriverManager') as mock_driver_mgr, \
                unittest.mock.patch('jenkins.Jenkins.get_build_info') as mock_build_info, \
                unittest.mock.patch('jenkins.Jenkins.get_build_env_vars') as mock_env_vars, \
                unittest.mock.patch('jenkins.Jenkins.get_build_console_output') as mock_console, \
                unittest.mock.patch('jenkins.Jenkins.get_job_config') as mock_config:
            mock_env_vars.return_value = {
                'envMap': {
                    'BUILD_NUMBER': '1',
                    'JOB_NAME': 'job_name',
                    'BUILD_URL': 'url',
                    'dummy': 'dummy'
                }
            }
            mock_build_info.return_value = {
                'description':
                'description',
                'number':
                '1',
                'url':
                'url',
                'actions': [{
                    '_class': 'hudson.model.ParametersAction',
                    'parameters': [{
                        'name': 'param',
                        'value': 'value'
                    }]
                }, {
                    '_class': 'hudson.plugins.git.util.BuildData',
                    'buildsByBranchName': {
                        'b1': {
                            'buildNumber': '1'
                        },
                        'b2': {
                            'buildNumber': '2'
                        }
                    },
                    'remoteUrls': ["repoURL"]
                }]
            }
            mock_console.return_value = 'log'

            config_xml = "<project></project>"
            mock_config.return_value = config_xml

            self.esl.get_build_data()
            mock_driver_mgr.assert_called_once()

            # Job Config recorded
            nose.tools.ok_(
                self.esl.es_info['job_config_info'].get("is_pipeline_job") is
                False, "is_pipeline_job not '{}': {}".format(
                    False,
                    self.esl.es_info["job_config_info"]["is_pipeline_job"]))

            # The job_config is on of length 1.
            nose.tools.ok_(
                len(self.esl.es_info['job_config_info']) == 1,
                "job_config_info len isn't '1': {}".format(
                    self.esl.es_info["job_config_info"]))

            # Console log recorded
            nose.tools.ok_(
                self.esl.es_info['console_log'] == 'log',
                "console_log not 'log': {}".format(self.esl.es_info))
            # Console log length recorded
            nose.tools.ok_(
                self.esl.es_info['console_log_length'] == 3,
                "console_log length not 3: {}".format(self.esl.es_info))

            # ID info pulled into eslogger namespace
            eslogger_vars = {
                'job_name': 'es_job_name',
                'jenkins_url': 'jenkins_url',
                'build_number': 2,
                'build_label': 'label=matrix',
                'es_build_number': '2/label=matrix'
            }
            for k, v in eslogger_vars.items():
                nose.tools.ok_(self.esl.es_info['eslogger'][k] == v,
                               "{} not {}: {}".format(k, v, self.esl.es_info))

            # Parameters pulled out
            nose.tools.ok_(
                self.esl.es_info['parameters'].get('param') == 'value',
                "Parameter 'param' not 'value': {}".format(self.esl.es_info))

            # Prevent ES field explosion through rewrite of builds by branch name
            nose.tools.ok_(
                self.esl.es_info['build_info']['actions'][1]
                ['buildsByBranchName'] == 'Removed by es-logger',
                "buildsByBranchName not removed by es-logger: {}".format(
                    self.esl.es_info))
            # Make sure the gather of the gather_build_data plugins was called
            nose.tools.ok_(
                'dummy' in self.esl.es_info['build_data'].keys(),
                "dummy not in build_data keys: {}".format(self.esl.es_info))
            # SCM correctly processed
            nose.tools.ok_(
                len(self.esl.es_info['build_data']['scm_data']) == 1,
                "Wrong number of elements in scm_data: {}".format(
                    len(self.esl.es_info['build_data']['scm_data'])))
            nose.tools.ok_(
                self.esl.es_info['build_data']['scm_data'][0]['name'] ==
                "repoURL",
                "Wrong name for scm_data first element: {} not repoURL".format(
                    self.esl.es_info['build_data']['scm_data'][0]['name']))