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