Package flumotion :: Package component :: Package base :: Module multiple
[hide private]

Source Code for Module flumotion.component.base.multiple

  1  # -*- Mode: Python; test-case-name: flumotion.test.test_feedcomponent010 -*- 
  2  # vi:si:et:sw=4:sts=4:ts=4 
  3   
  4  # Flumotion - a streaming media server 
  5  # Copyright (C) 2004,2005,2006,2007,2008,2009 Fluendo, S.L. 
  6  # Copyright (C) 2010,2011 Flumotion Services, S.A. 
  7  # All rights reserved. 
  8  # 
  9  # This file may be distributed and/or modified under the terms of 
 10  # the GNU Lesser General Public License version 2.1 as published by 
 11  # the Free Software Foundation. 
 12  # This file is distributed without any warranty; without even the implied 
 13  # warranty of merchantability or fitness for a particular purpose. 
 14  # See "LICENSE.LGPL" in the source distribution for more information. 
 15  # 
 16  # Headers in this file shall remain intact. 
 17   
 18  import gettext 
 19  import gtk 
 20  import locale 
 21  import os 
 22   
 23  from flumotion.common import log 
 24  from flumotion.common import format as formatting 
 25   
 26  from flumotion.common.errors import SleepingComponentError 
 27  from flumotion.common.i18n import getLL, gettexter 
 28  from flumotion.common.planet import moods 
 29   
 30  _ = gettext.gettext 
 31  __version__ = "$Rev$" 
 32  T_ = gettexter() 
 33   
 34  # stupid pychecker 
 35  dir(locale) 
 36   
 37   
38 -class ComponentOverview(gtk.Expander, log.Loggable):
39
40 - def __init__(self, label):
41 self.total_mem = 0.0 42 self.num_cpus = 1 43 gtk.Expander.__init__(self, '<b>%s</b>'%label) 44 self.set_use_markup(True) 45 table = gtk.Table(2, 2) 46 cpu_label = gtk.Label('cpu') 47 cpu_label.set_alignment(0, 1) 48 mem_label = gtk.Label('mem') 49 mem_label.set_alignment(0, 1) 50 table.attach(cpu_label, 0, 1, 0, 1, gtk.FILL, 0, 2, 2) 51 table.attach(mem_label, 0, 1, 1, 2, gtk.FILL, 0, 2, 2) 52 self.cpu = gtk.ProgressBar() 53 self.cpu.set_text(_('Unknown')) 54 table.attach(self.cpu, 1, 2, 0, 1, gtk.EXPAND|gtk.FILL, 55 gtk.EXPAND|gtk.FILL, 2, 2) 56 self.mem = gtk.ProgressBar() 57 self.mem.set_text(_('Unknown')) 58 table.attach(self.mem, 1, 2, 1, 2, gtk.EXPAND|gtk.FILL, 59 gtk.EXPAND|gtk.FILL, 2, 2) 60 self.add(table) 61 self.set_expanded(True)
62
63 - def update_cpu(self, fraction):
64 if not fraction: 65 fraction = 0 66 self.cpu.set_fraction(fraction/self.num_cpus) 67 self.cpu.set_text('%.2f %%'%(fraction * 100))
68
69 - def update_mem(self, size):
70 if not size: 71 size = _('Unknown') 72 fraction = 0 73 else: 74 fraction = size / self.total_mem 75 size = '%sB' % formatting.formatStorage(size) 76 77 self.mem.set_text(size) 78 self.mem.set_fraction(fraction)
79
80 - def set_total_memory(self, total_mem):
81 self.total_mem = float(total_mem)
82
83 - def set_num_cpus(self, num):
84 self.num_cpus = num
85 86
87 -class MultipleComponentsAdminGtk(log.Loggable):
88 """ 89 I am a view of multiple components' properties. 90 """ 91 92 logCategory = "admingtk" 93 gettextDomain = None 94
95 - def __init__(self, multistate, admin):
96 """ 97 @type multistate: {f.a.g.c.MultipleAdminComponentStates} 98 @param multistate: state of component this is a UI for 99 @type admin: L{flumotion.admin.admin.AdminModel} 100 @param admin: the admin model that interfaces with the manager for us 101 """ 102 self.widget = gtk.ScrolledWindow() 103 self.widget.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) 104 self.widget.set_border_width(0) 105 self.widget.set_shadow_type(gtk.SHADOW_NONE) 106 vbox = gtk.VBox(spacing=6) 107 vbox.set_border_width(12) 108 self._debugEnabled = False 109 self.multistate = multistate 110 self.name = 'multiple_components' 111 self.admin = admin 112 self.debug('creating admin gtk for state %r' % multistate) 113 self.uiStates = [] 114 self._stateValues = dict() 115 116 for state in multistate.getComponentStates(): 117 co = ComponentOverview(state.get('name')) 118 vbox.pack_start(co, False, True) 119 vbox.pack_start(gtk.HSeparator(), False, True) 120 if state.get('mood') in [moods.lost.value, 121 moods.sleeping.value, 122 moods.sad.value]: 123 co.set_expanded(False) 124 continue 125 d = admin.componentCallRemote(state, 'getUIState') 126 d.addCallback(self.setUIState, co) 127 d.addErrback(lambda failure: failure.trap(SleepingComponentError)) 128 129 self.widget.add_with_viewport(vbox) 130 vbox.show_all()
131
132 - def cleanup(self):
133 for uiState in self.uiStates: 134 uiState.removeListener(self)
135
136 - def setUIState(self, state, widget):
137 self.debug('starting listening to state %r', state) 138 state.addListener(self, set_=self.stateSet) 139 self.uiStates.append(state) 140 self._stateValues[state] = widget 141 widget.set_total_memory(state.get('total-memory', 0)) 142 widget.set_num_cpus(state.get('num-cpus', 1)) 143 for key in state.keys(): 144 val = state.get(key) 145 if val is not None: 146 self.stateSet(state, key, state.get(key))
147
148 - def callRemote(self, methodName, *args, **kwargs):
149 return self.admin.componentCallRemote(self.state, methodName, 150 *args, **kwargs)
151
152 - def getWidget(self):
153 return self.widget
154
155 - def stateSet(self, object, key, value):
156 if key == 'cpu-percent': 157 self._stateValues[object].update_cpu(value) 158 elif key == 'virtual-size': 159 self._stateValues[object].update_mem(value)
160