* Copyright (C) 2023 Red Hat, Inc.
* SPDX-License-Identifier: LGPL-2.1-or-later
*/
import cockpit from "cockpit";
import client from "../client";
import { mdraid_name, validate_mdraid_name, get_available_spaces, prepare_available_spaces } from "../utils.js";
import { dialog_open, TextInput, SelectOne, SelectSpaces } from "../dialog.jsx";
const _ = cockpit.gettext;
export function create_mdraid() {
function mdraid_exists(name) {
for (const p in client.mdraids) {
if (mdraid_name(client.mdraids[p]) === name)
return true;
}
return false;
}
let name;
for (let i = 0; i < 1000; i++) {
name = "raid" + i.toFixed();
if (!mdraid_exists(name))
break;
}
dialog_open({
Title: _("Create RAID device"),
Fields: [
TextInput("name", _("Name"), {
value: name,
validate: validate_mdraid_name,
}),
SelectOne("level", _("RAID level"),
{
value: "raid5",
choices: [
{
value: "raid0",
title: _("RAID 0 (stripe)")
},
{
value: "raid1",
title: _("RAID 1 (mirror)")
},
{
value: "raid4",
title: _("RAID 4 (dedicated parity)")
},
{
value: "raid5",
title: _("RAID 5 (distributed parity)")
},
{
value: "raid6",
title: _("RAID 6 (double distributed parity)")
},
{
value: "raid10",
title: _("RAID 10 (stripe of mirrors)")
}
]
}),
SelectOne("chunk", _("Chunk size"),
{
value: "512",
visible: function (vals) {
return vals.level !== "raid1";
},
choices: [
{ value: "4", title: _("4 KiB") },
{ value: "8", title: _("8 KiB") },
{ value: "16", title: _("16 KiB") },
{ value: "32", title: _("32 KiB") },
{ value: "64", title: _("64 KiB") },
{ value: "128", title: _("128 KiB") },
{ value: "512", title: _("512 KiB") },
{ value: "1024", title: _("1 MiB") },
{ value: "2048", title: _("2 MiB") }
]
}),
SelectSpaces("disks", _("Disks"),
{
empty_warning: _("No disks are available."),
validate: function (disks, vals) {
const disks_needed = vals.level === "raid6" ? 4 : 2;
if (disks.length < disks_needed)
return cockpit.format(cockpit.ngettext("At least $0 disk is needed.", "At least $0 disks are needed.", disks_needed),
disks_needed);
},
spaces: get_available_spaces()
})
],
Action: {
Title: _("Create"),
action: function (vals) {
return prepare_available_spaces(client, vals.disks).then(paths => {
return client.manager.MDRaidCreate(paths, vals.level,
vals.name, (vals.chunk || 0) * 1024,
{ });
});
}
}
});
}