summaryrefslogtreecommitdiffstats
path: root/openshift-storage-libs/openshiftstoragelibs/heketi_ops.py
diff options
context:
space:
mode:
Diffstat (limited to 'openshift-storage-libs/openshiftstoragelibs/heketi_ops.py')
-rw-r--r--openshift-storage-libs/openshiftstoragelibs/heketi_ops.py1516
1 files changed, 1516 insertions, 0 deletions
diff --git a/openshift-storage-libs/openshiftstoragelibs/heketi_ops.py b/openshift-storage-libs/openshiftstoragelibs/heketi_ops.py
new file mode 100644
index 00000000..02fefe66
--- /dev/null
+++ b/openshift-storage-libs/openshiftstoragelibs/heketi_ops.py
@@ -0,0 +1,1516 @@
+import json
+
+from glusto.core import Glusto as g
+
+from openshiftstoragelibs import exceptions
+from openshiftstoragelibs import heketi_version
+from openshiftstoragelibs.utils import parse_prometheus_data
+
+
+def _set_heketi_global_flags(heketi_server_url, **kwargs):
+ """Helper function to set heketi-cli global flags."""
+
+ heketi_server_url = (heketi_server_url if heketi_server_url else ("http:" +
+ "//heketi-storage-project.cloudapps.mystorage.com"))
+ json = kwargs.get("json")
+ secret = kwargs.get("secret")
+ user = kwargs.get("user")
+ json_arg = "--json" if json else ""
+ secret_arg = "--secret %s" % secret if secret else ""
+ user_arg = "--user %s" % user if user else ""
+ if not user_arg:
+ openshift_config = g.config.get("cns", g.config.get("openshift"))
+ heketi_cli_user = openshift_config['heketi_config']['heketi_cli_user']
+ if heketi_cli_user:
+ user_arg = "--user %s" % heketi_cli_user
+ heketi_cli_key = openshift_config[
+ 'heketi_config']['heketi_cli_key']
+ if heketi_cli_key is not None:
+ secret_arg = "--secret '%s'" % heketi_cli_key
+
+ return (heketi_server_url, json_arg, secret_arg, user_arg)
+
+
+def heketi_volume_create(heketi_client_node, heketi_server_url, size,
+ raw_cli_output=False, **kwargs):
+ """Creates heketi volume with the given user options.
+
+ Args:
+ heketi_client_node (str): Node on which cmd has to be executed.
+ heketi_server_url (str): Heketi server url
+ size (str): Volume size
+
+ Kwargs:
+ The keys, values in kwargs are:
+ - block : (bool)
+ - clusters : (str)|None
+ - disperse_data : (int)|None
+ - durability : (str)|None
+ - gid : (int)|None
+ - gluster_volume_options : (str)|None
+ - name : (str)|None
+ - persistent_volume : (bool)
+ - persistent_volume_endpoint : (str)|None
+ - persistent_volume_file : (str)|None
+ - redundancy : (int):None
+ - replica : (int)|None
+ - size : (int):None
+ - snapshot-factor : (float)|None
+ - json : (bool)
+ - secret : (str)|None
+ - user : (str)|None
+
+ Returns:
+ dict: volume create info on success, only cli option is specified
+ without --json option, then it returns raw string output.
+ Tuple (ret, out, err): if raw_cli_output is True.
+ Raises:
+ exceptions.ExecutionError when error occurs and raw_cli_output is False
+
+ Example:
+ heketi_volume_create(heketi_client_node, heketi_server_url, size)
+ """
+
+ if not kwargs.get('user'):
+ openshift_config = g.config.get("cns", g.config.get("openshift"))
+ heketi_cli_user = openshift_config['heketi_config']['heketi_cli_user']
+ if heketi_cli_user:
+ kwargs['user'] = heketi_cli_user
+ heketi_cli_key = openshift_config[
+ 'heketi_config']['heketi_cli_key']
+ if heketi_cli_key is not None:
+ kwargs['secret'] = heketi_cli_key
+
+ heketi_server_url = (heketi_server_url if heketi_server_url else ("http:" +
+ "//heketi-storage-project.cloudapps.mystorage.com"))
+
+ block_arg = "--block" if kwargs.get("block") else ""
+ clusters_arg = ("--clusters %s" % kwargs.get("clusters")
+ if kwargs.get("clusters") else "")
+ disperse_data_arg = ("--disperse-data %d" % kwargs.get("disperse_data")
+ if kwargs.get("disperse_data") else "")
+ durability_arg = ("--durability %s" % kwargs.get("durability")
+ if kwargs.get("durability") else "")
+ gid_arg = "--gid %d" % int(kwargs.get("gid")) if kwargs.get("gid") else ""
+ gluster_volume_options_arg = ("--gluster-volume-options '%s'"
+ % kwargs.get("gluster_volume_options")
+ if kwargs.get("gluster_volume_options")
+ else "")
+ name_arg = "--name %s" % kwargs.get("name") if kwargs.get("name") else ""
+ persistent_volume_arg = ("--persistent-volume %s"
+ % kwargs.get("persistent_volume")
+ if kwargs.get("persistent_volume") else "")
+ persistent_volume_endpoint_arg = ("--persistent-volume-endpoint %s"
+ % (kwargs.get(
+ "persistent_volume_endpoint"))
+ if (kwargs.get(
+ "persistent_volume_endpoint"))
+ else "")
+ persistent_volume_file_arg = ("--persistent-volume-file %s"
+ % kwargs.get("persistent_volume_file")
+ if kwargs.get("persistent_volume_file")
+ else "")
+ redundancy_arg = ("--redundancy %d" % int(kwargs.get("redundancy"))
+ if kwargs.get("redundancy") else "")
+ replica_arg = ("--replica %d" % int(kwargs.get("replica"))
+ if kwargs.get("replica") else "")
+ snapshot_factor_arg = ("--snapshot-factor %f"
+ % float(kwargs.get("snapshot_factor"))
+ if kwargs.get("snapshot_factor") else "")
+ json_arg = "--json" if kwargs.get("json") else ""
+ secret_arg = (
+ "--secret %s" % kwargs.get("secret") if kwargs.get("secret") else "")
+ user_arg = "--user %s" % kwargs.get("user") if kwargs.get("user") else ""
+
+ err_msg = "Failed to create volume. "
+
+ cmd = ("heketi-cli -s %s volume create --size=%s %s %s %s %s %s %s "
+ "%s %s %s %s %s %s %s %s %s %s" % (
+ heketi_server_url, str(size), block_arg, clusters_arg,
+ disperse_data_arg, durability_arg, gid_arg,
+ gluster_volume_options_arg, name_arg,
+ persistent_volume_arg, persistent_volume_endpoint_arg,
+ persistent_volume_file_arg, redundancy_arg, replica_arg,
+ snapshot_factor_arg, json_arg, secret_arg, user_arg))
+ ret, out, err = g.run(heketi_client_node, cmd)
+
+ if raw_cli_output:
+ return ret, out, err
+ if ret != 0:
+ err_msg += "Out: %s \n Err: %s" % (out, err)
+ g.log.error(err_msg)
+ raise exceptions.ExecutionError(err_msg)
+ if json_arg:
+ return json.loads(out)
+ return out
+
+
+def heketi_volume_info(heketi_client_node, heketi_server_url, volume_id,
+ raw_cli_output=False, **kwargs):
+ """Executes heketi volume info command.
+
+ Args:
+ heketi_client_node (str): Node on which cmd has to be executed.
+ heketi_server_url (str): Heketi server url
+ volume_id (str): Volume ID
+
+ Kwargs:
+ The keys, values in kwargs are:
+ - json : (bool)
+ - secret : (str)|None
+ - user : (str)|None
+
+ Returns:
+ dict: volume info on success
+ False: in case of failure
+ Tuple (ret, out, err): if raw_cli_output is True
+
+ Raises:
+ exceptions.ExecutionError: if command fails.
+
+ Example:
+ heketi_volume_info(heketi_client_node, volume_id)
+ """
+
+ heketi_server_url, json_arg, admin_key, user = _set_heketi_global_flags(
+ heketi_server_url, **kwargs)
+
+ cmd = "heketi-cli -s %s volume info %s %s %s %s" % (
+ heketi_server_url, volume_id, json_arg, admin_key, user)
+ ret, out, err = g.run(heketi_client_node, cmd)
+
+ if raw_cli_output:
+ return ret, out, err
+ if ret != 0:
+ msg = (
+ "Failed to execute '%s' command on '%s' node with following "
+ "error: %s" % (cmd, heketi_client_node, err))
+ g.log.error(msg)
+ raise exceptions.ExecutionError(msg)
+
+ if json_arg:
+ return json.loads(out)
+ return out
+
+
+def heketi_volume_expand(heketi_client_node, heketi_server_url, volume_id,
+ expand_size, raw_cli_output=False, **kwargs):
+ """Executes heketi volume expand command.
+
+ Args:
+ heketi_client_node (str): Node on which cmd has to be executed.
+ heketi_server_url (str): Heketi server url
+ volume_id (str): Volume ID
+ expand_size (str): volume expand size
+
+ Kwargs:
+ The keys, values in kwargs are:
+ - json : (bool)
+ - secret : (str)|None
+ - user : (str)|None
+
+ Returns:
+ dict: volume expand info on success, only cli option is specified
+ without --json option, then it returns raw string output.
+ Tuple (ret, out, err): if raw_cli_output is True
+
+ Raises:
+ exceptions.ExecutionError: if command fails.
+
+ Example:
+ heketi_volume_expand(heketi_client_node, heketi_server_url, volume_id,
+ expand_size)
+ """
+
+ heketi_server_url, json_arg, admin_key, user = _set_heketi_global_flags(
+ heketi_server_url, **kwargs)
+
+ cmd = ("heketi-cli -s %s volume expand --volume=%s "
+ "--expand-size=%s %s %s %s" % (
+ heketi_server_url, volume_id, expand_size, json_arg,
+ admin_key, user))
+ ret, out, err = g.run(heketi_client_node, cmd)
+
+ if raw_cli_output:
+ return ret, out, err
+
+ if ret != 0:
+ msg = (
+ "Failed to execute '%s' command on '%s' node with following "
+ "error: %s" % (cmd, heketi_client_node, err))
+ g.log.error(msg)
+ raise exceptions.ExecutionError(msg)
+ if json_arg:
+ return json.loads(out)
+ return out
+
+
+def heketi_volume_delete(heketi_client_node, heketi_server_url, volume_id,
+ raw_cli_output=False, raise_on_error=True, **kwargs):
+ """Executes heketi volume delete command.
+
+ Args:
+ heketi_client_node (str): Node on which cmd has to be executed.
+ heketi_server_url (str): Heketi server url
+ volume_id (str): Volume ID
+ raise_on_error (bool): whether or not to raise exception
+ in case of an error.
+
+ Kwargs:
+ The keys, values in kwargs are:
+ - json : (bool)
+ - secret : (str)|None
+ - user : (str)|None
+
+ Returns:
+ str: volume delete command output on success
+ Tuple (ret, out, err): if raw_cli_output is True
+
+ Raises:
+ exceptions.ExecutionError when error occurs and raw_cli_output is False
+
+ Example:
+ heketi_volume_delete(heketi_client_node, heketi_server_url, volume_id)
+ """
+
+ heketi_server_url, json_arg, admin_key, user = _set_heketi_global_flags(
+ heketi_server_url, **kwargs)
+ err_msg = "Failed to delete '%s' volume. " % volume_id
+
+ cmd = "heketi-cli -s %s volume delete %s %s %s %s" % (
+ heketi_server_url, volume_id, json_arg, admin_key, user)
+ ret, out, err = g.run(heketi_client_node, cmd)
+
+ if raw_cli_output:
+ return ret, out, err
+ if ret != 0:
+ err_msg += "Out: %s, \nErr: %s" % (out, err)
+ g.log.error(err_msg)
+ if raise_on_error:
+ raise exceptions.ExecutionError(err_msg)
+ return out
+
+
+def heketi_volume_list(heketi_client_node, heketi_server_url,
+ raw_cli_output=False, **kwargs):
+ """Executes heketi volume list command.
+
+ Args:
+ heketi_client_node (str): Node on which cmd has to be executed.
+ heketi_server_url (str): Heketi server url
+
+ Kwargs:
+ The keys, values in kwargs are:
+ - json : (bool)
+ - secret : (str)|None
+ - user : (str)|None
+
+ Returns:
+ dict: volume list with --json on success, if cli option is specified
+ without --json option or with url, it returns raw string output.
+ Tuple (ret, out, err): if raw_cli_output is True
+
+ Raises:
+ exceptions.ExecutionError: if command fails.
+
+ Example:
+ heketi_volume_info(heketi_client_node, heketi_server_url)
+ """
+
+ heketi_server_url, json_arg, admin_key, user = _set_heketi_global_flags(
+ heketi_server_url, **kwargs)
+
+ cmd = "heketi-cli -s %s volume list %s %s %s" % (
+ heketi_server_url, json_arg, admin_key, user)
+ ret, out, err = g.run(heketi_client_node, cmd)
+
+ if raw_cli_output:
+ return ret, out, err
+ if ret != 0:
+ msg = (
+ "Failed to execute '%s' command on '%s' node with following "
+ "error: %s" % (cmd, heketi_client_node, err))
+ g.log.error(msg)
+ raise exceptions.ExecutionError(msg)
+ if json_arg:
+ return json.loads(out)
+ return out
+
+
+def heketi_topology_info(heketi_client_node, heketi_server_url,
+ raw_cli_output=False, **kwargs):
+ """Executes heketi topology info command.
+
+ Args:
+ heketi_client_node (str): Node on which cmd has to be executed.
+ heketi_server_url (str): Heketi server url
+
+ Kwargs:
+ The keys, values in kwargs are:
+ - json : (bool)
+ - secret : (str)|None
+ - user : (str)|None
+
+ Returns:
+ dict: topology info if --json option is specified. If only cli option
+ is specified, raw command output is returned on success.
+ Tuple (ret, out, err): if raw_cli_output is True
+
+ Raises:
+ exceptions.ExecutionError: if command fails.
+
+ Example:
+ heketi_topology_info(heketi_client_node, heketi_server_url)
+ """
+
+ heketi_server_url, json_arg, admin_key, user = _set_heketi_global_flags(
+ heketi_server_url, **kwargs)
+
+ cmd = "heketi-cli -s %s topology info %s %s %s" % (
+ heketi_server_url, json_arg, admin_key, user)
+ ret, out, err = g.run(heketi_client_node, cmd)
+
+ if raw_cli_output:
+ return ret, out, err
+ if ret != 0:
+ msg = (
+ "Failed to execute '%s' command on '%s' node with following "
+ "error: %s" % (cmd, heketi_client_node, err))
+ g.log.error(msg)
+ raise exceptions.ExecutionError(msg)
+ if json_arg:
+ return json.loads(out)
+ return out
+
+
+def hello_heketi(heketi_client_node, heketi_server_url, **kwargs):
+ """Executes curl command to check if heketi server is alive.
+
+ Args:
+ heketi_client_node (str): Node on which cmd has to be executed.
+ heketi_server_url (str): Heketi server url
+
+ Kwargs:
+ The keys, values in kwargs are:
+ - secret : (str)|None
+ - user : (str)|None
+
+ Returns:
+ bool: True, if heketi server is alive
+
+ Raises:
+ exceptions.ExecutionError: if command fails.
+
+ Example:
+ hello_heketi(heketi_client_node, heketi_server_url)
+ """
+
+ heketi_server_url, json_arg, admin_key, user = _set_heketi_global_flags(
+ heketi_server_url, **kwargs)
+
+ cmd = "curl --max-time 10 %s/hello" % heketi_server_url
+ ret, out, err = g.run(heketi_client_node, cmd)
+
+ if ret != 0:
+ msg = (
+ "Failed to execute '%s' command on '%s' node with following "
+ "error: %s" % (cmd, heketi_client_node, err))
+ g.log.error(msg)
+ raise exceptions.ExecutionError(msg)
+ return True
+
+
+def heketi_cluster_delete(heketi_client_node, heketi_server_url, cluster_id,
+ **kwargs):
+ """Executes heketi cluster delete command.
+
+ Args:
+ heketi_client_node (str): Node on which cmd has to be executed.
+ heketi_server_url (str): Heketi server url
+ cluster_id (str): Cluster ID
+
+ Kwargs:
+ The keys, values in kwargs are:
+ - json : (bool)
+ - secret : (str)|None
+ - user : (str)|None
+
+ Returns:
+ str: cluster delete command output on success
+
+ Raises:
+ exceptions.ExecutionError: if command fails.
+
+ Example:
+ heketi_cluster_delete(heketi_client_node, heketi_server_url,
+ cluster_id)
+ """
+
+ heketi_server_url, json_arg, admin_key, user = _set_heketi_global_flags(
+ heketi_server_url, **kwargs)
+
+ cmd = "heketi-cli -s %s cluster delete %s %s %s %s" % (
+ heketi_server_url, cluster_id, json_arg, admin_key, user)
+ ret, out, err = g.run(heketi_client_node, cmd)
+
+ if ret != 0:
+ msg = (
+ "Failed to execute '%s' command on '%s' node with following "
+ "error: %s" % (cmd, heketi_client_node, err))
+ g.log.error(msg)
+ raise exceptions.ExecutionError(msg)
+ return out
+
+
+def heketi_cluster_info(heketi_client_node, heketi_server_url, cluster_id,
+ **kwargs):
+ """Executes heketi cluster info command.
+
+ Args:
+ heketi_client_node (str): Node on which cmd has to be executed.
+ heketi_server_url (str): Heketi server url
+ cluster_id (str): Volume ID
+
+ Kwargs:
+ The keys, values in kwargs are:
+ - json : (bool)
+ - secret : (str)|None
+ - user : (str)|None
+
+ Returns:
+ dict: cluster info on success
+ False: in case of failure
+
+ Raises:
+ exceptions.ExecutionError: if command fails.
+
+ Example:
+ heketi_cluster_info(heketi_client_node, volume_id)
+ """
+
+ heketi_server_url, json_arg, admin_key, user = _set_heketi_global_flags(
+ heketi_server_url, **kwargs)
+
+ cmd = "heketi-cli -s %s cluster info %s %s %s %s" % (
+ heketi_server_url, cluster_id, json_arg, admin_key, user)
+ ret, out, err = g.run(heketi_client_node, cmd)
+
+ if ret != 0:
+ msg = (
+ "Failed to execute '%s' command on '%s' node with following "
+ "error: %s" % (cmd, heketi_client_node, err))
+ g.log.error(msg)
+ raise exceptions.ExecutionError(msg)
+ if json_arg:
+ return json.loads(out)
+ return out
+
+
+def heketi_cluster_list(heketi_client_node, heketi_server_url, **kwargs):
+ """Executes heketi cluster list command.
+
+ Args:
+ heketi_client_node (str): Node on which cmd has to be executed.
+ heketi_server_url (str): Heketi server url
+
+ Kwargs:
+ The keys, values in kwargs are:
+ - json : (bool)
+ - secret : (str)|None
+ - user : (str)|None
+
+ Returns:
+ dict: cluster list with --json on success, if cli option is specified
+ without --json option or with url, it returns raw string output.
+
+ Raises:
+ exceptions.ExecutionError: if command fails.
+
+ Example:
+ heketi_cluster_info(heketi_client_node, heketi_server_url)
+ """
+
+ heketi_server_url, json_arg, admin_key, user = _set_heketi_global_flags(
+ heketi_server_url, **kwargs)
+
+ cmd = "heketi-cli -s %s cluster list %s %s %s" % (
+ heketi_server_url, json_arg, admin_key, user)
+ ret, out, err = g.run(heketi_client_node, cmd)
+
+ if ret != 0:
+ msg = (
+ "Failed to execute '%s' command on '%s' node with following "
+ "error: %s" % (cmd, heketi_client_node, err))
+ g.log.error(msg)
+ raise exceptions.ExecutionError(msg)
+ if json_arg:
+ return json.loads(out)
+ return out
+
+
+def heketi_device_add(heketi_client_node, heketi_server_url, device_name,
+ node_id, raw_cli_output=False, **kwargs):
+ """Executes heketi device add command.
+
+ Args:
+ heketi_client_node (str): Node on which cmd has to be executed.
+ heketi_server_url (str): Heketi server url
+ device name (str): Device name to add
+ node_id (str): Node id to add the device
+
+ Kwargs:
+ The keys, values in kwargs are:
+ - json : (bool)
+ - secret : (str)|None
+ - user : (str)|None
+
+ Returns:
+ str: heketi device add command output on success.
+ Tuple (ret, out, err): if raw_cli_output is True
+
+ Raises:
+ exceptions.ExecutionError: if command fails.
+
+ Example:
+ heketi_device_add(heketi_client_node, heketi_server_url, device_name,
+ node_id)
+ """
+
+ heketi_server_url, json_arg, admin_key, user = _set_heketi_global_flags(
+ heketi_server_url, **kwargs)
+
+ cmd = "heketi-cli -s %s device add --name=%s --node=%s %s %s %s" % (
+ heketi_server_url, device_name, node_id, json_arg, admin_key, user)
+ ret, out, err = g.run(heketi_client_node, cmd)
+
+ if raw_cli_output:
+ return ret, out, err
+ if ret != 0:
+ msg = (
+ "Failed to execute '%s' command on '%s' node with following "
+ "error: %s" % (cmd, heketi_client_node, err))
+ g.log.error(msg)
+ raise exceptions.ExecutionError(msg)
+ return out
+
+
+def heketi_device_delete(heketi_client_node, heketi_server_url, device_id,
+ raw_cli_output=False, **kwargs):
+ """Executes heketi device delete command.
+
+ Args:
+ heketi_client_node (str): Node on which cmd has to be executed.
+ heketi_server_url (str): Heketi server url
+ device id (str): Device id to delete
+
+ Kwargs:
+ The keys, values in kwargs are:
+ - json : (bool)
+ - secret : (str)|None
+ - user : (str)|None
+
+ Returns:
+ str: heketi device delete command output on success.
+ Tuple (ret, out, err): if raw_cli_output is True
+
+ Raises:
+ exceptions.ExecutionError: if command fails.
+
+ Example:
+ heketi_device_delete(heketi_client_node, heketi_server_url, device_id)
+ """
+
+ heketi_server_url, json_arg, admin_key, user = _set_heketi_global_flags(
+ heketi_server_url, **kwargs)
+
+ cmd = "heketi-cli -s %s device delete %s %s %s %s" % (
+ heketi_server_url, device_id, json_arg, admin_key, user)
+ ret, out, err = g.run(heketi_client_node, cmd)
+
+ if raw_cli_output:
+ return ret, out, err
+ if ret != 0:
+ msg = (
+ "Failed to execute '%s' command on '%s' node with following "
+ "error: %s" % (cmd, heketi_client_node, err))
+ g.log.error(msg)
+ raise exceptions.ExecutionError(msg)
+ return out
+
+
+def heketi_device_disable(heketi_client_node, heketi_server_url, device_id,
+ raw_cli_output=False, **kwargs):
+ """Executes heketi device disable command.
+
+ Args:
+ heketi_client_node (str): Node on which cmd has to be executed.
+ heketi_server_url (str): Heketi server url
+ device_id (str): Device id to disable device
+
+ Kwargs:
+ The keys, values in kwargs are:
+ - json : (bool)
+ - secret : (str)|None
+ - user : (str)|None
+
+ Returns:
+ str: heketi device disable command output on success.
+ Tuple (ret, out, err): if raw_cli_output is True
+
+ Raises:
+ exceptions.ExecutionError: if command fails.
+
+ Example:
+ heketi_device_disable(heketi_client_node, heketi_server_url, device_id)
+ """
+
+ heketi_server_url, json_arg, admin_key, user = _set_heketi_global_flags(
+ heketi_server_url, **kwargs)
+ cmd = "heketi-cli -s %s device disable %s %s %s %s" % (
+ heketi_server_url, device_id, json_arg, admin_key, user)
+
+ ret, out, err = g.run(heketi_client_node, cmd)
+
+ if raw_cli_output:
+ return ret, out, err
+ if ret != 0:
+ msg = (
+ "Failed to execute '%s' command on '%s' node with following "
+ "error: %s" % (cmd, heketi_client_node, err))
+ g.log.error(msg)
+ raise exceptions.ExecutionError(msg)
+ return out
+
+
+def heketi_device_enable(heketi_client_node, heketi_server_url, device_id,
+ raw_cli_output=False, **kwargs):
+ """Executes heketi device enable command.
+
+ Args:
+ heketi_client_node (str): Node on which cmd has to be executed.
+ heketi_server_url (str): Heketi server url
+ device_id (str): Device id to enable device
+
+ Kwargs:
+ The keys, values in kwargs are:
+ - json : (bool)
+ - secret : (str)|None
+ - user : (str)|None
+
+ Returns:
+ str: heketi device enable command output on success.
+ Tuple (ret, out, err): if raw_cli_output is True
+
+ Raises:
+ exceptions.ExecutionError: if command fails.
+
+ Example:
+ heketi_device_enable(heketi_client_node, heketi_server_url, device_id)
+ """
+
+ heketi_server_url, json_arg, admin_key, user = _set_heketi_global_flags(
+ heketi_server_url, **kwargs)
+ cmd = "heketi-cli -s %s device enable %s %s %s %s" % (
+ heketi_server_url, device_id, json_arg, admin_key, user)
+
+ ret, out, err = g.run(heketi_client_node, cmd)
+
+ if raw_cli_output:
+ return ret, out, err
+ if ret != 0:
+ msg = (
+ "Failed to execute '%s' command on '%s' node with following "
+ "error: %s" % (cmd, heketi_client_node, err))
+ g.log.error(msg)
+ raise exceptions.ExecutionError(msg)
+ return out
+
+
+def heketi_device_info(heketi_client_node, heketi_server_url, device_id,
+ raw_cli_output=False, **kwargs):
+ """Executes heketi device info command.
+
+ Args:
+ heketi_client_node (str): Node on which cmd has to be executed.
+ heketi_server_url (str): Heketi server url
+ device_id (str): Device ID
+
+ Kwargs:
+ The keys, values in kwargs are:
+ - json : (bool)
+ - secret : (str)|None
+ - user : (str)|None
+
+ Returns:
+ Str: device info as raw CLI output if "json" arg is not provided.
+ Dict: device info parsed to dict if "json" arg is provided.
+ Tuple (ret, out, err): if raw_cli_output is True
+
+ Raises:
+ exceptions.ExecutionError: if command fails.
+
+ Example:
+ heketi_device_info(heketi_client_node, heketi_server_url, device_id)
+ """
+
+ heketi_server_url, json_arg, admin_key, user = _set_heketi_global_flags(
+ heketi_server_url, **kwargs)
+
+ cmd = "heketi-cli -s %s device info %s %s %s %s" % (
+ heketi_server_url, device_id, json_arg, admin_key, user)
+ ret, out, err = g.run(heketi_client_node, cmd)
+
+ if raw_cli_output:
+ return ret, out, err
+ if ret != 0:
+ msg = (
+ "Failed to execute '%s' command on '%s' node with following "
+ "error: %s" % (cmd, heketi_client_node, err))
+ g.log.error(msg)
+ raise exceptions.ExecutionError(msg)
+
+ if json_arg:
+ device_info = json.loads(out)
+ return device_info
+ else:
+ return out
+
+
+def heketi_device_remove(heketi_client_node, heketi_server_url, device_id,
+ raw_cli_output=False, **kwargs):
+ """Executes heketi device remove command.
+
+ Args:
+ heketi_client_node (str): Node on which cmd has to be executed.
+ heketi_server_url (str): Heketi server url
+ device_id (str): Device id to remove device
+
+ Kwargs:
+ The keys, values in kwargs are:
+ - json : (bool)
+ - secret : (str)|None
+ - user : (str)|None
+
+ Returns:
+ str: heketi device remove command output on success.
+ Tuple (ret, out, err): if raw_cli_output is True
+
+ Raises:
+ exceptions.ExecutionError: if command fails.
+
+ Example:
+ heketi_device_remove(heketi_client_node, heketi_server_url, device_id)
+ """
+
+ heketi_server_url, json_arg, admin_key, user = _set_heketi_global_flags(
+ heketi_server_url, **kwargs)
+
+ cmd = "heketi-cli -s %s device remove %s %s %s %s" % (
+ heketi_server_url, device_id, json_arg, admin_key, user)
+ ret, out, err = g.run(heketi_client_node, cmd)
+
+ if raw_cli_output:
+ return ret, out, err
+ if ret != 0:
+ msg = (
+ "Failed to execute '%s' command on '%s' node with following "
+ "error: %s" % (cmd, heketi_client_node, err))
+ g.log.error(msg)
+ raise exceptions.ExecutionError(msg)
+
+ return out
+
+
+def heketi_node_delete(heketi_client_node, heketi_server_url, node_id,
+ **kwargs):
+ """Executes heketi node delete command.
+
+ Args:
+ heketi_client_node (str): Node on which cmd has to be executed.
+ heketi_server_url (str): Heketi server url.
+ node_id (str): Node id to delete
+
+ Kwargs:
+ The keys, values in kwargs are:
+ - json : (bool)
+ - secret : (str)|None
+ - user : (str)|None
+
+ Returns:
+ str: heketi node delete command output on success.
+
+ Raises:
+ exceptions.ExecutionError: if command fails.
+
+ Example:
+ heketi_node_delete(heketi_client_node, heketi_server_url, node_id)
+ """
+
+ heketi_server_url, json_arg, admin_key, user = _set_heketi_global_flags(
+ heketi_server_url, **kwargs)
+
+ cmd = "heketi-cli -s %s node delete %s %s %s %s" % (
+ heketi_server_url, node_id, json_arg, admin_key, user)
+ ret, out, err = g.run(heketi_client_node, cmd)
+
+ if ret != 0:
+ msg = (
+ "Failed to execute '%s' command on '%s' node with following "
+ "error: %s" % (cmd, heketi_client_node, err))
+ g.log.error(msg)
+ raise exceptions.ExecutionError(msg)
+ return out
+
+
+def heketi_node_disable(heketi_client_node, heketi_server_url, node_id,
+ **kwargs):
+ """Executes heketi node disable command.
+
+ Args:
+ heketi_client_node (str): Node on which cmd has to be executed.
+ heketi_server_url (str): Heketi server url
+ node_id (str): Node id to disable node
+
+ Kwargs:
+ The keys, values in kwargs are:
+ - json : (bool)
+ - secret : (str)|None
+ - user : (str)|None
+
+ Returns:
+ str: heketi node disable command output on success.
+
+ Raises:
+ exceptions.ExecutionError: if command fails.
+
+ Example:
+ heketi_node_disable(heketi_client_node, heketi_server_url, node_id)
+ """
+
+ heketi_server_url, json_arg, admin_key, user = _set_heketi_global_flags(
+ heketi_server_url, **kwargs)
+
+ cmd = "heketi-cli -s %s node disable %s %s %s %s" % (
+ heketi_server_url, node_id, json_arg, admin_key, user)
+ ret, out, err = g.run(heketi_client_node, cmd)
+
+ if ret != 0:
+ msg = (
+ "Failed to execute '%s' command on '%s' node with following "
+ "error: %s" % (cmd, heketi_client_node, err))
+ g.log.error(msg)
+ raise exceptions.ExecutionError(msg)
+ return out
+
+
+def heketi_node_enable(heketi_client_node, heketi_server_url, node_id,
+ **kwargs):
+ """Executes heketi node enable command.
+
+ Args:
+ heketi_client_node (str): Node on which cmd has to be executed.
+ heketi_server_url (str): Heketi server url
+ node_id (str): Node id to enable device
+
+ Kwargs:
+ The keys, values in kwargs are:
+ - json : (bool)
+ - secret : (str)|None
+ - user : (str)|None
+
+ Returns:
+ str: heketi node enable command output on success.
+
+ Raises:
+ exceptions.ExecutionError: if command fails.
+
+ Example:
+ heketi_node_enable(heketi_client_node, heketi_server_url, node_id)
+ """
+
+ heketi_server_url, json_arg, admin_key, user = _set_heketi_global_flags(
+ heketi_server_url, **kwargs)
+
+ cmd = "heketi-cli -s %s node enable %s %s %s %s" % (
+ heketi_server_url, node_id, json_arg, admin_key, user)
+ ret, out, err = g.run(heketi_client_node, cmd)
+
+ if ret != 0:
+ msg = (
+ "Failed to execute '%s' command on '%s' node with following "
+ "error: %s" % (cmd, heketi_client_node, err))
+ g.log.error(msg)
+ raise exceptions.ExecutionError(msg)
+ return out
+
+
+def heketi_node_info(heketi_client_node, heketi_server_url, node_id, **kwargs):
+ """Executes heketi node info command.
+
+ Args:
+ heketi_client_node (str): Node on which cmd has to be executed.
+ heketi_server_url (str): Heketi server url
+ node_id (str): Node ID
+
+ Kwargs:
+ The keys, values in kwargs are:
+ - json : (bool)
+ - secret : (str)|None
+ - user : (str)|None
+
+ Returns:
+ dict: node info on success,
+ str: raw output if 'json' arg is not provided.
+
+ Raises:
+ exceptions.ExecutionError: if command fails.
+
+ Example:
+ heketi_node_info(heketi_client_node, heketi_server_url, node_id)
+ """
+
+ heketi_server_url, json_arg, admin_key, user = _set_heketi_global_flags(
+ heketi_server_url, **kwargs)
+
+ cmd = "heketi-cli -s %s node info %s %s %s %s" % (
+ heketi_server_url, node_id, json_arg, admin_key, user)
+ ret, out, err = g.run(heketi_client_node, cmd)
+
+ if ret != 0:
+ msg = (
+ "Failed to execute '%s' command on '%s' node with following "
+ "error: %s" % (cmd, heketi_client_node, err))
+ g.log.error(msg)
+ raise exceptions.ExecutionError(msg)
+ if json_arg:
+ return json.loads(out)
+ return out
+
+
+def heketi_node_list(heketi_client_node, heketi_server_url,
+ heketi_user=None, heketi_secret=None):
+ """Execute CLI 'heketi node list' command and parse its output.
+
+ Args:
+ heketi_client_node (str): Node on which cmd has to be executed
+ heketi_server_url (str): Heketi server url to perform request to
+ heketi_user (str): Name of the user to perform request with
+ heketi_secret (str): Secret for 'heketi_user'
+ Returns:
+ list of strings which are node IDs
+ Raises: openshiftstoragelibs.exceptions.ExecutionError when command fails.
+ """
+
+ heketi_server_url, json_arg, admin_key, user = _set_heketi_global_flags(
+ heketi_server_url, user=heketi_user, secret=heketi_secret)
+
+ cmd = "heketi-cli -s %s node list %s %s %s" % (
+ heketi_server_url, json_arg, admin_key, user)
+ ret, out, err = g.run(heketi_client_node, cmd)
+
+ if ret != 0:
+ msg = (
+ "Failed to execute '%s' command on '%s' node with following "
+ "error: %s" % (cmd, heketi_client_node, err))
+ g.log.error(msg)
+ raise exceptions.ExecutionError(msg)
+
+ heketi_node_id_list = []
+ for line in out.strip().split("\n"):
+ # Line looks like this: 'Id:nodeIdString\tCluster:clusterIdString'
+ heketi_node_id_list.append(
+ line.strip().split("Cluster")[0].strip().split(":")[1])
+ return heketi_node_id_list
+
+
+def heketi_blockvolume_info(heketi_client_node, heketi_server_url,
+ block_volume_id, **kwargs):
+ """Executes heketi blockvolume info command.
+
+ Args:
+ heketi_client_node (str): Node on which cmd has to be executed.
+ heketi_server_url (str): Heketi server url
+ block_volume_id (str): block volume ID
+
+ Kwargs:
+ The keys, values in kwargs are:
+ - json : (bool)
+ - secret : (str)|None
+ - user : (str)|None
+
+ Returns:
+ dict: block volume info on success.
+ str: raw output if 'json' arg is not provided.
+
+ Raises:
+ exceptions.ExecutionError: if command fails.
+
+ Example:
+ heketi_blockvolume_info(heketi_client_node, block_volume_id)
+ """
+
+ heketi_server_url, json_arg, admin_key, user = _set_heketi_global_flags(
+ heketi_server_url, **kwargs)
+
+ cmd = "heketi-cli -s %s blockvolume info %s %s %s %s" % (
+ heketi_server_url, block_volume_id, json_arg, admin_key, user)
+ ret, out, err = g.run(heketi_client_node, cmd)
+
+ if ret != 0:
+ msg = (
+ "Failed to execute '%s' command on '%s' node with following "
+ "error: %s" % (cmd, heketi_client_node, err))
+ g.log.error(msg)
+ raise exceptions.ExecutionError(msg)
+ if json_arg:
+ return json.loads(out)
+ return out
+
+
+def heketi_blockvolume_create(heketi_client_node, heketi_server_url, size,
+ **kwargs):
+ """Executes heketi blockvolume create
+
+ Args:
+ heketi_client_node (str): Node on which cmd has to be executed.
+ heketi_server_url (str): Heketi server url
+ size (int): blockvolume size
+
+ Kwargs:
+ The keys, values in kwargs are:
+ - name : (str)|None
+ - cluster : (str)|None
+ - ha : (int)|None
+ - auth : (bool)
+ - json : (bool)
+ - secret : (str)|None
+ - user : (str)|None
+
+ Returns:
+ dict: blockvolume create info on success, only cli option is specified
+ without --json option, then it returns raw string output.
+
+ Raises:
+ exceptions.ExecutionError: if command fails.
+
+ Example:
+ heketi_blockvolume_create(heketi_client_node, heketi_server_url, size)
+ """
+
+ heketi_server_url, json_arg, admin_key, user = _set_heketi_global_flags(
+ heketi_server_url, **kwargs)
+
+ auth = clusters = ha = name = None
+ if heketi_server_url is None:
+ heketi_server_url = ("http://" +
+ "heketi-storage-project.cloudapps.mystorage.com")
+
+ if 'auth' in kwargs:
+ auth = kwargs['auth']
+ if 'clusters' in kwargs:
+ clusters = kwargs['clusters']
+ if 'ha' in kwargs:
+ ha = int(kwargs['ha'])
+ if 'name' in kwargs:
+ name = kwargs['name']
+
+ auth_arg = clusters_arg = ha_arg = name_arg = ''
+
+ if auth:
+ auth_arg = "--auth"
+ if clusters is not None:
+ clusters_arg = "--clusters %s" % clusters
+ if ha is not None:
+ ha_arg = "--ha %d" % ha
+ if name is not None:
+ name_arg = "--name %s" % name
+
+ cmd = ("heketi-cli -s %s blockvolume create --size=%s %s %s %s %s "
+ "%s %s %s %s" % (heketi_server_url, str(size), auth_arg,
+ clusters_arg, ha_arg, name_arg, name_arg,
+ admin_key, user, json_arg))
+ ret, out, err = g.run(heketi_client_node, cmd)
+
+ if ret != 0:
+ msg = (
+ "Failed to execute '%s' command on '%s' node with following "
+ "error: %s" % (cmd, heketi_client_node, err))
+ g.log.error(msg)
+ raise exceptions.ExecutionError(msg)
+ if json_arg:
+ return json.loads(out)
+ return out
+
+
+def heketi_blockvolume_delete(heketi_client_node, heketi_server_url,
+ block_volume_id, raise_on_error=True, **kwargs):
+ """Executes heketi blockvolume delete command.
+
+ Args:
+ heketi_client_node (str): Node on which cmd has to be executed.
+ heketi_server_url (str): Heketi server url
+ block_volume_id (str): block volume ID
+ raise_on_error (bool): whether or not to raise exception
+ in case of an error.
+
+ Kwargs:
+ The keys, values in kwargs are:
+ - json : (bool)
+ - secret : (str)|None
+ - user : (str)|None
+
+ Returns:
+ str: volume delete command output on success
+
+ Raises:
+ exceptions.ExecutionError: if command fails.
+
+ Example:
+ heketi_blockvolume_delete(heketi_client_node, heketi_server_url,
+ block_volume_id)
+ """
+
+ heketi_server_url, json_arg, admin_key, user = _set_heketi_global_flags(
+ heketi_server_url, **kwargs)
+ err_msg = "Failed to delete '%s' volume. " % block_volume_id
+
+ cmd = "heketi-cli -s %s blockvolume delete %s %s %s %s" % (
+ heketi_server_url, block_volume_id, json_arg, admin_key, user)
+ ret, out, err = g.run(heketi_client_node, cmd)
+
+ if ret != 0:
+ err_msg += "Out: %s, \nErr: %s" % (out, err)
+ g.log.error(err_msg)
+ if raise_on_error:
+ raise exceptions.ExecutionError(err_msg)
+ return out
+
+
+def heketi_blockvolume_list(heketi_client_node, heketi_server_url, **kwargs):
+ """Executes heketi blockvolume list command.
+
+ Args:
+ heketi_client_node (str): Node on which cmd has to be executed.
+ heketi_server_url (str): Heketi server url
+
+ Kwargs:
+ The keys, values in kwargs are:
+ - json : (bool)
+ - secret : (str)|None
+ - user : (str)|None
+
+ Returns:
+ dict: volume list with --json on success, if cli option is specified
+ without --json option or with url, it returns raw string output.
+ False otherwise
+
+ Raises:
+ exceptions.ExecutionError: if command fails.
+
+ Example:
+ heketi_volume_info(heketi_client_node, heketi_server_url)
+ """
+
+ heketi_server_url, json_arg, admin_key, user = _set_heketi_global_flags(
+ heketi_server_url, **kwargs)
+
+ cmd = "heketi-cli -s %s blockvolume list %s %s %s" % (
+ heketi_server_url, json_arg, admin_key, user)
+ ret, out, err = g.run(heketi_client_node, cmd)
+
+ if ret != 0:
+ msg = (
+ "Failed to execute '%s' command on '%s' node with following "
+ "error: %s" % (cmd, heketi_client_node, err))
+ g.log.error(msg)
+ raise exceptions.ExecutionError(msg)
+ if json_arg:
+ return json.loads(out)
+ return out
+
+
+def verify_volume_name_prefix(hostname, prefix, namespace, pvc_name,
+ heketi_server_url, **kwargs):
+ """Checks whether heketi voluem is present with volname prefix or not.
+
+ Args:
+ hostname (str): hostname on which we want
+ to check the heketi vol
+ prefix (str): volnameprefix given in storageclass
+ namespace (str): namespace
+ pvc_name (str): name of the pvc
+ heketi_server_url (str): Heketi server url
+
+ Kwargs:
+ The keys, values in kwargs are:
+ - json : (bool)
+ - secret : (str)|None
+ - user : (str)|None
+
+ Returns:
+ bool: True if volume found.
+
+ Raises:
+ exceptions.ExecutionError: if command fails.
+ """
+ heketi_server_url, json_arg, admin_key, user = _set_heketi_global_flags(
+ heketi_server_url, **kwargs)
+
+ heketi_vol_name_prefix = "%s_%s_%s_" % (prefix, namespace, pvc_name)
+ cmd = "heketi-cli -s %s volume list %s %s %s | grep %s" % (
+ heketi_server_url, json_arg, admin_key, user, heketi_vol_name_prefix)
+ ret, out, err = g.run(hostname, cmd, "root")
+
+ if ret != 0:
+ msg = (
+ "Failed to execute '%s' command on '%s' node with following "
+ "error: %s" % (cmd, hostname, err))
+ g.log.error(msg)
+ raise exceptions.ExecutionError(msg)
+ output = out.strip()
+ g.log.info("heketi volume with volnameprefix present %s" % output)
+ return True
+
+
+def set_tags(heketi_client_node, heketi_server_url, source, source_id, tag,
+ **kwargs):
+ """Set any tags on Heketi node or device.
+
+ Args:
+ - heketi_client_node (str) : Node where we want to run our commands.
+ eg. "10.70.47.64"
+ - heketi_server_url (str) : This is a heketi server url
+ eg. "http://172.30.147.142:8080
+ - source (str) : This var is for node or device whether we
+ want to set tag on node or device.
+ Allowed values are "node" and "device".
+ - sorrce_id (str) : ID of node or device.
+ eg. "4f9c0249834919dd372e8fb3344cd7bd"
+ - tag (str) : This is a tag which we want to set
+ eg. "arbiter:required"
+ Kwargs:
+ user (str) : username
+ secret (str) : secret for that user
+ Returns:
+ True : if successful
+ Raises:
+ ValueError : when improper input data are provided.
+ exceptions.ExecutionError : when command fails.
+ """
+
+ if source not in ('node', 'device'):
+ msg = ("Incorrect value we can use 'node' or 'device' instead of %s."
+ % source)
+ g.log.error(msg)
+ raise ValueError(msg)
+
+ heketi_server_url, json_args, secret, user = _set_heketi_global_flags(
+ heketi_server_url, **kwargs)
+
+ cmd = ("heketi-cli -s %s %s settags %s %s %s %s" %
+ (heketi_server_url, source, source_id, tag, user, secret))
+ ret, out, err = g.run(heketi_client_node, cmd)
+
+ if not ret:
+ g.log.info("Tagging of %s to %s is successful" % (source, tag))
+ return True
+
+ g.log.error(err)
+ raise exceptions.ExecutionError(err)
+
+
+def set_arbiter_tag(heketi_client_node, heketi_server_url, source,
+ source_id, arbiter_tag_value, **kwargs):
+ """Set Arbiter tags on Heketi node or device.
+
+ Args:
+ - heketi_client_node (str) : node where we want to run our commands.
+ eg. "10.70.47.64"
+ - heketi_server_url (str) : This is a heketi server url
+ eg. "http://172.30.147.142:8080
+ - source (str) : This var is for node or device whether we
+ want to set tag on node or device.
+ Allowed values are "node" and "device".
+ - source_id (str) : ID of Heketi node or device
+ eg. "4f9c0249834919dd372e8fb3344cd7bd"
+ - arbiter_tag_value (str) : This is a tag which we want to set
+ Allowed values are "required", "disabled" and "supported".
+ Kwargs:
+ user (str) : username
+ secret (str) : secret for that user
+ Returns:
+ True : if successful
+ Raises:
+ ValueError : when improper input data are provided.
+ exceptions.ExecutionError : when command fails.
+ """
+
+ version = heketi_version.get_heketi_version(heketi_client_node)
+ if version < '6.0.0-11':
+ msg = ("heketi-client package %s does not support arbiter "
+ "functionality" % version.v_str)
+ g.log.error(msg)
+ raise NotImplementedError(msg)
+
+ if arbiter_tag_value in ('required', 'disabled', 'supported'):
+ arbiter_tag_value = "arbiter:%s" % arbiter_tag_value
+ return set_tags(heketi_client_node, heketi_server_url,
+ source, source_id, arbiter_tag_value, **kwargs)
+
+ msg = ("Incorrect value we can use 'required', 'disabled', 'supported'"
+ "instead of %s" % arbiter_tag_value)
+ g.log.error(msg)
+ raise ValueError(msg)
+
+
+def rm_tags(heketi_client_node, heketi_server_url, source, source_id, tag,
+ **kwargs):
+ """Remove any kind of tags from Heketi node or device.
+
+ Args:
+ - heketi_client_node (str) : Node where we want to run our commands.
+ eg. "10.70.47.64"
+ - heketi_server_url (str) : This is a heketi server url
+ eg. "http://172.30.147.142:8080
+ - source (str) : This var is for node or device whether we
+ want to set tag on node or device.
+ Allowed values are "node" and "device".
+ - sorrce_id (str) : id of node or device
+ eg. "4f9c0249834919dd372e8fb3344cd7bd"
+ - tag (str) : This is a tag which we want to remove.
+ Kwargs:
+ user (str) : username
+ secret (str) : secret for that user
+ Returns:
+ True : if successful
+ Raises:
+ ValueError : when improper input data are provided.
+ exceptions.ExecutionError : when command fails.
+ """
+
+ heketi_server_url, json_args, secret, user = _set_heketi_global_flags(
+ heketi_server_url, **kwargs)
+ if source not in ('node', 'device'):
+ msg = ("Incorrect value we can use 'node' or 'device' instead of %s."
+ % source)
+ g.log.error(msg)
+ raise ValueError(msg)
+
+ cmd = ("heketi-cli -s %s %s rmtags %s %s %s %s" %
+ (heketi_server_url, source, source_id, tag, user, secret))
+ ret, out, err = g.run(heketi_client_node, cmd)
+
+ if not ret:
+ g.log.info("Removal of %s tag from %s is successful." % (tag, source))
+ return True
+
+ g.log.error(err)
+ raise exceptions.ExecutionError(err)
+
+
+def rm_arbiter_tag(heketi_client_node, heketi_server_url, source, source_id,
+ **kwargs):
+ """Remove Arbiter tag from Heketi node or device.
+
+ Args:
+ - heketi_client_node (str) : Node where we want to run our commands.
+ eg. "10.70.47.64"
+ - heketi_server_url (str) : This is a heketi server url
+ eg. "http://172.30.147.142:8080
+ - source (str) : This var is for node or device whether we
+ want to set tag on node or device.
+ Allowed values are "node" and "device".
+ - source_id (str) : ID of Heketi node or device.
+ eg. "4f9c0249834919dd372e8fb3344cd7bd"
+ Kwargs:
+ user (str) : username
+ secret (str) : secret for that user
+ Returns:
+ True : if successful
+ Raises:
+ ValueError : when improper input data are provided.
+ exceptions.ExecutionError : when command fails.
+ """
+
+ version = heketi_version.get_heketi_version(heketi_client_node)
+ if version < '6.0.0-11':
+ msg = ("heketi-client package %s does not support arbiter "
+ "functionality" % version.v_str)
+ g.log.error(msg)
+ raise NotImplementedError(msg)
+
+ return rm_tags(heketi_client_node, heketi_server_url,
+ source, source_id, 'arbiter', **kwargs)
+
+
+def get_heketi_metrics(heketi_client_node, heketi_server_url,
+ prometheus_format=False):
+ """Execute curl command to get metrics output.
+
+ Args:
+ - heketi_client_node (str) : Node where we want to run our commands.
+ - heketi_server_url (str) : This is a heketi server url.
+ - prometheus_format (bool) : control the format of output
+ by default it is False, So it will parse prometheus format into
+ python dict. If we need prometheus format we have to set it True.
+
+ Raises:
+ exceptions.ExecutionError: if command fails.
+
+ Returns:
+ Metrics output: if successful
+ """
+
+ version = heketi_version.get_heketi_version(heketi_client_node)
+ if version < '6.0.0-14':
+ msg = ("heketi-client package %s does not support heketi "
+ "metrics functionality" % version.v_str)
+ g.log.error(msg)
+ raise NotImplementedError(msg)
+
+ cmd = "curl --max-time 10 %s/metrics" % heketi_server_url
+ ret, out, err = g.run(heketi_client_node, cmd)
+ if ret != 0:
+ msg = "failed to get Heketi metrics with following error: %s" % err
+ g.log.error(msg)
+ raise exceptions.ExecutionError(msg)
+ if prometheus_format:
+ return out.strip()
+ return parse_prometheus_data(out)
+
+
+def heketi_examine_gluster(heketi_client_node, heketi_server_url):
+ """Execute heketi command to examine output from gluster servers.
+
+ Args:
+ - heketi_client_node (str): Node where we want to run our commands.
+ - heketi_server_url (str): This is a heketi server url.
+
+ Raises:
+ NotImplementedError: if heketi version is not expected
+ exceptions.ExecutionError: if command fails.
+
+ Returns:
+ dictionary: if successful
+ """
+
+ version = heketi_version.get_heketi_version(heketi_client_node)
+ if version < '8.0.0-7':
+ msg = ("heketi-client package %s does not support server state examine"
+ " gluster" % version.v_str)
+ g.log.error(msg)
+ raise NotImplementedError(msg)
+
+ heketi_server_url, json_arg, secret, user = _set_heketi_global_flags(
+ heketi_server_url)
+ # output is always json-like and we do not need to provide "--json" CLI arg
+ cmd = ("heketi-cli server state examine gluster -s %s %s %s"
+ % (heketi_server_url, user, secret))
+ ret, out, err = g.run(heketi_client_node, cmd)
+
+ if ret != 0:
+ msg = "failed to examine gluster with following error: %s" % err
+ g.log.error(msg)
+ raise exceptions.ExecutionError(msg)
+
+ return json.loads(out)