summaryrefslogtreecommitdiffstats
path: root/extras/volgen/glusterfs-volgen
diff options
context:
space:
mode:
Diffstat (limited to 'extras/volgen/glusterfs-volgen')
-rwxr-xr-xextras/volgen/glusterfs-volgen309
1 files changed, 154 insertions, 155 deletions
diff --git a/extras/volgen/glusterfs-volgen b/extras/volgen/glusterfs-volgen
index 1151053ac..3781f6d0b 100755
--- a/extras/volgen/glusterfs-volgen
+++ b/extras/volgen/glusterfs-volgen
@@ -1,7 +1,7 @@
#!/usr/bin/python
import getopt, sys, os, string
-import subprocess
+from optparse import OptionParser,OptionGroup,make_option
if not "/usr/share/glusterfs" in sys.path:
sys.path.append("/usr/share/glusterfs")
@@ -9,176 +9,175 @@ if not "/usr/share/glusterfs" in sys.path:
from CreateVolfile import *
from CreateBooster import *
-def print_usage (name):
- spaces = ' ' * (len(name) + 1)
- print name, "--name <volume-name>"
- print "%s[--raid 0|1]" % spaces
- print "%s[--transport tcp,ib-verbs]" % spaces
- print "%s[--port <port>]" % spaces
- print "%s[--ibdev <lid>]" % spaces
- print "%s[--auth <ip-range>]" % spaces
- print "%s[--conf-dir <confdir>]" % spaces
- print "%s[--usage]" % spaces
- print "%s[--nfs]" % spaces
- print "%s[--cifs]" % spaces
- print "%s[--version]" % spaces
- print "%shost1:<export> host2:<export> ... hostN:<exportNN>" % spaces
- return
-
-def print_version (version):
- print "glusterfs-volgen %s: A tool to generate volume files for GlusterFS." % version
- print "Copyright (C) 2009 Gluster, Inc. <http://www.gluster.com>"
- print """License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
-This is free software: you are free to change and redistribute it.
-There is NO WARRANTY, to the extent permitted by law."""
-
-
-def main ():
-
- needs_upgrade = None
- needs_nfs = None
- needs_cifs = None
- version_num ="3.0"
- _volume_name = None
- _server_chain = {}
- _server = None
- _transports = ['tcp']
- _transport = None
- _port = 6996
- _auth_param = "*"
- _ib_dev = 1
- _raid_type = None
- node = None
- _conf_dir = None
-
- try:
- (opt, args) = getopt.getopt (sys.argv[1:], "r:t:p:n:a:i:ch",
- ["raid=",
- "transport=",
- "port=",
- "name=",
- "auth=",
- "ibdev=",
- "conf-dir=",
- "nfs",
- "cifs",
- "usage",
- "version",
- "help"])
-
- except getopt.GetoptError, (msg, opt):
- print msg
- sys.exit (1)
-
- for (o, val) in opt:
- if o == '--usage' or o == '--help':
- print_usage (sys.argv[0])
- sys.exit (0)
-
- if o == '-n' or o == '--name':
- _volume_name = val
-
- if o == '--nfs':
- needs_nfs = 1
-
- if o == '--cifs':
- needs_cifs = 1
-
- if o == '-t' or o == '--transport':
- if not val:
- print "--transport: option " + val + \
- " is not valid transport type"
- sys.exit (1)
- _transports = val.split(',')
-
- if o == '-a' or o == '--auth':
- _auth_param = val
-
- if o == '-p' or o == '--port':
- _port = int(val)
-
- if o == '-r' or o == '--raid':
- if (val != "1" and val != "0"):
- print "--raid: option " + val + " is not valid raid type"
- sys.exit (1)
- _raid_type = int (val)
-
- if o == '-i' or o == '--ibdev':
- _ib_dev = int(val)
-
- if o == '-v' or o == '--version':
- print_version (version_num)
- sys.exit (0)
-
- if o == '-c' or o == '--conf-dir':
- _conf_dir = val
-
- if _volume_name is None:
- print "Volume name is mandatory, please provide volume name.. exiting"
- print_usage(sys.argv[0])
- sys.exit(1)
-
+def check_duplicate_entry(args):
+ """Check duplicate entries in incoming arguments"""
_tmp = []
for server in args:
if server not in _tmp:
_tmp.append (server)
else:
print "Duplicate arguments detected (%s)" % server
- sys.exit(1)
+ raise ValueError
- node = server.split(':')[0]
- _server_chain[node] = []
+ return
- for server in args:
- node = server.split(':')[0]
- if server.split(':')[1] not in _server_chain [node]:
- if server.split(':')[1][0] != '/':
- print "Absolute export path required for %s" % server
- sys.exit(1)
- _server_chain [node].append (server.split(':')[1])
+def args2dict(args):
+
+ keyvalue = {}
+ for arg in args:
+ first = arg.split(':')[0]
+ keyvalue[first] = []
+
+ for arg in args:
+ first = arg.split(':')[0]
+ if arg.split(':')[1] not in keyvalue[first]:
+ if arg.split(':')[1][0] != '/':
+ print "Absolute export path required for %s" % arg
+ raise ValueError
+ keyvalue[first].append (arg.split(':')[1])
+
+ return keyvalue
+
+def args2array(args):
+
+ array = []
+ array = args
+
+ return array
+
+def generate_volume_files ():
+
+ num_stripe = 4
+ num_replica = 2
+
+ usage_str = "%prog: -n <VOLUMENAME> -t <TRANSPORT> -p <NUMBER> -a <AUTH> -r <TYPE>"
+ version_str = "%prog 3.0"
+ desc_str = "A tool to generate volume files for GlusterFS."
+
+ parse = OptionParser(usage=usage_str, version=version_str, description=desc_str)
+
+ # Basic option list
+ group = OptionGroup(parse, "Basic Options")
+ group.add_option("-n", "--name", dest="volume_name",
+ help="<volume-name>")
+ group.add_option("-t", "--transport", dest="transport_type",
+ default="tcp", help="tcp,ib-verbs default: tcp")
+ group.add_option("-p", "--port", type="int",
+ dest="port", default=6996,
+ help="<port> number")
+ group.add_option("-a", "--auth", dest="auth_param", default="*",
+ help="comma seperated ip range")
+ group.add_option("-r", "--raid", type="int", dest="raid_type",
+ help="0|1")
+ group.add_option("--nfs", action="store_true", dest="need_nfs",
+ default=False, help="booster nfs reexport")
+ group.add_option("--cifs", action="store_true", dest="need_cifs",
+ default=False, help="booster cifs reexport"),
+ parse.add_option_group(group)
+
+ # CIFS option list
+ group = OptionGroup(parse, "CIFS Options")
+ group.add_option("--username", dest="cifs_username",
+ default="gluster", help="<cifs_username>")
+ group.add_option("--guest", action="store_true",
+ dest="enable_guest", default=False,
+ help="enable guest access")
+ parse.add_option_group(group)
+ # NFS option list
+
+ # Advanced option list
+ group = OptionGroup(parse, "Advanced Options")
+ group.add_option("--ibdev", type="int", dest="ib_dev",
+ default=1, help="Infiniband device number <N>")
+ group.add_option("-c", "--conf-dir", dest="conf_dir",
+ help="output directory for volume files"),
+ parse.add_option_group(group)
+
+ group = OptionGroup(parse, "Extra Options")
+ group.add_option("--unused", action="store_true",
+ dest="unused", default=False,
+ help="enable unused options")
+ group.add_option("--debug", action="store_true",
+ dest="debug", default=False,
+ help="add all debug modules to volumes")
+
+ parse.add_option_group(group)
+
+ (options, args) = parse.parse_args()
+
+ if options.volume_name is None:
+ print "Error: volume name is mandatory, please provide volume name"
+ raise ValueError
+
+ if options.transport_type:
+ transports = options.transport_type.split(',')
+ for transport in transports:
+ if (transport != "tcp" and transport != "ib-verbs"):
+ print "Error: --transport: option " + transport + \
+ " is not valid transport type"
+ raise ValueError
+
+ if options.raid_type:
+ if (options.raid_type != 1 and options.raid_type != 0):
+ print "Error: --raid: option " + str(options.raid_type) + " is not valid raid type"
+ raise ValueError
+
+
+ check_duplicate_entry(args)
- num_servers = len (_server_chain.keys())
+ server_dict = {}
- if num_servers is 0:
- print "no servers provided, exiting"
- print_usage(sys.argv[0])
- sys.exit (1)
+ server_dict = args2dict(args)
- print num_servers
+ server_array = args2array(args)
+ if len (server_dict.keys()) == 0:
+ print "Error: no servers provided, please provide atleast one server"
+ raise ValueError
- for _server in _server_chain.keys():
- create_exp = CreateVolfile (_server_chain, _server,
- _volume_name, None,
- _transports, _port,
- _auth_param, _ib_dev,
- _conf_dir, None)
+ if options.raid_type == 1:
+ if (len(server_array) % num_replica) != 0:
+ print "raid type (%d) and number of volumes (%d) invalid" % (options.raid_type,
+ len(server_array))
+ raise ValueError
+
+ if options.raid_type == 0:
+ if (len(server_array) % num_stripe) != 0:
+ print "raid type (%d) and number of volumes (%d) invalid" % (options.raid_type,
+ len(server_array))
+ raise ValueError
+
+ for server in server_dict.keys():
+ create_exp = CreateVolfile (server_dict, server,
+ None, transports,
+ options, None)
try:
create_exp.create_export_volfile ()
except IOError, (errno, strerror):
- print "Got %s creating server volfiles for %s" % (strerror, _server)
-
- for _transport in _transports:
- create_mnt = CreateVolfile (_server_chain, None,
- _volume_name, _transport,
- _transports, _port,
- _auth_param, _ib_dev,
- _conf_dir, args)
+ print "Got %s creating server volfiles for %s" % (strerror, server)
+
+ for transport in transports:
+ create_mnt = CreateVolfile (server_dict, None,
+ transport, transports,
+ options, server_array)
try:
- create_mnt.create_mount_volfile (_raid_type)
+ create_mnt.create_mount_volfile ()
except IOError, (errno, strerror):
- print "Got %s creating client volfiles for transport '%s'" % (strerror, _transport)
-
-
- for _server in _server_chain.keys():
- for export_dir in _server_chain[_server]:
- commonobj = CreateBooster (_volume_name, export_dir)
- if needs_nfs is 1 or needs_cifs is 1:
- commonobj.configure_booster_fstab ()
- if needs_nfs is 1:
- commonobj.configure_nfs_booster ()
- if needs_cifs is 1:
- commonobj.configure_cifs_booster ()
- return
+ print "Got %s creating client volfiles for transport '%s'" % (strerror, transport)
+
+
+ create_booster = CreateBooster (options)
+ try:
+ create_booster.configure_booster ()
+ except IOError, (errno, strerror):
+ print "Got %s creating booster configuration '%s'" % (strerror, export_dir)
+
+def main ():
+
+ try:
+ generate_volume_files()
+ except ValueError:
+ sys.exit(1)
+
-main ()
+main()