Merge "Allows fetching of deployments from all environments."

This commit is contained in:
Jenkins 2017-03-06 01:46:44 +00:00 committed by Gerrit Code Review
commit c9069b726e
6 changed files with 137 additions and 12 deletions

View File

@ -16,6 +16,8 @@ from osc_lib.command import command
from osc_lib import utils
from oslo_log import log as logging
from muranoclient.apiclient import exceptions
LOG = logging.getLogger(__name__)
@ -27,8 +29,16 @@ class ListDeployment(command.Lister):
parser.add_argument(
"id",
metavar="<ID>",
nargs="?",
default=None,
help=("Environment ID for which to list deployments."),
)
parser.add_argument(
"--all-environments",
action="store_true",
default=False,
help="List all deployments for all environments in user's tenant."
)
return parser
@ -36,9 +46,22 @@ class ListDeployment(command.Lister):
LOG.debug("take_action({0})".format(parsed_args))
client = self.app.client_manager.application_catalog
environment = utils.find_resource(client.environments,
parsed_args.id)
data = client.deployments.list(environment.id)
all_environments = getattr(parsed_args, 'all_environments', False)
env_id = getattr(parsed_args, 'id', None)
if env_id and all_environments:
raise exceptions.CommandError(
'Environment ID and all-environments flag cannot both be set.')
elif not env_id and not all_environments:
raise exceptions.CommandError(
'Either environment ID or all-environments flag must be set.')
if all_environments:
data = client.deployments.list(None, all_environments)
else:
environment = utils.find_resource(client.environments,
env_id)
data = client.deployments.list(environment.id)
columns = ('id', 'state', 'created', 'updated', 'finished')
column_headers = [c.capitalize() for c in columns]

View File

@ -19,6 +19,10 @@ from muranoclient.v1 import deployments as api_deployment
DEPLOYMENT_COLUMNS = ('id', 'state', 'created', 'updated', 'finished')
DEPLOYMENT_DATA = ('xyz123', 'success', '2016-06-25T12:21:37',
'2016-06-25T12:21:47', '2016-06-25T12:21:47')
ALL_DEPLOYMENT_DATA = (('abc123', 'success', '2016-06-25T12:21:37',
'2016-06-25T12:21:47', '2016-06-25T12:21:47'),
('xyz456', 'success', '2017-01-31T11:22:35',
'2017-01-31T11:22:47', '2017-01-31T11:22:47'))
class TestDeployment(fakes.TestApplicationCatalog):
@ -42,7 +46,7 @@ class TestListDeployment(TestDeployment):
self.cmd = osc_deployment.ListDeployment(self.app, None)
@mock.patch('osc_lib.utils.get_item_properties')
def test_category_list(self, mock_util):
def test_deployment_list(self, mock_util):
arglist = ['xyz123']
verifylist = [('id', 'xyz123')]
mock_util.return_value = DEPLOYMENT_DATA
@ -58,3 +62,21 @@ class TestListDeployment(TestDeployment):
# Check that data is correct
expected_data = [DEPLOYMENT_DATA]
self.assertEqual(expected_data, data)
@mock.patch('osc_lib.utils.get_item_properties', autospec=True)
def test_deployment_list_all_environments(self, mock_util):
arglist = ['--all-environments']
verifylist = [('id', None), ('all_environments', True)]
mock_util.return_value = ALL_DEPLOYMENT_DATA
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
# Check that columns are correct
expected_columns = [c.title() for c in DEPLOYMENT_COLUMNS]
self.assertEqual(expected_columns, columns)
# Check that data is correct
expected_data = [ALL_DEPLOYMENT_DATA]
self.assertEqual(expected_data, data)

View File

@ -18,6 +18,7 @@ import testtools
from muranoclient import client
from muranoclient.v1 import actions
from muranoclient.v1 import deployments
import muranoclient.v1.environments as environments
from muranoclient.v1 import packages
import muranoclient.v1.sessions as sessions
@ -331,3 +332,24 @@ class UnitTestsForClassesAndFunctions(testtools.TestCase):
result = manager.get('test')
self.assertIsNotNone(result.manager)
def test_deployment_manager_list(self):
manager = deployments.DeploymentManager(api)
manager._list = mock.Mock(return_value=mock.sentinel.deployments)
result = manager.list(mock.sentinel.environment_id)
self.assertEqual(mock.sentinel.deployments, result)
manager._list.assert_called_once_with(
'/v1/environments/sentinel.environment_id/deployments',
'deployments')
def test_deployment_manager_list_all_environments(self):
manager = deployments.DeploymentManager(api)
manager._list = mock.Mock(return_value=mock.sentinel.deployments)
result = manager.list(mock.sentinel.environment_id,
all_environments=True)
self.assertEqual(mock.sentinel.deployments, result)
manager._list.assert_called_once_with('/v1/deployments', 'deployments')

