blob: bfdb46942f3ce68b4920c8d931680fc96d31eaf0 [file] [log] [blame]
lkuchlan9dea88e2016-06-07 17:12:01 +03001# Copyright 2016 Red Hat, Inc.
2# All Rights Reserved.
3#
4# Licensed under the Apache License, Version 2.0 (the "License"); you may
5# not use this file except in compliance with the License. You may obtain
6# a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13# License for the specific language governing permissions and limitations
14# under the License.
15
16from tempest.api.volume import base
17from tempest.common.utils import data_utils
18from tempest.common import waiters
19from tempest import config
20from tempest import test
21
22CONF = config.CONF
23
24
25class VolumesBackupsV2Test(base.BaseVolumeTest):
26
27 @classmethod
28 def skip_checks(cls):
29 super(VolumesBackupsV2Test, cls).skip_checks()
30 if not CONF.volume_feature_enabled.backup:
31 raise cls.skipException("Cinder backup feature disabled")
32
lkuchlanc6e88a62016-12-08 17:12:31 +020033 def restore_backup(self, backup_id):
34 # Restore a backup
35 restored_volume = self.backups_client.restore_backup(
36 backup_id)['restore']
37
38 # Delete backup
39 self.addCleanup(self.volumes_client.delete_volume,
40 restored_volume['volume_id'])
41 self.assertEqual(backup_id, restored_volume['backup_id'])
42 waiters.wait_for_backup_status(self.backups_client,
43 backup_id, 'available')
44 waiters.wait_for_volume_status(self.volumes_client,
45 restored_volume['volume_id'],
46 'available')
47 return restored_volume
48
lkuchlanf8a66682016-06-16 14:49:19 +030049 @test.idempotent_id('a66eb488-8ee1-47d4-8e9f-575a095728c6')
50 def test_volume_backup_create_get_detailed_list_restore_delete(self):
51 # Create backup
lisalibf543c32016-08-24 17:11:20 +080052 volume = self.create_volume()
53 self.addCleanup(self.volumes_client.delete_volume,
54 volume['id'])
zhuflc6ce5392016-08-17 14:34:37 +080055 backup_name = data_utils.rand_name(
56 self.__class__.__name__ + '-Backup')
lkuchlana2beb492016-08-17 12:42:44 +030057 backup = self.create_backup(volume_id=volume['id'],
58 name=backup_name)
lkuchlanf8a66682016-06-16 14:49:19 +030059 self.assertEqual(backup_name, backup['name'])
60 waiters.wait_for_volume_status(self.volumes_client,
lisalibf543c32016-08-24 17:11:20 +080061 volume['id'], 'available')
lkuchlanf8a66682016-06-16 14:49:19 +030062
63 # Get a given backup
64 backup = self.backups_client.show_backup(backup['id'])['backup']
65 self.assertEqual(backup_name, backup['name'])
66
67 # Get all backups with detail
68 backups = self.backups_client.list_backups(
69 detail=True)['backups']
70 self.assertIn((backup['name'], backup['id']),
71 [(m['name'], m['id']) for m in backups])
72
lkuchlanc6e88a62016-12-08 17:12:31 +020073 self.restore_backup(backup['id'])
lkuchlanf8a66682016-06-16 14:49:19 +030074
lkuchlan9dea88e2016-06-07 17:12:01 +030075 @test.idempotent_id('07af8f6d-80af-44c9-a5dc-c8427b1b62e6')
76 @test.services('compute')
77 def test_backup_create_attached_volume(self):
78 """Test backup create using force flag.
79
80 Cinder allows to create a volume backup, whether the volume status
81 is "available" or "in-use".
82 """
83 # Create a server
lisalibf543c32016-08-24 17:11:20 +080084 volume = self.create_volume()
85 self.addCleanup(self.volumes_client.delete_volume,
86 volume['id'])
zhufl7867a6e2016-10-18 15:37:12 +080087 server = self.create_server(wait_until='ACTIVE')
lkuchlan9dea88e2016-06-07 17:12:01 +030088 # Attach volume to instance
89 self.servers_client.attach_volume(server['id'],
lisalibf543c32016-08-24 17:11:20 +080090 volumeId=volume['id'])
lkuchlan9dea88e2016-06-07 17:12:01 +030091 waiters.wait_for_volume_status(self.volumes_client,
lisalibf543c32016-08-24 17:11:20 +080092 volume['id'], 'in-use')
lkuchlan9dea88e2016-06-07 17:12:01 +030093 self.addCleanup(waiters.wait_for_volume_status, self.volumes_client,
lisalibf543c32016-08-24 17:11:20 +080094 volume['id'], 'available')
lkuchlan9dea88e2016-06-07 17:12:01 +030095 self.addCleanup(self.servers_client.detach_volume, server['id'],
lisalibf543c32016-08-24 17:11:20 +080096 volume['id'])
lkuchlan9dea88e2016-06-07 17:12:01 +030097 # Create backup using force flag
zhuflc6ce5392016-08-17 14:34:37 +080098 backup_name = data_utils.rand_name(
99 self.__class__.__name__ + '-Backup')
lkuchlana2beb492016-08-17 12:42:44 +0300100 backup = self.create_backup(volume_id=volume['id'],
101 name=backup_name, force=True)
lkuchlan9dea88e2016-06-07 17:12:01 +0300102 self.assertEqual(backup_name, backup['name'])
103
lkuchlanc6e88a62016-12-08 17:12:31 +0200104 @test.idempotent_id('2a8ba340-dff2-4511-9db7-646f07156b15')
105 def test_bootable_volume_backup_and_restore(self):
106 # Create volume from image
107 img_uuid = CONF.compute.image_ref
108 volume = self.create_volume(imageRef=img_uuid)
109
110 volume_details = self.volumes_client.show_volume(
111 volume['id'])['volume']
112 self.assertEqual('true', volume_details['bootable'])
113
114 # Create a backup
115 backup = self.create_backup(volume_id=volume['id'])
116
117 # Restore the backup
118 restored_volume_id = self.restore_backup(backup['id'])['volume_id']
119
120 # Verify the restored backup volume is bootable
121 restored_volume_info = self.volumes_client.show_volume(
122 restored_volume_id)['volume']
123
124 self.assertEqual('true', restored_volume_info['bootable'])
125
lkuchlan9dea88e2016-06-07 17:12:01 +0300126
127class VolumesBackupsV1Test(VolumesBackupsV2Test):
128 _api_version = 1