Source code for stepler.horizon.tests.test_volumes

"""
------------
Volume tests
------------
"""

# 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.

import pytest

from stepler import config
from stepler.third_party import utils


@pytest.mark.usefixtures('any_one')
[docs]class TestAnyOne(object): """Tests for any user.""" @pytest.mark.idempotent_id('4e0dd745-6654-4503-bc34-3cba858709fd', any_one='admin') @pytest.mark.idempotent_id('bba8fd16-44e6-437a-9c10-c8ebf3414f4e', any_one='user')
[docs] def test_edit_volume(self, volume, volumes_steps_ui): """**Scenario:** Verify that user can edit volume. **Setup:** #. Create volume using API **Steps:** #. Edit volume name using UI **Teardown:** #. Delete volume using API """ new_name = volume.name + ' (updated)' volumes_steps_ui.edit_volume(volume_name=volume.name, new_volume_name=new_name)
@pytest.mark.smoke @pytest.mark.idempotent_id('e4c1eab9-ddf4-4a75-915e-81e3886ac27b', any_one='admin', volumes=1) @pytest.mark.idempotent_id('5f7f4fac-a19b-481a-9c61-18c1923cfa7d', any_one='admin', volumes=2) @pytest.mark.idempotent_id('e71f4484-7c03-4dd9-a087-1217a86278a8', any_one='user', volumes=1) @pytest.mark.idempotent_id('d4258de3-ab3c-4460-986e-e68e8801c43f', any_one='user', volumes=2) @pytest.mark.parametrize('volumes', [1, 2], indirect=True)
[docs] def test_delete_volumes(self, volumes, volumes_steps_ui): """**Scenario:** Verify that user can delete volumes as bunch. **Setup:** #. Create volumes using API **Steps:** #. Delete volume as bunch using UI """ volumes_names = [volume.name for volume in volumes] volumes_steps_ui.delete_volumes(volumes_names)
@pytest.mark.idempotent_id('ff2319a8-5918-4821-ad69-8729a51e3d4e', any_one='admin') @pytest.mark.idempotent_id('1a6f8444-4486-41aa-85f4-1dd41c62ff30', any_one='user') @pytest.mark.parametrize('volumes', [3], ids=[''], indirect=True)
[docs] def test_volumes_pagination(self, volume_steps, volumes, volumes_steps_ui, update_settings): """**Scenario:** Verify that volumes pagination works right and back. **Setup:** #. Create some volumes using API **Steps:** #. Update ``items_per_page`` parameter to 1 using UI #. Check volumes pagination using UI **Teardown:** #. Delete volumes using API """ volumes_names = [volume.name or volume.id for volume in volume_steps.get_volumes()] update_settings(items_per_page=1) volumes_steps_ui.check_volumes_pagination(volumes_names)
@pytest.mark.idempotent_id('67ac61fb-63ec-4f83-a88a-553fb3b21a3c', any_one='admin') @pytest.mark.idempotent_id('b08c7894-8a17-4f22-92c9-107dd8bf19f5', any_one='user')
[docs] def test_view_volume(self, volume, volumes_steps_ui): """**Scenario:** Verify that user can view volume info. **Setup:** #. Create volume using API **Steps:** #. View volume using UI **Teardown:** #. Delete volume using API """ volumes_steps_ui.view_volume(volume.name)
@pytest.mark.smoke @pytest.mark.idempotent_id('65272c3b-c2ea-42e6-91ac-f1daa43fdbfc', any_one='admin') @pytest.mark.idempotent_id('a4ab8682-eed6-4d00-8975-4289e2aac4d3', any_one='user')
[docs] def test_upload_volume_to_image(self, volume, images_steps_ui, volumes_steps_ui): """**Scenario:** Verify that user can upload volume to image. **Setup:** #. Create volume using API **Steps:** #. Upload volume to image using UI #. Check image presence #. Delete image using UI **Teardown:** #. Delete volume using API """ image_name = next(utils.generate_ids(length=20)) volumes_steps_ui.upload_volume_to_image(volume.name, image_name) images_steps_ui.check_image_present(image_name, timeout=30) images_steps_ui.delete_image(image_name)
@pytest.mark.idempotent_id('e343b260-b840-4345-ab19-8dabee3478c7', any_one='admin') @pytest.mark.idempotent_id('eaa7d1e6-15ca-4fbc-b3cd-f0959e39ff54', any_one='user')
[docs] def test_volume_extend(self, volume, volumes_steps_ui): """**Scenario:** Verify that user can extend volume size. **Setup:** #. Create volume using API **Steps:** #. Extend volume using UI **Teardown:** #. Delete volume using API """ volumes_steps_ui.extend_volume(volume.name)
@pytest.mark.idempotent_id('cdb362e0-4447-4f89-9af2-5e6f0e80e859', any_one='admin') @pytest.mark.idempotent_id('fb043d55-47e5-48fb-8ae0-c4bc860742a8', any_one='user')
[docs] def test_create_volume_with_description(self, volumes_steps_ui): """**Scenario:** Create volume with description. **Steps:** #. Create volume with description using UI #. Check that volume created #. Check that description is correct **Teardown:** #. Delete volume using API """ volume_description = next(utils.generate_ids('volume_description')) volumes_steps_ui.create_volume(description=volume_description)
@pytest.mark.idempotent_id('4e019917-e519-4fbd-956d-5b5df83a5de1', any_one='admin') @pytest.mark.idempotent_id('e2548571-e376-44e9-a6db-9f533b5d7c81', any_one='user')
[docs] def test_create_bigger_volume_from_volume(self, volume, volumes_steps_ui): """**Scenario:** Create bigger volume from another volume. **Setup:** #. Create volume using API **Steps:** #. Create volume from created volume with bigger size using UI #. Check that volume is created **Teardown:** #. Delete volumes """ volumes_steps_ui.create_volume(source_type=config.VOLUME_SOURCE, source_name=volume.name, volume_size=volume.size + 1)
@pytest.mark.idempotent_id('c610a22c-526a-11e7-9fdb-538e13598424', any_one='admin') @pytest.mark.idempotent_id('c6b3f850-526a-11e7-9d93-2f5597efa1db', any_one='user')
[docs] def test_default_migration_policy(self, volume, volumes_steps_ui): """Verify that Migration Policy is `On Demand` by default. **Setup:** #. Create volume using API **Steps:** #. Check that Migration policy is `On Demand` by default when user changes volume type **Teardown:** #. Delete volume using API """ volumes_steps_ui.check_default_migration_policy(volume.name)
@pytest.mark.idempotent_id('8be65f7b-2d6e-4bb7-84e8-9e04c2199257', any_one='admin') @pytest.mark.idempotent_id('4573a93c-31ef-490d-ab1e-2e148c89bda4', any_one='user')
[docs] def test_create_volume_with_escaped_symbols(self, volumes_steps_ui): """**Scenario:** Create volume and snapshot with escaped symbols. **Steps:** #. Create volume with specific name using UI #. Create volume snapshot with the same name as volume **Teardown:** #. Delete snapshot using API #. Delete volume using API """ name = """'""" volumes_steps_ui.create_volume(volume_name=name) volumes_steps_ui.create_snapshot(volume_name=name, snapshot_name=name)
@pytest.mark.usefixtures('admin_only')
[docs]class TestAdminOnly(object): """Tests for admin only.""" @pytest.mark.smoke @pytest.mark.idempotent_id('0374870e-5d84-4574-a114-cf78db640c26')
[docs] def test_launch_volume_as_instance(self, bootable_volume, instances_steps_ui, volumes_steps_ui): """**Scenario:** Verify that admin can launch volume as instance. **Setup:** #. Create bootable volume using API **Steps:** #. Launch volume as instance using UI #. Change that instance status is ``Active`` using UI #. Delete instance using UI **Teardown:** #. Delete volume using API """ instance_name = next(utils.generate_ids('instance')) volumes_steps_ui.launch_volume_as_instance( bootable_volume.name, instance_name, network_name=config.INTERNAL_NETWORK_NAME) instances_steps_ui.check_instance_active(instance_name) instances_steps_ui.delete_instance(instance_name)
@pytest.mark.idempotent_id('1a8ee83f-e741-462c-af4f-e15b233daca4')
[docs] def test_change_volume_status(self, volume, volumes_steps_ui): """**Scenario:** Verify that admin can change volume status. **Setup:** #. Create volume using API **Steps:** #. Change volume status to ``Error`` using UI #. Change volume status to ``Available`` using UI **Teardown:** #. Delete volume using API """ volumes_steps_ui.change_volume_status(volume.name, 'Error') volumes_steps_ui.change_volume_status(volume.name, 'Available')
@pytest.mark.smoke @pytest.mark.idempotent_id('371badd3-a2f7-484d-9fdb-9ad06d431623')
[docs] def test_manage_volume_attachments(self, volume, server, volumes_steps_ui): """**Scenario:** Verify that admin can manage volume attachments. **Setup:** #. Create volume using API #. Create server using API **Steps:** #. Attach server to volume using UI #. Detach server from volume using UI **Teardown:** #. Delete server using API #. Delete volume using API """ volumes_steps_ui.attach_instance(volume.name, server.name) volumes_steps_ui.detach_instance(volume.name, server.name)
@pytest.mark.idempotent_id('32b295cd-fbd0-44c1-b7b9-175f5ad7434c')
[docs] def test_transfer_volume(self, volume, auth_steps, volumes_steps_ui): """**Scenario:** Verify that volume can be transferred between users. **Setup:** #. Create volume using API **Steps:** #. Create volume transfer as ``admin`` user using UI #. Logout #. Login as ``user`` user #. Accept volume transfer using UI **Teardown:** #. Delete volume using API """ transfer_name = next(utils.generate_ids('transfer')) transfer_id, transfer_key = volumes_steps_ui.create_transfer( volume.name, transfer_name) auth_steps.logout() auth_steps.login(config.USER_NAME, config.USER_PASSWD) volumes_steps_ui.accept_transfer(transfer_id, transfer_key, volume.name)
@pytest.mark.idempotent_id('e585242-9443-4e78-a7fe-3ee6097459bb') @pytest.mark.requires('cinder_nodes_count >= 2')
[docs] def test_migrate_volume(self, volume, volumes_steps_ui): """**Scenario:** Verify that admin can migrate volume. **Setup:** #. Create volume using API **Steps:** #. Migrate volume to new host using UI #. Migrate volume to old host using UI **Teardown:** #. Delete volume using API """ old_host, _ = volumes_steps_ui.migrate_volume(volume.name) volumes_steps_ui.migrate_volume(volume.name, old_host)
@pytest.mark.idempotent_id('f9632117-d130-4171-8b61-2ada6c9e2f55')
[docs] def test_volume_present_in_admin_volumes(self, volumes_steps_ui, volume): """**Scenario:** Verify that volume present in admin volumes. **Setup:** #. Create volume using API **Steps:** #. Check that volume present in admin volumes **Teardown:** #. Delete volume using API """ volumes_steps_ui.check_volume_present_in_admin_volume(volume.name)
@pytest.mark.idempotent_id('d923893c-5fe0-11e7-bfb3-5404a69126b9')
[docs] def test_container_name_volume_backup(self, volume, containers_steps_ui, volumes_steps_ui): """**Scenario:** Verify that container has name 'volumebackups'. **Setup:** #. Create volume using API **Steps:** #. Create volume backup without container name #. Check that container has name 'volumebackups' **Teardown:** #. Delete volume using API """ volumes_steps_ui.create_backup(volume.name) containers_steps_ui.check_container_name_volume_backups()
@pytest.mark.idempotent_id('b3db692c-a132-4450-ba3b-6ab6c66c3846')
[docs] def test_change_volume_type(self, volume_type, volume, volumes_steps_ui): """**Scenario:** Verify that user can change volume type. **Setup:** #. Create volume using API #. Create volume type using API **Steps:** #. Change volume type using UI **Teardown:** #. Delete volume using API #. Delete volume type using API """ volumes_steps_ui.change_volume_type(volume.name, volume_type.name)
@pytest.mark.usefixtures('user_only')
[docs]class TestUserOnly(object): """Tests for user only.""" @pytest.mark.smoke @pytest.mark.idempotent_id('439e8ca5-0d87-49aa-9458-a239fa6ff1e1')
[docs] def test_launch_volume_as_instance(self, instances_steps_ui, bootable_volume_with_private_image, volumes_steps_ui): """**Scenario:** Verify that admin can launch volume as instance. **Setup:** #. Create bootable volume using API **Steps:** #. Launch volume as instance using UI #. Change that instance status is ``Active`` using UI #. Delete instance using UI **Teardown:** #. Delete volume using API """ instance_name = next(utils.generate_ids('instance')) volumes_steps_ui.launch_volume_as_instance( bootable_volume_with_private_image.name, instance_name, network_name=config.INTERNAL_NETWORK_NAME) instances_steps_ui.check_instance_active(instance_name) instances_steps_ui.delete_instance(instance_name)