Fix pid file location to avoid I->J changes that break metadata
Changes in commit 7f8ae630b8
moved
pid files handled by agent/linux/external_process.py from
$state_path/external/<uuid>.pid to $state_path/external/<uuid>/pid
that breaks the neutron-ns-metadata-proxy respawn after upgrades
becase the l3 or dhcp agent can't find the old pid file so
they try to start a new neutron-ns-metadata-proxy which won't
succeed, because the old one is holding the port already.
Closes-Bug: #1376128
Change-Id: Id166ec8e508aaab8eea35d89d010a5a0b7fdba1f
This commit is contained in:
parent
9bdc634bb5
commit
1b5159a07d
@ -14,9 +14,9 @@
|
||||
# under the License.
|
||||
|
||||
import fcntl
|
||||
import glob
|
||||
import os
|
||||
import shlex
|
||||
import shutil
|
||||
import socket
|
||||
import struct
|
||||
import tempfile
|
||||
@ -134,19 +134,19 @@ def find_child_pids(pid):
|
||||
return [x.strip() for x in raw_pids.split('\n') if x.strip()]
|
||||
|
||||
|
||||
def _get_conf_dir(cfg_root, uuid, ensure_conf_dir):
|
||||
confs_dir = os.path.abspath(os.path.normpath(cfg_root))
|
||||
conf_dir = os.path.join(confs_dir, uuid)
|
||||
def _get_conf_base(cfg_root, uuid, ensure_conf_dir):
|
||||
conf_dir = os.path.abspath(os.path.normpath(cfg_root))
|
||||
conf_base = os.path.join(conf_dir, uuid)
|
||||
if ensure_conf_dir:
|
||||
if not os.path.isdir(conf_dir):
|
||||
os.makedirs(conf_dir, 0o755)
|
||||
return conf_dir
|
||||
return conf_base
|
||||
|
||||
|
||||
def get_conf_file_name(cfg_root, uuid, cfg_file, ensure_conf_dir=False):
|
||||
"""Returns the file name for a given kind of config file."""
|
||||
conf_dir = _get_conf_dir(cfg_root, uuid, ensure_conf_dir)
|
||||
return os.path.join(conf_dir, cfg_file)
|
||||
conf_base = _get_conf_base(cfg_root, uuid, ensure_conf_dir)
|
||||
return "%s.%s" % (conf_base, cfg_file)
|
||||
|
||||
|
||||
def get_value_from_conf_file(cfg_root, uuid, cfg_file, converter=None):
|
||||
@ -168,15 +168,13 @@ def get_value_from_conf_file(cfg_root, uuid, cfg_file, converter=None):
|
||||
|
||||
|
||||
def remove_conf_files(cfg_root, uuid):
|
||||
conf_dir = _get_conf_dir(cfg_root, uuid, False)
|
||||
shutil.rmtree(conf_dir, ignore_errors=True)
|
||||
conf_base = _get_conf_base(cfg_root, uuid, False)
|
||||
for file_path in glob.iglob("%s.*" % conf_base):
|
||||
os.unlink(file_path)
|
||||
|
||||
|
||||
def remove_conf_file(cfg_root, uuid, cfg_file):
|
||||
"""Remove a config file. Remove the directory if this is the last file."""
|
||||
"""Remove a config file."""
|
||||
conf_file = get_conf_file_name(cfg_root, uuid, cfg_file)
|
||||
if os.path.exists(conf_file):
|
||||
os.unlink(conf_file)
|
||||
conf_dir = _get_conf_dir(cfg_root, uuid, False)
|
||||
if not os.listdir(conf_dir):
|
||||
shutil.rmtree(conf_dir, ignore_errors=True)
|
||||
|
@ -123,7 +123,7 @@ class TestProcessManager(base.BaseTestCase):
|
||||
isdir.return_value = True
|
||||
manager = ep.ProcessManager(self.conf, 'uuid')
|
||||
retval = manager.get_pid_file_name(ensure_pids_dir=True)
|
||||
self.assertEqual(retval, '/var/path/uuid/pid')
|
||||
self.assertEqual(retval, '/var/path/uuid.pid')
|
||||
|
||||
def test_get_pid_file_name_not_existing(self):
|
||||
with mock.patch.object(ep.utils.os.path, 'isdir') as isdir:
|
||||
@ -131,15 +131,15 @@ class TestProcessManager(base.BaseTestCase):
|
||||
isdir.return_value = False
|
||||
manager = ep.ProcessManager(self.conf, 'uuid')
|
||||
retval = manager.get_pid_file_name(ensure_pids_dir=True)
|
||||
self.assertEqual(retval, '/var/path/uuid/pid')
|
||||
makedirs.assert_called_once_with('/var/path/uuid', 0o755)
|
||||
self.assertEqual(retval, '/var/path/uuid.pid')
|
||||
makedirs.assert_called_once_with('/var/path', 0o755)
|
||||
|
||||
def test_get_pid_file_name_default(self):
|
||||
with mock.patch.object(ep.utils.os.path, 'isdir') as isdir:
|
||||
isdir.return_value = True
|
||||
manager = ep.ProcessManager(self.conf, 'uuid')
|
||||
retval = manager.get_pid_file_name(ensure_pids_dir=False)
|
||||
self.assertEqual(retval, '/var/path/uuid/pid')
|
||||
self.assertEqual(retval, '/var/path/uuid.pid')
|
||||
self.assertFalse(isdir.called)
|
||||
|
||||
def test_pid(self):
|
||||
|
Loading…
Reference in New Issue
Block a user