summaryrefslogtreecommitdiffstats
path: root/glustolibs-gluster/glustolibs/gluster/geo_rep_libs.py
diff options
context:
space:
mode:
Diffstat (limited to 'glustolibs-gluster/glustolibs/gluster/geo_rep_libs.py')
-rw-r--r--glustolibs-gluster/glustolibs/gluster/geo_rep_libs.py474
1 files changed, 289 insertions, 185 deletions
diff --git a/glustolibs-gluster/glustolibs/gluster/geo_rep_libs.py b/glustolibs-gluster/glustolibs/gluster/geo_rep_libs.py
index 0c15e64ac..20531b946 100644
--- a/glustolibs-gluster/glustolibs/gluster/geo_rep_libs.py
+++ b/glustolibs-gluster/glustolibs/gluster/geo_rep_libs.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2017-2018 Red Hat, Inc. <http://www.redhat.com>
+# Copyright (C) 2017-2020 Red Hat, Inc. <http://www.redhat.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -15,243 +15,347 @@
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
"""
- Description: Library for gluster geo-replication operations
+ Description: Library for gluster geo-replication operations.
"""
+from time import sleep
from glusto.core import Glusto as g
from glustolibs.gluster.gluster_init import restart_glusterd
-from glustolibs.gluster.geo_rep_ops import (create_shared_storage,
- georep_groupadd,
- georep_geoaccount,
- georep_mountbroker_setup,
- georep_mountbroker_adduser,
- georep_mountbroker_status,
- georep_geoaccount_setpasswd,
- georep_ssh_keygen,
- georep_ssh_copyid,
- georep_createpem, georep_create,
- georep_set_pemkeys,
+from glustolibs.gluster.peer_ops import is_peer_connected
+from glustolibs.gluster.geo_rep_ops import (georep_mountbroker_setup,
+ georep_mountbroker_add_user,
+ georep_create_pem,
+ georep_create,
+ georep_set_pem_keys,
georep_config_set)
+from glustolibs.gluster.shared_storage_ops import (enable_shared_storage,
+ is_shared_volume_mounted,
+ check_gluster_shared_volume)
+from glustolibs.gluster.lib_utils import (group_add, ssh_copy_id,
+ ssh_keygen, add_user, set_passwd,
+ is_group_exists, is_user_exists,
+ is_passwordless_ssh_configured)
+from glustolibs.gluster.glusterdir import get_dir_contents
+from glustolibs.gluster.volume_ops import set_volume_options
+from glustolibs.gluster.volume_libs import setup_volume
+
+
+def georep_prerequisites(mnode, snode, passwd, user="root", group=None,
+ mntbroker_dir="/var/mountbroker-root",
+ nonrootpass=None):
+ """
+ Sets up all the prerequisites for geo-rep.
-
-def georep_root_prerequisites(mnode, snode, user, passwd):
- """Takes care of the pre-requisites required for
- setting up a successful geo-rep
- session which includes:
- 1. Check if shared_storage has been successfully created
- 2. Check if shared_storage has been mounted
- 3. Generating the common pem pub file on all the nodes
- on the master
- 4. Establishing passwordless ssh connection to the slave
Args:
- mnode (str) : The primary master node where the commands are executed
- snode (str) : The primary slave node where the commande are executed
- mastervol (str) : The name of the master volume
- slavevol (str): The name of the slave volume
+ mnode(str): The primary master node where the commands are executed
+ snode(str|list): slave nodes on which setup has to be completed.
+ passwd(str): Password of the root user.
+
+ Kwargs:
+ user(str): User to be used to setup the geo-rep session.
+ (Default: root)
+ mntbroker_dir(str): Mountbroker mount directory.
+ (Default: /var/mountbroker-root)
+ group(str): Group under which geo-rep useraccount is setup.
+ (Default: None)
+ nonrootpass(str): Password of the non-root user.(Default: None)
+
Returns:
bool : True if all the steps are successful, false if there are
any failures in the middle
"""
- g.log.debug("Enable shared-storage")
- ret, _, _ = create_shared_storage(mnode)
- if not ret:
- g.log.error("Failed to create gluster shared storage on "
- "the master cluster")
+ # Converting snode to list if string.
+ if not isinstance(snode, list):
+ snode = [snode]
+
+ # Checking for blank username.
+ if not user.strip():
+ g.log.error("Blank username isn't possible.")
return False
- g.log.debug("Creating a common pem pub file on all the nodes in "
- "the master to establish passwordless ssh connection "
- "to the slave ")
- ret = georep_ssh_keygen(mnode)
- if not ret:
- g.log.error("Failed to create a common pem pub file")
+ # Checking if non-root user is given without userpassword.
+ if user != "root" and nonrootpass is None:
+ g.log.error("Non-root user specified without password.")
return False
- g.log.debug("Establishing passwordless ssh between master and slave")
- ret = georep_ssh_copyid(mnode, snode, user, passwd)
+ # Checking and enabling shared storage on master cluster.
+ ret = is_shared_volume_mounted(mnode)
if not ret:
- g.log.error("Failed to establish ssh connection")
- return False
- g.log.info("Shared storage has been created. "
- "Passwordless ssh between the master and the "
- "slave has been successful!")
- return True
+ ret = enable_shared_storage(mnode)
+ if not ret:
+ g.log.error("Failed to set cluster"
+ ".enable-shared-storage to enable.")
+ return False
+ # Check volume list to confirm gluster_shared_storage is created
+ ret = check_gluster_shared_volume(mnode)
+ if not ret:
+ g.log.error("gluster_shared_storage volume not"
+ " created even after enabling it.")
+ return False
-def georep_create_root_session(mnode, snode, mastervol, slavevol,
- user=None, force=False):
- """ Create a geo-replication session between the master and
- the slave
- Args:
- mnode (str) : The primary master node where the commands are executed
- snode (str) : The primary slave node where the commande are executed
- mastervol (str) : The name of the master volume
- slavevol (str): The name of the slave volume
- user (str): Since it's a root session, user is root or None
- force (bool) : Set to true if session needs to be created with force
- else it remains false as the default option
+ # Running prerequisites for non-root user.
+ if user != "root" and group is not None:
- Returns:
- bool : True if all the steps are successful, false if there are
- any failures in the middle
- """
- g.log.debug("Creating a common pem file on %s", mnode)
- ret, out, err = georep_createpem(mnode)
- if not ret:
- g.log.error("Failed to create a common pem file on all the nodes "
- "belonging to the cluster %s ", mnode)
- g.log.error("Error: out: %s \nerr: %s", out, err)
- return False
+ if len(snode) < 2:
+ g.log.error("A list of all slave nodes is needed for non-root"
+ " setup as every slave node will have a non-root"
+ " user.")
+ return False
- g.log.debug("Create geo-rep session from %s to %s", mnode, snode)
- ret, out, err = georep_create(mnode, mastervol, snode,
- slavevol, user, force)
- if not ret:
- g.log.error("Failed to create geo-rep session")
- g.log.error("Error: out: %s \nerr: %s", out, err)
- return False
+ # Checking and creating a group on all slave nodes.
+ if not is_group_exists(snode, group):
+ ret = group_add(snode, group)
+ if not ret:
+ g.log.error("Creating group: %s on all slave nodes failed.",
+ group)
+ return False
+
+ # Checking and creating a non-root user on all the nodes.
+ if not is_user_exists(snode, user):
+ ret = add_user(snode, user, group)
+ if not ret:
+ g.log.error("Creating user: %s in group: %s on all slave nodes"
+ " failed,", user, group)
+ return False
+
+ # Setting password for user on all the nodes.
+ ret = set_passwd(snode, user, nonrootpass)
+ if not ret:
+ g.log.error("Setting password failed on slaves")
+ return False
+
+ # Setting up mount broker on first slave node.
+ ret, _, _ = georep_mountbroker_setup(snode[0], group,
+ mntbroker_dir)
+ if ret:
+ g.log.error("Setting up of mount broker directory"
+ " failed on node: %s", snode[0])
+ return False
+
+ # Checking if ssh keys are present.
+ ret = get_dir_contents(mnode, "~/.ssh/")
+ if "id_rsa" not in ret or "id_rsa.pub" not in ret:
+ ret = ssh_keygen(mnode)
+ if not ret:
+ g.log.error("Failed to create a common pem pub file.")
+ return False
- g.log.debug("Setting up meta-volume on %s", mnode)
- ret, out, err = georep_config_set(mnode, mastervol, snode, slavevol,
- "use_meta_volume", "True")
- if not ret:
- g.log.error("Failed to set up meta-volume")
- g.log.error("Error: out: %s \nerr: %s", out, err)
- return False
+ # Setting up passwordless ssh to primary slave node.
+ if not is_passwordless_ssh_configured(mnode, snode[0], user):
+ if user != "root":
+ ret = ssh_copy_id(mnode, snode[0], nonrootpass, user)
+ else:
+ ret = ssh_copy_id(mnode, snode[0], passwd, user)
+ if not ret:
+ g.log.error("Failed to setup passwordless ssh.")
+ return False
- g.log.info("Pem file has been created and the keys have "
- "been pushed to all the slave nodes. The meta-volume "
- "has been successfully configured as well ")
+ # Checking if pem files else running gsec_create.
+ ret = get_dir_contents(mnode, "/var/lib/glusterd/geo-replication/")
+ list_of_pem_files = [
+ "common_secret.pem.pub", "secret.pem",
+ "tar_ssh.pem", "gsyncd_template.conf",
+ "secret.pem.pub", "tar_ssh.pem.pub"
+ ]
+ if ret != list_of_pem_files:
+ ret, _, _ = georep_create_pem(mnode)
+ if ret:
+ g.log.error("Failed exeucte gluster system:: execute gsec_create.")
+ return False
return True
-def georep_nonroot_prerequisites(mnode, snodes, group, user, mntbroker_dir,
- slavevol):
- """ Setup pre-requisites for mountbroker setup
+def georep_create_session(mnode, snode, mastervol, slavevol,
+ user="root", force=False, sync="rsync"):
+ """ Create a geo-replication session between the master and
+ the slave.
Args:
- mnode (str) : Master node on which cmd is to be executed
- snodes (list): List of slave nodes
- group (str): Specifies a group name
- user (str): Specifies a user name
- mntbroker_dir: Mountbroker mount directory
- slavevol (str) The name of the slave volume
- Returns:
- bool: True if all pre-requisite are successful else False
+ mnode(str): The primary master node where the commands are executed
+ snode(str|list): slave node where the commande are executed
+ mastervol(str): The name of the master volume
+ slavevol(str): The name of the slave volume
+ Kwargs:
+ user (str): User to be used to create geo-rep session.(Default: root)
+ force (bool) : Set to true if session needs to be created with force
+ else it remains false as the default option.
+ (Default: False)
+ sync (str): Sync method to be used for geo-rep session.(Default:rsync)
+ Returns:
+ bool : True if all the steps are successful, false if there are
+ any failures in the middle
"""
- g.log.debug("Enable shared-storage")
- ret, _, err = create_shared_storage(mnode)
- if ret:
- if "already exists" not in err:
- g.log.error("Failed to enable shared storage on %s", mnode)
- return False
-
- g.log.debug("Create new group: %s on all slave nodes", group)
- if not georep_groupadd(snodes, group):
- g.log.error("Creating group: %s on all slave nodes failed", group)
- return False
+ # Converting snode to list if string.
+ if not isinstance(snode, list):
+ snode = [snode]
- g.log.debug("Create user: %s in group: %s on all slave nodes", user, group)
- if not georep_geoaccount(snodes, group, user):
- g.log.error("Creating user: %s in group: %s on all slave nodes "
- "failed", user, group)
+ # Checking for blank username.
+ if not user.strip():
+ g.log.error("Blank username isn't possible.")
return False
- g.log.debug("Setting up mount broker root directory: %s node: %s",
- mntbroker_dir, snodes[0])
- ret, _, _ = georep_mountbroker_setup(snodes[0], group, mntbroker_dir)
- if ret:
- g.log.error("Setting up of mount broker directory failed: %s node: %s",
- mntbroker_dir, snodes[0])
+ if sync not in ["rsync", "tarssh"]:
+ g.log.error("Invalid sync method used. "
+ "%s is not a valid sync method.", sync)
return False
- g.log.debug("Add volume: %s and user: %s to mountbroker service",
- slavevol, user)
- ret, _, _ = georep_mountbroker_adduser(snodes[0], slavevol, user)
- if ret:
- g.log.error("Add volume: %s and user: %s to mountbroker "
- "service failed", slavevol, user)
- return False
+ # Setting up root geo-rep session.
+ if user == "root":
+ g.log.debug("Creating root geo-rep session.")
+ ret, _, _ = georep_create(mnode, mastervol, snode[0],
+ slavevol, user, force)
+ if ret:
+ g.log.error("Failed to create geo-rep session")
+ return False
- g.log.debug("Checking mountbroker status")
- ret, out, _ = georep_mountbroker_status(snodes[0])
- if not ret:
- if "not ok" in out:
- g.log.error("Mountbroker status not ok")
+ g.log.debug("Enabling meta-volume for master volume.")
+ ret, _, _ = georep_config_set(mnode, mastervol, snode[0],
+ slavevol, "use_meta_volume", "True")
+ if ret:
+ g.log.error("Failed to set up meta-volume for root "
+ "geo-rep session from %s to %s",
+ (mastervol, slavevol))
return False
+
+ # Setting up sync method if not rsync.
+ g.log.debug("Enabling tarssh for master volume.")
+ if sync == "tarssh":
+ ret, _, _ = georep_config_set(mnode, mastervol, snode[0],
+ slavevol, "sync_method", "tarssh")
+ if ret:
+ g.log.error("Failed to set sync method to tarssh for root "
+ "geo-rep session from %s to %s",
+ (mastervol, slavevol))
+ return False
+ return True
+
+ # Setting up non-root geo-rep session.
else:
- g.log.error("Mountbroker status command failed")
- return False
+ # Glusterd has to be restarted on all the slave nodes.
+ if len(snode) < 2:
+ g.log.error("A list of all slave nodes is needed for non-root"
+ " session to restart glusterd on all slaves after"
+ " adding it to mountbroker.")
+ return False
- g.log.debug("Restart glusterd on all slave nodes")
- if not restart_glusterd(snodes):
- g.log.error("Restarting glusterd failed")
- return False
+ # Adding volume to mountbroker.
+ g.log.debug("Creating a non-root geo-rep session.")
+ ret, _, _ = georep_mountbroker_add_user(snode[0], slavevol, user)
+ if ret:
+ g.log.error("Failed to setup mountbroker.")
+ return False
- g.log.debug("Set passwd for user account on slave")
- if not georep_geoaccount_setpasswd(snodes, group, user, "geopasswd"):
- g.log.error("Setting password failed on slaves")
- return False
+ # Restarting glusterd on all nodes.
+ ret = restart_glusterd(snode)
+ if not ret:
+ g.log.error("Restarting glusterd failed.")
+ return False
- g.log.debug("Setup passwordless SSH between %s and %s", mnode, snodes[0])
- if not georep_ssh_keygen(mnode):
- g.log.error("ssh keygen is failed on %s", mnode)
- return False
+ # Checking if peers are in connected state or not.
+ ret = is_peer_connected(snode[0], snode)
+ if not ret:
- if not georep_ssh_copyid(mnode, snodes[0], user, "geopasswd"):
- g.log.error("ssh copy-id is failed from %s to %s", mnode, snodes[0])
- return False
+ counter = 20
+ while counter > 0:
- return True
+ ret = is_peer_connected(snode[0], snode)
+ if ret:
+ break
+ sleep(3)
+ counter += 1
+ # Creating a geo-rep session.
+ ret, _, _ = georep_create(mnode, mastervol, snode[0], slavevol,
+ user, force)
+ if ret:
+ g.log.error("Failed to create geo-rep session.")
+ return False
-def georep_create_nonroot_session(mnode, mastervol, snode, slavevol, user,
- force=False):
- """ Create mountbroker/non-root geo-rep session
+ # Setting up pem keys between master and slave node.
+ g.log.debug("Copy geo-rep pem keys onto all slave nodes.")
+ ret, _, _ = georep_set_pem_keys(snode[0], user, mastervol, slavevol)
+ if ret:
+ g.log.error("Failed to copy geo-rep pem keys onto all slave nodes")
+ return False
- Args:
- mnode (str) : Master node for session creation
- mastervol (str) The name of the master volume
- snode (str): Slave node for session creation
- slavevol (str) The name of the slave volume
- user (str): Specifies a user name
- Returns:
- bool: True if geo-rep session is created successfully
- Else False
+ # Setting use_meta_volume to true.
+ g.log.debug("Setting use_meta_volume to true.")
+ ret, _, _ = georep_config_set(mnode, mastervol, snode[0], slavevol,
+ "use_meta_volume", "true", user)
+ if ret:
+ g.log.error("Failed to set up meta-volume for %s "
+ "geo-rep session from %s to %s.",
+ (user, mastervol, slavevol))
+ return False
- """
+ # Setting up sync method if not rsync.
+ g.log.debug("Setting sync method to tarssh.")
+ if sync == "tarssh":
+ ret, _, _ = georep_config_set(mnode, mastervol, snode[0],
+ slavevol, "sync_method", "tarssh",
+ user)
+ if ret:
+ g.log.error("Failed to set sync method to tarssh for %s "
+ "geo-rep session from %s to %s",
+ (user, mastervol, slavevol))
+ return False
+ return True
+
+
+def setup_master_and_slave_volumes(mnode, all_servers_info,
+ master_volume_config,
+ snode, all_slaves_info,
+ slave_volume_config,
+ force=False):
+ """Create master and slave volumes for geo-replication.
- g.log.debug("Create geo-rep pem keys")
- ret, out, err = georep_createpem(mnode)
- if ret:
- g.log.error("Failed to create pem keys")
- g.log.error("Error: out: %s \nerr: %s", out, err)
- return False
+ Args:
+ mnode(str): The primary master node where the commands are executed.
+ all_servers_info(dict): Information about all master servers.
+ master_volume_config(dict): Dict containing volume information
+ of master.
+ snode(str): slave node where the commande are executed.
+ all_slaves_info(dict): Information about all slave servers.
+ slave_volume_config(dict): Dict containing volume information
+ of slave.
+ kwargs:
+ force(bool): If set to true then will create volumes
+ with force option.
- g.log.debug("Create geo-rep session")
- ret, out, err = georep_create(mnode, mastervol, snode, slavevol,
- user, force)
- if ret:
- g.log.error("Failed to create geo-rep session")
- g.log.error("Error: out: %s \nerr: %s", out, err)
+ Returns:
+ bool : True if volumes created successfully, false if there are
+ any failures in the middle.
+
+ Example:
+ setup_master_and_slave_volumes(
+ cls.mode, cls.all_servers_info, cls.master_volume,
+ cls.snode, cls.all_slaves_info, cls.slave_volume)
+ >>> True
+ """
+ # Setting up the master and the slave volume.
+ ret = setup_volume(mnode, all_servers_info, master_volume_config,
+ force)
+ if not ret:
+ g.log.error("Failed to Setup master volume %s",
+ master_volume_config['name'])
return False
- g.log.debug("Copy geo-rep pem keys onto all slave nodes")
- ret, out, err = georep_set_pemkeys(snode, user, mastervol, slavevol)
- if ret:
- g.log.error("Failed to copy geo-rep pem keys onto all slave nodes")
- g.log.error("Error: out:%s \nerr:%s", out, err)
+ ret = setup_volume(snode, all_slaves_info, slave_volume_config,
+ force)
+ if not ret:
+ g.log.error("Failed to Setup slave volume %s",
+ slave_volume_config['name'])
return False
- g.log.debug("Enable meta-volume")
- ret, out, err = georep_config_set(mnode, mastervol, snode, slavevol,
- "use_meta_volume", "true")
- if ret:
- g.log.error("Failed to set meta-volume")
- g.log.error("Error: out: %s \nerr: %s", out, err)
+ # Setting performance.quick-read to off.
+ ret = set_volume_options(snode, slave_volume_config['name'],
+ {"performance.quick-read": "off"})
+ if not ret:
+ g.log.error("Failed to performance.quick-read to off on "
+ "slave volume %s", slave_volume_config['name'])
return False
-
return True