[Share groups] Add scheduler filter ConsistentSnapshotFilter
That will be used for scheduling share groups based on their possibility to create consistent snapshots. Also apply following tempest plugin changes: - Add new 'capability_sg_consistent_snapshot_support' tempest config option, that will be used for creation of new share group types and used to prove that scheduling works as expected. - Fix some share group test attributes from 'only API involved' to 'API and Backend are involved', because it is so indeed. Change-Id: I05553c308ae40c4ddc2c6469ff1c1a3da36a87da Partially-Implements BP manila-share-groups
This commit is contained in:
parent
e8c9328a29
commit
3c188930e9
|
@ -112,6 +112,11 @@ ShareGroup = [
|
|||
"capability called 'revert_to_snapshot_support' "
|
||||
"and will be used for setting up custom share type. "
|
||||
"Defaults to the value of run_revert_to_snapshot_tests."),
|
||||
cfg.StrOpt("capability_sg_consistent_snapshot_support",
|
||||
choices=["host", "pool", None],
|
||||
help="Backend capability to create consistent snapshots of "
|
||||
"share group members. Will be used with creation "
|
||||
"of new share group types as group spec."),
|
||||
cfg.StrOpt("share_network_id",
|
||||
default="",
|
||||
help="Some backend drivers requires share network "
|
||||
|
|
|
@ -136,13 +136,16 @@ class ShareGroupTypesTest(base.BaseSharesAdminTest):
|
|||
|
||||
self.assertDictMatch(group_specs, sg_type['group_specs'])
|
||||
|
||||
group_specs = {'key1': 'value3', 'key2': 'value2'}
|
||||
group_specs = {'key1': 'value1', 'key2': 'value2'}
|
||||
|
||||
self.shares_v2_client.update_share_group_type_spec(
|
||||
sg_type['id'], 'key1', 'value3')
|
||||
sg_type = self.shares_v2_client.get_share_group_type(sg_type['id'])
|
||||
|
||||
self.assertDictMatch(group_specs, sg_type['group_specs'])
|
||||
self.assertIn('key1', sg_type['group_specs'])
|
||||
self.assertIn('key2', sg_type['group_specs'])
|
||||
self.assertEqual('value3', sg_type['group_specs']['key1'])
|
||||
self.assertEqual(group_specs['key2'], sg_type['group_specs']['key2'])
|
||||
|
||||
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
||||
def test_update_all_share_group_type_specs_min(self):
|
||||
|
@ -164,7 +167,9 @@ class ShareGroupTypesTest(base.BaseSharesAdminTest):
|
|||
sg_type['id'], group_specs)
|
||||
sg_type = self.shares_v2_client.get_share_group_type(sg_type['id'])
|
||||
|
||||
self.assertDictMatch(group_specs, sg_type['group_specs'])
|
||||
for k, v in group_specs.items():
|
||||
self.assertIn(k, sg_type['group_specs'])
|
||||
self.assertEqual(v, sg_type['group_specs'][k])
|
||||
|
||||
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
||||
def test_delete_single_share_group_type_spec_min(self):
|
||||
|
|
|
@ -48,7 +48,7 @@ class ShareGroupsTest(base.BaseSharesAdminTest):
|
|||
cleanup_in_class=True,
|
||||
version=constants.MIN_SHARE_GROUP_MICROVERSION)
|
||||
|
||||
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
||||
@tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
|
||||
def test_create_share_group_with_single_share_type_min(self):
|
||||
share_group = self.create_share_group(
|
||||
share_group_type_id=self.sg_type['id'],
|
||||
|
@ -81,7 +81,7 @@ class ShareGroupsTest(base.BaseSharesAdminTest):
|
|||
'Expected %s, got %s' % (
|
||||
share_group['id'], expected_share_types, actual_share_types))
|
||||
|
||||
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
||||
@tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
|
||||
def test_create_share_group_with_multiple_share_types_min(self):
|
||||
share_group = self.create_share_group(
|
||||
share_group_type_id=self.sg_type['id'],
|
||||
|
@ -114,7 +114,7 @@ class ShareGroupsTest(base.BaseSharesAdminTest):
|
|||
'Expected %s, got %s' % (
|
||||
share_group['id'], expected_share_types, actual_share_types))
|
||||
|
||||
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
||||
@tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
|
||||
def test_default_share_group_type_applied(self):
|
||||
default_type = self.shares_v2_client.get_default_share_group_type()
|
||||
default_share_types = default_type['share_types']
|
||||
|
@ -142,7 +142,7 @@ class ShareGroupsTest(base.BaseSharesAdminTest):
|
|||
|
||||
@testtools.skipUnless(
|
||||
CONF.share.multitenancy_enabled, "Only for multitenancy.")
|
||||
@tc.attr(base.TAG_POSITIVE, base.TAG_API)
|
||||
@tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
|
||||
def test_create_sg_from_snapshot_verify_share_server_information_min(self):
|
||||
# Create a share group
|
||||
orig_sg = self.create_share_group(
|
||||
|
@ -173,3 +173,19 @@ class ShareGroupsTest(base.BaseSharesAdminTest):
|
|||
orig_sg['share_network_id'], new_sg['share_network_id'])
|
||||
self.assertEqual(
|
||||
orig_sg['share_server_id'], new_sg['share_server_id'])
|
||||
|
||||
@tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
|
||||
def test_create_sg_with_sg_type_but_without_any_group_specs(self):
|
||||
# Create share group type not specifying any group specs
|
||||
sg_type = self.create_share_group_type(
|
||||
name=data_utils.rand_name("tempest-manila"),
|
||||
share_types=[self.share_type['id']],
|
||||
group_specs={},
|
||||
cleanup_in_class=False)
|
||||
|
||||
# Create share group, it should be created always, because we do not
|
||||
# restrict choice anyhow.
|
||||
self.create_share_group(
|
||||
share_type_ids=[self.share_type['id']],
|
||||
share_group_type_id=sg_type['id'],
|
||||
cleanup_in_class=False)
|
||||
|
|
|
@ -0,0 +1,56 @@
|
|||
# Copyright 2017 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 tempest import config
|
||||
from tempest.lib.common.utils import data_utils
|
||||
import testtools
|
||||
from testtools import testcase as tc
|
||||
|
||||
from manila_tempest_tests.common import constants
|
||||
from manila_tempest_tests import share_exceptions
|
||||
from manila_tempest_tests.tests.api import base
|
||||
|
||||
CONF = config.CONF
|
||||
|
||||
|
||||
@testtools.skipUnless(
|
||||
CONF.share.run_share_group_tests, 'Share Group tests disabled.')
|
||||
@base.skip_if_microversion_lt(constants.MIN_SHARE_GROUP_MICROVERSION)
|
||||
class ShareGroupsNegativeTest(base.BaseSharesAdminTest):
|
||||
|
||||
@tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
|
||||
def test_create_share_group_with_wrong_consistent_snapshot_spec(self):
|
||||
# Create valid share type for share group type
|
||||
name = data_utils.rand_name("tempest-manila")
|
||||
extra_specs = self.add_extra_specs_to_dict()
|
||||
st = self.create_share_type(name, extra_specs=extra_specs)
|
||||
share_type = st['share_type'] if 'share_type' in st else st
|
||||
|
||||
# Create share group type with wrong value for
|
||||
# 'consistent_snapshot_support' capability, we always expect
|
||||
# NoValidHostFound using this SG type.
|
||||
sg_type = self.create_share_group_type(
|
||||
name=name,
|
||||
share_types=[share_type['id']],
|
||||
group_specs={"consistent_snapshot_support": "fake"},
|
||||
cleanup_in_class=False)
|
||||
|
||||
# Try create share group
|
||||
self.assertRaises(
|
||||
share_exceptions.ShareGroupBuildErrorException,
|
||||
self.create_share_group,
|
||||
share_type_ids=[share_type['id']],
|
||||
share_group_type_id=sg_type['id'],
|
||||
cleanup_in_class=False)
|
|
@ -595,6 +595,11 @@ class BaseSharesTest(test.BaseTestCase):
|
|||
group_specs=None, client=None,
|
||||
cleanup_in_class=True, **kwargs):
|
||||
client = client or cls.shares_v2_client
|
||||
if group_specs is None:
|
||||
group_specs = {
|
||||
'consistent_snapshot_support': (
|
||||
CONF.share.capability_sg_consistent_snapshot_support),
|
||||
}
|
||||
share_group_type = client.create_share_group_type(
|
||||
name=name,
|
||||
share_types=share_types,
|
||||
|
|
Loading…
Reference in New Issue