Ejemplo n.º 1
0
    def setUp(self):
        self.unit = MagicMock()
        self.unit.properties.Id = UNIT_NAME
        self.unit.properties.LoadState = LOAD_STATE
        self.unit.properties.ActiveState = ACTIVE_STATE
        self.unit.properties.SubState = SUB_STATE
        self.unit.properties.ActiveEnterTimestamp = ACTIVE_TIMESTAMP
        self.unit.properties.ActiveExitTimestamp = ACTIVE_TIMESTAMP

        self.loaded_unit = MagicMock()
        self.loaded_unit.properties.ActiveState = ACTIVE_STATE

        self.manager = MagicMock()
        self.manager.list_units.return_value = [self.unit]
        self.manager.load_unit.return_value = self.loaded_unit

        self.flotilla_unit = FlotillaDockerService('redis.service',
                                                   'redis:latest')

        self.unit_dir = tempfile.mkdtemp('flotilla-systemd-unit')
        self.env_dir = tempfile.mkdtemp('flotilla-systemd-env')
        self.systemd = SystemdUnits(self.manager,
                                    unit_dir=self.unit_dir,
                                    env_dir=self.env_dir)
Ejemplo n.º 2
0
    def setUp(self):
        self.unit = MagicMock()
        self.unit.properties.Id = UNIT_NAME
        self.unit.properties.LoadState = LOAD_STATE
        self.unit.properties.ActiveState = ACTIVE_STATE
        self.unit.properties.SubState = SUB_STATE
        self.unit.properties.ActiveEnterTimestamp = ACTIVE_TIMESTAMP
        self.unit.properties.ActiveExitTimestamp = ACTIVE_TIMESTAMP

        self.loaded_unit = MagicMock()
        self.loaded_unit.properties.ActiveState = ACTIVE_STATE

        self.manager = MagicMock()
        self.manager.list_units.return_value = [self.unit]
        self.manager.load_unit.return_value = self.loaded_unit

        self.flotilla_unit = FlotillaDockerService('redis.service',
                                                   'redis:latest')

        self.unit_dir = tempfile.mkdtemp('flotilla-systemd-unit')
        self.env_dir = tempfile.mkdtemp('flotilla-systemd-env')
        self.systemd = SystemdUnits(self.manager, unit_dir=self.unit_dir,
                                    env_dir=self.env_dir)
