315 lines
12 KiB
Python
315 lines
12 KiB
Python
# 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 volume_type_name():
|
|
return 'horizon_volume_type_%s' % uuidutils.generate_uuid(dashed=False)
|
|
|
|
|
|
@pytest.fixture
|
|
def new_volume_type(volume_type_name, openstack_admin):
|
|
volume_type = openstack_admin.block_storage.create_type(
|
|
name=volume_type_name
|
|
)
|
|
yield volume_type
|
|
openstack_admin.block_storage.delete_type(volume_type)
|
|
|
|
|
|
@pytest.fixture
|
|
def clear_volume_type(volume_type_name, openstack_admin):
|
|
yield None
|
|
openstack_admin.block_storage.delete_type(
|
|
openstack_admin.block_storage.find_type(volume_type_name))
|
|
|
|
|
|
@pytest.fixture
|
|
def new_volume_type_with_encryption(new_volume_type, openstack_admin):
|
|
openstack_admin.block_storage.create_type_encryption(
|
|
volume_type=new_volume_type,
|
|
control_location="front-end",
|
|
provider="plain",
|
|
)
|
|
yield new_volume_type
|
|
|
|
|
|
@pytest.fixture
|
|
def qos_spec_name():
|
|
return 'horizon_qos_spec_%s' % uuidutils.generate_uuid(dashed=False)
|
|
|
|
|
|
@pytest.fixture
|
|
def new_qos_spec(qos_spec_name, openstack_admin):
|
|
qos_spec = openstack_admin.block_storage.post(
|
|
"/qos-specs",
|
|
json={
|
|
"qos_specs": {
|
|
"name": qos_spec_name,
|
|
"consumer": "back-end",
|
|
}
|
|
}
|
|
).json()
|
|
yield qos_spec['qos_specs']
|
|
openstack_admin.block_storage.delete(
|
|
f"/qos-specs/{qos_spec['qos_specs']['id']}")
|
|
|
|
|
|
@pytest.fixture
|
|
def clear_qos_spec(qos_spec_name, openstack_admin):
|
|
yield None
|
|
qos_specs = openstack_admin.block_storage.get(
|
|
"/qos-specs").json()['qos_specs']
|
|
qos_spec_id = None
|
|
for spec in qos_specs:
|
|
if spec['name'] == qos_spec_name:
|
|
qos_spec_id = spec['id']
|
|
break
|
|
openstack_admin.block_storage.delete(f"/qos-specs/{qos_spec_id}")
|
|
|
|
|
|
@pytest.fixture
|
|
def new_qos_spec_with_extra_specs(new_qos_spec, openstack_admin):
|
|
openstack_admin.block_storage.put(
|
|
f"/qos-specs/{new_qos_spec['id']}",
|
|
json={
|
|
"qos_specs": {
|
|
"maxIOPS": "5000"
|
|
}
|
|
}
|
|
).json()
|
|
yield new_qos_spec
|
|
|
|
|
|
def test_create_volume_type(login, driver, volume_type_name, openstack_admin,
|
|
config, clear_volume_type):
|
|
login('admin')
|
|
url = '/'.join((
|
|
config.dashboard.dashboard_url,
|
|
'admin',
|
|
'volume_types'
|
|
))
|
|
driver.get(url)
|
|
driver.find_element_by_link_text("Create Volume Type").click()
|
|
volume_type_form = driver.find_element_by_css_selector(".modal-dialog form")
|
|
volume_type_form.find_element_by_id("id_name").send_keys(volume_type_name)
|
|
volume_type_form.find_element_by_css_selector(".btn-primary").click()
|
|
messages = widgets.get_and_dismiss_messages(driver)
|
|
assert(f'Success: Successfully created volume '
|
|
f'type: {volume_type_name}' in messages)
|
|
assert openstack_admin.block_storage.find_type(volume_type_name) is not None
|
|
|
|
|
|
def test_delete_volume_type(login, driver, volume_type_name, openstack_admin,
|
|
config, new_volume_type):
|
|
login('admin')
|
|
url = '/'.join((
|
|
config.dashboard.dashboard_url,
|
|
'admin',
|
|
'volume_types'
|
|
))
|
|
driver.get(url)
|
|
rows = driver.find_elements_by_css_selector(
|
|
f"table#volume_types tr[data-display='{volume_type_name}']")
|
|
assert len(rows) == 1
|
|
actions_column = rows[0].find_element_by_css_selector("td.actions_column")
|
|
widgets.select_from_dropdown(actions_column, "Delete Volume Type")
|
|
widgets.confirm_modal(driver)
|
|
messages = widgets.get_and_dismiss_messages(driver)
|
|
assert f"Success: Deleted Volume Type: {volume_type_name}" in messages
|
|
assert openstack_admin.block_storage.find_type(volume_type_name) is None
|
|
|
|
|
|
def test_volume_type_create_encryption(login, driver, openstack_admin, config,
|
|
new_volume_type):
|
|
login('admin')
|
|
url = '/'.join((
|
|
config.dashboard.dashboard_url,
|
|
'admin',
|
|
'volume_types'
|
|
))
|
|
driver.get(url)
|
|
rows = driver.find_elements_by_css_selector(
|
|
f"table#volume_types tr[data-display='{new_volume_type.name}']")
|
|
assert len(rows) == 1
|
|
rows[0].find_element_by_css_selector(".data-table-action").click()
|
|
volume_type_form = driver.find_element_by_css_selector(".modal-dialog form")
|
|
volume_type_form.find_element_by_id("id_provider").send_keys("plain")
|
|
volume_type_form.find_element_by_css_selector(
|
|
".btn-primary[value='Create Volume Type Encryption']").click()
|
|
messages = widgets.get_and_dismiss_messages(driver)
|
|
assert(f"Success: Successfully created encryption for "
|
|
f"volume type: {new_volume_type.name}" in messages)
|
|
assert(openstack_admin.block_storage.get_type_encryption(
|
|
new_volume_type.id).provider == 'plain')
|
|
|
|
|
|
def test_volume_type_delete_encryption(login, driver, openstack_admin, config,
|
|
new_volume_type_with_encryption):
|
|
login('admin')
|
|
url = '/'.join((
|
|
config.dashboard.dashboard_url,
|
|
'admin',
|
|
'volume_types'
|
|
))
|
|
driver.get(url)
|
|
rows = driver.find_elements_by_css_selector(
|
|
f"table#volume_types tr[data-display="
|
|
f"'{new_volume_type_with_encryption.name}']")
|
|
assert len(rows) == 1
|
|
assert(openstack_admin.block_storage.get_type_encryption(
|
|
new_volume_type_with_encryption.id).provider == 'plain')
|
|
rows[0].find_element_by_css_selector(".data-table-action")
|
|
actions_column = rows[0].find_element_by_css_selector("td.actions_column")
|
|
widgets.select_from_dropdown(actions_column, "Delete Encryption")
|
|
widgets.confirm_modal(driver)
|
|
messages = widgets.get_and_dismiss_messages(driver)
|
|
assert(f"Success: Deleted Encryption: "
|
|
f"{new_volume_type_with_encryption.name}" in messages)
|
|
assert(openstack_admin.block_storage.get_type_encryption(
|
|
new_volume_type_with_encryption.id).provider is None)
|
|
|
|
|
|
def test_create_qos_spec(login, driver, qos_spec_name, openstack_admin,
|
|
config, clear_qos_spec):
|
|
login('admin')
|
|
url = '/'.join((
|
|
config.dashboard.dashboard_url,
|
|
'admin',
|
|
'volume_types'
|
|
))
|
|
driver.get(url)
|
|
driver.find_element_by_link_text("Create QoS Spec").click()
|
|
volume_qos_form = driver.find_element_by_css_selector(".modal-dialog form")
|
|
volume_qos_form.find_element_by_id("id_name").send_keys(qos_spec_name)
|
|
volume_qos_form.find_element_by_css_selector(".btn-primary").click()
|
|
messages = widgets.get_and_dismiss_messages(driver)
|
|
assert(f'Success: Successfully created QoS '
|
|
f'Spec: {qos_spec_name}' in messages)
|
|
qos_specs = openstack_admin.block_storage.get(
|
|
"/qos-specs").json()['qos_specs']
|
|
assert(len([spec for spec in qos_specs if qos_spec_name ==
|
|
spec['name']]) > 0)
|
|
|
|
|
|
def test_delete_qos_spec(login, driver, qos_spec_name, openstack_admin,
|
|
config, new_qos_spec):
|
|
login('admin')
|
|
url = '/'.join((
|
|
config.dashboard.dashboard_url,
|
|
'admin',
|
|
'volume_types'
|
|
))
|
|
driver.get(url)
|
|
rows = driver.find_elements_by_css_selector(
|
|
f"table#qos_specs tr[data-display='{qos_spec_name}']")
|
|
assert len(rows) == 1
|
|
actions_column = rows[0].find_element_by_css_selector("td.actions_column")
|
|
widgets.select_from_dropdown(actions_column, "Delete QoS Spec")
|
|
widgets.confirm_modal(driver)
|
|
messages = widgets.get_and_dismiss_messages(driver)
|
|
assert f"Success: Deleted QoS Spec: {qos_spec_name}" in messages
|
|
qos_specs = openstack_admin.block_storage.get(
|
|
"/qos-specs").json()['qos_specs']
|
|
assert(len([spec for spec in qos_specs if qos_spec_name ==
|
|
spec['name']]) == 0)
|
|
|
|
|
|
def test_edit_qos_spec_consumer(login, driver, openstack_admin, config,
|
|
new_qos_spec):
|
|
login('admin')
|
|
url = '/'.join((
|
|
config.dashboard.dashboard_url,
|
|
'admin',
|
|
'volume_types'
|
|
))
|
|
driver.get(url)
|
|
rows = driver.find_elements_by_css_selector(
|
|
f"table#qos_specs tr[data-display='{new_qos_spec['name']}']")
|
|
assert len(rows) == 1
|
|
assert(openstack_admin.block_storage.get(
|
|
f"/qos-specs/{new_qos_spec['id']}").json()['qos_specs']['consumer'] ==
|
|
'back-end')
|
|
actions_column = rows[0].find_element_by_css_selector("td.actions_column")
|
|
widgets.select_from_dropdown(actions_column, "Edit Consumer")
|
|
volume_qos_form = driver.find_element_by_css_selector(".modal-dialog form")
|
|
widgets.select_from_dropdown(volume_qos_form, 'front-end')
|
|
volume_qos_form.find_element_by_css_selector(".btn-primary").click()
|
|
messages = widgets.get_and_dismiss_messages(driver)
|
|
assert f"Success: Successfully modified QoS Spec consumer." in messages
|
|
assert(openstack_admin.block_storage.get(
|
|
f"/qos-specs/{new_qos_spec['id']}").json()['qos_specs']['consumer'] ==
|
|
'front-end')
|
|
|
|
|
|
def test_qos_spec_create_extra_specs(login, driver, openstack_admin, config,
|
|
new_qos_spec):
|
|
login('admin')
|
|
url = '/'.join((
|
|
config.dashboard.dashboard_url,
|
|
'admin',
|
|
'volume_types'
|
|
))
|
|
driver.get(url)
|
|
rows = driver.find_elements_by_css_selector(
|
|
f"table#qos_specs tr[data-display='{new_qos_spec['name']}']")
|
|
assert len(rows) == 1
|
|
rows[0].find_element_by_css_selector(".data-table-action").click()
|
|
driver.find_element_by_id("specs__action_create").click()
|
|
extra_specs_form = driver.find_element_by_css_selector(
|
|
".modal-dialog form[id='extra_spec_create_form']")
|
|
extra_specs_form.find_element_by_id("id_key").send_keys('minIOPS')
|
|
extra_specs_form.find_element_by_id("id_value").send_keys(20)
|
|
extra_specs_form.find_element_by_css_selector(".btn-primary").click()
|
|
messages = widgets.get_and_dismiss_messages(driver)
|
|
assert f'Success: Created spec "minIOPS".' in messages
|
|
assert(openstack_admin.block_storage.get(
|
|
f"/qos-specs/{new_qos_spec['id']}").json()['qos_specs']['specs'] ==
|
|
{'minIOPS': '20'})
|
|
|
|
|
|
def test_qos_spec_delete_extra_specs(login, driver, openstack_admin, config,
|
|
new_qos_spec_with_extra_specs):
|
|
login('admin')
|
|
url = '/'.join((
|
|
config.dashboard.dashboard_url,
|
|
'admin',
|
|
'volume_types'
|
|
))
|
|
driver.get(url)
|
|
rows = driver.find_elements_by_css_selector(
|
|
f'table#qos_specs tr[data-display="'
|
|
f'{new_qos_spec_with_extra_specs["name"]}"]')
|
|
assert len(rows) == 1
|
|
assert(openstack_admin.block_storage.get(
|
|
f"/qos-specs/{new_qos_spec_with_extra_specs['id']}").json()
|
|
['qos_specs']['specs'] == {'maxIOPS': '5000'})
|
|
rows[0].find_element_by_css_selector(".data-table-action").click()
|
|
volume_qos_form = driver.find_element_by_css_selector(".modal-dialog form")
|
|
rows_extra = volume_qos_form.find_elements_by_css_selector(
|
|
f"table#specs tr[data-display='maxIOPS']")
|
|
assert len(rows_extra) == 1
|
|
actions_column = rows_extra[0].find_element_by_css_selector(
|
|
"td.actions_column")
|
|
widgets.select_from_dropdown(actions_column, "Delete Spec")
|
|
driver.find_element_by_css_selector(
|
|
".modal-dialog .modal-footer .btn-danger").click()
|
|
messages = widgets.get_and_dismiss_messages(driver)
|
|
assert f"Success: Deleted Spec: maxIOPS" in messages
|
|
assert(openstack_admin.block_storage.get(
|
|
f"/qos-specs/{new_qos_spec_with_extra_specs['id']}").json()
|
|
['qos_specs']['specs'] == {})
|