diff options
Diffstat (limited to 'extras/volgen/CreateVolfile.py')
| -rw-r--r-- | extras/volgen/CreateVolfile.py | 238 | 
1 files changed, 238 insertions, 0 deletions
diff --git a/extras/volgen/CreateVolfile.py b/extras/volgen/CreateVolfile.py new file mode 100644 index 00000000000..1d22e8fb164 --- /dev/null +++ b/extras/volgen/CreateVolfile.py @@ -0,0 +1,238 @@ +import os, sys, string +import subprocess + +num_replica = 2 +num_stripe = 4 +cache_size = "1GB" + +class CreateVolfile: + +    def __init__ (self, servers, server, volume_name, +                  transport, transports, port, auth_param, +                  ib_port, confdir, args): +        self.hosts = servers +        self.host = server +        self.volume_name = volume_name +        self.transport = transport +        self.transports = transports +        self.gfs_port = port +        self.gfs_ib_port = port + 1 +        self.auth_parameters = auth_param +        self.ib_devport = ib_port +        self.num_servers = len (self.hosts.keys()) +        self.conf_dir = confdir +        self.arguments = args + +    def create_mount_volfile (self, raid_type): + + +        if self.conf_dir: +            mount_fd = file ("%s/%s-%s.vol" % (self.conf_dir, +                                               str(self.volume_name), +                                               str(self.transport)), "w") +        else: +            mount_fd = file ("%s-%s.vol" % (str(self.volume_name), +                                            str(self.transport)), "w") + +        print "Generating client volfiles.. for transport '%s'" % (self.transport) + +        num_stripe = 4 +        num_replica = 2 + + +        cmdline = string.join (sys.argv, ' ') +        mount_fd.write ("## file auto generated by %s (mount.vol)\n" % +                        sys.argv[0]) +        mount_fd.write ("# Cmd line:\n") +        mount_fd.write ("# $ %s\n\n" % cmdline) + +        if raid_type is not None: +            # Used for later usage +            mount_fd.write ("# RAID %d\n" % raid_type) + +        mount_fd.write ("# TRANSPORT-TYPE %s\n" % self.transport) +        subvolumes = [] +        for host in self.hosts.keys(): +            i = 1 +            for exports in self.hosts[host]: +                mount_fd.write ("volume %s-%s\n" % (host,i)) +                mount_fd.write ("    type protocol/client\n") +                mount_fd.write ("    option transport-type %s\n" % +                                self.transport) +                command = "dig %s | grep '^%s'" % (host, host) +                ps = subprocess.Popen(command, +                                      shell=True, +                                      stdout=subprocess.PIPE, +                                      stdin=subprocess.PIPE, +                                      stderr=subprocess.PIPE, +                                      close_fds=True) +                ipaddress = host +                if ps.wait() == 0: +                    output = ps.communicate() +                    ipaddress = output[0].split()[-1] + +                mount_fd.write ("    option remote-host %s\n" % ipaddress) +                if self.transport == 'ib-verbs': +                    mount_fd.write ("    option transport.ib-verbs.port %d\n" % +                                    self.ib_devport) +                    mount_fd.write ("    option transport.remote-port %d\n" % +                                    self.gfs_ib_port) +                if self.transport == 'tcp': +                    mount_fd.write ("    option transport.socket.nodelay on\n") +                    mount_fd.write ("    option transport.remote-port %d\n" % +                                    self.gfs_port) + +                mount_fd.write ("    option remote-subvolume brick%s\n" % +                                i) +                mount_fd.write ("end-volume\n\n") +                i += 1 + +        exportlist = {} +        for entry in self.arguments: +            node = entry.split(':')[0] +            if not exportlist.has_key(node): +                exportlist[node] = 1 +            else: +                exportlist[node] += 1 +            subvolumes.append(str(node) + '-' + str(exportlist[node])) + + +        if raid_type == 1: +            if (len(subvolumes) % num_replica) != 0: +                print "raid type (%d) and number of volumes (%d) invalid" % (raid_type, len(subvolumes)) +                sys.exit (1) + +        if raid_type == 0: +            if (len(subvolumes) % num_stripe) != 0: +                print "raid type (%d) and number of volumes (%d) invalid" % (raid_type, len(subvolumes)) +                sys.exit (1) + +        # Stripe section.. if given +        if raid_type is 0: +            max_stripe_idx = len (subvolumes) / num_stripe +            stripe_idx = 0 +            index = 0 +            while index < max_stripe_idx: +                mount_fd.write ("volume stripe-%d\n" % index) +                mount_fd.write ("    type cluster/stripe\n") +                mount_fd.write ("    subvolumes %s %s %s %s\n" % +                                (subvolumes[stripe_idx], +                                 subvolumes[stripe_idx+1], +                                 subvolumes[stripe_idx+2], +                                 subvolumes[stripe_idx+3])) +                mount_fd.write ("end-volume\n\n") +                stripe_idx += 4 +                index +=1 + +        # Replicate section +        if raid_type is 1: +            max_mirror_idx = len (subvolumes) / num_replica +            mirror_idx = 0 +            index = 0 +            while index < max_mirror_idx: +                mount_fd.write ("volume mirror-%d\n" % index) +                mount_fd.write ("    type cluster/replicate\n") +                mount_fd.write ("    subvolumes %s %s\n" % +                                (subvolumes[mirror_idx], +                                 subvolumes[mirror_idx+1])) +                mount_fd.write ("end-volume\n\n") +                mirror_idx += 2 +                index += 1 + +        # Distribute section +        if raid_type is 0: +            subvolumes = [] +            flag = 0 +            while flag < index: +                subvolumes.append ("stripe-%d" % flag) +                flag += 1 +        if raid_type is 1: +            subvolumes = [] +            flag = 0 +            while flag < index: +                subvolumes.append ("mirror-%d" % flag) +                flag += 1 + +        if len (subvolumes) > 1: +            mount_fd.write ("volume distribute\n") +            mount_fd.write ("    type cluster/distribute\n") +            mount_fd.write ("    subvolumes %s\n" % +                                 string.join (subvolumes,' ')) +            mount_fd.write ("end-volume\n\n") +            subvolumes[0] = "distribute" + +        mount_fd.write ("volume writebehind\n") +        mount_fd.write ("    type performance/write-behind\n") +        mount_fd.write ("    option cache-size 4MB\n") +        mount_fd.write ("    subvolumes %s\n" % subvolumes[0]) +        mount_fd.write ("end-volume\n\n") + +        mount_fd.write ("volume io-cache\n") +        mount_fd.write ("    type performance/io-cache\n") +        mount_fd.write ("    option cache-size %s\n" % cache_size) +        mount_fd.write ("    subvolumes writebehind\n") +        mount_fd.write ("end-volume\n\n") + +        return + +    def create_export_volfile (self): + +        cmdline = string.join (sys.argv, ' ') + +        if self.conf_dir: +            exp_fd = file ("%s/%s-export.vol" % +                           (self.conf_dir, +                            str(self.host + '-' + self.volume_name)),"w") +        else: +            exp_fd = file ("%s-export.vol" % +                           (str(self.host + '-' + self.volume_name)),"w") + +        print "Generating server volfiles.. for server '%s'" % (self.host) + +        exp_fd.write ("## file auto generated by %s (export.vol)\n" % +                      sys.argv[0]) +        exp_fd.write ("# Cmd line:\n") +        exp_fd.write ("# $ %s\n\n" % cmdline) +        total_bricks = [] +        i=1 +        for export in self.hosts[self.host]: +            exp_fd.write ("volume posix%d\n" % i) +            exp_fd.write ("  type storage/posix\n") +            exp_fd.write ("  option directory %s\n" % export) +            exp_fd.write ("end-volume\n\n") + +            exp_fd.write ("volume locks%d\n" % i) +            exp_fd.write ("    type features/locks\n") +            exp_fd.write ("    subvolumes posix%d\n" % i) +            exp_fd.write ("end-volume\n\n") + +            exp_fd.write ("volume brick%d\n" % i) +            exp_fd.write ("    type performance/io-threads\n") +            exp_fd.write ("    option thread-count 8\n") +            exp_fd.write ("    subvolumes locks%d\n" % i) +            exp_fd.write ("end-volume\n\n") + +            total_bricks.append("brick%s" % i) +            i += 1 + +        for transport in self.transports: +            exp_fd.write ("volume server-%s\n" % transport) +            exp_fd.write ("    type protocol/server\n") +            exp_fd.write ("    option transport-type %s\n" % transport) +            for brick in total_bricks: +                exp_fd.write ("    option auth.addr.%s.allow %s\n" % +                              (brick, self.auth_parameters)) + +            if transport == 'ib-verbs': +                exp_fd.write ("    option transport.ib-verbs.listen-port %d\n" % self.gfs_ib_port) +                exp_fd.write ("    option transport.ib-verbs.port %d\n" % +                              self.ib_devport) +            if transport == 'tcp': +                exp_fd.write ("    option transport.socket.listen-port %d\n" % self.gfs_port) +                exp_fd.write ("    option transport.socket.nodelay on\n") + +            exp_fd.write ("    subvolumes %s\n" % +                          string.join(total_bricks, ' ')) +            exp_fd.write ("end-volume\n\n") + +        return  | 
