Petr Blaho dc170a3b22 Adds plan-templates command to CLI
Adds plan-templates command to command line interface.
This commands needs Plan UUID and output directory parameters
and it will retrieve templates of one particular Plan
and writes one file for each template to output directory.
Adds tests for this behavior.

Change-Id: Ie9a7418d4f2abc0fabc8642c0daf60cd4508ca84
2014-09-15 14:41:04 +02:00

170 lines
6.5 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.
import mock
import six
import tuskarclient.tests.utils as tutils
from tuskarclient.v2 import plans_shell
def empty_args():
args = mock.Mock(spec=[])
for attr in ['uuid', 'name', 'description', 'attributes']:
setattr(args, attr, None)
return args
def mock_plan():
plan = mock.Mock()
plan.uuid = '5'
plan.name = 'My Plan'
return plan
class BasePlansShellTest(tutils.TestCase):
def setUp(self):
super(BasePlansShellTest, self).setUp()
self.outfile = six.StringIO()
self.tuskar = mock.MagicMock()
self.shell = plans_shell
class PlansShellTest(BasePlansShellTest):
@mock.patch('tuskarclient.common.formatting.print_list')
def test_plan_list(self, mock_print_list):
args = empty_args()
self.shell.do_plan_list(self.tuskar, args, outfile=self.outfile)
# testing the other arguments would be just copy-paste
mock_print_list.assert_called_with(
self.tuskar.plans.list.return_value, mock.ANY, mock.ANY,
outfile=self.outfile
)
@mock.patch('tuskarclient.common.utils.find_resource')
@mock.patch('tuskarclient.v2.plans_shell.print_plan_detail')
def test_plan_show(self, mock_print_detail, mock_find_resource):
mock_find_resource.return_value = mock_plan()
args = empty_args()
args.plan = '5'
self.shell.do_plan_show(self.tuskar, args, outfile=self.outfile)
mock_find_resource.assert_called_with(self.tuskar.plans, '5')
mock_print_detail.assert_called_with(mock_find_resource.return_value,
outfile=self.outfile)
@mock.patch('tuskarclient.common.utils.find_resource')
def test_plan_delete(self, mock_find_resource):
mock_find_resource.return_value = mock_plan()
args = empty_args()
args.plan = '5'
self.shell.do_plan_delete(self.tuskar, args, outfile=self.outfile)
self.tuskar.plans.delete.assert_called_with('5')
self.assertEqual('Deleted Plan "My Plan".\n',
self.outfile.getvalue())
@mock.patch('tuskarclient.v2.plans_shell.print_plan_detail')
def test_plan_create(self, mock_print_detail):
args = empty_args()
args.name = 'my_plan'
args.description = 'my plan description'
self.shell.do_plan_create(self.tuskar, args, outfile=self.outfile)
self.tuskar.plans.create.assert_called_with(
name='my_plan',
description='my plan description'
)
mock_print_detail.assert_called_with(
self.tuskar.plans.create.return_value, outfile=self.outfile)
@mock.patch('tuskarclient.v2.plans_shell.print_plan_detail')
def test_add_role(self, mock_print_detail):
args = empty_args()
args.plan_uuid = '42'
args.role_uuid = 'role_uuid'
self.shell.do_plan_add_role(self.tuskar, args, outfile=self.outfile)
self.tuskar.plans.add_role.assert_called_with('42', 'role_uuid')
mock_print_detail.assert_called_with(
self.tuskar.plans.add_role.return_value, outfile=self.outfile)
@mock.patch('tuskarclient.v2.plans_shell.print_plan_detail')
def test_remove_role(self, mock_print_detail):
args = empty_args()
args.plan_uuid = '42'
args.role_uuid = 'role_uuid'
self.shell.do_plan_remove_role(self.tuskar, args, outfile=self.outfile)
self.tuskar.plans.remove_role.assert_called_with('42', 'role_uuid')
mock_print_detail.assert_called_with(
self.tuskar.plans.remove_role.return_value, outfile=self.outfile)
@mock.patch('tuskarclient.v2.plans_shell.print_plan_detail')
def test_plan_patch(self, mock_print_detail):
args = empty_args()
args.plan_uuid = 'plan_uuid'
args.attributes = ['foo_name=foo_value',
'bar_name=bar_value']
attributes = [{'name': 'foo_name', 'value': 'foo_value'},
{'name': 'bar_name', 'value': 'bar_value'}]
self.shell.do_plan_patch(self.tuskar, args, outfile=self.outfile)
self.tuskar.plans.patch.assert_called_once()
self.assertEqual('plan_uuid',
self.tuskar.plans.patch.call_args[0][0])
self.assertEqual(
sorted(attributes, key=lambda k: k['name']),
sorted(self.tuskar.plans.patch.call_args[0][1],
key=lambda k: k['name']))
@mock.patch('tuskarclient.v2.plans_shell.print', create=True)
@mock.patch('tuskarclient.v2.plans_shell.os.mkdir', create=True)
@mock.patch('tuskarclient.v2.plans_shell.os.path.isdir', create=True)
@mock.patch('tuskarclient.v2.plans_shell.open', create=True)
def test_plan_templates(
self, mock_open, mock_isdir, mock_mkdir, mock_print):
args = empty_args()
args.plan_uuid = 'plan_uuid'
args.output_dir = 'outdir/subdir'
mock_isdir.return_value = False
self.tuskar.plans.templates.return_value = {
'name_foo': 'value_foo',
'name_bar': 'value_bar'
}
self.shell.do_plan_templates(self.tuskar, args, outfile=self.outfile)
mock_isdir.assert_called_with('outdir/subdir')
mock_mkdir.assert_called_with('outdir/subdir')
self.tuskar.plans.templates.assert_called_with('plan_uuid')
mock_open.assert_any_call('outdir/subdir/name_foo', 'w+')
mock_open.assert_any_call('outdir/subdir/name_bar', 'w+')
self.assertEqual(mock_open.call_count, 2)
mock_opened_file = mock_open.return_value.__enter__.return_value
mock_opened_file.write.assert_any_call('value_foo')
mock_opened_file.write.assert_any_call('value_bar')
self.assertEqual(mock_opened_file.write.call_count, 2)
mock_print.assert_any_call('Following templates has been written:')
mock_print.assert_any_call('outdir/subdir/name_foo')
mock_print.assert_any_call('outdir/subdir/name_bar')
self.assertEqual(mock_print.call_count, 3)