class SubProcessBase(object):
- def __init__(self, root_helper=None, namespace=None):
+ def __init__(self, root_helper=None, namespace=None,
+ log_fail_as_error=True):
self.root_helper = root_helper
self.namespace = namespace
+ self.log_fail_as_error = log_fail_as_error
try:
self.force_root = cfg.CONF.ip_lib_force_root
except cfg.NoSuchOptError:
elif self.force_root:
# Force use of the root helper to ensure that commands
# will execute in dom0 when running under XenServer/XCP.
- return self._execute(options, command, args, self.root_helper)
+ return self._execute(options, command, args, self.root_helper,
+ log_fail_as_error=self.log_fail_as_error)
else:
- return self._execute(options, command, args)
+ return self._execute(options, command, args,
+ log_fail_as_error=self.log_fail_as_error)
def _as_root(self, options, command, args, use_root_namespace=False):
if not self.root_helper:
command,
args,
self.root_helper,
- namespace)
+ namespace,
+ log_fail_as_error=self.log_fail_as_error)
@classmethod
def _execute(cls, options, command, args, root_helper=None,
- namespace=None):
+ namespace=None, log_fail_as_error=True):
opt_list = ['-%s' % o for o in options]
if namespace:
ip_cmd = ['ip', 'netns', 'exec', namespace, 'ip']
else:
ip_cmd = ['ip']
return utils.execute(ip_cmd + opt_list + [command] + list(args),
- root_helper=root_helper)
+ root_helper=root_helper,
+ log_fail_as_error=log_fail_as_error)
+
+ def set_log_fail_as_error(self, fail_with_error):
+ self.log_fail_as_error = fail_with_error
class IPWrapper(SubProcessBase):
def device_exists(device_name, root_helper=None, namespace=None):
try:
- address = IPDevice(device_name, root_helper, namespace).link.address
+ dev = IPDevice(device_name, root_helper, namespace)
+ dev.set_log_fail_as_error(False)
+ address = dev.link.address
except RuntimeError:
return False
return bool(address)
def ensure_device_is_ready(device_name, root_helper=None, namespace=None):
dev = IPDevice(device_name, root_helper, namespace)
+ dev.set_log_fail_as_error(False)
try:
# Ensure the device is up, even if it is already up. If the device
# doesn't exist, a RuntimeError will be raised.
ip_lib.SubProcessBase._execute('o', 'link', ('list',), 'sudo')
self.execute.assert_called_once_with(['ip', '-o', 'link', 'list'],
- root_helper='sudo')
+ root_helper='sudo',
+ log_fail_as_error=True)
def test_execute_wrapper_int_options(self):
ip_lib.SubProcessBase._execute([4], 'link', ('list',))
self.execute.assert_called_once_with(['ip', '-4', 'link', 'list'],
- root_helper=None)
+ root_helper=None,
+ log_fail_as_error=True)
def test_execute_wrapper_no_options(self):
ip_lib.SubProcessBase._execute([], 'link', ('list',))
self.execute.assert_called_once_with(['ip', 'link', 'list'],
- root_helper=None)
+ root_helper=None,
+ log_fail_as_error=True)
def test_run_no_namespace(self):
base = ip_lib.SubProcessBase('sudo')
base._run([], 'link', ('list',))
self.execute.assert_called_once_with(['ip', 'link', 'list'],
- root_helper=None)
+ root_helper=None,
+ log_fail_as_error=True)
def test_run_namespace(self):
base = ip_lib.SubProcessBase('sudo', 'ns')
base._run([], 'link', ('list',))
self.execute.assert_called_once_with(['ip', 'netns', 'exec', 'ns',
'ip', 'link', 'list'],
- root_helper='sudo')
+ root_helper='sudo',
+ log_fail_as_error=True)
def test_as_root_namespace(self):
base = ip_lib.SubProcessBase('sudo', 'ns')
base._as_root([], 'link', ('list',))
self.execute.assert_called_once_with(['ip', 'netns', 'exec', 'ns',
'ip', 'link', 'list'],
- root_helper='sudo')
+ root_helper='sudo',
+ log_fail_as_error=True)
def test_as_root_no_root_helper(self):
base = ip_lib.SubProcessBase()
ip_lib.IPWrapper('sudo').add_tuntap('tap0')
self.execute.assert_called_once_with('', 'tuntap',
('add', 'tap0', 'mode', 'tap'),
- 'sudo', None)
+ 'sudo', None,
+ log_fail_as_error=True)
def test_add_veth(self):
ip_lib.IPWrapper('sudo').add_veth('tap0', 'tap1')
self.execute.assert_called_once_with('', 'link',
('add', 'tap0', 'type', 'veth',
'peer', 'name', 'tap1'),
- 'sudo', None)
+ 'sudo', None,
+ log_fail_as_error=True)
def test_del_veth(self):
ip_lib.IPWrapper('sudo').del_veth('fpr-1234')
self.execute.assert_called_once_with('', 'link',
('del', 'fpr-1234'),
- 'sudo', None)
+ 'sudo', None,
+ log_fail_as_error=True)
def test_add_veth_with_namespaces(self):
ns2 = 'ns2'
('add', 'tap0', 'type', 'veth',
'peer', 'name', 'tap1',
'netns', ns2),
- 'sudo', None)
+ 'sudo', None,
+ log_fail_as_error=True)
def test_get_device(self):
dev = ip_lib.IPWrapper('sudo', 'ns').device('eth0')
ns_exists.return_value = False
ip.ensure_namespace('ns')
self.execute.assert_has_calls(
- [mock.call([], 'netns', ('add', 'ns'), 'sudo', None)])
+ [mock.call([], 'netns', ('add', 'ns'), 'sudo', None,
+ log_fail_as_error=True)])
ip_dev.assert_has_calls([mock.call('lo', 'sudo', 'ns'),
mock.call().link.set_up()])
'ttl', 'ttl0', 'tos', 'tos0',
'local', 'local0', 'proxy',
'port', '1', '2'],
- 'sudo', None)
+ 'sudo', None,
+ log_fail_as_error=True)
def test_add_vxlan_invalid_port_length(self):
wrapper = ip_lib.IPWrapper('sudo')
self.execute.assert_called_once_with('', 'rule',
('add', 'from', '192.168.45.100',
'lookup', 2, 'priority', 100),
- 'sudo', None)
+ 'sudo', None,
+ log_fail_as_error=True)
def test_delete_rule_priority(self):
ip_lib.IpRule('sudo').delete_rule_priority(100)
self.execute.assert_called_once_with('', 'rule',
('del', 'priority', 100),
- 'sudo', None)
+ 'sudo', None,
+ log_fail_as_error=True)
class TestIPDevice(base.BaseTestCase):
self.assertTrue(
netns_cmd.exists('bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb'))
execute.assert_called_once_with(['ip', '-o', 'netns', 'list'],
- root_helper=None)
+ root_helper=None,
+ log_fail_as_error=True)
def test_namespace_doest_not_exist(self):
retval = '\n'.join(NETNS_SAMPLE)
self.assertFalse(
netns_cmd.exists('bbbbbbbb-1111-2222-3333-bbbbbbbbbbbb'))
execute.assert_called_once_with(['ip', '-o', 'netns', 'list'],
- root_helper=None)
+ root_helper=None,
+ log_fail_as_error=True)
def test_execute(self):
self.parent.namespace = 'ns'
with mock.patch.object(ip_lib.IPDevice, '_execute') as _execute:
_execute.return_value = LINK_SAMPLE[1]
self.assertTrue(ip_lib.device_exists('eth0'))
- _execute.assert_called_once_with('o', 'link', ('show', 'eth0'))
+ _execute.assert_called_once_with('o', 'link', ('show', 'eth0'),
+ log_fail_as_error=False)
def test_device_does_not_exist(self):
with mock.patch.object(ip_lib.IPDevice, '_execute') as _execute: