The attached patch adds a 'Storage Manager' to the connection
details section. It's setup is similar to the network manager
also in the connection details.
The manager lists all pools on the connection and their
associated details: name, type, total capacity and available
space, as well as their associated volumes. All starting,
stopping, and deleting of storage objects takes place here,
as well as launching the the storage creation wizards (next
patches).
There is some small cleanup sprinkled in here as well of the
existing network management code, nothing major though.
Thanks to Tim Allen for most of the UI design.
Screenshots can be seen here:
http://fedorapeople.org/~crobinso/virt-manager/storage/storage-manager-01.png
http://fedorapeople.org/~crobinso/virt-manager/storage/storage-manager-02.png
http://fedorapeople.org/~crobinso/virt-manager/storage/storage-manager-03.png
Thanks,
Cole
# HG changeset patch
# User "Cole Robinson <[EMAIL PROTECTED]>"
# Date 1218416200 14400
# Node ID 145e007589cadd31bbdbd12b2b6cad4a35a47ba3
# Parent 97b86e27b9e540f67f677907e253462b70caeef4
Add storage manager to connection details section.
diff -r 97b86e27b9e5 -r 145e007589ca src/virtManager/host.py
--- a/src/virtManager/host.py Thu Aug 07 17:37:16 2008 -0400
+++ b/src/virtManager/host.py Sun Aug 10 20:56:40 2008 -0400
@@ -25,8 +25,13 @@
import sparkline
import logging
import os
+import traceback
+
+from virtinst import Storage
from virtManager.createnet import vmmCreateNetwork
+from virtManager.createpool import vmmCreatePool
+from virtManager.createvol import vmmCreateVolume
from virtManager.error import vmmErrorDialog
class vmmHost(gobject.GObject):
@@ -39,6 +44,9 @@
self.window = gtk.glade.XML(config.get_glade_dir() +
"/vmm-host.glade", "vmm-host", domain="virt-manager")
self.config = config
self.conn = conn
+
+ self.PIXBUF_STATE_RUNNING =
gtk.gdk.pixbuf_new_from_file_at_size(self.config.get_icon_dir() +
"/state_running.png", 18, 18)
+ self.PIXBUF_STATE_SHUTOFF =
gtk.gdk.pixbuf_new_from_file_at_size(self.config.get_icon_dir() +
"/state_shutoff.png", 18, 18)
topwin = self.window.get_widget("vmm-host")
topwin.hide()
@@ -60,7 +68,16 @@
self.window.get_widget("net-list").set_model(netListModel)
self.populate_networks(netListModel)
+ poolListModel = gtk.ListStore(str, str, float)
+ self.window.get_widget("pool-list").set_model(poolListModel)
+ self.populate_storage_pools(poolListModel)
+
+ volListModel = gtk.ListStore(str, str, str, str)
+ self.window.get_widget("vol-list").set_model(volListModel)
+
self.window.get_widget("net-list").get_selection().connect("changed",
self.net_selected)
+ self.window.get_widget("pool-list").get_selection().connect("changed",
self.pool_selected)
+ self.window.get_widget("vol-list").get_selection().connect("changed",
self.vol_selected)
netCol = gtk.TreeViewColumn("Networks")
net_txt = gtk.CellRendererText()
@@ -73,6 +90,35 @@
self.window.get_widget("net-list").append_column(netCol)
self.window.get_widget("net-details").set_sensitive(False)
+ poolCol = gtk.TreeViewColumn("Pools")
+ pool_txt = gtk.CellRendererText()
+ pool_prg = gtk.CellRendererProgress()
+ poolCol.pack_start(pool_txt, True)
+ poolCol.pack_start(pool_prg, False)
+ poolCol.add_attribute(pool_txt, 'text', 1)
+ poolCol.add_attribute(pool_prg, 'value', 2)
+ self.window.get_widget("pool-list").append_column(poolCol)
+
+ volCol = gtk.TreeViewColumn("Volumes")
+ vol_txt1 = gtk.CellRendererText()
+ volCol.pack_start(vol_txt1, True)
+ volCol.add_attribute(vol_txt1, 'text', 1)
+ self.window.get_widget("vol-list").append_column(volCol)
+
+ volSizeCol = gtk.TreeViewColumn("Size")
+ vol_txt2 = gtk.CellRendererText()
+ volSizeCol.pack_start(vol_txt2, False)
+ volSizeCol.add_attribute(vol_txt2, 'text', 2)
+ self.window.get_widget("vol-list").append_column(volSizeCol)
+
+ volFormatCol = gtk.TreeViewColumn("Format")
+ vol_txt3 = gtk.CellRendererText()
+ volFormatCol.pack_start(vol_txt3, False)
+ volFormatCol.add_attribute(vol_txt3, 'text', 3)
+ self.window.get_widget("vol-list").append_column(volFormatCol)
+
+ self.window.get_widget("pool-details").set_sensitive(False)
+
self.cpu_usage_graph = sparkline.Sparkline()
self.cpu_usage_graph.show()
self.window.get_widget("performance-table").attach(self.cpu_usage_graph, 1, 2,
0, 1)
@@ -81,11 +127,19 @@
self.memory_usage_graph.show()
self.window.get_widget("performance-table").attach(self.memory_usage_graph, 1,
2, 1, 2)
- self.add = None
- self.window.get_widget("details-tabs").get_nth_page(2).hide()
+ self.addnet = None
+ self.addpool = None
+ self.addvol = None
self.conn.connect("net-added", self.repopulate_networks)
self.conn.connect("net-removed", self.repopulate_networks)
+ self.conn.connect("net-started", self.refresh_network)
+ self.conn.connect("net-stopped", self.refresh_network)
+
+ self.conn.connect("pool-added", self.repopulate_storage_pools)
+ self.conn.connect("pool-removed", self.repopulate_storage_pools)
+ self.conn.connect("pool-started", self.refresh_storage_pool)
+ self.conn.connect("pool-stopped", self.refresh_storage_pool)
# XXX not technically correct once we enable remote management
if (os.getuid() != 0 and not self.conn.is_remote()) \
@@ -101,13 +155,20 @@
"on_net_delete_clicked": self.delete_network,
"on_net_stop_clicked": self.stop_network,
"on_net_start_clicked": self.start_network,
+ "on_pool_add_clicked" : self.add_pool,
+ "on_vol_add_clicked" : self.add_vol,
+ "on_pool_stop_clicked": self.stop_pool,
+ "on_pool_start_clicked": self.start_pool,
+ "on_pool_delete_clicked": self.delete_pool,
+ "on_pool_autostart_toggled": self.pool_autostart_changed,
+ "on_vol_delete_clicked": self.delete_vol,
+ "on_pool_apply_clicked": self.pool_apply,
"on_config_autoconnect_toggled": self.toggle_autoconnect,
})
self.conn.connect("resources-sampled", self.refresh_resources)
- self.conn.connect("net-started", self.refresh_network)
- self.conn.connect("net-stopped", self.refresh_network)
self.refresh_resources()
+ self.reset_pool_state()
def show(self):
# Update autostart value
@@ -140,9 +201,9 @@
self.err.val_err(_("Creating new networks on remote connections is
not yet supported"))
return
- if self.add is None:
- self.add = vmmCreateNetwork(self.config, self.conn)
- self.add.show()
+ if self.addnet is None:
+ self.addnet = vmmCreateNetwork(self.config, self.conn)
+ self.addnet.show()
def toggle_autoconnect(self, ignore=None):
if self.conn.get_autoconnect() != \
@@ -169,6 +230,9 @@
memory_vector = self.conn.current_memory_vector()
memory_vector.reverse()
self.memory_usage_graph.set_property("data_array", memory_vector)
+
+
+ # Virtual Network functions
def current_network(self):
sel = self.window.get_widget("net-list").get_selection()
@@ -202,7 +266,7 @@
self.window.get_widget("net-device").set_text(net.get_bridge_device())
self.window.get_widget("net-device").set_sensitive(True)
self.window.get_widget("net-state").set_text(_("Active"))
-
self.window.get_widget("net-state-icon").set_from_pixbuf(gtk.gdk.pixbuf_new_from_file_at_size(self.config.get_icon_dir()
+ "/state_running.png", 18, 18))
+
self.window.get_widget("net-state-icon").set_from_pixbuf(self.PIXBUF_STATE_RUNNING)
self.window.get_widget("net-start").set_sensitive(False)
self.window.get_widget("net-stop").set_sensitive(True)
self.window.get_widget("net-delete").set_sensitive(False)
@@ -210,17 +274,12 @@
self.window.get_widget("net-device").set_text("")
self.window.get_widget("net-device").set_sensitive(False)
self.window.get_widget("net-state").set_text(_("Inactive"))
-
self.window.get_widget("net-state-icon").set_from_pixbuf(gtk.gdk.pixbuf_new_from_file_at_size(self.config.get_icon_dir()
+ "/state_shutoff.png", 18, 18))
+
self.window.get_widget("net-state-icon").set_from_pixbuf(self.PIXBUF_STATE_SHUTOFF)
self.window.get_widget("net-start").set_sensitive(True)
self.window.get_widget("net-stop").set_sensitive(False)
self.window.get_widget("net-delete").set_sensitive(True)
- autostart = True
- try:
- autostart = net.get_autostart()
- except:
- # Hack, libvirt 0.2.1 is missing python binding for the
autostart method
- pass
+ autostart = net.get_autostart()
if autostart:
self.window.get_widget("net-autostart").set_text(_("On
boot"))
self.window.get_widget("net-autostart-icon").set_from_stock(gtk.STOCK_YES,
gtk.ICON_SIZE_MENU)
@@ -258,4 +317,211 @@
model.append([uuid, net.get_name(), gtk.STOCK_NETWORK])
+ # ------------------------------
+ # Storage Manager methods
+ # ------------------------------
+
+
+ def add_pool(self, src):
+ if self.addpool is None:
+ self.addpool = vmmCreatePool(self.config, self.conn)
+ self.addpool.show()
+
+ def add_vol(self, src):
+ pool = self.current_pool()
+ if pool is None:
+ return
+ if self.addvol is None:
+ self.addvol = vmmCreateVolume(self.config, self.conn, pool)
+ self.addvol.connect("vol-created", self.refresh_current_pool)
+ else:
+ self.addvol.set_parent_pool(pool)
+ self.addvol.show()
+
+ def refresh_current_pool(self, ignore1=None):
+ cp = self.current_pool()
+ if cp is None:
+ return
+ self.refresh_storage_pool(None, None, cp.get_uuid())
+
+ def current_pool(self):
+ sel = self.window.get_widget("pool-list").get_selection()
+ active = sel.get_selected()
+ if active[1] != None:
+ curruuid = active[0].get_value(active[1], 0)
+ return self.conn.get_pool(curruuid)
+ return None
+
+ def current_vol(self):
+ pool = self.current_pool()
+ if not pool:
+ return None
+ sel = self.window.get_widget("vol-list").get_selection()
+ active = sel.get_selected()
+ if active[1] != None:
+ curruuid = active[0].get_value(active[1], 0)
+ return pool.get_volume(curruuid)
+ return None
+
+ def stop_pool(self, src):
+ pool = self.current_pool()
+ if pool is not None:
+ pool.stop()
+
+ def start_pool(self, src):
+ pool = self.current_pool()
+ if pool is not None:
+ pool.start()
+
+ def delete_pool(self, src):
+ pool = self.current_pool()
+ if pool is None:
+ return
+
+ result = self.err.yes_no(_("This will permanently delete the volume "
+ "'%s,' are you sure?") % pool.get_name())
+ if not result:
+ return
+ try:
+ pool.delete()
+ except Exception, e:
+ self.err.show_err(_("Error deleting pool: %s") % str(e),
+ "".join(traceback.format_exc()))
+ return
+
+ def delete_vol(self, src):
+ vol = self.current_vol()
+ if vol is None:
+ return
+
+ result = self.err.yes_no(_("This will permanently delete the volume "
+ "'%s,' are you sure?") % vol.get_name())
+ if not result:
+ return
+
+ try:
+ vol.delete()
+ except Exception, e:
+ self.err.show_err(_("Error deleting volume: %s") % str(e),
+ "".join(traceback.format_exc()))
+ return
+
+ self.populate_storage_volumes()
+
+ def pool_apply(self, src):
+ pool = self.current_pool()
+ if pool is None:
+ return
+
+ try:
+
pool.set_autostart(self.window.get_widget("pool-autostart").get_active())
+ except Exception, e:
+ self.err.show_err(_("Error setting pool autostart: %s") % str(e),
+ "".join(traceback.format_exc()))
+ return
+ self.window.get_widget("pool-apply").set_sensitive(False)
+
+ def pool_autostart_changed(self, src):
+ auto = self.window.get_widget("pool-autostart").get_active()
+ self.window.get_widget("pool-autostart").set_label(auto and \
+ _("On Boot") or \
+ _("Never"))
+ self.window.get_widget("pool-apply").set_sensitive(True)
+
+ def pool_selected(self, src):
+ selected = src.get_selected()
+ if selected[1] is None or \
+ selected[0].get_value(selected[1], 0) is None:
+ self.reset_pool_state()
+ return
+
+ uuid = selected[0].get_value(selected[1], 0)
+ pool = self.conn.get_pool(uuid)
+ auto = pool.get_autostart()
+ active = pool.is_active()
+
+ # Set pool details state
+ self.window.get_widget("pool-details").set_sensitive(True)
+ self.window.get_widget("pool-name").set_markup("<b>%s:</b>" % \
+ pool.get_name())
+ self.window.get_widget("pool-sizes").set_markup("""<span
size="large">%s Free</span> / <i>%s In Use</i>""" %
(pool.get_pretty_available(), pool.get_pretty_allocation()))
+
self.window.get_widget("pool-type").set_text(Storage.StoragePool.get_pool_type_desc(pool.get_type()))
+
self.window.get_widget("pool-location").set_text(pool.get_target_path())
+ self.window.get_widget("pool-state-icon").set_from_pixbuf((active and
self.PIXBUF_STATE_RUNNING) or self.PIXBUF_STATE_SHUTOFF)
+ self.window.get_widget("pool-state").set_text((active and _("Active"))
or _("Inactive"))
+ self.window.get_widget("pool-autostart").set_label((auto and _("On
boot")) or _("Never"))
+ self.window.get_widget("pool-autostart").set_active(auto)
+
+ self.window.get_widget("vol-list").set_sensitive(active)
+ self.populate_storage_volumes()
+
+ self.window.get_widget("pool-delete").set_sensitive(not active)
+ self.window.get_widget("pool-stop").set_sensitive(active)
+ self.window.get_widget("pool-start").set_sensitive(not active)
+ self.window.get_widget("pool-apply").set_sensitive(False)
+ self.window.get_widget("vol-add").set_sensitive(active)
+ self.window.get_widget("vol-delete").set_sensitive(False)
+
+ def refresh_storage_pool(self, src, uri, uuid):
+ sel = self.window.get_widget("pool-list").get_selection()
+ active = sel.get_selected()
+ if active[1] != None:
+ curruuid = active[0].get_value(active[1], 0)
+ if curruuid == uuid:
+ self.pool_selected(sel)
+
+ def reset_pool_state(self):
+ self.window.get_widget("pool-details").set_sensitive(False)
+ self.window.get_widget("pool-name").set_text("")
+ self.window.get_widget("pool-sizes").set_text("")
+ self.window.get_widget("pool-type").set_text("")
+ self.window.get_widget("pool-location").set_text("")
+
self.window.get_widget("pool-state-icon").set_from_pixbuf(self.PIXBUF_STATE_SHUTOFF)
+ self.window.get_widget("pool-state").set_text(_("Inactive"))
+ self.window.get_widget("vol-list").get_model().clear()
+ self.window.get_widget("pool-autostart").set_label(_("Never"))
+ self.window.get_widget("pool-autostart").set_active(False)
+
+ self.window.get_widget("pool-delete").set_sensitive(False)
+ self.window.get_widget("pool-stop").set_sensitive(False)
+ self.window.get_widget("pool-start").set_sensitive(False)
+ self.window.get_widget("pool-apply").set_sensitive(False)
+ self.window.get_widget("vol-add").set_sensitive(False)
+ self.window.get_widget("vol-delete").set_sensitive(False)
+ self.window.get_widget("vol-list").set_sensitive(False)
+
+ def vol_selected(self, src):
+ selected = src.get_selected()
+ if selected[1] is None or \
+ selected[0].get_value(selected[1], 0) is None:
+ self.window.get_widget("vol-delete").set_sensitive(False)
+ return
+
+ self.window.get_widget("vol-delete").set_sensitive(True)
+
+ def repopulate_storage_pools(self, src, uri, uuid):
+
self.populate_storage_pools(self.window.get_widget("pool-list").get_model())
+
+ def populate_storage_pools(self, model):
+ model.clear()
+ for uuid in self.conn.list_pool_uuids():
+ pool = self.conn.get_pool(uuid)
+ cap = pool.get_capacity()
+ all = pool.get_allocation()
+ if not cap or all is None:
+ per = 0
+ else:
+ per = int(((float(all) / float(cap)) * 100))
+ model.append([uuid, pool.get_name(), per])
+
+ def populate_storage_volumes(self):
+ pool = self.current_pool()
+ model = self.window.get_widget("vol-list").get_model()
+ model.clear()
+ vols = pool.get_volumes()
+ for key in vols.keys():
+ vol = vols[key]
+ model.append([key, vol.get_name(), vol.get_pretty_capacity(),
+ vol.get_format() or ""])
+
gobject.type_register(vmmHost)
diff -r 97b86e27b9e5 -r 145e007589ca src/vmm-host.glade
--- a/src/vmm-host.glade Thu Aug 07 17:37:16 2008 -0400
+++ b/src/vmm-host.glade Sun Aug 10 20:56:40 2008 -0400
@@ -9,7 +9,7 @@
<property name="type">GTK_WINDOW_TOPLEVEL</property>
<property name="window_position">GTK_WIN_POS_NONE</property>
<property name="modal">False</property>
- <property name="default_width">600</property>
+ <property name="default_width">650</property>
<property name="default_height">450</property>
<property name="resizable">True</property>
<property name="destroy_with_parent">False</property>
@@ -1714,23 +1714,21 @@
</child>
<child>
- <widget class="GtkHBox" id="hbox2">
+ <widget class="GtkVBox" id="vbox5">
+ <property name="border_width">3</property>
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child>
- <widget class="GtkScrolledWindow" id="scrolledwindow2">
- <property name="border_width">6</property>
+ <widget class="GtkHPaned" id="hpaned1">
+ <property name="border_width">3</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
- <property
name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <property
name="window_placement">GTK_CORNER_TOP_LEFT</property>
<child>
- <widget class="GtkTreeView" id="treeview1">
+ <widget class="GtkTreeView" id="pool-list">
+ <property name="width_request">134</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="headers_visible">False</property>
@@ -1741,61 +1739,248 @@
<property name="hover_selection">False</property>
<property name="hover_expand">False</property>
</widget>
+ <packing>
+ <property name="shrink">True</property>
+ <property name="resize">False</property>
+ </packing>
</child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox3">
- <property name="border_width">6</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">3</property>
<child>
- <widget class="GtkFrame" id="frame5">
+ <widget class="GtkVBox" id="pool-details">
<property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">3</property>
<child>
- <widget class="GtkAlignment" id="alignment5">
+ <widget class="GtkTable" id="table5">
+ <property name="border_width">6</property>
<property name="visible">True</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xscale">1</property>
- <property name="yscale">1</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">12</property>
- <property name="right_padding">0</property>
+ <property name="n_rows">5</property>
+ <property name="n_columns">2</property>
+ <property name="homogeneous">False</property>
+ <property name="row_spacing">3</property>
+ <property name="column_spacing">8</property>
<child>
- <widget class="GtkTable" id="table5">
- <property name="border_width">6</property>
+ <widget class="GtkLabel" id="label73">
<property name="visible">True</property>
- <property name="n_rows">2</property>
- <property name="n_columns">2</property>
+ <property name="label" translatable="yes">Pool
Type:</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property
name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property
name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="pool-type">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Pool
Type</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property
name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property
name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="pool-name">
+ <property name="visible">True</property>
+ <property name="label"
translatable="yes"><b>Poolname:</b></property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property
name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property
name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="pool-sizes">
+ <property name="visible">True</property>
+ <property name="label"
translatable="yes"><span size="large">1234 GB Free</span>
/ <i>6000 GB In Use</i></property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property
name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property
name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label60">
+ <property name="visible">True</property>
+ <property name="label"
translatable="yes">Location:</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property
name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property
name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkEntry" id="pool-location">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">False</property>
+ <property name="visibility">True</property>
+ <property name="max_length">0</property>
+ <property name="text"
translatable="yes"></property>
+ <property name="has_frame">True</property>
+ <property name="invisible_char">â¢</property>
+ <property
name="activates_default">False</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label75">
+ <property name="visible">True</property>
+ <property name="label"
translatable="yes">State:</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property
name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property
name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkHBox" id="hbox7">
+ <property name="visible">True</property>
<property name="homogeneous">False</property>
- <property name="row_spacing">3</property>
- <property name="column_spacing">3</property>
+ <property name="spacing">3</property>
<child>
- <widget class="GtkLabel" id="label59">
+ <widget class="GtkImage" id="pool-state-icon">
<property name="visible">True</property>
- <property name="label"
translatable="yes">Location:</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="pool-state">
+ <property name="visible">True</property>
+ <property name="label"
translatable="yes">Active</property>
<property
name="use_underline">False</property>
<property name="use_markup">False</property>
<property
name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
- <property name="xalign">1</property>
+ <property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
@@ -1805,115 +1990,467 @@
<property name="angle">0</property>
</widget>
<packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
</packing>
</child>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">fill</property>
+ <property name="y_options">fill</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label76">
+ <property name="visible">True</property>
+ <property name="label"
translatable="yes">Autostart:</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property
name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property
name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkCheckButton" id="pool-autostart">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Some
label</property>
+ <property name="use_underline">True</property>
+ <property
name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled"
handler="on_pool_autostart_toggled" last_modification_time="Thu, 07 Aug 2008
01:27:28 GMT"/>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkVBox" id="vbox6">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">3</property>
+
+ <child>
+ <widget class="GtkLabel" id="label77">
+ <property name="visible">True</property>
+ <property name="label"
translatable="yes"><b>Volumes</b></property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property
name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property
name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkScrolledWindow"
id="scrolledwindow5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property
name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+ <property
name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+ <property
name="shadow_type">GTK_SHADOW_IN</property>
+ <property
name="window_placement">GTK_CORNER_TOP_LEFT</property>
<child>
- <widget class="GtkEntry" id="storage-location">
+ <widget class="GtkTreeView" id="vol-list">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="editable">False</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text"
translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char">â¢</property>
- <property
name="activates_default">False</property>
- <accessibility>
- <atkproperty
name="AtkObject::accessible_name" translatable="yes">Storage
Location</atkproperty>
- </accessibility>
+ <property
name="headers_visible">True</property>
+ <property name="rules_hint">False</property>
+ <property name="reorderable">False</property>
+ <property name="enable_search">True</property>
+ <property
name="fixed_height_mode">False</property>
+ <property
name="hover_selection">False</property>
+ <property name="hover_expand">False</property>
</widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
</child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="shrink">True</property>
+ <property name="resize">True</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkHBox" id="hbox9">
+ <property name="border_width">3</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkHBox" id="hbox10">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkButton" id="pool-add">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal name="clicked" handler="on_pool_add_clicked"
last_modification_time="Thu, 07 Aug 2008 01:22:11 GMT"/>
+
+ <child>
+ <widget class="GtkImage" id="image4">
+ <property name="visible">True</property>
+ <property name="stock">gtk-add</property>
+ <property name="icon_size">4</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="pool-start">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal name="clicked"
handler="on_pool_start_clicked" last_modification_time="Thu, 07 Aug 2008
01:24:39 GMT"/>
+
+ <child>
+ <widget class="GtkImage" id="someicon">
+ <property name="visible">True</property>
+ <property name="stock">gtk-media-play</property>
+ <property name="icon_size">4</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="pool-stop">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal name="clicked" handler="on_pool_stop_clicked"
last_modification_time="Thu, 07 Aug 2008 01:24:56 GMT"/>
+
+ <child>
+ <widget class="GtkImage" id="image6">
+ <property name="visible">True</property>
+ <property name="stock">gtk-cancel</property>
+ <property name="icon_size">4</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="pool-delete">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal name="clicked"
handler="on_pool_delete_clicked" last_modification_time="Thu, 07 Aug 2008
01:25:09 GMT"/>
+
+ <child>
+ <widget class="GtkImage" id="image7">
+ <property name="visible">True</property>
+ <property name="stock">gtk-delete</property>
+ <property name="icon_size">4</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkHBox" id="hbox11">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkButton" id="vol-add">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal name="clicked" handler="on_vol_add_clicked"
last_modification_time="Thu, 07 Aug 2008 03:19:43 GMT"/>
+
+ <child>
+ <widget class="GtkAlignment" id="alignment9">
+ <property name="visible">True</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xscale">0</property>
+ <property name="yscale">0</property>
+ <property name="top_padding">0</property>
+ <property name="bottom_padding">0</property>
+ <property name="left_padding">0</property>
+ <property name="right_padding">0</property>
<child>
- <widget class="GtkLabel" id="label68">
+ <widget class="GtkHBox" id="hbox13">
<property name="visible">True</property>
- <property name="label"
translatable="yes">Name:</property>
- <property
name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property
name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property
name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property
name="single_line_mode">False</property>
- <property name="angle">0</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">2</property>
+
+ <child>
+ <widget class="GtkImage" id="image8">
+ <property name="visible">True</property>
+ <property name="stock">gtk-new</property>
+ <property name="icon_size">4</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="somelabel">
+ <property name="visible">True</property>
+ <property name="label"
translatable="yes">New Volume</property>
+ <property
name="use_underline">True</property>
+ <property
name="use_markup">False</property>
+ <property
name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property
name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property
name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property
name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
</widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="storage-name">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">False</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text"
translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char">â¢</property>
- <property
name="activates_default">False</property>
- <accessibility>
- <atkproperty
name="AtkObject::accessible_name" translatable="yes">Storage Name</atkproperty>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
</child>
</widget>
</child>
</widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
</child>
<child>
- <widget class="GtkLabel" id="label62">
+ <widget class="GtkButton" id="vol-delete">
<property name="visible">True</property>
- <property name="label"
translatable="yes"><b>Basic details</b></property>
- <property name="use_underline">False</property>
- <property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property
name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
+ <property name="can_focus">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal name="clicked"
handler="on_vol_delete_clicked" last_modification_time="Thu, 07 Aug 2008
01:26:50 GMT"/>
+
+ <child>
+ <widget class="GtkAlignment" id="alignment10">
+ <property name="visible">True</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xscale">0</property>
+ <property name="yscale">0</property>
+ <property name="top_padding">0</property>
+ <property name="bottom_padding">0</property>
+ <property name="left_padding">0</property>
+ <property name="right_padding">0</property>
+
+ <child>
+ <widget class="GtkHBox" id="hbox14">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">2</property>
+
+ <child>
+ <widget class="GtkImage" id="image9">
+ <property name="visible">True</property>
+ <property
name="stock">gtk-delete</property>
+ <property name="icon_size">4</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label82">
+ <property name="visible">True</property>
+ <property name="label"
translatable="yes">Delete Volume</property>
+ <property
name="use_underline">True</property>
+ <property
name="use_markup">False</property>
+ <property
name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property
name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property
name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property
name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
</widget>
<packing>
- <property name="type">label_item</property>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="pool-apply">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label">gtk-apply</property>
+ <property name="use_stock">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal name="clicked"
handler="on_pool_apply_clicked" last_modification_time="Fri, 08 Aug 2008
01:11:49 GMT"/>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
</packing>
</child>
</widget>
@@ -1923,47 +2460,10 @@
<property name="fill">True</property>
</packing>
</child>
-
- <child>
- <widget class="GtkHSeparator" id="hseparator2">
- <property name="visible">True</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHButtonBox" id="hbuttonbox2">
- <property name="border_width">6</property>
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
- <property name="spacing">3</property>
-
- <child>
- <widget class="GtkButton" id="storage-apply">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-apply</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
</widget>
<packing>
<property name="padding">0</property>
- <property name="expand">True</property>
+ <property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
_______________________________________________
et-mgmt-tools mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/et-mgmt-tools