ACC SHELL

Path : /usr/share/YaST2/include/partitioning/
File Upload :
Current File : //usr/share/YaST2/include/partitioning/lvm_pv_lib.ycp

/**
 * File:
 *   lvm_pv_lib.ycp
 *
 * Module: 
 *    configuration of lvm: lib for handling of physical volumes
 *
 * Summary:
 *
 * Authors:
 *   mike <mike@suse.de>
 *
 *
 * $Id: lvm_pv_lib.ycp 57501 2009-06-08 13:57:35Z aschnell $
 *
 */


{
     textdomain "storage";
     import "Storage";
     import "Partitions";

     include "partitioning/lvm_lib.ycp";
     include "partitioning/lvm_lv_lib.ycp";
     
    //////////////////////////////////////////////////////////////////////
    // add a partition to the current volume group
    //
    // 	   $[ 1 : $[  "use_module" : "lvm_ll"
    // 		      "type"       : "create_pv",
    // 		      "vgname"     : "system"     -- optional, wenn da dann vgextend nach pvcreate
    // 		      "device"     : "/dev/sda1"
    //
    //   !!!!!!! changes targetMap by reference !!!!!!
    // 	
    //////////////////////////////////////////////////////////////////////

// used by autoyast
define boolean addPhysicalVolume( map<string,map> targetMap, string id, 
				  string current_vg )
    ``{
    map partition = Storage::GetPartition( targetMap, id );
    y2milestone( "partition %1", partition );
    
    if( partition["fsid"]:0 != Partitions::fsid_lvm && 
        contains( [`primary, `logical], partition["type"]:`none ) )
	{
	Storage::SetPartitionId( id, Partitions::fsid_lvm );
	}
    Storage::SetPartitionMount( id, "" );
    Storage::SetPartitionFormat( id, false, `none );
    boolean ret = Storage::ExtendLvmVg( current_vg, id );
    return( ret );
    };


/////////////////////////////////////////////////////////////////
// Get all partitions, we can probably use as physical volumes
// Add needed information: disksize 
define list<map> get_possible_pvs( map<string,map> targetMap )
    ``{
    list<map> ret = [];
	
    //////////////////////////////////////////////////////////////////////
    // add the devicename i.e /dev/hda1 or /dev/system/usr to partition list
    // and the device key  <subdevice>/<maindevice> i.e. 1//dev/hda
    
    targetMap = mapmap( string dev, map devmap, targetMap,
	``{
	list partitions = maplist( map part, devmap["partitions"]:[],
	    ``{
	    part["maindev"] = dev;
	    return( part );
	    });
	return( $[ dev: add(devmap, "partitions", partitions) ] );
	});

    ////////////////////////////////////////////////////////////
    // Look for all partitions:
    // not LVM ( here I mean /dev/<lvm_volumegroup>/<lv> entries!
    //           there are only the lv's in the targetMap under /dev/<lvm_volumegroup>/<lv> !)
    // no mountpoint
    // id 0x83 or 0x8e or 0xfe

    list types_no = [ `lvm, `extended ];
    list fsids = [ Partitions::fsid_lvm, Partitions::fsid_raid,
		   Partitions::fsid_native ];
    list ubs = [ `UB_NONE, `UB_LVM ];
    list allowed_enc_types = [ `none, `luks ];

    foreach( string dev, map devmap, targetMap,
	``{
	y2milestone( "get_possible_pvs parts:%1", devmap["partitions"]:[] );
	list<map> parts = 
	    filter( map part, devmap["partitions"]:[],
		    ``( size(part["mount"]:"")==0 &&
			!contains( types_no, part["type"]:`primary ) &&
			contains(allowed_enc_types, part["enc_type"]:`none) &&
			contains( ubs, part["used_by_type"]:`UB_NONE ) &&
			(part["type"]:`primary==`sw_raid||
			 part["type"]:`primary==`dm||
			contains( fsids, part["fsid"]:0 ))));
	y2milestone( "get_possible_pvs filter:%1", parts );
	if( devmap["used_by_type"]:`UB_NONE!=`UB_NONE )
	    {
	    parts = [];
	    y2milestone( "get_possible_pvs no parts, disk used by %1 %2",
	                 devmap["used_by_type"]:`UB_NONE, devmap["used_by_device"]:"" );
	    }
	if( size(devmap["partitions"]:[])==0 && 
	    Storage::IsPartType(devmap["type"]:`CT_UNKNOWN) &&
	    contains( ubs, devmap["used_by_type"]:`UB_NONE ))
	    {
	    map p = $[ "device":dev, "maindev":dev, 
	               "size_k":devmap["size_k"]:0 ];
	    if( devmap["used_by_type"]:`UB_NONE != `UB_NONE )
		{
		p["used_by_type"] = devmap["used_by_type"]:`UB_NONE;
		p["used_by_device"] = devmap["used_by_device"]:"";
		}
	    parts = [ p ];
	    }
	ret = (list<map>)merge( ret, parts );
	});
    y2milestone( "get_possible_pvs ret %1", ret );
    return( ret );
    };


boolean check_vgname_dev( string vgname )
    {
    boolean ret = true;
    string devdir = "/dev/" + vgname;
    map stat = (map) SCR::Read( .target.stat, devdir );
    y2milestone( "check_vgname_dev stat %1", stat );
    if( size(stat)>0 )
	{
	ret = stat["isdir"]:false;
	if( ret )
	    {
	    map out = (map)SCR::Execute( .target.bash_output, 
	                                 "find "+devdir+" ! -type l | sed 1d" );
	    ret = size(out["stdout"]:"")==0;
	    }
	}
    y2milestone( "check_vgname_dev %1 ret %2", vgname, ret );
    return( ret );
    }
}

ACC SHELL 2018