Merge "Switch to using neutron.common.utils:replace_file()"

This commit is contained in:
Jenkins 2015-11-16 13:58:19 +00:00 committed by Gerrit Code Review
commit daa545fb43
10 changed files with 97 additions and 49 deletions

View File

@ -26,15 +26,14 @@ from oslo_log import log as logging
from oslo_utils import uuidutils
import six
from neutron.agent.common import utils as common_utils
from neutron.agent.common import utils as agent_common_utils
from neutron.agent.linux import external_process
from neutron.agent.linux import ip_lib
from neutron.agent.linux import iptables_manager
from neutron.agent.linux import utils
from neutron.common import constants
from neutron.common import exceptions
from neutron.common import ipv6_utils
from neutron.common import utils as commonutils
from neutron.common import utils as common_utils
from neutron.extensions import extra_dhcp_opt as edo_ext
from neutron.i18n import _LI, _LW, _LE
@ -178,7 +177,7 @@ class DhcpLocalProcess(DhcpBase):
version, plugin)
self.confs_dir = self.get_confs_dir(conf)
self.network_conf_dir = os.path.join(self.confs_dir, network.id)
commonutils.ensure_dir(self.network_conf_dir)
common_utils.ensure_dir(self.network_conf_dir)
@staticmethod
def get_confs_dir(conf):
@ -203,7 +202,7 @@ class DhcpLocalProcess(DhcpBase):
if self.active:
self.restart()
elif self._enable_dhcp():
commonutils.ensure_dir(self.network_conf_dir)
common_utils.ensure_dir(self.network_conf_dir)
interface_name = self.device_manager.setup(self.network)
self.interface_name = interface_name
self.spawn_process()
@ -264,7 +263,7 @@ class DhcpLocalProcess(DhcpBase):
@interface_name.setter
def interface_name(self, value):
interface_file_path = self.get_conf_file_name('interface')
utils.replace_file(interface_file_path, value)
common_utils.replace_file(interface_file_path, value)
@property
def active(self):
@ -600,7 +599,7 @@ class Dnsmasq(DhcpLocalProcess):
buf.write('%s %s %s * *\n' %
(timestamp, port.mac_address, ip_address))
contents = buf.getvalue()
utils.replace_file(filename, contents)
common_utils.replace_file(filename, contents)
LOG.debug('Done building initial lease file %s with contents:\n%s',
filename, contents)
return filename
@ -670,7 +669,7 @@ class Dnsmasq(DhcpLocalProcess):
buf.write('%s,%s,%s\n' %
(port.mac_address, name, ip_address))
utils.replace_file(filename, buf.getvalue())
common_utils.replace_file(filename, buf.getvalue())
LOG.debug('Done building host file %s with contents:\n%s', filename,
buf.getvalue())
return filename
@ -741,7 +740,7 @@ class Dnsmasq(DhcpLocalProcess):
if alloc:
buf.write('%s\t%s %s\n' % (alloc.ip_address, fqdn, hostname))
addn_hosts = self.get_conf_file_name('addn_hosts')
utils.replace_file(addn_hosts, buf.getvalue())
common_utils.replace_file(addn_hosts, buf.getvalue())
return addn_hosts
def _output_opts_file(self):
@ -750,7 +749,7 @@ class Dnsmasq(DhcpLocalProcess):
options += self._generate_opts_per_port(subnet_index_map)
name = self.get_conf_file_name('opts')
utils.replace_file(name, '\n'.join(options))
common_utils.replace_file(name, '\n'.join(options))
return name
def _generate_opts_per_subnet(self):
@ -983,7 +982,7 @@ class DeviceManager(object):
def __init__(self, conf, plugin):
self.conf = conf
self.plugin = plugin
self.driver = common_utils.load_interface_driver(conf)
self.driver = agent_common_utils.load_interface_driver(conf)
def get_interface_name(self, network, port):
"""Return interface(device) name for use by the DHCP process."""
@ -993,7 +992,8 @@ class DeviceManager(object):
"""Return a unique DHCP device ID for this host on the network."""
# There could be more than one dhcp server per network, so create
# a device id that combines host and network ids
return commonutils.get_dhcp_agent_device_id(network.id, self.conf.host)
return common_utils.get_dhcp_agent_device_id(network.id,
self.conf.host)
def _set_default_route(self, network, device_name):
"""Sets the default gateway for this dhcp namespace.

View File

@ -24,6 +24,7 @@ from neutron.agent.linux import pd
from neutron.agent.linux import pd_driver
from neutron.agent.linux import utils
from neutron.common import constants
from neutron.common import utils as common_utils
from oslo_log import log as logging
@ -83,7 +84,7 @@ class PDDibbler(pd_driver.PDDriverBase):
buf.write('%s' % SCRIPT_TEMPLATE.render(
prefix_path=self.prefix_path,
l3_agent_pid=os.getpid()))
utils.replace_file(script_path, buf.getvalue())
common_utils.replace_file(script_path, buf.getvalue())
os.chmod(script_path, 0o744)
dibbler_conf = utils.get_conf_file_name(dcwa, 'client', 'conf', False)
@ -95,7 +96,7 @@ class PDDibbler(pd_driver.PDDriverBase):
interface_name='"%s"' % ex_gw_ifname,
bind_address='%s' % lla))
utils.replace_file(dibbler_conf, buf.getvalue())
common_utils.replace_file(dibbler_conf, buf.getvalue())
return dcwa
def _spawn_dibbler(self, pmon, router_ns, dibbler_conf):

View File

@ -21,7 +21,6 @@ from oslo_config import cfg
from oslo_log import log as logging
from neutron.agent.linux import external_process
from neutron.agent.linux import utils
from neutron.common import exceptions
from neutron.common import utils as common_utils
@ -378,7 +377,7 @@ class KeepalivedManager(object):
def _output_config_file(self):
config_str = self.config.get_config_str()
config_path = self.get_full_config_file_path('keepalived.conf')
utils.replace_file(config_path, config_str)
common_utils.replace_file(config_path, config_str)
return config_path

View File

@ -22,6 +22,7 @@ import six
from neutron.agent.linux import external_process
from neutron.agent.linux import utils
from neutron.common import constants
from neutron.common import utils as common_utils
RADVD_SERVICE_NAME = 'radvd'
@ -94,7 +95,7 @@ class DaemonMonitor(object):
prefixes=auto_config_prefixes,
constants=constants))
utils.replace_file(radvd_conf, buf.getvalue())
common_utils.replace_file(radvd_conf, buf.getvalue())
return radvd_conf
def _get_radvd_process_manager(self, callback=None):

View File

@ -479,7 +479,7 @@ def round_val(val):
rounding=decimal.ROUND_HALF_UP))
def replace_file(file_name, data):
def replace_file(file_name, data, file_mode=0o644):
"""Replaces the contents of file_name with data in a safe manner.
First write to a temp file and then rename. Since POSIX renames are
@ -493,7 +493,7 @@ def replace_file(file_name, data):
dir=base_dir,
delete=False) as tmp_file:
tmp_file.write(data)
os.chmod(tmp_file.name, 0o644)
os.chmod(tmp_file.name, file_mode)
os.rename(tmp_file.name, file_name)

