Clean cleanup context
Modules rally.plugins.openstack.context.cleanup.manager and rally.plugins.openstack.context.cleanup.resources were deprecated in previous release and we ready to remove them, since the produce a lot of redundant warning messages. __init__ module should be empty, so code from rally.plugins.openstack.context.cleanup.__init__ moves to -> rally.plugins.openstack.context.cleanup.admin (AdminCleanup) -> rally.plugins.openstack.context.cleanup.user (UserCleanup) -> rally.plugins.openstack.context.cleanup.base (base stuff) Also tests.unit.plugins.openstack.context.test_cleanup is refactored too. Change-Id: I25cf5750cb2de0d5652dc44db75818a5e10626eb
This commit is contained in:
parent
dfd495072e
commit
1bd254228d
@ -1,99 +0,0 @@
|
||||
# Copyright 2014: 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.
|
||||
|
||||
import sys
|
||||
|
||||
from rally.common.i18n import _
|
||||
from rally.common import logging
|
||||
from rally import consts
|
||||
from rally import exceptions
|
||||
from rally.plugins.openstack.cleanup import manager
|
||||
from rally.task import context
|
||||
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class NoSuchCleanupResources(exceptions.RallyException):
|
||||
msg_fmt = _("Missing cleanup resource managers: %(message)s")
|
||||
|
||||
|
||||
class CleanupMixin(object):
|
||||
|
||||
CONFIG_SCHEMA = {
|
||||
"type": "array",
|
||||
"$schema": consts.JSON_SCHEMA,
|
||||
"items": {
|
||||
"type": "string",
|
||||
},
|
||||
"additionalProperties": False
|
||||
}
|
||||
|
||||
def setup(self):
|
||||
pass
|
||||
|
||||
|
||||
# NOTE(amaretskiy): Set order to run this just before UserCleanup
|
||||
@context.configure(name="admin_cleanup", order=(sys.maxsize - 1), hidden=True)
|
||||
class AdminCleanup(CleanupMixin, context.Context):
|
||||
"""Context class for admin resources cleanup."""
|
||||
|
||||
@classmethod
|
||||
def validate(cls, config, non_hidden=False):
|
||||
super(AdminCleanup, cls).validate(config, non_hidden)
|
||||
|
||||
missing = set(config)
|
||||
missing -= manager.list_resource_names(admin_required=True)
|
||||
missing = ", ".join(missing)
|
||||
if missing:
|
||||
LOG.info(_("Couldn't find cleanup resource managers: %s")
|
||||
% missing)
|
||||
raise NoSuchCleanupResources(missing)
|
||||
|
||||
@logging.log_task_wrapper(LOG.info, _("admin resources cleanup"))
|
||||
def cleanup(self):
|
||||
manager.cleanup(
|
||||
names=self.config,
|
||||
admin_required=True,
|
||||
admin=self.context["admin"],
|
||||
users=self.context.get("users", []),
|
||||
api_versions=self.context["config"].get("api_versions"))
|
||||
|
||||
|
||||
# NOTE(amaretskiy): Set maximum order to run this last
|
||||
@context.configure(name="cleanup", order=sys.maxsize, hidden=True)
|
||||
class UserCleanup(CleanupMixin, context.Context):
|
||||
"""Context class for user resources cleanup."""
|
||||
|
||||
@classmethod
|
||||
def validate(cls, config, non_hidden=False):
|
||||
super(UserCleanup, cls).validate(config, non_hidden)
|
||||
|
||||
missing = set(config)
|
||||
missing -= manager.list_resource_names(admin_required=False)
|
||||
missing = ", ".join(missing)
|
||||
if missing:
|
||||
LOG.info(_("Couldn't find cleanup resource managers: %s")
|
||||
% missing)
|
||||
raise NoSuchCleanupResources(missing)
|
||||
|
||||
@logging.log_task_wrapper(LOG.info, _("user resources cleanup"))
|
||||
def cleanup(self):
|
||||
manager.cleanup(
|
||||
names=self.config,
|
||||
admin_required=False,
|
||||
users=self.context.get("users", []),
|
||||
api_versions=self.context["config"].get("api_versions")
|
||||
)
|
52
rally/plugins/openstack/context/cleanup/admin.py
Normal file
52
rally/plugins/openstack/context/cleanup/admin.py
Normal file
@ -0,0 +1,52 @@
|
||||
# Copyright 2014: 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.
|
||||
|
||||
import sys
|
||||
|
||||
from rally.common.i18n import _
|
||||
from rally.common import logging
|
||||
from rally.plugins.openstack.cleanup import manager
|
||||
from rally.plugins.openstack.context.cleanup import base
|
||||
from rally.task import context
|
||||
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
# NOTE(amaretskiy): Set order to run this just before UserCleanup
|
||||
@context.configure(name="admin_cleanup", order=(sys.maxsize - 1), hidden=True)
|
||||
class AdminCleanup(base.CleanupMixin, context.Context):
|
||||
"""Context class for admin resources cleanup."""
|
||||
|
||||
@classmethod
|
||||
def validate(cls, config, non_hidden=False):
|
||||
super(AdminCleanup, cls).validate(config, non_hidden)
|
||||
|
||||
missing = set(config)
|
||||
missing -= manager.list_resource_names(admin_required=True)
|
||||
missing = ", ".join(missing)
|
||||
if missing:
|
||||
LOG.info(_("Couldn't find cleanup resource managers: %s")
|
||||
% missing)
|
||||
raise base.NoSuchCleanupResources(missing)
|
||||
|
||||
@logging.log_task_wrapper(LOG.info, _("admin resources cleanup"))
|
||||
def cleanup(self):
|
||||
manager.cleanup(
|
||||
names=self.config,
|
||||
admin_required=True,
|
||||
admin=self.context["admin"],
|
||||
users=self.context.get("users", []),
|
||||
api_versions=self.context["config"].get("api_versions"))
|
@ -1,4 +1,4 @@
|
||||
#
|
||||
# Copyright 2014: Mirantis Inc.
|
||||
# All Rights Reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
@ -13,15 +13,29 @@
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
# NOTE(stpierre): This module is left for backward compatibility.
|
||||
from rally.common.i18n import _
|
||||
from rally.common import logging
|
||||
from rally import consts
|
||||
from rally import exceptions
|
||||
|
||||
import sys
|
||||
import warnings
|
||||
|
||||
from rally.plugins.openstack.cleanup import base
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
warnings.warn("Module rally.plugins.openstack.context.cleanup.base has been "
|
||||
"moved to rally.plugins.openstack.cleanup.base, and will be "
|
||||
"removed at some point in the future.")
|
||||
|
||||
sys.modules["rally.plugins.openstack.context.cleanup.base"] = base
|
||||
class NoSuchCleanupResources(exceptions.RallyException):
|
||||
msg_fmt = _("Missing cleanup resource managers: %(message)s")
|
||||
|
||||
|
||||
class CleanupMixin(object):
|
||||
|
||||
CONFIG_SCHEMA = {
|
||||
"type": "array",
|
||||
"$schema": consts.JSON_SCHEMA,
|
||||
"items": {
|
||||
"type": "string",
|
||||
},
|
||||
"additionalProperties": False
|
||||
}
|
||||
|
||||
def setup(self):
|
||||
pass
|
||||
|
52
rally/plugins/openstack/context/cleanup/user.py
Normal file
52
rally/plugins/openstack/context/cleanup/user.py
Normal file
@ -0,0 +1,52 @@
|
||||
# Copyright 2014: 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.
|
||||
|
||||
import sys
|
||||
|
||||
from rally.common.i18n import _
|
||||
from rally.common import logging
|
||||
from rally.plugins.openstack.cleanup import manager
|
||||
from rally.plugins.openstack.context.cleanup import base
|
||||
from rally.task import context
|
||||
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
# NOTE(amaretskiy): Set maximum order to run this last
|
||||
@context.configure(name="cleanup", order=sys.maxsize, hidden=True)
|
||||
class UserCleanup(base.CleanupMixin, context.Context):
|
||||
"""Context class for user resources cleanup."""
|
||||
|
||||
@classmethod
|
||||
def validate(cls, config, non_hidden=False):
|
||||
super(UserCleanup, cls).validate(config, non_hidden)
|
||||
|
||||
missing = set(config)
|
||||
missing -= manager.list_resource_names(admin_required=False)
|
||||
missing = ", ".join(missing)
|
||||
if missing:
|
||||
LOG.info(_("Couldn't find cleanup resource managers: %s")
|
||||
% missing)
|
||||
raise base.NoSuchCleanupResources(missing)
|
||||
|
||||
@logging.log_task_wrapper(LOG.info, _("user resources cleanup"))
|
||||
def cleanup(self):
|
||||
manager.cleanup(
|
||||
names=self.config,
|
||||
admin_required=False,
|
||||
users=self.context.get("users", []),
|
||||
api_versions=self.context["config"].get("api_versions")
|
||||
)
|
121
tests/unit/plugins/openstack/context/cleanup/test_admin.py
Normal file
121
tests/unit/plugins/openstack/context/cleanup/test_admin.py
Normal file
@ -0,0 +1,121 @@
|
||||
# Copyright 2014: 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.
|
||||
|
||||
import jsonschema
|
||||
import mock
|
||||
|
||||
from rally.plugins.openstack.context.cleanup import admin
|
||||
from rally.plugins.openstack.context.cleanup import base
|
||||
from tests.unit import test
|
||||
|
||||
|
||||
BASE = "rally.plugins.openstack.context.cleanup.admin"
|
||||
|
||||
|
||||
class AdminCleanupTestCase(test.TestCase):
|
||||
|
||||
@mock.patch("%s.manager" % BASE)
|
||||
def test_validate(self, mock_manager):
|
||||
mock_manager.list_resource_names.return_value = set(["a", "b", "c"])
|
||||
admin.AdminCleanup.validate(["a"])
|
||||
mock_manager.list_resource_names.assert_called_once_with(
|
||||
admin_required=True)
|
||||
|
||||
@mock.patch("%s.manager" % BASE)
|
||||
def test_validate_no_such_cleanup(self, mock_manager):
|
||||
mock_manager.list_resource_names.return_value = set(["a", "b", "c"])
|
||||
self.assertRaises(base.NoSuchCleanupResources,
|
||||
admin.AdminCleanup.validate, ["a", "d"])
|
||||
mock_manager.list_resource_names.assert_called_once_with(
|
||||
admin_required=True)
|
||||
|
||||
def test_validate_invalid_config(self):
|
||||
self.assertRaises(jsonschema.ValidationError,
|
||||
admin.AdminCleanup.validate, {})
|
||||
|
||||
@mock.patch("%s.manager.find_resource_managers" % BASE,
|
||||
return_value=[mock.MagicMock(), mock.MagicMock()])
|
||||
@mock.patch("%s.manager.SeekAndDestroy" % BASE)
|
||||
def test_cleanup(self, mock_seek_and_destroy, mock_find_resource_managers):
|
||||
|
||||
ctx = {
|
||||
"config": {"admin_cleanup": ["a", "b"]},
|
||||
"admin": mock.MagicMock(),
|
||||
"users": mock.MagicMock(),
|
||||
"task": mock.MagicMock()
|
||||
}
|
||||
|
||||
admin_cleanup = admin.AdminCleanup(ctx)
|
||||
admin_cleanup.setup()
|
||||
admin_cleanup.cleanup()
|
||||
|
||||
mock_find_resource_managers.assert_called_once_with(["a", "b"], True)
|
||||
mock_seek_and_destroy.assert_has_calls([
|
||||
mock.call(
|
||||
mock_find_resource_managers.return_value[0],
|
||||
ctx["admin"],
|
||||
ctx["users"],
|
||||
None),
|
||||
mock.call().exterminate(),
|
||||
mock.call(
|
||||
mock_find_resource_managers.return_value[1],
|
||||
ctx["admin"],
|
||||
ctx["users"],
|
||||
None),
|
||||
mock.call().exterminate()
|
||||
])
|
||||
|
||||
@mock.patch("%s.manager.find_resource_managers" % BASE,
|
||||
return_value=[mock.MagicMock(), mock.MagicMock()])
|
||||
@mock.patch("%s.manager.SeekAndDestroy" % BASE)
|
||||
def test_cleanup_admin_with_api_versions(
|
||||
self,
|
||||
mock_seek_and_destroy,
|
||||
mock_find_resource_managers):
|
||||
|
||||
ctx = {
|
||||
"config":
|
||||
{"admin_cleanup": ["a", "b"],
|
||||
"api_versions":
|
||||
{"cinder":
|
||||
{"version": "1",
|
||||
"service_type": "volume"
|
||||
}
|
||||
}
|
||||
},
|
||||
"admin": mock.MagicMock(),
|
||||
"users": mock.MagicMock(),
|
||||
"task": mock.MagicMock()
|
||||
}
|
||||
|
||||
admin_cleanup = admin.AdminCleanup(ctx)
|
||||
admin_cleanup.setup()
|
||||
admin_cleanup.cleanup()
|
||||
|
||||
mock_find_resource_managers.assert_called_once_with(["a", "b"], True)
|
||||
mock_seek_and_destroy.assert_has_calls([
|
||||
mock.call(
|
||||
mock_find_resource_managers.return_value[0],
|
||||
ctx["admin"],
|
||||
ctx["users"],
|
||||
ctx["config"]["api_versions"]),
|
||||
mock.call().exterminate(),
|
||||
mock.call(
|
||||
mock_find_resource_managers.return_value[1],
|
||||
ctx["admin"],
|
||||
ctx["users"],
|
||||
ctx["config"]["api_versions"]),
|
||||
mock.call().exterminate()
|
||||
])
|
117
tests/unit/plugins/openstack/context/cleanup/test_user.py
Normal file
117
tests/unit/plugins/openstack/context/cleanup/test_user.py
Normal file
@ -0,0 +1,117 @@
|
||||
# Copyright 2014: 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.
|
||||
|
||||
import jsonschema
|
||||
import mock
|
||||
|
||||
from rally.plugins.openstack.context.cleanup import base
|
||||
from rally.plugins.openstack.context.cleanup import user
|
||||
from tests.unit import test
|
||||
|
||||
|
||||
BASE = "rally.plugins.openstack.context.cleanup.user"
|
||||
|
||||
|
||||
class UserCleanupTestCase(test.TestCase):
|
||||
|
||||
@mock.patch("%s.manager" % BASE)
|
||||
def test_validate(self, mock_manager):
|
||||
mock_manager.list_resource_names.return_value = set(["a", "b", "c"])
|
||||
user.UserCleanup.validate(["a"])
|
||||
mock_manager.list_resource_names.assert_called_once_with(
|
||||
admin_required=False)
|
||||
|
||||
@mock.patch("%s.manager" % BASE)
|
||||
def test_validate_no_such_cleanup(self, mock_manager):
|
||||
mock_manager.list_resource_names.return_value = set(["a", "b", "c"])
|
||||
self.assertRaises(base.NoSuchCleanupResources,
|
||||
user.UserCleanup.validate, ["a", "b", "d"])
|
||||
mock_manager.list_resource_names.assert_called_once_with(
|
||||
admin_required=False)
|
||||
|
||||
def test_validate_invalid_config(self):
|
||||
self.assertRaises(jsonschema.ValidationError,
|
||||
user.UserCleanup.validate, {})
|
||||
|
||||
@mock.patch("%s.manager.find_resource_managers" % BASE,
|
||||
return_value=[mock.MagicMock(), mock.MagicMock()])
|
||||
@mock.patch("%s.manager.SeekAndDestroy" % BASE)
|
||||
def test_cleanup(self, mock_seek_and_destroy, mock_find_resource_managers):
|
||||
|
||||
ctx = {
|
||||
"config": {"cleanup": ["a", "b"]},
|
||||
"users": mock.MagicMock(),
|
||||
"task": mock.MagicMock()
|
||||
}
|
||||
|
||||
admin_cleanup = user.UserCleanup(ctx)
|
||||
admin_cleanup.setup()
|
||||
admin_cleanup.cleanup()
|
||||
|
||||
mock_find_resource_managers.assert_called_once_with(["a", "b"], False)
|
||||
|
||||
mock_seek_and_destroy.assert_has_calls([
|
||||
mock.call(
|
||||
mock_find_resource_managers.return_value[0],
|
||||
None, ctx["users"], None),
|
||||
mock.call().exterminate(),
|
||||
mock.call(
|
||||
mock_find_resource_managers.return_value[1],
|
||||
None, ctx["users"], None),
|
||||
mock.call().exterminate()
|
||||
])
|
||||
|
||||
@mock.patch("%s.manager.find_resource_managers" % BASE,
|
||||
return_value=[mock.MagicMock(), mock.MagicMock()])
|
||||
@mock.patch("%s.manager.SeekAndDestroy" % BASE)
|
||||
def test_cleanup_user_with_api_versions(
|
||||
self,
|
||||
mock_seek_and_destroy,
|
||||
mock_find_resource_managers):
|
||||
|
||||
ctx = {
|
||||
"config":
|
||||
{"admin_cleanup": ["a", "b"],
|
||||
"api_versions":
|
||||
{"cinder":
|
||||
{"version": "1",
|
||||
"service_type": "volume"
|
||||
}
|
||||
}
|
||||
},
|
||||
"admin": mock.MagicMock(),
|
||||
"users": mock.MagicMock(),
|
||||
"task": mock.MagicMock()
|
||||
}
|
||||
|
||||
user_cleanup = user.UserCleanup(ctx)
|
||||
user_cleanup.setup()
|
||||
user_cleanup.cleanup()
|
||||
|
||||
mock_find_resource_managers.assert_called_once_with({}, False)
|
||||
mock_seek_and_destroy.assert_has_calls([
|
||||
mock.call(
|
||||
mock_find_resource_managers.return_value[0],
|
||||
None,
|
||||
ctx["users"],
|
||||
ctx["config"]["api_versions"]),
|
||||
mock.call().exterminate(),
|
||||
mock.call(
|
||||
mock_find_resource_managers.return_value[1],
|
||||
None,
|
||||
ctx["users"],
|
||||
ctx["config"]["api_versions"]),
|
||||
mock.call().exterminate()
|
||||
])
|
Loading…
Reference in New Issue
Block a user