예제 #1
0
    def test_on_delete_request_busy(self):
        """Test processing of a localdisk delete request.
        """
        # Access to a protected member
        # pylint: disable=W0212

        svc = localdisk_service.LocalDiskResourceService(
            block_dev='/dev/block',
            vg_name='treadmill',
            read_bps='100M',
            write_bps='100M',
            read_iops=1000,
            write_iops=1000)
        request_id = 'myproid.test-0-ID1234'
        # trying to lvremote fails
        treadmill.lvm.lvremove.side_effect = [
            subproc.CalledProcessError(returncode=5, cmd='lvm'),
            subproc.CalledProcessError(returncode=5, cmd='lvm'),
            subproc.CalledProcessError(returncode=5, cmd='lvm'), 0
        ]

        # XXX: Remove once AFSClient workaround is removed.
        # XXX: self.assertRaises(
        # XXX:     subproc.CalledProcessError,
        # XXX:     svc.on_delete_request,
        # XXX:     request_id
        # XXX: )
        svc.on_delete_request(request_id)

        treadmill.lvm.lvdisplay.assert_called_with('tm-ID1234',
                                                   group='treadmill')
        treadmill.lvm.lvremove.assert_called_with('tm-ID1234',
                                                  group='treadmill')
예제 #2
0
    def test_add_raw_rule_safe(self):
        """Test adding iptable rule (safe)."""
        treadmill.subproc.check_call.return_value = 0

        iptables.add_raw_rule('nat', 'OUTPUT', '-j FOO', safe=True)

        treadmill.subproc.check_call.assert_called_once_with(
            ['iptables', '-t', 'nat', '-C', 'OUTPUT', '-j', 'FOO'])

        # Rule does not exist.
        treadmill.subproc.check_call.reset_mock()

        treadmill.subproc.check_call.side_effect = [
            subproc.CalledProcessError(1, ''),
            0,
        ]

        iptables.add_raw_rule('nat', 'OUTPUT', '-j FOO', safe=True)

        treadmill.subproc.check_call.assert_has_calls([
            mock.call(['iptables', '-t', 'nat', '-C', 'OUTPUT', '-j', 'FOO']),
            mock.call(['iptables', '-t', 'nat', '-A', 'OUTPUT', '-j', 'FOO'])
        ])

        # Unexpected iptables error while checking if the rule already exists.
        treadmill.subproc.check_call.reset_mock()

        treadmill.subproc.check_call.side_effect = \
            subproc.CalledProcessError(3, '')

        with self.assertRaises(subproc.CalledProcessError):
            iptables.add_raw_rule('nat', 'OUTPUT', '-j FOO', safe=True)
예제 #3
0
    def test_control_service_wait(self):
        """Tests controlling a service and wait"""
        # Disable W0212(protected-access)
        # pylint: disable=W0212

        # shutdown supervised service
        res = supervisor.control_service(
            self.root, supervisor.ServiceControlAction.down,
            wait=supervisor.ServiceWaitAction.down,
            timeout=100,
        )

        treadmill.subproc.check_call.assert_called_with(
            [supervisor._get_cmd('svc'), '-d', self.root]
        )
        treadmill.supervisor.wait_service.assert_called_with(
            self.root,
            treadmill.supervisor.ServiceWaitAction.down,
            timeout=100
        )
        self.assertTrue(res)

        # shutdown service timeouts
        treadmill.subproc.check_call.reset_mock()
        supervisor.wait_service.side_effect = \
            subproc.CalledProcessError(99, supervisor._get_cmd('svwait'))

        res = supervisor.control_service(
            self.root, supervisor.ServiceControlAction.down,
            wait=supervisor.ServiceWaitAction.down,
            timeout=100,
        )
        treadmill.subproc.check_call.assert_called_with(
            [supervisor._get_cmd('svc'), '-d', self.root]
        )
        treadmill.supervisor.wait_service.assert_called_with(
            self.root,
            treadmill.supervisor.ServiceWaitAction.down,
            timeout=100
        )
        self.assertFalse(res)

        # shutdown unsupervised service
        treadmill.subproc.check_call.reset_mock()
        treadmill.subproc.check_call.side_effect = \
            subproc.CalledProcessError(100, supervisor._get_cmd('svc'))

        with self.assertRaises(subproc.CalledProcessError):
            supervisor.control_service(
                self.root, supervisor.ServiceControlAction.down,
                wait=supervisor.ServiceWaitAction.down,
                timeout=100,
            )
