diff options
author | Cédric Bosdonnat <cbosdonnat@suse.com> | 2014-01-21 10:05:30 +0100 |
---|---|---|
committer | Cole Robinson <crobinso@redhat.com> | 2014-01-21 09:29:13 -0500 |
commit | 40422e13f2bb57c259058ddbff028812a253b4cc (patch) | |
tree | b08657c51b75855c15714bd2da67c2178d0b8c74 | |
parent | d888ff2394f678599009f40d9802569a69875da5 (diff) | |
download | virt-manager-40422e13f2bb57c259058ddbff028812a253b4cc.tar.gz |
Create a separate class vmmFSDetails to share filesystem addhardware UI
This class will be reused in the virtManager/details.py code soon to
provide the same UI to modify filesystem devices than to create them.
-rw-r--r-- | ui/addhardware.ui | 438 | ||||
-rw-r--r-- | ui/fsdetails.ui | 449 | ||||
-rw-r--r-- | virtManager/addhardware.py | 289 | ||||
-rw-r--r-- | virtManager/fsdetails.py | 387 |
4 files changed, 853 insertions, 710 deletions
diff --git a/ui/addhardware.ui b/ui/addhardware.ui index 1d8f17f3..ce818503 100644 --- a/ui/addhardware.ui +++ b/ui/addhardware.ui @@ -1729,444 +1729,12 @@ </packing> </child> <child> - <object class="GtkGrid" id="table9"> + <object class="GtkBox" id="fs-box"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - <child> - <object class="GtkHBox" id="fs-type-box"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <child> - <object class="GtkComboBox" id="fs-type-combo"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <signal name="changed" handler="on_fs_type_combo_changed" swapped="no"/> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="fs-type-label"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">0</property> - <property name="label">Passthrough</property> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">0</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkHBox" id="fs-mode-box"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <child> - <object class="GtkComboBox" id="fs-mode-combo"> - <property name="visible">True</property> - <property name="can_focus">False</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="fs-mode-label"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Default</property> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">3</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkHBox" id="fs-driver-box"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <child> - <object class="GtkComboBox" id="fs-driver-combo"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <signal name="changed" handler="on_fs_driver_combo_changed" swapped="no"/> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="fs-driver-label"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Default</property> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">1</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkHBox" id="fs-wrpolicy-box"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <child> - <object class="GtkComboBox" id="fs-wrpolicy-combo"> - <property name="visible">True</property> - <property name="can_focus">False</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="fs-wrpolicy-label"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Default</property> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">4</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="fs-target"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">7</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="fs-readonly"> - <property name="label" translatable="yes">E_xport filesystem as readonly mount</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="use_underline">True</property> - <property name="xalign">0.5</property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">8</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkHBox" id="fs-source-box"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="spacing">6</property> - <child> - <object class="GtkEntry" id="fs-source"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkButton" id="fs-source-browse"> - <property name="label" translatable="yes">_Browse...</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="use_underline">True</property> - <signal name="clicked" handler="on_fs_source_browse_clicked" swapped="no"/> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">5</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label18"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">_Type:</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">fs-type-combo</property> - </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">0</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="fs-mode-title"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">_Mode:</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">fs-mode-combo</property> - </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">3</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="fs-driver-title"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">_Driver:</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">fs-driver-combo</property> - </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">1</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="fs-wrpolicy-title"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">_Write Policy:</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">fs-wrpolicy-combo</property> - </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">4</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="fs-source-title"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">0</property> - <property name="label">src labelll:</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">fs-source</property> - </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">5</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> + <property name="orientation">vertical</property> <child> - <object class="GtkLabel" id="label33"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Ta_rget path:</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">fs-target</property> - </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">7</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkAlignment" id="alignment20"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <child> - <placeholder/> - </child> - </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">8</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="fs-ram-source-title"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">0</property> - <property name="label">Usage:</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">fs-source</property> - </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">6</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkBox" id="fs-ram-source-box"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="spacing">6</property> - <child> - <object class="GtkSpinButton" id="fs-ram-source-spin"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="xalign">1</property> - <property name="adjustment">adjustment6</property> - <property name="climb_rate">1</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkComboBox" id="fs-ram-units-combo"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <signal name="changed" handler="on_fs_ram_units_combo_changed" swapped="no"/> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">6</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="fs-format-title"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">_Format:</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">fs-format-combo</property> - </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">2</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkHBox" id="fs-format-box"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <child> - <object class="GtkComboBox" id="fs-format-combo"> - <property name="visible">True</property> - <property name="can_focus">False</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="fs-format-label"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Default</property> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">2</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> + <placeholder/> </child> </object> <packing> diff --git a/ui/fsdetails.ui b/ui/fsdetails.ui new file mode 100644 index 00000000..bf19b6b6 --- /dev/null +++ b/ui/fsdetails.ui @@ -0,0 +1,449 @@ +<?xml version="1.0" encoding="UTF-8"?> +<interface> + <!-- interface-requires gtk+ 3.0 --> + <object class="GtkAdjustment" id="adjustment6"> + <property name="upper">1000000</property> + <property name="step_increment">100</property> + <property name="page_increment">1000</property> + </object> + <object class="GtkGrid" id="vmm-fs-details"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="row_spacing">6</property> + <property name="column_spacing">6</property> + <child> + <object class="GtkHBox" id="fs-type-box"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkComboBox" id="fs-type-combo"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <signal name="changed" handler="on_fs_type_combo_changed" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="fs-type-label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label">Passthrough</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkHBox" id="fs-mode-box"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkComboBox" id="fs-mode-combo"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="fs-mode-label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Default</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">3</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkHBox" id="fs-driver-box"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkComboBox" id="fs-driver-combo"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <signal name="changed" handler="on_fs_driver_combo_changed" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="fs-driver-label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Default</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkHBox" id="fs-wrpolicy-box"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkComboBox" id="fs-wrpolicy-combo"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="fs-wrpolicy-label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Default</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">4</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="fs-target"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">●</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">7</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="fs-readonly"> + <property name="label" translatable="yes">E_xport filesystem as readonly mount</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="xalign">0.5</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">8</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkHBox" id="fs-source-box"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">6</property> + <child> + <object class="GtkEntry" id="fs-source"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">●</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="fs-source-browse"> + <property name="label" translatable="yes">_Browse...</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_underline">True</property> + <signal name="clicked" handler="on_fs_source_browse_clicked" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">5</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">_Type:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">fs-type-combo</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="fs-mode-title"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">_Mode:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">fs-mode-combo</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">3</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="fs-driver-title"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">_Driver:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">fs-driver-combo</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="fs-wrpolicy-title"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">_Write Policy:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">fs-wrpolicy-combo</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">4</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="fs-source-title"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label">src labelll:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">fs-source</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">5</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Ta_rget path:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">fs-target</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">7</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkAlignment" id="alignment20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">8</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="fs-ram-source-title"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label">Usage:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">fs-source</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">6</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkBox" id="fs-ram-source-box"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">6</property> + <child> + <object class="GtkSpinButton" id="fs-ram-source-spin"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="xalign">1</property> + <property name="adjustment">adjustment6</property> + <property name="climb_rate">1</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkComboBox" id="fs-ram-units-combo"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <signal name="changed" handler="on_fs_ram_units_combo_changed" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">6</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="fs-format-title"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">_Format:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">fs-format-combo</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">2</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkHBox" id="fs-format-box"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkComboBox" id="fs-format-combo"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="fs-format-label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Default</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">2</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + </object> +</interface> diff --git a/virtManager/addhardware.py b/virtManager/addhardware.py index f41d7f3e..82a99c69 100644 --- a/virtManager/addhardware.py +++ b/virtManager/addhardware.py @@ -30,12 +30,12 @@ import virtinst from virtinst import (VirtualChannelDevice, VirtualParallelDevice, VirtualSerialDevice, VirtualConsoleDevice, VirtualVideoDevice, VirtualWatchdog, - VirtualFilesystem, VirtualSmartCardDevice, - VirtualRedirDevice, VirtualTPMDevice, - VirtualPanicDevice) + VirtualSmartCardDevice, VirtualRedirDevice, + VirtualTPMDevice, VirtualPanicDevice) from virtinst import VirtualController from virtManager import uihelpers +from virtManager.fsdetails import vmmFSDetails from virtManager.asyncjob import vmmAsyncJob from virtManager.storagebrowse import vmmStorageBrowser from virtManager.baseclass import vmmGObjectUI @@ -93,11 +93,6 @@ class vmmAddHardware(vmmGObjectUI): "on_tpm_device_type_changed": self.change_tpm_device_type, - "on_fs_type_combo_changed": self.change_fs_type, - "on_fs_driver_combo_changed": self.change_fs_driver, - "on_fs_source_browse_clicked": self.browse_fs_source, - "on_fs_ram_units_combo_changed": self.change_ram_units, - "on_usbredir_type_changed": self.change_usbredir_type, "on_rng_type_changed": self.change_rng, @@ -106,6 +101,11 @@ class vmmAddHardware(vmmGObjectUI): }) self.bind_escape_key_close() + self.fsDetails = vmmFSDetails(vm) + fsbox = self.widget("fs-box") + fsbox.add(self.fsDetails.topwin) + self.fsDetails.topwin.show_all() + self.set_initial_state() def show(self, parent): @@ -134,6 +134,8 @@ class vmmAddHardware(vmmGObjectUI): self.storage_browser.cleanup() self.storage_browser = None + self.fsDetails.cleanup() + def is_visible(self): return self.topwin.get_visible() @@ -300,52 +302,8 @@ class vmmAddHardware(vmmGObjectUI): combo = self.widget("watchdog-action") uihelpers.build_watchdogaction_combo(self.vm, combo) - def simple_store_set(comboname, values, units=False): - combo = self.widget(comboname) - model = Gtk.ListStore(str, str) - combo.set_model(model) - text = Gtk.CellRendererText() - combo.pack_start(text, True) - combo.add_attribute(text, 'text', 1) - if not units: - model.set_sort_column_id(0, Gtk.SortType.ASCENDING) - for val in values: - model.append([val, val.capitalize()]) - else: - for val in values: - model.append([val.lower(), val]) - # Filesystem widgets - if self.conn.is_openvz(): - simple_store_set("fs-type-combo", [VirtualFilesystem.TYPE_MOUNT, - VirtualFilesystem.TYPE_TEMPLATE]) - elif self.conn.is_lxc(): - simple_store_set("fs-type-combo", [VirtualFilesystem.TYPE_MOUNT, - VirtualFilesystem.TYPE_FILE, - VirtualFilesystem.TYPE_BLOCK, - VirtualFilesystem.TYPE_RAM]) - else: - simple_store_set("fs-type-combo", [VirtualFilesystem.TYPE_MOUNT]) - - simple_store_set("fs-mode-combo", VirtualFilesystem.MODES) - if self.conn.is_qemu(): - simple_store_set("fs-driver-combo", [VirtualFilesystem.DRIVER_PATH, - VirtualFilesystem.DRIVER_HANDLE, - VirtualFilesystem.DRIVER_DEFAULT]) - elif self.conn.is_lxc(): - simple_store_set("fs-driver-combo", [VirtualFilesystem.DRIVER_LOOP, - VirtualFilesystem.DRIVER_NBD, - VirtualFilesystem.DRIVER_DEFAULT]) - simple_store_set("fs-format-combo", VirtualFilesystem.NBD_FORMATS) - simple_store_set("fs-wrpolicy-combo", VirtualFilesystem.WRPOLICIES) - self.show_pair_combo("fs-type", self.conn.is_openvz() or self.conn.is_lxc()) - self.show_check_button("fs-readonly", - self.conn.is_qemu() or self.conn.is_lxc()) - - simple_store_set("fs-ram-units-combo", ["B", "KB", "MB", "GB", - "TB", "PB", "EB", "KiB", - "MiB", "GiB", "TiB", "PiB", - "EiB"], True) + self.fsDetails.set_initial_state() # Smartcard widgets combo = self.widget("smartcard-mode") @@ -525,15 +483,7 @@ class vmmAddHardware(vmmGObjectUI): self.widget("char-auto-socket").set_active(True) # FS params - self.widget("fs-type-combo").set_active(0) - self.widget("fs-mode-combo").set_active(0) - self.widget("fs-driver-combo").set_active(0) - self.widget("fs-format-combo").set_active(0) - self.widget("fs-wrpolicy-combo").set_active(0) - self.widget("fs-source").set_text("") - self.widget("fs-target").set_text("") - self.widget("fs-readonly").set_active(False) - self.widget("fs-ram-units-combo").set_active(2) + self.fsDetails.reset_state() # Video params uihelpers.populate_video_combo(self.vm, self.widget("video-model")) @@ -895,63 +845,6 @@ class vmmAddHardware(vmmGObjectUI): modbox = self.widget("watchdog-action") return modbox.get_model()[modbox.get_active()][0] - # FS getters - def get_config_fs_mode(self): - name = "fs-mode-combo" - combo = self.widget(name) - if not combo.get_visible(): - return None - - return combo.get_model()[combo.get_active()][0] - - def get_config_fs_wrpolicy(self): - name = "fs-wrpolicy-combo" - combo = self.widget(name) - if not combo.get_visible(): - return None - - return combo.get_model()[combo.get_active()][0] - - def get_config_fs_type(self): - name = "fs-type-combo" - combo = self.widget(name) - if not combo.get_visible(): - return None - - return combo.get_model()[combo.get_active()][0] - - def get_config_fs_readonly(self): - name = "fs-readonly" - check = self.widget(name) - if not check.get_visible(): - return None - - return check.get_active() - - def get_config_fs_driver(self): - name = "fs-driver-combo" - combo = self.widget(name) - if not combo.get_visible(): - return None - - return combo.get_model()[combo.get_active()][0] - - def get_config_fs_format(self): - name = "fs-format-combo" - combo = self.widget(name) - if not combo.get_visible(): - return None - - return combo.get_model()[combo.get_active()][0] - - def get_config_fs_units(self): - name = "fs-ram-units-combo" - combo = self.widget(name) - if not combo.get_visible(): - return None - - return combo.get_model()[combo.get_active()][1] - # Smartcard getters def get_config_smartcard_mode(self): mode = self.widget("smartcard-mode") @@ -1097,16 +990,6 @@ class vmmAddHardware(vmmGObjectUI): notebook.get_nth_page(page).show() notebook.set_current_page(page) - def show_pair_combo(self, basename, show_combo): - combo = self.widget(basename + "-combo") - label = self.widget(basename + "-label") - - combo.set_visible(show_combo) - label.set_visible(not show_combo) - - def show_check_button(self, basename, show): - check = self.widget(basename) - check.set_visible(show) # Storage listeners def browse_storage(self, ignore1): @@ -1321,96 +1204,6 @@ class vmmAddHardware(vmmGObjectUI): v = is_egd and not udp uihelpers.set_grid_row_visible(self.widget("rng-backend-mode"), v) - # FS listeners - def browse_fs_source(self, ignore1): - self._browse_file(self.widget("fs-source"), isdir=True) - - def update_fs_rows(self): - fstype = self.get_config_fs_type() - fsdriver = self.get_config_fs_driver() - ismount = bool( - fstype == VirtualFilesystem.TYPE_MOUNT or - self.conn.is_qemu()) - - show_mode = bool(ismount and - (fsdriver == VirtualFilesystem.DRIVER_PATH or - fsdriver == VirtualFilesystem.DRIVER_DEFAULT)) - uihelpers.set_grid_row_visible(self.widget("fs-mode-box"), show_mode) - - show_wrpol = bool(ismount and - fsdriver and (fsdriver == VirtualFilesystem.DRIVER_PATH or - fsdriver == VirtualFilesystem.DRIVER_HANDLE)) - uihelpers.set_grid_row_visible(self.widget("fs-wrpolicy-box"), - show_wrpol) - - show_ram_source = fstype == VirtualFilesystem.TYPE_RAM - uihelpers.set_grid_row_visible(self.widget("fs-ram-source-box"), show_ram_source) - uihelpers.set_grid_row_visible(self.widget("fs-source-box"), not show_ram_source) - - show_format = bool( - fsdriver == VirtualFilesystem.DRIVER_NBD) - uihelpers.set_grid_row_visible(self.widget("fs-format-box"), show_format) - self.show_pair_combo("fs-format", True) - - show_mode_combo = False - show_driver_combo = False - show_wrpolicy_combo = self.conn.is_qemu() - if fstype == VirtualFilesystem.TYPE_TEMPLATE: - source_text = _("Te_mplate:") - else: - source_text = _("_Source path:") - show_mode_combo = self.conn.is_qemu() - show_driver_combo = self.conn.is_qemu() or self.conn.is_lxc() - - self.widget("fs-source-title").set_text(source_text) - self.widget("fs-source-title").set_use_underline(True) - self.show_pair_combo("fs-mode", show_mode_combo) - self.show_pair_combo("fs-driver", show_driver_combo) - self.show_pair_combo("fs-wrpolicy", show_wrpolicy_combo) - - def change_fs_type(self, ignore): - self.update_fs_rows() - - def change_fs_driver(self, ignore): - self.update_fs_rows() - - def change_ram_units(self, ignore): - units = self.get_config_fs_units() - usage = uihelpers.spin_get_helper(self.widget("fs-ram-source-spin")) - - upper = self.convert_units(16, "eib", units.lower()) - self.widget("fs-ram-source-spin").get_adjustment().set_upper(upper) - - new_value = self.convert_units(usage, self.fs_units, units.lower()) - self.widget("fs-ram-source-spin").set_value(new_value) - self.fs_units = units.lower() - - def convert_units(self, value, old_unit, new_unit): - def get_factor(unit): - factor = 1000 - if unit[-2:] == 'ib': - factor = 1024 - return factor - - def get_power(unit): - powers = ('k', 'm', 'g', 't', 'p', 'e') - power = 0 - if unit[0] in powers: - power = powers.index(unit[0]) + 1 - return power - - # First convert it all into bytes - factor = get_factor(old_unit) - power = get_power(old_unit) - in_bytes = value * pow(factor, power) - - # Then convert it to the target unit - factor = get_factor(new_unit) - power = get_power(new_unit) - - return in_bytes / pow(factor, power) - - ###################### # Add device methods # @@ -1825,62 +1618,8 @@ class vmmAddHardware(vmmGObjectUI): return self.err.val_err(_("Watchdog parameter error"), e) def validate_page_filesystem(self): - conn = self.conn.get_backend() - source = self.widget("fs-source").get_text() - target = self.widget("fs-target").get_text() - usage = uihelpers.spin_get_helper(self.widget("fs-ram-source-spin")) - mode = self.get_config_fs_mode() - fstype = self.get_config_fs_type() - readonly = self.get_config_fs_readonly() - driver = self.get_config_fs_driver() - fsformat = self.get_config_fs_format() - wrpolicy = self.get_config_fs_wrpolicy() - units = self.get_config_fs_units() - - if not source and fstype != VirtualFilesystem.TYPE_RAM: - return self.err.val_err(_("A filesystem source must be specified")) - elif usage == 0 and fstype == VirtualFilesystem.TYPE_RAM: - return self.err.val_err(_("A RAM filesystem usage must be specified")) - if not target: - return self.err.val_err(_("A filesystem target must be specified")) - - if self.conn.is_qemu() and self.filesystem_target_present(target): - return self.err.val_err(_('Invalid target path. A filesystem with' - ' that target already exists')) - - try: - self._dev = virtinst.VirtualFilesystem(conn) - if fstype == VirtualFilesystem.TYPE_RAM: - self._dev.source = usage - self._dev.units = units - else: - self._dev.source = source - self._dev.target = target - if mode: - self._dev.mode = mode - if fstype: - self._dev.type = fstype - if readonly: - self._dev.readonly = readonly - if driver: - self._dev.driver = driver - if driver == VirtualFilesystem.DRIVER_LOOP: - self._dev.format = "raw" - elif driver == VirtualFilesystem.DRIVER_NBD: - self._dev.format = fsformat - if wrpolicy: - self._dev.wrpolicy = wrpolicy - except Exception, e: - return self.err.val_err(_("Filesystem parameter error"), e) - - def filesystem_target_present(self, target): - fsdevs = self.vm.get_filesystem_devices() - - for fs in fsdevs: - if (fs.target == target): - return True - - return False + self.fsDetails.validate_page_filesystem() + self._dev = self.fsDetails.get_dev() def validate_page_smartcard(self): conn = self.conn.get_backend() diff --git a/virtManager/fsdetails.py b/virtManager/fsdetails.py new file mode 100644 index 00000000..a0196bbe --- /dev/null +++ b/virtManager/fsdetails.py @@ -0,0 +1,387 @@ +# +# Copyright (C) 2006-2007, 2013 Red Hat, Inc. +# Copyright (C) 2006 Hugh O. Brock <hbrock@redhat.com> +# Copyright (C) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany. +# +# 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. +# + +# pylint: disable=E0611 +from gi.repository import Gtk +# pylint: enable=E0611 + +from virtinst import VirtualFilesystem +from virtManager import uihelpers +from virtManager.baseclass import vmmGObjectUI +from virtManager.storagebrowse import vmmStorageBrowser + + +class vmmFSDetails(vmmGObjectUI): + def __init__(self, vm): + vmmGObjectUI.__init__(self, "fsdetails.ui", "vmm-fs-details") + + self.vm = vm + self.conn = vm.conn + + self._dev = None + self.storage_browser = None + self.units = "mb" + + self.builder.connect_signals({ + "on_fs_type_combo_changed": self.change_field, + "on_fs_driver_combo_changed": self.change_field, + "on_fs_source_browse_clicked": self.browse_fs_source, + "on_fs_ram_units_combo_changed": self.change_ram_units, + }) + + def _cleanup(self): + self.vm = None + self.conn = None + self._dev = None + + if self.storage_browser: + self.storage_browser.cleanup() + self.storage_browser = None + + def show_pair_combo(self, basename, show_combo): + combo = self.widget(basename + "-combo") + label = self.widget(basename + "-label") + + combo.set_visible(show_combo) + label.set_visible(not show_combo) + + def show_check_button(self, basename, show): + check = self.widget(basename) + check.set_visible(show) + + ########################## + # Initialization methods # + ########################## + + def set_initial_state(self): + def simple_store_set(comboname, values, units=False): + combo = self.widget(comboname) + model = Gtk.ListStore(str, str) + combo.set_model(model) + text = Gtk.CellRendererText() + combo.pack_start(text, True) + combo.add_attribute(text, 'text', 1) + if not units: + model.set_sort_column_id(0, Gtk.SortType.ASCENDING) + for val in values: + model.append([val, val.capitalize()]) + else: + for val in values: + model.append([val.lower(), val]) + + # Filesystem widgets + if self.conn.is_openvz(): + simple_store_set("fs-type-combo", [VirtualFilesystem.TYPE_MOUNT, + VirtualFilesystem.TYPE_TEMPLATE]) + elif self.conn.is_lxc(): + simple_store_set("fs-type-combo", [VirtualFilesystem.TYPE_MOUNT, + VirtualFilesystem.TYPE_FILE, + VirtualFilesystem.TYPE_BLOCK, + VirtualFilesystem.TYPE_RAM]) + else: + simple_store_set("fs-type-combo", [VirtualFilesystem.TYPE_MOUNT]) + self.widget("fs-type-label").set_text(VirtualFilesystem.TYPE_MOUNT) + + simple_store_set("fs-mode-combo", VirtualFilesystem.MODES) + if self.conn.is_qemu(): + simple_store_set("fs-driver-combo", [VirtualFilesystem.DRIVER_PATH, + VirtualFilesystem.DRIVER_HANDLE, + VirtualFilesystem.DRIVER_DEFAULT]) + elif self.conn.is_lxc(): + simple_store_set("fs-driver-combo", [VirtualFilesystem.DRIVER_LOOP, + VirtualFilesystem.DRIVER_NBD, + VirtualFilesystem.DRIVER_DEFAULT]) + simple_store_set("fs-format-combo", VirtualFilesystem.NBD_FORMATS) + simple_store_set("fs-wrpolicy-combo", VirtualFilesystem.WRPOLICIES) + self.show_pair_combo("fs-type", self.conn.is_openvz() or self.conn.is_lxc()) + self.show_check_button("fs-readonly", + self.conn.is_qemu() or self.conn.is_lxc()) + + simple_store_set("fs-ram-units-combo", ["B", "KB", "MB", "GB", + "TB", "PB", "EB", "KiB", + "MiB", "GiB", "TiB", "PiB", + "EiB"], True) + + def reset_state(self): + self.widget("fs-type-combo").set_active(0) + self.widget("fs-mode-combo").set_active(0) + self.widget("fs-driver-combo").set_active(0) + self.widget("fs-format-combo").set_active(0) + self.widget("fs-wrpolicy-combo").set_active(0) + self.widget("fs-source").set_text("") + self.widget("fs-target").set_text("") + self.widget("fs-readonly").set_active(False) + self.widget("fs-ram-units-combo").set_active(2) + + # Getters + def get_dev(self): + return self._dev + + def get_config_fs_mode(self): + name = "fs-mode-combo" + combo = self.widget(name) + if not combo.get_visible(): + return None + + return combo.get_model()[combo.get_active()][0] + + def get_config_fs_wrpolicy(self): + name = "fs-wrpolicy-combo" + combo = self.widget(name) + if not combo.get_visible(): + return None + + return combo.get_model()[combo.get_active()][0] + + def get_config_fs_type(self): + name = "fs-type-combo" + combo = self.widget(name) + if not combo.get_visible(): + return None + + return combo.get_model()[combo.get_active()][0] + + def get_config_fs_readonly(self): + name = "fs-readonly" + check = self.widget(name) + if not check.get_visible(): + return None + + return check.get_active() + + def get_config_fs_driver(self): + name = "fs-driver-combo" + combo = self.widget(name) + if not combo.get_visible(): + return None + + return combo.get_model()[combo.get_active()][0] + + def get_config_fs_format(self): + name = "fs-format-combo" + combo = self.widget(name) + if not combo.get_visible(): + return None + + return combo.get_model()[combo.get_active()][0] + + def get_config_fs_units(self): + name = "fs-ram-units-combo" + combo = self.widget(name) + if not combo.get_visible(): + return None + + return combo.get_model()[combo.get_active()][1] + + # Setters + def set_config_ram_usage(self, usage, units): + value = int(usage) + + upper = self.convert_units(16, "eib", units.lower()) + self.widget("fs-ram-source-spin").get_adjustment().set_upper(upper) + self.widget("fs-ram-source-spin").set_value(value) + + units = units.lower() + if units == "bytes" or units == "byte": + units = "b" + + self.units = units + self.set_config_value("fs-ram-units", units) + + + def set_config_value(self, name, value): + combo = self.widget("%s-combo" % name) + label = self.widget("%s-label" % name) + + idx = -1 + model_list = [x[0] for x in combo.get_model()] + model_in_list = (value in model_list) + if model_in_list: + idx = model_list.index(value) + + combo.set_active(idx) + if label: + label.set_text(value) + + # listeners + def browse_fs_source(self, ignore1): + self._browse_file(self.widget("fs-source"), isdir=True) + + def update_fs_rows(self): + fstype = self.get_config_fs_type() + fsdriver = self.get_config_fs_driver() + ismount = bool( + fstype == VirtualFilesystem.TYPE_MOUNT or + self.conn.is_qemu()) + + show_mode = bool(ismount and + (fsdriver == VirtualFilesystem.DRIVER_PATH or + fsdriver == VirtualFilesystem.DRIVER_DEFAULT)) + uihelpers.set_grid_row_visible(self.widget("fs-mode-box"), show_mode) + + show_wrpol = bool(ismount and + fsdriver and (fsdriver == VirtualFilesystem.DRIVER_PATH or + fsdriver == VirtualFilesystem.DRIVER_HANDLE)) + uihelpers.set_grid_row_visible(self.widget("fs-wrpolicy-box"), + show_wrpol) + + show_ram_source = fstype == VirtualFilesystem.TYPE_RAM + uihelpers.set_grid_row_visible(self.widget("fs-ram-source-box"), show_ram_source) + uihelpers.set_grid_row_visible(self.widget("fs-source-box"), not show_ram_source) + + show_format = bool( + fsdriver == VirtualFilesystem.DRIVER_NBD) + uihelpers.set_grid_row_visible(self.widget("fs-format-box"), show_format) + self.show_pair_combo("fs-format", True) + + show_mode_combo = False + show_driver_combo = False + show_wrpolicy_combo = self.conn.is_qemu() + if fstype == VirtualFilesystem.TYPE_TEMPLATE: + source_text = _("Te_mplate:") + else: + source_text = _("_Source path:") + show_mode_combo = self.conn.is_qemu() + show_driver_combo = self.conn.is_qemu() or self.conn.is_lxc() + + self.widget("fs-source-title").set_text(source_text) + self.widget("fs-source-title").set_use_underline(True) + self.show_pair_combo("fs-mode", show_mode_combo) + self.show_pair_combo("fs-driver", show_driver_combo) + self.show_pair_combo("fs-wrpolicy", show_wrpolicy_combo) + + def change_field(self, src): + self.update_fs_rows() + + def change_ram_units(self, ignore): + units = self.get_config_fs_units() + usage = uihelpers.spin_get_helper(self.widget("fs-ram-source-spin")) + + upper = self.convert_units(16, "eib", units.lower()) + self.widget("fs-ram-source-spin").get_adjustment().set_upper(upper) + + new_value = self.convert_units(usage, self.units, units.lower()) + self.widget("fs-ram-source-spin").set_value(new_value) + self.units = units.lower() + + def convert_units(self, value, old_unit, new_unit): + def get_factor(unit): + factor = 1000 + if unit[-2:] == 'ib': + factor = 1024 + return factor + + def get_power(unit): + powers = ('k', 'm', 'g', 't', 'p', 'e') + power = 0 + if unit[0] in powers: + power = powers.index(unit[0]) + 1 + return power + + # First convert it all into bytes + factor = get_factor(old_unit) + power = get_power(old_unit) + in_bytes = value * pow(factor, power) + + # Then convert it to the target unit + factor = get_factor(new_unit) + power = get_power(new_unit) + + return in_bytes / pow(factor, power) + + # Page validation method + def validate_page_filesystem(self): + conn = self.conn.get_backend() + source = self.widget("fs-source").get_text() + target = self.widget("fs-target").get_text() + usage = uihelpers.spin_get_helper(self.widget("fs-ram-source-spin")) + mode = self.get_config_fs_mode() + fstype = self.get_config_fs_type() + readonly = self.get_config_fs_readonly() + driver = self.get_config_fs_driver() + fsformat = self.get_config_fs_format() + wrpolicy = self.get_config_fs_wrpolicy() + units = self.get_config_fs_units() + + if not source and fstype != VirtualFilesystem.TYPE_RAM: + return self.err.val_err(_("A filesystem source must be specified")) + elif usage == 0 and fstype == VirtualFilesystem.TYPE_RAM: + return self.err.val_err(_("A RAM filesystem usage must be specified")) + if not target: + return self.err.val_err(_("A filesystem target must be specified")) + + if self.conn.is_qemu() and self.filesystem_target_present(target): + return self.err.val_err(_('Invalid target path. A filesystem with' + ' that target already exists')) + + try: + self._dev = VirtualFilesystem(conn) + if fstype == VirtualFilesystem.TYPE_RAM: + self._dev.source = usage + self._dev.units = units + else: + self._dev.source = source + self._dev.target = target + if mode: + self._dev.mode = mode + if fstype: + self._dev.type = fstype + if readonly: + self._dev.readonly = readonly + if driver: + self._dev.driver = driver + if driver == VirtualFilesystem.DRIVER_LOOP: + self._dev.format = "raw" + elif driver == VirtualFilesystem.DRIVER_NBD: + self._dev.format = fsformat + if wrpolicy: + self._dev.wrpolicy = wrpolicy + except Exception, e: + return self.err.val_err(_("Filesystem parameter error"), e) + + def filesystem_target_present(self, target): + fsdevs = self.vm.get_filesystem_devices() + + for fs in fsdevs: + if (fs.target == target): + return True + + return False + + def _browse_file(self, textent, isdir=False): + def set_storage_cb(src, path): + if path: + textent.set_text(path) + + conn = self.conn + reason = (isdir and + self.config.CONFIG_DIR_FS or + self.config.CONFIG_DIR_IMAGE) + if self.storage_browser is None: + self.storage_browser = vmmStorageBrowser(conn) + + rhel6 = self.vm.rhel6_defaults() + self.storage_browser.rhel6_defaults = rhel6 + + self.storage_browser.set_finish_cb(set_storage_cb) + self.storage_browser.set_browse_reason(reason) + + self.storage_browser.show(self.topwin.get_ancestor(Gtk.Window), conn) |