Skip to content

Commit 77e4116

Browse files
authored
Version 0.1.6
Version 0.1.6
2 parents 1c2c1a0 + 69f1363 commit 77e4116

19 files changed

+114
-98
lines changed

.gitignore

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,15 +96,10 @@ celerybeat-schedule
9696
Dockerfile~
9797
*.py~
9898

99-
# builds
100-
/src/kathara.build/
101-
/src/kathara.dist/
102-
10399
# Packages
104100
*.rpm
105101
*.tar.zst
106102

107-
108103
/config
109104
/.vscode/
110105
/.vs/

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "kathara_lab_checker"
3-
version = "0.1.5"
3+
version = "0.1.6"
44
description = "Tool to automatically check Kathará network scenarios based on a configuration file."
55
readme = "README.md"
66
requires-python = ">=3.11"

src/kathara_lab_checker/__main__.py

Lines changed: 33 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -16,32 +16,32 @@
1616
from Kathara.setting.Setting import Setting
1717
from tqdm import tqdm
1818

19-
from kathara_lab_checker.TestCollector import TestCollector
20-
from kathara_lab_checker.checks.BridgeCheck import BridgeCheck
21-
from kathara_lab_checker.checks.CheckResult import CheckResult
22-
from kathara_lab_checker.checks.CollisionDomainCheck import CollisionDomainCheck
23-
from kathara_lab_checker.checks.CustomCommandCheck import CustomCommandCheck
24-
from kathara_lab_checker.checks.DaemonCheck import DaemonCheck
25-
from kathara_lab_checker.checks.DeviceExistenceCheck import DeviceExistenceCheck
26-
from kathara_lab_checker.checks.IPv6EnabledCheck import IPv6EnabledCheck
27-
from kathara_lab_checker.checks.InterfaceIPCheck import InterfaceIPCheck
28-
from kathara_lab_checker.checks.KernelRouteCheck import KernelRouteCheck
29-
from kathara_lab_checker.checks.ReachabilityCheck import ReachabilityCheck
30-
from kathara_lab_checker.checks.StartupExistenceCheck import StartupExistenceCheck
31-
from kathara_lab_checker.checks.SysctlCheck import SysctlCheck
32-
from kathara_lab_checker.checks.applications.dns.DNSAuthorityCheck import DNSAuthorityCheck
33-
from kathara_lab_checker.checks.applications.dns.DNSRecordCheck import DNSRecordCheck
34-
from kathara_lab_checker.checks.applications.dns.LocalNSCheck import LocalNSCheck
35-
from kathara_lab_checker.checks.protocols.AnnouncedNetworkCheck import AnnouncedNetworkCheck
36-
from kathara_lab_checker.checks.protocols.ProtocolRedistributionCheck import ProtocolRedistributionCheck
37-
from kathara_lab_checker.checks.protocols.bgp.BGPPeeringCheck import BGPPeeringCheck
38-
from kathara_lab_checker.checks.protocols.evpn.AnnouncedVNICheck import AnnouncedVNICheck
39-
from kathara_lab_checker.checks.protocols.evpn.EVPNSessionCheck import EVPNSessionCheck
40-
from kathara_lab_checker.checks.protocols.evpn.VTEPCheck import VTEPCheck
41-
from kathara_lab_checker.excel_utils import write_final_results_to_excel, write_result_to_excel
42-
from kathara_lab_checker.utils import reverse_dictionary
43-
44-
VERSION = "0.1.5"
19+
from .TestCollector import TestCollector
20+
from .checks.BridgeCheck import BridgeCheck
21+
from .checks.CheckResult import CheckResult
22+
from .checks.CollisionDomainCheck import CollisionDomainCheck
23+
from .checks.CustomCommandCheck import CustomCommandCheck
24+
from .checks.DaemonCheck import DaemonCheck
25+
from .checks.DeviceExistenceCheck import DeviceExistenceCheck
26+
from .checks.IPv6EnabledCheck import IPv6EnabledCheck
27+
from .checks.InterfaceIPCheck import InterfaceIPCheck
28+
from .checks.KernelRouteCheck import KernelRouteCheck
29+
from .checks.ReachabilityCheck import ReachabilityCheck
30+
from .checks.StartupExistenceCheck import StartupExistenceCheck
31+
from .checks.SysctlCheck import SysctlCheck
32+
from .checks.applications.dns.DNSAuthorityCheck import DNSAuthorityCheck
33+
from .checks.applications.dns.DNSRecordCheck import DNSRecordCheck
34+
from .checks.applications.dns.LocalNSCheck import LocalNSCheck
35+
from .checks.protocols.AnnouncedNetworkCheck import AnnouncedNetworkCheck
36+
from .checks.protocols.ProtocolRedistributionCheck import ProtocolRedistributionCheck
37+
from .checks.protocols.bgp.BGPPeeringCheck import BGPPeeringCheck
38+
from .checks.protocols.evpn.AnnouncedVNICheck import AnnouncedVNICheck
39+
from .checks.protocols.evpn.EVPNSessionCheck import EVPNSessionCheck
40+
from .checks.protocols.evpn.VTEPCheck import VTEPCheck
41+
from .excel_utils import write_final_results_to_excel, write_result_to_excel
42+
from .utils import reverse_dictionary
43+
44+
VERSION = "0.1.6"
4545
CURRENT_LAB: Optional[Lab] = None
4646