예제 #4
0
    def test_flush_pt_conntrack_table(self):
        """Test flushing Passthrough conntrack rules.
        """
        treadmill.subproc.check_call.return_value = 0

        treadmill.iptables.flush_pt_conntrack_table('5.5.5.5')

        treadmill.subproc.check_call.assert_has_calls([
            mock.call([
                'conntrack', '-D', '--protonum', 'udp', '--orig-src', '5.5.5.5'
            ]),
            mock.call([
                'conntrack', '-D', '--protonum', 'udp', '--orig-dst', '5.5.5.5'
            ]),
        ],
                                                      any_order=True)

        treadmill.subproc.check_call.reset_mock()
        treadmill.subproc.check_call.return_value = 1
        treadmill.subproc.check_call.side_effect = \
            subproc.CalledProcessError(returncode=1, cmd='failed conntrack')

        treadmill.iptables.flush_pt_conntrack_table('4.4.4.4')

        treadmill.subproc.check_call.assert_has_calls([
            mock.call([
                'conntrack', '-D', '--protonum', 'udp', '--orig-src', '4.4.4.4'
            ]),
            mock.call([
                'conntrack', '-D', '--protonum', 'udp', '--orig-dst', '4.4.4.4'
            ]),
        ],
                                                      any_order=True)
예제 #5
0
    def test__bring_up(self, mock_policy, mock_down_action):
        """Test interface with supervisor bringing up services.
        """
        # pylint: disable=protected-access
        mon = monitor.Monitor(scan_dirs='/some/dir',
                              service_dirs=None,
                              policy_impl=mock_policy,
                              down_action=mock_down_action())
        mock_pol_inst = mock_policy.return_value
        treadmill.supervisor.wait_service.side_effect = [
            subproc.CalledProcessError(supervisor.ERR_TIMEOUT, 's6-svwait'),
            None,
        ]

        mon._bring_up(mock_pol_inst.service)

        supervisor.wait_service.assert_has_calls([
            mock.call(mock_pol_inst.service.directory,
                      supervisor.ServiceWaitAction.up,
                      timeout=100),
            mock.call(mock_pol_inst.service.directory,
                      supervisor.ServiceWaitAction.really_down,
                      timeout=60 * 1000),
        ])
        treadmill.supervisor.control_service.assert_called_with(
            mock_pol_inst.service.directory,
            treadmill.supervisor.ServiceControlAction.up)
