Bump hacking

hacking 3.1.x is too old.

Change-Id: I7c7686c36cedb9d88caea2fd74880d138fa00c8e
Signed-off-by: Takashi Kajinami <kajinamit@oss.nttdata.com>
This commit is contained in:
Takashi Kajinami
2025-05-27 15:14:21 +09:00
parent 4e1eb11d81
commit 69dad6e6d6
38 changed files with 224 additions and 215 deletions

View File

@@ -167,7 +167,7 @@ class HorizonMiddleware(object):
""" """
if http_utils.is_ajax(request) and hasattr(request, 'horizon'): if http_utils.is_ajax(request) and hasattr(request, 'horizon'):
queued_msgs = request.horizon['async_messages'] queued_msgs = request.horizon['async_messages']
if type(response) == http.HttpResponseRedirect: if isinstance(response, http.HttpResponseRedirect):
# Drop our messages back into the session as per usual so they # Drop our messages back into the session as per usual so they
# don't disappear during the redirect. Not that we explicitly # don't disappear during the redirect. Not that we explicitly
# use django's messages methods here. # use django's messages methods here.

View File

@@ -20,8 +20,9 @@ import os
import socket import socket
from horizon.defaults import * # noqa: F401,F403,H303 from horizon.defaults import * # noqa: F401,F403,H303
from openstack_auth.defaults import * # noqa: F401,F403,H303
from openstack_dashboard.utils import settings as settings_utils from openstack_auth.defaults import * # noqa: F401,F403,H303,I100
from openstack_dashboard.utils import settings as settings_utils # noqa: I100
socket.setdefaulttimeout(1) socket.setdefaulttimeout(1)

View File

@@ -167,4 +167,4 @@ def extract_angular(fileobj, keywords, comment_tags, options):
parser.feed(encodeutils.safe_decode(line)) parser.feed(encodeutils.safe_decode(line))
for string in parser.strings: for string in parser.strings:
yield(string) yield string

View File

@@ -91,7 +91,7 @@ class Service(base.APIDictWrapper):
self.region = region self.region = region
def __str__(self): def __str__(self):
if(self.type == "identity"): if self.type == "identity":
return _("%(type)s (%(backend)s backend)") \ return _("%(type)s (%(backend)s backend)") \
% {"type": self.type, "backend": keystone_backend_name()} % {"type": self.type, "backend": keystone_backend_name()}
return self.type return self.type

View File

@@ -169,7 +169,7 @@ def swift_get_containers(request, marker=None, prefix=None):
prefix=prefix, prefix=prefix,
full_listing=True) full_listing=True)
container_objs = [Container(c) for c in containers] container_objs = [Container(c) for c in containers]
if(len(container_objs) > limit): if len(container_objs) > limit:
return (container_objs[0:-1], True) return (container_objs[0:-1], True)
return (container_objs, False) return (container_objs, False)
@@ -270,7 +270,7 @@ def swift_get_objects(request, container_name, prefix=None, marker=None,
**kwargs) **kwargs)
object_objs = _objectify(objects, container_name) object_objs = _objectify(objects, container_name)
if(len(object_objs) > limit): if len(object_objs) > limit:
return (object_objs[0:-1], True) return (object_objs[0:-1], True)
return (object_objs, False) return (object_objs, False)

View File

