Merge "Add support for subdirs in templates listing"
This commit is contained in:
commit
c8e3799f55
@ -280,35 +280,61 @@ class PlansShellTest(BasePlansShellTest):
|
|||||||
@mock.patch('tuskarclient.v2.plans_shell.os.mkdir', 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.os.path.isdir', create=True)
|
||||||
@mock.patch('tuskarclient.v2.plans_shell.open', create=True)
|
@mock.patch('tuskarclient.v2.plans_shell.open', create=True)
|
||||||
|
@mock.patch('tuskarclient.v2.plans_shell.os.path.exists', create=True)
|
||||||
|
@mock.patch('tuskarclient.v2.plans_shell.os.makedirs', create=True)
|
||||||
def test_plan_templates(
|
def test_plan_templates(
|
||||||
self, mock_open, mock_isdir, mock_mkdir, mock_print):
|
self, mock_makedirs, mock_exists, mock_open, mock_isdir,
|
||||||
|
mock_mkdir, mock_print):
|
||||||
args = empty_args()
|
args = empty_args()
|
||||||
args.plan_uuid = 'plan_uuid'
|
args.plan_uuid = 'plan_uuid'
|
||||||
args.output_dir = 'outdir/subdir'
|
args.output_dir = 'outdir/subdir'
|
||||||
|
|
||||||
|
# Simulate the first exists check being false and the subsequent check
|
||||||
|
# being true so as to exercise that makesdirs is only called once
|
||||||
|
# per nested directory.
|
||||||
|
exists_return_values = [False, True]
|
||||||
|
|
||||||
|
def toggle_exists_result(*e_args, **e_kwargs):
|
||||||
|
return exists_return_values.pop(0)
|
||||||
|
mock_exists.side_effect = toggle_exists_result
|
||||||
|
|
||||||
mock_isdir.return_value = False
|
mock_isdir.return_value = False
|
||||||
self.tuskar.plans.templates.return_value = {
|
self.tuskar.plans.templates.return_value = {
|
||||||
'name_foo': 'value_foo',
|
'name_foo': 'value_foo',
|
||||||
'name_bar': 'value_bar'
|
'name_bar': 'value_bar',
|
||||||
|
'nested/name_baz': 'value_baz',
|
||||||
|
'nested/name_zom': 'value_zom'
|
||||||
}
|
}
|
||||||
|
|
||||||
self.shell.do_plan_templates(self.tuskar, args, outfile=self.outfile)
|
self.shell.do_plan_templates(self.tuskar, args, outfile=self.outfile)
|
||||||
|
|
||||||
mock_isdir.assert_called_with('outdir/subdir')
|
# Initial check and creation of the output directory
|
||||||
mock_mkdir.assert_called_with('outdir/subdir')
|
mock_isdir.assert_any_call('outdir/subdir')
|
||||||
|
mock_mkdir.assert_any_call('outdir/subdir')
|
||||||
|
|
||||||
|
# Checks and creation of nested directory
|
||||||
|
self.assertEqual(mock_exists.call_count, 2)
|
||||||
|
self.assertEqual(mock_makedirs.call_count, 1)
|
||||||
|
mock_makedirs.assert_called_with('outdir/subdir/nested')
|
||||||
|
|
||||||
self.tuskar.plans.templates.assert_called_with('plan_uuid')
|
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_foo', 'w+')
|
||||||
mock_open.assert_any_call('outdir/subdir/name_bar', 'w+')
|
mock_open.assert_any_call('outdir/subdir/name_bar', 'w+')
|
||||||
self.assertEqual(mock_open.call_count, 2)
|
mock_open.assert_any_call('outdir/subdir/nested/name_baz', 'w+')
|
||||||
|
mock_open.assert_any_call('outdir/subdir/nested/name_zom', 'w+')
|
||||||
|
self.assertEqual(mock_open.call_count, 4)
|
||||||
|
|
||||||
mock_opened_file = mock_open.return_value.__enter__.return_value
|
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_foo')
|
||||||
mock_opened_file.write.assert_any_call('value_bar')
|
mock_opened_file.write.assert_any_call('value_bar')
|
||||||
self.assertEqual(mock_opened_file.write.call_count, 2)
|
mock_opened_file.write.assert_any_call('value_baz')
|
||||||
|
mock_opened_file.write.assert_any_call('value_zom')
|
||||||
|
self.assertEqual(mock_opened_file.write.call_count, 4)
|
||||||
|
|
||||||
mock_print.assert_any_call('Following templates has been written:')
|
mock_print.assert_any_call('The following templates will be written:')
|
||||||
mock_print.assert_any_call('outdir/subdir/name_foo')
|
mock_print.assert_any_call('outdir/subdir/name_foo')
|
||||||
mock_print.assert_any_call('outdir/subdir/name_bar')
|
mock_print.assert_any_call('outdir/subdir/name_bar')
|
||||||
self.assertEqual(mock_print.call_count, 3)
|
mock_print.assert_any_call('outdir/subdir/nested/name_baz')
|
||||||
|
mock_print.assert_any_call('outdir/subdir/nested/name_zom')
|
||||||
|
self.assertEqual(mock_print.call_count, 5)
|
||||||
|
@ -265,8 +265,19 @@ def do_plan_templates(tuskar, args, outfile=sys.stdout):
|
|||||||
templates = tuskar.plans.templates(args.plan_uuid)
|
templates = tuskar.plans.templates(args.plan_uuid)
|
||||||
|
|
||||||
# write file for each key-value in templates
|
# write file for each key-value in templates
|
||||||
print("Following templates has been written:")
|
print("The following templates will be written:")
|
||||||
for template_name, template_content in templates.items():
|
for template_name, template_content in templates.items():
|
||||||
|
|
||||||
|
# It's possible to organize the role templates and their dependent
|
||||||
|
# files into directories, in which case the template_name will carry
|
||||||
|
# the directory information. If that's the case, first create the
|
||||||
|
# directory structure (if it hasn't already been created by another
|
||||||
|
# file in the templates list).
|
||||||
|
template_dir = os.path.dirname(template_name)
|
||||||
|
output_template_dir = os.path.join(output_dir, template_dir)
|
||||||
|
if template_dir and not os.path.exists(output_template_dir):
|
||||||
|
os.makedirs(output_template_dir)
|
||||||
|
|
||||||
filename = os.path.join(output_dir, template_name)
|
filename = os.path.join(output_dir, template_name)
|
||||||
with open(filename, 'w+') as template_file:
|
with open(filename, 'w+') as template_file:
|
||||||
template_file.write(template_content)
|
template_file.write(template_content)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user