def test_isolate_agg_trait_on_flv_img_destination_not_set( self, mock_getnotmd): mock_getnotmd.return_value = [] flavor_traits = set(['HW_GPU_API_DXVA']) image_traits = set(['HW_NIC_DCB_ETS']) fake_flavor = objects.Flavor(vcpus=1, memory_mb=1024, root_gb=10, ephemeral_gb=5, swap=0, extra_specs={ 'trait:' + trait: 'required' for trait in flavor_traits }) fake_image = objects.ImageMeta(properties=objects.ImageMetaProps( traits_required=[trait for trait in image_traits])) reqspec = objects.RequestSpec(flavor=fake_flavor, image=fake_image) result = request_filter.isolate_aggregates(self.context, reqspec) self.assertTrue(result) self.assertNotIn('requested_destination', reqspec) keys = [ 'trait:%s' % trait for trait in flavor_traits.union(image_traits) ] mock_getnotmd.assert_called_once_with(self.context, utils.ItemsMatcher(keys), 'trait:', value='required')
def test_isolate_aggregates(self, mock_getnotmd): agg4_traits = { 'trait:HW_GPU_API_DXVA': 'required', 'trait:HW_NIC_DCB_ETS': 'required' } mock_getnotmd.return_value = [ objects.Aggregate( uuid=uuids.agg1, metadata={'trait:CUSTOM_WINDOWS_LICENSED_TRAIT': 'required'}), objects.Aggregate(uuid=uuids.agg2, metadata={ 'trait:CUSTOM_WINDOWS_LICENSED_TRAIT': 'required', 'trait:CUSTOM_XYZ_TRAIT': 'required' }), objects.Aggregate(uuid=uuids.agg4, metadata=agg4_traits), ] fake_flavor = objects.Flavor(vcpus=1, memory_mb=1024, root_gb=10, ephemeral_gb=5, swap=0, extra_specs=agg4_traits) fake_image = objects.ImageMeta(properties=objects.ImageMetaProps( traits_required=[])) reqspec = objects.RequestSpec(flavor=fake_flavor, image=fake_image) result = request_filter.isolate_aggregates(self.context, reqspec) self.assertTrue(result) self.assertItemsEqual( set([uuids.agg1, uuids.agg2, uuids.agg4]), reqspec.requested_destination.forbidden_aggregates) mock_getnotmd.assert_called_once_with(self.context, utils.ItemsMatcher(agg4_traits), 'trait:', value='required')
def test_with_tenant_and_az_and_traits(self, mock_getmd, mock_getnotmd): mock_getmd.side_effect = [ # Tenant filter [ objects.Aggregate(uuid=uuids.agg1, metadata={'filter_tenant_id': 'owner'}), objects.Aggregate(uuid=uuids.agg2, metadata={'filter_tenant_id:12': 'owner'}), objects.Aggregate(uuid=uuids.agg3, metadata={'other_key': 'owner'}) ], # AZ filter [ objects.Aggregate(uuid=uuids.agg4, metadata={'availability_zone': 'myaz'}) ], ] mock_getnotmd.side_effect = [ # isolate_aggregates filter [ objects.Aggregate(uuid=uuids.agg1, metadata={ 'trait:CUSTOM_WINDOWS_LICENSED_TRAIT': 'required' }), objects.Aggregate(uuid=uuids.agg2, metadata={ 'trait:CUSTOM_WINDOWS_LICENSED_TRAIT': 'required', 'trait:CUSTOM_XYZ_TRAIT': 'required' }), objects.Aggregate( uuid=uuids.agg3, metadata={'trait:CUSTOM_XYZ_TRAIT': 'required'}), ], ] traits = set(['HW_GPU_API_DXVA', 'HW_NIC_DCB_ETS']) fake_flavor = objects.Flavor( vcpus=1, memory_mb=1024, root_gb=10, ephemeral_gb=5, swap=0, extra_specs={'trait:' + trait: 'required' for trait in traits}) fake_image = objects.ImageMeta(properties=objects.ImageMetaProps( traits_required=[])) reqspec = objects.RequestSpec(project_id='owner', availability_zone='myaz', flavor=fake_flavor, image=fake_image) request_filter.process_reqspec(self.context, reqspec) self.assertEqual( ','.join(sorted([uuids.agg1, uuids.agg2])), ','.join( sorted( reqspec.requested_destination.aggregates[0].split(',')))) self.assertEqual( ','.join(sorted([uuids.agg4])), ','.join( sorted( reqspec.requested_destination.aggregates[1].split(',')))) self.assertItemsEqual( set([uuids.agg1, uuids.agg2, uuids.agg3]), reqspec.requested_destination.forbidden_aggregates) mock_getmd.assert_has_calls([ mock.call(self.context, value='owner'), mock.call(self.context, key='availability_zone', value='myaz') ]) keys = ['trait:%s' % trait for trait in traits] mock_getnotmd.assert_called_once_with(self.context, utils.ItemsMatcher(keys), 'trait:', value='required')