View File

@ -0,0 +1,51 @@
# 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.
import os.path
import stat
from neutron.common import utils
from neutron.tests import base
class TestReplaceFile(base.BaseTestCase):
def setUp(self):
super(TestReplaceFile, self).setUp()
temp_dir = self.get_default_temp_dir().path
self.file_name = os.path.join(temp_dir, "new_file")
self.data = "data to copy"
def _verify_result(self, file_mode):
self.assertTrue(os.path.exists(self.file_name))
with open(self.file_name) as f:
content = f.read()
self.assertEqual(self.data, content)
mode = os.stat(self.file_name).st_mode
self.assertEqual(file_mode, stat.S_IMODE(mode))
def test_replace_file_default_mode(self):
file_mode = 0o644
utils.replace_file(self.file_name, self.data)
self._verify_result(file_mode)
def test_replace_file_custom_mode(self):
file_mode = 0o722
utils.replace_file(self.file_name, self.data, file_mode)
self._verify_result(file_mode)
def test_replace_file_custom_mode_twice(self):
file_mode = 0o722
utils.replace_file(self.file_name, self.data, file_mode)
self.data = "new data to copy"
file_mode = 0o777
utils.replace_file(self.file_name, self.data, file_mode)
self._verify_result(file_mode)

View File

@ -93,7 +93,7 @@ class BasicRouterOperationsFramework(base.BaseTestCase):
self.utils_exec = self.utils_exec_p.start()
self.utils_replace_file_p = mock.patch(
'neutron.agent.linux.utils.replace_file')
'neutron.common.utils.replace_file')
self.utils_replace_file = self.utils_replace_file_p.start()
self.external_process_p = mock.patch(

View File

@ -75,7 +75,7 @@ class TestDvrRouterOperations(base.BaseTestCase):
self.utils_exec = self.utils_exec_p.start()
self.utils_replace_file_p = mock.patch(
'neutron.agent.linux.utils.replace_file')
'neutron.common.utils.replace_file')
self.utils_replace_file = self.utils_replace_file_p.start()
self.external_process_p = mock.patch(

View File

@ -815,7 +815,7 @@ class TestBase(TestConfBase):
self.config_parse(self.conf)
self.conf.set_override('state_path', '')
self.replace_p = mock.patch('neutron.agent.linux.utils.replace_file')
self.replace_p = mock.patch('neutron.common.utils.replace_file')
self.execute_p = mock.patch('neutron.agent.common.utils.execute')
self.safe = self.replace_p.start()
self.execute = self.execute_p.start()
@ -974,7 +974,7 @@ class TestDhcpLocalProcess(TestBase):
self.assertEqual(lp.interface_name, 'tap0')
def test_set_interface_name(self):
with mock.patch('neutron.agent.linux.utils.replace_file') as replace:
with mock.patch('neutron.common.utils.replace_file') as replace:
lp = LocalChild(self.conf, FakeDualNetwork())
with mock.patch.object(lp, 'get_conf_file_name') as conf_file:
conf_file.return_value = '/interface'
@ -1949,22 +1949,14 @@ class TestDnsmasq(TestBase):
class TestDeviceManager(TestConfBase):
@mock.patch('neutron.agent.linux.dhcp.ip_lib')
@mock.patch('neutron.agent.linux.dhcp.common_utils.load_interface_driver')
def test_setup(self, load_interface_driver, ip_lib):
"""Test new and existing cases of DeviceManager's DHCP port setup
logic.
"""
self._test_setup(load_interface_driver, ip_lib, False)
@mock.patch('neutron.agent.linux.dhcp.ip_lib')
@mock.patch('neutron.agent.linux.dhcp.common_utils.load_interface_driver')
def test_setup_gateway_ips(self, load_interface_driver, ip_lib):
"""Test new and existing cases of DeviceManager's DHCP port setup
logic.
"""
self._test_setup(load_interface_driver, ip_lib, True)
def setUp(self):
super(TestDeviceManager, self).setUp()
ip_lib_patcher = mock.patch('neutron.agent.linux.dhcp.ip_lib')
load_interface_driver_patcher = mock.patch(
'neutron.agent.linux.dhcp.agent_common_utils.'
'load_interface_driver')
self.mock_ip_lib = ip_lib_patcher.start()
self.mock_load_interface_driver = load_interface_driver_patcher.start()
def _test_setup(self, load_interface_driver, ip_lib, use_gateway_ips):
# Create DeviceManager.
@ -2028,9 +2020,15 @@ class TestDeviceManager(TestConfBase):
'unique-IP-address/64']))
self.assertFalse(plugin.create_dhcp_port.called)
@mock.patch('neutron.agent.linux.dhcp.ip_lib')
@mock.patch('neutron.agent.linux.dhcp.common_utils.load_interface_driver')
def test_setup_reserved(self, load_interface_driver, ip_lib):
def test_setup_device_manager_dhcp_port_without_gateway_ips(self):
self._test_setup(self.mock_load_interface_driver,
self.mock_ip_lib, use_gateway_ips=False)
def test_setup_device_manager_dhcp_port_with_gateway_ips(self):
self._test_setup(self.mock_load_interface_driver,
self.mock_ip_lib, use_gateway_ips=True)
def test_setup_reserved(self):
"""Test reserved port case of DeviceManager's DHCP port setup
logic.
"""
@ -2040,7 +2038,7 @@ class TestDeviceManager(TestConfBase):
default=False))
plugin = mock.Mock()
mgr = dhcp.DeviceManager(self.conf, plugin)
load_interface_driver.assert_called_with(self.conf)
self.mock_load_interface_driver.assert_called_with(self.conf)
# Setup with a reserved DHCP port.
network = FakeDualNetworkReserved()
@ -2056,7 +2054,7 @@ class TestDeviceManager(TestConfBase):
plugin.update_dhcp_port.side_effect = mock_update
mgr.driver.get_device_name.return_value = 'ns-XXX'
mgr.driver.use_gateway_ips = False
ip_lib.ensure_device_is_ready.return_value = True
self.mock_ip_lib.ensure_device_is_ready.return_value = True
mgr.setup(network)
plugin.update_dhcp_port.assert_called_with(reserved_port.id, mock.ANY)
@ -2064,9 +2062,7 @@ class TestDeviceManager(TestConfBase):
['192.168.0.6/24'],
namespace='qdhcp-ns')
@mock.patch('neutron.agent.linux.dhcp.ip_lib')
@mock.patch('neutron.agent.linux.dhcp.common_utils.load_interface_driver')
def test_setup_reserved_2(self, load_interface_driver, ip_lib):
def test_setup_reserved_2(self):
"""Test scenario where a network has two reserved ports, and
update_dhcp_port fails for the first of those.
"""
@ -2076,7 +2072,7 @@ class TestDeviceManager(TestConfBase):
default=False))
plugin = mock.Mock()
mgr = dhcp.DeviceManager(self.conf, plugin)
load_interface_driver.assert_called_with(self.conf)
self.mock_load_interface_driver.assert_called_with(self.conf)
# Setup with a reserved DHCP port.
network = FakeDualNetworkReserved2()
@ -2096,7 +2092,7 @@ class TestDeviceManager(TestConfBase):
plugin.update_dhcp_port.side_effect = mock_update
mgr.driver.get_device_name.return_value = 'ns-XXX'
mgr.driver.use_gateway_ips = False
ip_lib.ensure_device_is_ready.return_value = True
self.mock_ip_lib.ensure_device_is_ready.return_value = True
mgr.setup(network)
plugin.update_dhcp_port.assert_called_with(reserved_port_2.id,
mock.ANY)