예제 #6
0
    def test_wait_service(self):
        """Tests waiting on a service.
        """
        # Disable W0212(protected-access)
        # pylint: disable=W0212
        supervisor.wait_service(self.root, supervisor.ServiceWaitAction.down)
        treadmill.subproc.check_call.assert_called_with(
            [supervisor._get_cmd('svwait'), '-d', self.root])

        treadmill.subproc.check_call.reset_mock()
        supervisor.wait_service(
            (os.path.join(self.root, 'a'), os.path.join(self.root, 'b')),
            supervisor.ServiceWaitAction.up,
            all_services=False,
            timeout=100,
        )

        treadmill.subproc.check_call.assert_called_with([
            supervisor._get_cmd('svwait'), '-t100', '-o', '-u',
            os.path.join(self.root, 'a'),
            os.path.join(self.root, 'b')
        ])

        treadmill.subproc.check_call.reset_mock()
        treadmill.subproc.check_call.side_effect = \
            subproc.CalledProcessError(99, supervisor._get_cmd('svwait'))
        with self.assertRaises(subproc.CalledProcessError):
            supervisor.wait_service(self.root,
                                    supervisor.ServiceWaitAction.really_down)
        treadmill.subproc.check_call.assert_called_with(
            [supervisor._get_cmd('svwait'), '-D', self.root])
    def test_initialize_img(self):
        """Test service initialization (image).
        """
        # pylint: disable=W0212

        img_location = '/image_dir'
        img_size = 42

        treadmill.lvm.vgactivate.side_effect = \
            subproc.CalledProcessError(returncode=5, cmd='lvm')
        mock_init_blkdev = treadmill.localdiskutils.init_block_dev
        mock_init_blkdev.return_value = '/dev/test'
        treadmill.lvm.lvsdisplay.return_value = []

        localdiskutils.setup_image_lvm(
            localdiskutils.TREADMILL_IMG,
            img_location,
            img_size
        )

        treadmill.lvm.vgactivate.assert_called_with(group='treadmill')
        mock_init_blkdev.assert_called_with('treadmill.img', '/image_dir', 42)
        treadmill.localdiskutils.init_vg.assert_called_with(
            'treadmill',
            '/dev/test',
        )
예제 #8
0
    def test_ensure_not_supervised_failed(self):  # pylint: disable=C0103
        """Tests when a service fails to be brought down.
        """
        treadmill.supervisor.is_supervised.return_value = True
        treadmill.supervisor.control_service.side_effect = \
            subproc.CalledProcessError(1, '')

        with self.assertRaises(Exception):
            supervisor.ensure_not_supervised(self.root)
예제 #9
0
    def test_initialize(self, mock_vipmgr):
        """Test service initialization.
        """
        # Access to a protected member _device_info of a client class
        # pylint: disable=W0212
        treadmill.services.network_service._device_info.side_effect = \
            lambda dev: {'alias': 'reqid_%s' % dev}
        treadmill.netdev.link_set_up.side_effect = [
            subproc.CalledProcessError('any', 'how'),
            None,
        ]
        mock_vipmgr_inst = mock_vipmgr.return_value
        mock_vipmgr_inst.list.return_value = []

        svc = network_service.NetworkResourceService(
            ext_device='eth42',
            ext_speed=10000,
            ext_mtu=9000,
        )

        svc.initialize(self.root)

        mock_vipmgr.assert_called_with(
            '192.168.0.0/16',
            mock.ANY,
            svc._service_rsrc_dir
        )
        mock_vipmgr_inst.garbage_collect.assert_not_called()
        treadmill.iptables.create_set.assert_has_calls(
            [
                mock.call(treadmill.iptables.SET_PROD_CONTAINERS,
                          family='inet', set_type='hash:ip',
                          hashsize=1024, maxelem=65536),
                mock.call(treadmill.iptables.SET_NONPROD_CONTAINERS,
                          family='inet', set_type='hash:ip',
                          hashsize=1024, maxelem=65536),
            ],
            any_order=True
        )
        treadmill.netdev.link_set_up.assert_called_with('tm0')
        svc._bridge_initialize.assert_called()
        mock_vipmgr_inst.initialize.assert_not_called()
        treadmill.netdev.bridge_setfd.assert_called_with('br0', 0)
        treadmill.netdev.dev_mtu.assert_called_with('br0')
        treadmill.netdev.dev_conf_route_localnet_set('tm0', True)
        treadmill.netdev.bridge_brif('br0')
        treadmill.services.network_service._device_info.assert_not_called()
        mock_vipmgr_inst.free.assert_not_called()
        self.assertEqual(
            svc._devices,
            {}
        )
