From d516ad7da2d86ad03374f8244f6738ee65d6f6a4 Mon Sep 17 00:00:00 2001
From: Jorge Niedbalski <jorge.niedbalski@linaro.org>
Date: Thu, 8 Mar 2018 13:06:33 +0100
Subject: [PATCH] horizon: allow to configure by custom_local_settings.j2

kolla-ansible should provide a mechanism to allow operators to overwrite
the default (or not exposed through configuration) options for the
local_settings.

local_settings.j2 may be good place to configure horizon but requires
operator to sync it every release.

custom_local_settings.j2 can be used to overwrite things from
local_settings.j2 without a need of syncing it first.

This patch also adds a release note and a documentation section
under the advanced configuration page.

Partial-Bug: #1769970
Depends-On: https://review.openstack.org/#/c/567006/
Change-Id: I84b54ba737276114e512d4577ac4b9010682bb98
---
 ansible/roles/horizon/handlers/main.yml       |  1 +
 ansible/roles/horizon/tasks/config.yml        | 19 ++++++++++++
 .../templates/custom_local_settings.j2        |  0
 .../roles/horizon/templates/horizon.json.j2   |  6 ++++
 .../roles/horizon/templates/local_settings.j2 |  3 ++
 doc/source/reference/horizon-guide.rst        | 30 +++++++++++++++++++
 doc/source/reference/index.rst                |  1 +
 ...custom-settings-file-d5dfab8a1a3b4ee7.yaml |  5 ++++
 8 files changed, 65 insertions(+)
 create mode 100644 ansible/roles/horizon/templates/custom_local_settings.j2
 create mode 100644 doc/source/reference/horizon-guide.rst
 create mode 100644 releasenotes/notes/add-horizon-custom-settings-file-d5dfab8a1a3b4ee7.yaml

diff --git a/ansible/roles/horizon/handlers/main.yml b/ansible/roles/horizon/handlers/main.yml
index 852e777b85..8d6df8518f 100644
--- a/ansible/roles/horizon/handlers/main.yml
+++ b/ansible/roles/horizon/handlers/main.yml
@@ -17,5 +17,6 @@
     - horizon_config_json | changed
       or horizon_conf | changed
       or horizon_local_settings | changed
+      or horizon_custom_local_settings | changed
       or policy_jsons | changed
       or check_horizon_container | changed
diff --git a/ansible/roles/horizon/tasks/config.yml b/ansible/roles/horizon/tasks/config.yml
index d52761aada..45a4d1c133 100644
--- a/ansible/roles/horizon/tasks/config.yml
+++ b/ansible/roles/horizon/tasks/config.yml
@@ -98,6 +98,25 @@
   notify:
     - Restart horizon container
 
+- name: Copying over custom_local_settings
+  become: true
+  vars:
+    horizon: "{{ horizon_services['horizon'] }}"
+  template:
+    src: "{{ item }}"
+    dest: "{{ node_config_directory }}/horizon/custom_local_settings"
+    mode: "0660"
+  with_first_found:
+    - "{{ node_custom_config }}/horizon/{{ inventory_hostname }}/custom_local_settings"
+    - "{{ node_custom_config }}/horizon/custom_local_settings"
+    - "custom_local_settings.j2"
+  register: horizon_custom_local_settings
+  when:
+    - horizon.enabled | bool
+    - inventory_hostname in groups[horizon.group]
+  notify:
+    - Restart horizon container
+
 - name: Copying over existing policy file
   become: true
   vars:
diff --git a/ansible/roles/horizon/templates/custom_local_settings.j2 b/ansible/roles/horizon/templates/custom_local_settings.j2
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/ansible/roles/horizon/templates/horizon.json.j2 b/ansible/roles/horizon/templates/horizon.json.j2
index b565070761..90775ace05 100644
--- a/ansible/roles/horizon/templates/horizon.json.j2
+++ b/ansible/roles/horizon/templates/horizon.json.j2
@@ -49,6 +49,12 @@
             "dest": "/etc/openstack-dashboard/local_settings",
             "owner": "horizon",
             "perm": "0600"
+        },
+        {
+            "source": "{{ container_config_directory }}/custom_local_settings",
+            "dest": "/etc/openstack-dashboard/custom_local_settings",
+            "owner": "horizon",
+            "perm": "0600"
         }
     ]
 }
diff --git a/ansible/roles/horizon/templates/local_settings.j2 b/ansible/roles/horizon/templates/local_settings.j2
index 9ce7357066..50e26ee1dd 100644
--- a/ansible/roles/horizon/templates/local_settings.j2
+++ b/ansible/roles/horizon/templates/local_settings.j2
@@ -841,3 +841,6 @@ KEY_MANAGER = {
         'project_domain_name': '{{ default_project_domain_name }}'
 }
 {% endif %}
+
+# Allow operators to overwrite variables (LP: #1769970).
+from custom_local_settings import *
diff --git a/doc/source/reference/horizon-guide.rst b/doc/source/reference/horizon-guide.rst
new file mode 100644
index 0000000000..450d408edb
--- /dev/null
+++ b/doc/source/reference/horizon-guide.rst
@@ -0,0 +1,30 @@
+.. _horizon-guide:
+
+================
+Horizon in Kolla
+================
+
+Overview
+~~~~~~~~
+
+Kolla can deploy a full working Horizon dashboard setup in either
+a **all-in-one** or **multinode** setup.
+
+Extending the default local_settings options
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+It is possible to extend the default configuration options for
+Horizon by using a custom python settings file that will override
+the default options set on the local_settings file.
+
+As an example, for setting a different (material) theme as the default one,
+a file named custom_local_settings should be created under the directory
+``{{ node_custom_config }}/horizon/`` with the following contents:
+
+.. code-block:: python
+
+   AVAILABLE_THEMES = [
+                ('material', 'Material', 'themes/material'),
+   ]
+
+.. end
diff --git a/doc/source/reference/index.rst b/doc/source/reference/index.rst
index 92fbc5bf90..b9d041d6df 100644
--- a/doc/source/reference/index.rst
+++ b/doc/source/reference/index.rst
@@ -26,3 +26,4 @@ Projects Deployment References
    vmware-guide
    tacker-guide
    xenserver-guide
+   horizon-guide
diff --git a/releasenotes/notes/add-horizon-custom-settings-file-d5dfab8a1a3b4ee7.yaml b/releasenotes/notes/add-horizon-custom-settings-file-d5dfab8a1a3b4ee7.yaml
new file mode 100644
index 0000000000..ba08dd4dfd
--- /dev/null
+++ b/releasenotes/notes/add-horizon-custom-settings-file-d5dfab8a1a3b4ee7.yaml
@@ -0,0 +1,5 @@
+---
+features:
+  - |
+    The settings file ``{{ node_custom_config}}/horizon/custom_local_settings`` can be
+    used in Horizon to overwrite the default local_settings without a need to sync it at image build time.