home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / root / usr / share / YaST2 / clients / inst_lvm_lv.ycp < prev    next >
Text File  |  2006-11-29  |  7KB  |  286 lines

  1. /*
  2.  * File:
  3.  *   lvm_lv.ycp
  4.  *
  5.  * Module:
  6.  *
  7.  * Summary:
  8.  * main for lvm-configs logical volume management
  9.  *
  10.  * Authors:
  11.  *   mike <mike@suse.de>
  12.  *
  13.  * $Id: inst_lvm_lv.ycp 33002 2006-09-20 10:28:09Z fehr $
  14.  *
  15.  *
  16.  *----------------------------------------------------
  17.  * IMPORTANT: when you read this code notice:
  18.  *
  19.  * vg  = volume group
  20.  * vgs = volume groups
  21.  *
  22.  * pv  = physical volume
  23.  * pvs = physical volumes
  24.  *
  25.  * lv  = logical volume
  26.  * lvs = logical volumes
  27.  *----------------------------------------------------
  28.  *
  29.  */
  30.  
  31. {
  32.  
  33.  
  34.  
  35.     textdomain "storage";
  36.  
  37.     import "Mode";
  38.     import "Storage";
  39.     import "Wizard";
  40.     import "FileSystems";
  41.  
  42.     include "partitioning/lvm_lib.ycp";
  43.     include "partitioning/lvm_lv_lib.ycp";
  44.     include "partitioning/lvm_ui_dialogs.ycp";
  45.     include "partitioning/custom_part_check_generated.ycp";
  46.  
  47.  
  48.  
  49.     string  current_vg = "none";
  50.     string  vg_key = "";
  51.     integer pesize = 4*1024*1024;
  52.  
  53.     boolean test_mode                = Mode::test ();
  54.     map<string,map> targetMap            = Storage::GetTargetMap();
  55.     map<integer,map> modify_targets       = $[];
  56.     boolean view_all_mnts            = Storage::GetLvmViewAllMnt();
  57.  
  58.     ////////////////////////////////////////////////
  59.     // Testmode, should be commented in release
  60.     // test_mode   = true;
  61.     // test_mode   = false;
  62.     ////////////////////////////////////////////////
  63.  
  64.  
  65.     // supported filesystems -> inst_disk.ycp > global
  66.  
  67.     list lvm_vgs = get_vgs( targetMap );
  68.     list<map> parts = [];
  69.     list table = [];
  70.  
  71.     if( size(lvm_vgs)<=0 )
  72.     return( `next );
  73.  
  74.     // heading text
  75.     Wizard::SetContents( _("Logical Volume Manager: Logical Volumes"),
  76.              get_lv_content( [], lvm_vgs, "------------", view_all_mnts),
  77.              "", true, true);
  78.     Wizard::SetHelpText( getLvHelptext() );
  79.  
  80.  
  81.  
  82.     //////////////////////////////////////////////////////////////////////
  83.     // First we typically have to create a volumegroup
  84.     // check if there is already a lvm group
  85.     //////////////////////////////////////////////////////////////////////
  86.  
  87.     // Display current vg:
  88.     current_vg = lvm_vgs[0]:"";
  89.     vg_key = "/dev/" + current_vg;
  90.     pesize = targetMap[vg_key,"cyl_size"]:(4*1024*1024);
  91.     new_vg_list( lvm_vgs );
  92.     UI::ChangeWidget( `id(`vg), `Value, current_vg);
  93.  
  94.  
  95.     any vg = nil;
  96.  
  97.  
  98.     //////////////////////////////////////////////////////////////////////
  99.     // mainloop
  100.     //////////////////////////////////////////////////////////////////////
  101.  
  102.     string  id          =  "";
  103.     symbol  ret         = `next;
  104.     integer max_size    = 0;
  105.     integer used_size   = 0;
  106.     list    size_list   = [];
  107.     string  vg_size_str = "";
  108.  
  109.     repeat
  110.     {
  111.  
  112.     /////////////////////////////////////////////////////////////////
  113.     // Show the current state:
  114.  
  115.     targetMap = Storage::GetTargetMap();
  116.     parts = get_lvs_and_mounted_partitions( targetMap, view_all_mnts, 
  117.                                             current_vg );
  118.     y2milestone( "parts=%1", parts );
  119.     table = get_lv_widget_table( parts );
  120.     y2milestone( "table=%1", table );
  121.     UI::ChangeWidget( `id(`lv_table), `Items, table);
  122.  
  123.     size_list = get_lv_size_info( targetMap, current_vg );
  124.     max_size  = size_list[1]:0;
  125.     used_size = size_list[0]:0;
  126.     y2debug( "list=%3, max_size=%1 used_size=%2", max_size, used_size, size_list );
  127.     vg_size_str = ByteToHumanStringWithZero( max_size );
  128.  
  129.     if( UI::HasSpecialWidget( `BarGraph ))
  130.        {
  131.        UI::ChangeWidget( `id(`vg_size), `Labels,
  132.                  [
  133.                   sformat( "used\n%1", ByteToHumanStringWithZero(used_size)),
  134.                   sformat( "free\n%1", ByteToHumanStringWithZero(max_size))
  135.                  ] );
  136.        UI::ChangeWidget( `id(`vg_size), `Values, [ used_size / 1048576, max_size / 1048576 ] );
  137.        UI::RecalcLayout();
  138.        }
  139.     else
  140.        {
  141.        UI::ChangeWidget( `id(`vg_size), `Value, vg_size_str);
  142.        }
  143.  
  144.  
  145.     if( id != "" && id != nil )
  146.         {
  147.         UI::ChangeWidget( `id(`lv_table), `CurrentItem, id);
  148.         }
  149.  
  150.  
  151.         /////////////////////////////////////////////////////////////////
  152.         // Wait for User input
  153.     ret = (symbol)Wizard::UserInput();
  154.     y2milestone("USERINPUT ret %1", ret );
  155.  
  156.  
  157.     ////////////////////////////////////////
  158.     // user has changed the current volume group
  159.     ////////////////////////////////////////
  160.  
  161.     if ( ret == `vg )
  162.         {
  163.         current_vg = (string)UI::QueryWidget( `id(`vg), `Value);
  164.         vg_key = "/dev/" + current_vg;
  165.         pesize = targetMap[vg_key,"cyl_size"]:(4*1024*1024);
  166.         }
  167.  
  168.     if( ret == `viewmnt )
  169.         {
  170.         view_all_mnts = (boolean)UI::QueryWidget(`id(`viewmnt), `Value);
  171.         }
  172.  
  173.  
  174.     ////////////////////////////////////////
  175.     // Add a new logical volume:
  176.     ////////////////////////////////////////
  177.     if( ret == `lv_add )
  178.         {
  179.         if( max_size<pesize )
  180.         {
  181.         // popup text %1 is replaced by a volume group name 
  182.         Popup::Message(sformat(_("There is no available space in volume group %1."), current_vg ));
  183.         }
  184.         else
  185.         {
  186.         map<string, any> Lv = $[
  187.                "create"        :    true,
  188.                "used_fs"    :    Partitions::DefaultFs(),
  189.                "type"           :       `lvm,
  190.                "size_k"         :       max_size/4/pesize*pesize/1024,
  191.                "stripes"    :    1,
  192.                "format"        :    true,
  193.                "mount"        :       
  194.                GetMountPointProposal( targetMap , 
  195.                                       [ Partitions::BootMount() ] )
  196.             ];
  197.         if( Lv["size_k"]:0 == 0 )
  198.             {
  199.             Lv["size_k"] = max_size/pesize*pesize/1024;
  200.             }
  201.  
  202.         map createLv = DlgCreateEditLogicaVolume( `create, Lv,
  203.                               max_size, current_vg,
  204.                               get_lv_names(targetMap,current_vg),
  205.                               FileSystems::GetAllFileSystems(true,true),
  206.                               "", pesize );
  207.  
  208.         // has an error occured
  209.         if ( size(createLv)>0 )
  210.             {
  211.             addLogicalVolume( createLv, current_vg );
  212.             }
  213.         }
  214.         }
  215.  
  216.     ////////////////////////////////////////
  217.     // Edit/Resize a new logical volume:
  218.     ////////////////////////////////////////
  219.  
  220.  
  221.     if( ret == `lv_edit || ret == `lv_table )
  222.         {
  223.         id = (string)UI::QueryWidget(`id(`lv_table), `CurrentItem);
  224.         y2milestone("id %1", id);
  225.  
  226.         if( id == nil )
  227.         {
  228.         // Popup text
  229.         Popup::Error(_("No device selected.
  230. Select the device to edit.
  231. "));
  232.         }
  233.         else
  234.         {
  235.         HandleEditLv( targetMap, id );
  236.         }
  237.         }
  238.  
  239.     ////////////////////////////////////////
  240.     // Delete a new logical volume:
  241.     ////////////////////////////////////////
  242.  
  243.     if( ret == `lv_delete )
  244.         {
  245.         id = (string)UI::QueryWidget(`id(`lv_table), `CurrentItem);
  246.         if( id == nil )
  247.         {
  248.         // Popup text
  249.         Popup::Error(_("No device selected.
  250. Select the device to remove.
  251. "));
  252.         }
  253.         else
  254.         {
  255.         map Lv = Storage::GetPartition( targetMap, id );
  256.         if( !check_device_delete( Lv, false, Stage::initial()))
  257.             {
  258.             ret = `again;
  259.             continue;
  260.             }
  261.         else
  262.             HandleRemoveLv( targetMap, id );
  263.         }
  264.         }
  265.  
  266.  
  267.     ////////////////////////////////////////
  268.     // Finish this step
  269.     ////////////////////////////////////////
  270.  
  271.     if( ret == `next || ret == `back )
  272.         {
  273.         Storage::SetLvmViewAllMnt( view_all_mnts );
  274.         }
  275.  
  276.     } until (ret == `next || ret == `back || ret == `cancel || ret == `abort );
  277.  
  278.  
  279.     SCR::Write( .target.ycp, Storage::SaveDumpPath("targetMap_l"), targetMap );
  280.  
  281.     return ret;
  282. }
  283.  
  284.  
  285. // end
  286.