예제 #10
0
    def test_is_supervised(self):
        """Tests that checking if a service directory is supervised.
        """
        # Disable W0212(protected-access)
        # pylint: disable=W0212
        self.assertTrue(supervisor.is_supervised(self.root))
        treadmill.subproc.check_call.assert_called_with(
            [supervisor._get_cmd('svok'), self.root])

        treadmill.subproc.check_call.side_effect = \
            subproc.CalledProcessError(1, supervisor._get_cmd('svok'))
        self.assertFalse(supervisor.is_supervised(self.root))
        treadmill.subproc.check_call.assert_called_with(
            [supervisor._get_cmd('svok'), self.root])
    def test__init_block_dev(self):
        """Create a backing block device for LVM's Treadmill volume group.
        """
        # pylint: disable=W0212

        localdiskutils.loop_dev_for.side_effect = [
            subproc.CalledProcessError(returncode=1, cmd='losetup'),
            '/dev/test'
        ]

        res = localdiskutils.init_block_dev('treadmill.img', '/bar', '2G')

        self.assertTrue(localdiskutils.init_loopback_devices.called)
        localdiskutils.create_image.assert_called_with(
            localdiskutils.TREADMILL_IMG, '/bar', '2G')
        self.assertEqual(res, '/dev/test')
    def test__init_vg(self):
        """Test LVM volume group initialization.
        """
        # pylint: disable=W0212

        treadmill.lvm.vgactivate.side_effect = [
            subproc.CalledProcessError(returncode=5, cmd='lvm'),
            0,
        ]

        localdiskutils.init_vg('test-group', '/dev/test')

        treadmill.lvm.pvcreate.assert_called_with(device='/dev/test')
        treadmill.lvm.vgcreate.assert_called_with('test-group',
                                                  device='/dev/test')
        treadmill.lvm.vgactivate.assert_called_with('test-group')
예제 #13
0
    def test_delete_dnat_rule_nonexist(self):
        """Test dnat rule deleting when the rule does not exist."""
        treadmill.subproc.check_call.side_effect = \
            subproc.CalledProcessError(returncode=1, output='', cmd='')

        iptables.delete_dnat_rule(
            firewall.DNATRule(proto='tcp',
                              dst_ip='1.1.1.1', dst_port=123,
                              new_ip='2.2.2.2', new_port=345),
            'SOME_RULE',
        )

        treadmill.subproc.check_call.assert_called_with([
            'iptables', '-t', 'nat', '-D', 'SOME_RULE',
            '-s', '0.0.0.0/0', '-d', '1.1.1.1', '-p', 'tcp', '-m', 'tcp',
            '--dport', '123',
            '-j', 'DNAT', '--to-destination', '2.2.2.2:345'])
예제 #14
0
    def test_control_service(self):
        """Tests controlling a service.
        """
        # Disable W0212(protected-access)
        # pylint: disable=W0212
        self.assertTrue(supervisor.control_service(
            self.root, supervisor.ServiceControlAction.down
        ))
        treadmill.subproc.check_call.assert_called_with(
            [supervisor._get_cmd('svc'), '-d', self.root]
        )

        self.assertTrue(supervisor.control_service(
            self.root, (
                supervisor.ServiceControlAction.up,
                supervisor.ServiceControlAction.once_at_most,
            ),
            timeout=100,  # Should not be used
        ))
        treadmill.subproc.check_call.assert_called_with(
            [supervisor._get_cmd('svc'), '-uO', self.root]
        )

        self.assertTrue(supervisor.control_service(
            self.root, supervisor.ServiceControlAction.up,
            wait=supervisor.ServiceWaitAction.up,
            timeout=100,
        ))
        treadmill.subproc.check_call.assert_called_with(
            [supervisor._get_cmd('svwait'), '-t100', '-u', self.root]
        )

        treadmill.subproc.check_call.side_effect = \
            subproc.CalledProcessError(1, supervisor._get_cmd('svc'))
        self.assertRaises(
            subproc.CalledProcessError,
            supervisor.control_service,
            self.root,
            supervisor.ServiceControlAction.down
        )
        treadmill.subproc.check_call.assert_called_with(
            [supervisor._get_cmd('svc'), '-d', self.root]
        )
