@@ -429,3 +429,134 @@ def test_local_salt_call_no_function_no_retcode(salt_call_cli):
429429 assert "test" in ret .data
430430 assert ret .data ["test" ] == "'test' is not available."
431431 assert "test.echo" in ret .data
432+
433+
434+ def test_state_highstate_custom_grains_masterless_mode (
435+ salt_master , salt_minion_factory
436+ ):
437+ """
438+ This test ensure that custom grains in salt://_grains are loaded before pillar compilation
439+ to ensure that any use of custom grains in pillar files are available when in masterless mode,
440+ this implies that a sync of grains occurs before loading the regular
441+ /etc/salt/grains or configuration file grains, as well as the usual grains.
442+ Note: cannot use salt_minion and salt_call_cli, since these will be loaded before
443+ the pillar and custom_grains files are written, hence using salt_minion_factory.
444+ """
445+ pillar_top_sls = """
446+ base:
447+ '*':
448+ - defaults
449+ """
450+
451+ pillar_defaults_sls = """
452+ mypillar: "{{ grains['custom_grain'] }}"
453+ """
454+
455+ salt_top_sls = """
456+ base:
457+ '*':
458+ - test
459+ """
460+
461+ salt_test_sls = """
462+ "donothing":
463+ test.nop: []
464+ """
465+
466+ salt_custom_grains_py = """
467+ def main():
468+ return {'custom_grain': 'test_value'}
469+ """
470+
471+ ## DGM TBD need to get masterless mode
472+ assert salt_master .is_running ()
473+ with salt_minion_factory .started ():
474+ salt_minion = salt_minion_factory
475+ salt_call_cli = salt_minion_factory .salt_call_cli ()
476+ with salt_minion .pillar_tree .base .temp_file (
477+ "top.sls" , pillar_top_sls
478+ ), salt_minion .pillar_tree .base .temp_file (
479+ "defaults.sls" , pillar_defaults_sls
480+ ), salt_minion .state_tree .base .temp_file (
481+ "top.sls" , salt_top_sls
482+ ), salt_minion .state_tree .base .temp_file (
483+ "test.sls" , salt_test_sls
484+ ), salt_minion .state_tree .base .temp_file (
485+ "_grains/custom_grain.py" , salt_custom_grains_py
486+ ):
487+ ret = salt_call_cli .run ("state.highstate" )
488+ assert ret .returncode == 0
489+ ret = salt_call_cli .run ("pillar.items" )
490+ assert ret .returncode == 0
491+ assert ret .data
492+ pillar_items = ret .data
493+ assert "mypillar" in pillar_items
494+ assert pillar_items ["mypillar" ] == "test_value"
495+
496+
497+ def test_state_highstate_custom_grains_master_mode (salt_master , salt_minion_factory ):
498+ """
499+ This test ensure that custom grains in salt://_grains are loaded before pillar compilation
500+ to ensure that any use of custom grains in pillar files are unaffected by changes for
501+ sync custom grains for the salt-minion in masterless mode,
502+ """
503+ pillar_top_sls = """
504+ base:
505+ '*':
506+ - defaults
507+ """
508+
509+ pillar_defaults_sls = """
510+ mypillar: "{{ grains['custom_grain'] }}"
511+ """
512+
513+ salt_top_sls = """
514+ base:
515+ '*':
516+ - test
517+ """
518+
519+ salt_test_sls = """
520+ "donothing":
521+ test.nop: []
522+ """
523+
524+ salt_custom_grains_py = """
525+ def main():
526+ return {'custom_grain': 'test_value'}
527+ """
528+
529+ ## DGM TBD need to ensure master mode
530+ assert salt_master .is_running ()
531+ with salt_minion_factory .started ():
532+ salt_minion = salt_minion_factory
533+ salt_call_cli = salt_minion_factory .salt_call_cli ()
534+ with salt_minion .pillar_tree .base .temp_file (
535+ "top.sls" , pillar_top_sls
536+ ), salt_minion .pillar_tree .base .temp_file (
537+ "defaults.sls" , pillar_defaults_sls
538+ ), salt_minion .state_tree .base .temp_file (
539+ "top.sls" , salt_top_sls
540+ ), salt_minion .state_tree .base .temp_file (
541+ "test.sls" , salt_test_sls
542+ ), salt_minion .state_tree .base .temp_file (
543+ "_grains/custom_grain.py" , salt_custom_grains_py
544+ ):
545+ ret = salt_call_cli .run ("state.highstate" )
546+ assert ret .returncode == 0
547+ ret = salt_call_cli .run ("pillar.items" )
548+ assert ret .returncode == 0
549+ assert ret .data
550+ pillar_items = ret .data
551+ assert "mypillar" not in pillar_items
552+
553+
554+ def test_salt_call_versions (salt_call_cli , caplog ):
555+ """
556+ Call test.versions without '--local' to test grains
557+ are sync'd without any missing keys in opts
558+ """
559+ with caplog .at_level (logging .DEBUG ):
560+ ret = salt_call_cli .run ("test.versions" )
561+ assert ret .returncode == 0
562+ assert "Failed to sync grains module: 'master_uri'" not in caplog .messages
0 commit comments