Merge "Add new tests to validate GET /infra-optim/v1/data_model"

This commit is contained in:
Zuul
2025-08-22 14:16:05 +00:00
committed by Gerrit Code Review
4 changed files with 99 additions and 0 deletions

View File

@@ -18,8 +18,10 @@ from unittest import mock
from http import HTTPStatus
from oslo_serialization import jsonutils
from watcher.api.controllers.v1 import versions
from watcher.decision_engine import rpcapi as deapi
from watcher.tests.api import base as api_base
from watcher.tests.decision_engine.model import faker_cluster_state
class TestListDataModel(api_base.FunctionalTest):
@@ -46,6 +48,82 @@ class TestListDataModel(api_base.FunctionalTest):
self.assertEqual(HTTPStatus.NOT_ACCEPTABLE, response.status_int)
class TestListDataModelResponse(api_base.FunctionalTest):
NODE_FIELDS_1_3 = [
'node_disabled_reason',
'node_hostname',
'node_status',
'node_state',
'node_memory',
'node_memory_mb_reserved',
'node_disk',
'node_disk_gb_reserved',
'node_vcpus',
'node_vcpu_reserved',
'node_memory_ratio',
'node_vcpu_ratio',
'node_disk_ratio',
'node_uuid'
]
SERVER_FIELDS_1_3 = [
'server_watcher_exclude',
'server_name',
'server_state',
'server_memory',
'server_disk',
'server_vcpus',
'server_metadata',
'server_project_id',
'server_locked',
'server_uuid'
]
NODE_FIELDS_LATEST = NODE_FIELDS_1_3
SERVER_FIELDS_LATEST = SERVER_FIELDS_1_3
def setUp(self):
super(TestListDataModelResponse, self).setUp()
p_dcapi = mock.patch.object(deapi, 'DecisionEngineAPI')
self.mock_dcapi = p_dcapi.start()
self.addCleanup(p_dcapi.stop)
def test_model_list_compute_no_instance(self):
fake_cluster = faker_cluster_state.FakerModelCollector()
model = fake_cluster.generate_scenario_11_with_1_node_no_instance()
get_model_resp = {'context': model.to_list()}
self.mock_dcapi().get_data_model_info.return_value = get_model_resp
infra_max_version = 'infra-optim ' + versions.max_version_string()
response = self.get_json(
'/data_model/?data_model_type=compute',
headers={'OpenStack-API-Version': infra_max_version})
server_info = response.get("context")[0]
expected_keys = self.NODE_FIELDS_LATEST
self.assertEqual(len(response.get("context")), 1)
self.assertEqual(set(expected_keys), set(server_info.keys()))
def test_model_list_compute_with_instances(self):
fake_cluster = faker_cluster_state.FakerModelCollector()
model = fake_cluster.generate_scenario_11_with_2_nodes_2_instances()
get_model_resp = {'context': model.to_list()}
self.mock_dcapi().get_data_model_info.return_value = get_model_resp
infra_max_version = 'infra-optim ' + versions.max_version_string()
response = self.get_json(
'/data_model/?data_model_type=compute',
headers={'OpenStack-API-Version': infra_max_version})
server_info = response.get("context")[0]
expected_keys = self.NODE_FIELDS_LATEST + self.SERVER_FIELDS_LATEST
self.assertEqual(len(response.get("context")), 2)
self.assertEqual(set(expected_keys), set(server_info.keys()))
class TestDataModelPolicyEnforcement(api_base.FunctionalTest):
def setUp(self):

View File

@@ -0,0 +1,5 @@
<ModelRoot>
<ComputeNode name="" uuid="Node_0" status="enabled" state="up" id="0" hostname="hostname_0" disabled_reason="" vcpus="1" vcpu_reserved="0" vcpu_ratio="1" disk="1" disk_gb_reserved="0" disk_ratio="1" disk_capacity="1" memory="1" memory_mb_reserved="0" memory_ratio="1"/>
</ModelRoot>

View File

@@ -0,0 +1,10 @@
<ModelRoot>
<ComputeNode name="" uuid="Node_0" status="enabled" state="up" id="0" hostname="hostname_0" disabled_reason="" vcpus="1" vcpu_reserved="0" vcpu_ratio="1" disk="1" disk_gb_reserved="0" disk_ratio="1" disk_capacity="1" memory="1" memory_mb_reserved="0" memory_ratio="1">
<Instance watcher_exclude="False" name="" state="active" uuid="INSTANCE_0" vcpus="10" disk="20" disk_capacity="20" memory="2" metadata='{"optimize": true,"top": "floor", "nested": {"x": "y"}}' project_id="91FFFE30-78A0-4152-ACD2-8310FF274DC9"/>
</ComputeNode>
<ComputeNode name="" uuid="Node_1" status="enabled" state="up" id="1" hostname="hostname_1" disabled_reason="" vcpus="1" vcpu_reserved="0" vcpu_ratio="1" disk="1" disk_gb_reserved="0" disk_ratio="1" disk_capacity="1" memory="1" memory_mb_reserved="0" memory_ratio="1">
<Instance watcher_exclude="False" name="" state="active" uuid="INSTANCE_1" vcpus="10" disk="20" disk_capacity="20" memory="2" metadata='{"optimize": true,"top": "floor", "nested": {"x": "y"}}' project_id="91FFFE30-78A0-4152-ACD2-8310FF274DC9"/>
</ComputeNode>
</ModelRoot>

View File

@@ -174,6 +174,12 @@ class FakerModelCollector(base.BaseClusterDataModelCollector):
def generate_scenario_10(self):
return self.load_model('scenario_10.xml')
def generate_scenario_11_with_1_node_no_instance(self):
return self.load_model('scenario_11_with_1_node_no_instance.xml')
def generate_scenario_11_with_2_nodes_2_instances(self):
return self.load_model('scenario_11_with_2_nodes_2_instances.xml')
class FakerStorageModelCollector(base.BaseClusterDataModelCollector):