227 lines
8.7 KiB
Python
227 lines
8.7 KiB
Python
# Copyright 2018 Ericsson
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
import uuid
|
|
|
|
import mock
|
|
|
|
from neutron.agent.common import placement_report
|
|
from neutron.tests import base
|
|
|
|
|
|
class DeferredCallTestCase(base.BaseTestCase):
|
|
|
|
def test_defer_not_called(self):
|
|
func = mock.Mock()
|
|
placement_report.DeferredCall(func)
|
|
func.assert_not_called()
|
|
|
|
def test_execute(self):
|
|
func = mock.Mock()
|
|
deferred = placement_report.DeferredCall(
|
|
func, 'some arg', kwarg='some kwarg')
|
|
deferred.execute()
|
|
func.assert_called_once_with('some arg', kwarg='some kwarg')
|
|
|
|
def test___str__(self):
|
|
def func():
|
|
pass
|
|
deferred = placement_report.DeferredCall(func, 42, foo='bar')
|
|
self.assertEqual("func(42, foo='bar')", str(deferred))
|
|
|
|
|
|
class PlacementStateTestCase(base.BaseTestCase):
|
|
|
|
def setUp(self):
|
|
super(PlacementStateTestCase, self).setUp()
|
|
self.client_mock = mock.Mock()
|
|
self.driver_uuid_namespace = uuid.UUID(
|
|
'00000000-0000-0000-0000-000000000001')
|
|
# uuid below generated by the following command:
|
|
# uuid -v5 '00000000-0000-0000-0000-000000000001' 'fakehost'
|
|
self.hypervisor1_rp_uuid = uuid.UUID(
|
|
'c0b4abe5-516f-54b8-b965-ff94060dcbcc')
|
|
# uuid below generated by the following command:
|
|
# uuid -v5 '00000000-0000-0000-0000-000000000001' 'fakehost2'
|
|
self.hypervisor2_rp_uuid = uuid.UUID(
|
|
'544155b7-1295-5f10-b5f0-eadc50abc6d4')
|
|
self.kwargs = {
|
|
'rp_bandwidths': {},
|
|
'rp_inventory_defaults': {},
|
|
'driver_uuid_namespace': self.driver_uuid_namespace,
|
|
'agent_type': 'fake agent type',
|
|
'hypervisor_rps': {
|
|
'eth0': {'name': 'fakehost', 'uuid': self.hypervisor1_rp_uuid},
|
|
'eth1': {'name': 'fakehost', 'uuid': self.hypervisor1_rp_uuid},
|
|
},
|
|
'device_mappings': {},
|
|
'supported_vnic_types': [],
|
|
'client': self.client_mock,
|
|
}
|
|
|
|
def test__deferred_update_physnet_traits(self):
|
|
self.kwargs.update({
|
|
'device_mappings': {
|
|
'physnet0': ['eth0'],
|
|
'physnet1': ['eth1'],
|
|
},
|
|
'rp_bandwidths': {
|
|
'eth0': {'egress': 1, 'ingress': 1},
|
|
},
|
|
})
|
|
state = placement_report.PlacementState(**self.kwargs)
|
|
|
|
for deferred in state._deferred_update_physnet_traits():
|
|
deferred.execute()
|
|
|
|
self.client_mock.update_trait.assert_called_with(
|
|
name='CUSTOM_PHYSNET_PHYSNET0')
|
|
|
|
def test__deferred_update_vnic_type_traits(self):
|
|
self.kwargs.update({
|
|
'supported_vnic_types': ['direct'],
|
|
})
|
|
state = placement_report.PlacementState(**self.kwargs)
|
|
|
|
for deferred in state._deferred_update_vnic_type_traits():
|
|
deferred.execute()
|
|
|
|
self.client_mock.update_trait.assert_any_call(
|
|
name='CUSTOM_VNIC_TYPE_DIRECT')
|
|
|
|
def test__deferred_create_agent_rps(self):
|
|
state = placement_report.PlacementState(**self.kwargs)
|
|
|
|
for deferred in state._deferred_create_agent_rps():
|
|
deferred.execute()
|
|
|
|
self.client_mock.ensure_resource_provider.assert_called_with(
|
|
resource_provider={
|
|
'name': 'fakehost:fake agent type',
|
|
# uuid below generated by the following command:
|
|
# uuid -v5 '00000000-0000-0000-0000-000000000001' 'fakehost'
|
|
'uuid': uuid.UUID('c0b4abe5-516f-54b8-b965-ff94060dcbcc'),
|
|
'parent_provider_uuid': self.hypervisor1_rp_uuid})
|
|
|
|
def test__deferred_create_agent_rps_multiple_hypervisors(self):
|
|
self.kwargs['hypervisor_rps']['eth1'] = {
|
|
'name': 'fakehost2',
|
|
'uuid': self.hypervisor2_rp_uuid,
|
|
}
|
|
state = placement_report.PlacementState(**self.kwargs)
|
|
|
|
for deferred in state._deferred_create_agent_rps():
|
|
deferred.execute()
|
|
|
|
self.client_mock.ensure_resource_provider.assert_has_calls(
|
|
any_order=True,
|
|
calls=[
|
|
mock.call(resource_provider={
|
|
'name': 'fakehost:fake agent type',
|
|
# uuid below generated by the following command:
|
|
# uuid -v5 '00000000-0000-0000-0000-000000000001' \
|
|
# 'fakehost'
|
|
'uuid': uuid.UUID('c0b4abe5-516f-54b8-b965-ff94060dcbcc'),
|
|
'parent_provider_uuid': self.hypervisor1_rp_uuid}),
|
|
mock.call(resource_provider={
|
|
'name': 'fakehost2:fake agent type',
|
|
# uuid below generated by the following command:
|
|
# uuid -v5 '00000000-0000-0000-0000-000000000001' \
|
|
# 'fakehost2'
|
|
'uuid': uuid.UUID('544155b7-1295-5f10-b5f0-eadc50abc6d4'),
|
|
'parent_provider_uuid': self.hypervisor2_rp_uuid}),
|
|
]
|
|
)
|
|
|
|
def test_deferred_create_resource_providers(self):
|
|
self.kwargs.update({
|
|
'rp_bandwidths': {
|
|
'eth0': {'egress': 1, 'ingress': 1},
|
|
},
|
|
})
|
|
state = placement_report.PlacementState(**self.kwargs)
|
|
|
|
for deferred in state.deferred_create_resource_providers():
|
|
deferred.execute()
|
|
|
|
self.client_mock.ensure_resource_provider.assert_called_with(
|
|
{'name': 'fakehost:fake agent type:eth0',
|
|
# uuid below generated by the following command:
|
|
# uuid -v5 '00000000-0000-0000-0000-000000000001'
|
|
# 'fakehost:eth0'
|
|
'uuid': uuid.UUID('1ea6f823-bcf2-5dc5-9bee-4ee6177a6451'),
|
|
# uuid below generated by the following command:
|
|
# uuid -v5 '00000000-0000-0000-0000-000000000001' 'fakehost'
|
|
'parent_provider_uuid': uuid.UUID(
|
|
'c0b4abe5-516f-54b8-b965-ff94060dcbcc')})
|
|
|
|
def test_deferred_update_resource_provider_traits(self):
|
|
self.kwargs.update({
|
|
'device_mappings': {
|
|
'physnet0': ['eth0'],
|
|
},
|
|
'rp_bandwidths': {
|
|
'eth0': {'egress': 1, 'ingress': 1},
|
|
},
|
|
'supported_vnic_types': ['normal'],
|
|
})
|
|
state = placement_report.PlacementState(**self.kwargs)
|
|
|
|
for deferred in state.deferred_update_resource_provider_traits():
|
|
deferred.execute()
|
|
|
|
self.client_mock.update_resource_provider_traits.assert_called()
|
|
self.assertEqual(
|
|
# uuid below generated by the following command:
|
|
# uuid -v5 '00000000-0000-0000-0000-000000000001' 'fakehost:eth0'
|
|
uuid.UUID('1ea6f823-bcf2-5dc5-9bee-4ee6177a6451'),
|
|
self.client_mock.update_resource_provider_traits.call_args[1][
|
|
'resource_provider_uuid'])
|
|
# NOTE(bence romsics): To avoid testing the _order_ of traits.
|
|
self.assertEqual(
|
|
set(['CUSTOM_PHYSNET_PHYSNET0', 'CUSTOM_VNIC_TYPE_NORMAL']),
|
|
set(self.client_mock.update_resource_provider_traits.call_args[1][
|
|
'traits']))
|
|
|
|
def test_deferred_update_resource_provider_inventories(self):
|
|
self.kwargs.update({
|
|
'device_mappings': {
|
|
'physnet0': ['eth0'],
|
|
},
|
|
'rp_bandwidths': {
|
|
'eth0': {'egress': 100, 'ingress': None},
|
|
},
|
|
'rp_inventory_defaults': {
|
|
'step_size': 10,
|
|
'max_unit': 50,
|
|
},
|
|
})
|
|
state = placement_report.PlacementState(**self.kwargs)
|
|
|
|
for deferred in state.deferred_update_resource_provider_inventories():
|
|
deferred.execute()
|
|
|
|
self.client_mock.\
|
|
update_resource_provider_inventories.assert_called_with(
|
|
# uuid below generated by the following command:
|
|
# uuid -v5 '00000000-0000-0000-0000-000000000001' \
|
|
# 'fakehost:eth0'
|
|
resource_provider_uuid=uuid.UUID(
|
|
'1ea6f823-bcf2-5dc5-9bee-4ee6177a6451'),
|
|
inventories={
|
|
'NET_BW_EGR_KILOBIT_PER_SEC': {
|
|
'total': 100,
|
|
'step_size': 10,
|
|
'max_unit': 50}})
|