diff --git a/cloudinit/net/dhcp.py b/cloudinit/net/dhcp.py index 68a3834a2bd..23745cb4ef0 100644 --- a/cloudinit/net/dhcp.py +++ b/cloudinit/net/dhcp.py @@ -783,14 +783,21 @@ def parse_dhcpcd_lease(lease_dump: str, interface: str) -> Dict: subnet_cidr='20' subnet_mask='255.255.240.0' """ + LOG.debug( + "Parsing dhcpcd lease for interface %s: %r", interface, lease_dump + ) # create a dict from dhcpcd dump output - remove single quotes - lease = dict( - [ - a.split("=") - for a in lease_dump.strip().replace("'", "").split("\n") - ] - ) + try: + lease = dict( + [ + a.split("=") + for a in lease_dump.strip().replace("'", "").split("\n") + ] + ) + except ValueError as error: + LOG.error("Error parsing dhcpcd lease: %r", error) + raise InvalidDHCPLeaseFileError from error # this is expected by cloud-init's code lease["interface"] = interface diff --git a/tests/unittests/net/test_dhcp.py b/tests/unittests/net/test_dhcp.py index c38ee676d97..ac1754a5ce2 100644 --- a/tests/unittests/net/test_dhcp.py +++ b/tests/unittests/net/test_dhcp.py @@ -1199,6 +1199,17 @@ def test_parse_lease_dump(self): assert "255.255.240.0" == parsed_lease["subnet-mask"] assert "192.168.0.1" == parsed_lease["routers"] + def test_parse_lease_dump_fails(self): + lease = dedent( + """ + fail + """ + ) + + with pytest.raises(InvalidDHCPLeaseFileError): + with mock.patch("cloudinit.net.dhcp.util.load_binary_file"): + Dhcpcd.parse_dhcpcd_lease(lease, "eth0") + @pytest.mark.parametrize( "lease_file, option_245", (