items/zfs_pool: support raidz2 and raidz3

This commit is contained in:
Franzi 2020-11-13 11:24:30 +01:00
parent 05e8d83ebf
commit 59c1cb8551
Signed by: kunsi
GPG key ID: 12E3D2136B818350

View file

@ -18,12 +18,12 @@ def create_mirrors(node, path, mirrors):
node.run("zfs unmount {}".format(quote(path))) node.run("zfs unmount {}".format(quote(path)))
def create_raidz(node, path, devices): def create_raidz(node, path, devices, raid='raidz'):
cmd = "" cmd = ""
actual_targets = [] actual_targets = []
for device in devices: for device in devices:
actual_targets.append(quote(prepare_blockdevice(node, device))) actual_targets.append(quote(prepare_blockdevice(node, device)))
cmd += "raidz {} ".format(" ".join(actual_targets)) cmd += "{} {} ".format(raid, " ".join(actual_targets))
node.run("zpool create {} {}".format(quote(path), cmd)) node.run("zpool create {} {}".format(quote(path), cmd))
node.run("zfs unmount {}".format(quote(path))) node.run("zfs unmount {}".format(quote(path)))
@ -95,6 +95,8 @@ class ZFSPool(Item):
'device': None, 'device': None,
'mirrors': None, 'mirrors': None,
'raidz': None, 'raidz': None,
'raidz2': None,
'raidz3': None,
} }
ITEM_TYPE_NAME = "zfs_pool" ITEM_TYPE_NAME = "zfs_pool"
@ -129,6 +131,10 @@ class ZFSPool(Item):
create_mirrors(self.node, self.name, self.attributes['mirrors']) create_mirrors(self.node, self.name, self.attributes['mirrors'])
elif self.attributes['raidz'] is not None: elif self.attributes['raidz'] is not None:
create_raidz(self.node, self.name, self.attributes['raidz']) create_raidz(self.node, self.name, self.attributes['raidz'])
elif self.attributes['raidz2'] is not None:
create_raidz(self.node, self.name, self.attributes['raidz'], 'raidz2')
elif self.attributes['raidz2'] is not None:
create_raidz(self.node, self.name, self.attributes['raidz'], 'raidz3')
def sdict(self): def sdict(self):
# We don't care about the device if the pool already exists. # We don't care about the device if the pool already exists.
@ -168,13 +174,13 @@ class ZFSPool(Item):
@classmethod @classmethod
def validate_attributes(cls, bundle, item_id, attributes): def validate_attributes(cls, bundle, item_id, attributes):
device_config = [] device_config = []
for key in ('device', 'mirrors', 'raidz'): for key in ('device', 'mirrors', 'raidz', 'raidz2', 'raidz3'):
device_config.append(attributes.get(key)) device_config.append(attributes.get(key))
device_config = [key for key in device_config if key is not None] device_config = [key for key in device_config if key is not None]
if len(device_config) != 1: if len(device_config) != 1:
raise BundleError(_( raise BundleError(_(
"{item} on node {node} must have exactly one of " "{item} on node {node} must have exactly one of "
"'device', 'mirrors', or 'raidz'" "'device', 'mirrors', 'raidz', 'raidz2' or 'raidz3'"
).format( ).format(
item=item_id, item=item_id,
node=bundle.node.name, node=bundle.node.name,