diff --git a/openstack_dashboard/test/selenium/integration/test_host_aggregates.py b/openstack_dashboard/test/selenium/integration/test_host_aggregates.py new file mode 100644 index 0000000000..88676799dc --- /dev/null +++ b/openstack_dashboard/test/selenium/integration/test_host_aggregates.py @@ -0,0 +1,105 @@ +# 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 oslo_utils import uuidutils +import pytest + +from openstack_dashboard.test.selenium import widgets + + +@pytest.fixture +def host_aggregate_name(): + return 'horizon_host_aggregate_%s' % uuidutils.generate_uuid(dashed=False) + + +@pytest.fixture +def new_host_aggregate(host_aggregate_name, openstack_admin): + host_aggregate = openstack_admin.compute.post( + "/os-aggregates", + json={ + "aggregate": { + "name": host_aggregate_name + } + } + ).json() + yield host_aggregate + openstack_admin.compute.delete( + f"/os-aggregates/{host_aggregate['aggregate']['id']}") + + +@pytest.fixture +def clear_host_aggregate(host_aggregate_name, openstack_admin): + yield None + host_aggregates_sdk = openstack_admin.compute.get( + "/os-aggregates").json()['aggregates'] + host_aggregate_id = None + for host_aggregate in host_aggregates_sdk: + if host_aggregate['name'] == host_aggregate_name: + host_aggregate_id = host_aggregate['id'] + break + openstack_admin.compute.delete(f"/os-aggregates/{host_aggregate_id}") + + +def test_create_host_aggregate(login, driver, openstack_admin, config, + host_aggregate_name, clear_host_aggregate): + login('admin') + url = '/'.join(( + config.dashboard.dashboard_url, + 'admin', + 'aggregates', + )) + driver.get(url) + driver.find_element_by_link_text("Create Host Aggregate").click() + host_aggregate_form = driver.find_element_by_css_selector( + "form .modal-content") + host_aggregate_form.find_element_by_id("id_name").send_keys( + host_aggregate_name) + host_aggregate_form.find_element_by_css_selector( + ".btn-primary[value='Create Host Aggregate']").click() + messages = widgets.get_and_dismiss_messages(driver) + assert(f'Success: Created new host aggregate "{host_aggregate_name}".' + in messages) + is_host_aggregate_created_sdk = False + host_aggregates_sdk = openstack_admin.compute.get( + "/os-aggregates").json()['aggregates'] + for host_aggregate in host_aggregates_sdk: + if host_aggregate['name'] == host_aggregate_name: + is_host_aggregate_created_sdk = True + assert is_host_aggregate_created_sdk + + +def test_delete_host_aggregate(login, driver, openstack_admin, config, + new_host_aggregate): + login('admin') + url = '/'.join(( + config.dashboard.dashboard_url, + 'admin', + 'aggregates' + )) + driver.get(url) + rows = driver.find_elements_by_css_selector( + f"table#host_aggregates tr[data-display=" + f"'{new_host_aggregate['aggregate']['name']}']") + assert len(rows) == 1 + actions_column = rows[0].find_element_by_css_selector("td.actions_column") + widgets.select_from_dropdown(actions_column, "Delete Host Aggregate") + widgets.confirm_modal(driver) + messages = widgets.get_and_dismiss_messages(driver) + assert(f"Success: Deleted Host Aggregate: " + f"{new_host_aggregate['aggregate']['name']}" in messages) + is_host_aggregate_deleted_sdk = True + host_aggregates_sdk = openstack_admin.compute.get( + "/os-aggregates").json()['aggregates'] + for host_aggregate in host_aggregates_sdk: + if host_aggregate['name'] == new_host_aggregate['aggregate']['name']: + is_host_aggregate_deleted_sdk = False + assert is_host_aggregate_deleted_sdk