예제 #1
0
    def test_event_groups(self):
        with monitor.object_monitor(
            timeout=self.TIMEOUT, groups=('ipv4-ifaddr',)
        ) as mon_a:
            with monitor.object_monitor(
                timeout=self.TIMEOUT, groups=('link', 'ipv4-route')
            ) as mon_l_r:
                with dummy_device() as dummy:
                    Interface.from_existing_dev_name(dummy).add_ip(
                        IP_ADDRESS, IP_CIDR, IpFamily.IPv4
                    )

        for event in mon_a:
            assert '_addr' in event['event'], (
                "Caught event '%s' is not "
                "related to address." % event['event']
            )

        for event in mon_l_r:
            link_or_route = (
                '_link' in event['event'] or '_route' in event['event']
            )
            assert link_or_route, (
                "Caught event '%s' is not related "
                "to link or route." % event['event']
            )
예제 #2
0
파일: nettestlib.py 프로젝트: kobihk/vdsm
 def _down(self):
     with monitor.object_monitor(groups=('link', ), timeout=2) as mon:
         linkSet(self.devName, ['down'])
         for event in mon:
             if (event.get('name') == self.devName
                     and event.get('state') == 'down'):
                 return
예제 #3
0
파일: networkTests.py 프로젝트: bellle/vdsm
def _waitForKnownOperstate(device, timeout=1):
    with monitor.object_monitor(groups=('link',), timeout=timeout) as mon:
        if operstate(device) == OPERSTATE_UNKNOWN:
            for event in mon:
                if (event['name'] == device and
                        event['state'] != OPERSTATE_UNKNOWN):
                    break
예제 #4
0
    def test_stopped(self):
        with monitor.object_monitor(timeout=self.TIMEOUT) as mon:
            with dummy_device() as dummy:
                dummy_name = dummy

        found = any(event.get('name') == dummy_name for event in mon)
        assert found, 'Expected event was not caught.'
예제 #5
0
 def test_iterate_after_events(self):
     with monitor.object_monitor(timeout=self.TIMEOUT) as mon:
         with dummy_device() as dummy:
             dummy_name = dummy
         for event in mon:
             if event.get('name') == dummy_name:
                 break
예제 #6
0
파일: nettestlib.py 프로젝트: kobihk/vdsm
def wait_for_ipv6(iface, wait_for_scopes=None):
    """Wait for iface to get their IPv6 addresses with netlink Monitor"""
    logevents = []
    if not wait_for_scopes:
        wait_for_scopes = ['global', 'link']
    try:
        with monitor.object_monitor(groups=('ipv6-ifaddr', ),
                                    timeout=20) as mon:
            yield
            for event in mon:
                logevents.append(event)
                dev_name = event.get('label')
                if (dev_name == iface and event.get('event') == 'new_addr'
                        and event.get('scope') in wait_for_scopes):

                    wait_for_scopes.remove(event.get('scope'))
                    if not wait_for_scopes:
                        return

    except monitor.MonitorError as e:
        if e.args[0] == monitor.E_TIMEOUT:
            raise Exception(
                'IPv6 addresses has not been caught within 20sec.\n'
                'Event log: {}\n'.format(logevents))
        else:
            raise
예제 #7
0
 def test_iterate_after_events(self):
     with monitor.object_monitor(timeout=self.TIMEOUT) as mon:
         dummy = Dummy()
         dummy_name = dummy.create()
         dummy.remove()
         for event in mon:
             if event.get('name') == dummy_name:
                 break
예제 #8
0
    def test_stopped(self):
        with monitor.object_monitor(timeout=self.TIMEOUT) as mon:
            dummy = Dummy()
            dummy_name = dummy.create()
            dummy.remove()

        found = any(event.get('name') == dummy_name for event in mon)
        assert found, 'Expected event was not caught.'
예제 #9
0
파일: networkTests.py 프로젝트: bellle/vdsm
def _waitForOperstate(device, state, timeout=1):
    """ :param state: please use OPERSTATE_* from lib/vdsm/network/netinfo
    """
    with monitor.object_monitor(groups=('link',), timeout=timeout) as mon:
        if state != operstate(device):
            for event in mon:
                if event['name'] == device and event['state'] == state:
                    break
예제 #10
0
 def test_enable_promisc(self, bridge0):
     link = ipwrapper.getLink(bridge0)
     with monitor.object_monitor(timeout=2, silent_timeout=True) as mon:
         link.promisc = True
         for event in mon:
             if (event['event'] == 'new_link'
                     and event.get('flags', 0) & IfaceStatus.IFF_PROMISC):
                 return
     assert False, 'Could not enable promiscuous mode.'
예제 #11
0
    def test_timeout_not_triggered(self):
        time_start = monotonic_time()
        with monitor.object_monitor(timeout=self.TIMEOUT) as mon:
            with dummy_device():
                pass

            for event in mon:
                break

        assert (monotonic_time() - time_start) <= self.TIMEOUT
        assert mon.is_stopped()
예제 #12
0
    def test_timeout(self):
        with pytest.raises(monitor.MonitorError):
            try:
                with monitor.object_monitor(timeout=0.01) as mon:
                    for event in mon:
                        pass
            except monitor.MonitorError as e:
                assert e.args[0] == monitor.E_TIMEOUT
                raise

        assert mon.is_stopped()
예제 #13
0
    def test_timeout_not_triggered(self):
        time_start = monotonic_time()
        with monitor.object_monitor(timeout=self.TIMEOUT) as mon:
            dummy = Dummy()
            dummy.create()
            dummy.remove()

            for event in mon:
                break

        assert (monotonic_time() - time_start) <= self.TIMEOUT
        assert mon.is_stopped()