@@ -1005,7 +1005,7 @@ class NetworkTests(test.BaseAdminViewTests):
url = reverse('horizon:admin:networks:create') url = reverse('horizon:admin:networks:create')
res = self.client.get(url) res = self.client.get(url)
physical_network = res.context['form'].fields['physical_network'] physical_network = res.context['form'].fields['physical_network']
self.assertEqual(type(physical_network), forms.CharField) self.assertIsInstance(physical_network, forms.CharField)
self.mock_tenant_list.assert_called_once_with(test.IsHttpRequest()) self.mock_tenant_list.assert_called_once_with(test.IsHttpRequest())
self._check_is_extension_supported( self._check_is_extension_supported(
@@ -1029,7 +1029,7 @@ class NetworkTests(test.BaseAdminViewTests):
url = reverse('horizon:admin:networks:create') url = reverse('horizon:admin:networks:create')
res = self.client.get(url) res = self.client.get(url)
physical_network = res.context['form'].fields['physical_network'] physical_network = res.context['form'].fields['physical_network']
self.assertEqual(type(physical_network), forms.ThemableChoiceField) self.assertIsInstance(physical_network, forms.ThemableChoiceField)
self.assertListEqual(list(physical_network.choices), self.assertListEqual(list(physical_network.choices),
[('default', 'default'), ('test', 'test')]) [('default', 'default'), ('test', 'test')])

View File

@@ -1156,7 +1156,7 @@ class NetworkViewTests(test.TestCase, NetworkStubMixin):
networks = res.context['networks_table'].data networks = res.context['networks_table'].data
button = find_button_fn(res) button = find_button_fn(res)
self.assertFalse('disabled' in button.classes, self.assertNotIn('disabled', button.classes,
"The create button should not be disabled") "The create button should not be disabled")
self._check_net_list() self._check_net_list()

View File

@@ -1221,7 +1221,7 @@ class RouterViewTests(RouterMixin, test.TestCase):
self.assertCountEqual(routers, self.routers.list()) self.assertCountEqual(routers, self.routers.list())
create_action = self.getAndAssertTableAction(res, 'routers', 'create') create_action = self.getAndAssertTableAction(res, 'routers', 'create')
self.assertFalse('disabled' in create_action.classes, self.assertNotIn('disabled', create_action.classes,
'Create button should not be disabled') 'Create button should not be disabled')
self.assertEqual('Create Router', self.assertEqual('Create Router',
create_action.verbose_name) create_action.verbose_name)

View File

@@ -104,7 +104,7 @@ class MetadatadefinitionsPage(basepage.BaseNavigationPage):
return bool(self._get_row_with_namespace_name(name)) return bool(self._get_row_with_namespace_name(name))
def is_public_set_correct(self, name, exp_value, row=None): def is_public_set_correct(self, name, exp_value, row=None):
if type(exp_value) != bool: if not isinstance(exp_value, bool):
raise ValueError('Expected value "exp_value" is not boolean') raise ValueError('Expected value "exp_value" is not boolean')
if not row: if not row:
row = self._get_row_with_namespace_name(name) row = self._get_row_with_namespace_name(name)
@@ -112,7 +112,7 @@ class MetadatadefinitionsPage(basepage.BaseNavigationPage):
return self._is_text_visible(cell, self.boolean_mapping[exp_value]) return self._is_text_visible(cell, self.boolean_mapping[exp_value])
def is_protected_set_correct(self, name, exp_value, row=None): def is_protected_set_correct(self, name, exp_value, row=None):
if type(exp_value) != bool: if not isinstance(exp_value, bool):
raise ValueError('Expected value "exp_value" is not boolean') raise ValueError('Expected value "exp_value" is not boolean')
if not row: if not row:
row = self._get_row_with_namespace_name(name) row = self._get_row_with_namespace_name(name)

View File

@@ -322,6 +322,7 @@ class TestImagesAdvancedAngular(helpers.TestCase):
return InstancesPage(self.driver, self.CONFIG) return InstancesPage(self.driver, self.CONFIG)
"""Login as demo user""" """Login as demo user"""
def test_create_volume_from_image(self): def test_create_volume_from_image(self):
"""This test case checks create volume from image functionality: """This test case checks create volume from image functionality:

View File

@@ -21,6 +21,7 @@ class TestLogin(helpers.BaseTestCase):
* logs in as a regular user * logs in as a regular user
* checks that the user home page loads without error * checks that the user home page loads without error
""" """
def test_login(self): def test_login(self):
login_pg = loginpage.LoginPage(self.driver, self.CONFIG) login_pg = loginpage.LoginPage(self.driver, self.CONFIG)
login_pg.go_to_login_page() login_pg.go_to_login_page()

View File

@@ -85,7 +85,7 @@ def change_page_size(driver, config, page_size):
driver.find_element_by_css_selector( driver.find_element_by_css_selector(
f"#id_pagesize[value='{page_size}']") f"#id_pagesize[value='{page_size}']")
break break
except(exceptions.NoSuchElementException): except exceptions.NoSuchElementException:
time.sleep(3) time.sleep(3)

View File

@@ -65,7 +65,7 @@ def test_update_compute_defaults(login, driver, openstack_admin, config,
defaults_form.find_element_by_id("id_cores").send_keys(number_of_cores) defaults_form.find_element_by_id("id_cores").send_keys(number_of_cores)
defaults_form.find_element_by_css_selector(".btn-primary").click() defaults_form.find_element_by_css_selector(".btn-primary").click()
messages = widgets.get_and_dismiss_messages(driver) messages = widgets.get_and_dismiss_messages(driver)
assert f'Success: Default quotas updated.' in messages assert 'Success: Default quotas updated.' in messages
new_quotas = openstack_admin.compute.get( new_quotas = openstack_admin.compute.get(
"/os-quota-class-sets/default").json() "/os-quota-class-sets/default").json()
assert ( assert (
@@ -94,7 +94,7 @@ def test_update_volume_defaults(login, driver, openstack_admin, config,
number_of_snapshots) number_of_snapshots)
defaults_form.find_element_by_css_selector(".btn-primary").click() defaults_form.find_element_by_css_selector(".btn-primary").click()
messages = widgets.get_and_dismiss_messages(driver) messages = widgets.get_and_dismiss_messages(driver)
assert f'Success: Default quotas updated.' in messages assert 'Success: Default quotas updated.' in messages
new_quotas = openstack_admin.block_storage.get( new_quotas = openstack_admin.block_storage.get(
"/os-quota-class-sets/default").json() "/os-quota-class-sets/default").json()
assert (new_quotas["quota_class_set"]["volumes"] == number_of_volumes and assert (new_quotas["quota_class_set"]["volumes"] == number_of_volumes and

View File

@@ -134,6 +134,7 @@ def test_associate_floatingip(login, driver, openstack_demo, new_floating_ip,
assert (new_instance_demo.id == openstack_demo.network.find_ip( assert (new_instance_demo.id == openstack_demo.network.find_ip(
new_floating_ip.floating_ip_address).port_details['device_id']) new_floating_ip.floating_ip_address).port_details['device_id'])
@pytest.mark.parametrize('new_instance_demo', [(1, True)], @pytest.mark.parametrize('new_instance_demo', [(1, True)],
indirect=True) indirect=True)
def test_disassociate_floatingip(login, driver, openstack_demo, config, def test_disassociate_floatingip(login, driver, openstack_demo, config,

View File

@@ -99,7 +99,7 @@ def test_edit_group_name_and_description(login, driver, group_name,
f"EDITED_Description for: {group_name}") f"EDITED_Description for: {group_name}")
group_form.find_element_by_css_selector(".btn-primary").click() group_form.find_element_by_css_selector(".btn-primary").click()
messages = widgets.get_and_dismiss_messages(driver) messages = widgets.get_and_dismiss_messages(driver)
assert f"Success: Group has been updated successfully." in messages assert "Success: Group has been updated successfully." in messages
assert (openstack_admin.identity.find_group( assert (openstack_admin.identity.find_group(
f"EDITED_{group_name}") is not None) f"EDITED_{group_name}") is not None)
assert (openstack_admin.identity.find_group( assert (openstack_admin.identity.find_group(

View File

@@ -387,7 +387,7 @@ def test_remove_protected_image_admin(login, driver, image_names,
if option.text == "Delete Image": if option.text == "Delete Image":
pytest.fail("Delete option should not exist") pytest.fail("Delete option should not exist")
actions_column.find_element_by_xpath( actions_column.find_element_by_xpath(
f".//*[normalize-space()='Edit Image']").click() ".//*[normalize-space()='Edit Image']").click()
wait_for_angular_readiness(driver) wait_for_angular_readiness(driver)
image_form = driver.find_element_by_css_selector(".ng-wizard") image_form = driver.find_element_by_css_selector(".ng-wizard")
image_form.find_element_by_xpath(".//label[text()='No']").click() image_form.find_element_by_xpath(".//label[text()='No']").click()
@@ -475,7 +475,7 @@ def test_update_image_metadata_admin(login, driver,
image_form.find_element_by_xpath( image_form.find_element_by_xpath(
"//button[@ng-click='modal.save()']").click() "//button[@ng-click='modal.save()']").click()
messages = widgets.get_and_dismiss_messages(driver) messages = widgets.get_and_dismiss_messages(driver)
assert f"Success: Metadata was successfully updated." in messages assert "Success: Metadata was successfully updated." in messages
image_id = new_image_admin.id image_id = new_image_admin.id
for name, value in new_metadata.items(): for name, value in new_metadata.items():
assert (openstack_admin.compute.get(f"/images/{image_id}").json( assert (openstack_admin.compute.get(f"/images/{image_id}").json(
@@ -522,7 +522,7 @@ def test_launch_instance_from_image_admin(complete_default_test_network, login,
wizard.find_element_by_css_selector( wizard.find_element_by_css_selector(
"button.btn-primary.finish").click() "button.btn-primary.finish").click()
messages = widgets.get_and_dismiss_messages(driver) messages = widgets.get_and_dismiss_messages(driver)
assert f"Info: Scheduled creation of 1 instance." in messages assert "Info: Scheduled creation of 1 instance." in messages
assert openstack_admin.compute.find_server(instance_name) is not None assert openstack_admin.compute.find_server(instance_name) is not None
@@ -547,8 +547,8 @@ def test_create_volume_from_image_admin(login, driver, volume_name,
name_field.clear() name_field.clear()
name_field.send_keys(volume_name) name_field.send_keys(volume_name)
create_vol_btn = WebDriverWait(driver, config.selenium.page_timeout).until( create_vol_btn = WebDriverWait(driver, config.selenium.page_timeout).until(
EC.element_to_be_clickable((By.XPATH, f"//button[@class='btn " EC.element_to_be_clickable(
f"btn-primary finish']"))) (By.XPATH, "//button[@class='btn btn-primary finish']")))
create_vol_btn.click() create_vol_btn.click()
messages = widgets.get_and_dismiss_messages(driver) messages = widgets.get_and_dismiss_messages(driver)
assert f"Info: Creating volume {volume_name}" in messages assert f"Info: Creating volume {volume_name}" in messages

View File

@@ -77,7 +77,7 @@ def ensure_checkbox(required_state, element):
current_state = element.is_selected() current_state = element.is_selected()
if required_state != current_state: if required_state != current_state:
element.find_element_by_xpath( element.find_element_by_xpath(
f".//following-sibling::label").click() # noqa: E231 ".//following-sibling::label").click() # noqa: E231
def test_create_network_without_subnet_demo(login, openstack_demo, driver, def test_create_network_without_subnet_demo(login, openstack_demo, driver,

View File

@@ -230,7 +230,7 @@ def test_router_set_gateway_demo(login, driver, new_router_demo,
gateway_form, 'id_network_id', config.network.external_network) gateway_form, 'id_network_id', config.network.external_network)
gateway_form.find_element_by_css_selector(".btn-primary").click() gateway_form.find_element_by_css_selector(".btn-primary").click()
messages = widgets.get_and_dismiss_messages(driver) messages = widgets.get_and_dismiss_messages(driver)
assert f"Success: Gateway interface is added" in messages assert "Success: Gateway interface is added" in messages
router_sdk = openstack_demo.network.get( router_sdk = openstack_demo.network.get(
f"/routers/{new_router_demo.id}" f"/routers/{new_router_demo.id}"
f"?fields=id&fields=name&fields=" f"?fields=id&fields=name&fields="

View File

@@ -59,7 +59,7 @@ def test_create_user_credential_totp(login, driver, openstack_admin, config,
user_credential_form, 'id_cred_type', 'TOTP') user_credential_form, 'id_cred_type', 'TOTP')
user_credential_form.find_element_by_css_selector(".btn-primary").click() user_credential_form.find_element_by_css_selector(".btn-primary").click()
messages = widgets.get_and_dismiss_messages(driver) messages = widgets.get_and_dismiss_messages(driver)
assert f'Success: User credential created successfully.' in messages assert 'Success: User credential created successfully.' in messages
credentials_sdk_after = list(openstack_admin.identity.credentials()) credentials_sdk_after = list(openstack_admin.identity.credentials())
assert (len(credentials_sdk_after) == 1 and assert (len(credentials_sdk_after) == 1 and
credentials_sdk_after[0]['type'] == 'totp') credentials_sdk_after[0]['type'] == 'totp')
@@ -88,7 +88,7 @@ def test_create_user_credential_ec2(login, driver, openstack_admin, config,
user_credential_form, 'id_project', 'admin') user_credential_form, 'id_project', 'admin')
user_credential_form.find_element_by_css_selector(".btn-primary").click() user_credential_form.find_element_by_css_selector(".btn-primary").click()
messages = widgets.get_and_dismiss_messages(driver) messages = widgets.get_and_dismiss_messages(driver)
assert f'Success: User credential created successfully.' in messages assert 'Success: User credential created successfully.' in messages
credentials_sdk_after = list(openstack_admin.identity.credentials()) credentials_sdk_after = list(openstack_admin.identity.credentials())
assert (len(credentials_sdk_after) == 1 and assert (len(credentials_sdk_after) == 1 and
credentials_sdk_after[0]['type'] == 'ec2' and credentials_sdk_after[0]['type'] == 'ec2' and
@@ -140,7 +140,7 @@ def test_edit_user_credential(login, driver, openstack_admin, config,
f"EDITED_{user_credential_blob}") f"EDITED_{user_credential_blob}")
user_credential_form.find_element_by_css_selector(".btn-primary").click() user_credential_form.find_element_by_css_selector(".btn-primary").click()
messages = widgets.get_and_dismiss_messages(driver) messages = widgets.get_and_dismiss_messages(driver)
assert(f"Success: User credential updated successfully." in messages) assert ("Success: User credential updated successfully." in messages)
credentials_sdk = list(openstack_admin.identity.credentials()) credentials_sdk = list(openstack_admin.identity.credentials())
assert (len(credentials_sdk) == 1 and assert (len(credentials_sdk) == 1 and
credentials_sdk[0]['blob'] == f'EDITED_{user_credential_blob}') credentials_sdk[0]['blob'] == f'EDITED_{user_credential_blob}')
@@ -163,12 +163,12 @@ def test_user_credential_filtration(login, driver, openstack_admin,
try: try:
driver.find_element_by_xpath( driver.find_element_by_xpath(
"//td[text()='No items to display.']") "//td[text()='No items to display.']")
except(exceptions.NoSuchElementException): except exceptions.NoSuchElementException:
assert False, "Message 'No items to display' not found" assert False, "Message 'No items to display' not found"
filter_input_field = driver.find_element_by_css_selector(".form-control") filter_input_field = driver.find_element_by_css_selector(".form-control")
filter_input_field.clear() filter_input_field.clear()
filter_input_field.send_keys('admin') filter_input_field.send_keys('admin')
driver.find_element_by_id("credentialstable__action_filter").click() driver.find_element_by_id("credentialstable__action_filter").click()
rows = driver.find_elements_by_css_selector( rows = driver.find_elements_by_css_selector(
f"table#credentialstable tr[data-display]") "table#credentialstable tr[data-display]")
assert len(rows) == 1 assert len(rows) == 1

View File

@@ -102,4 +102,4 @@ def test_change_user_password(login, driver, user_name, new_user, config):
"id_confirm_password").send_keys(new_password) "id_confirm_password").send_keys(new_password)
password_form.find_element_by_css_selector(".btn-primary").click() password_form.find_element_by_css_selector(".btn-primary").click()
messages = widgets.get_and_dismiss_messages(driver) messages = widgets.get_and_dismiss_messages(driver)
assert f"Success: User password has been updated successfully." in messages assert "Success: User password has been updated successfully." in messages

View File

@@ -245,7 +245,7 @@ def test_volume_upload_to_image_demo(login, driver, openstack_demo,
volume_form.find_element_by_css_selector( volume_form.find_element_by_css_selector(
".btn-primary[value='Upload']").click() ".btn-primary[value='Upload']").click()
messages = widgets.get_and_dismiss_messages(driver) messages = widgets.get_and_dismiss_messages(driver)
assert(f'Info: Successfully sent the request to upload volume to image for ' assert ('Info: Successfully sent the request to upload volume to image for '
f'volume: "{new_volume_demo.name}"' in messages) f'volume: "{new_volume_demo.name}"' in messages)
wait_for_steady_state_of_volume(openstack_demo, new_volume_demo.name) wait_for_steady_state_of_volume(openstack_demo, new_volume_demo.name)
assert openstack_demo.compute.find_image(image_names[0]) is not None assert openstack_demo.compute.find_image(image_names[0]) is not None

View File

@@ -249,7 +249,7 @@ def test_edit_qos_spec_consumer(login, driver, openstack_admin, config,
widgets.select_from_dropdown(volume_qos_form, 'front-end') widgets.select_from_dropdown(volume_qos_form, 'front-end')
volume_qos_form.find_element_by_css_selector(".btn-primary").click() volume_qos_form.find_element_by_css_selector(".btn-primary").click()
messages = widgets.get_and_dismiss_messages(driver) messages = widgets.get_and_dismiss_messages(driver)
assert f"Success: Successfully modified QoS Spec consumer." in messages assert "Success: Successfully modified QoS Spec consumer." in messages
assert (openstack_admin.block_storage.get( assert (openstack_admin.block_storage.get(
f"/qos-specs/{new_qos_spec['id']}").json()['qos_specs']['consumer'] == f"/qos-specs/{new_qos_spec['id']}").json()['qos_specs']['consumer'] ==
'front-end') 'front-end')
@@ -275,7 +275,7 @@ def test_qos_spec_create_extra_specs(login, driver, openstack_admin, config,
extra_specs_form.find_element_by_id("id_value").send_keys(20) extra_specs_form.find_element_by_id("id_value").send_keys(20)
extra_specs_form.find_element_by_css_selector(".btn-primary").click() extra_specs_form.find_element_by_css_selector(".btn-primary").click()
messages = widgets.get_and_dismiss_messages(driver) messages = widgets.get_and_dismiss_messages(driver)
assert f'Success: Created spec "minIOPS".' in messages assert 'Success: Created spec "minIOPS".' in messages
assert (openstack_admin.block_storage.get( assert (openstack_admin.block_storage.get(
f"/qos-specs/{new_qos_spec['id']}").json()['qos_specs']['specs'] == f"/qos-specs/{new_qos_spec['id']}").json()['qos_specs']['specs'] ==
{'minIOPS': '20'}) {'minIOPS': '20'})
@@ -300,7 +300,7 @@ def test_qos_spec_delete_extra_specs(login, driver, openstack_admin, config,
rows[0].find_element_by_css_selector(".data-table-action").click() rows[0].find_element_by_css_selector(".data-table-action").click()
volume_qos_form = driver.find_element_by_css_selector(".modal-dialog form") volume_qos_form = driver.find_element_by_css_selector(".modal-dialog form")
rows_extra = volume_qos_form.find_elements_by_css_selector( rows_extra = volume_qos_form.find_elements_by_css_selector(
f"table#specs tr[data-display='maxIOPS']") "table#specs tr[data-display='maxIOPS']")
assert len(rows_extra) == 1 assert len(rows_extra) == 1
actions_column = rows_extra[0].find_element_by_css_selector( actions_column = rows_extra[0].find_element_by_css_selector(
"td.actions_column") "td.actions_column")
@@ -308,7 +308,7 @@ def test_qos_spec_delete_extra_specs(login, driver, openstack_admin, config,
driver.find_element_by_css_selector( driver.find_element_by_css_selector(
".modal-dialog .modal-footer .btn-danger").click() ".modal-dialog .modal-footer .btn-danger").click()
messages = widgets.get_and_dismiss_messages(driver) messages = widgets.get_and_dismiss_messages(driver)
assert f"Success: Deleted Spec: maxIOPS" in messages assert "Success: Deleted Spec: maxIOPS" in messages
assert (openstack_admin.block_storage.get( assert (openstack_admin.block_storage.get(
f"/qos-specs/{new_qos_spec_with_extra_specs['id']}").json() f"/qos-specs/{new_qos_spec_with_extra_specs['id']}").json()
['qos_specs']['specs'] == {}) ['qos_specs']['specs'] == {})

View File

@@ -63,7 +63,8 @@ def test_delete_multiple_images_rows(live_server, driver, dashboard_data,
with mock.patch.object( with mock.patch.object(
api.glance, 'image_list_detailed') as mocked_i_l_d, \ api.glance, 'image_list_detailed') as mocked_i_l_d, \
mock.patch.object( mock.patch.object(
api.glance, 'metadefs_namespace_full_list') as mocked_m_n_f_l,\ api.glance,
'metadefs_namespace_full_list') as mocked_m_n_f_l, \
mock.patch.object( mock.patch.object(
api.glance, 'image_delete') as mocked_i_d: api.glance, 'image_delete') as mocked_i_d:
mocked_i_l_d.return_value = ( mocked_i_l_d.return_value = (

View File

@@ -52,26 +52,26 @@ def test_vcpu_pcpu_data_display(live_server, driver, user, dashboard_data):
driver.get(live_server.url + '/admin/hypervisors') driver.get(live_server.url + '/admin/hypervisors')
assert (driver.find_element_by_xpath( assert (driver.find_element_by_xpath(
f"//*[normalize-space()='vCPU Usage']/" "//*[normalize-space()='vCPU Usage']/"
f"ancestor::div[contains(@class,'d3_quota_bar')]" # noqa: E231 "ancestor::div[contains(@class,'d3_quota_bar')]" # noqa: E231
f"/div[contains(@class,'h6')]/" # noqa: E231 "/div[contains(@class,'h6')]/" # noqa: E231
f"span[1]").text == str(p['vcpus_used'])) "span[1]").text == str(p['vcpus_used']))
assert (driver.find_element_by_xpath( assert (driver.find_element_by_xpath(
f"//*[normalize-space()='vCPU Usage']/" "//*[normalize-space()='vCPU Usage']/"
f"ancestor::div[contains(@class,'d3_quota_bar')]" # noqa: E231 "ancestor::div[contains(@class,'d3_quota_bar')]" # noqa: E231
f"/div[contains(@class,'h6')]/" # noqa: E231 "/div[contains(@class,'h6')]/" # noqa: E231
f"span[2]").text == str(p['vcpus_capacity'])) "span[2]").text == str(p['vcpus_capacity']))
assert (driver.find_element_by_xpath( assert (driver.find_element_by_xpath(
f"//*[normalize-space()='pCPU Usage']/" "//*[normalize-space()='pCPU Usage']/"
f"ancestor::div[contains(@class,'d3_quota_bar')]" # noqa: E231 "ancestor::div[contains(@class,'d3_quota_bar')]" # noqa: E231
f"/div[contains(@class,'h6')]/" # noqa: E231 "/div[contains(@class,'h6')]/" # noqa: E231
f"span[1]").text == str(p['pcpus_used'])) "span[1]").text == str(p['pcpus_used']))
assert (driver.find_element_by_xpath( assert (driver.find_element_by_xpath(
f"//*[normalize-space()='pCPU Usage']/" "//*[normalize-space()='pCPU Usage']/"
f"ancestor::div[contains(@class,'d3_quota_bar')]" # noqa: E231 "ancestor::div[contains(@class,'d3_quota_bar')]" # noqa: E231
f"/div[contains(@class,'h6')]/" # noqa: E231 "/div[contains(@class,'h6')]/" # noqa: E231
f"span[2]").text == str(p['pcpus_capacity'])) "span[2]").text == str(p['pcpus_capacity']))
driver.find_element_by_link_text("Resource Provider").click() driver.find_element_by_link_text("Resource Provider").click()
resource_provider_tab = driver.find_element_by_id( resource_provider_tab = driver.find_element_by_id(

View File

@@ -37,7 +37,8 @@ def test_switch_to_material_theme(live_server, driver, user, config):
driver.find_element_by_css_selector(".navbar-default"))) driver.find_element_by_css_selector(".navbar-default")))
options = user_dropdown_menu.find_element_by_css_selector( options = user_dropdown_menu.find_element_by_css_selector(
"ul.dropdown-menu[id='editor_list']") "ul.dropdown-menu[id='editor_list']")
options.find_element_by_xpath(f".//*[normalize-space()='Material']").click() options.find_element_by_xpath(
".//*[normalize-space()='Material']").click()
WebDriverWait(driver, config.selenium.page_timeout).until( WebDriverWait(driver, config.selenium.page_timeout).until(
EC.visibility_of_element_located((By.CSS_SELECTOR, '.material-header'))) EC.visibility_of_element_located((By.CSS_SELECTOR, '.material-header')))
user_dropdown_menu = driver.find_element_by_css_selector( user_dropdown_menu = driver.find_element_by_css_selector(

View File

@@ -11,6 +11,7 @@
# under the License. # under the License.
from dataclasses import dataclass from dataclasses import dataclass
from selenium.common import exceptions from selenium.common import exceptions
from selenium.webdriver.common.by import By from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support import expected_conditions as EC

View File

@@ -18,7 +18,7 @@ deps =
-r{toxinidir}/test-requirements.txt -r{toxinidir}/test-requirements.txt
-r{toxinidir}/requirements.txt -r{toxinidir}/requirements.txt
# Unit test for a local hacking rule requires hacking. # Unit test for a local hacking rule requires hacking.
hacking>=3.0.1,<3.1.0 # Apache-2.0 hacking>=7.0.0,<7.1.0 # Apache-2.0
commands = commands =
dj42: pip install django>=4.2,<4.3 dj42: pip install django>=4.2,<4.3
find . -type f -name "*.pyc" -delete find . -type f -name "*.pyc" -delete
@@ -30,7 +30,7 @@ commands = {posargs}
[testenv:pep8] [testenv:pep8]
deps = deps =
{[testenv]deps} {[testenv]deps}
flake8-import-order==0.12 # LGPLv3 flake8-import-order>=0.18.0,<0.19.0 # LGPLv3
pylint==3.3.1 # GPLv2 pylint==3.3.1 # GPLv2
bandit[baseline]>=1.7.7 # Apache-2.0 bandit[baseline]>=1.7.7 # Apache-2.0
setenv = setenv =
@@ -198,7 +198,9 @@ exclude = .git,.tox,dist,*lib/python*,*egg,build,panel_template,dash_template,lo
# Existing codes follows W503, so we disable W504.) # Existing codes follows W503, so we disable W504.)
# F405 TEMPLATES may be undefined, or defined from star imports # F405 TEMPLATES may be undefined, or defined from star imports
# (because it is not easy to avoid this in openstack_dashboard.test.settings) # (because it is not easy to avoid this in openstack_dashboard.test.settings)
ignore = W504,F405 # I201 Missing newline between import groups.
# I202 Additional newline in a group of imports.
ignore = W504,F405,I201,I202
# Enable the following hacking rules which are disabled by default # Enable the following hacking rules which are disabled by default
# H106 Do not put vim configuration in source files. # H106 Do not put vim configuration in source files.
# H203 Use assertIs(Not)None to check for None. # H203 Use assertIs(Not)None to check for None.