@ -1991,66 +1991,70 @@ class TestDeviceManager(TestConfBase):
self . mock_load_interface_driver = load_interface_driver_patcher . start ( )
def _test_setup ( self , load_interface_driver , ip_lib , use_gateway_ips ) :
# Create DeviceManager.
self . conf . register_opt ( cfg . BoolOpt ( ' enable_isolated_metadata ' ,
default = False ) )
plugin = mock . Mock ( )
mgr = dhcp . DeviceManager ( self . conf , plugin )
load_interface_driver . assert_called_with ( self . conf )
# Setup with no existing DHCP port - expect a new DHCP port to
# be created.
network = FakeDeviceManagerNetwork ( )
network . tenant_id = ' Tenant A '
def mock_create ( dict ) :
port = dhcp . DictModel ( dict [ ' port ' ] )
port . id = ' abcd-123456789 '
port . mac_address = ' 00-12-34-56-78-90 '
port . fixed_ips = [
dhcp . DictModel ( { ' subnet_id ' : ip [ ' subnet_id ' ] ,
' ip_address ' : ' unique-IP-address ' } )
for ip in port . fixed_ips
]
return port
plugin . create_dhcp_port . side_effect = mock_create
mgr . driver . get_device_name . return_value = ' ns-XXX '
mgr . driver . use_gateway_ips = use_gateway_ips
ip_lib . ensure_device_is_ready . return_value = True
mgr . setup ( network )
plugin . create_dhcp_port . assert_called_with ( mock . ANY )
mgr . driver . init_l3 . assert_called_with ( ' ns-XXX ' ,
mock . ANY ,
namespace = ' qdhcp-ns ' )
cidrs = set ( mgr . driver . init_l3 . call_args [ 0 ] [ 1 ] )
if use_gateway_ips :
self . assertEqual ( cidrs , set ( [ ' %s / %s ' % ( s . gateway_ip ,
s . cidr . split ( ' / ' ) [ 1 ] )
for s in network . subnets ] ) )
else :
self . assertEqual ( cidrs , set ( [ ' unique-IP-address/24 ' ,
with mock . patch . object ( dhcp . ip_lib , ' IPDevice ' ) as mock_IPDevice :
# Create DeviceManager.
self . conf . register_opt ( cfg . BoolOpt ( ' enable_isolated_metadata ' ,
default = False ) )
plugin = mock . Mock ( )
device = mock . Mock ( )
mock_IPDevice . return_value = device
device . route . get_gateway . return_value = None
mgr = dhcp . DeviceManager ( self . conf , plugin )
load_interface_driver . assert_called_with ( self . conf )
# Setup with no existing DHCP port - expect a new DHCP port to
# be created.
network = FakeDeviceManagerNetwork ( )
network . tenant_id = ' Tenant A '
def mock_create ( dict ) :
port = dhcp . DictModel ( dict [ ' port ' ] )
port . id = ' abcd-123456789 '
port . mac_address = ' 00-12-34-56-78-90 '
port . fixed_ips = [
dhcp . DictModel ( { ' subnet_id ' : ip [ ' subnet_id ' ] ,
' ip_address ' : ' unique-IP-address ' } )
for ip in port . fixed_ips
]
return port
plugin . create_dhcp_port . side_effect = mock_create
mgr . driver . get_device_name . return_value = ' ns-XXX '
mgr . driver . use_gateway_ips = use_gateway_ips
ip_lib . ensure_device_is_ready . return_value = True
mgr . setup ( network )
plugin . create_dhcp_port . assert_called_with ( mock . ANY )
mgr . driver . init_l3 . assert_called_with ( ' ns-XXX ' ,
mock . ANY ,
namespace = ' qdhcp-ns ' )
cidrs = set ( mgr . driver . init_l3 . call_args [ 0 ] [ 1 ] )
if use_gateway_ips :
self . assertEqual ( cidrs , set ( [ ' %s / %s ' % ( s . gateway_ip ,
s . cidr . split ( ' / ' ) [ 1 ] )
for s in network . subnets ] ) )
else :
self . assertEqual ( cidrs , set ( [ ' unique-IP-address/24 ' ,
' unique-IP-address/64 ' ] ) )
# Now call setup again. This time we go through the existing
# port code path, and the driver's init_l3 method is called
# again.
plugin . create_dhcp_port . reset_mock ( )
mgr . driver . init_l3 . reset_mock ( )
mgr . setup ( network )
mgr . driver . init_l3 . assert_called_with ( ' ns-XXX ' ,
mock . ANY ,
namespace = ' qdhcp-ns ' )
cidrs = set ( mgr . driver . init_l3 . call_args [ 0 ] [ 1 ] )
if use_gateway_ips :
self . assertEqual ( cidrs , set ( [ ' %s / %s ' % ( s . gateway_ip ,
s . cidr . split ( ' / ' ) [ 1 ] )
for s in network . subnets ] ) )
else :
self . assertEqual ( cidrs , set ( [ ' unique-IP-address/24 ' ,
' unique-IP-address/64 ' ] ) )
self . assertFalse ( plugin . create_dhcp_port . called )
# Now call setup again. This time we go through the existing
# port code path, and the driver's init_l3 method is called
# again.
plugin . create_dhcp_port . reset_mock ( )
mgr . driver . init_l3 . reset_mock ( )
mgr . setup ( network )
mgr . driver . init_l3 . assert_called_with ( ' ns-XXX ' ,
mock . ANY ,
namespace = ' qdhcp-ns ' )
cidrs = set ( mgr . driver . init_l3 . call_args [ 0 ] [ 1 ] )
if use_gateway_ips :
self . assertEqual ( cidrs , set ( [ ' %s / %s ' % ( s . gateway_ip ,
s . cidr . split ( ' / ' ) [ 1 ] )
for s in network . subnets ] ) )
else :
self . assertEqual ( cidrs , set ( [ ' unique-IP-address/24 ' ,
' unique-IP-address/64 ' ] ) )
self . assertFalse ( plugin . create_dhcp_port . called )
def test_setup_device_manager_dhcp_port_without_gateway_ips ( self ) :
self . _test_setup ( self . mock_load_interface_driver ,
@ -2065,73 +2069,82 @@ class TestDeviceManager(TestConfBase):
logic .
"""
# Create DeviceManager.
self . conf . register_opt ( cfg . BoolOpt ( ' enable_isolated_metadata ' ,
default = False ) )
plugin = mock . Mock ( )
mgr = dhcp . DeviceManager ( self . conf , plugin )
self . mock_load_interface_driver . assert_called_with ( self . conf )
# Setup with a reserved DHCP port.
network = FakeDualNetworkReserved ( )
network . tenant_id = ' Tenant A '
reserved_port = network . ports [ - 1 ]
def mock_update ( port_id , dict ) :
port = reserved_port
port . network_id = dict [ ' port ' ] [ ' network_id ' ]
port . device_id = dict [ ' port ' ] [ ' device_id ' ]
return port
plugin . update_dhcp_port . side_effect = mock_update
mgr . driver . get_device_name . return_value = ' ns-XXX '
mgr . driver . use_gateway_ips = False
self . mock_ip_lib . ensure_device_is_ready . return_value = True
mgr . setup ( network )
plugin . update_dhcp_port . assert_called_with ( reserved_port . id , mock . ANY )
mgr . driver . init_l3 . assert_called_with ( ' ns-XXX ' ,
[ ' 192.168.0.6/24 ' ] ,
namespace = ' qdhcp-ns ' )
with mock . patch . object ( dhcp . ip_lib , ' IPDevice ' ) as mock_IPDevice :
# Create DeviceManager.
self . conf . register_opt ( cfg . BoolOpt ( ' enable_isolated_metadata ' ,
default = False ) )
plugin = mock . Mock ( )
device = mock . Mock ( )
mock_IPDevice . return_value = device
device . route . get_gateway . return_value = None
mgr = dhcp . DeviceManager ( self . conf , plugin )
self . mock_load_interface_driver . assert_called_with ( self . conf )
# Setup with a reserved DHCP port.
network = FakeDualNetworkReserved ( )
network . tenant_id = ' Tenant A '
reserved_port = network . ports [ - 1 ]
def mock_update ( port_id , dict ) :
port = reserved_port
port . network_id = dict [ ' port ' ] [ ' network_id ' ]
port . device_id = dict [ ' port ' ] [ ' device_id ' ]
return port
plugin . update_dhcp_port . side_effect = mock_update
mgr . driver . get_device_name . return_value = ' ns-XXX '
mgr . driver . use_gateway_ips = False
self . mock_ip_lib . ensure_device_is_ready . return_value = True
mgr . setup ( network )
plugin . update_dhcp_port . assert_called_with ( reserved_port . id ,
mock . ANY )
mgr . driver . init_l3 . assert_called_with ( ' ns-XXX ' ,
[ ' 192.168.0.6/24 ' ] ,
namespace = ' qdhcp-ns ' )
def test_setup_reserved_2 ( self ) :
""" Test scenario where a network has two reserved ports, and
update_dhcp_port fails for the first of those .
"""
# Create DeviceManager.
self . conf . register_opt ( cfg . BoolOpt ( ' enable_isolated_metadata ' ,
default = False ) )
plugin = mock . Mock ( )
mgr = dhcp . DeviceManager ( self . conf , plugin )
self . mock_load_interface_driver . assert_called_with ( self . conf )
# Setup with a reserved DHCP port.
network = FakeDualNetworkReserved2 ( )
network . tenant_id = ' Tenant A '
reserved_port_1 = network . ports [ - 2 ]
reserved_port_2 = network . ports [ - 1 ]
def mock_update ( port_id , dict ) :
if port_id == reserved_port_1 . id :
return None
port = reserved_port_2
port . network_id = dict [ ' port ' ] [ ' network_id ' ]
port . device_id = dict [ ' port ' ] [ ' device_id ' ]
return port
plugin . update_dhcp_port . side_effect = mock_update
mgr . driver . get_device_name . return_value = ' ns-XXX '
mgr . driver . use_gateway_ips = False
self . mock_ip_lib . ensure_device_is_ready . return_value = True
mgr . setup ( network )
plugin . update_dhcp_port . assert_called_with ( reserved_port_2 . id ,
mock . ANY )
mgr . driver . init_l3 . assert_called_with ( ' ns-XXX ' ,
[ ' 192.168.0.6/24 ' ] ,
namespace = ' qdhcp-ns ' )
with mock . patch . object ( dhcp . ip_lib , ' IPDevice ' ) as mock_IPDevice :
# Create DeviceManager.
self . conf . register_opt ( cfg . BoolOpt ( ' enable_isolated_metadata ' ,
default = False ) )
plugin = mock . Mock ( )
device = mock . Mock ( )
mock_IPDevice . return_value = device
device . route . get_gateway . return_value = None
mgr = dhcp . DeviceManager ( self . conf , plugin )
self . mock_load_interface_driver . assert_called_with ( self . conf )
# Setup with a reserved DHCP port.
network = FakeDualNetworkReserved2 ( )
network . tenant_id = ' Tenant A '
reserved_port_1 = network . ports [ - 2 ]
reserved_port_2 = network . ports [ - 1 ]
def mock_update ( port_id , dict ) :
if port_id == reserved_port_1 . id :
return None
port = reserved_port_2
port . network_id = dict [ ' port ' ] [ ' network_id ' ]
port . device_id = dict [ ' port ' ] [ ' device_id ' ]
return port
plugin . update_dhcp_port . side_effect = mock_update
mgr . driver . get_device_name . return_value = ' ns-XXX '
mgr . driver . use_gateway_ips = False
self . mock_ip_lib . ensure_device_is_ready . return_value = True
mgr . setup ( network )
plugin . update_dhcp_port . assert_called_with ( reserved_port_2 . id ,
mock . ANY )
mgr . driver . init_l3 . assert_called_with ( ' ns-XXX ' ,
[ ' 192.168.0.6/24 ' ] ,
namespace = ' qdhcp-ns ' )
class TestDictModel ( base . BaseTestCase ) :