Ejemplo n.º 3
0
class TestSystemdUnits(unittest.TestCase):
    def setUp(self):
        self.unit = MagicMock()
        self.unit.properties.Id = UNIT_NAME
        self.unit.properties.LoadState = LOAD_STATE
        self.unit.properties.ActiveState = ACTIVE_STATE
        self.unit.properties.SubState = SUB_STATE
        self.unit.properties.ActiveEnterTimestamp = ACTIVE_TIMESTAMP
        self.unit.properties.ActiveExitTimestamp = ACTIVE_TIMESTAMP

        self.loaded_unit = MagicMock()
        self.loaded_unit.properties.ActiveState = ACTIVE_STATE

        self.manager = MagicMock()
        self.manager.list_units.return_value = [self.unit]
        self.manager.load_unit.return_value = self.loaded_unit

        self.flotilla_unit = FlotillaDockerService('redis.service',
                                                   'redis:latest')

        self.unit_dir = tempfile.mkdtemp('flotilla-systemd-unit')
        self.env_dir = tempfile.mkdtemp('flotilla-systemd-env')
        self.systemd = SystemdUnits(self.manager,
                                    unit_dir=self.unit_dir,
                                    env_dir=self.env_dir)

    def tearDown(self):
        shutil.rmtree(self.unit_dir)
        shutil.rmtree(self.env_dir)

    def test_get_units_empty(self):
        self.manager.list_units.return_value = []
        units = self.systemd.get_units()
        self.assertEqual(len(units), 0)

    def test_get_units_ignore(self):
        self.unit.properties.Id = 'not-the-druid-you-are-looking-for'
        units = self.systemd.get_units()
        self.assertEqual(len(units), 0)

    def test_get_units(self):
        self.manager.list_units.return_value = [self.unit]

        units = self.systemd.get_units()
        self.assertEqual(len(units), 1)

    def test_stop_units(self):
        self.systemd.stop_units()
        self.unit.stop.assert_called_with('replace')

    def test_stop_units_eats_exception(self):
        self.unit.stop.side_effect = Exception('kaboom')
        self.systemd.stop_units()

    def test_start_units(self):
        self.systemd.start_units()
        self.unit.start.assert_called_with('replace')

    def test_get_unit_status(self):
        statuses = self.systemd.get_unit_status()
        self.assertEqual(len(statuses), 1)
        status = statuses[self.unit.properties.Id]
        self.assertEqual(LOAD_STATE, status['load_state'])
        self.assertEqual(ACTIVE_STATE, status['active_state'])
        self.assertEqual(SUB_STATE, status['sub_state'])
        self.assertEqual(ACTIVE_TIMESTAMP, status['active_enter_time'])
        self.assertEqual(ACTIVE_TIMESTAMP, status['active_exit_time'])

    def test_set_units(self):
        unit_path = '%s/%s' % (self.unit_dir, UNIT_NAME)
        with open(unit_path, 'w') as unit_out:
            unit_out.write('\n')
        env_path = '%s/%s' % (self.env_dir, UNIT_NAME)
        with open(env_path, 'w') as env_out:
            env_out.write('\n')

        self.systemd.set_units([self.flotilla_unit])

        # Existing units were stopped and deleted:
        self.unit.stop.assert_called_with('replace')
        self.assertFalse(os.path.exists(unit_path))
        self.assertFalse(os.path.exists(env_path))

        # New unit has been written:
        unit_path = '%s/%s' % (self.unit_dir, self.flotilla_unit.full_name)
        env_path = '%s/%s' % (self.env_dir, self.flotilla_unit.full_name)
        self.assertTrue(os.path.isfile(unit_path))
        self.assertFalse(os.path.exists(env_path))

        self.manager.reload.assert_called_with()
        self.loaded_unit.start.assert_called_with('replace')

    def test_set_units_environment(self):
        flotilla_unit = FlotillaDockerService('redis.service',
                                              'redis:latest',
                                              environment={'FOO': 'bar'})

        self.systemd.set_units([flotilla_unit])

        env_path = '%s/%s' % (self.env_dir, flotilla_unit.full_name)
        self.assertTrue(os.path.isfile(env_path))

    def test_set_units_existing_wont_stop(self):
        self.unit.stop.side_effect = Exception('Mock stop failure')

        self.systemd.set_units([self.flotilla_unit])
        # Exception not thrown

    def test_set_units_wont_reload(self):
        self.manager.reload.side_effect = Exception('Mock reload failure')

        self.systemd.set_units([self.flotilla_unit])
        # Exception not thrown

    def test_set_units_already_started(self):
        self.loaded_unit.properties.ActiveState = 'active'

        self.systemd.set_units([self.flotilla_unit])

        self.loaded_unit.start.assert_not_called()

    def test_set_units_service_mapping(self):
        depending_unit = FlotillaUnit('dependent.service', '''[Unit]
After=redis.service
''')
        self.systemd.set_units([self.flotilla_unit, depending_unit])

        unit_path = '%s/%s' % (self.unit_dir, depending_unit.full_name)
        self.assertTrue(os.path.isfile(unit_path))
        with open(unit_path) as unit_in:
            unit_contents = unit_in.read()
        self.assertFalse('redis.service' in unit_contents)
        self.assertTrue(self.flotilla_unit.full_name in unit_contents)
