예제 #1
0
def run_test(name, template_path, json_path, match_path):
    template_path = os.path.join(TEMPLATE_PATH, template_path)
    json_path = os.path.join(DATA_PATH, json_path)
    cfggen = os.path.abspath("../sonic-config-engine/sonic-cfggen")
    command = [
        '/usr/bin/python2.7', cfggen, "-T", TEMPLATE_PATH, "-t", template_path,
        "-y", json_path
    ]
    p = subprocess.Popen(command,
                         shell=False,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.PIPE,
                         env={"PYTHONPATH": "."})
    stdout, stderr = p.communicate()
    assert p.returncode == 0, "sonic-cfggen for %s test returned %d code. stderr='%s'" % (
        name, p.returncode, stderr)
    raw_generated_result = stdout.decode("ascii")
    assert "None" not in raw_generated_result, "Test %s" % name
    canonical_generated_result = ConfigMgr.to_canonical(raw_generated_result)
    match_path = os.path.join(DATA_PATH, match_path)
    # only for development write_result(match_path, raw_generated_result)
    with open(match_path) as result_fp:
        raw_saved_result = result_fp.read()
    canonical_saved_result = ConfigMgr.to_canonical(raw_saved_result)
    assert canonical_saved_result == canonical_generated_result, "Test %s" % name
예제 #2
0
def test_reset():
    frr = MagicMock()
    c = ConfigMgr(frr)
    c.reset()
    assert c.frr == frr
    assert c.current_config is None
    assert c.current_config_raw is None
    assert c.changes == ""
    assert c.peer_groups_to_restart == []
예제 #3
0
def test_restart_get_text():
    frr = MagicMock()
    frr.get_config = MagicMock(return_value="""!
 text1
 ! comment
 text2
 text3
 ! comment
 text4
    """)
    c = ConfigMgr(frr)
    c.update()
    assert c.get_text() == [
        ' text1', ' text2', ' text3', ' text4', '    ', '     '
    ]
def run_tests(test_name, template_fname, tests):
    tf = TemplateFabric(TEMPLATE_PATH)
    template = tf.from_file(template_fname)
    for case_name, param_fname, result_fname in tests:
        params = load_json(param_fname)
        raw_generated_result = str(template.render(params))
        assert "None" not in raw_generated_result, "Test %s.%s" % (test_name,
                                                                   case_name)
        # this is used only for initial generation write_result(result_fname, raw_generated_result)
        canonical_generated_result = ConfigMgr.to_canonical(
            raw_generated_result)
        with open(result_fname) as result_fp:
            raw_saved_result = result_fp.read()
        canonical_saved_result = ConfigMgr.to_canonical(raw_saved_result)
        assert canonical_saved_result == canonical_generated_result, "Test %s.%s" % (
            test_name, case_name)
예제 #5
0
def test_update():
    frr = MagicMock()
    frr.get_config = MagicMock(return_value="""!
 text1
 ! comment
 text2
 text3
 ! comment
 text4
    """)
    c = ConfigMgr(frr)
    c.update()
    assert c.current_config_raw == [
        ' text1', ' text2', ' text3', ' text4', '    ', '     '
    ]
    assert c.current_config == [['text1'], ['text2'], ['text3'], ['text4']]
예제 #6
0
def commit_changes_common(write_error, restart_error, result):
    frr = MagicMock()
    frr.write = MagicMock(return_value=write_error)
    frr.restart_peer_groups = MagicMock(return_value=restart_error)
    c = ConfigMgr(frr)
    c.reset = MagicMock()
    c.push_list(["change1", "change2"])
    c.restart_peer_groups(["pg1", "pg2"])
    res = c.commit()
    assert res == result
    assert c.reset.called
    frr.write.assert_called_with('change1\nchange2\n')
    frr.restart_peer_groups.assert_called_with(["pg1", "pg2"])
예제 #7
0
def test_restart_peer_groups():
    frr = MagicMock()
    c = ConfigMgr(frr)
    c.restart_peer_groups(["pg_1", "pg_2"])
    assert c.peer_groups_to_restart == ["pg_1", "pg_2"]
    c.restart_peer_groups(["pg_3", "pg_4"])
    assert c.peer_groups_to_restart == ["pg_1", "pg_2", "pg_3", "pg_4"]
예제 #8
0
def test_push():
    frr = MagicMock()
    c = ConfigMgr(frr)
    c.push("update1\nupdate2\n")
    assert c.changes == "update1\nupdate2\n\n"
    c.push("update3\nupdate4\n")
    assert c.changes == "update1\nupdate2\n\nupdate3\nupdate4\n\n"
예제 #9
0
def test_push_list():
    frr = MagicMock()
    c = ConfigMgr(frr)
    c.push_list(["change1", "change2"])
    assert c.changes == "change1\nchange2\n"
    c.push_list(["change3", "change4"])
    assert c.changes == "change1\nchange2\nchange3\nchange4\n"
예제 #10
0
def test_from_canonical():
    canonical = [['router bgp 12345'],
                 ['router bgp 12345', 'bgp router-id 1020'],
                 ['router bgp 12345', 'address-family ipv4'],
                 [
                     'router bgp 12345', 'address-family ipv4',
                     'neighbor PEER_V4 peer-group'
                 ],
                 [
                     'router bgp 12345', 'address-family ipv4',
                     'neighbor PEER_V4 route-map A10 in'
                 ], ['router bgp 12345', 'exit-address-family'],
                 ['router bgp 12345', 'address-family ipv6'],
                 [
                     'router bgp 12345', 'address-family ipv6',
                     'neighbor PEER_V6 peer-group'
                 ],
                 [
                     'router bgp 12345', 'address-family ipv6',
                     'neighbor PEER_V6 route-map A20 in'
                 ], ['router bgp 12345', 'exit-address-family'],
                 ['route-map A10 permit 10'], ['route-map A20 permit 10']]
    expected = 'router bgp 12345\n' \
               ' bgp router-id 1020\n' \
               ' address-family ipv4\n' \
               '  neighbor PEER_V4 peer-group\n' \
               '  neighbor PEER_V4 route-map A10 in\n' \
               ' exit-address-family\n' \
               ' address-family ipv6\n' \
               '  neighbor PEER_V6 peer-group\n' \
               '  neighbor PEER_V6 route-map A20 in\n' \
               ' exit-address-family\n' \
               'route-map A10 permit 10\n' \
               'route-map A20 permit 10\n'
    frr = MagicMock()
    c = ConfigMgr(frr)
    raw = c.from_canonical(canonical)
    assert raw == expected
예제 #11
0
def test_commit_empty_changes():
    frr = MagicMock()
    c = ConfigMgr(frr)
    res = c.commit()
    assert res
    assert not frr.write.called
예제 #12
0
def test_push_and_push_list():
    frr = MagicMock()
    c = ConfigMgr(frr)
    c.push("update1\nupdate2\n")
    c.push_list(["change1", "change2"])
    assert c.changes == "update1\nupdate2\n\nchange1\nchange2\n"
예제 #13
0
def test_count_spaces():
    frr = MagicMock()
    c = ConfigMgr(frr)
    assert c.count_spaces("  !") == 2
    assert c.count_spaces("!") == 0
    assert c.count_spaces("") == 0
예제 #14
0
def to_canonical_common(raw_text, expected_canonical):
    frr = MagicMock()
    c = ConfigMgr(frr)
    assert c.to_canonical(raw_text) == expected_canonical