Exemple #1
0
def test_pillar_updater_refresh(monkeypatch):

    pillar_refresh_called = 0

    def pillar_refresh(*args, **kwargs):
        nonlocal pillar_refresh_called
        pillar_refresh_called += 1

    monkeypatch.setattr(pillar, 'pillar_refresh', pillar_refresh)

    PillarUpdater.refresh()
    assert pillar_refresh_called == 1
def test_pillar_updater_component_pillar(monkeypatch, tmpdir_function):
    mock_res = []

    some_pillar = {
        1: {
            2: 3,
            4: [5, 6]
        }
    }

    default_pillar_dir = tmpdir_function / 'default'
    user_pillar_dir = tmpdir_function / 'user'

    monkeypatch.setattr(pillar, 'PRVSNR_PILLAR_DIR', default_pillar_dir)
    monkeypatch.setattr(
        pillar, 'PRVSNR_USER_PILLAR_ALL_HOSTS_DIR', user_pillar_dir
    )

    monkeypatch.setattr(
        pillar, 'dump_yaml', mock_fun_echo(mock_res, 'dump_yaml')
    )

    monkeypatch.setattr(
        pillar, 'load_yaml', mock_fun_echo(mock_res, 'load_yaml')
    )

    component = 'component1'
    default_pillar_path = (
        default_pillar_dir / 'components/{}.sls'.format(component)
    )
    user_pillar_path = user_pillar_dir / '{}.sls'.format(component)

    # show (no user pillar)
    _ = PillarUpdater().component_pillar(component, show=True)
    assert [res.key for res in mock_res] == ['load_yaml']
    assert mock_res[0].args_all == ((default_pillar_path,), {})

    # show (with user pillar)
    mock_res[:] = []
    PillarUpdater.ensure_exists(user_pillar_path)
    _ = PillarUpdater().component_pillar(component, show=True)
    assert [res.key for res in mock_res] == ['load_yaml']
    assert mock_res[0].args_all == ((user_pillar_path,), {})

    # reset for existent
    _ = PillarUpdater().component_pillar(component, reset=True)
    assert not user_pillar_path.exists()

    # reset for non-existent won't fail
    _ = PillarUpdater().component_pillar(component, reset=True)

    # set
    mock_res[:] = []
    component = 'component2'
    user_pillar_path = user_pillar_dir / '{}.sls'.format(component)
    _ = PillarUpdater().component_pillar(component, pillar=some_pillar)
    assert user_pillar_path.exists()
    assert [res.key for res in mock_res] == ['dump_yaml']
    assert mock_res[0].args_all == ((user_pillar_path, some_pillar), {})
Exemple #3
0
def test_pillar_updater_ensure_exists(tmpdir_function):
    pu = PillarUpdater()

    f1 = tmpdir_function / 'aaa'
    pu.ensure_exists(f1)
    assert f1.exists()

    # parent dir not exists
    f2 = tmpdir_function / 'some-dir' / 'aaa'
    pu.ensure_exists(f2)
    assert f2.parent.exists()
    assert f2.exists()
