diff --git a/po/POTFILES.in b/po/POTFILES.in index 712fe2fde..0726faa4e 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -14,6 +14,7 @@ src/virtManager/connect.py src/virtManager/connection.py src/virtManager/console.py src/virtManager/create.py +src/virtManager/createinterface.py src/virtManager/createmeter.py src/virtManager/createnet.py src/virtManager/createpool.py @@ -47,6 +48,7 @@ src/vmm-about.glade src/vmm-add-hardware.glade src/vmm-choose-cd.glade src/vmm-clone.glade +src/vmm-create-interface.glade src/vmm-create-net.glade src/vmm-create-pool.glade src/vmm-create-vol.glade diff --git a/po/virt-manager.pot b/po/virt-manager.pot index 49d2f8b87..df15af809 100644 --- a/po/virt-manager.pot +++ b/po/virt-manager.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-01-27 10:33-0500\n" +"POT-Creation-Date: 2010-02-08 17:14-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -31,7 +31,7 @@ msgstr "" #. ...the risk is we catch too much though #. Damned if we do, damned if we dont :-)( -#: ../src/virt-manager.py.in:304 +#: ../src/virt-manager.py.in:308 #, python-format msgid "Unable to initialize GTK: %s" msgstr "" @@ -256,10 +256,10 @@ msgstr "" #: ../src/virtManager/addhardware.py:92 ../src/virtManager/choosecd.py:49 #: ../src/virtManager/clone.py:108 ../src/virtManager/console.py:59 -#: ../src/virtManager/create.py:88 ../src/virtManager/createnet.py:55 +#: ../src/virtManager/create.py:90 ../src/virtManager/createnet.py:55 #: ../src/virtManager/createpool.py:53 ../src/virtManager/createvol.py:54 -#: ../src/virtManager/delete.py:61 ../src/virtManager/details.py:146 -#: ../src/virtManager/engine.py:70 ../src/virtManager/host.py:57 +#: ../src/virtManager/delete.py:61 ../src/virtManager/details.py:148 +#: ../src/virtManager/engine.py:70 ../src/virtManager/host.py:67 #: ../src/virtManager/manager.py:125 ../src/virtManager/migrate.py:65 #: ../src/virtManager/storagebrowse.py:57 ../src/virtManager/uihelpers.py:49 msgid "Unexpected Error" @@ -267,10 +267,10 @@ msgstr "" #: ../src/virtManager/addhardware.py:93 ../src/virtManager/choosecd.py:50 #: ../src/virtManager/clone.py:109 ../src/virtManager/console.py:60 -#: ../src/virtManager/create.py:89 ../src/virtManager/createnet.py:56 +#: ../src/virtManager/create.py:91 ../src/virtManager/createnet.py:56 #: ../src/virtManager/createpool.py:54 ../src/virtManager/createvol.py:55 -#: ../src/virtManager/delete.py:62 ../src/virtManager/details.py:147 -#: ../src/virtManager/engine.py:71 ../src/virtManager/host.py:58 +#: ../src/virtManager/delete.py:62 ../src/virtManager/details.py:149 +#: ../src/virtManager/engine.py:71 ../src/virtManager/host.py:68 #: ../src/virtManager/manager.py:126 ../src/virtManager/migrate.py:66 #: ../src/virtManager/storagebrowse.py:58 ../src/virtManager/uihelpers.py:50 msgid "An unexpected error occurred" @@ -290,28 +290,28 @@ msgid "Libvirt version does not support video devices." msgstr "" #. [xml value, label] -#: ../src/virtManager/addhardware.py:436 ../src/virtManager/details.py:1536 +#: ../src/virtManager/addhardware.py:436 ../src/virtManager/details.py:1556 msgid "Hypervisor default" msgstr "" -#: ../src/virtManager/addhardware.py:472 ../src/virtManager/details.py:1545 +#: ../src/virtManager/addhardware.py:472 ../src/virtManager/details.py:1565 msgid "EvTouch USB Graphics Tablet" msgstr "" #. XXX libvirt needs to support 'model' for input devices to distinguish #. wacom from evtouch tablets #. model.append([_("Wacom Graphics Tablet"), "tablet", "usb", True]) -#: ../src/virtManager/addhardware.py:476 ../src/virtManager/details.py:1547 +#: ../src/virtManager/addhardware.py:476 ../src/virtManager/details.py:1567 msgid "Generic USB Mouse" msgstr "" #: ../src/virtManager/addhardware.py:480 ../src/virtManager/addhardware.py:793 -#: ../src/virtManager/details.py:1579 +#: ../src/virtManager/details.py:1599 msgid "VNC server" msgstr "" #: ../src/virtManager/addhardware.py:481 ../src/virtManager/addhardware.py:793 -#: ../src/virtManager/details.py:1584 +#: ../src/virtManager/details.py:1604 msgid "Local SDL window" msgstr "" @@ -340,8 +340,8 @@ msgstr "" msgid "Bus type:" msgstr "" -#: ../src/virtManager/addhardware.py:759 ../src/vmm-create.glade.h:37 -#: ../src/vmm-host.glade.h:39 +#: ../src/virtManager/addhardware.py:759 ../src/vmm-create.glade.h:38 +#: ../src/vmm-host.glade.h:42 msgid "Storage" msgstr "" @@ -353,7 +353,7 @@ msgstr "" msgid "Target:" msgstr "" -#: ../src/virtManager/addhardware.py:771 ../src/vmm-details.glade.h:54 +#: ../src/virtManager/addhardware.py:771 ../src/vmm-details.glade.h:55 msgid "MAC address:" msgstr "" @@ -376,12 +376,11 @@ msgstr "" #: ../src/virtManager/addhardware.py:784 ../src/virtManager/addhardware.py:810 #: ../src/virtManager/addhardware.py:828 ../src/virtManager/addhardware.py:855 -#: ../src/vmm-create-net.glade.h:47 ../src/vmm-details.glade.h:98 -#: ../src/vmm-host.glade.h:40 +#: ../src/vmm-create-net.glade.h:47 ../src/vmm-details.glade.h:99 msgid "Type:" msgstr "" -#: ../src/virtManager/addhardware.py:785 ../src/vmm-details.glade.h:64 +#: ../src/virtManager/addhardware.py:785 ../src/vmm-details.glade.h:65 msgid "Mode:" msgstr "" @@ -391,8 +390,8 @@ msgstr "" #: ../src/virtManager/addhardware.py:794 ../src/virtManager/addhardware.py:795 #: ../src/virtManager/addhardware.py:796 ../src/virtManager/addhardware.py:797 -#: ../src/virtManager/details.py:1577 ../src/virtManager/details.py:1588 -#: ../src/virtManager/details.py:1589 ../src/virtManager/details.py:1590 +#: ../src/virtManager/details.py:1597 ../src/virtManager/details.py:1608 +#: ../src/virtManager/details.py:1609 ../src/virtManager/details.py:1610 msgid "N/A" msgstr "" @@ -404,7 +403,7 @@ msgstr "" msgid "No" msgstr "" -#: ../src/virtManager/addhardware.py:807 ../src/virtManager/details.py:1311 +#: ../src/virtManager/addhardware.py:807 ../src/virtManager/details.py:1331 #: ../src/vmm-add-hardware.glade.h:55 msgid "Same as host" msgstr "" @@ -413,15 +412,15 @@ msgstr "" msgid "Address:" msgstr "" -#: ../src/virtManager/addhardware.py:812 ../src/vmm-details.glade.h:73 +#: ../src/virtManager/addhardware.py:812 ../src/vmm-details.glade.h:74 msgid "Port:" msgstr "" -#: ../src/virtManager/addhardware.py:813 ../src/vmm-details.glade.h:70 +#: ../src/virtManager/addhardware.py:813 ../src/vmm-details.glade.h:71 msgid "Password:" msgstr "" -#: ../src/virtManager/addhardware.py:814 ../src/vmm-details.glade.h:53 +#: ../src/virtManager/addhardware.py:814 ../src/vmm-details.glade.h:54 msgid "Keymap:" msgstr "" @@ -429,7 +428,7 @@ msgstr "" msgid "Graphics" msgstr "" -#: ../src/virtManager/addhardware.py:822 ../src/vmm-details.glade.h:87 +#: ../src/virtManager/addhardware.py:822 ../src/vmm-details.glade.h:88 msgid "Sound" msgstr "" @@ -438,7 +437,7 @@ msgid "Protocol:" msgstr "" #: ../src/virtManager/addhardware.py:856 ../src/vmm-details.glade.h:41 -#: ../src/vmm-host.glade.h:18 +#: ../src/vmm-host.glade.h:19 msgid "Device:" msgstr "" @@ -446,128 +445,128 @@ msgstr "" msgid "Physical Host Device" msgstr "" -#: ../src/virtManager/addhardware.py:864 ../src/virtManager/details.py:1897 +#: ../src/virtManager/addhardware.py:864 ../src/virtManager/details.py:1918 msgid "Video" msgstr "" -#: ../src/virtManager/addhardware.py:889 +#: ../src/virtManager/addhardware.py:878 #, python-format msgid "Unable to add device: %s" msgstr "" -#: ../src/virtManager/addhardware.py:1063 +#: ../src/virtManager/addhardware.py:1028 msgid "Creating Storage File" msgstr "" -#: ../src/virtManager/addhardware.py:1064 +#: ../src/virtManager/addhardware.py:1029 msgid "Allocation of disk storage may take a few minutes to complete." msgstr "" -#: ../src/virtManager/addhardware.py:1089 +#: ../src/virtManager/addhardware.py:1058 msgid "Are you sure you want to add this device?" msgstr "" -#: ../src/virtManager/addhardware.py:1091 +#: ../src/virtManager/addhardware.py:1060 msgid "" "This device could not be attached to the running machine. Would you like to " "make the device available after the next VM shutdown?" msgstr "" -#: ../src/virtManager/addhardware.py:1101 +#: ../src/virtManager/addhardware.py:1070 #, python-format msgid "Error adding device: %s" msgstr "" -#: ../src/virtManager/addhardware.py:1118 -#: ../src/virtManager/addhardware.py:1120 ../src/virtManager/create.py:1451 +#: ../src/virtManager/addhardware.py:1089 +#: ../src/virtManager/addhardware.py:1091 ../src/virtManager/create.py:1516 #, python-format msgid "Unable to complete install: '%s'" msgstr "" -#: ../src/virtManager/addhardware.py:1150 +#: ../src/virtManager/addhardware.py:1121 msgid "Hardware Type Required" msgstr "" -#: ../src/virtManager/addhardware.py:1151 +#: ../src/virtManager/addhardware.py:1122 msgid "You must specify what type of hardware to add." msgstr "" -#: ../src/virtManager/addhardware.py:1157 +#: ../src/virtManager/addhardware.py:1128 msgid "Storage Path Required" msgstr "" -#: ../src/virtManager/addhardware.py:1158 +#: ../src/virtManager/addhardware.py:1129 msgid "You must specify a partition or a file for disk storage." msgstr "" -#: ../src/virtManager/addhardware.py:1161 +#: ../src/virtManager/addhardware.py:1132 msgid "Target Device Required" msgstr "" -#: ../src/virtManager/addhardware.py:1162 +#: ../src/virtManager/addhardware.py:1133 msgid "You must select a target device for the disk." msgstr "" -#: ../src/virtManager/addhardware.py:1192 +#: ../src/virtManager/addhardware.py:1163 msgid "Invalid Storage Parameters" msgstr "" #. Fatal errors are reported when setting 'size' -#: ../src/virtManager/addhardware.py:1196 ../src/virtManager/create.py:1259 +#: ../src/virtManager/addhardware.py:1167 ../src/virtManager/create.py:1308 msgid "Not Enough Free Space" msgstr "" -#: ../src/virtManager/addhardware.py:1202 ../src/virtManager/create.py:1265 +#: ../src/virtManager/addhardware.py:1173 ../src/virtManager/create.py:1314 #, python-format msgid "Disk \"%s\" is already in use by another guest!" msgstr "" -#: ../src/virtManager/addhardware.py:1203 ../src/virtManager/create.py:1267 +#: ../src/virtManager/addhardware.py:1174 ../src/virtManager/create.py:1316 msgid "Do you really want to use the disk?" msgstr "" -#: ../src/virtManager/addhardware.py:1218 +#: ../src/virtManager/addhardware.py:1197 msgid "Network selection error." msgstr "" -#: ../src/virtManager/addhardware.py:1219 +#: ../src/virtManager/addhardware.py:1198 msgid "A network source must be selected." msgstr "" -#: ../src/virtManager/addhardware.py:1222 +#: ../src/virtManager/addhardware.py:1201 msgid "Invalid MAC address" msgstr "" -#: ../src/virtManager/addhardware.py:1223 +#: ../src/virtManager/addhardware.py:1202 msgid "A MAC address must be entered." msgstr "" -#: ../src/virtManager/addhardware.py:1246 +#: ../src/virtManager/addhardware.py:1233 msgid "Graphics device parameter error" msgstr "" -#: ../src/virtManager/addhardware.py:1253 +#: ../src/virtManager/addhardware.py:1240 msgid "Sound device parameter error" msgstr "" -#: ../src/virtManager/addhardware.py:1259 +#: ../src/virtManager/addhardware.py:1246 msgid "Physical Device Requried" msgstr "" -#: ../src/virtManager/addhardware.py:1260 +#: ../src/virtManager/addhardware.py:1247 msgid "A device must be selected." msgstr "" -#: ../src/virtManager/addhardware.py:1267 +#: ../src/virtManager/addhardware.py:1254 msgid "Host device parameter error" msgstr "" -#: ../src/virtManager/addhardware.py:1307 +#: ../src/virtManager/addhardware.py:1294 #, python-format msgid "%s device parameter error." msgstr "" -#: ../src/virtManager/addhardware.py:1318 +#: ../src/virtManager/addhardware.py:1305 msgid "Video device parameter error." msgstr "" @@ -744,7 +743,7 @@ msgstr "" #: ../src/virtManager/connect.py:77 ../src/virtManager/manager.py:445 #: ../src/virtManager/storagebrowse.py:126 ../src/vmm-create-net.glade.h:29 -#: ../src/vmm-create-pool.glade.h:9 ../src/vmm-create.glade.h:28 +#: ../src/vmm-create-pool.glade.h:9 ../src/vmm-create.glade.h:29 msgid "Name" msgstr "" @@ -792,20 +791,22 @@ msgstr "" msgid "Active (RO)" msgstr "" -#: ../src/virtManager/connection.py:505 ../src/virtManager/host.py:377 -#: ../src/virtManager/host.py:602 ../src/vmm-host.glade.h:8 +#: ../src/virtManager/connection.py:505 ../src/virtManager/host.py:455 +#: ../src/virtManager/host.py:680 ../src/virtManager/host.py:889 +#: ../src/vmm-host.glade.h:9 msgid "Active" msgstr "" -#: ../src/virtManager/connection.py:507 ../src/virtManager/host.py:377 -#: ../src/virtManager/host.py:421 ../src/virtManager/host.py:602 -#: ../src/virtManager/host.py:634 ../src/virtManager/uihelpers.py:135 +#: ../src/virtManager/connection.py:507 ../src/virtManager/host.py:455 +#: ../src/virtManager/host.py:499 ../src/virtManager/host.py:680 +#: ../src/virtManager/host.py:712 ../src/virtManager/host.py:889 +#: ../src/virtManager/uihelpers.py:135 msgid "Inactive" msgstr "" -#: ../src/virtManager/connection.py:509 ../src/virtManager/create.py:1521 -#: ../src/virtManager/create.py:1522 ../src/virtManager/create.py:1524 -#: ../src/virtManager/details.py:1298 +#: ../src/virtManager/connection.py:509 ../src/virtManager/create.py:1586 +#: ../src/virtManager/create.py:1587 ../src/virtManager/create.py:1589 +#: ../src/virtManager/details.py:1318 ../src/virtManager/host.py:884 msgid "Unknown" msgstr "" @@ -873,7 +874,7 @@ msgstr "" msgid "Unsupported console authentication type" msgstr "" -#: ../src/virtManager/create.py:274 +#: ../src/virtManager/create.py:288 msgid "" "Fully allocating storage will take longer now, but the OS install phase will " "be quicker. \n" @@ -882,158 +883,162 @@ msgid "" "maximum image size exceeds available storage space." msgstr "" -#: ../src/virtManager/create.py:297 +#: ../src/virtManager/create.py:311 msgid "No active connection to install on." msgstr "" -#: ../src/virtManager/create.py:343 +#: ../src/virtManager/create.py:358 msgid "Connection is read only." msgstr "" -#: ../src/virtManager/create.py:353 +#: ../src/virtManager/create.py:368 msgid "No guests are supported for this connection." msgstr "" -#: ../src/virtManager/create.py:375 +#: ../src/virtManager/create.py:390 #, python-format msgid "%s installs not available for paravirt guests." msgstr "" -#: ../src/virtManager/create.py:379 +#: ../src/virtManager/create.py:394 msgid "URL installs not available for remote connections." msgstr "" -#: ../src/virtManager/create.py:381 ../src/virtManager/create.py:484 +#: ../src/virtManager/create.py:396 ../src/virtManager/create.py:499 msgid "Connection does not support storage management." msgstr "" -#: ../src/virtManager/create.py:393 +#: ../src/virtManager/create.py:408 msgid "No install options available for this connection." msgstr "" -#: ../src/virtManager/create.py:444 +#: ../src/virtManager/create.py:459 #, python-format msgid "Up to %(maxmem)s available on the host" msgstr "" -#: ../src/virtManager/create.py:458 +#: ../src/virtManager/create.py:473 #, python-format msgid "Hypervisor only supports %d virtual CPUs." msgstr "" -#: ../src/virtManager/create.py:468 +#: ../src/virtManager/create.py:483 #, python-format msgid "Up to %(numcpus)d available" msgstr "" -#: ../src/virtManager/create.py:534 +#: ../src/virtManager/create.py:549 msgid "Only URL installs are supported for paravirt." msgstr "" -#: ../src/virtManager/create.py:611 ../src/virtManager/create.py:620 -#: ../src/virtManager/create.py:690 ../src/virtManager/create.py:692 +#: ../src/virtManager/create.py:626 ../src/virtManager/create.py:635 +#: ../src/virtManager/create.py:705 ../src/virtManager/create.py:707 msgid "Generic" msgstr "" -#: ../src/virtManager/create.py:674 +#: ../src/virtManager/create.py:689 msgid "Local CDROM/ISO" msgstr "" -#: ../src/virtManager/create.py:676 +#: ../src/virtManager/create.py:691 msgid "URL Install Tree" msgstr "" -#: ../src/virtManager/create.py:678 +#: ../src/virtManager/create.py:693 msgid "PXE Install" msgstr "" -#: ../src/virtManager/create.py:681 ../src/virtManager/details.py:1299 +#: ../src/virtManager/create.py:696 ../src/virtManager/details.py:1319 msgid "None" msgstr "" -#: ../src/virtManager/create.py:1038 +#: ../src/virtManager/create.py:1056 #, python-format msgid "Step %(current_page)d of %(max_page)d" msgstr "" -#: ../src/virtManager/create.py:1098 -#, python-format -msgid "Uncaught error validating install parameters: %s" -msgstr "" - -#: ../src/virtManager/create.py:1112 -msgid "Invalid System Name" -msgstr "" - -#: ../src/virtManager/create.py:1136 -msgid "An install media selection is required." -msgstr "" - -#: ../src/virtManager/create.py:1146 -msgid "An install tree is required." -msgstr "" - -#: ../src/virtManager/create.py:1161 -msgid "Error setting installer parameters." -msgstr "" - -#: ../src/virtManager/create.py:1179 -msgid "Error setting install media location." -msgstr "" - -#: ../src/virtManager/create.py:1189 -msgid "Error setting OS information." -msgstr "" - -#: ../src/virtManager/create.py:1220 -msgid "Error setting CPUs." -msgstr "" - -#: ../src/virtManager/create.py:1227 -msgid "Error setting guest memory." -msgstr "" - -#: ../src/virtManager/create.py:1245 -msgid "A storage path must be specified." -msgstr "" - -#: ../src/virtManager/create.py:1254 -msgid "Storage parameter error." -msgstr "" - -#: ../src/virtManager/create.py:1292 -#, python-format -msgid "Network device required for %s install." -msgstr "" - -#: ../src/virtManager/create.py:1344 +#: ../src/virtManager/create.py:1090 #, python-format msgid "Error setting UUID: %s" msgstr "" -#: ../src/virtManager/create.py:1352 +#: ../src/virtManager/create.py:1098 msgid "Error setting up graphics device:" msgstr "" -#: ../src/virtManager/create.py:1362 +#: ../src/virtManager/create.py:1108 msgid "Error setting up sound device:" msgstr "" -#: ../src/virtManager/create.py:1386 +#: ../src/virtManager/create.py:1148 +#, python-format +msgid "Uncaught error validating install parameters: %s" +msgstr "" + +#: ../src/virtManager/create.py:1160 +msgid "Invalid System Name" +msgstr "" + +#: ../src/virtManager/create.py:1184 +msgid "An install media selection is required." +msgstr "" + +#: ../src/virtManager/create.py:1194 +msgid "An install tree is required." +msgstr "" + +#: ../src/virtManager/create.py:1210 +msgid "Error setting installer parameters." +msgstr "" + +#: ../src/virtManager/create.py:1228 +msgid "Error setting install media location." +msgstr "" + +#: ../src/virtManager/create.py:1238 +msgid "Error setting OS information." +msgstr "" + +#: ../src/virtManager/create.py:1269 +msgid "Error setting CPUs." +msgstr "" + +#: ../src/virtManager/create.py:1276 +msgid "Error setting guest memory." +msgstr "" + +#: ../src/virtManager/create.py:1294 +msgid "A storage path must be specified." +msgstr "" + +#: ../src/virtManager/create.py:1303 +msgid "Storage parameter error." +msgstr "" + +#: ../src/virtManager/create.py:1341 +#, python-format +msgid "Network device required for %s install." +msgstr "" + +#: ../src/virtManager/create.py:1420 +msgid "Error launching customize dialog: " +msgstr "" + +#: ../src/virtManager/create.py:1451 msgid "Creating Virtual Machine" msgstr "" -#: ../src/virtManager/create.py:1387 +#: ../src/virtManager/create.py:1452 msgid "" "The virtual machine is now being created. Allocation of disk storage and " "retrieval of the installation images may take a few minutes to complete." msgstr "" -#: ../src/virtManager/create.py:1439 +#: ../src/virtManager/create.py:1504 msgid "Guest installation failed to complete" msgstr "" -#: ../src/virtManager/create.py:1560 +#: ../src/virtManager/create.py:1625 msgid "Detecting" msgstr "" @@ -1079,14 +1084,14 @@ msgstr "" msgid "Start address:" msgstr "" -#: ../src/virtManager/createnet.py:299 ../src/vmm-details.glade.h:93 +#: ../src/virtManager/createnet.py:299 ../src/vmm-details.glade.h:94 msgid "Status:" msgstr "" -#: ../src/virtManager/createnet.py:300 ../src/virtManager/details.py:1355 -#: ../src/virtManager/details.py:1356 ../src/virtManager/details.py:1357 -#: ../src/virtManager/details.py:1358 ../src/virtManager/host.py:399 -#: ../src/virtManager/host.py:400 +#: ../src/virtManager/createnet.py:300 ../src/virtManager/details.py:1375 +#: ../src/virtManager/details.py:1376 ../src/virtManager/details.py:1377 +#: ../src/virtManager/details.py:1378 ../src/virtManager/host.py:477 +#: ../src/virtManager/host.py:478 msgid "Disabled" msgstr "" @@ -1287,235 +1292,235 @@ msgid "" "- %s " msgstr "" -#: ../src/virtManager/details.py:361 +#: ../src/virtManager/details.py:382 msgid "Close tab" msgstr "" -#: ../src/virtManager/details.py:428 +#: ../src/virtManager/details.py:449 msgid "" "Static SELinux security type tells libvirt to always start the guest process " "with the specified label. The administrator is responsible for making sure " "the images are labeled corectly on disk." msgstr "" -#: ../src/virtManager/details.py:430 +#: ../src/virtManager/details.py:451 msgid "" "The dynamic SELinux security type tells libvirt to automatically pick a " "unique label for the guest process and guest image, ensuring total isolation " "of the guest. (Default)" msgstr "" -#: ../src/virtManager/details.py:438 +#: ../src/virtManager/details.py:459 msgid "VCPU" msgstr "" -#: ../src/virtManager/details.py:439 +#: ../src/virtManager/details.py:460 msgid "On CPU" msgstr "" -#: ../src/virtManager/details.py:440 +#: ../src/virtManager/details.py:461 msgid "Pinning" msgstr "" -#: ../src/virtManager/details.py:496 +#: ../src/virtManager/details.py:517 msgid "No serial devices found" msgstr "" -#: ../src/virtManager/details.py:518 +#: ../src/virtManager/details.py:539 msgid "Serial console not yet supported over remote connection." msgstr "" -#: ../src/virtManager/details.py:521 +#: ../src/virtManager/details.py:542 msgid "Serial console not available for inactive guest." msgstr "" -#: ../src/virtManager/details.py:523 +#: ../src/virtManager/details.py:544 #, python-format msgid "Console for device type '%s' not yet supported." msgstr "" -#: ../src/virtManager/details.py:526 +#: ../src/virtManager/details.py:547 #, python-format msgid "Can not access console path '%s'." msgstr "" -#: ../src/virtManager/details.py:544 +#: ../src/virtManager/details.py:565 msgid "No graphics console found." msgstr "" -#: ../src/virtManager/details.py:549 +#: ../src/virtManager/details.py:570 #, python-format msgid "Graphical Console %s" msgstr "" -#: ../src/virtManager/details.py:795 +#: ../src/virtManager/details.py:816 msgid "Save Virtual Machine Screenshot" msgstr "" -#: ../src/virtManager/details.py:820 +#: ../src/virtManager/details.py:841 #, python-format msgid "" "The screenshot has been saved to:\n" "%s" msgstr "" -#: ../src/virtManager/details.py:822 +#: ../src/virtManager/details.py:843 msgid "Screenshot saved" msgstr "" -#: ../src/virtManager/details.py:1073 +#: ../src/virtManager/details.py:1094 #, python-format msgid "Error building pin list: %s" msgstr "" -#: ../src/virtManager/details.py:1079 +#: ../src/virtManager/details.py:1100 #, python-format msgid "Error pinning vcpus: %s" msgstr "" -#: ../src/virtManager/details.py:1114 +#: ../src/virtManager/details.py:1135 #, python-format msgid "Error changing autostart value: %s" msgstr "" -#: ../src/virtManager/details.py:1159 +#: ../src/virtManager/details.py:1180 msgid "Are you sure you want to remove this device?" msgstr "" -#: ../src/virtManager/details.py:1160 ../src/virtManager/engine.py:533 +#: ../src/virtManager/details.py:1181 ../src/virtManager/engine.py:533 #: ../src/virtManager/engine.py:557 ../src/virtManager/engine.py:603 #: ../src/virtManager/engine.py:627 msgid "Don't ask me again." msgstr "" -#: ../src/virtManager/details.py:1172 +#: ../src/virtManager/details.py:1193 #, python-format msgid "Error Removing Device: %s" msgstr "" -#: ../src/virtManager/details.py:1188 +#: ../src/virtManager/details.py:1208 msgid "Device could not be removed from the running machine." msgstr "" -#: ../src/virtManager/details.py:1189 +#: ../src/virtManager/details.py:1209 msgid "This change will take effect after the next VM reboot" msgstr "" -#: ../src/virtManager/details.py:1237 +#: ../src/virtManager/details.py:1257 #, python-format msgid "Error changing VM configuration: %s" msgstr "" -#: ../src/virtManager/details.py:1244 +#: ../src/virtManager/details.py:1264 msgid "Some changes may require a guest reboot to take effect." msgstr "" -#: ../src/virtManager/details.py:1247 +#: ../src/virtManager/details.py:1267 msgid "These changes will take effect after the next guest reboot." msgstr "" -#: ../src/virtManager/details.py:1420 +#: ../src/virtManager/details.py:1440 msgid "VCPU info only available for running domain." msgstr "" -#: ../src/virtManager/details.py:1422 +#: ../src/virtManager/details.py:1442 msgid "Virtual machine does not support runtime VPCU info." msgstr "" -#: ../src/virtManager/details.py:1427 +#: ../src/virtManager/details.py:1447 #, python-format msgid "Error getting VCPU info: %s" msgstr "" -#: ../src/virtManager/details.py:1549 +#: ../src/virtManager/details.py:1569 msgid "Xen Mouse" msgstr "" -#: ../src/virtManager/details.py:1551 +#: ../src/virtManager/details.py:1571 msgid "PS/2 Mouse" msgstr "" -#: ../src/virtManager/details.py:1556 +#: ../src/virtManager/details.py:1576 msgid "Absolute Movement" msgstr "" -#: ../src/virtManager/details.py:1558 +#: ../src/virtManager/details.py:1578 msgid "Relative Movement" msgstr "" -#: ../src/virtManager/details.py:1581 +#: ../src/virtManager/details.py:1601 msgid "Automatically allocated" msgstr "" -#: ../src/virtManager/details.py:1620 +#: ../src/virtManager/details.py:1640 msgid "Primary Console" msgstr "" -#: ../src/virtManager/details.py:1852 +#: ../src/virtManager/details.py:1873 msgid "Tablet" msgstr "" -#: ../src/virtManager/details.py:1855 +#: ../src/virtManager/details.py:1876 msgid "Mouse" msgstr "" -#: ../src/virtManager/details.py:1857 ../src/vmm-details.glade.h:52 +#: ../src/virtManager/details.py:1878 ../src/vmm-details.glade.h:53 msgid "Input" msgstr "" -#: ../src/virtManager/details.py:1865 +#: ../src/virtManager/details.py:1886 #, python-format msgid "Display %s" msgstr "" -#: ../src/virtManager/details.py:1872 +#: ../src/virtManager/details.py:1893 #, python-format msgid "Sound: %s" msgstr "" -#: ../src/virtManager/details.py:1969 +#: ../src/virtManager/details.py:1990 msgid "No Boot Device" msgstr "" -#: ../src/virtManager/domain.py:1174 -msgid "Running" -msgstr "" - -#: ../src/virtManager/domain.py:1176 -msgid "Paused" -msgstr "" - -#: ../src/virtManager/domain.py:1178 -msgid "Shuting Down" -msgstr "" - -#: ../src/virtManager/domain.py:1180 -msgid "Shutoff" -msgstr "" - -#: ../src/virtManager/domain.py:1182 -msgid "Crashed" -msgstr "" - -#: ../src/virtManager/domain.py:1184 -msgid "Unknown status code" -msgstr "" - -#: ../src/virtManager/domain.py:1697 +#: ../src/virtManager/domain.py:793 ../src/virtManager/domain.py:2149 #, python-format msgid "Unknown device type '%s'" msgstr "" -#: ../src/virtManager/domain.py:1700 +#: ../src/virtManager/domain.py:796 #, python-format msgid "Couldn't build xpath for device %s:%s" msgstr "" -#: ../src/virtManager/domain.py:1725 +#: ../src/virtManager/domain.py:821 #, python-format msgid "Could not find device %s" msgstr "" +#: ../src/virtManager/domain.py:1051 +msgid "Running" +msgstr "" + +#: ../src/virtManager/domain.py:1053 +msgid "Paused" +msgstr "" + +#: ../src/virtManager/domain.py:1055 +msgid "Shuting Down" +msgstr "" + +#: ../src/virtManager/domain.py:1057 +msgid "Shutoff" +msgstr "" + +#: ../src/virtManager/domain.py:1059 +msgid "Crashed" +msgstr "" + +#: ../src/virtManager/domain.py:2158 +msgid "Did not find selected device." +msgstr "" + #: ../src/virtManager/engine.py:372 #, python-format msgid "Error bringing up domain details: %s" @@ -1609,100 +1614,138 @@ msgstr "" msgid "Input Error" msgstr "" -#: ../src/virtManager/host.py:154 +#: ../src/virtManager/host.py:183 msgid "Copy Volume Path" msgstr "" -#: ../src/virtManager/host.py:258 +#: ../src/virtManager/host.py:270 +msgid "Libvirt connection does not have interface support." +msgstr "" + +#: ../src/virtManager/host.py:336 #, python-format msgid "%(currentmem)s of %(maxmem)s" msgstr "" -#: ../src/virtManager/host.py:285 +#: ../src/virtManager/host.py:363 #, python-format msgid "Are you sure you want to permanently delete the network %s?" msgstr "" -#: ../src/virtManager/host.py:292 +#: ../src/virtManager/host.py:370 #, python-format msgid "Error deleting network: %s" msgstr "" -#: ../src/virtManager/host.py:303 +#: ../src/virtManager/host.py:381 #, python-format msgid "Error starting network: %s" msgstr "" -#: ../src/virtManager/host.py:314 +#: ../src/virtManager/host.py:392 #, python-format msgid "Error stopping network: %s" msgstr "" -#: ../src/virtManager/host.py:323 +#: ../src/virtManager/host.py:401 #, python-format msgid "Error launching network wizard: %s" msgstr "" -#: ../src/virtManager/host.py:334 +#: ../src/virtManager/host.py:412 #, python-format msgid "Error setting net autostart: %s" msgstr "" -#: ../src/virtManager/host.py:342 ../src/virtManager/host.py:391 -#: ../src/virtManager/host.py:578 ../src/virtManager/host.py:603 +#: ../src/virtManager/host.py:420 ../src/virtManager/host.py:469 +#: ../src/virtManager/host.py:656 ../src/virtManager/host.py:681 msgid "On Boot" msgstr "" -#: ../src/virtManager/host.py:343 ../src/virtManager/host.py:391 -#: ../src/virtManager/host.py:426 ../src/virtManager/host.py:579 -#: ../src/virtManager/host.py:603 ../src/virtManager/host.py:636 +#: ../src/virtManager/host.py:421 ../src/virtManager/host.py:469 +#: ../src/virtManager/host.py:504 ../src/virtManager/host.py:657 +#: ../src/virtManager/host.py:681 ../src/virtManager/host.py:714 msgid "Never" msgstr "" -#: ../src/virtManager/host.py:432 +#: ../src/virtManager/host.py:510 msgid "Isolated virtual network" msgstr "" -#: ../src/virtManager/host.py:464 ../src/virtManager/host.py:474 +#: ../src/virtManager/host.py:542 ../src/virtManager/host.py:552 #, python-format msgid "Error starting pool '%s': %s" msgstr "" -#: ../src/virtManager/host.py:483 +#: ../src/virtManager/host.py:561 #, python-format msgid "Are you sure you want to permanently delete the pool %s?" msgstr "" -#: ../src/virtManager/host.py:490 +#: ../src/virtManager/host.py:568 #, python-format msgid "Error deleting pool: %s" msgstr "" -#: ../src/virtManager/host.py:498 +#: ../src/virtManager/host.py:576 #, python-format msgid "Are you sure you want to permanently delete the volume %s?" msgstr "" -#: ../src/virtManager/host.py:507 +#: ../src/virtManager/host.py:585 #, python-format msgid "Error deleting volume: %s" msgstr "" -#: ../src/virtManager/host.py:518 +#: ../src/virtManager/host.py:596 #, python-format msgid "Error launching pool wizard: %s" msgstr "" -#: ../src/virtManager/host.py:533 ../src/virtManager/storagebrowse.py:274 +#: ../src/virtManager/host.py:611 ../src/virtManager/storagebrowse.py:274 #, python-format msgid "Error launching volume wizard: %s" msgstr "" -#: ../src/virtManager/host.py:570 +#: ../src/virtManager/host.py:648 #, python-format msgid "Error setting pool autostart: %s" msgstr "" +#: ../src/virtManager/host.py:777 +#, python-format +msgid "Error stopping interface '%s': %s" +msgstr "" + +#: ../src/virtManager/host.py:789 +#, python-format +msgid "Error starting interface '%s': %s" +msgstr "" + +#: ../src/virtManager/host.py:798 +#, python-format +msgid "Are you sure you want to permanently delete the interface %s?" +msgstr "" + +#: ../src/virtManager/host.py:807 +#, python-format +msgid "Error deleting interface: %s" +msgstr "" + +#: ../src/virtManager/host.py:816 +#, python-format +msgid "Error launching interface wizard: %s" +msgstr "" + +#: ../src/virtManager/host.py:847 +#, python-format +msgid "Error setting interface startmode: %s" +msgstr "" + +#: ../src/virtManager/host.py:867 +msgid "No interface selected." +msgstr "" + #: ../src/virtManager/manager.py:209 msgid "" "Could not populate a default connection. Make sure the appropriate " @@ -1722,12 +1765,12 @@ msgid "Startup Error" msgstr "" #: ../src/virtManager/manager.py:316 ../src/virtManager/systray.py:137 -#: ../src/vmm-details.glade.h:124 ../src/vmm-manager.glade.h:19 +#: ../src/vmm-details.glade.h:125 ../src/vmm-manager.glade.h:19 msgid "_Run" msgstr "" #: ../src/virtManager/manager.py:322 ../src/virtManager/systray.py:124 -#: ../src/vmm-details.glade.h:121 ../src/vmm-manager.glade.h:18 +#: ../src/vmm-details.glade.h:122 ../src/vmm-manager.glade.h:18 msgid "_Pause" msgstr "" @@ -1743,20 +1786,20 @@ msgstr "" #. Shutdown menu #: ../src/virtManager/manager.py:342 ../src/virtManager/systray.py:144 -#: ../src/virtManager/uihelpers.py:416 ../src/vmm-details.glade.h:122 +#: ../src/virtManager/uihelpers.py:416 ../src/vmm-details.glade.h:123 msgid "_Reboot" msgstr "" #: ../src/virtManager/manager.py:355 ../src/virtManager/systray.py:158 -#: ../src/virtManager/uihelpers.py:428 ../src/vmm-details.glade.h:112 +#: ../src/virtManager/uihelpers.py:428 ../src/vmm-details.glade.h:113 msgid "_Force Off" msgstr "" -#: ../src/virtManager/manager.py:371 ../src/vmm-details.glade.h:117 +#: ../src/virtManager/manager.py:371 ../src/vmm-details.glade.h:118 msgid "_Migrate..." msgstr "" -#: ../src/virtManager/manager.py:424 ../src/vmm-details.glade.h:110 +#: ../src/virtManager/manager.py:424 ../src/vmm-details.glade.h:111 msgid "_Details" msgstr "" @@ -2225,7 +2268,7 @@ msgid "MAC Address Field" msgstr "" #: ../src/vmm-add-hardware.glade.h:42 ../src/vmm-create-vol.glade.h:19 -#: ../src/vmm-create.glade.h:26 ../src/vmm-details.glade.h:55 +#: ../src/vmm-create.glade.h:27 ../src/vmm-details.glade.h:56 msgid "MB" msgstr "" @@ -2308,7 +2351,7 @@ msgstr "" #: ../src/vmm-add-hardware.glade.h:62 ../src/vmm-create-net.glade.h:52 #: ../src/vmm-create-pool.glade.h:13 ../src/vmm-create-vol.glade.h:22 -#: ../src/vmm-create.glade.h:46 +#: ../src/vmm-create.glade.h:47 msgid "_Finish" msgstr "" @@ -2597,7 +2640,7 @@ msgstr "" msgid "Intro" msgstr "" -#: ../src/vmm-create-net.glade.h:28 ../src/vmm-host.glade.h:28 +#: ../src/vmm-create-net.glade.h:28 ../src/vmm-host.glade.h:30 msgid "NAT to any physical device" msgstr "" @@ -2621,7 +2664,7 @@ msgstr "" msgid "Network name:" msgstr "" -#: ../src/vmm-create-net.glade.h:35 ../src/vmm-host.glade.h:31 +#: ../src/vmm-create-net.glade.h:35 ../src/vmm-host.glade.h:33 msgid "Network:" msgstr "" @@ -2740,7 +2783,7 @@ msgid "Step 2 of 2" msgstr "" #: ../src/vmm-create-pool.glade.h:14 ../src/vmm-create-vol.glade.h:24 -#: ../src/vmm-create.glade.h:50 +#: ../src/vmm-create.glade.h:51 msgid "_Name:" msgstr "" @@ -2855,134 +2898,138 @@ msgid "C_reate a disk image on the computer's hard drive" msgstr "" #: ../src/vmm-create.glade.h:15 -msgid "Choose Memory and CPU settings" +msgid "C_ustomize configuration before install" msgstr "" #: ../src/vmm-create.glade.h:16 -msgid "Choose an operating systen type and version" +msgid "Choose Memory and CPU settings" msgstr "" #: ../src/vmm-create.glade.h:17 -msgid "Choose how you would like to install the operating system" +msgid "Choose an operating systen type and version" msgstr "" #: ../src/vmm-create.glade.h:18 -msgid "Enter your virtual machine details" +msgid "Choose how you would like to install the operating system" msgstr "" #: ../src/vmm-create.glade.h:19 -msgid "Error message" +msgid "Enter your virtual machine details" msgstr "" #: ../src/vmm-create.glade.h:20 -msgid "Finish" +msgid "Error message" msgstr "" #: ../src/vmm-create.glade.h:21 -msgid "ISO" +msgid "Finish" msgstr "" #: ../src/vmm-create.glade.h:22 -msgid "Install" +msgid "ISO" msgstr "" #: ../src/vmm-create.glade.h:23 -msgid "Kernel options:" +msgid "Install" msgstr "" #: ../src/vmm-create.glade.h:24 -msgid "Kickstart URL:" +msgid "Kernel options:" msgstr "" #: ../src/vmm-create.glade.h:25 +msgid "Kickstart URL:" +msgstr "" + +#: ../src/vmm-create.glade.h:26 msgid "Locate your install media" msgstr "" -#: ../src/vmm-create.glade.h:27 +#: ../src/vmm-create.glade.h:28 msgid "Memory" msgstr "" -#: ../src/vmm-create.glade.h:29 +#: ../src/vmm-create.glade.h:30 msgid "Network _Boot (PXE)" msgstr "" -#: ../src/vmm-create.glade.h:30 +#: ../src/vmm-create.glade.h:31 msgid "Network _Install (HTTP, FTP, or NFS)" msgstr "" -#: ../src/vmm-create.glade.h:31 +#: ../src/vmm-create.glade.h:32 msgid "New VM" msgstr "" -#: ../src/vmm-create.glade.h:32 +#: ../src/vmm-create.glade.h:33 msgid "OS _type:" msgstr "" -#: ../src/vmm-create.glade.h:33 +#: ../src/vmm-create.glade.h:34 msgid "PXE" msgstr "" -#: ../src/vmm-create.glade.h:34 +#: ../src/vmm-create.glade.h:35 msgid "Provide the operating system install URL" msgstr "" -#: ../src/vmm-create.glade.h:35 +#: ../src/vmm-create.glade.h:36 msgid "Select _managed or other existing storage" msgstr "" -#: ../src/vmm-create.glade.h:36 +#: ../src/vmm-create.glade.h:37 msgid "Set a fixed _MAC address" msgstr "" -#: ../src/vmm-create.glade.h:38 +#: ../src/vmm-create.glade.h:39 msgid "URL" msgstr "" -#: ../src/vmm-create.glade.h:39 +#: ../src/vmm-create.glade.h:40 msgid "URL Options" msgstr "" -#: ../src/vmm-create.glade.h:40 +#: ../src/vmm-create.glade.h:41 msgid "URL:" msgstr "" -#: ../src/vmm-create.glade.h:41 +#: ../src/vmm-create.glade.h:42 msgid "Use CD_ROM or DVD" msgstr "" -#: ../src/vmm-create.glade.h:42 +#: ../src/vmm-create.glade.h:43 msgid "Use _ISO image:" msgstr "" -#: ../src/vmm-create.glade.h:43 +#: ../src/vmm-create.glade.h:44 msgid "_Allocate entire disk now" msgstr "" -#: ../src/vmm-create.glade.h:44 +#: ../src/vmm-create.glade.h:45 msgid "_Architecture:" msgstr "" -#: ../src/vmm-create.glade.h:45 +#: ../src/vmm-create.glade.h:46 msgid "_Enable storage for this virtual machine" msgstr "" -#: ../src/vmm-create.glade.h:47 +#: ../src/vmm-create.glade.h:48 msgid "_GB" msgstr "" -#: ../src/vmm-create.glade.h:48 +#: ../src/vmm-create.glade.h:49 msgid "_Local install media (ISO image or CDROM)" msgstr "" -#: ../src/vmm-create.glade.h:49 +#: ../src/vmm-create.glade.h:50 msgid "_Memory (RAM):" msgstr "" -#: ../src/vmm-create.glade.h:51 +#: ../src/vmm-create.glade.h:52 msgid "_Version:" msgstr "" -#: ../src/vmm-create.glade.h:52 +#: ../src/vmm-create.glade.h:53 msgid "_Virt Type:" msgstr "" @@ -3081,7 +3128,7 @@ msgstr "" msgid "A_dd Hardware" msgstr "" -#: ../src/vmm-details.glade.h:24 ../src/vmm-host.glade.h:11 +#: ../src/vmm-details.glade.h:24 ../src/vmm-host.glade.h:12 msgid "Architecture:" msgstr "" @@ -3166,280 +3213,284 @@ msgid "Enable A_PIC:" msgstr "" #: ../src/vmm-details.glade.h:48 -msgid "Heads:" +msgid "Finish Install" msgstr "" #: ../src/vmm-details.glade.h:49 +msgid "Heads:" +msgstr "" + +#: ../src/vmm-details.glade.h:50 msgid "Host CPUs:" msgstr "" -#: ../src/vmm-details.glade.h:50 ../src/vmm-host.glade.h:22 +#: ../src/vmm-details.glade.h:51 ../src/vmm-host.glade.h:23 msgid "Hypervisor:" msgstr "" -#: ../src/vmm-details.glade.h:51 +#: ../src/vmm-details.glade.h:52 msgid "Initial _pinning:" msgstr "" -#: ../src/vmm-details.glade.h:56 +#: ../src/vmm-details.glade.h:57 msgid "M_odel:" msgstr "" -#: ../src/vmm-details.glade.h:57 +#: ../src/vmm-details.glade.h:58 msgid "Ma_ximum allocation:" msgstr "" -#: ../src/vmm-details.glade.h:58 +#: ../src/vmm-details.glade.h:59 msgid "Max Memory Select" msgstr "" -#: ../src/vmm-details.glade.h:59 +#: ../src/vmm-details.glade.h:60 msgid "Maximum allocation:" msgstr "" -#: ../src/vmm-details.glade.h:60 +#: ../src/vmm-details.glade.h:61 msgid "Mem" msgstr "" -#: ../src/vmm-details.glade.h:61 +#: ../src/vmm-details.glade.h:62 msgid "" "Memory\n" "usage:" msgstr "" -#: ../src/vmm-details.glade.h:63 +#: ../src/vmm-details.glade.h:64 msgid "Memory Select" msgstr "" -#: ../src/vmm-details.glade.h:65 ../src/vmm-host.glade.h:29 +#: ../src/vmm-details.glade.h:66 ../src/vmm-host.glade.h:31 msgid "Name:" msgstr "" -#: ../src/vmm-details.glade.h:66 +#: ../src/vmm-details.glade.h:67 msgid "Net" msgstr "" -#: ../src/vmm-details.glade.h:67 +#: ../src/vmm-details.glade.h:68 msgid "" "Network\n" "I/O:" msgstr "" -#: ../src/vmm-details.glade.h:69 +#: ../src/vmm-details.glade.h:70 msgid "Over" msgstr "" -#: ../src/vmm-details.glade.h:71 +#: ../src/vmm-details.glade.h:72 msgid "Pause" msgstr "" -#: ../src/vmm-details.glade.h:72 ../src/vmm-manager.glade.h:3 +#: ../src/vmm-details.glade.h:73 ../src/vmm-manager.glade.h:3 msgid "Pause the virtual machine" msgstr "" -#: ../src/vmm-details.glade.h:74 ../src/vmm-manager.glade.h:4 +#: ../src/vmm-details.glade.h:75 ../src/vmm-manager.glade.h:4 msgid "Power on the virtual machine" msgstr "" -#: ../src/vmm-details.glade.h:75 +#: ../src/vmm-details.glade.h:76 msgid "Proc" msgstr "" -#: ../src/vmm-details.glade.h:76 +#: ../src/vmm-details.glade.h:77 msgid "RAM:" msgstr "" -#: ../src/vmm-details.glade.h:77 +#: ../src/vmm-details.glade.h:78 msgid "R_eadonly:" msgstr "" -#: ../src/vmm-details.glade.h:78 +#: ../src/vmm-details.glade.h:79 msgid "Run" msgstr "" -#: ../src/vmm-details.glade.h:79 +#: ../src/vmm-details.glade.h:80 msgid "S_hut Down" msgstr "" -#: ../src/vmm-details.glade.h:80 +#: ../src/vmm-details.glade.h:81 msgid "Send _Key" msgstr "" -#: ../src/vmm-details.glade.h:81 +#: ../src/vmm-details.glade.h:82 msgid "Sharea_ble:" msgstr "" -#: ../src/vmm-details.glade.h:82 +#: ../src/vmm-details.glade.h:83 msgid "Show the graphical console" msgstr "" -#: ../src/vmm-details.glade.h:83 +#: ../src/vmm-details.glade.h:84 msgid "Show virtual hardware details" msgstr "" -#: ../src/vmm-details.glade.h:84 +#: ../src/vmm-details.glade.h:85 msgid "Shut Down" msgstr "" -#: ../src/vmm-details.glade.h:85 +#: ../src/vmm-details.glade.h:86 msgid "Shut down" msgstr "" -#: ../src/vmm-details.glade.h:86 ../src/vmm-manager.glade.h:7 +#: ../src/vmm-details.glade.h:87 ../src/vmm-manager.glade.h:7 msgid "Shutdown the virtual machine" msgstr "" -#: ../src/vmm-details.glade.h:88 +#: ../src/vmm-details.glade.h:89 msgid "Source Path:" msgstr "" -#: ../src/vmm-details.glade.h:89 +#: ../src/vmm-details.glade.h:90 msgid "Source device:" msgstr "" -#: ../src/vmm-details.glade.h:90 +#: ../src/vmm-details.glade.h:91 msgid "Source path:" msgstr "" -#: ../src/vmm-details.glade.h:91 +#: ../src/vmm-details.glade.h:92 msgid "Start virt_ual machine on host boot up" msgstr "" -#: ../src/vmm-details.glade.h:92 ../src/vmm-preferences.glade.h:27 +#: ../src/vmm-details.glade.h:93 ../src/vmm-preferences.glade.h:27 msgid "Stats" msgstr "" -#: ../src/vmm-details.glade.h:94 +#: ../src/vmm-details.glade.h:95 msgid "Switch to fullscreen view" msgstr "" -#: ../src/vmm-details.glade.h:95 +#: ../src/vmm-details.glade.h:96 msgid "T_oolbar" msgstr "" -#: ../src/vmm-details.glade.h:96 +#: ../src/vmm-details.glade.h:97 msgid "Target device:" msgstr "" -#: ../src/vmm-details.glade.h:97 +#: ../src/vmm-details.glade.h:98 msgid "Total host memory:" msgstr "" -#: ../src/vmm-details.glade.h:99 +#: ../src/vmm-details.glade.h:100 msgid "UUID:" msgstr "" -#: ../src/vmm-details.glade.h:100 +#: ../src/vmm-details.glade.h:101 msgid "Unavailable" msgstr "" -#: ../src/vmm-details.glade.h:101 +#: ../src/vmm-details.glade.h:102 msgid "VNC" msgstr "" -#: ../src/vmm-details.glade.h:102 +#: ../src/vmm-details.glade.h:103 msgid "Vid" msgstr "" -#: ../src/vmm-details.glade.h:103 +#: ../src/vmm-details.glade.h:104 msgid "Virtual CPU Affinity Select" msgstr "" -#: ../src/vmm-details.glade.h:104 +#: ../src/vmm-details.glade.h:105 msgid "Virtual CPU Select" msgstr "" -#: ../src/vmm-details.glade.h:105 +#: ../src/vmm-details.glade.h:106 msgid "Virtual Machine" msgstr "" -#: ../src/vmm-details.glade.h:106 +#: ../src/vmm-details.glade.h:107 msgid "Virtual _Machine" msgstr "" -#: ../src/vmm-details.glade.h:107 +#: ../src/vmm-details.glade.h:108 msgid "_Always" msgstr "" -#: ../src/vmm-details.glade.h:108 +#: ../src/vmm-details.glade.h:109 msgid "_Clone" msgstr "" -#: ../src/vmm-details.glade.h:109 +#: ../src/vmm-details.glade.h:110 msgid "_Console" msgstr "" -#: ../src/vmm-details.glade.h:111 ../src/vmm-host.glade.h:43 +#: ../src/vmm-details.glade.h:112 ../src/vmm-host.glade.h:45 #: ../src/vmm-manager.glade.h:12 msgid "_File" msgstr "" -#: ../src/vmm-details.glade.h:113 +#: ../src/vmm-details.glade.h:114 msgid "_Fullscreen" msgstr "" -#: ../src/vmm-details.glade.h:114 ../src/vmm-host.glade.h:44 +#: ../src/vmm-details.glade.h:115 ../src/vmm-host.glade.h:46 #: ../src/vmm-manager.glade.h:14 msgid "_Help" msgstr "" -#: ../src/vmm-details.glade.h:115 +#: ../src/vmm-details.glade.h:116 msgid "_Label:" msgstr "" -#: ../src/vmm-details.glade.h:116 +#: ../src/vmm-details.glade.h:117 msgid "_Login" msgstr "" -#: ../src/vmm-details.glade.h:118 +#: ../src/vmm-details.glade.h:119 msgid "_Never" msgstr "" -#: ../src/vmm-details.glade.h:119 +#: ../src/vmm-details.glade.h:120 msgid "_Only when Fullscreen" msgstr "" -#: ../src/vmm-details.glade.h:120 +#: ../src/vmm-details.glade.h:121 msgid "_Password:" msgstr "" -#: ../src/vmm-details.glade.h:123 +#: ../src/vmm-details.glade.h:124 msgid "_Resize to VM" msgstr "" -#: ../src/vmm-details.glade.h:125 +#: ../src/vmm-details.glade.h:126 msgid "_Save" msgstr "" -#: ../src/vmm-details.glade.h:126 +#: ../src/vmm-details.glade.h:127 msgid "_Save this password in your keyring" msgstr "" -#: ../src/vmm-details.glade.h:127 +#: ../src/vmm-details.glade.h:128 msgid "_Scale Display" msgstr "" -#: ../src/vmm-details.glade.h:128 +#: ../src/vmm-details.glade.h:129 msgid "_Static" msgstr "" -#: ../src/vmm-details.glade.h:129 +#: ../src/vmm-details.glade.h:130 msgid "_Take Screenshot" msgstr "" -#: ../src/vmm-details.glade.h:130 +#: ../src/vmm-details.glade.h:131 msgid "_Text Consoles" msgstr "" -#: ../src/vmm-details.glade.h:131 +#: ../src/vmm-details.glade.h:132 msgid "_Username:" msgstr "" -#: ../src/vmm-details.glade.h:132 ../src/vmm-manager.glade.h:21 +#: ../src/vmm-details.glade.h:133 ../src/vmm-manager.glade.h:21 msgid "_View" msgstr "" -#: ../src/vmm-details.glade.h:133 ../src/vmm-host.glade.h:46 +#: ../src/vmm-details.glade.h:134 ../src/vmm-host.glade.h:48 msgid "_View Manager" msgstr "" @@ -3452,133 +3503,141 @@ msgid "IPv4 configuration" msgstr "" #: ../src/vmm-host.glade.h:3 -msgid "Name:" +msgid "Name" msgstr "" #: ../src/vmm-host.glade.h:5 +msgid "Slave Interfaces" +msgstr "" + +#: ../src/vmm-host.glade.h:6 msgid "Volumes" msgstr "" -#: ../src/vmm-host.glade.h:6 ../src/vmm-open-connection.glade.h:1 +#: ../src/vmm-host.glade.h:7 ../src/vmm-open-connection.glade.h:1 msgid "A_utoconnect:" msgstr "" -#: ../src/vmm-host.glade.h:7 +#: ../src/vmm-host.glade.h:8 msgid "A_utostart:" msgstr "" -#: ../src/vmm-host.glade.h:9 +#: ../src/vmm-host.glade.h:10 msgid "Add Network" msgstr "" -#: ../src/vmm-host.glade.h:10 +#: ../src/vmm-host.glade.h:11 msgid "Add Pool" msgstr "" -#: ../src/vmm-host.glade.h:12 +#: ../src/vmm-host.glade.h:13 msgid "CPU usage:" msgstr "" -#: ../src/vmm-host.glade.h:13 +#: ../src/vmm-host.glade.h:14 msgid "Connection:" msgstr "" -#: ../src/vmm-host.glade.h:14 +#: ../src/vmm-host.glade.h:15 msgid "DHCP end:" msgstr "" -#: ../src/vmm-host.glade.h:15 +#: ../src/vmm-host.glade.h:16 msgid "DHCP start:" msgstr "" -#: ../src/vmm-host.glade.h:16 +#: ../src/vmm-host.glade.h:17 msgid "Delete Network" msgstr "" -#: ../src/vmm-host.glade.h:17 +#: ../src/vmm-host.glade.h:18 msgid "Delete Pool" msgstr "" -#: ../src/vmm-host.glade.h:19 +#: ../src/vmm-host.glade.h:20 msgid "Forwarding:" msgstr "" -#: ../src/vmm-host.glade.h:20 +#: ../src/vmm-host.glade.h:21 msgid "Host Details" msgstr "" -#: ../src/vmm-host.glade.h:21 +#: ../src/vmm-host.glade.h:22 msgid "Hostname:" msgstr "" -#: ../src/vmm-host.glade.h:23 -msgid "Location:" -msgstr "" - #: ../src/vmm-host.glade.h:24 -msgid "Logical CPUs:" +msgid "In use by:" msgstr "" #: ../src/vmm-host.glade.h:25 -msgid "MAC:" +msgid "Location:" msgstr "" #: ../src/vmm-host.glade.h:26 -msgid "Memory usage:" +msgid "Logical CPUs:" msgstr "" #: ../src/vmm-host.glade.h:27 +msgid "MAC:" +msgstr "" + +#: ../src/vmm-host.glade.h:28 +msgid "Memory usage:" +msgstr "" + +#: ../src/vmm-host.glade.h:29 msgid "Memory:" msgstr "" -#: ../src/vmm-host.glade.h:30 +#: ../src/vmm-host.glade.h:32 msgid "Network Interfaces" msgstr "" -#: ../src/vmm-host.glade.h:32 +#: ../src/vmm-host.glade.h:34 msgid "Overview" msgstr "" -#: ../src/vmm-host.glade.h:33 +#: ../src/vmm-host.glade.h:35 msgid "Pool Type:" msgstr "" -#: ../src/vmm-host.glade.h:34 +#: ../src/vmm-host.glade.h:36 msgid "Start Network" msgstr "" -#: ../src/vmm-host.glade.h:35 +#: ../src/vmm-host.glade.h:37 msgid "Start Pool" msgstr "" -#: ../src/vmm-host.glade.h:36 +#: ../src/vmm-host.glade.h:38 +msgid "Start mode:" +msgstr "" + +#: ../src/vmm-host.glade.h:39 msgid "State:" msgstr "" -#: ../src/vmm-host.glade.h:37 +#: ../src/vmm-host.glade.h:40 msgid "Stop Network" msgstr "" -#: ../src/vmm-host.glade.h:38 +#: ../src/vmm-host.glade.h:41 msgid "Stop Pool" msgstr "" -#: ../src/vmm-host.glade.h:41 +#: ../src/vmm-host.glade.h:43 msgid "Virtual Networks" msgstr "" -#: ../src/vmm-host.glade.h:42 +#: ../src/vmm-host.glade.h:44 msgid "_Delete Volume" msgstr "" -#: ../src/vmm-host.glade.h:45 ../src/vmm-storage-browse.glade.h:4 +#: ../src/vmm-host.glade.h:47 ../src/vmm-storage-browse.glade.h:4 msgid "_New Volume" msgstr "" -#: ../src/vmm-host.glade.h:47 -msgid "insert type" -msgstr "" - #: ../src/vmm-manager.glade.h:1 msgid "Create a new virtual machine" msgstr "" diff --git a/src/virtManager/createinterface.py b/src/virtManager/createinterface.py new file mode 100644 index 000000000..464b5d180 --- /dev/null +++ b/src/virtManager/createinterface.py @@ -0,0 +1,818 @@ +# +# Copyright (C) 2008 Red Hat, Inc. +# Copyright (C) 2008 Cole Robinson +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301 USA. +# + +import gobject +import gtk +import gtk.glade + +import sys +import traceback +import logging + +from virtinst import Interface + +from virtManager import util +from virtManager import uihelpers +from virtManager.error import vmmErrorDialog +from virtManager.asyncjob import vmmAsyncJob +from virtManager.createmeter import vmmCreateMeter + +PAGE_TYPE = 0 +PAGE_DETAILS = 1 + +DETAILS_BOND = 0 +DETAILS_BRIDGE = 1 +DETAILS_VLAN = 2 +DETAILS_ETHERNET = 3 + +INTERFACE_ROW_KEY = 0 +INTERFACE_ROW_SELECT = 1 +INTERFACE_ROW_CANT_SELECT = 2 +INTERFACE_ROW_NAME = 3 +INTERFACE_ROW_TYPE = 4 +INTERFACE_ROW_IS_DEFINED = 5 +INTERFACE_ROW_IS_ACTIVE = 6 +INTERFACE_ROW_IN_USE_BY = 7 +INTERFACE_ROW_MAC = 8 + +BOND_PAGE_ARP = 0 +BOND_PAGE_MII = 1 +BOND_PAGE_DEFAULT = 2 + +class vmmCreateInterface(gobject.GObject): + __gsignals__ = { + "action-show-help": (gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, [str]), + } + + def __init__(self, config, conn): + self.__gobject_init__() + self.window = gtk.glade.XML(config.get_glade_dir() + \ + "/vmm-create-interface.glade", + "vmm-create-interface", + domain="virt-manager") + self.config = config + self.conn = conn + self.interface = None + + self.topwin = self.window.get_widget("vmm-create-interface") + self.err = vmmErrorDialog(self.topwin, + 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, + _("Unexpected Error"), + _("An unexpected error occurred")) + + # Bridge configuration dialog + self.bridge_config_win = gtk.glade.XML(self.config.get_glade_dir() + \ + "/vmm-create-interface.glade", + "bridge-config", + domain="virt-manager") + self.bridge_config = self.bridge_config_win.get_widget( + "bridge-config") + self.bridge_config_win.signal_autoconnect({ + "on_bridge_config_delete_event": self.bridge_config_finish, + "on_bridge_ok_clicked" : self.bridge_config_finish, + }) + + # Bond configuration dialog + self.bond_config_win = gtk.glade.XML(self.config.get_glade_dir() + \ + "/vmm-create-interface.glade", + "bond-config", + domain="virt-manager") + self.bond_config = self.bond_config_win.get_widget("bond-config") + self.bond_config_win.signal_autoconnect({ + "on_bond_config_delete_event": self.bond_config_finish, + "on_bond_ok_clicked" : self.bond_config_finish, + + "on_bond_monitor_mode_changed": self.bond_monitor_mode_changed, + }) + + + self.window.signal_autoconnect({ + "on_vmm_create_interface_delete_event" : self.close, + + "on_cancel_clicked": self.close, + "on_back_clicked" : self.back, + "on_forward_clicked" : self.forward, + "on_finish_clicked" : self.finish, + "on_help_clicked": self.show_help, + "on_pages_switch_page": self.page_changed, + + "on_bridge_config_button_clicked": self.show_bridge_config, + "on_bond_config_button_clicked": self.show_bond_config, + "on_vlan_tag_changed": self.update_interface_name, + }) + util.bind_escape_key_close(self) + + self.set_initial_state() + + def show(self): + self.reset_state() + self.topwin.show() + self.topwin.present() + + def show_bond_config(self, src): + self.bond_config.show_all() + + def show_bridge_config(self, src): + self.bridge_config.show_all() + + def close(self, ignore1=None, ignore2=None): + self.topwin.hide() + + return 1 + + + ########################### + # Initialization routines # + ########################### + + def set_initial_state(self): + + self.window.get_widget("pages").set_show_tabs(False) + self.bond_config_win.get_widget("bond-pages").set_show_tabs(False) + + # FIXME: Unhide this when we make some documentation + self.window.get_widget("help").hide() + finish_img = gtk.image_new_from_stock(gtk.STOCK_QUIT, + gtk.ICON_SIZE_BUTTON) + self.window.get_widget("finish").set_image(finish_img) + + blue = gtk.gdk.color_parse("#0072A8") + self.window.get_widget("header").modify_bg(gtk.STATE_NORMAL, blue) + + box = self.window.get_widget("header-icon-box") + image = gtk.image_new_from_icon_name("network-idle", + gtk.ICON_SIZE_DIALOG) + image.show() + box.pack_end(image, False) + + # Interface type + type_list = self.window.get_widget("interface-type") + type_model = gtk.ListStore(str, str) + type_list.set_model(type_model) + text = gtk.CellRendererText() + type_list.pack_start(text, True) + type_list.add_attribute(text, 'text', 1) + type_model.append([Interface.Interface.INTERFACE_TYPE_BRIDGE, + _("Bridge")]) + type_model.append([Interface.Interface.INTERFACE_TYPE_BOND, + _("Bond")]) + type_model.append([Interface.Interface.INTERFACE_TYPE_ETHERNET, + _("Ethernet")]) + type_model.append([Interface.Interface.INTERFACE_TYPE_VLAN, + _("VLAN")]) + + # Start mode + uihelpers.build_startmode_combo( + self.window.get_widget("interface-startmode")) + + # Parent/slave Interface list + slave_list = self.window.get_widget("interface-list") + # [ vmmInterface, selected, selectabel, name, type, is defined, + # is active, in use by str, mac] + slave_model = gtk.ListStore(object, bool, bool, str, str, bool, bool, + str, str) + slave_list.set_model(slave_model) + + selectCol = gtk.TreeViewColumn() + nameCol = gtk.TreeViewColumn(_("Name")) + typeCol = gtk.TreeViewColumn(_("Type")) + useCol = gtk.TreeViewColumn(_("In use by")) + + slave_list.append_column(selectCol) + slave_list.append_column(nameCol) + slave_list.append_column(typeCol) + slave_list.append_column(useCol) + + chk = gtk.CellRendererToggle() + chk.connect("toggled", self.interface_item_toggled, slave_list) + selectCol.pack_start(chk, False) + selectCol.add_attribute(chk, "active", INTERFACE_ROW_SELECT) + selectCol.add_attribute(chk, "inconsistent", INTERFACE_ROW_CANT_SELECT) + selectCol.set_sort_column_id(INTERFACE_ROW_CANT_SELECT) + + txt = gtk.CellRendererText() + nameCol.pack_start(txt, True) + nameCol.add_attribute(txt, "text", INTERFACE_ROW_NAME) + nameCol.set_sort_column_id(INTERFACE_ROW_NAME) + + txt = gtk.CellRendererText() + typeCol.pack_start(txt, True) + typeCol.add_attribute(txt, "text", INTERFACE_ROW_TYPE) + typeCol.set_sort_column_id(INTERFACE_ROW_TYPE) + slave_model.set_sort_column_id(INTERFACE_ROW_CANT_SELECT, + gtk.SORT_ASCENDING) + + txt = gtk.CellRendererText() + useCol.pack_start(txt, True) + useCol.add_attribute(txt, "text", INTERFACE_ROW_IN_USE_BY) + useCol.set_sort_column_id(INTERFACE_ROW_IN_USE_BY) + + # Bond config + mode_list = self.bond_config_win.get_widget("bond-mode") + mode_model = gtk.ListStore(str, str) + mode_list.set_model(mode_model) + txt = gtk.CellRendererText() + mode_list.pack_start(txt, True) + mode_list.add_attribute(txt, "text", 0) + mode_model.append([_("System default"), None]) + for m in Interface.InterfaceBond.INTERFACE_BOND_MODES: + mode_model.append([m, m]) + + mon_list = self.bond_config_win.get_widget("bond-monitor-mode") + mon_model = gtk.ListStore(str, str) + mon_list.set_model(mon_model) + txt = gtk.CellRendererText() + mon_list.pack_start(txt, True) + mon_list.add_attribute(txt, "text", 0) + mon_model.append([_("System default"), None]) + for m in Interface.InterfaceBond.INTERFACE_BOND_MONITOR_MODES: + mon_model.append([m, m]) + + validate_list = self.bond_config_win.get_widget("arp-validate") + validate_model = gtk.ListStore(str) + validate_list.set_model(validate_model) + txt = gtk.CellRendererText() + validate_list.pack_start(txt, True) + validate_list.add_attribute(txt, "text", 0) + for m in Interface.InterfaceBond.INTERFACE_BOND_MONITOR_MODE_ARP_VALIDATE_MODES: + validate_model.append([m]) + + carrier_list = self.bond_config_win.get_widget("mii-carrier") + carrier_model = gtk.ListStore(str) + carrier_list.set_model(carrier_model) + txt = gtk.CellRendererText() + carrier_list.pack_start(txt, True) + carrier_list.add_attribute(txt, "text", 0) + for m in Interface.InterfaceBond.INTERFACE_BOND_MONITOR_MODE_MII_CARRIER_TYPES: + carrier_model.append([m]) + + + def reset_state(self): + + self.window.get_widget("pages").set_current_page(PAGE_TYPE) + self.page_changed(None, None, PAGE_TYPE) + + self.window.get_widget("interface-type").set_active(0) + + # General details + self.window.get_widget("interface-name-entry").set_text("") + self.window.get_widget("interface-name-label").set_text("") + self.window.get_widget("interface-startmode").set_active(0) + self.window.get_widget("interface-activate").set_active(False) + + # Bridge config + self.bridge_config_win.get_widget("bridge-delay").set_value(0) + self.bridge_config_win.get_widget("bridge-stp").set_active(True) + + # Bond config + self.bond_config_win.get_widget("bond-mode").set_active(0) + self.bond_config_win.get_widget("bond-monitor-mode").set_active(0) + + self.bond_config_win.get_widget("arp-interval").set_value(0) + self.bond_config_win.get_widget("arp-target").set_text("") + self.bond_config_win.get_widget("arp-validate").set_active(0) + + self.bond_config_win.get_widget("mii-frequency").set_value(0) + self.bond_config_win.get_widget("mii-updelay").set_value(0) + self.bond_config_win.get_widget("mii-downdelay").set_value(0) + self.bond_config_win.get_widget("mii-carrier").set_active(0) + + def populate_details_page(self): + itype = self.get_config_interface_type() + + # Set up default interface name + self.window.get_widget("interface-name-entry").hide() + self.window.get_widget("interface-name-label").hide() + + if itype in [ Interface.Interface.INTERFACE_TYPE_BRIDGE, + Interface.Interface.INTERFACE_TYPE_BOND ]: + widget = "interface-name-entry" + else: + widget = "interface-name-label" + + self.window.get_widget(widget).show() + default_name = self.get_default_name() + self.set_interface_name(default_name) + + # Make sure interface type specific fields are shown + type_dict = { + Interface.Interface.INTERFACE_TYPE_BRIDGE : "bridge", + Interface.Interface.INTERFACE_TYPE_BOND : "bond", + Interface.Interface.INTERFACE_TYPE_VLAN : "vlan", + } + + for key, value in type_dict.items(): + do_show = (key == itype) + self.window.get_widget("%s-label" % value).set_property("visible", + do_show) + self.window.get_widget("%s-box" % value).set_property("visible", + do_show) + + if itype == Interface.Interface.INTERFACE_TYPE_BRIDGE: + self.update_bridge_desc() + + elif itype == Interface.Interface.INTERFACE_TYPE_BOND: + self.update_bond_desc() + + # Populate device list + self.populate_interface_list(itype) + + def interface_item_toggled(self, src, index, slave_list): + itype = self.get_config_interface_type() + active = src.get_active() + model = slave_list.get_model() + + if itype in [ Interface.Interface.INTERFACE_TYPE_ETHERNET, + Interface.Interface.INTERFACE_TYPE_VLAN ]: + # Deselect any selected rows + for row in model: + if row == model[index]: + continue + row[INTERFACE_ROW_SELECT] = False + + # Toggle the clicked row + model[index][INTERFACE_ROW_SELECT] = not active + + self.update_interface_name() + + def populate_interface_list(self, itype): + iface_list = self.window.get_widget("interface-list") + model = iface_list.get_model() + model.clear() + + ifilter = [Interface.Interface.INTERFACE_TYPE_ETHERNET] + msg = None + if itype == Interface.Interface.INTERFACE_TYPE_BRIDGE: + ifilter.append(Interface.Interface.INTERFACE_TYPE_VLAN) + ifilter.append(Interface.Interface.INTERFACE_TYPE_BOND) + msg = _("Choose interface(s) to bridge:") + + elif itype == Interface.Interface.INTERFACE_TYPE_VLAN: + msg = _("Choose parent interface:") + elif itype == Interface.Interface.INTERFACE_TYPE_BOND: + msg = _("Choose interfaces to bond:") + elif itype == Interface.Interface.INTERFACE_TYPE_ETHERNET: + msg = _("Choose an unconfigured interface:") + + self.window.get_widget("interface-list-text").set_text(msg) + + iface_list = [] + row_dict = {} + + for phys in self.conn.get_devices("net"): + row_dict[phys.interface] = [phys.interface, + False, False, phys.interface, + "ethernet", False, True, None, + phys.address] + + for name in self.conn.list_interface_names(): + iface = self.conn.get_interface(name) + key = iface.interface + iface_type = iface.get_type() + active = iface.is_active() + name = iface.get_name() + + if iface_type not in ifilter: + continue + + if itype == Interface.Interface.INTERFACE_TYPE_ETHERNET: + if row_dict.has_key(name): + del(row_dict[name]) + + # We only want 'unconfigured' interfaces here + continue + + if row_dict.has_key(name): + # Interface was listed via nodedev APIs + row = row_dict[name] + row[INTERFACE_ROW_KEY] = key + row[INTERFACE_ROW_IS_DEFINED] = True + row[INTERFACE_ROW_IS_ACTIVE] = True + + else: + # Brand new row + row = [key, False, False, + iface.get_name(), iface.get_type(), True, + active, None, iface.get_mac()] + row_dict[name] = row + + for row in row_dict.values(): + name = row[INTERFACE_ROW_NAME] + row[INTERFACE_ROW_IN_USE_BY] = util.iface_in_use_by(self.conn, + name) + + for row in row_dict.values(): + model.append(row) + + def get_default_name(self): + itype = self.get_config_interface_type() + + name = _("No interface selected") + if itype == Interface.Interface.INTERFACE_TYPE_BRIDGE: + name = Interface.Interface.find_free_name(self.conn.vmm, "br") + elif itype == Interface.Interface.INTERFACE_TYPE_BOND: + name = Interface.Interface.find_free_name(self.conn.vmm, "bond") + else: + ifaces = self.get_config_selected_interfaces() + if len(ifaces) > 0: + iface = ifaces[0][INTERFACE_ROW_NAME] + + if itype == Interface.Interface.INTERFACE_TYPE_VLAN: + tag = self.window.get_widget("vlan-tag").get_value() + name = "%s.%s" % (iface, int(tag)) + + elif itype == Interface.Interface.INTERFACE_TYPE_ETHERNET: + name = iface + + return name + + + ######################### + # get_config_* routines # + ######################### + + def get_config_interface_type(self): + type_list = self.window.get_widget("interface-type") + return type_list.get_model()[type_list.get_active()][0] + + def set_interface_name(self, name): + if self.window.get_widget("interface-name-entry").get_property("visible"): + widget = "interface-name-entry" + else: + widget = "interface-name-label" + + self.window.get_widget(widget).set_text(name) + + def get_config_interface_name(self): + if self.window.get_widget("interface-name-entry").get_property("visible"): + return self.window.get_widget("interface-name-entry").get_text() + else: + return self.window.get_widget("interface-name-label").get_text() + + def get_config_interface_startmode(self): + start_list = self.window.get_widget("interface-startmode") + return start_list.get_model()[start_list.get_active()][0] + + def get_config_selected_interfaces(self): + iface_list = self.window.get_widget("interface-list") + model = iface_list.get_model() + ret = [] + + for row in model: + active = row[INTERFACE_ROW_SELECT] + iobj = row[INTERFACE_ROW_KEY] + + if active: + ret.append(row) + + return ret + + def get_config_bridge_params(self): + delay = self.bridge_config_win.get_widget("bridge-delay").get_value() + stp = self.bridge_config_win.get_widget("bridge-stp").get_active() + return [delay, stp] + + ################ + # UI Listeners # + ################ + + def update_interface_name(self, ignore1=None, ignore2=None): + itype = self.get_config_interface_type() + if itype not in [ Interface.Interface.INTERFACE_TYPE_VLAN, + Interface.Interface.INTERFACE_TYPE_ETHERNET ]: + # The rest have editable name fields, so don't overwrite + return + + name = self.get_default_name() + self.set_interface_name(name) + + def bond_monitor_mode_changed(self, src): + model = src.get_model() + value = model[src.get_active()][1] + bond_pages = self.bond_config_win.get_widget("bond-pages") + + if value == "arpmon": + page = BOND_PAGE_ARP + elif value == "miimon": + page = BOND_PAGE_MII + else: + page = BOND_PAGE_DEFAULT + + bond_pages.set_current_page(page) + + def update_bridge_desc(self): + delay, stp = self.get_config_bridge_params() + txt = "STP %s" % (stp and "on" or "off") + txt += ", delay %d sec" % int(delay) + + self.window.get_widget("bridge-config-label").set_text(txt) + + def update_bond_desc(self): + mode_list = self.bond_config_win.get_widget("bond-mode") + model = mode_list.get_model() + mode = model[mode_list.get_active()][0] + + mon_list = self.bond_config_win.get_widget("bond-monitor-mode") + model = mon_list.get_model() + mon = model[mon_list.get_active()][1] + + txt = mode + if mon: + txt += ", %s" % mon + + self.window.get_widget("bond-config-label").set_text(txt) + + ####################### + # Notebook navigation # + ####################### + + def back(self, src): + notebook = self.window.get_widget("pages") + curpage = notebook.get_current_page() + notebook.set_current_page(curpage - 1) + + def forward(self, ignore): + notebook = self.window.get_widget("pages") + curpage = notebook.get_current_page() + + if self.validate(notebook.get_current_page()) != True: + return + + self.window.get_widget("forward").grab_focus() + notebook.set_current_page(curpage + 1) + + def page_changed(self, ignore1, ignore2, pagenum): + next_page = pagenum + 1 + # Update page number + page_lbl = ("%s" % + _("Step %(current_page)d of %(max_page)d") % + {'current_page': next_page, 'max_page': PAGE_DETAILS+1}) + + self.window.get_widget("header-pagenum").set_markup(page_lbl) + + if pagenum == 0: + self.window.get_widget("back").set_sensitive(False) + else: + self.window.get_widget("back").set_sensitive(True) + + if pagenum == PAGE_DETAILS: + self.populate_details_page() + self.window.get_widget("forward").hide() + self.window.get_widget("finish").show() + self.window.get_widget("finish").grab_focus() + + else: + self.window.get_widget("forward").show() + self.window.get_widget("finish").hide() + + def validate(self, pagenum): + try: + if pagenum == PAGE_TYPE: + # Nothing to validate + return True + elif pagenum == PAGE_DETAILS: + return self.validate_details_page() + + except Exception, e: + self.err.show_err(_("Uncaught error validating install " + "parameters: %s") % str(e), + "".join(traceback.format_exc())) + return + + def validate_details_page(self): + itype = self.get_config_interface_type() + name = self.get_config_interface_name() + start = self.get_config_interface_startmode() + ifaces = self.get_config_selected_interfaces() + iclass = Interface.Interface.interface_class_for_type(itype) + + if not name: + return self.err.val_err(_("An interface name is required.")) + + if (itype != Interface.Interface.INTERFACE_TYPE_BRIDGE and + len(ifaces) == 0): + return self.err.val_err(_("An interface must be selected")) + + try: + iobj = iclass(name, self.conn.vmm) + iobj.start_mode = start + check_conflict = False + + # Pull info from selected interfaces + if hasattr(iobj, "interfaces"): + iobj.interfaces = map(lambda x: x[INTERFACE_ROW_KEY], ifaces) + check_conflict = True + + elif hasattr(iobj, "parent_interface"): + iobj.parent_interface = ifaces[0][INTERFACE_ROW_KEY] + + elif itype == Interface.Interface.INTERFACE_TYPE_ETHERNET: + iobj.macaddr = ifaces[0][INTERFACE_ROW_MAC] + + # Warn about defined interfaces + defined_ifaces = "" + if check_conflict: + for row in ifaces: + if not row[INTERFACE_ROW_IS_DEFINED]: + continue + + if defined_ifaces: + defined_ifaces += ", " + defined_ifaces += row[INTERFACE_ROW_NAME] + + if defined_ifaces: + ret = self.err.yes_no( + _("The following interface(s) are already " + "configured:\n\n%s\n\nUsing these may overwrite " + "their existing configuration. Are you sure you " + "want to use the selected interface(s)?") % + defined_ifaces) + if not ret: + return ret + + if itype == Interface.Interface.INTERFACE_TYPE_BRIDGE: + ret = self.validate_bridge(iobj, ifaces) + elif itype == Interface.Interface.INTERFACE_TYPE_BOND: + ret = self.validate_bond(iobj, ifaces) + elif itype == Interface.Interface.INTERFACE_TYPE_VLAN: + ret = self.validate_vlan(iobj, ifaces) + elif itype == Interface.Interface.INTERFACE_TYPE_ETHERNET: + ret = self.validate_ethernet(iobj, ifaces) + + if not ret: + return ret + + iobj.get_xml_config() + + self.interface = iobj + except Exception, e: + return self.err.val_err(_("Error setting interface parameters."), + str(e)) + + return True + + def validate_bridge(self, iobj, ifaces): + delay = self.bridge_config_win.get_widget("bridge-delay").get_value() + stp = self.bridge_config_win.get_widget("bridge-stp").get_active() + + iobj.stp = stp + iobj.delay = int(delay) + + return True + + + def validate_bond(self, iobj, ifaces): + mode_list = self.bond_config_win.get_widget("bond-mode") + model = mode_list.get_model() + mode = model[mode_list.get_active()][1] + + mon_list = self.bond_config_win.get_widget("bond-monitor-mode") + model = mon_list.get_model() + mon = model[mon_list.get_active()][1] + + val_list = self.bond_config_win.get_widget("arp-validate") + val_model = val_list.get_model() + arp_val = val_model[val_list.get_active()][0] + + car_list = self.bond_config_win.get_widget("mii-carrier") + car_model = car_list.get_model() + mii_car = car_model[car_list.get_active()][0] + + # ARP params + arp_int = self.bond_config_win.get_widget("arp-interval").get_value() + arp_tar = self.bond_config_win.get_widget("arp-target").get_text() + + # MII params + mii_freq = self.bond_config_win.get_widget("mii-frequency").get_value() + mii_up = self.bond_config_win.get_widget("mii-updelay").get_value() + mii_down = self.bond_config_win.get_widget("mii-downdelay").get_value() + + iobj.bond_mode = mode + iobj.monitor_mode = mon + + if not mon: + # No monitor params, just return + return True + + if mon == "arpmon": + iobj.arp_validate_mode = arp_val + iobj.arp_interval = int(arp_int) + iobj.arp_target = arp_tar or None + + elif mon == "miimon": + iobj.mii_carrier_mode = mii_car + iobj.mii_frequency = int(mii_freq) + iobj.mii_updelay = int(mii_up) + iobj.mii_downdelay = int(mii_down) + + return True + + + def validate_vlan(self, iobj, ifaces): + idx = self.window.get_widget("vlan-tag").get_value() + + iobj.tag = int(idx) + return True + + + def validate_ethernet(self, iobj, ifaces): + return True + + + #################### + # Dialog callbacks # + #################### + + def bridge_config_finish(self, ignore1=None, ignore2=None): + self.update_bridge_desc() + self.bridge_config.hide() + return 1 + + def bond_config_finish(self, ignore1=None, ignore2=None): + self.update_bond_desc() + self.bond_config.hide() + return 1 + + ##################### + # Creation routines # + ##################### + + def finish(self, src): + + # Validate the final page + page = self.window.get_widget("pages").get_current_page() + if self.validate(page) != True: + return False + + activate = self.window.get_widget("interface-activate").get_active() + + # Start the install + self.topwin.set_sensitive(False) + self.topwin.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) + + progWin = vmmAsyncJob(self.config, self.do_install, [activate], + title=_("Creating virtual interface"), + text=_("The virtual interface is now being " + "created.")) + progWin.run() + error, details = progWin.get_error() + + if error != None: + self.err.show_err(error, details) + + self.topwin.set_sensitive(True) + self.topwin.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.TOP_LEFT_ARROW)) + + if error: + return + + # FIXME: Hmm, shouldn't we emit a signal here rather than do this? + self.conn.tick(noStatsUpdate=True) + self.close() + + + def do_install(self, activate, asyncjob): + meter = vmmCreateMeter(asyncjob) + error = None + details = None + try: + self.interface.conn = util.dup_conn(self.config, self.conn) + + self.interface.install(meter, create=activate) + logging.debug("Install completed") + except: + (_type, value, stacktrace) = sys.exc_info () + + # Detailed error message, in English so it can be Googled. + details = ("Error creating interface: '%s'" % + (str(_type) + " " + str(value) + "\n" + + traceback.format_exc (stacktrace))) + error = (_("Error creating interface: '%s'") % str(value)) + + if error: + asyncjob.set_error(error, details) + + + def show_help(self, ignore): + # No help available yet. + pass + +gobject.type_register(vmmCreateInterface) diff --git a/src/virtManager/host.py b/src/virtManager/host.py index e7809a8a6..1080d8aaf 100644 --- a/src/virtManager/host.py +++ b/src/virtManager/host.py @@ -32,7 +32,7 @@ from virtManager.connection import vmmConnection from virtManager.createnet import vmmCreateNetwork from virtManager.createpool import vmmCreatePool from virtManager.createvol import vmmCreateVolume -#from virtManager.createinterface import vmmCreateInterface +from virtManager.createinterface import vmmCreateInterface from virtManager.error import vmmErrorDialog from virtManager.graphwidgets import Sparkline @@ -808,9 +808,6 @@ class vmmHost(gobject.GObject): "".join(traceback.format_exc())) def add_interface(self, src): - # Will be implemented shortly - return - try: if self.addinterface is None: self.addinterface = vmmCreateInterface(self.config, self.conn) diff --git a/src/vmm-create-interface.glade b/src/vmm-create-interface.glade new file mode 100644 index 000000000..62365929c --- /dev/null +++ b/src/vmm-create-interface.glade @@ -0,0 +1,1270 @@ + + + + + + Configure network interface + 300 + 400 + dialog + + + + True + vertical + + + True + queue + + + True + 6 + 10 + + + True + + + + + + False + 0 + + + + + True + + + True + vertical + + + True + 0 + <span size='large' color='white'>Configure network interface</span> + True + + + False + 0 + + + + + True + 0 + <span color='#59B0E2'>Step foo of bar</span> + True + + + 1 + + + + + 0 + + + + + 1 + + + + + + + False + 0 + + + + + True + 12 + vertical + 15 + + + True + True + False + + + + True + vertical + 6 + + + True + 0 + Select the interface type you would like to configure. + + + False + 0 + + + + + True + 12 + + + True + 0 + _Interface type: + True + interface-type + + + False + 0 + + + + + True + + + False + 1 + + + + + False + 1 + + + + + + + True + Type + + + False + tab + + + + + True + vertical + 12 + + + True + 4 + 2 + 12 + 6 + + + True + 0 + _Name: + True + interface-name-entry + + + GTK_FILL + + + + + True + + + True + True + + + + False + 0 + + + + + True + 0 + name label + + + 1 + + + + + 1 + 2 + + + + + True + 0 + _Start mode: + True + interface-startmode + + + 1 + 2 + GTK_FILL + + + + + True + 6 + + + True + + + False + 0 + + + + + + + + 1 + 2 + 1 + 2 + + + + + True + 0 + _Activate now: + True + interface-activate + + + 2 + 3 + GTK_FILL + + + + + True + True + False + True + + + 1 + 2 + 2 + 3 + + + + + True + vertical + + + True + 0 + _VLAN tag: + True + vlan-tag + + + 0 + + + + + True + 0 + Bridge settings: + + + 1 + + + + + True + 0 + Bond mode: + + + 2 + + + + + 3 + 4 + GTK_FILL + + + + + True + vertical + + + True + + + True + True + + 0 0 105 1 10 0 + + + + False + 0 + + + + + + + + 0 + + + + + True + + + True + 0 + bridge desc + + + 0 + + + + + C_onfigure + True + True + True + True + + + + False + 1 + + + + + 1 + + + + + True + + + True + 0 + bond desc + + + 0 + + + + + C_onfigure + True + True + True + True + + + + False + 1 + + + + + 2 + + + + + 1 + 2 + 3 + 4 + + + + + False + 0 + + + + + True + vertical + 3 + + + True + 0 + Insert list desc: + + + False + 0 + + + + + True + True + automatic + automatic + etched-in + + + True + True + + + + + 1 + + + + + 1 + + + + + 1 + + + + + True + Details + + + 1 + False + tab + + + + + 0 + + + + + True + 12 + end + + + gtk-help + True + True + True + True + + + + False + False + 0 + True + + + + + gtk-cancel + True + True + True + True + + + + False + False + 1 + + + + + gtk-go-back + True + False + True + True + True + + + + False + False + 2 + + + + + gtk-go-forward + True + True + True + True + + + + False + False + 3 + + + + + _Finish + True + True + True + + + + False + False + 4 + + + + + False + 1 + + + + + 1 + + + + + + + 5 + Bridge configuration + normal + False + + + + True + vertical + 2 + + + True + 0 + none + + + True + 3 + 12 + + + True + 2 + 2 + 6 + 6 + + + True + 0 + Forward delay: + + + GTK_FILL + GTK_FILL + + + + + True + 0 + Enable STP: + + + 1 + 2 + GTK_FILL + GTK_FILL + + + + + True + True + False + True + + + 1 + 2 + 1 + 2 + GTK_FILL + GTK_FILL + + + + + True + 3 + + + True + True + + 0 0 105 1 10 0 + + + 0 + + + + + True + seconds + + + 1 + + + + + 1 + 2 + GTK_FILL + GTK_FILL + + + + + + + + + True + <b>Bridge configuration</b> + True + + + label_item + + + + + False + 1 + + + + + True + end + + + + + + gtk-ok + True + True + True + True + + + + False + False + 1 + + + + + False + end + 0 + + + + + + + 5 + Bonding configuration + normal + False + + + + True + vertical + 2 + + + True + 0 + none + + + True + 3 + 12 + + + True + vertical + 6 + + + True + 2 + 2 + 6 + 6 + + + True + 0 + Bond monitor mode: + + + 1 + 2 + GTK_FILL + GTK_FILL + + + + + True + + + 1 + 2 + GTK_FILL + GTK_FILL + + + + + True + + + + 1 + 2 + 1 + 2 + GTK_FILL + GTK_FILL + + + + + True + 0 + Bond mode: + + + GTK_FILL + GTK_FILL + + + + + 0 + + + + + True + True + False + + + True + 0 + none + + + True + 12 + + + True + 3 + 2 + 6 + 6 + + + True + 0 + Target address: + + + 2 + 3 + GTK_FILL + GTK_FILL + + + + + True + 0 + Interval: + + + GTK_FILL + GTK_FILL + + + + + True + 3 + + + True + True + + 0 0 105 1 10 0 + + + False + 0 + + + + + True + 0 + seconds + + + False + 1 + + + + + 1 + 2 + GTK_FILL + GTK_FILL + + + + + True + True + + + + 1 + 2 + 2 + 3 + GTK_FILL + + + + + True + + + True + + + False + 0 + + + + + + + + 1 + 2 + 1 + 2 + GTK_FILL + + + + + True + 0 + Validate mode: + + + 1 + 2 + GTK_FILL + GTK_FILL + + + + + + + + + True + <b>ARP settings</b> + True + + + label_item + + + + + + + True + arp + + + False + tab + + + + + True + 0 + none + + + True + 12 + + + True + 4 + 2 + 6 + 6 + + + True + 0 + Frequency: + + + GTK_FILL + + + + + True + 0 + Up delay: + + + 1 + 2 + GTK_FILL + GTK_FILL + + + + + True + 0 + Down delay: + + + 2 + 3 + GTK_FILL + + + + + True + 0 + Carrier type: + + + 3 + 4 + GTK_FILL + + + + + True + 3 + + + True + True + + 0 0 105 1 10 0 + + + False + 0 + + + + + True + 0 + seconds + + + 1 + + + + + 1 + 2 + GTK_FILL + + + + + True + 3 + + + True + True + + 0 0 105 1 10 0 + + + False + 0 + + + + + True + 0 + seconds + + + 1 + + + + + 1 + 2 + 1 + 2 + GTK_FILL + + + + + True + 3 + + + True + True + + 0 0 105 1 10 0 + + + False + 0 + + + + + True + 0 + seconds + + + 1 + + + + + 1 + 2 + 2 + 3 + GTK_FILL + + + + + True + + + True + + + False + 0 + + + + + + + + 1 + 2 + 3 + 4 + + + + + + + + + True + <b>MII settings</b> + True + + + label_item + + + + + 1 + + + + + True + mii + + + 1 + False + tab + + + + + True + + + 2 + + + + + True + default + + + 2 + False + tab + + + + + 1 + + + + + + + + + True + <b>Bond configuration</b> + True + + + label_item + + + + + 1 + + + + + True + end + + + + + + gtk-ok + True + True + True + True + + + + False + False + 1 + + + + + False + end + 0 + + + + + +