@ -20,6 +20,7 @@ from neutron_lib.callbacks import registry
from neutron_lib . callbacks import resources
from neutron_lib import constants
from neutron_lib import context
from neutron_lib . objects import exceptions as obj_exc
import sqlalchemy
import testtools
@ -554,3 +555,49 @@ class SecurityGroupDbMixinTestCase(testlib_api.SqlTestCase):
for rule in ( rule for rule in rules_after if rule not in rules_before ) :
self . assertEqual ( ' tenant_1 ' , rule [ ' tenant_id ' ] )
self . assertEqual ( self . sg_user [ ' id ' ] , rule [ ' security_group_id ' ] )
def test__ensure_default_security_group ( self ) :
with mock . patch . object (
self . mixin , ' _get_default_sg_id ' ) as get_default_sg_id , \
mock . patch . object (
self . mixin , ' create_security_group ' ) as create_sg :
get_default_sg_id . return_value = None
self . mixin . _ensure_default_security_group ( self . ctx , ' tenant_1 ' )
create_sg . assert_called_once_with (
self . ctx ,
{ ' security_group ' : {
' name ' : ' default ' ,
' tenant_id ' : ' tenant_1 ' ,
' description ' : securitygroups_db . DEFAULT_SG_DESCRIPTION } } ,
default_sg = True )
get_default_sg_id . assert_called_once_with ( self . ctx , ' tenant_1 ' )
def test__ensure_default_security_group_already_exists ( self ) :
with mock . patch . object (
self . mixin , ' _get_default_sg_id ' ) as get_default_sg_id , \
mock . patch . object (
self . mixin , ' create_security_group ' ) as create_sg :
get_default_sg_id . return_value = ' default_sg_id '
self . mixin . _ensure_default_security_group ( self . ctx , ' tenant_1 ' )
create_sg . assert_not_called ( )
get_default_sg_id . assert_called_once_with ( self . ctx , ' tenant_1 ' )
def test__ensure_default_security_group_created_in_parallel ( self ) :
with mock . patch . object (
self . mixin , ' _get_default_sg_id ' ) as get_default_sg_id , \
mock . patch . object (
self . mixin , ' create_security_group ' ) as create_sg :
get_default_sg_id . side_effect = [ None , ' default_sg_id ' ]
create_sg . side_effect = obj_exc . NeutronDbObjectDuplicateEntry (
mock . Mock ( ) , mock . Mock ( ) )
self . mixin . _ensure_default_security_group ( self . ctx , ' tenant_1 ' )
create_sg . assert_called_once_with (
self . ctx ,
{ ' security_group ' : {
' name ' : ' default ' ,
' tenant_id ' : ' tenant_1 ' ,
' description ' : securitygroups_db . DEFAULT_SG_DESCRIPTION } } ,
default_sg = True )
get_default_sg_id . assert_has_calls ( [
mock . call ( self . ctx , ' tenant_1 ' ) ,
mock . call ( self . ctx , ' tenant_1 ' ) ] )