def test_class4_ex3c(): base_path = "../class4/exercises/exercise3/" cmd_list = ["python", "exercise3c.py"] exercise_hosts = [ "arista1", "arista2", "arista3", "arista4", "nxos1", "nxos2" ] std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) assert return_code == 0 assert std_out.count( "Vlan 123 with name ntp_vlan exists, nothing to do!") == 6 assert std_err == "" remove_vlan() std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) assert return_code == 0 for host in exercise_hosts: if host.startswith("arista"): assert f"{host}(config)#vlan 123" in std_out else: pattern = rf"{host}.*config.*vlan 123" assert re.search(pattern, std_out) assert std_err == ""
def test_runner_collateral(test_case_dir, inventory_check): # Needed for ansible-vault test os.environ["VAULT_PASSWORD"] = "******" path_obj = Path(test_case_dir) script = path_obj.name script_dir = path_obj.parents[0] # Inventory Checks if inventory_check is None: pass else: nornir_inventory = gen_inventory_dict(script_dir) nr = InitNornir(inventory=nornir_inventory, logging=NORNIR_LOGGING) assert isinstance(nr, nornir.core.Nornir) assert isinstance(nr.inventory.hosts, nornir.core.inventory.Hosts) if inventory_check == "all": assert nr.inventory.hosts assert nr.inventory.groups assert nr.inventory.defaults elif inventory_check == "hosts": assert nr.inventory.hosts elif inventory_check == "hosts-groups": assert nr.inventory.hosts assert nr.inventory.groups # Script Check cmd_list = ["python", script] std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=script_dir) assert return_code == 0 assert std_err == ""
def test_class5_ex1(): base_path = "../class5/exercises/exercise1" cmd_list = ["ansible-playbook", "exercise1.yml", "-f 12"] std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) std_err = remove_ansible_warnings(std_err) assert "TASK [IOS global config]" in std_out assert "TASK [IOS-XE global config]" in std_out assert "TASK [EOS global config]" in std_out assert "TASK [NX-OS global config]" in std_out assert "TASK [Juniper global config]" in std_out for device in [ "cisco1", "cisco2", "cisco5", "cisco6", "arista5", "arista6", "arista7", "arista8", "nxos1", "nxos2", "vmx1", "vmx2", ]: assert std_out.count(device) == 7 assert std_err == "" assert return_code == 0
def test_class5_ex2(): base_path = "../class5/exercises/exercise2" cmd_list = ["ansible-playbook", "exercise2.yml", "-f 12"] std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) std_err = remove_ansible_warnings(std_err) assert std_err == "" assert return_code == 0 # Should be idempotent as would have been configured in exercise1. for device in [ "cisco1", "cisco2", "cisco5", "cisco6", "arista5", "arista6", "arista7", "arista8", "nxos1", "nxos2", "vmx1", "vmx2", ]: pattern = rf"^{device}.*changed=0 .*$" assert re.search(pattern, std_out, flags=re.M)
def test_class1_ex3(): base_path = "../class1/exercises/exercise3/" cmd_list = ["python", "exercise3.py"] nornir_inventory = gen_inventory_dict(base_path) nr = InitNornir(inventory=nornir_inventory, logging=NORNIR_LOGGING) assert len(nr.inventory.hosts) == 2 for host_name, host_obj in nr.inventory.hosts.items(): assert host_obj.hostname is not None assert len(host_obj.groups) == 1 assert host_obj.groups[0].name == "ios" assert host_obj.platform == "cisco_ios" assert host_obj.username == "pyclass" assert host_obj.password == "cisco123" assert host_obj.port == 22 my_group = nr.inventory.groups["ios"] assert my_group.hostname is None assert my_group.platform == "cisco_ios" assert my_group.port == 22 defaults = nr.inventory.defaults assert defaults.username == "pyclass" assert defaults.password == "cisco123" std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) assert return_code == 0 assert "cisco3" in std_out assert "cisco_ios" in std_out assert std_err == ""
def test_netmiko_ex1(): base_path = "." cmd_list = ["python", "netmiko_ex1.py"] std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) # import ipdb; ipdb.set_trace() assert return_code == 0 assert std_err == "" assert "sros1" in std_out assert "vmx1" in std_out assert "TiMOS-B-20.5.R2" in std_out assert "18.4R1.8" in std_out # Checks SR-OS assert "A:sros1#" in std_out assert re.search(r"TiMOS-B-20.5.R2.*Nokia", std_out) # Checks Juniper assert "pyclass@vmx1>" in std_out assert re.search(r"Hostname:.*vmx1", std_out) assert re.search(r"Model:.vmx", std_out) assert re.search(r"Junos:.18.4R1.8", std_out) # Check for file existence files = ["A:sros1.txt", "*****@*****.**"] for a_file in files: assert os.path.isfile(a_file)
def test_class4_ex4(): base_path = "../class4/exercises/exercise4" cmd_list = ["ansible-playbook", "exercise4.yml"] std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) assert std_err == "" assert return_code == 0
def test_class2_ex1(): base_path = "../class2/exercises/" cmd_list = ["python", "exercise1.py"] std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) assert return_code == 0 assert std_err == "" assert std_out.count("10.220.88.1") == 4
def test_bonus2_ex5(): base_path = "../bonus2/exercises/exercise5" cmd_list = ["ansible-playbook", "exercise5.yml"] std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) std_err = remove_ansible_warnings(std_err) assert std_err == "" assert return_code == 0 assert re.search(r"cisco1.*ok=1.*changed=1.*failed=0 ", std_out)
def test_class8_ex7a(): """Should fail when no vault password is provided.""" base_path = "../class8/exercises/exercise7" cmd_list = ["ansible-playbook", "exercise7.yml"] std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) std_err = remove_ansible_warnings(std_err) assert return_code != 0
def test_class8_ex6_fixed(playbook): base_path = "../class8/exercises/exercise6/solutions" cmd_list = ["ansible-playbook", playbook] std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) std_err = remove_ansible_warnings(std_err) assert std_err == "" assert return_code == 0
def test_class8_ex6_errors(playbook): """Each of these tests should have errors on std_err.""" base_path = "../class8/exercises/exercise6" cmd_list = ["ansible-playbook", playbook] std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) std_err = remove_ansible_warnings(std_err) assert return_code != 0
def test_class1_ex3(): base_path = "../class1/exercises/" cmd_list = ["python", "exercise3.py"] std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) assert return_code == 0 assert std_err == "" assert "nxos1#" in std_out
def test_class4_ex4b(): base_path = "../class4/exercises/exercise4/" cmd_list = ["python", "exercise4b.py"] std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) assert return_code == 0 assert std_out.count("False") == 18 assert std_err == "" remove_vlan() std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) assert return_code == 0 assert std_out.count("name ntp_vlan") == 6 assert std_err == ""
def test_class1_ex1b(): base_path = "../class1/exercises/exercise1" cmd_list = ["python", "print_yaml.py", "exercise1b.yml"] std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) assert "['rtr1', 701, 3356, '10.1.1.100', '192.168.200.17']" in std_out assert std_err == "" assert return_code == 0
def test_class6_ex2a_2b(exercise): base_path = "../class6/exercises/exercise2" cmd_list = ["ansible-playbook", exercise] std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) std_err = remove_ansible_warnings(std_err) assert std_err == "" assert return_code == 0 assert "localhost : ok=2" in std_out
def test_class7_ex1(): base_path = "../class7/exercises/" cmd_list = ["python", "exercise1.py"] std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) assert return_code == 0 assert std_err == "" assert "Address Age MAC Address Interface Flags" in std_out
def test_class6_ex3(): """Should be idempotent on the second execution.""" base_path = "../class6/exercises/exercise3" cmd_list = ["ansible-playbook", "exercise3.yml"] std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) std_err = remove_ansible_warnings(std_err) assert std_err == "" assert return_code == 0 # Execute script again std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) std_err = remove_ansible_warnings(std_err) assert std_err == "" assert return_code == 0 assert re.search(r"^cisco1\s+:\s+ok=2.*skipped=1.*$", std_out, flags=re.M) assert re.search(r"^cisco2\s+:\s+ok=2.*skipped=1.*$", std_out, flags=re.M) assert re.search(r"^cisco5\s+:\s+ok=2.*skipped=1.*$", std_out, flags=re.M) assert re.search(r"^cisco6\s+:\s+ok=2.*skipped=1.*$", std_out, flags=re.M)
def test_class5_ex2(): base_path = "../class5/exercises/" cmd_list = ["python", "exercise2.py"] std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) assert return_code == 0 assert std_err == "" assert std_out.count("vlan 501") == 2 assert std_out.count("vlan 502") == 2
def test_class5_ex1(): base_path = "../class5/exercises/" cmd_list = ["python", "exercise1.py"] std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) assert return_code == 0 assert std_err == "" assert std_out.count("ip domain-lookup") == 2 assert std_out.count("ip domain-name bogus.com") == 2
def test_runner_collateral(test_case): path_obj = Path(test_case) script = path_obj.name script_dir = path_obj.parents[0] cmd_list = ["ansible-playbook", script] std_out, std_err, return_code = subprocess_runner(cmd_list, script_dir) std_err = remove_ansible_warnings(std_err) assert return_code == 0 assert std_err == ""
def test_class6_ex6(): base_path = "../class6/exercises/exercise6" cmd_list = ["ansible-playbook", "exercise6.yml"] std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) std_err = remove_ansible_warnings(std_err) assert std_err == "" assert return_code == 0 assert re.search(r"^cisco5\s+:\s+ok=1 ", std_out, flags=re.M) assert re.search(r"^cisco6\s+:\s+ok=1 ", std_out, flags=re.M)
def test_class12_ex1(): base_path = "../class12/exercises/" cmd_list = ["python", "exercise1.py"] std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) assert return_code == 1 assert "OSError" in std_err assert "Fast CLI state" in std_out assert "Global Delay Factor state" in std_out assert "Command execution time" in std_out
def test_class12_ex2(): base_path = "../class12/exercises/" cmd_list = ["python", "exercise2.py"] std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) assert return_code == 0 assert std_err == "" assert std_out.count("cisco4") == 3 assert re.search(r"cisco4.*\(config\)#", std_out) assert "cisco4-testing#" in std_out
def test_class2_ex2(): base_path = "../class2/exercises/" cmd_list = ["python", "exercise2.py"] std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) assert return_code == 0 assert std_err == "" assert "cisco3>" in std_out assert "cisco3#" in std_out
def test_class5_ex3a(): base_path = "../class5/exercises/exercise3" cmd_list = ["ansible-playbook", "exercise3a.yml"] std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) std_err = remove_ansible_warnings(std_err) assert std_out.count("permit") == 20 assert std_err == "" assert return_code == 0
def test_class9_ex1(): base_path = "../class9/exercises/" cmd_list = ["python", "exercise1.py"] std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) assert return_code == 0 assert std_err == "" assert std_out.count("Name servers are correct") == 2 assert std_out.count("Domain name is correct") == 2
def test_class3_ex1(): base_path = "../class3/exercises/" cmd_list = ["python", "exercise1.py"] std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) assert return_code == 0 assert std_err == "" assert "VLAN ID: 7" in std_out assert "VLAN0007" in std_out
def test_class3_ex2(): base_path = "../class3/exercises/" cmd_list = ["python", "exercise2.py"] std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) assert return_code == 0 assert std_err == "" assert std_out.count("nxos2") == 4 assert std_out.count("10.0.2.16") == 4
def test_class10_ex3(): base_path = "../class10/exercises/" cmd_list = ["python", "exercise3.py"] std_out, std_err, return_code = subprocess_runner(cmd_list, exercise_dir=base_path) assert return_code == 0 assert std_err == "" assert std_out.count("cisco3") == 3 assert "Trying 10.220.88.22" in std_out