Support including and excluding files from config save

Currently in the upgrade job we are seeing the OOM killer kick in during
the 'overcloud service configuration save' command. Ansible is quite
inefficient when copying large files around, so excluding the large IPA
images should relieve some memory pressure.

Change-Id: I3a230b0a699154606ca8faa00a85d45ae815c599
Story: 2004704
Task: 28733
This commit is contained in:
Mark Goddard 2019-01-09 09:55:34 +00:00
parent 3766b33557
commit fb70e99a4b
5 changed files with 71 additions and 5 deletions

View File

@ -15,6 +15,8 @@
find: find:
paths: "{{ node_config_directory }}" paths: "{{ node_config_directory }}"
recurse: True recurse: True
excludes: "{{ exclude_patterns | default(omit) }}"
patterns: "{{ include_patterns | default(omit) }}"
register: find_result register: find_result
become: true become: true

View File

@ -353,11 +353,9 @@ function overcloud_upgrade {
fi fi
echo "Saving overcloud service configuration" echo "Saving overcloud service configuration"
if ! run_kayobe overcloud service configuration save; then # Don't copy the ironic IPA kernel and ramdisk, since these files can be
# NOTE(mgoddard): This fails in CI due to a memory error while copying # quite large.
# the IPA deployment images. run_kayobe overcloud service configuration save --exclude 'ironic-agent.*'
echo "FIXME: Saving service configuration failed. Ignoring for now"
fi
echo "Deploying containerised overcloud services" echo "Deploying containerised overcloud services"
run_kayobe overcloud service upgrade run_kayobe overcloud service upgrade

View File

@ -952,6 +952,12 @@ class OvercloudServiceConfigurationSave(KayobeAnsibleMixin, VaultMixin,
parser = super(OvercloudServiceConfigurationSave, self).get_parser( parser = super(OvercloudServiceConfigurationSave, self).get_parser(
prog_name) prog_name)
group = parser.add_argument_group("Service configuration") group = parser.add_argument_group("Service configuration")
group.add_argument("--exclude",
help="optional comma-separated list of patterns "
"matching filenames to exclude")
group.add_argument("--include",
help="optional comma-separated list of patterns "
"matching filenames to include")
group.add_argument("--node-config-dir", group.add_argument("--node-config-dir",
help="the directory to store the config files on " help="the directory to store the config files on "
"the remote node (default /etc/kolla)") "the remote node (default /etc/kolla)")
@ -964,6 +970,10 @@ class OvercloudServiceConfigurationSave(KayobeAnsibleMixin, VaultMixin,
self.app.LOG.debug("Saving overcloud service configuration") self.app.LOG.debug("Saving overcloud service configuration")
playbooks = _build_playbook_list("overcloud-service-config-save") playbooks = _build_playbook_list("overcloud-service-config-save")
extra_vars = {} extra_vars = {}
if parsed_args.exclude:
extra_vars["exclude_patterns"] = parsed_args.exclude
if parsed_args.include:
extra_vars["include_patterns"] = parsed_args.include
if parsed_args.output_dir: if parsed_args.output_dir:
extra_vars["config_save_path"] = parsed_args.output_dir extra_vars["config_save_path"] = parsed_args.output_dir
if parsed_args.node_config_dir: if parsed_args.node_config_dir:

View File

@ -1165,6 +1165,56 @@ class TestCase(unittest.TestCase):
] ]
self.assertEqual(expected_calls, mock_run.call_args_list) self.assertEqual(expected_calls, mock_run.call_args_list)
@mock.patch.object(commands.KayobeAnsibleMixin,
"run_kayobe_playbooks")
def test_overcloud_service_configuration_save(self, mock_run):
command = commands.OvercloudServiceConfigurationSave(TestApp(), [])
parser = command.get_parser("test")
parsed_args = parser.parse_args([])
result = command.run(parsed_args)
self.assertEqual(0, result)
expected_calls = [
mock.call(
mock.ANY,
[
utils.get_data_files_path(
"ansible", "overcloud-service-config-save.yml"),
],
extra_vars={}
),
]
self.assertEqual(expected_calls, mock_run.call_args_list)
@mock.patch.object(commands.KayobeAnsibleMixin,
"run_kayobe_playbooks")
def test_overcloud_service_configuration_save_args(self, mock_run):
command = commands.OvercloudServiceConfigurationSave(TestApp(), [])
parser = command.get_parser("test")
parsed_args = parser.parse_args([
"--exclude", "exclude1,exclude2",
"--include", "include1,include2",
"--node-config-dir", "/path/to/config",
"--output-dir", "/path/to/output",
])
result = command.run(parsed_args)
self.assertEqual(0, result)
expected_calls = [
mock.call(
mock.ANY,
[
utils.get_data_files_path(
"ansible", "overcloud-service-config-save.yml"),
],
extra_vars={
"exclude_patterns": "exclude1,exclude2",
"include_patterns": "include1,include2",
"config_save_path": "/path/to/output",
"node_config_directory": "/path/to/config",
}
),
]
self.assertEqual(expected_calls, mock_run.call_args_list)
@mock.patch.object(commands.KayobeAnsibleMixin, @mock.patch.object(commands.KayobeAnsibleMixin,
"run_kayobe_playbooks") "run_kayobe_playbooks")
def test_overcloud_container_image_build(self, mock_run): def test_overcloud_container_image_build(self, mock_run):

View File

@ -0,0 +1,6 @@
---
features:
- |
Adds support for including or excluding files from the output of ``kayobe
overcloud service configuration save``. This is particularly useful for
large files such as the Ironic IPA images.