According to https://docs.puppet.com/puppet/4.8/reference/lang_data_boolean.html, Puppet4 evaluates an empty string and an empty array as 'True' (With Puppet3, an empty string means 'False' but an empty array means 'True').
Therefore, if an empty string or array is assigend to 'cache_server_ip', following codes of templates/local_settings.py.erb
=====
<% if @cache_server_ip %>
<% if @cache_server_ip.kind_of?(Array) %>
<% split = ":" + @cache_server_port + "','" %>
'LOCATION': [ <% @cache_server_ip.each do |ip| -%>'<%= ip -%>:<%= @cache_server_port -%>',<% end -%> ],
<% else %>
'LOCATION': '<%= @cache_server_ip %>:<%= @cache_server_port %>',
<% end %>
<% end %>
=====
generates following local_settings.
=====
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': [ ],
}
}
=====
And this configuration ('LOCATION': [ ]) causes a Horizon error.
=====
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: Found 'compress' tags in:
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: /usr/share/openstack-dashboard/openstack_dashboard/templates/horizon/_conf.html
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: /usr/share/openstack-dashboard/openstack_dashboard/templates/_stylesheets.html
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: /usr/share/openstack-dashboard/openstack_dashboard/templates/horizon/_scripts.html
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: Compressing... Traceback (most recent call last):
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: File "/usr/share/openstack-dashboard/manage.py", line 23, in <module>
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: execute_from_command_line(sys.argv)
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: File "/usr/lib/python2.7/site-packages/django/core/management/__init__.py", line 354, in execute_from_command_line
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: utility.execute()
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: File "/usr/lib/python2.7/site-packages/django/core/management/__init__.py", line 346, in execute
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: self.fetch_command(subcommand).run_from_argv(self.argv)
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: File "/usr/lib/python2.7/site-packages/django/core/management/base.py", line 394, in run_from_argv
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: self.execute(*args, **cmd_options)
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: File "/usr/lib/python2.7/site-packages/django/core/management/base.py", line 445, in execute
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: output = self.handle(*args, **options)
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: File "/usr/lib/python2.7/site-packages/compressor/management/commands/compress.py", line 286, in handle
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: self.compress(sys.stdout, **options)
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: File "/usr/lib/python2.7/site-packages/compressor/management/commands/compress.py", line 233, in compress
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: rendered = parser.render_nodelist(template, context, node)
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: File "/usr/lib/python2.7/site-packages/compressor/offline/django.py", line 120, in render_nodelist
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: return node.nodelist.render(context)
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: File "/usr/lib/python2.7/site-packages/django/template/base.py", line 905, in render
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: bit = self.render_node(node, context)
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: File "/usr/lib/python2.7/site-packages/django/template/debug.py", line 79, in render_node
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: return node.render(context)
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: File "/usr/lib/python2.7/site-packages/django/templatetags/cache.py", line 42, in render
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: fragment_cache = caches['default']
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: File "/usr/lib/python2.7/site-packages/django/core/cache/__init__.py", line 113, in __getitem__
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: cache = _create_cache(alias)
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: File "/usr/lib/python2.7/site-packages/django/core/cache/__init__.py", line 88, in _create_cache
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: return backend_cls(location, params)
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: File "/usr/lib/python2.7/site-packages/django/core/cache/backends/locmem.py", line 31, in __init__
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: self._cache = _caches.setdefault(name, {})
Notice: /Stage[main]/Horizon/Exec[refresh_horizon_django_compress]/returns: TypeError: unhashable type: 'list'
======
I think we should check whether not only 'cache_server_ip' is True, but also it is empty or not.
Fix proposed to branch: master /review. opendev. org/c/openstack /puppet- horizon/ +/824079
Review: https:/