예제 #14
0
    def test_event_groups(self):
        with monitor.object_monitor(timeout=self.TIMEOUT,
                                    groups=('ipv4-ifaddr', )) as mon_a:
            with monitor.object_monitor(timeout=self.TIMEOUT,
                                        groups=('link',
                                                'ipv4-route')) as mon_l_r:
                dummy = Dummy()
                dummy.create()
                dummy.set_ip(IP_ADDRESS, IP_CIDR)
                dummy.up()
                dummy.remove()

        for event in mon_a:
            assert '_addr' in event['event'], ("Caught event '%s' is not "
                                               "related to address." %
                                               event['event'])

        for event in mon_l_r:
            link_or_route = ('_link' in event['event']
                             or '_route' in event['event'])
            assert link_or_route, ("Caught event '%s' is not related "
                                   "to link or route." % event['event'])
예제 #15
0
파일: networkTests.py 프로젝트: bellle/vdsm
def nonChangingOperstate(device):
    """Raises an exception if it detects that the device link state changes."""
    originalState = operstate(device).lower()
    try:
        with monitor.object_monitor(groups=('link',)) as mon:
            yield
    finally:
        changes = [(event['name'], event['state']) for event in mon
                   if event['name'] == device]
        for _, state in changes:
            if state != originalState:
                raise OperStateChangedError('%s operstate changed: %s -> %r' %
                                            (device, originalState, changes))
예제 #16
0
    def test_iteration(self):
        with monitor.object_monitor(timeout=self.TIMEOUT) as mon:
            iterator = iter(mon)

            # Generate events to avoid blocking
            dummy = Dummy()
            dummy.create()
            next(iterator)

            dummy.remove()
            next(iterator)

        with pytest.raises(StopIteration):
            while True:
                next(iterator)
예제 #17
0
def monitor_stable_link_state(device, wait_for_linkup=True):
    """Raises an exception if it detects that the device link state changes."""
    if wait_for_linkup:
        with waitfor.waitfor_linkup(device):
            pass
    iface_properties = iface(device).properties()
    original_state = iface_properties['state']
    try:
        with monitor.object_monitor(groups=('link', )) as mon:
            yield
    finally:
        state_changes = (e['state'] for e in mon if e['name'] == device)
        for state in state_changes:
            if state != original_state:
                raise UnexpectedLinkStateChangeError(
                    '{} link state changed: {} -> {}'.format(
                        device, original_state, state))
예제 #18
0
    def test_iterate_while_events(self):
        """Tests if monitor is able to catch event while iterating. Before the
        iteration we start _set_and_remove_device, which is delayed for .2
        seconds. Then iteration starts and wait for new dummy.
        """
        dummy = Dummy()
        dummy_name = dummy.create()

        def _set_and_remove_device():
            time.sleep(0.2)
            dummy.up()
            dummy.remove()

        with monitor.object_monitor(timeout=self.TIMEOUT) as mon:
            add_device_thread = _start_thread(_set_and_remove_device)
            for event in mon:
                if event.get('name') == dummy_name:
                    break
            add_device_thread.join()
예제 #19
0
 def test_passing_invalid_groups(self):
     with pytest.raises(AttributeError):
         monitor.object_monitor(groups=('blablabla', ))
     monitor.object_monitor(groups=('link', ))
예제 #20
0
    def test_timeout_silent(self):
        with monitor.object_monitor(timeout=0.01, silent_timeout=True) as mon:
            for event in mon:
                pass

        assert mon.is_stopped()
예제 #21
0
    def test_events_keys(self):
        def _simplify_event(event):
            """ Strips event keys except event, address, name, destination,
            family.
            """
            allow = set(['event', 'address', 'name', 'destination', 'family'])
            return {k: v for (k, v) in event.items() if k in allow}

        def _expected_events(nic, address, cidr):
            events_add = [
                {
                    'event': 'new_link',
                    'name': nic
                },
                {
                    'event': 'new_addr',
                    'address': address + '/' + cidr
                },
                {
                    'event': 'new_link',
                    'name': nic
                },
            ]
            events_del = [
                {
                    'address': address + '/' + cidr,
                    'event': 'del_addr'
                },
                {
                    'destination': address,
                    'event': 'del_route'
                },
                {
                    'event': 'del_link',
                    'name': nic
                },
            ]
            events_ipv6 = [
                {
                    'event': 'new_addr',
                    'family': 'inet6'
                },
                {
                    'event': 'del_addr',
                    'family': 'inet6'
                },
            ]
            if is_disabled_ipv6():
                return deque(events_add + events_del)
            else:
                return deque(events_add + events_ipv6 + events_del)

        with monitor.object_monitor(timeout=self.TIMEOUT,
                                    silent_timeout=True) as mon:
            dummy = Dummy()
            dummy_name = dummy.create()
            dummy.set_ip(IP_ADDRESS, IP_CIDR)
            dummy.up()
            dummy.remove()

            expected_events = _expected_events(dummy_name, IP_ADDRESS, IP_CIDR)
            _expected = list(expected_events)
            _caught = []

            expected = expected_events.popleft()
            for event in mon:
                _caught.append(event)
                if _is_subdict(expected, event):
                    expected = expected_events.popleft()
                    if len(expected_events) == 0:
                        break

        assert 0 == len(expected_events), (
            'Expected events have not '
            'been caught (in the right order).\n'
            'Expected:\n%s.\nCaught:\n%s.' % (
                '\n'.join([str(d) for d in _expected]),
                '\n'.join([str(_simplify_event(d)) for d in _caught]),
            ), )
예제 #22
0
 def __init__(self):
     self._handlers = []
     self._nl_monitor = monitor.object_monitor(groups=('ipv4-ifaddr',
                                                       'ipv6-ifaddr'))
     self._thread = concurrent.thread(self.serve_forever,
                                      name='dhcp-monitor')