diff --git a/vnet_manager/config/validate.py b/vnet_manager/config/validate.py index 056b26e..9258e8b 100644 --- a/vnet_manager/config/validate.py +++ b/vnet_manager/config/validate.py @@ -244,6 +244,12 @@ def validate_interface_config(self, machine: str): if "mac" not in int_vals: logger.debug(f"MAC not found for interface {int_name} on machine {machine}, generating a random one") self._new_config["machines"][machine]["interfaces"][int_name]["mac"] = random_mac_generator() + elif isinstance(int_vals["mac"], int): + logger.error( + f"MAC {int_vals['mac']} for interface {int_name} on machine {machine} was parsed as a sexagesimal integer. " + "Please wrap the MAC address in 'quotes'" + ) + self._all_ok = False # From: https://stackoverflow.com/a/7629690/8632038 elif not fullmatch(r"^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$", int_vals["mac"]): logger.error( diff --git a/vnet_manager/tests/config/test_validate.py b/vnet_manager/tests/config/test_validate.py index 8470473..161163a 100644 --- a/vnet_manager/tests/config/test_validate.py +++ b/vnet_manager/tests/config/test_validate.py @@ -197,6 +197,24 @@ def test_validate_machine_config_fails_if_bridge_config_is_not_a_dict(self): self.assertFalse(self.validator.config_validation_successful) self.logger.error.assert_called_once() + def test_validate_interface_config_sexagesimal_mac_address(self): + # 0d33212743741 is the sexagesimal representation of 42:42:42:42:09:01 + # cf. https://github.com/Erik-Lamers1/vnet-manager/issues/62 + self.validator.config["machines"]["router100"]["interfaces"]["eth12"]["mac"] = 33212743741 + self.validator.validate_interface_config("router100") + self.assertFalse(self.validator.config_validation_successful) + self.logger.error.assert_called_once_with( + f"MAC 33212743741 for interface eth12 on machine router100 was parsed as a sexagesimal integer. Please wrap the MAC address in 'quotes'" + ) + + def test_validate_interface_config_invalid_mac_address(self): + self.validator.config["machines"]["router100"]["interfaces"]["eth12"]["mac"] = "gg:hh:ii:jj:kk:ll" + self.validator.validate_interface_config("router100") + self.assertFalse(self.validator.config_validation_successful) + self.logger.error.assert_called_once_with( + f"MAC gg:hh:ii:jj:kk:ll for interface eth12 on machine router100, does not seem to be valid. Please check your settings" + ) + class TestValidateConfigValidateMachineFilesParameters(VNetTestCase): def setUp(self) -> None: