From 324758120ce4ef7eaaf6cfcbbc0712dcf164d7bb Mon Sep 17 00:00:00 2001 From: Liam Hopkins Date: Fri, 9 Aug 2019 12:02:36 -0700 Subject: Detect hostname changes (#835) * Restart primary networking to detect new hostname. --- .../google_compute_engine/compat.py | 4 - .../distro_lib/debian_8/__init__.py | 0 .../distro_lib/debian_8/tests/__init__.py | 0 .../distro_lib/debian_8/tests/utils_test.py | 80 ------------------- .../distro_lib/debian_8/utils.py | 71 ----------------- .../distro_lib/debian_9/utils.py | 8 ++ .../google_compute_engine/distro_lib/el_6/utils.py | 14 ++++ .../google_compute_engine/distro_lib/el_7/utils.py | 8 ++ .../distro_lib/freebsd_11/utils.py | 8 ++ .../google_compute_engine/distro_lib/helpers.py | 15 ++++ .../distro_lib/sles_11/__init__.py | 0 .../distro_lib/sles_11/tests/__init__.py | 0 .../distro_lib/sles_11/tests/utils_test.py | 91 ---------------------- .../distro_lib/sles_11/utils.py | 88 --------------------- .../distro_lib/sles_12/utils.py | 8 ++ .../networking/network_daemon.py | 17 ++-- .../networking/tests/network_daemon_test.py | 30 ++++--- .../google_compute_engine/tests/compat_test.py | 4 - 18 files changed, 93 insertions(+), 353 deletions(-) delete mode 100644 packages/python-google-compute-engine/google_compute_engine/distro_lib/debian_8/__init__.py delete mode 100644 packages/python-google-compute-engine/google_compute_engine/distro_lib/debian_8/tests/__init__.py delete mode 100644 packages/python-google-compute-engine/google_compute_engine/distro_lib/debian_8/tests/utils_test.py delete mode 100644 packages/python-google-compute-engine/google_compute_engine/distro_lib/debian_8/utils.py delete mode 100644 packages/python-google-compute-engine/google_compute_engine/distro_lib/sles_11/__init__.py delete mode 100644 packages/python-google-compute-engine/google_compute_engine/distro_lib/sles_11/tests/__init__.py delete mode 100644 packages/python-google-compute-engine/google_compute_engine/distro_lib/sles_11/tests/utils_test.py delete mode 100644 packages/python-google-compute-engine/google_compute_engine/distro_lib/sles_11/utils.py (limited to 'packages') 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 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 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 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 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'): -- cgit v1.2.1