123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344 |
- # -*- coding: utf-8 -*-
- # Import Python libs
- from __future__ import absolute_import
- import os
- import os.path
- import tempfile
- # Import Salt Testing libs
- from tests.support.unit import TestCase
- from tests.support.runtests import RUNTIME_VARS
- # Import Salt libs
- import salt.loader
- import salt.config
- from salt.exceptions import SaltRenderError
- from salt.ext.six.moves import StringIO
- # Import 3rd-party libs
- from salt.ext import six
- REQUISITES = ['require', 'require_in', 'use', 'use_in', 'watch', 'watch_in']
- class StateConfigRendererTestCase(TestCase):
- def setUp(self):
- self.root_dir = tempfile.mkdtemp(dir=RUNTIME_VARS.TMP)
- self.state_tree_dir = os.path.join(self.root_dir, 'state_tree')
- self.cache_dir = os.path.join(self.root_dir, 'cachedir')
- if not os.path.isdir(self.root_dir):
- os.makedirs(self.root_dir)
- if not os.path.isdir(self.state_tree_dir):
- os.makedirs(self.state_tree_dir)
- if not os.path.isdir(self.cache_dir):
- os.makedirs(self.cache_dir)
- self.config = salt.config.minion_config(None)
- self.config['root_dir'] = self.root_dir
- self.config['state_events'] = False
- self.config['id'] = 'match'
- self.config['file_client'] = 'local'
- self.config['file_roots'] = dict(base=[self.state_tree_dir])
- self.config['cachedir'] = self.cache_dir
- self.config['test'] = False
- self._renderers = salt.loader.render(
- self.config,
- {'config.get': lambda a, b: False}
- )
- def tearDown(self):
- for attrname in ('config', '_renderers'):
- try:
- delattr(self, attrname)
- except AttributeError:
- continue
- def _render_sls(self,
- content,
- sls='',
- saltenv='base',
- argline='-G yaml . jinja',
- **kws):
- return self._renderers['stateconf'](
- StringIO(content), saltenv=saltenv, sls=sls,
- argline=argline,
- renderers=salt.loader.render(self.config, {}),
- **kws
- )
- def test_state_config(self):
- result = self._render_sls('''
- .sls_params:
- stateconf.set:
- - name1: value1
- - name2: value2
- .extra:
- stateconf:
- - set
- - name: value
- # --- end of state config ---
- test:
- cmd.run:
- - name: echo name1={{sls_params.name1}} name2={{sls_params.name2}} {{extra.name}}
- - cwd: /
- ''', sls='test')
- self.assertEqual(len(result), 3)
- self.assertTrue('test::sls_params' in result and 'test' in result)
- self.assertTrue('test::extra' in result)
- self.assertEqual(result['test']['cmd.run'][0]['name'],
- 'echo name1=value1 name2=value2 value')
- def test_sls_dir(self):
- result = self._render_sls('''
- test:
- cmd.run:
- - name: echo sls_dir={{sls_dir}}
- - cwd: /
- ''', sls='path.to.sls')
- self.assertEqual(
- result['test']['cmd.run'][0]['name'],
- 'echo sls_dir=path{0}to'.format(os.sep))
- def test_states_declared_with_shorthand_no_args(self):
- result = self._render_sls('''
- test:
- cmd.run:
- - name: echo testing
- - cwd: /
- test1:
- pkg.installed
- test2:
- user.present
- ''')
- self.assertEqual(len(result), 3)
- for args in (result['test1']['pkg.installed'],
- result['test2']['user.present']):
- self.assertTrue(isinstance(args, list))
- self.assertEqual(len(args), 0)
- self.assertEqual(result['test']['cmd.run'][0]['name'], 'echo testing')
- def test_adding_state_name_arg_for_dot_state_id(self):
- result = self._render_sls('''
- .test:
- pkg.installed:
- - cwd: /
- .test2:
- pkg.installed:
- - name: vim
- ''', sls='test')
- self.assertEqual(
- result['test::test']['pkg.installed'][0]['name'], 'test'
- )
- self.assertEqual(
- result['test::test2']['pkg.installed'][0]['name'], 'vim'
- )
- def test_state_prefix(self):
- result = self._render_sls('''
- .test:
- cmd.run:
- - name: echo renamed
- - cwd: /
- state_id:
- cmd:
- - run
- - name: echo not renamed
- - cwd: /
- ''', sls='test')
- self.assertEqual(len(result), 2)
- self.assertTrue('test::test' in result)
- self.assertTrue('state_id' in result)
- def test_dot_state_id_in_requisites(self):
- for req in REQUISITES:
- result = self._render_sls('''
- .test:
- cmd.run:
- - name: echo renamed
- - cwd: /
- state_id:
- cmd.run:
- - name: echo not renamed
- - cwd: /
- - {0}:
- - cmd: .test
- '''.format(req), sls='test')
- self.assertEqual(len(result), 2)
- self.assertTrue('test::test' in result)
- self.assertTrue('state_id' in result)
- self.assertEqual(
- result['state_id']['cmd.run'][2][req][0]['cmd'], 'test::test'
- )
- def test_relative_include_with_requisites(self):
- for req in REQUISITES:
- result = self._render_sls('''
- include:
- - some.helper
- - .utils
- state_id:
- cmd.run:
- - name: echo test
- - cwd: /
- - {0}:
- - cmd: .utils::some_state
- '''.format(req), sls='test.work')
- self.assertEqual(result['include'][1], {'base': 'test.utils'})
- self.assertEqual(
- result['state_id']['cmd.run'][2][req][0]['cmd'],
- 'test.utils::some_state'
- )
- def test_relative_include_and_extend(self):
- result = self._render_sls('''
- include:
- - some.helper
- - .utils
- extend:
- .utils::some_state:
- cmd.run:
- - name: echo overridden
- ''', sls='test.work')
- self.assertTrue('test.utils::some_state' in result['extend'])
- def test_multilevel_relative_include_with_requisites(self):
- for req in REQUISITES:
- result = self._render_sls('''
- include:
- - .shared
- - ..utils
- - ...helper
- state_id:
- cmd.run:
- - name: echo test
- - cwd: /
- - {0}:
- - cmd: ..utils::some_state
- '''.format(req), sls='test.nested.work')
- self.assertEqual(result['include'][0],
- {'base': 'test.nested.shared'})
- self.assertEqual(result['include'][1], {'base': 'test.utils'})
- self.assertEqual(result['include'][2], {'base': 'helper'})
- self.assertEqual(
- result['state_id']['cmd.run'][2][req][0]['cmd'],
- 'test.utils::some_state'
- )
- def test_multilevel_relative_include_beyond_top_level(self):
- self.assertRaises(SaltRenderError, self._render_sls, '''
- include:
- - ...shared
- ''', sls='test.work')
- def test_start_state_generation(self):
- result = self._render_sls('''
- A:
- cmd.run:
- - name: echo hello
- - cwd: /
- B:
- cmd.run:
- - name: echo world
- - cwd: /
- ''', sls='test', argline='-so yaml . jinja')
- self.assertEqual(len(result), 4)
- self.assertEqual(
- result['test::start']['stateconf.set'][0]['require_in'][0]['cmd'],
- 'A'
- )
- def test_goal_state_generation(self):
- result = self._render_sls('''
- {% for sid in "ABCDE": %}
- {{sid}}:
- cmd.run:
- - name: echo this is {{sid}}
- - cwd: /
- {% endfor %}
- ''', sls='test.goalstate', argline='yaml . jinja')
- self.assertEqual(len(result), len('ABCDE') + 1)
- reqs = result['test.goalstate::goal']['stateconf.set'][0]['require']
- self.assertEqual(
- set([next(six.itervalues(i)) for i in reqs]), set('ABCDE')
- )
- def test_implicit_require_with_goal_state(self):
- result = self._render_sls('''
- {% for sid in "ABCDE": %}
- {{sid}}:
- cmd.run:
- - name: echo this is {{sid}}
- - cwd: /
- {% endfor %}
- F:
- cmd.run:
- - name: echo this is F
- - cwd: /
- - require:
- - cmd: A
- - cmd: B
- G:
- cmd.run:
- - name: echo this is G
- - cwd: /
- - require:
- - cmd: D
- - cmd: F
- ''', sls='test', argline='-o yaml . jinja')
- sids = 'ABCDEFG'[::-1]
- for i, sid in enumerate(sids):
- if i < len(sids) - 1:
- self.assertEqual(
- result[sid]['cmd.run'][2]['require'][0]['cmd'],
- sids[i + 1]
- )
- F_args = result['F']['cmd.run']
- self.assertEqual(len(F_args), 3)
- F_req = F_args[2]['require']
- self.assertEqual(len(F_req), 3)
- self.assertEqual(F_req[1]['cmd'], 'A')
- self.assertEqual(F_req[2]['cmd'], 'B')
- G_args = result['G']['cmd.run']
- self.assertEqual(len(G_args), 3)
- G_req = G_args[2]['require']
- self.assertEqual(len(G_req), 3)
- self.assertEqual(G_req[1]['cmd'], 'D')
- self.assertEqual(G_req[2]['cmd'], 'F')
- goal_args = result['test::goal']['stateconf.set']
- self.assertEqual(len(goal_args), 1)
- self.assertEqual(
- [next(six.itervalues(i)) for i in goal_args[0]['require']],
- list('ABCDEFG')
- )
- def test_slsdir(self):
- result = self._render_sls('''
- formula/woot.sls:
- cmd.run:
- - name: echo {{ slspath }}
- - cwd: /
- ''', sls='formula.woot', argline='yaml . jinja')
- r = result['formula/woot.sls']['cmd.run'][0]['name']
- self.assertEqual(r, 'echo formula/woot')
|