diff options
author | Aravinda VK <avishwan@redhat.com> | 2014-01-20 12:23:35 +0530 |
---|---|---|
committer | Vijay Bellur <vbellur@redhat.com> | 2014-02-10 17:05:44 -0800 |
commit | b000b934aff4b452cf1c35c42272482a7738506e (patch) | |
tree | 71e81d8cad737b41b88f8e81ef08010d4d1178af | |
parent | fcfd2b973cdb9d798861bca1d30a4a42b819b73f (diff) |
geo-rep: Config file upgrade
When old config file is used with new geo-rep, config item like
'georep_session_working_dir' was missing in old config file.
With this patch geo-rep sets the default value for new items.
Following config options supported:
- georep_session_working_dir
- gluster_params
- ssh_command_tar
BUG: 1036539
Change-Id: I389c62e749f3b567f9ecf96d4b41367ef962c025
Signed-off-by: Aravinda VK <avishwan@redhat.com>
Reviewed-on: http://review.gluster.org/6934
Reviewed-by: Venky Shankar <vshankar@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
-rw-r--r-- | geo-replication/syncdaemon/configinterface.py | 52 | ||||
-rw-r--r-- | geo-replication/syncdaemon/gsyncd.py | 4 |
2 files changed, 55 insertions, 1 deletions
diff --git a/geo-replication/syncdaemon/configinterface.py b/geo-replication/syncdaemon/configinterface.py index 8353c1161b2..35f754c98c9 100644 --- a/geo-replication/syncdaemon/configinterface.py +++ b/geo-replication/syncdaemon/configinterface.py @@ -9,6 +9,8 @@ import os import errno import sys from stat import ST_DEV, ST_INO, ST_MTIME +import tempfile +import shutil from syncdutils import escape, unescape, norm, update_file, GsyncdError @@ -19,6 +21,56 @@ config_version = 2.0 re_type = type(re.compile('')) + +# (SECTION, OPTION, OLD VALUE, NEW VALUE) +CONFIGS = ( + ("peersrx . .", "georep_session_working_dir", "", "/var/lib/glusterd/geo-replication/${mastervol}_${remotehost}_${slavevol}/"), + ("peersrx .", "gluster_params", "aux-gfid-mount xlator-option=\*-dht.assert-no-child-down=true", "aux-gfid-mount"), + ("peersrx . .", "ssh_command_tar", "", "ssh -oPasswordAuthentication=no -oStrictHostKeyChecking=no -i /var/lib/glusterd/geo-replication/tar_ssh.pem"), +) + +def upgrade_config_file(path): + config_change = False + config = ConfigParser.RawConfigParser() + config.read(path) + + for sec, opt, oldval, newval in CONFIGS: + try: + val = config.get(sec, opt) + except ConfigParser.NoOptionError: + # if new config opt not exists + config_change = True + config.set(sec, opt, newval) + continue + except ConfigParser.Error: + """ + When gsyncd invoked at the time of create, config file + will not be their. Ignore any ConfigParser errors + """ + continue + + if val == newval: + # value is same as new val + continue + + if val == oldval: + # config value needs update + config_change = True + config.set(sec, opt, newval) + + if config_change: + tempConfigFile = tempfile.NamedTemporaryFile(mode="wb", delete=False) + with open(tempConfigFile.name, 'wb') as configFile: + config.write(configFile) + + # If src and dst are two different file system, then os.rename + # fails, In this case if temp file created in /tmp and if /tmp is + # seperate fs then os.rename gives following error, so use shutil + # OSError: [Errno 18] Invalid cross-device link + # mail.python.org/pipermail/python-list/2005-February/342893.html + shutil.move(tempConfigFile.name, path) + + class MultiDict(object): """a virtual dict-like class which functions as the union of underlying dicts""" diff --git a/geo-replication/syncdaemon/gsyncd.py b/geo-replication/syncdaemon/gsyncd.py index 64c26a5d29d..6eb62c6b076 100644 --- a/geo-replication/syncdaemon/gsyncd.py +++ b/geo-replication/syncdaemon/gsyncd.py @@ -20,7 +20,7 @@ from ipaddr import IPAddress, IPNetwork from gconf import gconf from syncdutils import FreeObject, norm, grabpidfile, finalize, log_raise_exception from syncdutils import GsyncdError, select, set_term_handler, privileged, update_file -from configinterface import GConffile +from configinterface import GConffile, upgrade_config_file import resource from monitor import monitor @@ -371,6 +371,8 @@ def main_i(): namedict['remotehost'] = x.remotehost if not 'config_file' in rconf: rconf['config_file'] = os.path.join(os.path.dirname(sys.argv[0]), "conf/gsyncd_template.conf") + + upgrade_config_file(rconf['config_file']) gcnf = GConffile(rconf['config_file'], canon_peers, defaults.__dict__, opts.__dict__, namedict) checkpoint_change = False |