def post(self, request): """ input is a list of disks, raid_level and name of the pool. """ try: disks = request.DATA['disks'].split(',') pname = request.DATA['pname'] if (re.match('%s$' % settings.POOL_REGEX, pname) is None): e_msg = ('Pool name must start with a letter(a-z) and can' ' be followed by any of the following characters: ' 'letter(a-z), digits(0-9), hyphen(-), underscore' '(_) or a period(.).') handle_exception(Exception(e_msg), request) if (Pool.objects.filter(name=pname).exists()): e_msg = ('Pool with name: %s already exists.' % pname) handle_exception(Exception(e_msg), request) for d in disks: if (not Disk.objects.filter(name=d).exists()): e_msg = ('Unknown disk: %s' % d) handle_exception(Exception(e_msg), request) raid_level = request.DATA['raid_level'] if (raid_level not in self.RAID_LEVELS): e_msg = ('Unsupported raid level. use one of: %s' % self.RAID_LEVELS) handle_exception(Exception(e_msg), request) if (raid_level in self.RAID_LEVELS[0:2] and len(disks) == 1): e_msg = ('More than one disk is required for the raid ' 'level: %s' % raid_level) handle_exception(Exception(e_msg), request) if (raid_level == self.RAID_LEVELS[2] and len(disks) < 4): e_msg = ('Four or more disks are required for the raid ' 'level: %s' % raid_level) handle_exception(Exception(e_msg), request) if (raid_level == self.RAID_LEVELS[4] and len(disks) < 2): e_msg = ('Two or more disks are required for the raid ' 'level: %s' % raid_level) handle_exception(Exception(e_msg), request) if (raid_level == self.RAID_LEVELS[5] and len(disks) < 3): e_msg = ('Three or more disks are required for the raid ' 'level: %s' % raid_level) handle_exception(Exception(e_msg), request) p = Pool(name=pname, raid=raid_level) add_pool(pname, raid_level, raid_level, disks) usage = pool_usage(disks[0]) p.size = usage[0] p.save() p.disk_set.add(*[Disk.objects.get(name=d) for d in disks]) return Response(PoolInfoSerializer(p).data) except RockStorAPIException: raise except Exception, e: handle_exception(e, request)
def btrfs_add_pool(pool): disks = btrfs_disk_scan() disks_pool = [] for disk in pool["disks"]: for disk_d in disks: if disk == disk_d["name"]: disks_pool.append(disk_d) dnames = [d["name"] for d in disks_pool] pool["disks"] = disks_pool add_pool(pool, dnames) pool["size"] = pool_usage(mount_root(pool))[0] pool["uuid"] = btrfs_uuid(dnames[0]) return pool
def btrfs_add_pool(pool): disks = btrfs_disk_scan() disks_pool = [] for disk in pool["disks"]: for disk_d in disks: if disk == disk_d["name"]: disks_pool.append(disk_d) dnames = [d["name"] for d in disks_pool] pool["disks"] = disks_pool add_pool(pool,dnames) pool["size"] = pool_usage(mount_root(pool))[0] pool["uuid"] = btrfs_uuid(dnames[0]) return pool
def post(self, request): """ input is a list of disks, raid_level and name of the pool. """ try: pname = request.DATA['pname'] disks = request.DATA['disks'].split(',') if (Pool.objects.filter(name=pname).exists()): e_msg = ('Pool with name: %s already exists.' % pname) handle_exception(Exception(e_msg), request) for d in disks: if (not Disk.objects.filter(name=d).exists()): e_msg = ('Unknown disk: %s' % d) handle_exception(Exception(e_msg), request) raid_level = request.DATA['raid_level'] if (raid_level not in self.RAID_LEVELS): e_msg = ('Unsupported raid level. use one of: %s' % self.RAID_LEVELS) handle_exception(Exception(e_msg), request) if (raid_level in self.RAID_LEVELS[0:2] and len(disks) == 1): e_msg = ('More than one disk is required for the chosen raid ' 'level: %s' % raid_level) handle_exception(Exception(e_msg), request) if (raid_level == self.RAID_LEVELS[2] and len(disks) < 4): e_msg = ('Four or more disks are required for the chose raid ' 'level: %s' % raid_level) handle_exception(Exception(e_msg), request) p = Pool(name=pname, raid=raid_level) add_pool(pname, raid_level, raid_level, disks) usage = pool_usage2(pname, disks[0]).split() p.size = int(usage[2]) + int(usage[3]) p.save() p.disk_set.add(*[Disk.objects.get(name=d) for d in disks]) return Response(PoolInfoSerializer(p).data) except RockStorAPIException: raise except Exception, e: handle_exception(e, request)
def post(self, request): """ input is a list of disks, raid_level and name of the pool. """ try: disks = request.DATA['disks'].split(',') pname = request.DATA['pname'] if (Pool.objects.filter(name=pname).exists()): e_msg = ('Pool with name: %s already exists.' % pname) handle_exception(Exception(e_msg), request) for d in disks: if (not Disk.objects.filter(name=d).exists()): e_msg = ('Unknown disk: %s' % d) handle_exception(Exception(e_msg), request) raid_level = request.DATA['raid_level'] if (raid_level not in self.RAID_LEVELS): e_msg = ('Unsupported raid level. use one of: %s' % self.RAID_LEVELS) handle_exception(Exception(e_msg), request) if (raid_level in self.RAID_LEVELS[0:2] and len(disks) == 1): e_msg = ('More than one disk is required for the chosen raid ' 'level: %s' % raid_level) handle_exception(Exception(e_msg), request) if (raid_level == self.RAID_LEVELS[2] and len(disks) < 4): e_msg = ('Four or more disks are required for the chose raid ' 'level: %s' % raid_level) handle_exception(Exception(e_msg), request) p = Pool(name=pname, raid=raid_level) add_pool(pname, raid_level, raid_level, disks) usage = pool_usage(disks[0]) p.size = usage[0] p.save() p.disk_set.add(*[Disk.objects.get(name=d) for d in disks]) return Response(PoolInfoSerializer(p).data) except RockStorAPIException: raise except Exception, e: handle_exception(e, request)
def post(self, request): """ input is a list of disks, raid_level and name of the pool. """ with self._handle_exception(request): disks = [ self._validate_disk(d, request) for d in request.data.get("disks") ] pname = request.data["pname"] if re.match("{}$".format(settings.POOL_REGEX), pname) is None: e_msg = ("Invalid characters in pool name. Following " "characters are allowed: letter(a-z or A-Z), " "digit(0-9), " "hyphen(-), underscore(_) or a period(.).") handle_exception(Exception(e_msg), request) if len(pname) > 255: e_msg = "Pool name must be less than 255 characters." handle_exception(Exception(e_msg), request) if Pool.objects.filter(name=pname).exists(): e_msg = ("Pool ({}) already exists. Choose a different name." ).format(pname) handle_exception(Exception(e_msg), request) if Share.objects.filter(name=pname).exists(): e_msg = ("A share with this name ({}) exists. Pool and share " "names must be distinct. " "Choose a different name.").format(pname) handle_exception(Exception(e_msg), request) for d in disks: if d.btrfs_uuid is not None: e_msg = ("Another BTRFS filesystem exists on this " "disk ({}). " "Erase the disk and try again.").format(d.name) handle_exception(Exception(e_msg), request) raid_level = request.data["raid_level"] if raid_level not in self.RAID_LEVELS: e_msg = ("Unsupported raid level. Use one of: {}.").format( self.RAID_LEVELS) handle_exception(Exception(e_msg), request) # consolidated raid0 & raid 1 disk check if raid_level in self.RAID_LEVELS[1:3] and len(disks) <= 1: e_msg = ( "At least 2 disks are required for the raid level: {}." ).format(raid_level) handle_exception(Exception(e_msg), request) if raid_level == self.RAID_LEVELS[3]: if len(disks) < 4: e_msg = ( "A minimum of 4 drives are required for the raid level: {}." ).format(raid_level) handle_exception(Exception(e_msg), request) if raid_level == self.RAID_LEVELS[4] and len(disks) < 2: e_msg = ("2 or more disks are required for the raid level: {}." ).format(raid_level) handle_exception(Exception(e_msg), request) if raid_level == self.RAID_LEVELS[5] and len(disks) < 3: e_msg = ("3 or more disks are required for the raid level: {}." ).format(raid_level) handle_exception(Exception(e_msg), request) compression = self._validate_compression(request) mnt_options = self._validate_mnt_options(request) dnames = self._role_filter_disk_names(disks, request) p = Pool( name=pname, raid=raid_level, compression=compression, mnt_options=mnt_options, ) p.save() p.disk_set.add(*disks) # added for loop to save disks appears p.disk_set.add(*disks) was # not saving disks in test environment for d in disks: d.pool = p d.save() add_pool(p, dnames) p.size = p.usage_bound() p.uuid = btrfs_uuid(dnames[0]) p.save() # Now we ensure udev info is updated via system wide trigger # as per pool resize add, only here it is for a new pool. trigger_udev_update() return Response(PoolInfoSerializer(p).data)
def post(self, request): """ input is a list of disks, raid_level and name of the pool. """ with self._handle_exception(request): disks = [self._validate_disk(d, request) for d in request.data.get('disks')] pname = request.data['pname'] if (re.match('%s$' % settings.POOL_REGEX, pname) is None): e_msg = ('Pool name must start with a alphanumeric(a-z0-9) ' 'character and can be followed by any of the ' 'following characters: letter(a-z), digits(0-9), ' 'hyphen(-), underscore(_) or a period(.).') handle_exception(Exception(e_msg), request) if (len(pname) > 255): e_msg = ('Pool name must be less than 255 characters') handle_exception(Exception(e_msg), request) if (Pool.objects.filter(name=pname).exists()): e_msg = ('Pool(%s) already exists. Choose a different name' % pname) handle_exception(Exception(e_msg), request) if (Share.objects.filter(name=pname).exists()): e_msg = ('A Share with this name(%s) exists. Pool and Share names ' 'must be distinct. Choose a different name' % pname) handle_exception(Exception(e_msg), request) for d in disks: if (d.btrfs_uuid is not None): e_msg = ('Another BTRFS filesystem exists on this ' 'disk(%s). Erase the disk and try again.' % d.name) handle_exception(Exception(e_msg), request) raid_level = request.data['raid_level'] if (raid_level not in self.RAID_LEVELS): e_msg = ('Unsupported raid level. use one of: {}'.format(self.RAID_LEVELS)) handle_exception(Exception(e_msg), request) # consolidated raid0 & raid 1 disk check if (raid_level in self.RAID_LEVELS[1:3] and len(disks) <= 1): e_msg = ('At least two disks are required for the raid level: ' '%s' % raid_level) handle_exception(Exception(e_msg), request) if (raid_level == self.RAID_LEVELS[3]): if (len(disks) < 4): e_msg = ('A minimum of Four drives are required for the ' 'raid level: %s' % raid_level) handle_exception(Exception(e_msg), request) if (raid_level == self.RAID_LEVELS[4] and len(disks) < 2): e_msg = ('Two or more disks are required for the raid ' 'level: %s' % raid_level) handle_exception(Exception(e_msg), request) if (raid_level == self.RAID_LEVELS[5] and len(disks) < 3): e_msg = ('Three or more disks are required for the raid ' 'level: %s' % raid_level) handle_exception(Exception(e_msg), request) compression = self._validate_compression(request) mnt_options = self._validate_mnt_options(request) dnames = [d.name for d in disks] p = Pool(name=pname, raid=raid_level, compression=compression, mnt_options=mnt_options) p.disk_set.add(*disks) p.save() # added for loop to save disks # appears p.disk_set.add(*disks) was not saving disks in test environment for d in disks: d.pool = p d.save() add_pool(p, dnames) p.size = pool_usage(mount_root(p))[0] p.uuid = btrfs_uuid(dnames[0]) p.save() return Response(PoolInfoSerializer(p).data)
def post(self, request): """ input is a list of disks, raid_level and name of the pool. """ with self._handle_exception(request): disks = [ self._validate_disk(d, request) for d in request.data.get('disks') ] pname = request.data['pname'] if (re.match('%s$' % settings.POOL_REGEX, pname) is None): e_msg = ('Invalid characters in Pool name. Following ' 'characters are allowed: letter(a-z or A-Z), ' 'digit(0-9), ' 'hyphen(-), underscore(_) or a period(.).') handle_exception(Exception(e_msg), request) if (len(pname) > 255): e_msg = ('Pool name must be less than 255 characters') handle_exception(Exception(e_msg), request) if (Pool.objects.filter(name=pname).exists()): e_msg = ('Pool(%s) already exists. Choose a different name' % pname) handle_exception(Exception(e_msg), request) if (Share.objects.filter(name=pname).exists()): e_msg = ('A Share with this name(%s) exists. Pool and Share ' 'names ' 'must be distinct. Choose a different name' % pname) handle_exception(Exception(e_msg), request) for d in disks: if (d.btrfs_uuid is not None): e_msg = ('Another BTRFS filesystem exists on this ' 'disk(%s). Erase the disk and try again.' % d.name) handle_exception(Exception(e_msg), request) raid_level = request.data['raid_level'] if (raid_level not in self.RAID_LEVELS): e_msg = ('Unsupported raid level. use one of: {}'.format( self.RAID_LEVELS)) handle_exception(Exception(e_msg), request) # consolidated raid0 & raid 1 disk check if (raid_level in self.RAID_LEVELS[1:3] and len(disks) <= 1): e_msg = ('At least two disks are required for the raid level: ' '%s' % raid_level) handle_exception(Exception(e_msg), request) if (raid_level == self.RAID_LEVELS[3]): if (len(disks) < 4): e_msg = ('A minimum of Four drives are required for the ' 'raid level: %s' % raid_level) handle_exception(Exception(e_msg), request) if (raid_level == self.RAID_LEVELS[4] and len(disks) < 2): e_msg = ('Two or more disks are required for the raid ' 'level: %s' % raid_level) handle_exception(Exception(e_msg), request) if (raid_level == self.RAID_LEVELS[5] and len(disks) < 3): e_msg = ('Three or more disks are required for the raid ' 'level: %s' % raid_level) handle_exception(Exception(e_msg), request) compression = self._validate_compression(request) mnt_options = self._validate_mnt_options(request) dnames = self._role_filter_disk_names(disks, request) p = Pool(name=pname, raid=raid_level, compression=compression, mnt_options=mnt_options) p.save() p.disk_set.add(*disks) # added for loop to save disks appears p.disk_set.add(*disks) was # not saving disks in test environment for d in disks: d.pool = p d.save() add_pool(p, dnames) p.size = p.usage_bound() p.uuid = btrfs_uuid(dnames[0]) p.save() # Now we ensure udev info is updated via system wide trigger # as per pool resize add, only here it is for a new pool. trigger_udev_update() return Response(PoolInfoSerializer(p).data)
def post(self, request): """ input is a list of disks, raid_level and name of the pool. """ with self._handle_exception(request): disks = [self._validate_disk(d, request) for d in request.data.get('disks')] pname = request.data['pname'] if (re.match('%s$' % settings.POOL_REGEX, pname) is None): e_msg = ('Invalid characters in pool name. Following ' 'characters are allowed: letter(a-z or A-Z), ' 'digit(0-9), ' 'hyphen(-), underscore(_) or a period(.).') handle_exception(Exception(e_msg), request) if (len(pname) > 255): e_msg = 'Pool name must be less than 255 characters.' handle_exception(Exception(e_msg), request) if (Pool.objects.filter(name=pname).exists()): e_msg = ('Pool ({}) already exists. ' 'Choose a different name.').format(pname) handle_exception(Exception(e_msg), request) if (Share.objects.filter(name=pname).exists()): e_msg = ('A share with this name ({}) exists. Pool and share ' 'names must be distinct. ' 'Choose a different name.').format(pname) handle_exception(Exception(e_msg), request) for d in disks: if (d.btrfs_uuid is not None): e_msg = ('Another BTRFS filesystem exists on this ' 'disk ({}). ' 'Erase the disk and try again.').format(d.name) handle_exception(Exception(e_msg), request) raid_level = request.data['raid_level'] if (raid_level not in self.RAID_LEVELS): e_msg = ('Unsupported raid level. Use one of: ' '{}.').format(self.RAID_LEVELS) handle_exception(Exception(e_msg), request) # consolidated raid0 & raid 1 disk check if (raid_level in self.RAID_LEVELS[1:3] and len(disks) <= 1): e_msg = ('At least 2 disks are required for the raid level: ' '{}.').format(raid_level) handle_exception(Exception(e_msg), request) if (raid_level == self.RAID_LEVELS[3]): if (len(disks) < 4): e_msg = ('A minimum of 4 drives are required for the ' 'raid level: {}.').format(raid_level) handle_exception(Exception(e_msg), request) if (raid_level == self.RAID_LEVELS[4] and len(disks) < 2): e_msg = ('2 or more disks are required for the raid ' 'level: {}.').format(raid_level) handle_exception(Exception(e_msg), request) if (raid_level == self.RAID_LEVELS[5] and len(disks) < 3): e_msg = ('3 or more disks are required for the raid ' 'level: {}.').format(raid_level) handle_exception(Exception(e_msg), request) compression = self._validate_compression(request) mnt_options = self._validate_mnt_options(request) dnames = self._role_filter_disk_names(disks, request) p = Pool(name=pname, raid=raid_level, compression=compression, mnt_options=mnt_options) p.save() p.disk_set.add(*disks) # added for loop to save disks appears p.disk_set.add(*disks) was # not saving disks in test environment for d in disks: d.pool = p d.save() add_pool(p, dnames) p.size = p.usage_bound() p.uuid = btrfs_uuid(dnames[0]) p.save() # Now we ensure udev info is updated via system wide trigger # as per pool resize add, only here it is for a new pool. trigger_udev_update() return Response(PoolInfoSerializer(p).data)
def post(self, request): """ input is a list of disks, raid_level and name of the pool. """ with self._handle_exception(request): disks = [self._validate_disk(d, request) for d in request.data.get("disks")] pname = request.data["pname"] if re.match("%s$" % settings.POOL_REGEX, pname) is None: e_msg = ( "Pool name must start with a alphanumeric(a-z0-9) " "character and can be followed by any of the " "following characters: letter(a-z), digits(0-9), " "hyphen(-), underscore(_) or a period(.)." ) handle_exception(Exception(e_msg), request) if Pool.objects.filter(name=pname).exists(): e_msg = "Pool(%s) already exists. Choose a different name" % pname handle_exception(Exception(e_msg), request) if Share.objects.filter(name=pname).exists(): e_msg = ( "A Share with this name(%s) exists. Pool and Share names " "must be distinct. Choose a different name" % pname ) handle_exception(Exception(e_msg), request) for d in disks: if d.btrfs_uuid is not None: e_msg = ( "Another BTRFS filesystem exists on this " "disk(%s). Erase the disk and try again." % d.name ) handle_exception(Exception(e_msg), request) raid_level = request.data["raid_level"] if raid_level not in self.RAID_LEVELS: e_msg = "Unsupported raid level. use one of: {}".format(self.RAID_LEVELS) handle_exception(Exception(e_msg), request) # consolidated raid0 & raid 1 disk check if raid_level in self.RAID_LEVELS[1:3] and len(disks) <= 1: e_msg = "At least two disks are required for the raid level: " "%s" % raid_level handle_exception(Exception(e_msg), request) if raid_level == self.RAID_LEVELS[3]: if len(disks) < 4: e_msg = "A minimum of Four drives are required for the " "raid level: %s" % raid_level handle_exception(Exception(e_msg), request) if raid_level == self.RAID_LEVELS[4] and len(disks) < 2: e_msg = "Two or more disks are required for the raid " "level: %s" % raid_level handle_exception(Exception(e_msg), request) if raid_level == self.RAID_LEVELS[5] and len(disks) < 3: e_msg = "Three or more disks are required for the raid " "level: %s" % raid_level handle_exception(Exception(e_msg), request) compression = self._validate_compression(request) mnt_options = self._validate_mnt_options(request) dnames = [d.name for d in disks] p = Pool(name=pname, raid=raid_level, compression=compression, mnt_options=mnt_options) add_pool(p, dnames) p.size = pool_usage(mount_root(p, dnames[0]))[0] p.uuid = btrfs_uuid(dnames[0]) p.disk_set.add(*disks) p.save() # added for loop to save disks # appears p.disk_set.add(*disks) was not saving disks in test environment for d in disks: d.pool = p d.save() return Response(PoolInfoSerializer(p).data)
def post(self, request): """ input is a list of disks, raid_level and name of the pool. """ with self._handle_exception(request): disks = [ self._validate_disk(d, request) for d in request.data.get('disks') ] pname = request.data['pname'] if (re.match('%s$' % settings.POOL_REGEX, pname) is None): e_msg = ('Pool name must start with a alphanumeric(a-z0-9) ' 'character and can be followed by any of the ' 'following characters: letter(a-z), digits(0-9), ' 'hyphen(-), underscore(_) or a period(.).') handle_exception(Exception(e_msg), request) if (Pool.objects.filter(name=pname).exists()): e_msg = ('Pool(%s) already exists. Choose a different name' % pname) handle_exception(Exception(e_msg), request) if (Share.objects.filter(name=pname).exists()): e_msg = ( 'A Share with this name(%s) exists. Pool and Share names ' 'must be distinct. Choose a different name' % pname) handle_exception(Exception(e_msg), request) for d in disks: if (d.btrfs_uuid is not None): e_msg = ('Another BTRFS filesystem exists on this ' 'disk(%s). Erase the disk and try again.' % d.name) handle_exception(Exception(e_msg), request) raid_level = request.data['raid_level'] if (raid_level not in self.RAID_LEVELS): e_msg = ('Unsupported raid level. use one of: {}'.format( self.RAID_LEVELS)) handle_exception(Exception(e_msg), request) # consolidated raid0 & raid 1 disk check if (raid_level in self.RAID_LEVELS[1:3] and len(disks) <= 1): e_msg = ('At least two disks are required for the raid level: ' '%s' % raid_level) handle_exception(Exception(e_msg), request) if (raid_level == self.RAID_LEVELS[3]): if (len(disks) < 4): e_msg = ('A minimum of Four drives are required for the ' 'raid level: %s' % raid_level) handle_exception(Exception(e_msg), request) if (raid_level == self.RAID_LEVELS[4] and len(disks) < 2): e_msg = ('Two or more disks are required for the raid ' 'level: %s' % raid_level) handle_exception(Exception(e_msg), request) if (raid_level == self.RAID_LEVELS[5] and len(disks) < 3): e_msg = ('Three or more disks are required for the raid ' 'level: %s' % raid_level) handle_exception(Exception(e_msg), request) compression = self._validate_compression(request) mnt_options = self._validate_mnt_options(request) dnames = [d.name for d in disks] p = Pool(name=pname, raid=raid_level, compression=compression, mnt_options=mnt_options) add_pool(p, dnames) p.size = pool_usage(mount_root(p, dnames[0]))[0] p.uuid = btrfs_uuid(dnames[0]) p.disk_set.add(*disks) p.save() # added for loop to save disks # appears p.disk_set.add(*disks) was not saving disks in test environment for d in disks: d.pool = p d.save() return Response(PoolInfoSerializer(p).data)
def post(self, request): """ input is a list of disks, raid_level and name of the pool. """ with self._handle_exception(request): disks = [self._validate_disk(d, request) for d in request.DATA.get('disks')] pname = request.DATA['pname'] if (re.match('%s$' % settings.POOL_REGEX, pname) is None): e_msg = ('Pool name must start with a letter(a-z) and can' ' be followed by any of the following characters: ' 'letter(a-z), digits(0-9), hyphen(-), underscore' '(_) or a period(.).') handle_exception(Exception(e_msg), request) if (Pool.objects.filter(name=pname).exists()): e_msg = ('Pool with name: %s already exists.' % pname) handle_exception(Exception(e_msg), request) for d in disks: if (d.btrfs_uuid is not None): e_msg = ('Another BTRFS filesystem exists on this ' 'disk(%s). Erase the disk and try again.' % d.name) handle_exception(Exception(e_msg), request) raid_level = request.DATA['raid_level'] if (raid_level not in self.RAID_LEVELS): e_msg = ('Unsupported raid level. use one of: %s' % self.RAID_LEVELS) handle_exception(Exception(e_msg), request) if (raid_level == self.RAID_LEVELS[0] and len(disks) != 1): e_msg = ('Exactly one disk is required for the raid level: ' '%s' % raid_level) handle_exception(Exception(e_msg), request) if (raid_level == self.RAID_LEVELS[1] and len(disks) == 1): e_msg = ('More than one disk is required for the raid ' 'level: %s' % raid_level) handle_exception(Exception(e_msg), request) if (raid_level == self.RAID_LEVELS[2] and len(disks) != 2): e_msg = ('Exactly two disks are required for the raid level: ' '%s' % raid_level) handle_exception(Exception(e_msg), request) if (raid_level == self.RAID_LEVELS[3]): if (len(disks) < 4): e_msg = ('A minimum of Four drives are required for the ' 'raid level: %s' % raid_level) handle_exception(Exception(e_msg), request) elif (len(disks) % 2 != 0): e_msg = ('Even number of drives are required for the ' 'raid level: %s' % raid_level) handle_exception(Exception(e_msg), request) if (raid_level == self.RAID_LEVELS[4] and len(disks) < 3): e_msg = ('Three or more disks are required for the raid ' 'level: %s' % raid_level) handle_exception(Exception(e_msg), request) if (raid_level == self.RAID_LEVELS[5] and len(disks) < 4): e_msg = ('Four or more disks are required for the raid ' 'level: %s' % raid_level) handle_exception(Exception(e_msg), request) dnames = [d.name for d in disks] pool_size = self._pool_size(dnames, raid_level) add_pool(pname, raid_level, raid_level, dnames) pool_uuid = btrfs_uuid(dnames[0]) p = Pool(name=pname, raid=raid_level, size=pool_size, uuid=pool_uuid) p.save() p.disk_set.add(*disks) return Response(PoolInfoSerializer(p).data)