@ -22,7 +22,6 @@ import eventlet
import mock
import netaddr
from neutron_lib import constants
from neutron_lib import exceptions as exc
from oslo_log import log as logging
import six
import testscenarios
@ -30,7 +29,6 @@ import testtools
from neutron . common import constants as common_constants
from neutron . common import utils
from neutron . plugins . common import utils as plugin_utils
from neutron . tests import base
from neutron . tests . unit import tests
@ -94,306 +92,6 @@ def _port_rule_masking(port_min, port_max):
return current . get_list ( )
class TestParseTunnelRangesMixin ( object ) :
TUN_MIN = None
TUN_MAX = None
TYPE = None
_err_prefix = " Invalid network tunnel range: ' %d : %d ' - "
_err_suffix = " %s is not a valid %s identifier. "
_err_range = " End of tunnel range is less than start of tunnel range. "
def _build_invalid_tunnel_range_msg ( self , t_range_tuple , n ) :
bad_id = t_range_tuple [ n - 1 ]
return ( self . _err_prefix % t_range_tuple ) + ( self . _err_suffix
% ( bad_id , self . TYPE ) )
def _build_range_reversed_msg ( self , t_range_tuple ) :
return ( self . _err_prefix % t_range_tuple ) + self . _err_range
def _verify_range ( self , tunnel_range ) :
return plugin_utils . verify_tunnel_range ( tunnel_range , self . TYPE )
def _check_range_valid_ranges ( self , tunnel_range ) :
self . assertIsNone ( self . _verify_range ( tunnel_range ) )
def _check_range_invalid_ranges ( self , bad_range , which ) :
expected_msg = self . _build_invalid_tunnel_range_msg ( bad_range , which )
err = self . assertRaises ( exc . NetworkTunnelRangeError ,
self . _verify_range , bad_range )
self . assertEqual ( expected_msg , str ( err ) )
def _check_range_reversed ( self , bad_range ) :
err = self . assertRaises ( exc . NetworkTunnelRangeError ,
self . _verify_range , bad_range )
expected_msg = self . _build_range_reversed_msg ( bad_range )
self . assertEqual ( expected_msg , str ( err ) )
def test_range_tunnel_id_valid ( self ) :
self . _check_range_valid_ranges ( ( self . TUN_MIN , self . TUN_MAX ) )
def test_range_tunnel_id_invalid ( self ) :
self . _check_range_invalid_ranges ( ( - 1 , self . TUN_MAX ) , 1 )
self . _check_range_invalid_ranges ( ( self . TUN_MIN ,
self . TUN_MAX + 1 ) , 2 )
self . _check_range_invalid_ranges ( ( self . TUN_MIN - 1 ,
self . TUN_MAX + 1 ) , 1 )
def test_range_tunnel_id_reversed ( self ) :
self . _check_range_reversed ( ( self . TUN_MAX , self . TUN_MIN ) )
class TestGreTunnelRangeVerifyValid ( TestParseTunnelRangesMixin ,
base . BaseTestCase ) :
TUN_MIN = constants . MIN_GRE_ID
TUN_MAX = constants . MAX_GRE_ID
TYPE = constants . TYPE_GRE
class TestVxlanTunnelRangeVerifyValid ( TestParseTunnelRangesMixin ,
base . BaseTestCase ) :
TUN_MIN = constants . MIN_VXLAN_VNI
TUN_MAX = constants . MAX_VXLAN_VNI
TYPE = constants . TYPE_VXLAN
class UtilTestParseVlanRanges ( base . BaseTestCase ) :
_err_prefix = " Invalid network VLAN range: ' "
_err_bad_count = " ' - ' Need exactly two values for VLAN range ' . "
_err_bad_vlan = " ' - ' %s is not a valid VLAN tag ' . "
_err_range = " ' - ' End of VLAN range is less than start of VLAN range ' . "
def _range_err_bad_count ( self , nv_range ) :
return self . _err_prefix + nv_range + self . _err_bad_count
def _range_invalid_vlan ( self , nv_range , n ) :
vlan = nv_range . split ( ' : ' ) [ n ]
return self . _err_prefix + nv_range + ( self . _err_bad_vlan % vlan )
def _nrange_invalid_vlan ( self , nv_range , n ) :
vlan = nv_range . split ( ' : ' ) [ n ]
v_range = ' : ' . join ( nv_range . split ( ' : ' ) [ 1 : ] )
return self . _err_prefix + v_range + ( self . _err_bad_vlan % vlan )
def _vrange_invalid_vlan ( self , v_range_tuple , n ) :
vlan = v_range_tuple [ n - 1 ]
v_range_str = ' %d : %d ' % v_range_tuple
return self . _err_prefix + v_range_str + ( self . _err_bad_vlan % vlan )
def _vrange_invalid ( self , v_range_tuple ) :
v_range_str = ' %d : %d ' % v_range_tuple
return self . _err_prefix + v_range_str + self . _err_range
class TestVlanNetworkNameValid ( base . BaseTestCase ) :
def parse_vlan_ranges ( self , vlan_range ) :
return plugin_utils . parse_network_vlan_ranges ( vlan_range )
def test_validate_provider_phynet_name_mixed ( self ) :
self . assertRaises ( exc . PhysicalNetworkNameError ,
self . parse_vlan_ranges ,
[ ' ' , ' :23:30 ' , ' physnet1 ' ,
' tenant_net:100:200 ' ] )
def test_validate_provider_phynet_name_bad ( self ) :
self . assertRaises ( exc . PhysicalNetworkNameError ,
self . parse_vlan_ranges ,
[ ' :1:34 ' ] )
class TestVlanRangeVerifyValid ( UtilTestParseVlanRanges ) :
def verify_range ( self , vlan_range ) :
return plugin_utils . verify_vlan_range ( vlan_range )
def test_range_valid_ranges ( self ) :
self . assertIsNone ( self . verify_range ( ( 1 , 2 ) ) )
self . assertIsNone ( self . verify_range ( ( 1 , 1999 ) ) )
self . assertIsNone ( self . verify_range ( ( 100 , 100 ) ) )
self . assertIsNone ( self . verify_range ( ( 100 , 200 ) ) )
self . assertIsNone ( self . verify_range ( ( 4001 , 4094 ) ) )
self . assertIsNone ( self . verify_range ( ( 1 , 4094 ) ) )
def check_one_vlan_invalid ( self , bad_range , which ) :
expected_msg = self . _vrange_invalid_vlan ( bad_range , which )
err = self . assertRaises ( exc . NetworkVlanRangeError ,
self . verify_range , bad_range )
self . assertEqual ( str ( err ) , expected_msg )
def test_range_first_vlan_invalid_negative ( self ) :
self . check_one_vlan_invalid ( ( - 1 , 199 ) , 1 )
def test_range_first_vlan_invalid_zero ( self ) :
self . check_one_vlan_invalid ( ( 0 , 199 ) , 1 )
def test_range_first_vlan_invalid_limit_plus_one ( self ) :
self . check_one_vlan_invalid ( ( 4095 , 199 ) , 1 )
def test_range_first_vlan_invalid_too_big ( self ) :
self . check_one_vlan_invalid ( ( 9999 , 199 ) , 1 )
def test_range_second_vlan_invalid_negative ( self ) :
self . check_one_vlan_invalid ( ( 299 , - 1 ) , 2 )
def test_range_second_vlan_invalid_zero ( self ) :
self . check_one_vlan_invalid ( ( 299 , 0 ) , 2 )
def test_range_second_vlan_invalid_limit_plus_one ( self ) :
self . check_one_vlan_invalid ( ( 299 , 4095 ) , 2 )
def test_range_second_vlan_invalid_too_big ( self ) :
self . check_one_vlan_invalid ( ( 299 , 9999 ) , 2 )
def test_range_both_vlans_invalid_01 ( self ) :
self . check_one_vlan_invalid ( ( - 1 , 0 ) , 1 )
def test_range_both_vlans_invalid_02 ( self ) :
self . check_one_vlan_invalid ( ( 0 , 4095 ) , 1 )
def test_range_both_vlans_invalid_03 ( self ) :
self . check_one_vlan_invalid ( ( 4095 , 9999 ) , 1 )
def test_range_both_vlans_invalid_04 ( self ) :
self . check_one_vlan_invalid ( ( 9999 , - 1 ) , 1 )
def test_range_reversed ( self ) :
bad_range = ( 95 , 10 )
expected_msg = self . _vrange_invalid ( bad_range )
err = self . assertRaises ( exc . NetworkVlanRangeError ,
self . verify_range , bad_range )
self . assertEqual ( str ( err ) , expected_msg )
class TestParseOneVlanRange ( UtilTestParseVlanRanges ) :
def parse_one ( self , cfg_entry ) :
return plugin_utils . parse_network_vlan_range ( cfg_entry )
def test_parse_one_net_no_vlan_range ( self ) :
config_str = " net1 "
expected_networks = ( " net1 " , None )
self . assertEqual ( expected_networks , self . parse_one ( config_str ) )
def test_parse_one_net_and_vlan_range ( self ) :
config_str = " net1:100:199 "
expected_networks = ( " net1 " , ( 100 , 199 ) )
self . assertEqual ( expected_networks , self . parse_one ( config_str ) )
def test_parse_one_net_incomplete_range ( self ) :
config_str = " net1:100 "
expected_msg = self . _range_err_bad_count ( config_str )
err = self . assertRaises ( exc . NetworkVlanRangeError ,
self . parse_one , config_str )
self . assertEqual ( expected_msg , str ( err ) )
def test_parse_one_net_range_too_many ( self ) :
config_str = " net1:100:150:200 "
expected_msg = self . _range_err_bad_count ( config_str )
err = self . assertRaises ( exc . NetworkVlanRangeError ,
self . parse_one , config_str )
self . assertEqual ( expected_msg , str ( err ) )
def test_parse_one_net_vlan1_not_int ( self ) :
config_str = " net1:foo:199 "
expected_msg = self . _range_invalid_vlan ( config_str , 1 )
err = self . assertRaises ( exc . NetworkVlanRangeError ,
self . parse_one , config_str )
self . assertEqual ( expected_msg , str ( err ) )
def test_parse_one_net_vlan2_not_int ( self ) :
config_str = " net1:100:bar "
expected_msg = self . _range_invalid_vlan ( config_str , 2 )
err = self . assertRaises ( exc . NetworkVlanRangeError ,
self . parse_one , config_str )
self . assertEqual ( expected_msg , str ( err ) )
def test_parse_one_net_and_max_range ( self ) :
config_str = " net1:1:4094 "
expected_networks = ( " net1 " , ( 1 , 4094 ) )
self . assertEqual ( expected_networks , self . parse_one ( config_str ) )
def test_parse_one_net_range_bad_vlan1 ( self ) :
config_str = " net1:9000:150 "
expected_msg = self . _nrange_invalid_vlan ( config_str , 1 )
err = self . assertRaises ( exc . NetworkVlanRangeError ,
self . parse_one , config_str )
self . assertEqual ( expected_msg , str ( err ) )
def test_parse_one_net_range_bad_vlan2 ( self ) :
config_str = " net1:4000:4999 "
expected_msg = self . _nrange_invalid_vlan ( config_str , 2 )
err = self . assertRaises ( exc . NetworkVlanRangeError ,
self . parse_one , config_str )
self . assertEqual ( expected_msg , str ( err ) )
class TestParseVlanRangeList ( UtilTestParseVlanRanges ) :
def parse_list ( self , cfg_entries ) :
return plugin_utils . parse_network_vlan_ranges ( cfg_entries )
def test_parse_list_one_net_no_vlan_range ( self ) :
config_list = [ " net1 " ]
expected_networks = { " net1 " : [ ] }
self . assertEqual ( expected_networks , self . parse_list ( config_list ) )
def test_parse_list_one_net_vlan_range ( self ) :
config_list = [ " net1:100:199 " ]
expected_networks = { " net1 " : [ ( 100 , 199 ) ] }
self . assertEqual ( expected_networks , self . parse_list ( config_list ) )
def test_parse_two_nets_no_vlan_range ( self ) :
config_list = [ " net1 " ,
" net2 " ]
expected_networks = { " net1 " : [ ] ,
" net2 " : [ ] }
self . assertEqual ( expected_networks , self . parse_list ( config_list ) )
def test_parse_two_nets_range_and_no_range ( self ) :
config_list = [ " net1:100:199 " ,
" net2 " ]
expected_networks = { " net1 " : [ ( 100 , 199 ) ] ,
" net2 " : [ ] }
self . assertEqual ( expected_networks , self . parse_list ( config_list ) )
def test_parse_two_nets_no_range_and_range ( self ) :
config_list = [ " net1 " ,
" net2:200:299 " ]
expected_networks = { " net1 " : [ ] ,
" net2 " : [ ( 200 , 299 ) ] }
self . assertEqual ( expected_networks , self . parse_list ( config_list ) )
def test_parse_two_nets_bad_vlan_range1 ( self ) :
config_list = [ " net1:100 " ,
" net2:200:299 " ]
expected_msg = self . _range_err_bad_count ( config_list [ 0 ] )
err = self . assertRaises ( exc . NetworkVlanRangeError ,
self . parse_list , config_list )
self . assertEqual ( expected_msg , str ( err ) )
def test_parse_two_nets_vlan_not_int2 ( self ) :
config_list = [ " net1:100:199 " ,
" net2:200:0x200 " ]
expected_msg = self . _range_invalid_vlan ( config_list [ 1 ] , 2 )
err = self . assertRaises ( exc . NetworkVlanRangeError ,
self . parse_list , config_list )
self . assertEqual ( expected_msg , str ( err ) )
def test_parse_two_nets_and_append_1_2 ( self ) :
config_list = [ " net1:100:199 " ,
" net1:1000:1099 " ,
" net2:200:299 " ]
expected_networks = { " net1 " : [ ( 100 , 199 ) ,
( 1000 , 1099 ) ] ,
" net2 " : [ ( 200 , 299 ) ] }
self . assertEqual ( expected_networks , self . parse_list ( config_list ) )
def test_parse_two_nets_and_append_1_3 ( self ) :
config_list = [ " net1:100:199 " ,
" net2:200:299 " ,
" net1:1000:1099 " ]
expected_networks = { " net1 " : [ ( 100 , 199 ) ,
( 1000 , 1099 ) ] ,
" net2 " : [ ( 200 , 299 ) ] }
self . assertEqual ( expected_networks , self . parse_list ( config_list ) )
class TestExceptionLogger ( base . BaseTestCase ) :
def test_normal_call ( self ) :
result = " Result "