ACC SHELL

Path : /usr/share/YaST2/include/partitioning/
File Upload :
Current File : //usr/share/YaST2/include/partitioning/ep-raid-lib.ycp

/**
 * File:	ep-raid-lib.ycp
 * Package:	yast2-storage
 * Summary:	Expert Partitioner
 * Authors:	Arvin Schnell <aschnell@suse.de>
 *
 * This file must only be included in other Expert Partitioner files ("ep-*.ycp").
 */
{
    textdomain "storage";


    boolean AddDevices(integer raid_nr, list<string> devs)
    {
	boolean ret = true;

	foreach(string dev, devs, {
	    Storage::SetPartitionId(dev, Partitions::fsid_raid);
	    Storage::SetPartitionFormat(dev, false, `none);
	    if (!Storage::ExtendMd(raid_nr, dev))
		ret = false;
	});

	return ret;
    }


    boolean RemoveDevices(integer raid_nr, list<string> devs)
    {
	boolean ret = true;

	foreach(string dev, devs, {
	    Storage::UnchangePartitionId(dev);
	    if (!Storage::ShrinkMd(raid_nr, dev))
		ret = false;
	});

	return ret;
    }


    void EpCreateRaid()
    {
	map<string, map> target_map = Storage::GetTargetMap();
	list<map> unused_devices = filter(map dev, get_possible_rds(target_map), { return isempty(dev["used_by"]:[]); });

	if (size(unused_devices) < 2)
	{
	    // error popup
	    Popup::Error(_("There are not enough suitable unused devices to create a RAID."));
	    return;
	}

	map<string, any> data = $[ "new" : true,
				   "create" : true ];

	map r = Storage::NextMd();
	data["device"] = r["device"]:"";
	data["nr"] = r["nr"]:0;

	if (DlgCreateRaidNew(data))
	{
	    integer nr = data["nr"]:0;
	    symbol raid_type = tosymbol(data["raid_type"]:"raid0");

	    if (Storage::CreateMdWithDevs(nr, raid_type, []))
	    {
		list<string> devices = data["devices"]:[];
		AddDevices(nr, devices);

		integer chunk_size_k = data["chunk_size_k"]:4;
		Storage::ChangeMdChunk(nr, chunk_size_k);

		if (raid_type == `raid5) {
		    symbol parity_algorithm = data["parity_algorithm"]:`left_asymmetric;
		    Storage::ChangeMdParitySymbol(nr, parity_algorithm);
		}

		Storage::ChangeVolumeProperties(data);

		UpdateMainStatus();
		UpdateNavigationTree(nil);
		TreePanel::Create();
		UpdateTableFocus(data["device"]:"error");
	    }
	}
    }


    void EpEditRaid(string device)
    {
	if (device == nil)
	{
	    // error popup
	    Popup::Error(_("No RAID selected."));
	    return;
	}

	map<string, map> target_map = Storage::GetTargetMap();
	map<string, any> data = Storage::GetPartition(target_map, device);

	if (!isempty(data["used_by"]:[]))
	{
	    // error popup, %1 is replaced by device name e.g. /dev/md1
	    Popup::Error(sformat(_("The RAID %1 is in use. It cannot be
edited. To edit %1, make sure it is not used."), device));
	    return;
	}

	if (DlgEditRaid(data))
	{
	    Storage::ChangeVolumeProperties(data);

	    UpdateMainStatus();
	    UpdateNavigationTree(nil);
	    TreePanel::Create();
	    UpdateTableFocus(device);
	}
    }


    void EpResizeRaid(string device)
    {
	if (device == nil)
	{
	    // error popup
	    Popup::Error(_("No RAID selected."));
	    return;
	}

	map<string, map> target_map = Storage::GetTargetMap();
	map<string, any> data = Storage::GetPartition(target_map, device);

	if (!data["create"]:false)
	{
	    // error popup, %1 is replaced by device name e.g. /dev/md1
	    Popup::Error(sformat(_("The RAID %1 is already created on disk. It cannot be
resized. To resize %1, remove it and create it again."), device));
	    return;
	}

	if (!isempty(data["used_by"]:[]))
	{
	    // error popup, %1 is replaced by device name e.g. /dev/md1
	    Popup::Error(sformat(_("The RAID %1 is in use. It cannot be
resized. To resize %1, make sure it is not used."), device));
	    return;
	}

	if (DlgResizeRaid(data))
	{
	    integer raid_nr = data["nr"]:0;

	    list<string> devices_old = data["devices"]:[];
	    list<string> devices_new = data["devices_new"]:[];

	    list<string> devices_added = AddedToList(devices_old, devices_new);
	    list<string> devices_removed = RemovedFromList(devices_old, devices_new);

	    if (size(devices_added) > 0 || size(devices_removed) > 0)
	    {
		AddDevices(raid_nr, devices_added);

		if (!RemoveDevices(raid_nr, devices_removed))
		{
		    // error popup
		    Popup::Error(_("Failed to remove some devices."));
		}

		UpdateMainStatus();
		UpdateNavigationTree(nil);
		TreePanel::Create();
	    }
	}
    }


    void EpDeleteRaid(string device)
    {
	if (device == nil)
	{
	    // error popup
	    Popup::Error(_("No RAID selected."));
	    return;
	}

	if (EpDeleteDevice(device))
	{
	    any new_focus = nil;
	    if (UI::QueryWidget(`tree, `CurrentItem) == device)
		new_focus = `md;

	    UpdateMainStatus();
	    UpdateNavigationTree(new_focus);
	    TreePanel::Create();
	}
    }
}

ACC SHELL 2018