diff options
| author | Aravinda VK <avishwan@redhat.com> | 2017-11-30 12:52:30 +0530 | 
|---|---|---|
| committer | Kotresh HR <khiremat@redhat.com> | 2018-01-23 03:03:01 +0000 | 
| commit | 7c9b62cfff34d1ac4c8fa0822b18e51c15e6db81 (patch) | |
| tree | be9bab79cdb0762e644063f24f524cd2b5487308 /geo-replication/syncdaemon/syncdutils.py | |
| parent | 8efa3ee675a991410c6aa27dce40d4dd441d0935 (diff) | |
geo-rep: Support for using Volinfo from Conf file
Once Geo-replication is started, it runs Gluster commands to get Volume
info from Master and Slave. With this patch, Georep can get Volume info
from Conf file if `--use-gconf-volinfo` argument is specified to monitor
Create a config(Or add to the config if exists) with following fields
    [vars]
    master-bricks=NODEID:HOSTNAME:PATH,..
    slave-bricks=NODEID:HOSTNAME,..
    master-volume-id=
    slave-volume-id=
    master-replica-count=
    master-disperse_count=
Note: Exising Geo-replication is not affected since this is activated
only when `--use-gconf-volinfo` is passed while spawning `gsyncd
monitor`
Tiering support is not yet added since Tiering + Glusterd2 is still
under discussion.
Fixes: #396
Change-Id: I281baccbad03686c00f6488a8511dd6db0edc57a
Signed-off-by: Aravinda VK <avishwan@redhat.com>
Diffstat (limited to 'geo-replication/syncdaemon/syncdutils.py')
| -rw-r--r-- | geo-replication/syncdaemon/syncdutils.py | 88 | 
1 files changed, 88 insertions, 0 deletions
diff --git a/geo-replication/syncdaemon/syncdutils.py b/geo-replication/syncdaemon/syncdutils.py index 1f2692254db..e546f558265 100644 --- a/geo-replication/syncdaemon/syncdutils.py +++ b/geo-replication/syncdaemon/syncdutils.py @@ -18,6 +18,7 @@ import logging  import errno  import threading  import subprocess +import socket  from subprocess import PIPE  from threading import Lock, Thread as baseThread  from errno import EACCES, EAGAIN, EPIPE, ENOTCONN, ECONNABORTED @@ -871,3 +872,90 @@ class Volinfo(object):              return int(self.get('hotBricks/hotbrickCount')[0].text)          else:              return 0 + + +class VolinfoFromGconf(object): +    # Glusterd will generate following config items before Geo-rep start +    # So that Geo-rep need not run gluster commands from inside +    # Volinfo object API/interface kept as is so that caller need not +    # change anything exept calling this instead of Volinfo() +    # +    # master-bricks= +    # master-bricks=NODEID:HOSTNAME:PATH,.. +    # slave-bricks=NODEID:HOSTNAME,.. +    # master-volume-id= +    # slave-volume-id= +    # master-replica-count= +    # master-disperse_count= +    def __init__(self, vol, host='localhost', master=True): +        self.volume = vol +        self.host = host +        self.master = master + +    def is_tier(self): +        return False + +    def is_hot(self, brickpath): +        return False + +    @property +    @memoize +    def bricks(self): +        pfx = "master-" if self.master else "slave-" +        bricks_data = gconf.get(pfx + "bricks") +        if bricks_data is None: +            return [] + +        bricks_data = bricks_data.split(",") +        bricks_data = [b.strip() for b in bricks_data] +        out = [] +        for b in bricks_data: +            parts = b.split(":") +            bpath = parts[2] if len(parts) == 3 else "" +            out.append({"host": parts[1], "dir": bpath, "uuid": parts[0]}) + +        return out + +    @property +    @memoize +    def uuid(self): +        if self.master: +            return gconf.get("master-volume-id") +        else: +            return gconf.get("slave-volume-id") + +    def replica_count(self, tier, hot): +        return gconf.get("master-replica-count") + +    def disperse_count(self, tier, hot): +        return gconf.get("master-disperse-count") + +    @property +    @memoize +    def hot_bricks(self): +        return [] + +    def get_hot_bricks_count(self, tier): +        return 0 + + +def can_ssh(host, port=22): +    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +    try: +        s.connect((host, port)) +        flag = True +    except socket.error: +        flag = False + +    s.close() +    return flag + + +def get_up_nodes(hosts, port): +    # List of hosts with Hostname/IP and UUID +    up_nodes = [] +    for h in hosts: +        if can_ssh(h[0], port): +            up_nodes.append(h) + +    return up_nodes  | 
