Antoni Segura Puimedon has uploaded a new change for review.
Change subject: netconf_persistence: teach PersistentConfig to atomically store itself
......................................................................
netconf_persistence: teach PersistentConfig to atomically store itself
This will be used by the test code and in the future by a python
vdsm-store-net-config.
Change-Id: Ida957b6c68607743b9efa85f4263451c955b398a
Signed-off-by: Antoni S. Puimedon <asegurap(a)redhat.com>
---
M lib/vdsm/netconfpersistence.py
1 file changed, 37 insertions(+), 2 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/09/35709/1
diff --git a/lib/vdsm/netconfpersistence.py b/lib/vdsm/netconfpersistence.py
index f0aac38..80b2ab7 100644
--- a/lib/vdsm/netconfpersistence.py
+++ b/lib/vdsm/netconfpersistence.py
@@ -19,9 +19,11 @@
#
import errno
+import glob
import json
import logging
import os
+import time
from .config import config
from .tool.restore_nets import restore
@@ -33,7 +35,8 @@
# The persistent path is inside of an extra "persistence" dir in order to get
# oVirt Node to persist the symbolic links that are necessary for the
# atomic storage of running config into persistent config.
-CONF_PERSIST_DIR = constants.P_VDSM_LIB + 'persistence/netconf/'
+CONF_PERSIST_DIR = constants.P_VDSM_LIB + 'persistence/'
+CONF_PERSIST_NETCONF_DIR = CONF_PERSIST_DIR + 'netconf/'
class BaseConfig(object):
@@ -194,12 +197,44 @@
class PersistentConfig(Config):
def __init__(self):
- super(PersistentConfig, self).__init__(CONF_PERSIST_DIR)
+ super(PersistentConfig, self).__init__(CONF_PERSIST_NETCONF_DIR)
def restore(self):
restore()
return RunningConfig()
+ def store(self):
+ """Atomically stores PersistentConfig"""
+ symlink_path = os.path.dirname(CONF_PERSIST_NETCONF_DIR)
+ timestamp = _nano_timestamp()
+ new_dir = symlink_path + '.' + timestamp
+ super(PersistentConfig, self).__init__(new_dir)
+ new_symlink = symlink_path + '.link.' + timestamp
+
+ logging.debug('Persistence: persisting "%s"' % new_dir)
+ self.save()
+ os.symlink(new_dir, new_symlink)
+ logging.debug('Persistence: atomically making "%s" point to the new
'
+ 'configuration directory "%s' %
+ (CONF_PERSIST_NETCONF_DIR, new_dir))
+ os.rename(new_symlink, os.path.dirname(CONF_PERSIST_NETCONF_DIR))
+
+
+def _nano_timestamp():
+ return ('%.20f' % time.time()).replace('.', '')[:19]
+
+
+def _cleanupPersistence(keep=()):
+ """Cleans up CONF_PERSIST_DIR from netconfs not in
'keep'"""
+ for path in glob.iglob(os.path.dirname(CONF_PERSIST_NETCONF_DIR) + '.*'):
+ if path in keep:
+ continue
+ logging.debug('Persistence: removing old config "%s"' % path)
+ if os.path.islink(path) or os.path.isfile(path):
+ utils.rmFile(path)
+ else: # Directory
+ utils.rmTree(path)
+
def configuredPorts(nets, bridge):
"""Return the configured ports for the bridge"""
--
To view, visit
http://gerrit.ovirt.org/35709
To unsubscribe, visit
http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ida957b6c68607743b9efa85f4263451c955b398a
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Antoni Segura Puimedon <asegurap(a)redhat.com>