View File

@ -816,6 +816,44 @@ class ShellCommandTest(ShellTest):
name='env-id-or-name')
self.assertEqual(1, self.client.deployments.list.call_count)
@mock.patch('muranoclient.v1.deployments.DeploymentManager')
@requests_mock.mock()
def test_deployments_list_all_environments(self, mock_deployment_manager,
m_requests):
self.client.deployments = mock_deployment_manager()
self.make_env()
self.register_keystone_discovery_fixture(m_requests)
self.register_keystone_token_fixture(m_requests)
self.shell('deployment-list --all-environments')
self.client.deployments.list.assert_called_once_with(
None, True)
@mock.patch('muranoclient.v1.deployments.DeploymentManager')
@requests_mock.mock()
def test_deployments_list_negative(self, mock_deployment_manager,
m_requests):
self.client.deployments = mock_deployment_manager()
self.make_env()
self.register_keystone_discovery_fixture(m_requests)
self.register_keystone_token_fixture(m_requests)
e = self.assertRaises(
exceptions.CommandError,
self.shell,
'deployment-list env-id --all-environments')
self.assertIn(
'Environment ID and all-environments flag cannot both be set.',
e.__str__())
self.assertFalse(self.client.deployments.list.called)
e = self.assertRaises(
exceptions.CommandError,
self.shell,
'deployment-list')
self.assertIn(
'Either environment ID or all-environments flag must be set.',
e.__str__())
self.assertFalse(self.client.deployments.list.called)
@mock.patch('muranoclient.v1.services.ServiceManager')
@mock.patch('muranoclient.v1.environments.EnvironmentManager')
@requests_mock.mock()

View File

@ -34,9 +34,12 @@ class Status(base.Resource):
class DeploymentManager(base.Manager):
resource_class = Deployment
def list(self, environment_id):
return self._list('/v1/environments/{id}/deployments'.
format(id=environment_id), 'deployments')
def list(self, environment_id, all_environments=False):
if all_environments:
return self._list('/v1/deployments', 'deployments')
else:
return self._list('/v1/environments/{id}/deployments'.
format(id=environment_id), 'deployments')
def reports(self, environment_id, deployment_id, *service_ids):
path = '/v1/environments/{id}/deployments/{deployment_id}'

View File

@ -523,15 +523,32 @@ def do_env_template_clone(mc, args):
utils.print_dict(env_template.to_dict(), formatters=formatters)
@utils.arg("id", metavar="<ID>",
@utils.arg("id", metavar="<ID>", nargs='?', default=None,
help="Environment ID for which to list deployments.")
@utils.arg('--all-environments', action='store_true', default=False,
help="Lists all deployments for all environments in user's tenant.")
def do_deployment_list(mc, args):
"""List deployments for an environment."""
"""List deployments for an environment or multiple environments."""
all_environments = getattr(args, 'all_environments', False)
env_id = getattr(args, 'id', None)
if env_id and all_environments:
raise exceptions.CommandError(
'Environment ID and all-environments flag cannot both be set.')
elif not env_id and not all_environments:
raise exceptions.CommandError(
'Either environment ID or all-environments flag must be set.')
try:
environment = utils.find_resource(mc.environments, args.id)
deployments = mc.deployments.list(environment.id)
if all_environments:
deployments = mc.deployments.list(None, all_environments)
else:
environment = utils.find_resource(mc.environments, env_id)
deployments = mc.deployments.list(environment.id)
except exceptions.NotFound:
raise exceptions.CommandError("Environment %s not found" % args.id)
if env_id:
msg = "Environment %s not found" % env_id
else:
msg = "Environments not found"
raise exceptions.CommandError(msg)
else:
field_labels = ["ID", "State", "Created", "Updated", "Finished"]
fields = ["id", "state", "created", "updated", "finished"]