8f53399e15
This patch adds the 'openstack share restore' command, which implements same functionality as 'manila restore' and can be used to restore a share from the recycle bin Partially-implements: bp openstack-client-support Change-Id: I30f3c36c00d41f8321654285e2ca4455e5d0f8f9
203 lines
8.4 KiB
Python
203 lines
8.4 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 manilaclient.tests.functional.osc import base
|
|
from tempest.lib.common.utils import data_utils
|
|
|
|
|
|
class SharesCLITest(base.OSCClientTestBase):
|
|
|
|
def test_openstack_share_create(self):
|
|
share_name = 'test_create_share'
|
|
share = self.create_share(name=share_name)
|
|
|
|
self.assertEqual(share['share_proto'], 'NFS')
|
|
self.assertEqual(share['size'], '1')
|
|
self.assertEqual(share['name'], share_name)
|
|
|
|
shares_list = self.listing_result('share', 'list')
|
|
self.assertIn(share['id'], [item['ID'] for item in shares_list])
|
|
|
|
def test_openstack_share_list(self):
|
|
share = self.create_share()
|
|
shares_list = self.listing_result('share', 'list')
|
|
self.assertTableStruct(shares_list, [
|
|
'ID',
|
|
'Name',
|
|
'Size',
|
|
'Share Proto',
|
|
'Status',
|
|
'Is Public',
|
|
'Share Type Name',
|
|
'Host',
|
|
'Availability Zone'
|
|
])
|
|
self.assertIn(share['id'], [item['ID'] for item in shares_list])
|
|
|
|
def test_openstack_share_show(self):
|
|
share = self.create_share()
|
|
|
|
result = self.dict_result('share', 'show %s' % share['id'])
|
|
self.assertEqual(share['id'], result['id'])
|
|
|
|
listing_result = self.listing_result('share', 'show %s' % share['id'])
|
|
self.assertTableStruct(listing_result, [
|
|
'Field',
|
|
'Value'
|
|
])
|
|
|
|
def test_openstack_share_delete(self):
|
|
share = self.create_share(add_cleanup=False)
|
|
shares_list = self.listing_result('share', 'list')
|
|
|
|
self.assertIn(share['id'], [item['ID'] for item in shares_list])
|
|
|
|
self.openstack('share delete %s' % share['id'])
|
|
self.check_object_deleted('share', share['id'])
|
|
shares_list_after_delete = self.listing_result('share', 'list')
|
|
|
|
self.assertNotIn(
|
|
share['id'], [item['ID'] for item in shares_list_after_delete])
|
|
|
|
def test_openstack_share_set(self):
|
|
share = self.create_share()
|
|
self.openstack(f'share set {share["id"]} --name new_name '
|
|
f'--property key=value')
|
|
result = self.dict_result('share', f'show {share["id"]}')
|
|
self.assertEqual(share['id'], result['id'])
|
|
self.assertEqual('new_name', result['name'])
|
|
self.assertEqual("key='value'", result['properties'])
|
|
|
|
def test_openstack_share_unset(self):
|
|
share = self.create_share(name='test_name', properties={
|
|
'foo': 'bar', 'test_key': 'test_value'})
|
|
result1 = self.dict_result('share', f'show {share["id"]}')
|
|
self.assertEqual(share['id'], result1['id'])
|
|
self.assertEqual(share['name'], result1['name'])
|
|
self.assertEqual("foo='bar', test_key='test_value'",
|
|
result1['properties'])
|
|
|
|
self.openstack(f'share unset {share["id"]} --name --property test_key')
|
|
result2 = self.dict_result('share', f'show {share["id"]}')
|
|
self.assertEqual(share['id'], result2['id'])
|
|
self.assertEqual('None', result2['name'])
|
|
self.assertEqual("foo='bar'", result2['properties'])
|
|
|
|
def test_openstack_share_soft_delete(self):
|
|
share = self.create_share(name='test_share')
|
|
result1 = self.dict_result('share', f'show {share["id"]}')
|
|
self.assertEqual(share['id'], result1['id'])
|
|
self.assertEqual(share['name'], result1['name'])
|
|
|
|
self.openstack(f'share delete {share["id"]} --soft')
|
|
self.check_object_deleted('share', share['id'])
|
|
shares_list_after_delete = self.listing_result('share', 'list '
|
|
'--soft-deleted')
|
|
self.assertIn(
|
|
share['id'], [item['ID'] for item in shares_list_after_delete])
|
|
|
|
def test_openstack_share_resize(self):
|
|
share = self.create_share()
|
|
self.openstack(f'share resize {share["id"]} 10 --wait ')
|
|
result = self.dict_result('share', f'show {share["id"]}')
|
|
self.assertEqual('10', result['size'])
|
|
|
|
def test_openstack_share_revert(self):
|
|
slug = "revert_test"
|
|
share_type = self.create_share_type(
|
|
name=data_utils.rand_name(slug),
|
|
snapshot_support=True,
|
|
revert_to_snapshot_support=True)
|
|
share = self.create_share(share_type=share_type['id'], size=10)
|
|
snapshot = self.create_snapshot(share['id'], wait=True)
|
|
self.assertEqual(snapshot['size'], share['size'])
|
|
self.openstack(f'share resize {share["id"]} 15 --wait')
|
|
result1 = self.dict_result('share', f'show {share["id"]}')
|
|
self.assertEqual('15', result1["size"])
|
|
|
|
self.openstack(f'share revert {snapshot["id"]} --wait')
|
|
|
|
result2 = self.dict_result('share', f'show {share["id"]}')
|
|
|
|
self.assertEqual('10', result2['size'])
|
|
|
|
def test_openstack_share_abandon_adopt(self):
|
|
share = self.create_share(add_cleanup=False)
|
|
shares_list = self.listing_result('share', 'list')
|
|
self.assertIn(share['id'], [item['ID'] for item in shares_list])
|
|
export_location_obj = self.get_share_export_locations(share['id'])[0]
|
|
export_location = export_location_obj['Path']
|
|
source = self.dict_result('share', f'show {share["id"]}')
|
|
host = source['host']
|
|
protocol = source['share_proto']
|
|
share_type = source['share_type']
|
|
self.openstack(f'share abandon {share["id"]} --wait')
|
|
|
|
# verify abandonded
|
|
self.check_object_deleted('share', share['id'])
|
|
shares_list_after_delete = self.listing_result('share', 'list')
|
|
self.assertNotIn(
|
|
share['id'], [item['ID'] for item in shares_list_after_delete])
|
|
|
|
result = self.dict_result(
|
|
'share', f'adopt {host} {protocol} {export_location} '
|
|
f'--share-type {share_type} --wait')
|
|
|
|
# verify adopted
|
|
self.assertEqual(host, result['host'])
|
|
self.assertEqual(protocol, result['share_proto'])
|
|
self.openstack(f'share delete {result["id"]} --wait')
|
|
|
|
def test_openstack_share_export_location_show(self):
|
|
share = self.create_share()
|
|
share_export_locations = self.get_share_export_locations(share["id"])
|
|
result_export_locations = self.listing_result(
|
|
'share', f'export location list {share["id"]}')
|
|
for share_export in share_export_locations:
|
|
export_location = self.dict_result(
|
|
'share', f'export location show {share["id"]} '
|
|
f'{share_export["ID"]}')
|
|
self.assertIn(export_location["id"], [item["ID"] for item in
|
|
result_export_locations])
|
|
|
|
def test_openstack_share_export_location_list(self):
|
|
share = self.create_share()
|
|
share_export_locations = self.get_share_export_locations(share["id"])
|
|
result_export_locations = self.listing_result(
|
|
'share', f'export location list {share["id"]}')
|
|
|
|
self.assertTableStruct(result_export_locations, [
|
|
'ID',
|
|
'Path'
|
|
])
|
|
export_location_ids = [el['ID'] for el in share_export_locations]
|
|
for share_export in result_export_locations:
|
|
self.assertIn(share_export["ID"], export_location_ids)
|
|
|
|
def test_openstack_share_restore(self):
|
|
share = self.create_share(name='test_share')
|
|
result1 = self.dict_result('share', f'show {share["id"]}')
|
|
self.assertEqual(share['id'], result1['id'])
|
|
self.assertEqual(share['name'], result1['name'])
|
|
|
|
self.openstack(f'share delete {share["id"]} --soft')
|
|
self.check_object_deleted('share', share['id'])
|
|
shares_list_after_delete = self.listing_result('share', 'list')
|
|
self.assertNotIn(
|
|
share['id'], [item['ID'] for item in shares_list_after_delete])
|
|
|
|
self.openstack(f'share restore {share["id"]} ')
|
|
|
|
shares_list_after_restore = self.listing_result('share', 'list')
|
|
self.assertIn(
|
|
share['id'], [item['ID'] for item in shares_list_after_restore])
|