saltstack-formulas / nginx-formula

Nginx Salt Formula
http://docs.saltstack.com/en/latest/topics/development/conventions/formulas.html
Other
163 stars 421 forks source link

[BUG] json encoding does not work with sort #273

Open crosscodr opened 3 years ago

crosscodr commented 3 years ago

Your setup

Formula commit hash / release tag

release tag v2.5.0 (19203409aeb40b042cffb0e4d39bc66303f17842) Also v2.6.0 - v2.7.0 have the same problem.

Versions reports (master & minion)

Salt Version: Salt: 3001.4

Dependency Versions: cffi: Not Installed cherrypy: Not Installed dateutil: 2.7.3 docker-py: Not Installed gitdb: 2.0.6 gitpython: 3.0.7 Jinja2: 2.10.1 libgit2: Not Installed M2Crypto: Not Installed Mako: Not Installed msgpack-pure: Not Installed msgpack-python: 0.6.2 mysql-python: Not Installed pycparser: Not Installed pycrypto: 2.6.1 pycryptodome: 3.6.1 pygit2: Not Installed Python: 3.8.5 (default, Jul 28 2020, 12:59:40) python-gnupg: 0.4.5 PyYAML: 5.3.1 PyZMQ: 18.1.1 smmap: 2.0.5 timelib: Not Installed Tornado: 4.5.3 ZMQ: 4.3.2

System Versions: dist: ubuntu 20.04 focal locale: utf-8 machine: x86_64 release: 5.4.0-58-generic system: Linux version: Ubuntu 20.04 focal

Pillar / config used

servers_config.sls and snippets.sls from latest release 2.5.0


Bug details

Describe the bug

servers_config.sls and nginx.snippets fail to render in v2.5.0 because of unsupported comparison between 'int' and 'str':

    Rendering SLS 'base:nginx.servers' failed: Jinja error: '<' not supported between instances of 'str' and 'int'
/var/cache/salt/minion/files/base/nginx/servers_config.sls(133):
---
[...]
    - require_in:
      - service: nginx_service
{% if 'source_path' not in settings.config %}
    - context:
        config: {{ settings.config|json(sort_keys=False) }}
        nginx: {{ _nginx|json() }}    <======================
{% endif %}
    {% if 'overwrite' in settings and settings.overwrite == False %}
    - unless:
      - test -e {{ server_curpath(server) }}
    {% endif %}
[...]
---
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/salt/utils/templates.py", line 400, in render_jinja_tmpl
    output = template.render(**decoded_context)
  File "/usr/lib/python3/dist-packages/jinja2/asyncsupport.py", line 76, in render
    return original_render(self, *args, **kwargs)
  File "/usr/lib/python3/dist-packages/jinja2/environment.py", line 1008, in render
    return self.environment.handle_exception(exc_info, True)
  File "/usr/lib/python3/dist-packages/jinja2/environment.py", line 780, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/lib/python3/dist-packages/jinja2/_compat.py", line 37, in reraise
    raise value.with_traceback(tb)
  File "<template>", line 7, in <module>
  File "/usr/lib/python3/dist-packages/jinja2/environment.py", line 1073, in make_module
    return TemplateModule(self, self.new_context(vars, shared, locals))
  File "/usr/lib/python3/dist-packages/jinja2/environment.py", line 1152, in __init__
    body_stream = list(template.root_render_func(context))
  File "/var/cache/salt/minion/files/base/nginx/servers_config.sls", line 133, in <module>
    nginx: {{ _nginx|json() }}
  File "/usr/lib/python3/dist-packages/salt/utils/jinja.py", line 940, in format_json
    json_txt = salt.utils.json.dumps(
  File "/usr/lib/python3/dist-packages/salt/utils/json.py", line 149, in dumps
    return json_module.dumps(obj, **kwargs)  # future lint: blacklisted-function
  File "/usr/lib/python3.8/json/__init__.py", line 234, in dumps
    return cls(
  File "/usr/lib/python3.8/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python3.8/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
TypeError: '<' not supported between instances of 'str' and 'int'

Steps to reproduce the bug

git checkout v2.5.0 salt state.apply nginx.config,nginx.servers

Expected behaviour

state.apply run sucessfully

Attempts to fix the bug

For me it worked with json(sort_keys=False)