summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiam Hopkins <liamh@google.com>2019-08-09 12:02:36 -0700
committerGitHub <noreply@github.com>2019-08-09 12:02:36 -0700
commit324758120ce4ef7eaaf6cfcbbc0712dcf164d7bb (patch)
treeef9f0223752439cd0afa0adea9ed9b6029b594b2
parent9f15b1c1407b01e28dcb066400eab3200ee4f850 (diff)
downloadgoogle-compute-image-packages-324758120ce4ef7eaaf6cfcbbc0712dcf164d7bb.tar.gz
Detect hostname changes (#835)
* Restart primary networking to detect new hostname.
-rw-r--r--packages/python-google-compute-engine/google_compute_engine/compat.py4
-rw-r--r--packages/python-google-compute-engine/google_compute_engine/distro_lib/debian_8/__init__.py0
-rw-r--r--packages/python-google-compute-engine/google_compute_engine/distro_lib/debian_8/tests/__init__.py0
-rw-r--r--packages/python-google-compute-engine/google_compute_engine/distro_lib/debian_8/tests/utils_test.py80
-rw-r--r--packages/python-google-compute-engine/google_compute_engine/distro_lib/debian_8/utils.py71
-rw-r--r--packages/python-google-compute-engine/google_compute_engine/distro_lib/debian_9/utils.py8
-rw-r--r--packages/python-google-compute-engine/google_compute_engine/distro_lib/el_6/utils.py14
-rw-r--r--packages/python-google-compute-engine/google_compute_engine/distro_lib/el_7/utils.py8
-rw-r--r--packages/python-google-compute-engine/google_compute_engine/distro_lib/freebsd_11/utils.py8
-rw-r--r--packages/python-google-compute-engine/google_compute_engine/distro_lib/helpers.py15
-rw-r--r--packages/python-google-compute-engine/google_compute_engine/distro_lib/sles_11/__init__.py0
-rw-r--r--packages/python-google-compute-engine/google_compute_engine/distro_lib/sles_11/tests/__init__.py0
-rw-r--r--packages/python-google-compute-engine/google_compute_engine/distro_lib/sles_11/tests/utils_test.py91
-rw-r--r--packages/python-google-compute-engine/google_compute_engine/distro_lib/sles_11/utils.py88
-rw-r--r--packages/python-google-compute-engine/google_compute_engine/distro_lib/sles_12/utils.py8
-rw-r--r--packages/python-google-compute-engine/google_compute_engine/networking/network_daemon.py17
-rw-r--r--packages/python-google-compute-engine/google_compute_engine/networking/tests/network_daemon_test.py30
-rw-r--r--packages/python-google-compute-engine/google_compute_engine/tests/compat_test.py4
18 files changed, 93 insertions, 353 deletions
diff --git a/packages/python-google-compute-engine/google_compute_engine/compat.py b/packages/python-google-compute-engine/google_compute_engine/compat.py
index 3d18c12..08bd0ed 100644
--- a/packages/python-google-compute-engine/google_compute_engine/compat.py
+++ b/packages/python-google-compute-engine/google_compute_engine/compat.py
@@ -48,12 +48,8 @@ elif 'red hat enterprise linux' in distro_name:
import google_compute_engine.distro_lib.el_7.utils as distro_utils
elif 'fedora' in distro_name:
import google_compute_engine.distro_lib.el_7.utils as distro_utils
-elif 'debian' in distro_name and distro_version == '8':
- import google_compute_engine.distro_lib.debian_8.utils as distro_utils
elif 'debian' in distro_name:
import google_compute_engine.distro_lib.debian_9.utils as distro_utils
-elif 'suse' in distro_name and distro_version == '11':
- import google_compute_engine.distro_lib.sles_11.utils as distro_utils
elif 'suse' in distro_name:
import google_compute_engine.distro_lib.sles_12.utils as distro_utils
elif 'freebsd' in distro_name:
diff --git a/packages/python-google-compute-engine/google_compute_engine/distro_lib/debian_8/__init__.py b/packages/python-google-compute-engine/google_compute_engine/distro_lib/debian_8/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/packages/python-google-compute-engine/google_compute_engine/distro_lib/debian_8/__init__.py
+++ /dev/null
diff --git a/packages/python-google-compute-engine/google_compute_engine/distro_lib/debian_8/tests/__init__.py b/packages/python-google-compute-engine/google_compute_engine/distro_lib/debian_8/tests/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/packages/python-google-compute-engine/google_compute_engine/distro_lib/debian_8/tests/__init__.py
+++ /dev/null
diff --git a/packages/python-google-compute-engine/google_compute_engine/distro_lib/debian_8/tests/utils_test.py b/packages/python-google-compute-engine/google_compute_engine/distro_lib/debian_8/tests/utils_test.py
deleted file mode 100644
index 7f92795..0000000
--- a/packages/python-google-compute-engine/google_compute_engine/distro_lib/debian_8/tests/utils_test.py
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/usr/bin/python
-# Copyright 2018 Google Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""Unittest for utils.py module."""
-
-from google_compute_engine.distro_lib.debian_8 import utils
-from google_compute_engine.test_compat import mock
-from google_compute_engine.test_compat import unittest
-
-
-class UtilsTest(unittest.TestCase):
-
- def setUp(self):
- self.mock_logger = mock.Mock()
- self.mock_setup = mock.create_autospec(utils.Utils)
-
- @mock.patch('google_compute_engine.distro_lib.helpers.CallDhclientIpv6')
- @mock.patch('google_compute_engine.distro_lib.helpers.CallEnableRouteAdvertisements')
- def testEnableIpv6(self, mock_call_enable_ra, mock_call_dhclient):
- mocks = mock.Mock()
- mocks.attach_mock(mock_call_dhclient, 'dhclient')
- mocks.attach_mock(mock_call_enable_ra, 'enable_ra')
-
- utils.Utils.EnableIpv6(self.mock_setup, ['A', 'B'], self.mock_logger)
- expected_calls = [
- mock.call.enable_ra(['A', 'B'], mock.ANY),
- mock.call.dhclient(['A', 'B'], mock.ANY),
- ]
- self.assertEqual(mocks.mock_calls, expected_calls)
-
- @mock.patch('google_compute_engine.distro_lib.helpers.CallDhclientIpv6')
- def testDisableIpv6(self, mock_call_dhclient):
- mocks = mock.Mock()
- mocks.attach_mock(mock_call_dhclient, 'dhclient')
-
- utils.Utils.DisableIpv6(self.mock_setup, ['A', 'B'], self.mock_logger)
- expected_calls = [
- mock.call.dhclient(['A', 'B'], mock.ANY, None, release_lease=True),
- ]
- self.assertEqual(mocks.mock_calls, expected_calls)
-
- @mock.patch('google_compute_engine.distro_lib.helpers.CallDhclient')
- def testEnableNetworkInterfaces(self, mock_call):
- mocks = mock.Mock()
- mocks.attach_mock(mock_call, 'call')
-
- utils.Utils.EnableNetworkInterfaces(
- self.mock_setup, ['A', 'B'], self.mock_logger)
- expected_calls = [mock.call.call(['A', 'B'], mock.ANY)]
- self.assertEqual(mocks.mock_calls, expected_calls)
-
- @mock.patch('google_compute_engine.distro_lib.helpers.CallHwclock')
- def testHandleClockSync(self, mock_call):
- mocks = mock.Mock()
- mocks.attach_mock(mock_call, 'call')
-
- utils.Utils.HandleClockSync(self.mock_setup, self.mock_logger)
- expected_calls = [mock.call.call(mock.ANY)]
- self.assertEqual(mocks.mock_calls, expected_calls)
-
- @mock.patch('google_compute_engine.distro_lib.ip_forwarding_utils.IpForwardingUtilsIproute')
- def testIpForwardingUtils(self, mock_call):
- mocks = mock.Mock()
- mocks.attach_mock(mock_call, 'call')
-
- utils.Utils.IpForwardingUtils(self.mock_setup, self.mock_logger, '66')
- expected_calls = [mock.call.call(mock.ANY, '66')]
- self.assertEqual(mocks.mock_calls, expected_calls)
diff --git a/packages/python-google-compute-engine/google_compute_engine/distro_lib/debian_8/utils.py b/packages/python-google-compute-engine/google_compute_engine/distro_lib/debian_8/utils.py
deleted file mode 100644
index 7872d1b..0000000
--- a/packages/python-google-compute-engine/google_compute_engine/distro_lib/debian_8/utils.py
+++ /dev/null
@@ -1,71 +0,0 @@
-#!/usr/bin/python
-# Copyright 2018 Google Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""Utilities that are distro specific for use on Debian 8."""
-
-from google_compute_engine.distro_lib import helpers
-from google_compute_engine.distro_lib import ip_forwarding_utils
-from google_compute_engine.distro_lib import utils
-
-
-class Utils(utils.Utils):
- """Utilities used by Linux guest services on Debian 8."""
-
- def EnableIpv6(self, interfaces, logger, dhclient_script=None):
- """Configure the network interfaces for IPv6 using dhclient.
-
- Args:
- interface: string, the output device names for enabling IPv6.
- logger: logger object, used to write to SysLog and serial port.
- dhclient_script: string, the path to a dhclient script used by dhclient.
- """
- helpers.CallEnableRouteAdvertisements(interfaces, logger)
- helpers.CallDhclientIpv6(interfaces, logger)
-
- def DisableIpv6(self, interfaces, logger):
- """Disable Ipv6 by giving up the DHCP lease using dhclient.
-
- Args:
- interface: string, the output device names for enabling IPv6.
- logger: logger object, used to write to SysLog and serial port.
- """
- helpers.CallDhclientIpv6(interfaces, logger, None, release_lease=True)
-
- def EnableNetworkInterfaces(self, interfaces, logger, dhclient_script=None):
- """Enable the list of network interfaces.
-
- Args:
- interfaces: list of string, the output device names to enable.
- logger: logger object, used to write to SysLog and serial port.
- dhclient_script: string, the path to a dhclient script used by dhclient.
- """
- helpers.CallDhclient(interfaces, logger)
-
- def HandleClockSync(self, logger):
- """Sync the software clock with the hypervisor clock.
-
- Args:
- logger: logger object, used to write to SysLog and serial port.
- """
- helpers.CallHwclock(logger)
-
- def IpForwardingUtils(self, logger, proto_id=None):
- """Get system IP address configuration utilities.
-
- Args:
- logger: logger object, used to write to SysLog and serial port.
- proto_id: string, the routing protocol identifier for Google IP changes.
- """
- return ip_forwarding_utils.IpForwardingUtilsIproute(logger, proto_id)
diff --git a/packages/python-google-compute-engine/google_compute_engine/distro_lib/debian_9/utils.py b/packages/python-google-compute-engine/google_compute_engine/distro_lib/debian_9/utils.py
index 9255214..2b12058 100644
--- a/packages/python-google-compute-engine/google_compute_engine/distro_lib/debian_9/utils.py
+++ b/packages/python-google-compute-engine/google_compute_engine/distro_lib/debian_9/utils.py
@@ -69,3 +69,11 @@ class Utils(utils.Utils):
proto_id: string, the routing protocol identifier for Google IP changes.
"""
return ip_forwarding_utils.IpForwardingUtilsIproute(logger, proto_id)
+
+ def RestartNetworking(self, logger):
+ """Restart the networking service to force a DHCP refresh.
+
+ Args:
+ logger: logger object, used to write to SysLog and serial port.
+ """
+ helpers.SystemctlRestart('networking', logger)
diff --git a/packages/python-google-compute-engine/google_compute_engine/distro_lib/el_6/utils.py b/packages/python-google-compute-engine/google_compute_engine/distro_lib/el_6/utils.py
index 9f9bb98..a0fb839 100644
--- a/packages/python-google-compute-engine/google_compute_engine/distro_lib/el_6/utils.py
+++ b/packages/python-google-compute-engine/google_compute_engine/distro_lib/el_6/utils.py
@@ -15,6 +15,8 @@
"""Utilities that are distro specific for use on EL 6."""
+import subprocess
+
from google_compute_engine.distro_lib import helpers
from google_compute_engine.distro_lib import ip_forwarding_utils
from google_compute_engine.distro_lib import utils
@@ -70,3 +72,15 @@ class Utils(utils.Utils):
proto_id: string, the routing protocol identifier for Google IP changes.
"""
return ip_forwarding_utils.IpForwardingUtilsIproute(logger, proto_id)
+
+ def RestartNetworking(self, logger):
+ """Restart the networking service to force a DHCP refresh.
+
+ Args:
+ logger: logger object, used to write to SysLog and serial port.
+ """
+ logger.info('Restarting networking via "service network restart".')
+ try:
+ subprocess.check_call(['service', 'network', 'restart'])
+ except subprocess.CalledProcessError:
+ logger.warning('Failed to restart networking.')
diff --git a/packages/python-google-compute-engine/google_compute_engine/distro_lib/el_7/utils.py b/packages/python-google-compute-engine/google_compute_engine/distro_lib/el_7/utils.py
index e0e318b..8b82aef 100644
--- a/packages/python-google-compute-engine/google_compute_engine/distro_lib/el_7/utils.py
+++ b/packages/python-google-compute-engine/google_compute_engine/distro_lib/el_7/utils.py
@@ -127,3 +127,11 @@ class Utils(utils.Utils):
proto_id: string, the routing protocol identifier for Google IP changes.
"""
return ip_forwarding_utils.IpForwardingUtilsIproute(logger, proto_id)
+
+ def RestartNetworking(self, logger):
+ """Restart the networking service to force a DHCP refresh.
+
+ Args:
+ logger: logger object, used to write to SysLog and serial port.
+ """
+ helpers.SystemctlRestart('NetworkManager', logger)
diff --git a/packages/python-google-compute-engine/google_compute_engine/distro_lib/freebsd_11/utils.py b/packages/python-google-compute-engine/google_compute_engine/distro_lib/freebsd_11/utils.py
index 2734c8f..121cad7 100644
--- a/packages/python-google-compute-engine/google_compute_engine/distro_lib/freebsd_11/utils.py
+++ b/packages/python-google-compute-engine/google_compute_engine/distro_lib/freebsd_11/utils.py
@@ -59,3 +59,11 @@ class Utils(utils.Utils):
proto_id: string, the routing protocol identifier for Google IP changes.
"""
return ip_forwarding_utils.IpForwardingUtilsIfconfig(logger)
+
+ def RestartNetworking(self, logger):
+ """Restart the networking service to force a DHCP refresh.
+
+ Args:
+ logger: logger object, used to write to SysLog and serial port.
+ """
+ pass
diff --git a/packages/python-google-compute-engine/google_compute_engine/distro_lib/helpers.py b/packages/python-google-compute-engine/google_compute_engine/distro_lib/helpers.py
index b7d16a1..a0be6a0 100644
--- a/packages/python-google-compute-engine/google_compute_engine/distro_lib/helpers.py
+++ b/packages/python-google-compute-engine/google_compute_engine/distro_lib/helpers.py
@@ -80,6 +80,7 @@ def CallDhclientIpv6(interfaces, logger, dhclient_script=None,
def CallEnableRouteAdvertisements(interfaces, logger):
"""Enable route advertisements.
+
Args:
interfaces: list of string, the output device names to enable.
logger: logger object, used to write to SysLog and serial port.
@@ -140,3 +141,17 @@ def CallSysctl(logger, name, value):
subprocess.check_call(sysctl_command)
except subprocess.CalledProcessError:
logger.warning('Unable to configure sysctl %s.', name)
+
+def SystemctlRestart(service, logger):
+ """Restart a service using systemctl.
+
+ Args:
+ service: the name of the service to restart.
+ logger: logger object, used to write to SysLog and serial port.
+ """
+ logger.info('Restarting service via "systemctl restart %s".', service)
+ systemctl_command = ['systemctl', 'restart', service]
+ try:
+ subprocess.check_call(systemctl_command)
+ except subprocess.CalledProcessError:
+ logger.warning('Failed to restart service %s.', service)
diff --git a/packages/python-google-compute-engine/google_compute_engine/distro_lib/sles_11/__init__.py b/packages/python-google-compute-engine/google_compute_engine/distro_lib/sles_11/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/packages/python-google-compute-engine/google_compute_engine/distro_lib/sles_11/__init__.py
+++ /dev/null
diff --git a/packages/python-google-compute-engine/google_compute_engine/distro_lib/sles_11/tests/__init__.py b/packages/python-google-compute-engine/google_compute_engine/distro_lib/sles_11/tests/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/packages/python-google-compute-engine/google_compute_engine/distro_lib/sles_11/tests/__init__.py
+++ /dev/null
diff --git a/packages/python-google-compute-engine/google_compute_engine/distro_lib/sles_11/tests/utils_test.py b/packages/python-google-compute-engine/google_compute_engine/distro_lib/sles_11/tests/utils_test.py
deleted file mode 100644
index 22d54de..0000000
--- a/packages/python-google-compute-engine/google_compute_engine/distro_lib/sles_11/tests/utils_test.py
+++ /dev/null
@@ -1,91 +0,0 @@
-#!/usr/bin/python
-# Copyright 2018 Google Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Unittest for utils.py module."""
-
-import subprocess
-
-from google_compute_engine.distro_lib.sles_11 import utils
-from google_compute_engine.test_compat import mock
-from google_compute_engine.test_compat import unittest
-
-
-class UtilsTest(unittest.TestCase):
-
- def setUp(self):
- self.mock_logger = mock.Mock()
- self.mock_setup = mock.create_autospec(utils.Utils)
-
- def testEnableNetworkInterfacesWithSingleNic(self):
- mocks = mock.Mock()
-
- utils.Utils.EnableNetworkInterfaces(
- self.mock_setup, ['eth0'], self.mock_logger)
- expected_calls = []
- self.assertEqual(mocks.mock_calls, expected_calls)
-
- def testEnableNetworkInterfacesWithMultipleNics(self):
- mocks = mock.Mock()
- mocks.attach_mock(self.mock_setup._Dhcpcd, 'dhcpcd')
-
- utils.Utils.EnableNetworkInterfaces(
- self.mock_setup, ['eth0', 'eth1', 'eth2'], self.mock_logger)
- expected_calls = [
- mock.call.dhcpcd(['eth1', 'eth2'], mock.ANY),
- ]
- self.assertEqual(mocks.mock_calls, expected_calls)
-
- @mock.patch(
- 'google_compute_engine.distro_lib.sles_11.utils.subprocess.check_call')
- def testDhcpcd(self, mock_call):
- mocks = mock.Mock()
- mocks.attach_mock(mock_call, 'call')
- mocks.attach_mock(self.mock_logger, 'logger')
- mock_call.side_effect = [
- None, None, None, None,
- subprocess.CalledProcessError(1, 'Test'),
- subprocess.CalledProcessError(1, 'Test'),
- ]
-
- utils.Utils._Dhcpcd(
- self.mock_setup, ['eth1', 'eth2', 'eth3'], self.mock_logger)
- expected_calls = [
- mock.call.call(['/sbin/dhcpcd', '-x', 'eth1']),
- mock.call.call(['/sbin/dhcpcd', 'eth1']),
- mock.call.call(['/sbin/dhcpcd', '-x', 'eth2']),
- mock.call.call(['/sbin/dhcpcd', 'eth2']),
- mock.call.call(['/sbin/dhcpcd', '-x', 'eth3']),
- mock.call.logger.info(mock.ANY, 'eth3'),
- mock.call.call(['/sbin/dhcpcd','eth3']),
- mock.call.logger.warning(mock.ANY, 'eth3'),
- ]
- self.assertEqual(mocks.mock_calls, expected_calls)
-
- @mock.patch('google_compute_engine.distro_lib.helpers.CallHwclock')
- def testHandleClockSync(self, mock_call):
- mocks = mock.Mock()
- mocks.attach_mock(mock_call, 'call')
-
- utils.Utils.HandleClockSync(self.mock_setup, self.mock_logger)
- expected_calls = [mock.call.call(mock.ANY)]
- self.assertEqual(mocks.mock_calls, expected_calls)
-
- @mock.patch('google_compute_engine.distro_lib.ip_forwarding_utils.IpForwardingUtilsIproute')
- def testIpForwardingUtils(self, mock_call):
- mocks = mock.Mock()
- mocks.attach_mock(mock_call, 'call')
-
- utils.Utils.IpForwardingUtils(self.mock_setup, self.mock_logger, '66')
- expected_calls = [mock.call.call(mock.ANY, '66')]
- self.assertEqual(mocks.mock_calls, expected_calls)
diff --git a/packages/python-google-compute-engine/google_compute_engine/distro_lib/sles_11/utils.py b/packages/python-google-compute-engine/google_compute_engine/distro_lib/sles_11/utils.py
deleted file mode 100644
index 623505c..0000000
--- a/packages/python-google-compute-engine/google_compute_engine/distro_lib/sles_11/utils.py
+++ /dev/null
@@ -1,88 +0,0 @@
-#!/usr/bin/python
-# Copyright 2018 Google Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""Utilities that are distro specific for use on SUSE 11."""
-
-import os
-import subprocess
-
-from google_compute_engine import constants
-from google_compute_engine.distro_lib import helpers
-from google_compute_engine.distro_lib import ip_forwarding_utils
-from google_compute_engine.distro_lib import utils
-
-
-class Utils(utils.Utils):
- """Utilities used by Linux guest services on SUSE 11."""
-
- def EnableIpv6(self, interfaces, logger, dhclient_script=None):
- """Configure the network interfaces for IPv6 using dhclient.
-
- Args:
- interface: string, the output device names for enabling IPv6.
- logger: logger object, used to write to SysLog and serial port.
- dhclient_script: string, the path to a dhclient script used by dhclient.
- """
- pass
-
- def EnableNetworkInterfaces(self, interfaces, logger, dhclient_script=None):
- """Enable the list of network interfaces.
-
- Args:
- interfaces: list of string, the output device names to enable.
- logger: logger object, used to write to SysLog and serial port.
- dhclient_script: string, the path to a dhclient script used by dhclient.
- """
- interfaces_to_up = [i for i in interfaces if i != 'eth0']
- if interfaces_to_up:
- logger.info('Enabling the Ethernet interfaces %s.', interfaces_to_up)
- self._Dhcpcd(interfaces_to_up, logger)
-
- def _Dhcpcd(self, interfaces, logger):
- """Use dhcpcd to activate the interfaces.
-
- Args:
- interfaces: list of string, the output device names to enable.
- logger: logger object, used to write to SysLog and serial port.
- """
- for interface in interfaces:
- dhcpcd = ['/sbin/dhcpcd']
- try:
- subprocess.check_call(dhcpcd + ['-x', interface])
- except subprocess.CalledProcessError:
- # Dhcpcd not yet running for this device.
- logger.info('Dhcpcd not yet running for interface %s.', interface)
- try:
- subprocess.check_call(dhcpcd + [interface])
- except subprocess.CalledProcessError:
- # The interface is already active.
- logger.warning('Could not activate interface %s.', interface)
-
- def HandleClockSync(self, logger):
- """Sync the software clock with the hypervisor clock.
-
- Args:
- logger: logger object, used to write to SysLog and serial port.
- """
- helpers.CallHwclock(logger)
-
- def IpForwardingUtils(self, logger, proto_id=None):
- """Get system IP address configuration utilities.
-
- Args:
- logger: logger object, used to write to SysLog and serial port.
- proto_id: string, the routing protocol identifier for Google IP changes.
- """
- return ip_forwarding_utils.IpForwardingUtilsIproute(logger, proto_id)
diff --git a/packages/python-google-compute-engine/google_compute_engine/distro_lib/sles_12/utils.py b/packages/python-google-compute-engine/google_compute_engine/distro_lib/sles_12/utils.py
index b4a3d00..a8bd486 100644
--- a/packages/python-google-compute-engine/google_compute_engine/distro_lib/sles_12/utils.py
+++ b/packages/python-google-compute-engine/google_compute_engine/distro_lib/sles_12/utils.py
@@ -108,3 +108,11 @@ class Utils(utils.Utils):
proto_id: string, the routing protocol identifier for Google IP changes.
"""
return ip_forwarding_utils.IpForwardingUtilsIproute(logger, proto_id)
+
+ def RestartNetworking(self, logger):
+ """Restart the networking service to force a DHCP refresh.
+
+ Args:
+ logger: logger object, used to write to SysLog and serial port.
+ """
+ helpers.SystemctlRestart('wickedd-nanny', logger)
diff --git a/packages/python-google-compute-engine/google_compute_engine/networking/network_daemon.py b/packages/python-google-compute-engine/google_compute_engine/networking/network_daemon.py
index e152464..5a791cc 100644
--- a/packages/python-google-compute-engine/google_compute_engine/networking/network_daemon.py
+++ b/packages/python-google-compute-engine/google_compute_engine/networking/network_daemon.py
@@ -22,6 +22,7 @@ Update IP forwarding when metadata changes.
import logging.handlers
import optparse
import random
+import socket
from google_compute_engine import config_manager
from google_compute_engine import constants
@@ -29,6 +30,7 @@ from google_compute_engine import file_utils
from google_compute_engine import logger
from google_compute_engine import metadata_watcher
from google_compute_engine import network_utils
+from google_compute_engine.compat import distro_utils
from google_compute_engine.networking.ip_forwarding import ip_forwarding
from google_compute_engine.networking.network_setup import network_setup
@@ -38,7 +40,7 @@ LOCKFILE = constants.LOCALSTATEDIR + '/lock/google_networking.lock'
class NetworkDaemon(object):
"""Manage networking based on changes to network metadata."""
- network_interface_metadata_key = 'instance/network-interfaces'
+ instance_metadata_key = 'instance/'
def __init__(
self, ip_forwarding_enabled, proto_id, ip_aliases, target_instance_ips,
@@ -62,6 +64,7 @@ class NetworkDaemon(object):
self.ip_forwarding_enabled = ip_forwarding_enabled
self.network_setup_enabled = network_setup_enabled
self.target_instance_ips = target_instance_ips
+ self.dhclient_script = dhclient_script
self.ip_forwarding = ip_forwarding.IpForwarding(
proto_id=proto_id, debug=debug)
@@ -69,6 +72,7 @@ class NetworkDaemon(object):
dhclient_script=dhclient_script, dhcp_command=dhcp_command, debug=debug)
self.network_utils = network_utils.NetworkUtils(logger=self.logger)
self.watcher = metadata_watcher.MetadataWatcher(logger=self.logger)
+ self.distro_utils = distro_utils.Utils(debug=debug)
try:
with file_utils.LockFile(LOCKFILE):
@@ -76,7 +80,7 @@ class NetworkDaemon(object):
timeout = 60 + random.randint(0, 30)
self.watcher.WatchMetadata(
self.HandleNetworkInterfaces,
- metadata_key=self.network_interface_metadata_key, recursive=True,
+ metadata_key=self.instance_metadata_key, recursive=True,
timeout=timeout)
except (IOError, OSError) as e:
self.logger.warning(str(e))
@@ -87,7 +91,8 @@ class NetworkDaemon(object):
Args:
result: dict, the metadata response with the network interfaces.
"""
- network_interfaces = self._ExtractInterfaceMetadata(result)
+ network_interfaces = self._ExtractInterfaceMetadata(
+ result['networkInterfaces'])
if self.network_setup_enabled:
default_interface = network_interfaces[0]
@@ -98,10 +103,12 @@ class NetworkDaemon(object):
self.network_setup.EnableNetworkInterfaces(
[interface.name for interface in network_interfaces[1:]])
- for interface in network_interfaces:
- if self.ip_forwarding_enabled:
+ if self.ip_forwarding_enabled:
+ for interface in network_interfaces:
self.ip_forwarding.HandleForwardedIps(
interface.name, interface.forwarded_ips, interface.ip)
+ if socket.gethostname() != result['hostname'].split('.')[0]:
+ self.distro_utils.RestartNetworking(self.logger)
def _ExtractInterfaceMetadata(self, metadata):
"""Extracts network interface metadata.
diff --git a/packages/python-google-compute-engine/google_compute_engine/networking/tests/network_daemon_test.py b/packages/python-google-compute-engine/google_compute_engine/networking/tests/network_daemon_test.py
index 9216ea3..2c3640a 100644
--- a/packages/python-google-compute-engine/google_compute_engine/networking/tests/network_daemon_test.py
+++ b/packages/python-google-compute-engine/google_compute_engine/networking/tests/network_daemon_test.py
@@ -54,7 +54,7 @@ class NetworkDaemonTest(unittest.TestCase):
mocks.attach_mock(mock_ip_forwarding, 'forwarding')
mocks.attach_mock(mock_network_setup, 'network_setup')
mocks.attach_mock(mock_watcher, 'watcher')
- metadata_key = network_daemon.NetworkDaemon.network_interface_metadata_key
+ metadata_key = network_daemon.NetworkDaemon.instance_metadata_key
with mock.patch.object(
network_daemon.NetworkDaemon, 'HandleNetworkInterfaces'
@@ -129,11 +129,13 @@ class NetworkDaemonTest(unittest.TestCase):
]
self.assertEqual(mocks.mock_calls, expected_calls)
- def testHandleNetworkInterfaces(self):
+ @mock.patch('google_compute_engine.networking.network_daemon.distro_utils')
+ def testHandleNetworkInterfaces(self, mock_distro_utils):
mocks = mock.Mock()
mocks.attach_mock(self.mock_ip_forwarding, 'forwarding')
mocks.attach_mock(self.mock_network_setup, 'network_setup')
mocks.attach_mock(self.mock_setup, 'setup')
+ mocks.attach_mock(mock_distro_utils, 'distro_utils')
self.mock_setup.ip_aliases = None
self.mock_setup.target_instance_ips = None
self.mock_setup.ip_forwarding_enabled = True
@@ -143,17 +145,19 @@ class NetworkDaemonTest(unittest.TestCase):
'eth0', forwarded_ips=['a'], ip='1.1.1.1', ipv6=False),
network_daemon.NetworkDaemon.NetworkInterface('eth1'),
]
- result = mock.Mock()
+ self.mock_setup.distro_utils = mock.MagicMock()
+ result = mock.MagicMock()
network_daemon.NetworkDaemon.HandleNetworkInterfaces(
self.mock_setup, result)
expected_calls = [
- mock.call.setup._ExtractInterfaceMetadata(result),
+ mock.call.setup._ExtractInterfaceMetadata(result['networkInterfaces']),
mock.call.network_setup.DisableIpv6(['eth0']),
mock.call.network_setup.EnableNetworkInterfaces(['eth1']),
mock.call.forwarding.HandleForwardedIps(
'eth0', ['a'], '1.1.1.1'),
mock.call.forwarding.HandleForwardedIps('eth1', None, None),
+ mock.call.setup.distro_utils.RestartNetworking(self.mock_setup.logger),
]
self.assertEqual(mocks.mock_calls, expected_calls)
@@ -170,16 +174,18 @@ class NetworkDaemonTest(unittest.TestCase):
network_daemon.NetworkDaemon.NetworkInterface(
'eth0', forwarded_ips=['a'], ip='1.1.1.1', ipv6=True),
]
- result = mock.Mock()
+ self.mock_setup.distro_utils = mock.MagicMock()
+ result = mock.MagicMock()
network_daemon.NetworkDaemon.HandleNetworkInterfaces(
self.mock_setup, result)
expected_calls = [
- mock.call.setup._ExtractInterfaceMetadata(result),
+ mock.call.setup._ExtractInterfaceMetadata(result['networkInterfaces']),
mock.call.network_setup.EnableIpv6(['eth0']),
mock.call.network_setup.EnableNetworkInterfaces([]),
mock.call.forwarding.HandleForwardedIps(
'eth0', ['a'], '1.1.1.1'),
+ mock.call.setup.distro_utils.RestartNetworking(self.mock_setup.logger),
]
self.assertEqual(mocks.mock_calls, expected_calls)
@@ -196,16 +202,18 @@ class NetworkDaemonTest(unittest.TestCase):
network_daemon.NetworkDaemon.NetworkInterface(
'eth0', forwarded_ips=['a'], ip='1.1.1.1', ipv6=False),
]
- result = mock.Mock()
+ self.mock_setup.distro_utils = mock.MagicMock()
+ result = mock.MagicMock()
network_daemon.NetworkDaemon.HandleNetworkInterfaces(
self.mock_setup, result)
expected_calls = [
- mock.call.setup._ExtractInterfaceMetadata(result),
+ mock.call.setup._ExtractInterfaceMetadata(result['networkInterfaces']),
mock.call.network_setup.DisableIpv6(['eth0']),
mock.call.network_setup.EnableNetworkInterfaces([]),
mock.call.forwarding.HandleForwardedIps(
'eth0', ['a'], '1.1.1.1'),
+ mock.call.setup.distro_utils.RestartNetworking(self.mock_setup.logger),
]
self.assertEqual(mocks.mock_calls, expected_calls)
@@ -222,12 +230,14 @@ class NetworkDaemonTest(unittest.TestCase):
network_daemon.NetworkDaemon.NetworkInterface('a'),
network_daemon.NetworkDaemon.NetworkInterface('b'),
]
- result = mock.Mock()
+ self.mock_setup.distro_utils = mock.MagicMock()
+ result = mock.MagicMock()
network_daemon.NetworkDaemon.HandleNetworkInterfaces(
self.mock_setup, result)
expected_calls = [
- mock.call.setup._ExtractInterfaceMetadata(result),
+ mock.call.setup._ExtractInterfaceMetadata(result['networkInterfaces']),
+ mock.call.setup.distro_utils.RestartNetworking(self.mock_setup.logger),
]
self.assertEqual(mocks.mock_calls, expected_calls)
diff --git a/packages/python-google-compute-engine/google_compute_engine/tests/compat_test.py b/packages/python-google-compute-engine/google_compute_engine/tests/compat_test.py
index 803efef..2e8a128 100644
--- a/packages/python-google-compute-engine/google_compute_engine/tests/compat_test.py
+++ b/packages/python-google-compute-engine/google_compute_engine/tests/compat_test.py
@@ -73,14 +73,10 @@ class CompatTest(unittest.TestCase):
test_cases = {
('Fedora', '28', ''):
google_compute_engine.distro_lib.el_7.utils,
- ('debian', '8.10', ''):
- google_compute_engine.distro_lib.debian_8.utils,
('debian', '9.3', ''):
google_compute_engine.distro_lib.debian_9.utils,
('debian', '10.3', ''):
google_compute_engine.distro_lib.debian_9.utils,
- ('SUSE Linux Enterprise Server', '11', 'x86_64'):
- google_compute_engine.distro_lib.sles_11.utils,
('SUSE Linux Enterprise Server', '12', 'x86_64'):
google_compute_engine.distro_lib.sles_12.utils,
('SUSE Linux Enterprise Server', '13', 'x86_64'):