Ejemplo n.º 4
0
class TestSystemdUnits(unittest.TestCase):
    def setUp(self):
        self.unit = MagicMock()
        self.unit.properties.Id = UNIT_NAME
        self.unit.properties.LoadState = LOAD_STATE
        self.unit.properties.ActiveState = ACTIVE_STATE
        self.unit.properties.SubState = SUB_STATE
        self.unit.properties.ActiveEnterTimestamp = ACTIVE_TIMESTAMP
        self.unit.properties.ActiveExitTimestamp = ACTIVE_TIMESTAMP

        self.loaded_unit = MagicMock()
        self.loaded_unit.properties.ActiveState = ACTIVE_STATE

        self.manager = MagicMock()
        self.manager.list_units.return_value = [self.unit]
        self.manager.load_unit.return_value = self.loaded_unit

        self.flotilla_unit = FlotillaDockerService('redis.service',
                                                   'redis:latest')

        self.unit_dir = tempfile.mkdtemp('flotilla-systemd-unit')
        self.env_dir = tempfile.mkdtemp('flotilla-systemd-env')
        self.systemd = SystemdUnits(self.manager, unit_dir=self.unit_dir,
                                    env_dir=self.env_dir)

    def tearDown(self):
        shutil.rmtree(self.unit_dir)
        shutil.rmtree(self.env_dir)

    def test_get_units_empty(self):
        self.manager.list_units.return_value = []
        units = self.systemd.get_units()
        self.assertEqual(len(units), 0)

    def test_get_units_ignore(self):
        self.unit.properties.Id = 'not-the-druid-you-are-looking-for'
        units = self.systemd.get_units()
        self.assertEqual(len(units), 0)

    def test_get_units(self):
        self.manager.list_units.return_value = [self.unit]

        units = self.systemd.get_units()
        self.assertEqual(len(units), 1)

    def test_stop_units(self):
        self.systemd.stop_units()
        self.unit.stop.assert_called_with('replace')

    def test_stop_units_eats_exception(self):
        self.unit.stop.side_effect = Exception('kaboom')
        self.systemd.stop_units()

    def test_start_units(self):
        self.systemd.start_units()
        self.unit.start.assert_called_with('replace')

    def test_get_unit_status(self):
        statuses = self.systemd.get_unit_status()
        self.assertEqual(len(statuses), 1)
        status = statuses[self.unit.properties.Id]
        self.assertEqual(LOAD_STATE, status['load_state'])
        self.assertEqual(ACTIVE_STATE, status['active_state'])
        self.assertEqual(SUB_STATE, status['sub_state'])
        self.assertEqual(ACTIVE_TIMESTAMP, status['active_enter_time'])
        self.assertEqual(ACTIVE_TIMESTAMP, status['active_exit_time'])

    def test_set_units(self):
        unit_path = '%s/%s' % (self.unit_dir, UNIT_NAME)
        with open(unit_path, 'w') as unit_out:
            unit_out.write('\n')
        env_path = '%s/%s' % (self.env_dir, UNIT_NAME)
        with open(env_path, 'w') as env_out:
            env_out.write('\n')

        self.systemd.set_units([self.flotilla_unit])

        # Existing units were stopped and deleted:
        self.unit.stop.assert_called_with('replace')
        self.assertFalse(os.path.exists(unit_path))
        self.assertFalse(os.path.exists(env_path))

        # New unit has been written:
        unit_path = '%s/%s' % (self.unit_dir, self.flotilla_unit.full_name)
        env_path = '%s/%s' % (self.env_dir, self.flotilla_unit.full_name)
        self.assertTrue(os.path.isfile(unit_path))
        self.assertFalse(os.path.exists(env_path))

        self.manager.reload.assert_called_with()
        self.loaded_unit.start.assert_called_with('replace')

    def test_set_units_environment(self):
        flotilla_unit = FlotillaDockerService('redis.service', 'redis:latest',
                                              environment={'FOO': 'bar'})

        self.systemd.set_units([flotilla_unit])

        env_path = '%s/%s' % (self.env_dir, flotilla_unit.full_name)
        self.assertTrue(os.path.isfile(env_path))

    def test_set_units_existing_wont_stop(self):
        self.unit.stop.side_effect = Exception('Mock stop failure')

        self.systemd.set_units([self.flotilla_unit])
        # Exception not thrown

    def test_set_units_wont_reload(self):
        self.manager.reload.side_effect = Exception('Mock reload failure')

        self.systemd.set_units([self.flotilla_unit])
        # Exception not thrown

    def test_set_units_already_started(self):
        self.loaded_unit.properties.ActiveState = 'active'

        self.systemd.set_units([self.flotilla_unit])

        self.loaded_unit.start.assert_not_called()

    def test_set_units_service_mapping(self):
        depending_unit = FlotillaUnit('dependent.service', '''[Unit]
After=redis.service
''')
        self.systemd.set_units([self.flotilla_unit, depending_unit])

        unit_path = '%s/%s' % (self.unit_dir, depending_unit.full_name)
        self.assertTrue(os.path.isfile(unit_path))
        with open(unit_path) as unit_in:
            unit_contents = unit_in.read()
        self.assertFalse('redis.service' in unit_contents)
        self.assertTrue(self.flotilla_unit.full_name in unit_contents)