summaryrefslogtreecommitdiff
path: root/cloudinit/net/dhcp.py
diff options
context:
space:
mode:
authorDouglas Jordan <dojordan@microsoft.com>2018-01-24 16:10:08 -0700
committerChad Smith <chad.smith@canonical.com>2018-01-24 16:10:08 -0700
commitc03bdd3d8ed762cada813c5e95a40b14d2047b57 (patch)
tree708422bb64a8804f649ad7558d5088f9e11011a4 /cloudinit/net/dhcp.py
parent30597f28512fafbe25486df5865b628d859486c6 (diff)
downloadvyos-cloud-init-c03bdd3d8ed762cada813c5e95a40b14d2047b57.tar.gz
vyos-cloud-init-c03bdd3d8ed762cada813c5e95a40b14d2047b57.zip
Azure VM Preprovisioning support.
This change will enable azure vms to report provisioning has completed twice, first to tell the fabric it has completed then a second time to enable customer settings. The datasource for the second provisioning is the Instance Metadata Service (IMDS),and the VM will poll indefinitely for the new ovf-env.xml from IMDS. This branch introduces EphemeralDHCPv4 which encapsulates common logic used by both DataSourceEc2 an DataSourceAzure for temporary DHCP interactions without side-effects. LP: #1734991
Diffstat (limited to 'cloudinit/net/dhcp.py')
-rw-r--r--cloudinit/net/dhcp.py43
1 files changed, 42 insertions, 1 deletions
diff --git a/cloudinit/net/dhcp.py b/cloudinit/net/dhcp.py
index 875a4609..087c0c03 100644
--- a/cloudinit/net/dhcp.py
+++ b/cloudinit/net/dhcp.py
@@ -10,7 +10,9 @@ import os
import re
import signal
-from cloudinit.net import find_fallback_nic, get_devicelist
+from cloudinit.net import (
+ EphemeralIPv4Network, find_fallback_nic, get_devicelist)
+from cloudinit.net.network_state import mask_and_ipv4_to_bcast_addr as bcip
from cloudinit import temp_utils
from cloudinit import util
from six import StringIO
@@ -29,6 +31,45 @@ class InvalidDHCPLeaseFileError(Exception):
pass
+class NoDHCPLeaseError(Exception):
+ """Raised when unable to get a DHCP lease."""
+ pass
+
+
+class EphemeralDHCPv4(object):
+ def __init__(self, iface=None):
+ self.iface = iface
+ self._ephipv4 = None
+
+ def __enter__(self):
+ try:
+ leases = maybe_perform_dhcp_discovery(self.iface)
+ except InvalidDHCPLeaseFileError:
+ raise NoDHCPLeaseError()
+ if not leases:
+ raise NoDHCPLeaseError()
+ lease = leases[-1]
+ LOG.debug("Received dhcp lease on %s for %s/%s",
+ lease['interface'], lease['fixed-address'],
+ lease['subnet-mask'])
+ nmap = {'interface': 'interface', 'ip': 'fixed-address',
+ 'prefix_or_mask': 'subnet-mask',
+ 'broadcast': 'broadcast-address',
+ 'router': 'routers'}
+ kwargs = dict([(k, lease.get(v)) for k, v in nmap.items()])
+ if not kwargs['broadcast']:
+ kwargs['broadcast'] = bcip(kwargs['prefix_or_mask'], kwargs['ip'])
+ ephipv4 = EphemeralIPv4Network(**kwargs)
+ ephipv4.__enter__()
+ self._ephipv4 = ephipv4
+ return lease
+
+ def __exit__(self, excp_type, excp_value, excp_traceback):
+ if not self._ephipv4:
+ return
+ self._ephipv4.__exit__(excp_type, excp_value, excp_traceback)
+
+
def maybe_perform_dhcp_discovery(nic=None):
"""Perform dhcp discovery if nic valid and dhclient command exists.