@ -15,6 +15,7 @@
import copy
import mock
from oslo_serialization import jsonutils
from oslo_utils import timeutils
from oslo_versionedobjects import exception as ovo_exc
@ -30,6 +31,10 @@ _TS_NOW = timeutils.utcnow(with_timezone=True)
# in process we lose microsecond resolution.
_TS_NOW = _TS_NOW . replace ( microsecond = 0 )
_DB_UUID = uuids . fake
_INST_GROUP_POLICY_DB = {
' policy ' : ' policy1 ' ,
' rules ' : jsonutils . dumps ( { ' max_server_per_host ' : ' 2 ' } ) ,
}
_INST_GROUP_DB = {
' id ' : 1 ,
' uuid ' : _DB_UUID ,
@ -37,11 +42,18 @@ _INST_GROUP_DB = {
' project_id ' : ' fake_project ' ,
' name ' : ' fake_name ' ,
# a group can only have 1 policy associated with it
' policies ' : [ ' policy1 ' ] ,
' policy ' : _INST_GROUP_POLICY_DB ,
' _policies ' : [ _INST_GROUP_POLICY_DB ] ,
' members ' : [ ' instance_id1 ' , ' instance_id2 ' ] ,
' created_at ' : _TS_NOW ,
' updated_at ' : _TS_NOW
' updated_at ' : _TS_NOW ,
}
_INST_GROUP_OBJ_VALS = dict (
{ k : v for k , v in
_INST_GROUP_DB . items ( )
if k not in ( ' policy ' , ' _policies ' ) } ,
policy = _INST_GROUP_POLICY_DB [ ' policy ' ] ,
rules = jsonutils . loads ( _INST_GROUP_POLICY_DB [ ' rules ' ] ) )
class _TestInstanceGroupObject ( object ) :
@ -53,11 +65,21 @@ class _TestInstanceGroupObject(object):
_DB_UUID )
mock_api_get . assert_called_once_with ( self . context , _DB_UUID )
self . assertEqual ( _INST_GROUP_DB [ ' members ' ] , obj . members )
self . assertEqual ( _INST_GROUP_DB [ ' policies ' ] , obj . policies )
self . assertEqual ( [ _INST_GROUP_POLICY_DB [ ' policy ' ] ] , obj . policies )
self . assertEqual ( _DB_UUID , obj . uuid )
self . assertEqual ( _INST_GROUP_DB [ ' project_id ' ] , obj . project_id )
self . assertEqual ( _INST_GROUP_DB [ ' user_id ' ] , obj . user_id )
self . assertEqual ( _INST_GROUP_DB [ ' name ' ] , obj . name )
self . assertEqual ( _INST_GROUP_POLICY_DB [ ' policy ' ] , obj . policy )
self . assertEqual ( { ' max_server_per_host ' : 2 } , obj . rules )
def test_rules_helper ( self ) :
obj = objects . InstanceGroup ( )
self . assertEqual ( { } , obj . rules )
self . assertNotIn ( ' _rules ' , obj )
obj . _rules = { }
self . assertEqual ( { } , obj . rules )
self . assertIn ( ' _rules ' , obj )
@mock.patch ( ' nova.objects.InstanceGroup._get_from_db_by_instance ' ,
return_value = _INST_GROUP_DB )
@ -87,9 +109,10 @@ class _TestInstanceGroupObject(object):
changed_group [ ' name ' ] = ' new_name '
db_group = copy . deepcopy ( _INST_GROUP_DB )
mock_db_get . return_value = db_group
obj = objects . InstanceGroup ( self . context , * * _INST_GROUP_ DB )
obj = objects . InstanceGroup ( self . context , * * _INST_GROUP_ OBJ_VALS )
self . assertEqual ( obj . name , ' fake_name ' )
obj . obj_reset_changes ( )
self . assertEqual ( set ( [ ] ) , obj . obj_what_changed ( ) )
obj . name = ' new_name '
obj . members = [ ' instance_id1 ' ] # Remove member 2
obj . save ( )
@ -105,7 +128,7 @@ class _TestInstanceGroupObject(object):
@mock.patch ( ' nova.objects.InstanceGroup._get_from_db_by_uuid ' )
def test_save_without_hosts ( self , mock_db_get , mock_notify ) :
mock_db_get . return_value = _INST_GROUP_DB
obj = objects . InstanceGroup ( self . context , * * _INST_GROUP_ DB )
obj = objects . InstanceGroup ( self . context , * * _INST_GROUP_ OBJ_VALS )
obj . obj_reset_changes ( )
obj . hosts = [ ' fake-host1 ' ]
self . assertRaises ( exception . InstanceGroupSaveException ,
@ -139,7 +162,7 @@ class _TestInstanceGroupObject(object):
obj . user_id = _INST_GROUP_DB [ ' user_id ' ]
obj . project_id = _INST_GROUP_DB [ ' project_id ' ]
obj . members = _INST_GROUP_DB [ ' members ' ]
obj . policies = _INST_GROUP_DB [ ' polic ies' ]
obj . policies = [ _INST_GROUP_DB [ ' polic y' ] [ ' policy ' ] ]
obj . updated_at = _TS_NOW
obj . created_at = _TS_NOW
obj . create ( )
@ -153,7 +176,9 @@ class _TestInstanceGroupObject(object):
' updated_at ' : _TS_NOW ,
} ,
members = _INST_GROUP_DB [ ' members ' ] ,
policies = _INST_GROUP_DB [ ' policies ' ] )
policies = [ _INST_GROUP_DB [ ' policy ' ] [ ' policy ' ] ] ,
policy = None ,
rules = None )
mock_notify . assert_called_once_with (
self . context , " create " ,
{ ' uuid ' : _DB_UUID ,
@ -163,7 +188,7 @@ class _TestInstanceGroupObject(object):
' created_at ' : _TS_NOW ,
' updated_at ' : _TS_NOW ,
' members ' : _INST_GROUP_DB [ ' members ' ] ,
' policies ' : _INST_GROUP_DB [ ' polic ies' ] ,
' policies ' : [ _INST_GROUP_DB [ ' polic y' ] [ ' policy ' ] ] ,
' server_group_id ' : _DB_UUID } )
def _group_matcher ( group ) :
@ -175,7 +200,7 @@ class _TestInstanceGroupObject(object):
group . created_at == _TS_NOW and
group . updated_at == _TS_NOW and
group . members == _INST_GROUP_DB [ ' members ' ] and
group . policies == _INST_GROUP_DB [ ' polic ies' ] and
group . policies == [ _INST_GROUP_DB [ ' polic y' ] [ ' policy ' ] ] and
group . id == 1 )
group_matcher = test_utils . CustomMockCallMatcher ( _group_matcher )
@ -271,12 +296,31 @@ class _TestInstanceGroupObject(object):
filters = expected_filters )
def test_obj_make_compatible ( self ) :
obj = objects . InstanceGroup ( self . context , * * _INST_GROUP_ DB )
obj = objects . InstanceGroup ( self . context , * * _INST_GROUP_ OBJ_VALS )
obj_primitive = obj . obj_to_primitive ( )
self . assertNotIn ( ' metadetails ' , obj_primitive )
obj . obj_make_compatible ( obj_primitive , ' 1.6 ' )
self . assertEqual ( { } , obj_primitive [ ' metadetails ' ] )
def test_obj_make_compatible_pre_1_11 ( self ) :
none_policy_group = copy . deepcopy ( _INST_GROUP_DB )
none_policy_group [ ' policy ' ] = None
dbs = [ _INST_GROUP_DB , none_policy_group ]
data = lambda x : x [ ' nova_object.data ' ]
for db in dbs :
ig = objects . InstanceGroup ( )
obj = ig . _from_db_object ( self . context , ig , db )
# Latest version obj has policy and policies
obj_primitive = obj . obj_to_primitive ( )
self . assertIn ( ' policy ' , data ( obj_primitive ) )
self . assertIn ( ' policies ' , data ( obj_primitive ) )
# Before 1.10, only has polices which is the list of policy name
obj_primitive = obj . obj_to_primitive ( ' 1.10 ' )
self . assertNotIn ( ' policy ' , data ( obj_primitive ) )
self . assertIn ( ' policies ' , data ( obj_primitive ) )
self . assertEqual ( [ db [ ' policy ' ] [ ' policy ' ] ] if db [ ' policy ' ] else [ ] ,
data ( obj_primitive ) [ ' policies ' ] )
@mock.patch.object ( objects . InstanceList , ' get_by_filters ' )
def test_load_hosts ( self , mock_get_by_filt ) :
mock_get_by_filt . return_value = [ objects . Instance ( host = ' host1 ' ) ,