Merge "placement: filtering the resource provider id when delete trait association"
This commit is contained in:
@@ -644,7 +644,12 @@ class ResourceProvider(base.NovaObject):
|
||||
with conn.begin():
|
||||
if to_delete_names:
|
||||
context.session.query(models.ResourceProviderTrait).filter(
|
||||
models.ResourceProviderTrait.trait_id.in_(to_delete_ids)
|
||||
sa.and_(
|
||||
models.ResourceProviderTrait.trait_id.in_(
|
||||
to_delete_ids),
|
||||
(models.ResourceProviderTrait.resource_provider_id ==
|
||||
_id)
|
||||
)
|
||||
).delete(synchronize_session='fetch')
|
||||
if to_add_names:
|
||||
for name in to_add_names:
|
||||
|
||||
@@ -1836,6 +1836,44 @@ class ResourceProviderTraitTestCase(ResourceProviderBaseCase):
|
||||
self._assert_traits(trait_names, rp.get_traits())
|
||||
self.assertEqual(rp.generation, generation + 1)
|
||||
|
||||
def test_set_traits_for_correct_resource_provider(self):
|
||||
"""This test creates two ResourceProviders, and attaches same trait to
|
||||
both of them. Then detaching the trait from one of them, and ensure
|
||||
the trait still associated with another one.
|
||||
"""
|
||||
# Create two ResourceProviders
|
||||
rp1 = objects.ResourceProvider(
|
||||
context=self.ctx,
|
||||
uuid=uuidsentinel.fake_resource_provider1,
|
||||
name=uuidsentinel.fake_resource_name1,
|
||||
)
|
||||
rp1.create()
|
||||
rp2 = objects.ResourceProvider(
|
||||
context=self.ctx,
|
||||
uuid=uuidsentinel.fake_resource_provider2,
|
||||
name=uuidsentinel.fake_resource_name2,
|
||||
)
|
||||
rp2.create()
|
||||
|
||||
# Create a trait
|
||||
t = objects.Trait(self.ctx)
|
||||
t.name = 'CUSTOM_TRAIT_A'
|
||||
t.create()
|
||||
|
||||
# Associate the trait with two ResourceProviders
|
||||
rp1.set_traits([t])
|
||||
rp2.set_traits([t])
|
||||
|
||||
# Ensure the association
|
||||
self._assert_traits(['CUSTOM_TRAIT_A'], rp1.get_traits())
|
||||
self._assert_traits(['CUSTOM_TRAIT_A'], rp2.get_traits())
|
||||
|
||||
# Detach the trait from one of ResourceProvider, and ensure the
|
||||
# trait association with another ResourceProvider still exists.
|
||||
rp1.set_traits([])
|
||||
self._assert_traits([], rp1.get_traits())
|
||||
self._assert_traits(['CUSTOM_TRAIT_A'], rp2.get_traits())
|
||||
|
||||
def test_trait_delete_in_use(self):
|
||||
rp = objects.ResourceProvider(
|
||||
context=self.ctx,
|
||||
|
||||
Reference in New Issue
Block a user