2008-08-08 01:37:16 +04:00
#
# Copyright (C) 2008 Red Hat, Inc.
# Copyright (C) 2008 Cole Robinson <crobinso@redhat.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA.
#
import virtinst
2013-04-12 01:16:33 +04:00
# pylint: disable=E0611
2012-05-14 17:24:56 +04:00
from gi . repository import GObject
2013-04-12 01:16:33 +04:00
# pylint: enable=E0611
2012-05-14 17:24:56 +04:00
2011-04-11 01:08:23 +04:00
from virtManager import util
2010-12-09 20:37:48 +03:00
from virtManager . libvirtobject import vmmLibvirtObject
2008-08-08 01:37:16 +04:00
from virtManager . storagevol import vmmStorageVolume
2013-04-13 22:34:52 +04:00
2010-12-09 20:37:48 +03:00
class vmmStoragePool ( vmmLibvirtObject ) :
2012-05-14 17:24:56 +04:00
__gsignals__ = {
" refreshed " : ( GObject . SignalFlags . RUN_FIRST , None , [ ] )
}
2013-07-07 16:42:57 +04:00
def __init__ ( self , conn , backend , key ) :
vmmLibvirtObject . __init__ ( self , conn , backend , key )
2010-12-09 20:37:48 +03:00
2013-07-07 16:42:57 +04:00
self . _uuid = key
self . _active = True
2010-03-08 20:08:59 +03:00
2013-07-07 16:42:57 +04:00
self . _volumes = { }
2013-07-07 16:05:23 +04:00
self . _support_isactive = None
self . tick ( )
2010-03-08 20:08:59 +03:00
self . refresh ( )
2008-08-08 01:37:16 +04:00
2010-12-09 20:37:48 +03:00
# Required class methods
def get_name ( self ) :
2013-07-07 16:42:57 +04:00
return self . _backend . name ( )
2010-12-09 20:37:48 +03:00
def _XMLDesc ( self , flags ) :
2013-07-07 16:42:57 +04:00
return self . _backend . XMLDesc ( flags )
2010-12-09 20:37:48 +03:00
def _define ( self , xml ) :
2013-07-07 16:42:57 +04:00
return self . conn . define_pool ( xml )
2010-12-09 20:37:48 +03:00
2013-07-07 16:42:57 +04:00
def _set_active ( self , state ) :
if state == self . _active :
2013-07-07 16:05:23 +04:00
return
self . idle_emit ( state and " started " or " stopped " )
2013-07-07 16:42:57 +04:00
self . _active = state
2010-12-10 17:57:42 +03:00
self . refresh_xml ( )
2008-08-08 01:37:16 +04:00
def is_active ( self ) :
2013-07-07 16:42:57 +04:00
return self . _active
2008-08-08 01:37:16 +04:00
def can_change_alloc ( self ) :
2008-11-18 23:42:51 +03:00
typ = self . get_type ( )
return ( typ in [ virtinst . Storage . StoragePool . TYPE_LOGICAL ] )
2008-08-08 01:37:16 +04:00
def get_uuid ( self ) :
2013-07-07 16:42:57 +04:00
return self . _uuid
2008-08-08 01:37:16 +04:00
def start ( self ) :
2013-07-07 16:42:57 +04:00
self . _backend . create ( 0 )
2012-02-10 23:07:51 +04:00
self . idle_add ( self . refresh_xml )
2008-08-08 01:37:16 +04:00
def stop ( self ) :
2013-07-07 16:42:57 +04:00
self . _backend . destroy ( )
2012-02-10 23:07:51 +04:00
self . idle_add ( self . refresh_xml )
2008-08-08 01:37:16 +04:00
2008-08-11 04:58:36 +04:00
def delete ( self , nodelete = True ) :
if nodelete :
2013-07-07 16:42:57 +04:00
self . _backend . undefine ( )
2008-08-11 04:58:36 +04:00
else :
2013-07-07 16:42:57 +04:00
self . _backend . delete ( 0 )
self . _backend = None
2008-08-08 01:37:16 +04:00
def set_autostart ( self , value ) :
2013-07-07 16:42:57 +04:00
self . _backend . setAutostart ( value )
2008-08-08 01:37:16 +04:00
def get_autostart ( self ) :
2013-07-07 16:42:57 +04:00
return self . _backend . autostart ( )
2008-08-08 01:37:16 +04:00
def get_target_path ( self ) :
2013-07-05 16:59:58 +04:00
return util . xpath ( self . get_xml ( ) , " /pool/target/path " ) or " "
2008-08-08 01:37:16 +04:00
def get_allocation ( self ) :
2011-04-11 01:08:23 +04:00
return long ( util . xpath ( self . get_xml ( ) , " /pool/allocation " ) )
2008-08-08 01:37:16 +04:00
def get_available ( self ) :
2011-04-11 01:08:23 +04:00
return long ( util . xpath ( self . get_xml ( ) , " /pool/available " ) )
2008-08-08 01:37:16 +04:00
def get_capacity ( self ) :
2011-04-11 01:08:23 +04:00
return long ( util . xpath ( self . get_xml ( ) , " /pool/capacity " ) )
2008-08-08 01:37:16 +04:00
def get_pretty_allocation ( self ) :
2011-04-11 01:08:23 +04:00
return util . pretty_bytes ( self . get_allocation ( ) )
2008-08-08 01:37:16 +04:00
def get_pretty_available ( self ) :
2011-04-11 01:08:23 +04:00
return util . pretty_bytes ( self . get_available ( ) )
2008-08-08 01:37:16 +04:00
def get_pretty_capacity ( self ) :
2011-04-11 01:08:23 +04:00
return util . pretty_bytes ( self . get_capacity ( ) )
2008-08-08 01:37:16 +04:00
def get_type ( self ) :
2011-04-11 01:08:23 +04:00
return util . xpath ( self . get_xml ( ) , " /pool/@type " )
2008-08-08 01:37:16 +04:00
def get_volumes ( self ) :
self . update_volumes ( )
return self . _volumes
def get_volume ( self , uuid ) :
return self . _volumes [ uuid ]
2013-07-07 16:05:23 +04:00
def _backend_get_active ( self ) :
if self . _support_isactive is None :
self . _support_isactive = self . conn . check_pool_support (
2013-07-07 16:42:57 +04:00
self . _backend ,
2013-07-07 16:05:23 +04:00
self . conn . SUPPORT_STORAGE_ISACTIVE )
if not self . _support_isactive :
return True
2013-07-07 16:42:57 +04:00
return bool ( self . _backend . isActive ( ) )
2013-07-07 16:05:23 +04:00
def tick ( self ) :
2013-07-07 16:42:57 +04:00
self . _set_active ( self . _backend_get_active ( ) )
2013-07-07 16:05:23 +04:00
2008-09-06 05:53:26 +04:00
def refresh ( self ) :
2013-07-07 16:42:57 +04:00
if not self . is_active ( ) :
2010-04-21 18:56:06 +04:00
return
2012-02-10 23:07:51 +04:00
def cb ( ) :
self . refresh_xml ( )
self . update_volumes ( refresh = True )
self . emit ( " refreshed " )
2013-07-07 16:42:57 +04:00
self . _backend . refresh ( 0 )
2012-02-10 23:07:51 +04:00
self . idle_add ( cb )
2008-09-06 05:53:26 +04:00
2012-01-30 07:15:01 +04:00
def update_volumes ( self , refresh = False ) :
2008-08-08 01:37:16 +04:00
if not self . is_active ( ) :
self . _volumes = { }
return
2013-07-07 16:42:57 +04:00
vols = self . _backend . listVolumes ( )
2008-08-08 01:37:16 +04:00
new_vol_list = { }
for volname in vols :
2010-12-10 19:47:07 +03:00
if volname in self . _volumes :
2008-08-08 01:37:16 +04:00
new_vol_list [ volname ] = self . _volumes [ volname ]
2012-01-30 07:15:01 +04:00
if refresh :
new_vol_list [ volname ] . refresh_xml ( )
2008-08-08 01:37:16 +04:00
else :
2011-07-23 00:43:26 +04:00
new_vol_list [ volname ] = vmmStorageVolume ( self . conn ,
2013-07-07 16:42:57 +04:00
self . _backend . storageVolLookupByName ( volname ) ,
volname )
2008-08-08 01:37:16 +04:00
self . _volumes = new_vol_list