4747

@@ -120,7 +120,7 @@ def run_on_single_network_scenario(
120120
test_collector.add_check_results(lab_name, check_results)
121121

122122
logger.info("Checking collision domains...")
123-
check_results = CollisionDomainCheck().run(list(lab_template.links.values()), lab)
123+
check_results = CollisionDomainCheck().run(list(lab_template.machines.values()), lab)
124124
test_collector.add_check_results(lab_name, check_results)
125125

126126
if "requiring_startup" in configuration["test"]:
@@ -263,10 +263,12 @@ def run_on_multiple_network_scenarios(
263263

264264
test_collector = TestCollector()
265265
for lab_name in tqdm(
266-
list(
267-
filter(
268-
lambda x: os.path.isdir(os.path.join(labs_path, x)) and x != ".DS_Store",
269-
os.listdir(labs_path),
266+
sorted(
267+
list(
268+
filter(
269+
lambda x: os.path.isdir(os.path.join(labs_path, x)) and x != ".DS_Store",
270+
os.listdir(labs_path),
271+
)
270272
)
271273
)
272274
):

src/kathara_lab_checker/checks/CheckResult.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import logging
22

3-
from kathara_lab_checker.utils import green, red
3+
from ..utils import green, red
44

55

66
class CheckResult:
Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,37 @@
11
from Kathara.exceptions import LinkNotFoundError
2-
from Kathara.model import Link
32
from Kathara.model.Lab import Lab
3+
from Kathara.model.Machine import Machine
44

55
from .AbstractCheck import AbstractCheck
66
from .CheckResult import CheckResult
77

88

99
class CollisionDomainCheck(AbstractCheck):
10-
def check(self, cd_t: Link, lab: Lab) -> CheckResult:
11-
self.description = f"Checking collision domain `{cd_t.name}`"
10+
def check(self, machine_t: Machine, lab: Lab) -> list[CheckResult]:
1211

12+
results = []
1313
try:
14-
cd = lab.get_link(cd_t.name)
15-
if cd.machines.keys() != cd_t.machines.keys():
16-
reason = (
17-
f"Devices connected to collision domain {cd.name} {list(cd.machines.keys())} "
18-
f"are different from the one in the template {list(cd_t.machines.keys())}."
19-
)
20-
return CheckResult(self.description, False, reason)
14+
machine = lab.get_machine(machine_t.name)
15+
for iface_num, interface in machine.interfaces.items():
16+
self.description = f"Checking the collision domain attached to interface `eth{iface_num}` of `{machine_t.name}`"
17+
interface_t = machine_t.interfaces[iface_num]
18+
if interface_t.link.name != interface.link.name:
19+
reason = (
20+
f"Interface `{iface_num}` of device {machine_t.name} is connected to collision domain "
21+
f"`{interface.link.name}` instead of `{interface_t.link.name}`"
22+
)
23+
results.append(CheckResult(self.description, False, reason))
24+
else:
25+
results.append(CheckResult(self.description, True, "OK"))
26+
2127

22-
return CheckResult(self.description, True, "OK")
2328
except LinkNotFoundError as e:
24-
return CheckResult(self.description, False, str(e))
29+
results.append(CheckResult(self.description, False, str(e)))
30+
return results
2531

26-
def run(self, template_cds: list[Link], lab: Lab) -> list[CheckResult]:
32+
def run(self, template_machines: list[Machine], lab: Lab) -> list[CheckResult]:
2733
results = []
28-
for cd_t in template_cds:
29-
check_result = self.check(cd_t, lab)
30-
results.append(check_result)
34+
for machine_t in template_machines:
35+
check_result = self.check(machine_t, lab)
36+
results.extend(check_result)
3137
return results

src/kathara_lab_checker/checks/DaemonCheck.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from Kathara.manager.Kathara import Kathara
33
from Kathara.model.Lab import Lab
44

5-
from kathara_lab_checker.utils import get_output
5+
from ..utils import get_output
66
from .AbstractCheck import AbstractCheck
77
from .CheckResult import CheckResult
88

src/kathara_lab_checker/checks/InterfaceIPCheck.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from Kathara.exceptions import MachineNotRunningError
44
from Kathara.model.Lab import Lab
55

6-
from kathara_lab_checker.utils import get_interfaces_addresses
6+
from ..utils import get_interfaces_addresses
77
from .AbstractCheck import AbstractCheck
88
from .CheckResult import CheckResult
99

src/kathara_lab_checker/checks/ReachabilityCheck.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from Kathara.manager.Kathara import Kathara
33
from Kathara.model.Lab import Lab
44

5-
from kathara_lab_checker.utils import get_output
5+
from ..utils import get_output
66
from .AbstractCheck import AbstractCheck
77
from .CheckResult import CheckResult
88

src/kathara_lab_checker/checks/applications/dns/DNSAuthorityCheck.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
from Kathara.manager.Kathara import Kathara
77
from Kathara.model.Lab import Lab
88

9-
from kathara_lab_checker.checks.AbstractCheck import AbstractCheck
10-
from kathara_lab_checker.checks.CheckResult import CheckResult
11-
from kathara_lab_checker.utils import get_output, find_lines_with_string, find_device_name_from_ip
9+
from ...AbstractCheck import AbstractCheck
10+
from ...CheckResult import CheckResult
11+
from ....utils import get_output, find_lines_with_string, find_device_name_from_ip
1212

1313

1414
class DNSAuthorityCheck(AbstractCheck):
@@ -52,11 +52,12 @@ def check(self, domain: str, authority_ip: str, device_name: str, device_ip: str
5252
)
5353
return CheckResult(self.description, False, reason)
5454
else:
55-
if os.path.exists(f"{device_name}.startup"):
55+
if lab.fs.exists(f"{device_name}.startup"):
5656
with lab.fs.open(f"{device_name}.startup", "r") as startup_file:
57-
systemctl_lines = find_lines_with_string(startup_file.readline(), "systemctl")
57+
lines = startup_file.readlines()
5858

59-
for line in systemctl_lines:
59+
for line in lines:
60+
line = line.strip()
6061
if re.search(rf"^\s*systemctl\s*start\s*named\s*$", line):
6162
exec_output_gen = kathara_manager.exec(
6263
machine_name=device_name,
@@ -65,19 +66,22 @@ def check(self, domain: str, authority_ip: str, device_name: str, device_ip: str
6566
)
6667

6768
output = get_output(exec_output_gen)
68-
6969
date_pattern = (
7070
r"\d{2}-[Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec]{3}-\d{4} \d{2}:\d{2}:\d{2}\.\d{3}"
7171
)
7272

7373
reason_list = find_lines_with_string(output, "could not")
74+
reason_list.extend(find_lines_with_string(output, "/etc/bind/named.conf"))
7475
reason_list_no_dates = [re.sub(date_pattern, "", line) for line in reason_list]
7576
reason = "\n".join(reason_list_no_dates)
7677

77-
return CheckResult(self.description, False, reason)
78+
return CheckResult(self.description, False, "Configuration Error:\n" + reason)
7879

79-
reason = f"named not started in the startup file of `{device_name}`"
80-
return CheckResult(self.description, False, reason)
80+
reason = f"named not started in `{device_name}`.startup`"
81+
return CheckResult(self.description, False, reason)
82+
else:
83+
reason = f"There is no `.startup` file for device `{device_name}`"
84+
return CheckResult(self.description, False, reason)
8185

8286
def run(
8387
self,

src/kathara_lab_checker/checks/applications/dns/DNSRecordCheck.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
from Kathara.manager.Kathara import Kathara
22
from Kathara.model.Lab import Lab
33

4-
from kathara_lab_checker.checks.AbstractCheck import AbstractCheck
5-
from kathara_lab_checker.checks.CheckResult import CheckResult
6-
from kathara_lab_checker.utils import get_output
4+
from ...AbstractCheck import AbstractCheck
5+
from ...CheckResult import CheckResult
6+
from ....utils import get_output
77

88

99
class DNSRecordCheck(AbstractCheck):

0 commit comments

Comments
 (0)