Exemple #4
0
def test_pillar_updater_update_rollback_dump(targets, some_param_gr,
                                             some_param_di, pillar_dir,
                                             pillar_host_dir_tmpl):
    if targets != ALL_MINIONS:
        pillar_dir = Path(pillar_host_dir_tmpl.format(minion_id=targets))
        pillar_dir.mkdir(parents=True)

    input_param_group = some_param_gr('new-value1', 'new-value2')
    input_param_di = some_param_di('some_key', 'new-value3')

    attr1_param = some_param_gr.param_spec('attr1')
    attr2_param = some_param_gr.param_spec('attr2')
    attr3_param = input_param_di.param_spec()

    f1 = add_pillar_merge_prefix(pillar_dir / attr1_param.fpath.name)
    f2 = add_pillar_merge_prefix(pillar_dir / attr2_param.fpath.name)
    f3 = add_pillar_merge_prefix(pillar_dir / attr3_param.fpath.name)

    pillar_data = {'1': {'2': {'3': '4', '5': '6'}, 'di_parent': {}}}
    dump_yaml(f1, pillar_data)
    dump_yaml(f2, pillar_data)
    dump_yaml(f3, pillar_data)

    pu = PillarUpdater(targets=targets)

    # update (in memory only)
    pu.update(input_param_group, input_param_di)

    p1 = deepcopy(pillar_data)
    p1['1']['2']['3'] = input_param_group.attr1
    assert pu.pillar(f1.name) == p1
    assert load_yaml(f1) == pillar_data

    p2 = deepcopy(pillar_data)
    p2['1']['2']['5'] = input_param_group.attr2
    assert pu.pillar(f2.name) == p2
    assert load_yaml(f2) == pillar_data

    p3 = deepcopy(pillar_data)
    p3['1']['di_parent'] = {input_param_di.key_attr: input_param_di.value_attr}
    assert pu.pillar(f3.name) == p3
    assert load_yaml(f3) == pillar_data

    # update on disk
    pu.dump()
    assert load_yaml(f1) == p1
    assert load_yaml(f2) == p2
    assert load_yaml(f3) == p3

    # rolllback (in memory only)
    pu.rollback()
    assert pu.pillar(f1.name) == pillar_data
    assert load_yaml(f1) == p1

    assert pu.pillar(f2.name) == pillar_data
    assert load_yaml(f2) == p2

    assert pu.pillar(f3.name) == pillar_data
    assert load_yaml(f3) == p3

    # rollback on disk
    pu.dump()
    assert load_yaml(f1) == pillar_data
    assert load_yaml(f2) == pillar_data
    assert load_yaml(f3) == pillar_data
Exemple #5
0
def test_pillar_updater_update_values(some_param_gr, test_pillar,
                                      patch_logging):
    fpath = some_param_gr.param_spec('attr1').fpath.name

    # UNCHANGED
    pu = PillarUpdater()
    pu.update(some_param_gr(UNCHANGED))
    assert pu.pillar(fpath) == {}

    # try to update again
    with pytest.raises(RuntimeError):
        pu.update(some_param_gr(UNCHANGED))

    # DEFAULT (reset)
    pu = PillarUpdater()
    with pytest.raises(NotImplementedError):
        pu.update(some_param_gr(DEFAULT))

    # UNDEFINED
    pu = PillarUpdater()
    pu.update(some_param_gr(UNDEFINED))
    assert pu.pillar(fpath) == {'1': {'2': {'3': None}}}

    # MISSED
    pu = PillarUpdater()
    with pytest.raises(ValueError):
        pu.update(some_param_gr(MISSED))

    # non special value
    pu = PillarUpdater()
    pu.update(some_param_gr('some-value'))
    assert pu.pillar(fpath) == {'1': {'2': {'3': 'some-value'}}}
Exemple #6
0
def test_pillar_targets():
    minion_id = os.environ['TEST_MINION_ID']
    ntp_server_param = NTP.param_spec('server')

    # add data for all minions group user pillar
    pu = PillarUpdater(targets=provisioner.ALL_MINIONS)
    pr = PillarResolver(targets=provisioner.ALL_MINIONS)
    value_all = '1.2.3.4'
    pu.update(NTP(server=value_all))
    pu.apply()
    get_res = pr.get([ntp_server_param])
    assert get_res[minion_id][ntp_server_param] == value_all

    # add data to minion's user pillar
    pu = PillarUpdater(targets=minion_id)
    pr = PillarResolver(targets=minion_id)
    value_minion_1 = '1.2.3.5'
    pu.update(NTP(server=value_minion_1))
    pu.apply()
    get_res = pr.get([ntp_server_param])
    assert get_res[minion_id][ntp_server_param] == value_minion_1

    # add data to another minion's user pillar
    minion_id_2 = minion_id + '_2'
    pu = PillarUpdater(targets=minion_id_2)
    value_minion_2 = '1.2.3.6'
    pu.update(NTP(server=value_minion_2))
    with pytest.raises(provisioner.errors.SaltNoReturnError):
        pu.apply()
    pr = PillarResolver(targets=minion_id)
    get_res = pr.get([ntp_server_param])
    #  value for minion_1 is not changed
    assert get_res[minion_id][ntp_server_param] == value_minion_1