Exemple #1
0
    def down(self, service, data):
        trace = self._get_trace(service)
        if trace is None:
            return

        appevents.post(
            self.tm_env.app_events_dir,
            traceevents.ServiceExitedTraceEvent(instanceid=trace['instanceid'],
                                                uniqueid=trace['uniqueid'],
                                                service=service.name,
                                                rc=data['return_code'],
                                                signal=data['signal']))
Exemple #2
0
 def test_service_exited(self):
     """ServiceExited event operations.
     """
     event = events.ServiceExitedTraceEvent(
         timestamp=1,
         source='tests',
         instanceid='proid.foo#123',
         uniqueid='AAAA',
         service='web.x',
         rc=1,
         signal=2,
         payload={'foo': 'bar'}
     )
     self.assertEqual(
         event.to_dict(),
         {
             'event_type': 'service_exited',
             'timestamp': 1,
             'source': 'tests',
             'instanceid': 'proid.foo#123',
             'uniqueid': 'AAAA',
             'service': 'web.x',
             'rc': 1,
             'signal': 2,
             'payload': {'foo': 'bar'},
         }
     )
     self.assertEqual(
         event.to_data(),
         (
             1,
             'tests',
             'proid.foo#123',
             'service_exited',
             'AAAA.web.x.1.2',
             {'foo': 'bar'},
         )
     )
     self.assertEqual(
         event,
         events.ServiceExitedTraceEvent.from_data(
             timestamp=1,
             source='tests',
             instanceid='proid.foo#123',
             event_type='service_exited',
             event_data='AAAA.web.x.1.2',
             payload={'foo': 'bar'}
         )
     )
Exemple #3
0
    def test_service_exited(self, stdout_mock):
        """Test printing ServiceExited event.
        """
        event = events.ServiceExitedTraceEvent(timestamp=1,
                                               source='tests',
                                               instanceid='proid.foo#123',
                                               uniqueid='AAAA',
                                               service='web.x',
                                               rc=1,
                                               signal=2,
                                               payload={'foo': 'bar'})

        self.trace_printer.process(event)

        self.assertEqual(
            stdout_mock.getvalue(), 'Thu, 01 Jan 1970 00:00:01+0000 - '
            'proid.foo#123/AAAA/service/web.x exited, return code: 1\n')
Exemple #4
0
    def update_exit_status(self, service_name):
        """Creates an entry under tasks/<host> object with the exit status."""
        svc_dir = os.path.join(self.services_dir, service_name)
        finished = os.path.join(svc_dir, 'finished')
        if not os.path.exists(finished):
            _LOGGER.info('%s/finished does not exist.', svc_dir)
            return

        task_id = self.manifest.get('task', None)
        if not task_id:
            _LOGGER.error('Task id not found.')
            return

        exitinfo, count = self.exit_info(svc_dir)
        prev_count = None
        reported = os.path.join(svc_dir, 'reported')
        try:
            with open(reported) as f:
                prev_count = int(f.read())
        except IOError as err:
            if err.errno == errno.ENOENT:
                pass
            else:
                raise

        if prev_count == count:
            _LOGGER.info('Exit status already reported, count: %d', count)
            return

        _LOGGER.info('exit (rc, signal): (%s, %s)', exitinfo['rc'],
                     exitinfo['sig'])

        appevents.post(
            self.appevents_dir,
            traceevents.ServiceExitedTraceEvent(instanceid=self.appname,
                                                uniqueid=self.uniqueid,
                                                service=service_name,
                                                rc=exitinfo['rc'],
                                                signal=exitinfo['sig']))

        # Records that exit status was successfully reported.
        with open(reported, 'w+') as f:
            f.write(str(count))

        self.services[service_name]['last_exit'] = exitinfo
Exemple #5
0
    def test_update_exit_status(self):
        """Verifies reading the finished file and updating task status."""
        manifest = {
            'vip': {
                'ip0': '192.168.0.1',
                'ip1': '192.168.0.2'
            },
            'task':
            't-0001',
            'name':
            'foo.test1#0001',
            'uniqueid':
            'AAAAAA',
            'proid':
            'andreik',
            'services': [{
                'command': '/usr/bin/python -m SimpleHTTPServer',
                'name': 'web_server',
                'restart': {
                    'interval': 60,
                    'limit': 3
                }
            }, {
                'command': 'sshd -D -f /etc/ssh/sshd_config',
                'name': 'sshd',
                'proid': None
            }],
            'endpoints': [{
                'port': 22,
                'name': 'ssh',
                'real_port': 5001
            }, {
                'port': 8000,
                'name': 'http',
                'real_port': 5000
            }]
        }
        treadmill.sysinfo.hostname.return_value = 'server1.xx.com'
        app_presence = presence.ServicePresence(manifest,
                                                container_dir=self.root,
                                                appevents_dir=self.events_dir)

        os.mkdir(os.path.join(self.root, 'services'))
        os.mkdir(os.path.join(self.root, 'services', 'web_server'))
        finished_file = os.path.join(self.root, 'services', 'web_server',
                                     'finished')
        with open(finished_file, 'a+') as f:
            f.write('1000 1 0\n')
        app_presence.update_exit_status('web_server')
        treadmill.appevents.post.assert_called_with(
            self.events_dir,
            events.ServiceExitedTraceEvent(instanceid='foo.test1#0001',
                                           uniqueid='AAAAAA',
                                           service='web_server',
                                           rc=1,
                                           signal=0))

        kazoo.client.KazooClient.create.reset_mock()
        with open(finished_file, 'a+') as f:
            f.write('2000 9 255\n')
        app_presence.update_exit_status('web_server')
        treadmill.appevents.post.assert_called_with(
            self.events_dir,
            events.ServiceExitedTraceEvent(instanceid='foo.test1#0001',
                                           uniqueid='AAAAAA',
                                           service='web_server',
                                           rc=9,
                                           signal=255))

        reported_file = os.path.join(self.root, 'services', 'web_server',
                                     'reported')
        self.assertTrue(os.path.exists(reported_file))

        # Calling update state twice is no-op, as reported file is newer.
        kazoo.client.KazooClient.create.reset_mock()
        app_presence.update_exit_status('web_server')
        self.assertFalse(kazoo.client.KazooClient.create.called)