From 47862b56bd90c3edaab3345577901367a73cfd98 Mon Sep 17 00:00:00 2001
From: Maksim Malchuk <maksim.malchuk@gmail.com>
Date: Tue, 1 Mar 2022 01:20:38 +0300
Subject: [PATCH] Fix maximum width of the DIB Multiline-YAML

The dib_env_vars variable in the Bifrost's dib.yml file can contain
the DIB_BLOCK_DEVICE_CONFIG environment variable which is always the
Multiline-YAML data. By default, the format of the data is not
preserved while the configuration is merged and saved for the
bifrost-deploy container.

This is because Ansible uses the PyYAML library which has a default
80 symbol string length limit. The official Ansible documentation [1]
recommends using to_yaml or to_nice_yaml filters with width parameter.
This change adds the same ability to the merge_yaml Ansible plugin.

1. https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#formatting-data-yaml-and-json

The related change for the diskimage-builder to solve the issue with
incorrect data provided by Kolla-Ansible is also provided:
I3b74ede69eb064ad813a9108ec68a228e549e8bb

Closes-Bug: #2014980
Related-Bug: #2014981
Change-Id: Id79445c0311916ac6c1beb3986e14f652ee5a63c
Signed-off-by: Maksim Malchuk <maksim.malchuk@gmail.com>
---
 ansible/action_plugins/merge_yaml.py   | 14 +++++++++++++-
 ansible/roles/bifrost/tasks/config.yml |  1 +
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/ansible/action_plugins/merge_yaml.py b/ansible/action_plugins/merge_yaml.py
index 648109163..ea7350bf7 100644
--- a/ansible/action_plugins/merge_yaml.py
+++ b/ansible/action_plugins/merge_yaml.py
@@ -55,6 +55,14 @@ options:
     default: False
     required: False
     type: bool
+  yaml_width:
+    description:
+      - The maximum width of the YAML document. By default, Ansible uses the
+        PyYAML library which has a default 80 symbol string length limit.
+        To change the limit, the new value can be used here.
+    default: None
+    required: False
+    type: int
 author: Sean Mooney
 '''
 
@@ -68,6 +76,7 @@ Merge multiple yaml files:
         sources:
           - "/tmp/default.yml"
           - "/tmp/override.yml"
+        yaml_width: 131072
         dest:
           - "/tmp/out.yml"
 '''
@@ -113,6 +122,7 @@ class ActionModule(action.ActionBase):
         output = {}
         sources = self._task.args.get('sources', None)
         extend_lists = self._task.args.get('extend_lists', False)
+        yaml_width = self._task.args.get('yaml_width', None)
         if not isinstance(sources, list):
             sources = [sources]
         for source in sources:
@@ -127,11 +137,13 @@ class ActionModule(action.ActionBase):
         try:
             result_file = os.path.join(local_tempdir, 'source')
             with open(result_file, 'w') as f:
-                f.write(yaml.dump(output, default_flow_style=False))
+                f.write(yaml.dump(output, default_flow_style=False,
+                                  width=yaml_width))
 
             new_task = self._task.copy()
             new_task.args.pop('sources', None)
             new_task.args.pop('extend_lists', None)
+            new_task.args.pop('yaml_width', None)
             new_task.args.update(
                 dict(
                     src=result_file
diff --git a/ansible/roles/bifrost/tasks/config.yml b/ansible/roles/bifrost/tasks/config.yml
index 3ca431bfe..6a996193a 100644
--- a/ansible/roles/bifrost/tasks/config.yml
+++ b/ansible/roles/bifrost/tasks/config.yml
@@ -17,6 +17,7 @@
       - "{{ node_custom_config }}/{{ item }}.yml"
       - "{{ node_custom_config }}/bifrost/{{ item }}.yml"
     dest: "{{ node_config_directory }}/bifrost/{{ item }}.yml"
+    yaml_width: 131072
     mode: "0660"
   become: true
   with_items:
-- 
GitLab