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_pv.ycp < prev    next >
Text File  |  2006-11-29  |  7KB  |  291 lines

  1. /**
  2.  * File:
  3.  *   lvm_pv.ycp
  4.  *
  5.  * Module:
  6.  *   lvm_pvs
  7.  *
  8.  * Summary:
  9.  *   lvm_pv: creates a volume group (i.e. "system")
  10.  *   and adds the physical volumes 
  11.  *
  12.  * Authors:
  13.  *   mike <mike@suse.de>
  14.  *
  15.  *
  16.  *
  17.  * $Id: inst_lvm_pv.ycp 30425 2006-04-24 17:08:34Z fehr $
  18.  *
  19.  *
  20.  *----------------------------------------------------
  21.  * IMPORTANT: when you read this code notice:
  22.  *
  23.  * vg  = volume group
  24.  * vgs = volume groups
  25.  *
  26.  * pv  = physical volume
  27.  * pvs = physical volumes
  28.  *
  29.  * lv  = logical volume
  30.  * lvs = logical volumes
  31.  *----------------------------------------------------
  32.  *
  33.  */
  34.  
  35. {
  36.  
  37.     textdomain "storage"; 
  38.  
  39.     import "Installation";
  40.     import "Mode";
  41.     import "Storage";
  42.     import "Wizard";
  43.     import "Label";
  44.     
  45.     include "partitioning/lvm_ui_dialogs.ycp";
  46.     include "partitioning/lvm_ui_lib.ycp";
  47.     include "partitioning/lvm_pv_lib.ycp";
  48.     include "partitioning/lvm_lv_lib.ycp";
  49.     include "partitioning/partition_defines.ycp";
  50.  
  51.  
  52.     string  current_vg     = "none";    
  53.     boolean test_mode      = Mode::test ();
  54.     map<string,map>     targetMap      = Storage::GetTargetMap();
  55.     
  56.     list    lvm_vgs      = get_vgs( targetMap );
  57.     list<map>    parts      = get_possible_pvs( targetMap );
  58.     list    table      = get_pv_widget_table( parts );
  59.  
  60.     // heading text
  61.     Wizard::SetContents( _("Logical Volume Manager: Physical Volume Setup"),
  62.              get_pv_content( table, lvm_vgs, "_________"), 
  63.              "", true, true);
  64.     Wizard::SetHelpText( getPvHelptext() );
  65.  
  66.  
  67.     
  68.     //////////////////////////////////////////////////////////////////////
  69.     // First we typically have to create a volumegroup
  70.     // check if there is already a lvm group
  71.     //////////////////////////////////////////////////////////////////////
  72.     
  73.     if( size( lvm_vgs ) == 0 )
  74.     {
  75.         map vg = DlgCreateVolumeGroup( lvm_vgs );
  76.     map ret = addVolumeGroup(vg, targetMap, lvm_vgs );
  77.     if( !ret["cancelled"]:false )
  78.         {
  79.         targetMap = Storage::GetTargetMap();
  80.         lvm_vgs = get_vgs( targetMap );
  81.         current_vg = ret["vg"]:"";
  82.         }
  83.     else
  84.         {
  85.         return( `back );
  86.         }
  87.     }
  88.     else
  89.     {
  90.     // there are already vgs ... select the first one
  91.     current_vg = lvm_vgs[0]:"none"; 
  92.     }
  93.     
  94.     // Display current vg:
  95.     new_vg_list( lvm_vgs );
  96.     UI::ChangeWidget( `id(`vg), `Value, current_vg);
  97.     
  98.     
  99.  
  100.     //////////////////////////////////////////////////////////////////////
  101.     // mainloop
  102.     //////////////////////////////////////////////////////////////////////
  103.  
  104.     string id  =  "";
  105.     symbol ret = `next;
  106.  
  107.     repeat
  108.     {
  109.     /////////////////////////////////////////////////////////////////
  110.     // Show the current state:
  111.     parts      = get_possible_pvs( targetMap );
  112.     table      = get_pv_widget_table( parts );
  113.     UI::ChangeWidget( `id(`pv_table), `Items, table);
  114.  
  115.     if( current_vg != nil )
  116.         {
  117.         integer s = targetMap["/dev/"+current_vg,"size_k"]:0*1024;
  118.         string vg_size_str = ByteToHumanStringWithZero( s );
  119.         y2debug( "**** %1", vg_size_str );
  120.         UI::ChangeWidget( `id(`pv_size), `Value, vg_size_str );
  121.         }
  122.     
  123.  
  124.         UI::SetFocus(`id(`pv_table));
  125.  
  126.     if( id != "" )
  127.         {
  128.         UI::ChangeWidget( `id(`pv_table), `CurrentItem, id);
  129.         }
  130.  
  131.         /////////////////////////////////////////////////////////////////
  132.         // Wait for User input
  133.  
  134.  
  135.     ret = (symbol)Wizard::UserInput();
  136.     y2milestone("#################### EE %1 vg:%2", ret, current_vg);
  137.  
  138.  
  139.     ////////////////////////////////////////
  140.     // toggle between pv_add and pv_delete 
  141.     ////////////////////////////////////////
  142.  
  143.     if( ret ==  `pv_table )
  144.         {
  145.         id = (string)UI::QueryWidget(`id(`pv_table), `CurrentItem);
  146.  
  147.         if( isItemPv(targetMap,id) )
  148.         {
  149.         ret = `pv_delete;
  150.         }
  151.         else
  152.         {
  153.         ret = `pv_add;
  154.         }
  155.         }
  156.     
  157.  
  158.     ////////////////////////////////////////
  159.     // user has changed the current volume group
  160.     ////////////////////////////////////////
  161.     
  162.     if( ret == `vg )
  163.         {
  164.         current_vg = (string)UI::QueryWidget( `id(`vg), `Value);
  165.         y2milestone("TTT %1", current_vg );
  166.         }
  167.  
  168.         ////////////////////////////////////////
  169.         // Add a new volume group:
  170.         ////////////////////////////////////////
  171.  
  172.         if( ret == `vg_add_vg  )
  173.         {
  174.             map vg = DlgCreateVolumeGroup( lvm_vgs );
  175.         map ret = addVolumeGroup(vg, targetMap, lvm_vgs );
  176.             if( !ret["cancelled"]:false )
  177.         {
  178.         targetMap = Storage::GetTargetMap();
  179.         lvm_vgs = get_vgs( targetMap );
  180.         current_vg = ret["vg"]:"";
  181.         }
  182.         }
  183.  
  184.  
  185.     ////////////////////////////////////////
  186.     // Remove volume group:
  187.     ////////////////////////////////////////
  188.     
  189.     if( ret == `vg_remove_vg && current_vg != nil )
  190.         {
  191.         if( HandleRemoveVg( targetMap, current_vg ) )
  192.         {
  193.         targetMap = Storage::GetTargetMap();
  194.         lvm_vgs = get_vgs( targetMap );
  195.         current_vg = lvm_vgs[0]:"";
  196.         new_vg_list( lvm_vgs );
  197.         UI::ChangeWidget( `id(`vg), `Value, current_vg);
  198.         y2milestone( " current_vg %1" , current_vg );
  199.         }
  200.         }
  201.  
  202.  
  203.     ////////////////////////////////////////
  204.     // Add a new physical volume:
  205.     ////////////////////////////////////////
  206.     
  207.     
  208.     if( ret == `pv_add && current_vg != nil )
  209.         {
  210.         id = (string)UI::QueryWidget(`id(`pv_table), `CurrentItem);
  211.         y2debug( "WWW ID ADD GROUP %1", id);
  212.         
  213.         if( id!=nil && CheckItemIsNotPv(targetMap,id) )
  214.         {
  215.         addPhysicalVolume( targetMap, id, current_vg );
  216.         targetMap = Storage::GetTargetMap();
  217.         }
  218.         }
  219.  
  220.     ////////////////////////////////////////
  221.     // Delete a new physical volume:
  222.     ////////////////////////////////////////
  223.     
  224.     if( ret == `pv_delete && current_vg != nil )
  225.         {
  226.         id = (string)UI::QueryWidget(`id(`pv_table), `CurrentItem);
  227.         y2milestone( "id:%1", id );
  228.  
  229.         if( id!=nil && CheckItemIsPv(targetMap,id) )
  230.         {
  231.         string vg = "";
  232.         if( haskey( targetMap, id ))
  233.             vg = targetMap[id,"used_by"]:"";
  234.         else
  235.             vg = Storage::GetPartition( targetMap, id )["used_by"]:"";
  236.         vg = lvmVg(vg);
  237.         y2milestone( "vg=%1", vg );
  238.  
  239.         if( !check_pv_delete( targetMap, id, vg ) )
  240.             {
  241.             ret = `again;
  242.             continue;
  243.             }
  244.         
  245.         removePhysicalVolume( targetMap, id, vg );
  246.         targetMap = Storage::GetTargetMap();
  247.         }
  248.         }
  249.     
  250.     ////////////////////////////////////////
  251.     // Finish this step
  252.     ////////////////////////////////////////
  253.     if( contains( [ `back, `cancel, `abort, `next ], ret ))
  254.         {
  255.         list<string> empty_vg = [];
  256.         empty_vg = maplist( string dev, map vg, targetMap, ``(dev));
  257.         empty_vg = filter( string dev, empty_vg, 
  258.                            ``(targetMap[dev,"type"]:`CT_UNKOWN==`CT_LVM &&
  259.                       targetMap[dev,"size_k"]:0==0));
  260.         empty_vg = maplist( string dev, empty_vg, ``(substring(dev,5)));
  261.         y2milestone( "empty_vg:%1", empty_vg );
  262.         if( size(empty_vg)>0 )
  263.         {
  264.         if( ret==`next )
  265.             {
  266.             Popup::Error(sformat(_("The volume group %1 does not have 
  267. any physical volumes assigned. This is not possible.
  268. Either remove this volume group or add at least
  269. one physical volume to it.
  270. "), empty_vg[0]:"" ));
  271.             ret = `again;
  272.             }
  273.         else
  274.             {
  275.             foreach( string vg, empty_vg, ``{Storage::DeleteLvmVg(vg);});
  276.             }
  277.         }
  278.         }
  279.  
  280.     if( ret == `back )
  281.         {
  282.         Wizard::RestoreNextButton();
  283.         }
  284.  
  285.     } until (ret == `next || ret == `back || ret == `cancel || ret == `abort );
  286.     
  287.     return ret;
  288. }
  289.  
  290. // end
  291.