Add create_share_from_snapshot_support extra spec
The snapshot_support extra spec has always meant two
things: a driver can take snapshots and create shares
from snapshots. As we add alternate snapshot semantics,
it is likely that some drivers will want to support
snapshots and some of the new semantics while being
unable to create new shares from snapshots.
This work adds a new extra spec,
create_share_from_snapshot_support, that removes the
overloading on snapshot_support. It also makes the
existing snapshot_support extra spec optional,
allowing admins to create types without setting
snapshot_support; shares created with such types
will not support snapshots.
APIImpact
DocImpact
Co-Authored-By: Goutham Pacha Ravi <gouthamr@netapp.com>
Implements: blueprint add-create-share-from-snapshot-extra-spec
Change-Id: Ib0ad5fbfdf6297665c208149b08c8d21b3c232be
diff --git a/manila_tempest_tests/config.py b/manila_tempest_tests/config.py
index 6d0a466..7d7f3fb 100644
--- a/manila_tempest_tests/config.py
+++ b/manila_tempest_tests/config.py
@@ -30,7 +30,7 @@
help="The minimum api microversion is configured to be the "
"value of the minimum microversion supported by Manila."),
cfg.StrOpt("max_api_microversion",
- default="2.23",
+ default="2.24",
help="The maximum api microversion is configured to be the "
"value of the latest microversion supported by Manila."),
cfg.StrOpt("region",
@@ -96,6 +96,13 @@
"capability called 'snapshot_support' and will be used "
"for setting up custom share type. Defaults to value of "
"other config option 'run_snapshot_tests'."),
+ cfg.BoolOpt("capability_create_share_from_snapshot_support",
+ help="Defines extra spec that satisfies specific back end "
+ "capability called 'create_share_from_snapshot_support' "
+ "and will be used for setting up a custom share type. "
+ "Defaults to the value of run_snapshot_tests. Set it to "
+ "False if the driver being tested does not support "
+ "creating shares from snapshots."),
cfg.StrOpt("share_network_id",
default="",
diff --git a/manila_tempest_tests/plugin.py b/manila_tempest_tests/plugin.py
index 0a97747..dfec0b1 100644
--- a/manila_tempest_tests/plugin.py
+++ b/manila_tempest_tests/plugin.py
@@ -35,14 +35,21 @@
conf.register_group(config_share.share_group)
conf.register_opts(config_share.ShareGroup, group='share')
- # NOTE(vponomaryov): set opt 'capability_snapshot_support' by
- # default equal to opt 'run_snapshot_tests'.
+ # NOTE(vponomaryov): Set options 'capability_snapshot_support' and
+ # 'capability_create_share_from_snapshot_support' to opt
+ # 'run_snapshot_tests' if not configured.
if conf.share.capability_snapshot_support is None:
conf.set_default(
"capability_snapshot_support",
conf.share.run_snapshot_tests,
group="share",
)
+ if conf.share.capability_create_share_from_snapshot_support is None:
+ conf.set_default(
+ "capability_create_share_from_snapshot_support",
+ conf.share.run_snapshot_tests,
+ group="share",
+ )
def get_opt_lists(self):
return [(config_share.share_group.name, config_share.ShareGroup),
diff --git a/manila_tempest_tests/services/share/v2/json/shares_client.py b/manila_tempest_tests/services/share/v2/json/shares_client.py
index 0ccc18b..de8c62e 100644
--- a/manila_tempest_tests/services/share/v2/json/shares_client.py
+++ b/manila_tempest_tests/services/share/v2/json/shares_client.py
@@ -726,6 +726,13 @@
self.expected_success(200, resp.status)
return self._parse_resp(body)
+ def delete_share_type_extra_spec(self, share_type_id, extra_spec_name,
+ version=LATEST_MICROVERSION):
+ uri = "types/%s/extra_specs/%s" % (share_type_id, extra_spec_name)
+ resp, body = self.delete(uri, version=version)
+ self.expected_success(202, resp.status)
+ return body
+
def list_access_to_share_type(self, share_type_id,
version=LATEST_MICROVERSION,
action_name=None):
diff --git a/manila_tempest_tests/tests/api/admin/test_consistency_group_actions.py b/manila_tempest_tests/tests/api/admin/test_consistency_group_actions.py
index b9d349c..8b2a21c 100644
--- a/manila_tempest_tests/tests/api/admin/test_consistency_group_actions.py
+++ b/manila_tempest_tests/tests/api/admin/test_consistency_group_actions.py
@@ -32,7 +32,7 @@
super(ConsistencyGroupActionsTest, cls).resource_setup()
# Create 2 share_types
name = data_utils.rand_name("tempest-manila")
- extra_specs = cls.add_required_extra_specs_to_dict()
+ extra_specs = cls.add_extra_specs_to_dict()
share_type = cls.create_share_type(name, extra_specs=extra_specs)
cls.share_type = share_type['share_type']
diff --git a/manila_tempest_tests/tests/api/admin/test_consistency_groups.py b/manila_tempest_tests/tests/api/admin/test_consistency_groups.py
index efa2471..22678e5 100644
--- a/manila_tempest_tests/tests/api/admin/test_consistency_groups.py
+++ b/manila_tempest_tests/tests/api/admin/test_consistency_groups.py
@@ -34,7 +34,7 @@
super(ConsistencyGroupsTest, cls).resource_setup()
# Create 2 share_types
name = data_utils.rand_name("tempest-manila")
- extra_specs = cls.add_required_extra_specs_to_dict()
+ extra_specs = cls.add_extra_specs_to_dict()
share_type = cls.create_share_type(name, extra_specs=extra_specs)
cls.share_type = share_type['share_type']
diff --git a/manila_tempest_tests/tests/api/admin/test_consistency_groups_negative.py b/manila_tempest_tests/tests/api/admin/test_consistency_groups_negative.py
index 0a0d0f4..a850379 100644
--- a/manila_tempest_tests/tests/api/admin/test_consistency_groups_negative.py
+++ b/manila_tempest_tests/tests/api/admin/test_consistency_groups_negative.py
@@ -33,7 +33,7 @@
super(ConsistencyGroupsNegativeTest, cls).resource_setup()
# Create share_type
name = data_utils.rand_name("tempest-manila")
- extra_specs = cls.add_required_extra_specs_to_dict()
+ extra_specs = cls.add_extra_specs_to_dict()
share_type = cls.create_share_type(name, extra_specs=extra_specs)
cls.share_type = share_type['share_type']
diff --git a/manila_tempest_tests/tests/api/admin/test_multi_backend.py b/manila_tempest_tests/tests/api/admin/test_multi_backend.py
index 8b7e078..8aeabc3 100644
--- a/manila_tempest_tests/tests/api/admin/test_multi_backend.py
+++ b/manila_tempest_tests/tests/api/admin/test_multi_backend.py
@@ -48,7 +48,7 @@
}
st = cls.create_share_type(
name=st_name,
- extra_specs=cls.add_required_extra_specs_to_dict(extra_specs))
+ extra_specs=cls.add_extra_specs_to_dict(extra_specs))
cls.sts.append(st["share_type"])
st_id = st["share_type"]["id"]
share_data_list.append({"kwargs": {"share_type_id": st_id}})
diff --git a/manila_tempest_tests/tests/api/admin/test_replication.py b/manila_tempest_tests/tests/api/admin/test_replication.py
index 38546e3..e41c92b 100644
--- a/manila_tempest_tests/tests/api/admin/test_replication.py
+++ b/manila_tempest_tests/tests/api/admin/test_replication.py
@@ -48,7 +48,7 @@
cls.share_zone = cls.zones[0]
cls.replica_zone = cls.zones[-1]
- cls.extra_specs = cls.add_required_extra_specs_to_dict(
+ cls.extra_specs = cls.add_extra_specs_to_dict(
{"replication_type": cls.replication_type})
share_type = cls.create_share_type(
name,
diff --git a/manila_tempest_tests/tests/api/admin/test_replication_actions.py b/manila_tempest_tests/tests/api/admin/test_replication_actions.py
index 377bb41..5b56533 100644
--- a/manila_tempest_tests/tests/api/admin/test_replication_actions.py
+++ b/manila_tempest_tests/tests/api/admin/test_replication_actions.py
@@ -49,7 +49,7 @@
cls.share_zone = cls.zones[0]
cls.replica_zone = cls.zones[-1]
- cls.extra_specs = cls.add_required_extra_specs_to_dict(
+ cls.extra_specs = cls.add_extra_specs_to_dict(
{"replication_type": cls.replication_type})
share_type = cls.create_share_type(
name,
diff --git a/manila_tempest_tests/tests/api/admin/test_scheduler_stats.py b/manila_tempest_tests/tests/api/admin/test_scheduler_stats.py
index fe4cc43..aa29828 100644
--- a/manila_tempest_tests/tests/api/admin/test_scheduler_stats.py
+++ b/manila_tempest_tests/tests/api/admin/test_scheduler_stats.py
@@ -35,8 +35,7 @@
'share_backend_name': data_utils.rand_name("fake_name"),
}
- extra_specs = cls.add_required_extra_specs_to_dict(
- extra_specs=extra_specs)
+ extra_specs = cls.add_extra_specs_to_dict(extra_specs=extra_specs)
return cls.create_share_type(
name, extra_specs=extra_specs,
client=cls.admin_client)
diff --git a/manila_tempest_tests/tests/api/admin/test_share_manage.py b/manila_tempest_tests/tests/api/admin/test_share_manage.py
index 8100040..f943284 100644
--- a/manila_tempest_tests/tests/api/admin/test_share_manage.py
+++ b/manila_tempest_tests/tests/api/admin/test_share_manage.py
@@ -54,12 +54,16 @@
'driver_handles_share_servers': False,
'snapshot_support': six.text_type(
CONF.share.capability_snapshot_support),
+ 'create_share_from_snapshot_support': six.text_type(
+ CONF.share.capability_create_share_from_snapshot_support)
}
cls.extra_specs_invalid = {
'storage_protocol': CONF.share.capability_storage_protocol,
'driver_handles_share_servers': True,
'snapshot_support': six.text_type(
CONF.share.capability_snapshot_support),
+ 'create_share_from_snapshot_support': six.text_type(
+ CONF.share.capability_create_share_from_snapshot_support),
}
cls.st = cls.create_share_type(
diff --git a/manila_tempest_tests/tests/api/admin/test_share_types.py b/manila_tempest_tests/tests/api/admin/test_share_types.py
index af354bb..076e4bc 100644
--- a/manila_tempest_tests/tests/api/admin/test_share_types.py
+++ b/manila_tempest_tests/tests/api/admin/test_share_types.py
@@ -31,7 +31,7 @@
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
def test_share_type_create_delete(self):
name = data_utils.rand_name("tempest-manila")
- extra_specs = self.add_required_extra_specs_to_dict()
+ extra_specs = self.add_extra_specs_to_dict()
# Create share type
st_create = self.shares_v2_client.create_share_type(
@@ -64,7 +64,7 @@
self.skip_if_microversion_not_supported(version)
name = data_utils.rand_name("tempest-manila")
- extra_specs = self.add_required_extra_specs_to_dict({"key": "value", })
+ extra_specs = self.add_extra_specs_to_dict({"key": "value", })
# Create share type
st_create = self.create_share_type(
@@ -89,7 +89,7 @@
self.skip_if_microversion_not_supported(version)
name = data_utils.rand_name("tempest-manila")
- extra_specs = self.add_required_extra_specs_to_dict()
+ extra_specs = self.add_extra_specs_to_dict()
# Create share type
st_create = self.create_share_type(
@@ -117,7 +117,7 @@
# Data
share_name = data_utils.rand_name("share")
shr_type_name = data_utils.rand_name("share-type")
- extra_specs = self.add_required_extra_specs_to_dict({
+ extra_specs = self.add_extra_specs_to_dict({
"storage_protocol": CONF.share.capability_storage_protocol,
})
@@ -144,7 +144,7 @@
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
def test_private_share_type_access(self):
name = data_utils.rand_name("tempest-manila")
- extra_specs = self.add_required_extra_specs_to_dict({"key": "value", })
+ extra_specs = self.add_extra_specs_to_dict({"key": "value", })
project_id = self.shares_client.tenant_id
# Create private share type
diff --git a/manila_tempest_tests/tests/api/admin/test_share_types_extra_specs.py b/manila_tempest_tests/tests/api/admin/test_share_types_extra_specs.py
index 81d130f..f4c21b8 100644
--- a/manila_tempest_tests/tests/api/admin/test_share_types_extra_specs.py
+++ b/manila_tempest_tests/tests/api/admin/test_share_types_extra_specs.py
@@ -15,19 +15,25 @@
import copy
+import ddt
+from tempest import config
from tempest.lib.common.utils import data_utils
from testtools import testcase as tc
from manila_tempest_tests.tests.api import base
+CONF = config.CONF
+LATEST_MICROVERSION = CONF.share.max_api_microversion
+
+
class ExtraSpecsReadAdminTest(base.BaseSharesAdminTest):
@classmethod
def resource_setup(cls):
super(ExtraSpecsReadAdminTest, cls).resource_setup()
cls.share_type_name = data_utils.rand_name("share-type")
- cls.required_extra_specs = cls.add_required_extra_specs_to_dict()
+ cls.required_extra_specs = cls.add_extra_specs_to_dict()
cls.share_type = cls.create_share_type(
cls.share_type_name, extra_specs=cls.required_extra_specs)
@@ -54,11 +60,12 @@
self.assertEqual(self.expected_extra_specs, es_get_all)
+@ddt.ddt
class ExtraSpecsWriteAdminTest(base.BaseSharesAdminTest):
def setUp(self):
super(ExtraSpecsWriteAdminTest, self).setUp()
- self.required_extra_specs = self.add_required_extra_specs_to_dict()
+ self.required_extra_specs = self.add_extra_specs_to_dict()
self.custom_extra_specs = {"key1": "value1", "key2": "value2"}
self.share_type_name = data_utils.rand_name("share-type")
@@ -109,3 +116,17 @@
get = self.shares_client.get_share_type_extra_specs(self.st_id)
self.assertNotIn('key1', get)
+
+ @tc.attr(base.TAG_POSITIVE, base.TAG_API)
+ @ddt.data(*set(['2.24', LATEST_MICROVERSION]))
+ def test_delete_snapshot_support_extra_spec(self, version):
+ self.skip_if_microversion_not_supported(version)
+ # Delete one extra spec for share type
+ self.shares_v2_client.delete_share_type_extra_spec(
+ self.st_id, 'snapshot_support', version=version)
+
+ # Get metadata
+ share_type_extra_specs = self.shares_client.get_share_type_extra_specs(
+ self.st_id)
+
+ self.assertNotIn('snapshot_support', share_type_extra_specs)
diff --git a/manila_tempest_tests/tests/api/admin/test_share_types_extra_specs_negative.py b/manila_tempest_tests/tests/api/admin/test_share_types_extra_specs_negative.py
index 34e5009..85cbc5d 100644
--- a/manila_tempest_tests/tests/api/admin/test_share_types_extra_specs_negative.py
+++ b/manila_tempest_tests/tests/api/admin/test_share_types_extra_specs_negative.py
@@ -13,6 +13,7 @@
# License for the specific language governing permissions and limitations
# under the License.
+import ddt
from tempest.lib.common.utils import data_utils
from tempest.lib import exceptions as lib_exc
from testtools import testcase as tc
@@ -20,11 +21,12 @@
from manila_tempest_tests.tests.api import base
+@ddt.ddt
class ExtraSpecsAdminNegativeTest(base.BaseSharesMixedTest):
def _create_share_type(self):
name = data_utils.rand_name("unique_st_name")
- extra_specs = self.add_required_extra_specs_to_dict({"key": "value"})
+ extra_specs = self.add_extra_specs_to_dict({"key": "value"})
return self.create_share_type(
name, extra_specs=extra_specs, client=self.admin_shares_v2_client)
@@ -35,7 +37,7 @@
lib_exc.Forbidden,
self.shares_v2_client.create_share_type_extra_specs,
st["share_type"]["id"],
- self.add_required_extra_specs_to_dict({"key": "new_value"}))
+ self.add_extra_specs_to_dict({"key": "new_value"}))
@tc.attr(base.TAG_NEGATIVE, base.TAG_API)
def test_try_list_extra_specs_with_user(self):
@@ -67,7 +69,8 @@
share_type = self.shares_v2_client.get_share_type(
st['share_type']['id'])
# Verify a non-admin can only read the required extra-specs
- expected_keys = ['driver_handles_share_servers', 'snapshot_support']
+ expected_keys = ['driver_handles_share_servers', 'snapshot_support',
+ 'create_share_from_snapshot_support']
actual_keys = share_type['share_type']['extra_specs'].keys()
self.assertEqual(sorted(expected_keys), sorted(actual_keys),
'Incorrect extra specs visible to non-admin user; '
@@ -105,7 +108,7 @@
lib_exc.BadRequest,
self.admin_shares_v2_client.create_share_type_extra_specs,
st["share_type"]["id"],
- self.add_required_extra_specs_to_dict({too_big_key: "value"}))
+ self.add_extra_specs_to_dict({too_big_key: "value"}))
@tc.attr(base.TAG_NEGATIVE, base.TAG_API)
def test_try_set_too_long_value_with_creation(self):
@@ -115,7 +118,7 @@
lib_exc.BadRequest,
self.admin_shares_v2_client.create_share_type_extra_specs,
st["share_type"]["id"],
- self.add_required_extra_specs_to_dict({"key": too_big_value}))
+ self.add_extra_specs_to_dict({"key": too_big_value}))
@tc.attr(base.TAG_NEGATIVE, base.TAG_API)
def test_try_set_too_long_value_with_update(self):
@@ -123,12 +126,12 @@
st = self._create_share_type()
self.admin_shares_v2_client.create_share_type_extra_specs(
st["share_type"]["id"],
- self.add_required_extra_specs_to_dict({"key": "value"}))
+ self.add_extra_specs_to_dict({"key": "value"}))
self.assertRaises(
lib_exc.BadRequest,
self.admin_shares_v2_client.update_share_type_extra_specs,
st["share_type"]["id"],
- self.add_required_extra_specs_to_dict({"key": too_big_value}))
+ self.add_extra_specs_to_dict({"key": too_big_value}))
@tc.attr(base.TAG_NEGATIVE, base.TAG_API)
def test_try_set_too_long_value_with_update_of_one_key(self):
@@ -136,7 +139,7 @@
st = self._create_share_type()
self.admin_shares_v2_client.create_share_type_extra_specs(
st["share_type"]["id"],
- self.add_required_extra_specs_to_dict({"key": "value"}))
+ self.add_extra_specs_to_dict({"key": "value"}))
self.assertRaises(
lib_exc.BadRequest,
self.admin_shares_v2_client.update_share_type_extra_spec,
@@ -286,12 +289,12 @@
"driver_handles_share_servers")
@tc.attr(base.TAG_NEGATIVE, base.TAG_API)
- def test_try_delete_spec_snapshot_support(self):
+ @ddt.data('2.0', '2.23')
+ def test_try_delete_required_spec_snapshot_support_version(self, version):
+ self.skip_if_microversion_not_supported(version)
st = self._create_share_type()
-
# Try delete extra spec 'snapshot_support'
self.assertRaises(
lib_exc.Forbidden,
self.admin_shares_v2_client.delete_share_type_extra_spec,
- st["share_type"]["id"],
- "snapshot_support")
+ st["share_type"]["id"], "snapshot_support", version=version)
diff --git a/manila_tempest_tests/tests/api/admin/test_share_types_negative.py b/manila_tempest_tests/tests/api/admin/test_share_types_negative.py
index b0fb9db..b3bf855 100644
--- a/manila_tempest_tests/tests/api/admin/test_share_types_negative.py
+++ b/manila_tempest_tests/tests/api/admin/test_share_types_negative.py
@@ -24,7 +24,7 @@
def _create_share_type(self):
name = data_utils.rand_name("unique_st_name")
- extra_specs = self.add_required_extra_specs_to_dict({"key": "value"})
+ extra_specs = self.add_extra_specs_to_dict({"key": "value"})
return self.create_share_type(
name, extra_specs=extra_specs, client=self.admin_shares_v2_client)
@@ -66,7 +66,7 @@
self.assertRaises(lib_exc.Conflict,
self.create_share_type,
st["share_type"]["name"],
- extra_specs=self.add_required_extra_specs_to_dict(),
+ extra_specs=self.add_extra_specs_to_dict(),
client=self.admin_shares_v2_client)
@tc.attr(base.TAG_NEGATIVE, base.TAG_API)
diff --git a/manila_tempest_tests/tests/api/admin/test_shares_actions.py b/manila_tempest_tests/tests/api/admin/test_shares_actions.py
index eb049c6..779cd18 100644
--- a/manila_tempest_tests/tests/api/admin/test_shares_actions.py
+++ b/manila_tempest_tests/tests/api/admin/test_shares_actions.py
@@ -34,7 +34,7 @@
# create share type for share filtering purposes
cls.st_name = data_utils.rand_name("tempest-st-name")
- cls.extra_specs = cls.add_required_extra_specs_to_dict(
+ cls.extra_specs = cls.add_extra_specs_to_dict(
{'storage_protocol': CONF.share.capability_storage_protocol})
cls.st = cls.create_share_type(
name=cls.st_name,
@@ -64,20 +64,23 @@
cls.snap = cls.create_snapshot_wait_for_active(
cls.shares[0]["id"], cls.snap_name, cls.snap_desc)
- # create second share from snapshot for purposes of sorting and
- # snapshot filtering
- cls.share_name2 = data_utils.rand_name("tempest-share-name")
- cls.share_desc2 = data_utils.rand_name("tempest-share-description")
- cls.metadata2 = {
- 'foo_key_share_2': 'foo_value_share_2',
- 'bar_key_share_2': 'foo_value_share_2',
- }
- cls.shares.append(cls.create_share(
- name=cls.share_name2,
- description=cls.share_desc2,
- metadata=cls.metadata2,
- snapshot_id=cls.snap['id'],
- ))
+ if CONF.share.capability_create_share_from_snapshot_support:
+
+ # create second share from snapshot for purposes of sorting and
+ # snapshot filtering
+ cls.share_name2 = data_utils.rand_name("tempest-share-name")
+ cls.share_desc2 = data_utils.rand_name(
+ "tempest-share-description")
+ cls.metadata2 = {
+ 'foo_key_share_2': 'foo_value_share_2',
+ 'bar_key_share_2': 'foo_value_share_2',
+ }
+ cls.shares.append(cls.create_share(
+ name=cls.share_name2,
+ description=cls.share_desc2,
+ metadata=cls.metadata2,
+ snapshot_id=cls.snap['id'],
+ ))
@tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
def test_get_share(self):
@@ -154,7 +157,7 @@
for share in shares:
self.assertDictContainsSubset(
filters['metadata'], share['metadata'])
- if CONF.share.run_snapshot_tests:
+ if CONF.share.capability_create_share_from_snapshot_support:
self.assertFalse(self.shares[1]['id'] in [s['id'] for s in shares])
@tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
@@ -250,8 +253,9 @@
filters['share_network_id'], share['share_network_id'])
@tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
- @testtools.skipUnless(CONF.share.run_snapshot_tests,
- "Snapshot tests are disabled.")
+ @testtools.skipUnless(
+ CONF.share.capability_create_share_from_snapshot_support,
+ "Create share from snapshot tests are disabled.")
def test_list_shares_with_detail_filter_by_snapshot_id(self):
filters = {'snapshot_id': self.snap['id']}
diff --git a/manila_tempest_tests/tests/api/admin/test_snapshot_manage.py b/manila_tempest_tests/tests/api/admin/test_snapshot_manage.py
index 3cde3e6..6436e5b 100644
--- a/manila_tempest_tests/tests/api/admin/test_snapshot_manage.py
+++ b/manila_tempest_tests/tests/api/admin/test_snapshot_manage.py
@@ -55,6 +55,8 @@
'driver_handles_share_servers': False,
'snapshot_support': six.text_type(
CONF.share.capability_snapshot_support),
+ 'create_share_from_snapshot_support': six.text_type(
+ CONF.share.capability_create_share_from_snapshot_support)
}
cls.st = cls.create_share_type(
diff --git a/manila_tempest_tests/tests/api/admin/test_snapshot_manage_negative.py b/manila_tempest_tests/tests/api/admin/test_snapshot_manage_negative.py
index dfd892c..3825be1 100644
--- a/manila_tempest_tests/tests/api/admin/test_snapshot_manage_negative.py
+++ b/manila_tempest_tests/tests/api/admin/test_snapshot_manage_negative.py
@@ -49,6 +49,8 @@
'driver_handles_share_servers': False,
'snapshot_support': six.text_type(
CONF.share.capability_snapshot_support),
+ 'create_share_from_snapshot_support': six.text_type(
+ CONF.share.capability_create_share_from_snapshot_support),
}
cls.st = cls.create_share_type(
diff --git a/manila_tempest_tests/tests/api/base.py b/manila_tempest_tests/tests/api/base.py
index 7bb727d..dcf0bed 100644
--- a/manila_tempest_tests/tests/api/base.py
+++ b/manila_tempest_tests/tests/api/base.py
@@ -727,17 +727,30 @@
return share_type
@staticmethod
- def add_required_extra_specs_to_dict(extra_specs=None):
+ def add_extra_specs_to_dict(extra_specs=None):
+ """Add any required extra-specs to share type dictionary"""
dhss = six.text_type(CONF.share.multitenancy_enabled)
snapshot_support = six.text_type(
CONF.share.capability_snapshot_support)
- required = {
+ create_from_snapshot_support = six.text_type(
+ CONF.share.capability_create_share_from_snapshot_support)
+
+ extra_specs_dict = {
"driver_handles_share_servers": dhss,
- "snapshot_support": snapshot_support,
}
+
+ optional = {
+ "snapshot_support": snapshot_support,
+ "create_share_from_snapshot_support": create_from_snapshot_support,
+ }
+ # NOTE(gouthamr): In micro-versions < 2.24, snapshot_support is a
+ # required extra-spec
+ extra_specs_dict.update(optional)
+
if extra_specs:
- required.update(extra_specs)
- return required
+ extra_specs_dict.update(extra_specs)
+
+ return extra_specs_dict
@classmethod
def clear_isolated_creds(cls, creds=None):
diff --git a/manila_tempest_tests/tests/api/test_replication.py b/manila_tempest_tests/tests/api/test_replication.py
index 0bdb7ad..1738e87 100644
--- a/manila_tempest_tests/tests/api/test_replication.py
+++ b/manila_tempest_tests/tests/api/test_replication.py
@@ -51,7 +51,7 @@
cls.share_zone = cls.zones[0]
cls.replica_zone = cls.zones[-1]
- cls.extra_specs = cls.add_required_extra_specs_to_dict(
+ cls.extra_specs = cls.add_extra_specs_to_dict(
{"replication_type": cls.replication_type})
share_type = cls.create_share_type(
name,
@@ -307,7 +307,7 @@
cls.share_zone = cls.zones[0]
cls.replica_zone = cls.zones[-1]
- cls.extra_specs = cls.add_required_extra_specs_to_dict(
+ cls.extra_specs = cls.add_extra_specs_to_dict(
{"replication_type": cls.replication_type})
share_type = cls.create_share_type(
name,
diff --git a/manila_tempest_tests/tests/api/test_replication_negative.py b/manila_tempest_tests/tests/api/test_replication_negative.py
index cfbf210..48b8d5c 100644
--- a/manila_tempest_tests/tests/api/test_replication_negative.py
+++ b/manila_tempest_tests/tests/api/test_replication_negative.py
@@ -48,7 +48,7 @@
cls.share_zone = cls.zones[0]
cls.replica_zone = cls.zones[-1]
- cls.extra_specs = cls.add_required_extra_specs_to_dict(
+ cls.extra_specs = cls.add_extra_specs_to_dict(
{"replication_type": cls.replication_type})
share_type = cls.create_share_type(
name,
@@ -80,7 +80,7 @@
# Create share without replication type
share_type = self.create_share_type(
data_utils.rand_name(constants.TEMPEST_MANILA_PREFIX),
- extra_specs=self.add_required_extra_specs_to_dict(),
+ extra_specs=self.add_extra_specs_to_dict(),
client=self.admin_client)["share_type"]
share = self.create_share(share_type_id=share_type["id"])
self.assertRaises(lib_exc.BadRequest,
diff --git a/manila_tempest_tests/tests/api/test_replication_snapshots.py b/manila_tempest_tests/tests/api/test_replication_snapshots.py
index e3081cc..331437c 100644
--- a/manila_tempest_tests/tests/api/test_replication_snapshots.py
+++ b/manila_tempest_tests/tests/api/test_replication_snapshots.py
@@ -49,7 +49,7 @@
cls.share_zone = cls.zones[0]
cls.replica_zone = cls.zones[-1]
- cls.extra_specs = cls.add_required_extra_specs_to_dict(
+ cls.extra_specs = cls.add_extra_specs_to_dict(
{"replication_type": cls.replication_type})
share_type = cls.create_share_type(
name,
@@ -86,7 +86,12 @@
snapshot = self.create_snapshot_wait_for_active(share["id"])
self.promote_share_replica(share_replica['id'])
self.delete_share_replica(original_replica['id'])
- self.create_share(snapshot_id=snapshot['id'])
+
+ snapshot = self.shares_v2_client.get_snapshot(snapshot['id'])
+ self.assertEqual(constants.STATUS_AVAILABLE, snapshot['status'])
+
+ if CONF.share.capability_create_share_from_snapshot_support:
+ self.create_share(snapshot_id=snapshot['id'])
@tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
def test_snapshot_before_share_replica(self):
@@ -116,7 +121,12 @@
self.promote_share_replica(share_replica['id'])
self.delete_share_replica(original_replica['id'])
- self.create_share(snapshot_id=snapshot['id'])
+
+ snapshot = self.shares_v2_client.get_snapshot(snapshot['id'])
+ self.assertEqual(constants.STATUS_AVAILABLE, snapshot['status'])
+
+ if CONF.share.capability_create_share_from_snapshot_support:
+ self.create_share(snapshot_id=snapshot['id'])
@tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
def test_snapshot_before_and_after_share_replica(self):
@@ -152,8 +162,15 @@
# still being created successfully.
self.delete_share_replica(original_replica['id'])
- self.create_share(snapshot_id=snapshot1['id'])
- self.create_share(snapshot_id=snapshot2['id'])
+ snapshot1 = self.shares_v2_client.get_snapshot(snapshot1['id'])
+ self.assertEqual(constants.STATUS_AVAILABLE, snapshot1['status'])
+
+ snapshot2 = self.shares_v2_client.get_snapshot(snapshot2['id'])
+ self.assertEqual(constants.STATUS_AVAILABLE, snapshot2['status'])
+
+ if CONF.share.capability_create_share_from_snapshot_support:
+ self.create_share(snapshot_id=snapshot1['id'])
+ self.create_share(snapshot_id=snapshot2['id'])
@tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
def test_delete_snapshot_after_adding_replica(self):
@@ -176,6 +193,9 @@
snapshot_id=snapshot["id"])
@tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
+ @testtools.skipUnless(
+ CONF.share.capability_create_share_from_snapshot_support,
+ "Create share from snapshot tests are disabled.")
def test_create_replica_from_snapshot_share(self):
"""Test replica for a share that was created from snapshot."""
diff --git a/manila_tempest_tests/tests/api/test_share_types_negative.py b/manila_tempest_tests/tests/api/test_share_types_negative.py
index 9c7883b..8a24325 100644
--- a/manila_tempest_tests/tests/api/test_share_types_negative.py
+++ b/manila_tempest_tests/tests/api/test_share_types_negative.py
@@ -25,7 +25,7 @@
@classmethod
def _create_share_type(cls):
name = data_utils.rand_name("unique_st_name")
- extra_specs = cls.add_required_extra_specs_to_dict()
+ extra_specs = cls.add_extra_specs_to_dict()
return cls.create_share_type(
name, extra_specs=extra_specs,
client=cls.admin_client)
diff --git a/manila_tempest_tests/tests/api/test_shares.py b/manila_tempest_tests/tests/api/test_shares.py
index af4a54a..d78c913 100644
--- a/manila_tempest_tests/tests/api/test_shares.py
+++ b/manila_tempest_tests/tests/api/test_shares.py
@@ -92,6 +92,12 @@
detailed_elements.add('user_id')
self.assertTrue(detailed_elements.issubset(share.keys()), msg)
+ # In v 2.24 and beyond, we add create_share_from_snapshot_support in
+ # show/create/manage share echo.
+ if utils.is_microversion_supported('2.24'):
+ detailed_elements.add('create_share_from_snapshot_support')
+ self.assertTrue(detailed_elements.issubset(share.keys()), msg)
+
# Delete share
self.shares_v2_client.delete_share(share['id'])
self.shares_v2_client.wait_for_resource_deletion(share_id=share['id'])
@@ -136,6 +142,9 @@
@tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
@testtools.skipUnless(CONF.share.run_snapshot_tests,
"Snapshot tests are disabled.")
+ @testtools.skipUnless(
+ CONF.share.capability_create_share_from_snapshot_support,
+ "Create share from snapshot tests are disabled.")
def test_create_share_from_snapshot(self):
# If multitenant driver used, share_network will be provided by default
@@ -164,9 +173,13 @@
"Only for multitenancy.")
@testtools.skipUnless(CONF.share.run_snapshot_tests,
"Snapshot tests are disabled.")
+ @testtools.skipUnless(
+ CONF.share.capability_create_share_from_snapshot_support,
+ "Create share from snapshot tests are disabled.")
def test_create_share_from_snapshot_share_network_not_provided(self):
# We expect usage of share network from parent's share
- # when creating share from snapshot using multitenant driver.
+ # when creating share from snapshot using a driver that supports
+ # multi-tenancy.
# get parent share
parent = self.shares_client.get_share(self.share["id"])
diff --git a/manila_tempest_tests/tests/api/test_shares_actions.py b/manila_tempest_tests/tests/api/test_shares_actions.py
index da44c7c..d03df33 100644
--- a/manila_tempest_tests/tests/api/test_shares_actions.py
+++ b/manila_tempest_tests/tests/api/test_shares_actions.py
@@ -58,20 +58,23 @@
cls.snap = cls.create_snapshot_wait_for_active(
cls.shares[0]["id"], cls.snap_name, cls.snap_desc)
- # create second share from snapshot for purposes of sorting and
- # snapshot filtering
- cls.share_name2 = data_utils.rand_name("tempest-share-name")
- cls.share_desc2 = data_utils.rand_name("tempest-share-description")
- cls.metadata2 = {
- 'foo_key_share_2': 'foo_value_share_2',
- 'bar_key_share_2': 'foo_value_share_2',
- }
- cls.shares.append(cls.create_share(
- name=cls.share_name2,
- description=cls.share_desc2,
- metadata=cls.metadata2,
- snapshot_id=cls.snap['id'],
- ))
+ if CONF.share.capability_create_share_from_snapshot_support:
+
+ # create second share from snapshot for purposes of sorting and
+ # snapshot filtering
+ cls.share_name2 = data_utils.rand_name("tempest-share-name")
+ cls.share_desc2 = data_utils.rand_name(
+ "tempest-share-description")
+ cls.metadata2 = {
+ 'foo_key_share_2': 'foo_value_share_2',
+ 'bar_key_share_2': 'foo_value_share_2',
+ }
+ cls.shares.append(cls.create_share(
+ name=cls.share_name2,
+ description=cls.share_desc2,
+ metadata=cls.metadata2,
+ snapshot_id=cls.snap['id'],
+ ))
def _get_share(self, version):
@@ -101,6 +104,8 @@
expected_keys.append("replication_type")
if utils.is_microversion_ge(version, '2.16'):
expected_keys.append("user_id")
+ if utils.is_microversion_ge(version, '2.24'):
+ expected_keys.append("create_share_from_snapshot_support")
actual_keys = list(share.keys())
[self.assertIn(key, actual_keys) for key in expected_keys]
@@ -158,6 +163,11 @@
self._get_share('2.16')
@tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
+ @utils.skip_if_microversion_not_supported('2.24')
+ def test_get_share_with_create_share_from_snapshot_support(self):
+ self._get_share('2.24')
+
+ @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
def test_list_shares(self):
# list shares
@@ -201,6 +211,8 @@
keys.append("replication_type")
if utils.is_microversion_ge(version, '2.16'):
keys.append("user_id")
+ if utils.is_microversion_ge(version, '2.24'):
+ keys.append("create_share_from_snapshot_support")
[self.assertIn(key, sh.keys()) for sh in shares for key in keys]
# our shares in list and have no duplicates
@@ -248,6 +260,11 @@
self._list_shares_with_detail('2.16')
@tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
+ def test_list_shares_with_detail_and_create_share_from_snapshot_support(
+ self):
+ self._list_shares_with_detail('2.24')
+
+ @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
def test_list_shares_with_detail_filter_by_metadata(self):
filters = {'metadata': self.metadata}
@@ -259,7 +276,7 @@
for share in shares:
self.assertDictContainsSubset(
filters['metadata'], share['metadata'])
- if CONF.share.run_snapshot_tests:
+ if CONF.share.capability_create_share_from_snapshot_support:
self.assertFalse(self.shares[1]['id'] in [s['id'] for s in shares])
@tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
@@ -294,6 +311,9 @@
@tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
@testtools.skipUnless(CONF.share.run_snapshot_tests,
"Snapshot tests are disabled.")
+ @testtools.skipUnless(
+ CONF.share.capability_create_share_from_snapshot_support,
+ "Create share from snapshot tests are disabled.")
def test_list_shares_with_detail_filter_by_snapshot_id(self):
filters = {'snapshot_id': self.snap['id']}
diff --git a/manila_tempest_tests/tests/api/test_shares_negative.py b/manila_tempest_tests/tests/api/test_shares_negative.py
index 7c5619e..42204e1 100644
--- a/manila_tempest_tests/tests/api/test_shares_negative.py
+++ b/manila_tempest_tests/tests/api/test_shares_negative.py
@@ -60,6 +60,9 @@
@tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
@testtools.skipUnless(CONF.share.run_snapshot_tests,
"Snapshot tests are disabled.")
+ @testtools.skipUnless(
+ CONF.share.capability_create_share_from_snapshot_support,
+ "Create share from snapshot tests are disabled.")
def test_create_share_from_snap_with_less_size(self):
# requires minimum 5Gb available space
@@ -96,7 +99,13 @@
"Only for multitenancy.")
@testtools.skipUnless(CONF.share.run_snapshot_tests,
"Snapshot tests are disabled.")
+ @testtools.skipUnless(
+ CONF.share.capability_create_share_from_snapshot_support,
+ "Create share from snapshot tests are disabled.")
def test_create_share_from_snap_with_different_share_network(self):
+ # We can't create a share from a snapshot whose base share does not
+ # have 'create_share_from_snapshot_support'.
+
# create share
share = self.create_share(cleanup_in_class=False)