예제 #15
0
    def test_flush_pt_conntrack_table(self):
        """Test flushing Passthrough conntrack rules.
        """
        treadmill.subproc.check_call.return_value = 0

        treadmill.iptables.flush_pt_conntrack_table('5.5.5.5')

        treadmill.subproc.check_call.assert_called_with(
            ['conntrack', '-D', '-s', '5.5.5.5'])

        treadmill.subproc.check_call.reset_mock()
        treadmill.subproc.check_call.return_value = 1
        treadmill.subproc.check_call.side_effect = \
            subproc.CalledProcessError(returncode=1, cmd='failed conntrack')

        treadmill.iptables.flush_pt_conntrack_table('4.4.4.4')

        treadmill.subproc.check_call.assert_called_with(
            ['conntrack', '-D', '-s', '4.4.4.4'])
예제 #16
0
    def test_initialize_blk(self):
        """Test service initialization (block device).
        """
        # pylint: disable=W0212

        block_dev = '/dev/test'

        treadmill.lvm.vgactivate.side_effect = \
            subproc.CalledProcessError(returncode=5, cmd='lvm')
        treadmill.lvm.lvsdisplay.return_value = []

        localdiskutils.setup_device_lvm(block_dev)

        treadmill.lvm.vgactivate.assert_called_with(group='treadmill')
        # If provided, we should try to create the block device
        self.assertFalse(treadmill.localdiskutils.init_block_dev.called)
        treadmill.localdiskutils.init_vg.assert_called_with(
            'treadmill',
            '/dev/test',
        )
예제 #17
0
    def test_initialize(self):
        """Test iptables initialization"""
        # Disable protected-access: Test access protected members .
        # pylint: disable=protected-access
        treadmill.iptables._iptables_restore.side_effect = [
            None,
            subproc.CalledProcessError(2, 'failed'),
            None,
        ]

        # NOTE(boysson): keep this IP in sync with the tests' states
        iptables.initialize('1.2.3.4')

        treadmill.iptables.ipset_restore.assert_called_with(self.ipset_state)

        treadmill.iptables._iptables_restore.assert_has_calls([
            mock.call(self.iptables_state),
            mock.call(self.iptables_filter_state, noflush=True),
            mock.call(self.iptables_filter_drop_state, noflush=True),
        ])
예제 #18
0
    def test__bring_up_no_sup(self, mock_policy, mock_down_action):
        """Test interface with supervisor bringing up services.

        Service not supervised.
        """
        # pylint: disable=protected-access
        mon = monitor.Monitor(scan_dirs='/some/dir',
                              service_dirs=None,
                              policy_impl=mock_policy,
                              down_action=mock_down_action())
        mock_pol_inst = mock_policy.return_value
        treadmill.supervisor.wait_service.side_effect = (
            subproc.CalledProcessError(supervisor.ERR_NO_SUP, 's6-svwait'))

        mon._bring_up(mock_pol_inst.service)

        supervisor.wait_service.assert_called_with(
            mock_pol_inst.service.directory,
            supervisor.ServiceWaitAction.up,
            timeout=100)
        treadmill.supervisor.control_service.assert_not_called()
    def test_on_delete_request_notexist(self):
        """Test processing of a localdisk delete request.
        """
        # Access to a protected member
        # pylint: disable=W0212

        svc = localdisk_service.LocalDiskResourceService(
            block_dev='/dev/block',
            vg_name='treadmill',
            read_bps='100M',
            write_bps='100M',
            read_iops=1000,
            write_iops=1000)
        request_id = 'myproid.test-0-ID1234'
        # trying to find the LV fails
        treadmill.lvm.lvdisplay.side_effect = (subproc.CalledProcessError(
            returncode=5, cmd='lvm'), )

        svc.on_delete_request(request_id)

        treadmill.lvm.lvdisplay.assert_called_with('tm-ID1234',
                                                   group='treadmill')
        treadmill.lvm.lvremove.assert_not_called()
        treadmill.localdiskutils.refresh_vg_status.assert_not_called()