Files
python-manilaclient/manilaclient/tests/functional/osc/test_share_backups.py
Zachary Goggin 4996e2b867 Add support for out of place share backup restores
Add CLI support and tests for performing a restore operation
with Manilas share backup API that targets a non-source share
i.e. a share other then that used to create the backup.)

Partially-Implements: blueprint out-of-place-restore
Depends-On: I060b0dc579e3057f2cb046ebe3271287f8fbc9f9
Change-Id: I8414c62010cd369e27cc5b693612c59d4e7516a3
Signed-off-by: Zachary Goggin <zachary.goggin@cern.ch>
2025-08-28 19:20:38 +00:00

171 lines
5.6 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.
import json
from manilaclient.tests.functional.osc import base
class ShareBackupCLITest(base.OSCClientTestBase):
"""Functional tests for share backup."""
def test_share_backup_create(self):
share = self.create_share()
backup = self.create_backup(
share_id=share['id'],
name='test_backup_create',
description='Description',
backup_options={'dummy': True})
# fetch latest after periodic callback updates status
backup = json.loads(self.openstack(
f'share backup show -f json {backup["id"]}'))
self.assertEqual(share["id"], backup["share_id"])
self.assertEqual('test_backup_create', backup["name"])
self.assertEqual('Description', backup["description"])
self.assertEqual('available', backup["status"])
backups_list = self.listing_result('share backup', 'list')
self.assertIn(backup['id'],
[item['ID'] for item in backups_list])
def test_share_backup_delete(self):
share = self.create_share()
backup = self.create_backup(
share_id=share['id'],
backup_options={'dummy': True},
add_cleanup=False)
self.openstack(
f'share backup delete {backup["id"]} --wait')
self.check_object_deleted('share backup', backup["id"])
def test_share_backup_show(self):
share = self.create_share()
backup = self.create_backup(
share_id=share['id'],
name='test_backup_show',
description='Description',
backup_options={'dummy': True})
show_result = self.dict_result(
'share backup', f'show {backup["id"]}')
self.assertEqual(backup["id"], show_result["id"])
self.assertEqual('test_backup_show', show_result["name"])
self.assertEqual('Description', show_result["description"])
def test_share_backup_restore(self):
share = self.create_share()
backup = self.create_backup(
share_id=share['id'],
backup_options={'dummy': True})
self.openstack(
f'share backup restore {backup["id"]} --wait')
backup = json.loads(self.openstack(
f'share backup show -f json {backup["id"]}'))
share = json.loads(self.openstack(
f'share show -f json {share["id"]}'))
self.assertEqual('available', backup['status'])
self.assertEqual('available', share['status'])
def test_share_backup_set(self):
share = self.create_share()
backup = self.create_backup(share_id=share['id'],
backup_options={'dummy': True})
self.openstack(
f'share backup set {backup["id"]} '
f'--name test_backup_set --description Description')
show_result = self.dict_result(
'share backup ', f'show {backup["id"]}')
self.assertEqual(backup['id'], show_result["id"])
self.assertEqual('test_backup_set', show_result["name"])
self.assertEqual('Description', show_result["description"])
def test_share_backup_unset(self):
share = self.create_share()
backup = self.create_backup(
share_id=share['id'],
name='test_backup_unset',
description='Description',
backup_options={'dummy': True})
self.openstack(
f'share backup unset {backup["id"]} --name --description')
show_result = json.loads(self.openstack(
f'share backup show -f json {backup["id"]}'))
self.assertEqual(backup['id'], show_result["id"])
self.assertIsNone(show_result["name"])
self.assertIsNone(show_result["description"])
def test_share_backup_list(self):
share_1 = self.create_share()
share_2 = self.create_share()
backup_1 = self.create_backup(share_id=share_1['id'],
backup_options={'dummy': True})
backup_2 = self.create_backup(share_id=share_2['id'],
backup_options={'dummy': True})
backups_list = self.listing_result(
'share backup', f'list --name {backup_2["name"]} '
)
self.assertTableStruct(backups_list, [
'ID',
'Name',
'Share ID',
'Status'
])
self.assertEqual(1, len(backups_list))
self.assertIn(backup_2['id'],
[item['ID'] for item in backups_list])
backups_list = self.listing_result(
'share backup', f'list --share {share_1["id"]} --detail'
)
self.assertTableStruct(backups_list, [
'ID',
'Name',
'Share ID',
'Status',
'Description',
'Availability Zone',
'Created At',
'Updated At',
'Size',
'Progress',
'Restore Progress',
'Host',
'Topic',
])
self.assertEqual(1, len(backups_list))
self.assertIn(backup_1['id'],
[item['ID'] for item in backups_list])