cloud-init-dev team mailing list archive
-
cloud-init-dev team
-
Mailing list archive
-
Message #05797
[Merge] ~i.galic/cloud-init:feax/ephemeral_connectivity into cloud-init:master
Igor Galić has proposed merging ~i.galic/cloud-init:feax/ephemeral_connectivity into cloud-init:master.
Requested reviews:
cloud-init commiters (cloud-init-dev)
For more details, see:
https://code.launchpad.net/~i.galic/cloud-init/+git/cloud-init/+merge/358876
--
Your team cloud-init commiters is requested to review the proposed merge of ~i.galic/cloud-init:feax/ephemeral_connectivity into cloud-init:master.
diff --git a/cloudinit/net/__init__.py b/cloudinit/net/__init__.py
index ad98a59..c1f9c13 100644
--- a/cloudinit/net/__init__.py
+++ b/cloudinit/net/__init__.py
@@ -12,6 +12,7 @@ import re
from cloudinit.net.network_state import mask_to_net_prefix
from cloudinit import util
+from cloudinit.url_helper import readurl
LOG = logging.getLogger(__name__)
SYS_CLASS_NET = "/sys/class/net/"
@@ -647,16 +648,28 @@ def get_ib_hwaddrs_by_interface():
return ret
+def has_url_connectivity(url):
+ """Return true when the instance has access to the provided URL"""
+ try:
+ readurl(url, timeout=5)
+ except UrlError:
+ return False
+ return True
+
+
class EphemeralIPv4Network(object):
"""Context manager which sets up temporary static network configuration.
- No operations are performed if the provided interface is already connected.
+ No operations are performed if the provided interface already has the
+ specified configuration.
+ This can be verified with the connectivity_url.
If unconnected, bring up the interface with valid ip, prefix and broadcast.
If router is provided setup a default route for that interface. Upon
context exit, clean up the interface leaving no configuration behind.
"""
- def __init__(self, interface, ip, prefix_or_mask, broadcast, router=None):
+ def __init__(self, interface, ip, prefix_or_mask, broadcast, router=None,
+ connectivity_url=None):
"""Setup context manager and validate call signature.
@param interface: Name of the network interface to bring up.
@@ -665,6 +678,8 @@ class EphemeralIPv4Network(object):
prefix.
@param broadcast: Broadcast address for the IPv4 network.
@param router: Optionally the default gateway IP.
+ @param connectivity_url: Optionally, a URL to verify if a usable
+ connection already exists.
"""
if not all([interface, ip, prefix_or_mask, broadcast]):
raise ValueError(
@@ -675,6 +690,8 @@ class EphemeralIPv4Network(object):
except ValueError as e:
raise ValueError(
'Cannot setup network: {0}'.format(e))
+
+ self.connectivity_url = connectivity_url
self.interface = interface
self.ip = ip
self.broadcast = broadcast
@@ -683,6 +700,13 @@ class EphemeralIPv4Network(object):
def __enter__(self):
"""Perform ephemeral network setup if interface is not connected."""
+ if self.connectivity_url:
+ if has_url_connectivity(self.connectivity_url):
+ LOG.debug(
+ 'Skip ephemeral network setup, instance has connectivity'
+ ' to %s', self.connectivity_url)
+ return
+
self._bringup_device()
if self.router:
self._bringup_router()
@@ -692,6 +716,9 @@ class EphemeralIPv4Network(object):
for cmd in self.cleanup_cmds:
util.subp(cmd, capture=True)
+ def _connectivity_ceck():
+ """Perform connectivity check using connectivity_url"""
+
def _delete_address(self, address, prefix):
"""Perform the ip command to remove the specified address."""
util.subp(
diff --git a/cloudinit/net/tests/test_init.py b/cloudinit/net/tests/test_init.py
index 58e0a59..996296f 100644
--- a/cloudinit/net/tests/test_init.py
+++ b/cloudinit/net/tests/test_init.py
@@ -458,6 +458,22 @@ class TestEphemeralIPV4Network(CiTestCase):
self.assertEqual(expected_setup_calls, m_subp.call_args_list)
m_subp.assert_has_calls(expected_teardown_calls)
+ @mock.patch('cloudinit.config.cc_chef.url_helper.readurl')
+ def test_ephemeral_ipv4_no_network_if_url_connectivity(
+ self, m_readurl, m_subp):
+ """No network setup is performed if we can successfully connect to
+ connectivity_url."""
+ params = {
+ 'interface': 'eth0', 'ip': '192.168.2.2',
+ 'prefix_or_mask': '255.255.255.0', 'broadcast': '192.168.2.255',
+ 'connectivity_url': 'http://example.org/index.html'}
+
+ with net.EphemeralIPv4Network(**params):
+ self.assertEqual([mock.call('http://example.org/index.html',
+ timeout=5)], m_readurl.call_args_list)
+ # Ensure that no teardown happens:
+ m_subp.assert_has_calls([])
+
def test_ephemeral_ipv4_network_noop_when_configured(self, m_subp):
"""EphemeralIPv4Network handles exception when address is setup.
Follow ups
-
Re: [Merge] ~i.galic/cloud-init:feax/ephemeral_connectivity into cloud-init:master
From: Server Team CI bot, 2018-11-21
-
Re: [Merge] ~i.galic/cloud-init:feax/ephemeral_connectivity into cloud-init:master
From: Server Team CI bot, 2018-11-21
-
Re: [Merge] ~i.galic/cloud-init:feax/ephemeral_connectivity into cloud-init:master
From: Server Team CI bot, 2018-11-21
-
Re: [Merge] ~i.galic/cloud-init:feax/ephemeral_connectivity into cloud-init:master
From: Chad Smith, 2018-11-19
-
Re: [Merge] ~i.galic/cloud-init:feax/ephemeral_connectivity into cloud-init:master
From: Chad Smith, 2018-11-19
-
[Merge] ~i.galic/cloud-init:feax/ephemeral_connectivity into cloud-init:master
From: Igor Galić, 2018-11-16
-
Re: [Merge] ~i.galic/cloud-init:feax/ephemeral_connectivity into cloud-init:master
From: Server Team CI bot, 2018-11-16
-
Re: [Merge] ~i.galic/cloud-init:feax/ephemeral_connectivity into cloud-init:master
From: Igor Galić, 2018-11-16
-
Re: [Merge] ~i.galic/cloud-init:feax/ephemeral_connectivity into cloud-init:master
From: Server Team CI bot, 2018-11-16
-
Re: [Merge] ~i.galic/cloud-init:feax/ephemeral_connectivity into cloud-init:master
From: Igor Galić, 2018-11-16
-
Re: [Merge] ~i.galic/cloud-init:feax/ephemeral_connectivity into cloud-init:master
From: Server Team CI bot, 2018-11-15
-
Re: [Merge] ~i.galic/cloud-init:feax/ephemeral_connectivity into cloud-init:master
From: Igor Galić, 2018-11-15
-
Re: [Merge] ~i.galic/cloud-init:feax/ephemeral_connectivity into cloud-init:master
From: Server Team CI bot, 2018-11-15
-
Re: [Merge] ~i.galic/cloud-init:feax/ephemeral_connectivity into cloud-init:master
From: Server Team CI bot, 2018-11-15