From 1c10d9433d7c58e21db569817ae31b64841a5b6d Mon Sep 17 00:00:00 2001 From: Michael Dovgal Date: Thu, 8 Dec 2016 17:05:29 +0200 Subject: [PATCH] Add volume backup tempest tests Tempest tests that are added: 1) test volume snapshot backup 2) test backup create and restore to an existing volume This test can reproduce the bug that is related. 3) test incremental backup Co-Authored-By: Oleksii Butenko Related-Bug: #1335889 Change-Id: Iff857ee11ed15665315077a0ba22cf31f92efe4b --- .../tempest/api/volume/test_volume_backup.py | 142 ++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 cinder/tests/tempest/api/volume/test_volume_backup.py diff --git a/cinder/tests/tempest/api/volume/test_volume_backup.py b/cinder/tests/tempest/api/volume/test_volume_backup.py new file mode 100644 index 0000000..dc4090b --- /dev/null +++ b/cinder/tests/tempest/api/volume/test_volume_backup.py @@ -0,0 +1,142 @@ +# Copyright (c) 2016 Mirantis Inc. +# All Rights Reserved. +# +# 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_config import cfg +import testtools + +from tempest.api.volume import base as volume_base +from tempest.common import waiters +from tempest import config +from tempest.lib.common.utils import data_utils +from tempest import test + +# TODO(obutenko): Remove this when liberty-eol happens. +snapshot_backup_opt = cfg.BoolOpt('snapshot_backup', + default=False, + help='Creating backup from snapshot not ' + 'implemented in Liberty.') + +CONF = config.CONF +CONF.register_opt(snapshot_backup_opt, group='volume-feature-enabled') + + +class VolumesBackupsTest(volume_base.BaseVolumeTest): + + @classmethod + def skip_checks(cls): + super(VolumesBackupsTest, cls).skip_checks() + if not CONF.volume_feature_enabled.backup: + raise cls.skipException("Cinder backup feature disabled") + + @testtools.skipUnless(CONF.volume_feature_enabled.snapshot_backup, + "Skip. Not implemented in Liberty.") + @test.idempotent_id('885410c6-cd1d-452c-a409-7c32b7e0be15') + def test_volume_snapshot_backup(self): + """Create backup from snapshot.""" + volume = self.create_volume() + # Create snapshot + snapshot = self.create_snapshot(volume['id']) + # Create backup + backup = self.create_backup( + volume_id=volume['id'], + snapshot_id=snapshot['id']) + # Get a given backup + backup = self.backups_client.show_backup( + backup['id'])['backup'] + waiters.wait_for_backup_status( + self.backups_client, + backup['id'], 'available') + self.assertEqual(volume['id'], backup['volume_id']) + self.assertEqual(snapshot['id'], backup['snapshot_id']) + + self.snapshots_client.delete_snapshot(snapshot['id']) + self.snapshots_client.wait_for_resource_deletion(snapshot['id']) + + self.volumes_client.delete_volume(volume['id']) + self.volumes_client.wait_for_resource_deletion(volume['id']) + + @test.idempotent_id('b5d837b0-7066-455d-88fc-4a721a899306') + def test_backup_create_and_restore_to_an_existing_volume(self): + """Test backup create and restore to an existing volume.""" + # Create volume + src_vol = self.create_volume() + self.addCleanup(self.volumes_client.delete_volume, + src_vol['id']) + # Create backup + backup = self.backups_client.create_backup( + volume_id=src_vol['id'])['backup'] + self.addCleanup(self.backups_client.delete_backup, backup['id']) + waiters.wait_for_backup_status( + self.backups_client, + backup['id'], 'available') + # Restore to existing volume + restore = self.backups_client.restore_backup( + backup_id=backup['id'], + volume_id=src_vol['id'])['restore'] + waiters.wait_for_backup_status( + self.backups_client, + backup['id'], 'available') + waiters.wait_for_volume_status( + self.volumes_client, + src_vol['id'], 'available') + self.assertEqual(src_vol['id'], restore['volume_id']) + self.assertEqual(backup['id'], restore['backup_id']) + + @test.idempotent_id('c810fe2c-cb40-43ab-96aa-471b74516a98') + def test_incremental_backup(self): + """Test create incremental backup.""" + # Create volume from image + volume = self.create_volume(size=CONF.volume.volume_size, + imageRef=CONF.compute.image_ref) + self.addCleanup(self.volumes_client.delete_volume, + volume['id']) + + # Create backup + backup = self.backups_client.create_backup( + volume_id=volume['id'])['backup'] + waiters.wait_for_backup_status(self.backups_client, + backup['id'], + 'available') + # Create a server + bd_map = [{'volume_id': volume['id'], + 'delete_on_termination': '0'}] + + server_name = data_utils.rand_name('instance') + server = self.create_server( + name=server_name, + block_device_mapping=bd_map, + wait_until='ACTIVE') + + # Delete VM + self.servers_client.delete_server(server['id']) + # Create incremental backup + waiters.wait_for_volume_status(self.volumes_client, volume['id'], + 'available') + backup_incr = self.backups_client.create_backup( + volume_id=volume['id'], + incremental=True)['backup'] + + waiters.wait_for_backup_status(self.backups_client, + backup_incr['id'], + 'available') + + is_incremental = self.backups_client.show_backup( + backup_incr['id'])['backup']['is_incremental'] + self.assertTrue(is_incremental) + + self.backups_client.delete_backup(backup_incr['id']) + self.backups_client.wait_for_resource_deletion(backup_incr['id']) + self.backups_client.delete_backup(backup['id']) + self.backups_client.wait_for_resource_deletion(backup['id'])