diff --git a/openstack_dashboard/test/selenium/integration/conftest.py b/openstack_dashboard/test/selenium/integration/conftest.py index 490bb1c4ad..876f7f4bf2 100644 --- a/openstack_dashboard/test/selenium/integration/conftest.py +++ b/openstack_dashboard/test/selenium/integration/conftest.py @@ -14,6 +14,7 @@ import openstack as openstack_sdk from oslo_utils import uuidutils import pytest +from openstack_dashboard.test.selenium.integration import test_volumes from openstack_dashboard.test.selenium import widgets @@ -272,3 +273,14 @@ def new_volume_admin(volume_name, openstack_admin, config): name_or_id=vol, wait=True, ) + + +@pytest.fixture +def clear_volume_admin(volume_name, openstack_admin): + yield None + test_volumes.wait_for_steady_state_of_volume( + openstack_admin, volume_name[0]) + openstack_admin.delete_volume( + volume_name[0], + wait=True, + ) diff --git a/openstack_dashboard/test/selenium/integration/test_images.py b/openstack_dashboard/test/selenium/integration/test_images.py index 9279a7bc76..be06c34e06 100644 --- a/openstack_dashboard/test/selenium/integration/test_images.py +++ b/openstack_dashboard/test/selenium/integration/test_images.py @@ -18,8 +18,12 @@ import pytest from oslo_utils import uuidutils +from openstack_dashboard.test.selenium.integration import test_instances from openstack_dashboard.test.selenium import widgets +# Imported fixtures +clear_instance_admin = test_instances.clear_instance_admin + @pytest.fixture(params=[1]) def image_names(request): @@ -431,3 +435,112 @@ def test_edit_image_description_admin(login, driver, image_names, image_id = new_image_admin.id assert (openstack_admin.compute.get(f"/images/{image_id}").json( )['image']['metadata']['description'] == new_description) + + +def test_update_image_metadata_admin(login, driver, + new_image_admin, config, + openstack_admin): + new_metadata = { + 'metadata1': 'img_metadata%s' % uuidutils.generate_uuid(dashed=False), + 'metadata2': 'img_metadata%s' % uuidutils.generate_uuid(dashed=False) + } + image_name = new_image_admin.name + login('admin', 'admin') + url = '/'.join(( + config.dashboard.dashboard_url, + 'project', + 'images', + )) + driver.get(url) + rows = driver.find_elements_by_xpath(f"//a[text()='{image_name}']") + assert len(rows) == 1 + actions_column = rows[0].find_element_by_xpath( + ".//ancestor::tr/td[contains(@class,'actions_column')]") + widgets.select_from_dropdown(actions_column, "Update Metadata") + image_form = driver.find_element_by_css_selector(".modal-content") + for name, value in new_metadata.items(): + image_form.find_element_by_xpath( + "//input[@name='customItem']").send_keys(name) + image_form.find_element_by_css_selector( + "button.btn span[class='fa fa-plus']").click() + image_form.find_element_by_xpath( + f"//span[@title='{name}']/parent::div/input").send_keys(value) + image_form.find_element_by_xpath( + "//button[@ng-click='modal.save()']").click() + messages = widgets.get_and_dismiss_messages(driver) + assert f"Success: Metadata was successfully updated." in messages + image_id = new_image_admin.id + for name, value in new_metadata.items(): + assert (openstack_admin.compute.get(f"/images/{image_id}").json( + )['image']['metadata'][name] == value) + + +def test_launch_instance_from_image_admin(complete_default_test_network, login, + driver, instance_name, + clear_instance_admin, new_image_admin, + config, openstack_admin): + image_name = new_image_admin.name + network = complete_default_test_network.name + flavor = config.launch_instances.flavor + login('admin', 'admin') + url = '/'.join(( + config.dashboard.dashboard_url, + 'project', + 'images', + )) + driver.get(url) + rows = driver.find_elements_by_xpath(f"//a[text()='{image_name}']") + assert len(rows) == 1 + rows[0].find_element_by_xpath( + "//ng-transclude[normalize-space()='Launch']").click() + wizard = driver.find_element_by_css_selector("wizard") + navigation = wizard.find_element_by_css_selector("div.wizard-nav") + widgets.find_already_visible_element_by_xpath( + ".//*[@id='name']", wizard).send_keys(instance_name) + navigation.find_element_by_link_text("Networks").click() + network_table = wizard.find_element_by_css_selector( + "ng-include[ng-form=launchInstanceNetworkForm]" + ) + widgets.select_from_transfer_table(network_table, network) + navigation.find_element_by_link_text("Flavor").click() + flavor_table = wizard.find_element_by_css_selector( + "ng-include[ng-form=launchInstanceFlavorForm]" + ) + widgets.select_from_transfer_table(flavor_table, flavor) + navigation.find_element_by_link_text("Source").click() + source_table = wizard.find_element_by_css_selector( + "ng-include[ng-form=launchInstanceSourceForm]" + ) + test_instances.delete_volume_on_instance_delete(source_table, "Yes") + wizard.find_element_by_css_selector( + "button.btn-primary.finish").click() + messages = widgets.get_and_dismiss_messages(driver) + assert f"Info: Scheduled creation of 1 instance." in messages + assert openstack_admin.compute.find_server(instance_name) is not None + + +def test_create_volume_from_image_admin(login, driver, volume_name, + new_image_admin, clear_volume_admin, + config, openstack_admin): + volume_name = volume_name[0] + image_name = new_image_admin.name + login('admin', 'admin') + url = '/'.join(( + config.dashboard.dashboard_url, + 'project', + 'images', + )) + driver.get(url) + rows = driver.find_elements_by_xpath(f"//a[text()='{image_name}']") + assert len(rows) == 1 + actions_column = rows[0].find_element_by_xpath( + ".//ancestor::tr/td[contains(@class,'actions_column')]") + widgets.select_from_dropdown(actions_column, "Create Volume") + name_field = driver.find_element_by_xpath("//input[@name='name']") + name_field.clear() + name_field.send_keys(volume_name) + driver.find_element_by_xpath( + "//button[@class='btn btn-primary finish']").click() + messages = widgets.get_and_dismiss_messages(driver) + assert f"Info: Creating volume {volume_name}" in messages + assert openstack_admin.block_storage.find_volume(volume_name) is not None diff --git a/openstack_dashboard/test/selenium/integration/test_volumes.py b/openstack_dashboard/test/selenium/integration/test_volumes.py index 3d8b8264b1..52326a2b53 100644 --- a/openstack_dashboard/test/selenium/integration/test_volumes.py +++ b/openstack_dashboard/test/selenium/integration/test_volumes.py @@ -34,16 +34,6 @@ def clear_volume_demo(volume_name, openstack_demo): ) -@pytest.fixture -def clear_volume_admin(volume_name, openstack_admin): - yield None - wait_for_steady_state_of_volume(openstack_admin, volume_name[0]) - openstack_admin.delete_volume( - volume_name[0], - wait=True, - ) - - def wait_for_steady_state_of_volume(openstack, volume_name): for attempt in range(120): if (openstack.block_storage.find_volume(volume_name).status in @@ -82,8 +72,10 @@ def test_create_empty_volume_demo(login, driver, volume_name, openstack_demo, assert openstack_demo.block_storage.find_volume(volume_name) is not None -def test_create_volume_from_image_demo(login, driver, volume_name, config, - clear_volume_demo, openstack_demo): +def test_create_volume_via_vol_source_image_demo(login, driver, + volume_name, config, + clear_volume_demo, + openstack_demo): image_source_name = config.launch_instances.image_name volume_name = volume_name[0] login('user') @@ -402,8 +394,9 @@ def test_create_empty_volume_admin(login, driver, volume_name, openstack_admin, assert openstack_admin.block_storage.find_volume(volume_name) is not None -def test_create_volume_from_image_admin(login, driver, volume_name, config, - clear_volume_admin, openstack_admin): +def test_create_volume_via_vol_source_image_admin(login, driver, volume_name, + config, clear_volume_admin, + openstack_admin): image_source_name = config.launch_instances.image_name volume_name = volume_name[0] login('admin')