diff --git a/openstack_dashboard/test/selenium/ui/test_hypervisors.py b/openstack_dashboard/test/selenium/ui/test_hypervisors.py new file mode 100644 index 0000000000..db2e9758fb --- /dev/null +++ b/openstack_dashboard/test/selenium/ui/test_hypervisors.py @@ -0,0 +1,97 @@ +# 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. + +from unittest import mock + +from openstack_dashboard import api + + +def test_vcpu_pcpu_data_display(live_server, driver, user, dashboard_data): + with mock.patch.object(api.nova, 'service_list') as mocked_s_l, \ + mock.patch.object(api.nova, 'hypervisor_list') as mocked_h_l, \ + mock.patch.object(api.nova, 'hypervisor_stats') as mocked_h_s, \ + mock.patch.object(api.placement, 'get_providers') as mocked_g_p: + mocked_s_l.return_value = dashboard_data.services.list() + mocked_h_l.return_value = dashboard_data.hypervisors.list() + mocked_h_s.return_value = dashboard_data.hypervisors.stats + + providers = [{}] + for p in providers: + inventories = {'VCPU': {'total': 16, 'reserved': 4, + 'allocation_ratio': 4.0}, + 'PCPU': {'total': 4, 'reserved': 2, + 'allocation_ratio': 1.0}} + usages = {'VCPU': 2, 'PCPU': 1} + vcpus = inventories.get('VCPU') + pcpus = inventories.get('PCPU') + p['uuid'] = "test_provider" + p['inventories'] = inventories + p['usages'] = usages + p['vcpus_used'] = usages.get('VCPU') + p['vcpus_reserved'] = vcpus['reserved'] + p['vcpus'] = vcpus['total'] + p['vcpus_ar'] = vcpus['allocation_ratio'] + p['vcpus_capacity'] = int(vcpus['allocation_ratio'] * + vcpus['total']) + p['pcpus_used'] = usages.get('PCPU') + p['pcpus_reserved'] = pcpus['reserved'] + p['pcpus'] = pcpus['total'] + p['pcpus_ar'] = pcpus['allocation_ratio'] + p['pcpus_capacity'] = int(pcpus['allocation_ratio'] * + pcpus['total']) + mocked_g_p.return_value = providers + + driver.get(live_server.url + '/admin/hypervisors') + assert (driver.find_element_by_xpath( + f"//*[normalize-space()='VCPU Usage']/" + f"ancestor::div[contains(@class,'d3_quota_bar')]" + f"/div[contains(@class,'h6')]/" + f"span[1]").text == str(p['vcpus_used'])) + assert (driver.find_element_by_xpath( + f"//*[normalize-space()='VCPU Usage']/" + f"ancestor::div[contains(@class,'d3_quota_bar')]" + f"/div[contains(@class,'h6')]/" + f"span[2]").text == str(p['vcpus_capacity'])) + + assert (driver.find_element_by_xpath( + f"//*[normalize-space()='PCPU Usage']/" + f"ancestor::div[contains(@class,'d3_quota_bar')]" + f"/div[contains(@class,'h6')]/" + f"span[1]").text == str(p['pcpus_used'])) + assert (driver.find_element_by_xpath( + f"//*[normalize-space()='PCPU Usage']/" + f"ancestor::div[contains(@class,'d3_quota_bar')]" + f"/div[contains(@class,'h6')]/" + f"span[2]").text == str(p['pcpus_capacity'])) + + driver.find_element_by_link_text("Resource Provider").click() + resource_provider_tab = driver.find_element_by_id( + "hypervisor_info__provider") + table_header = resource_provider_tab.find_elements_by_css_selector( + ".table_column_header th") + table_row_test_provider = ( + resource_provider_tab.find_elements_by_css_selector( + "#providers__row__test_provider td")) + table_providers = dict(zip((x.text for x in table_header), + (x.text for x in table_row_test_provider))) + + want_to_check = {"VCPUs used": p['vcpus_used'], + "VCPUs reserved": p['vcpus_reserved'], + "VCPUs total": p['vcpus'], + "VCPUs allocation ratio": p['vcpus_ar'], + "PCPUs used": p['pcpus_used'], + "PCPUs reserved": p['pcpus_reserved'], + "PCPUs total": p['pcpus'], + "PCPUs allocation ratio": p['pcpus_ar']} + + for key, value in want_to_check.items(): + assert table_providers[key] == str(value)