Index: umc/js/uvmm/InstanceWizard.js =================================================================== --- umc/js/uvmm/InstanceWizard.js (Revision 59571) +++ umc/js/uvmm/InstanceWizard.js (Arbeitskopie) @@ -52,7 +52,7 @@ } on.once(dojo.body(), 'click', function(evt) { Tooltip.hide(node); - dojoEvent.stop(evt); + //dojoEvent.stop(evt); // links in tooltip should be clickable }); }; @@ -87,15 +87,27 @@ }, _setupJavaScriptLinks: function() { - array.forEach([ - ['details', 'keyname'], - ['details', 'security_group_ids'] - ], function(iitem) { + array.forEach(this._getTooltipLinkArray(), function(iitem) { var iwidget = this.getWidget(iitem[0], iitem[1]); iwidget.set('label', lang.replace(iwidget.label, this)); }, this); }, + _getTooltipLinkArray: function() { + if (this.cloud.type == 'OpenStack') { + return [ + ['details', 'keyname'], + ['details', 'security_group_ids'] + ] + } else if (this.cloud.type == 'EC2') { + return [ + ['details', 'keyname'], + ['details', 'security_group_ids'], + ['details', 'network_id'] + ] + } + }, + showTooltip: function(evt, type) { var msg = ''; if (type == 'keyname') { @@ -104,6 +116,9 @@ else if (type == 'security_group_ids') { msg = _('A security group acts as a virtual firewall that controls the traffic of the instance. To enable access, correct rules have to be configured (for example, a UCS instance needs at least TCP ports 22 (ssh) and 443 (https)). The security group configuration has to be done at the provider\'s administration interface.'); } + else if (type == 'network_id') { + msg = _('Select a network in which the new virtual machine instance should be launched. The network configuration has to be done at the provider\'s administration interface. Use this link for more information about Amazon VPC and this link to configure VPC.'); + } if (msg) { _showTooltip(evt.target, msg, evt); } @@ -239,6 +254,7 @@ 'image_id', 'size_id', 'size_info_text', + ['network_id', 'subnet_id'], ['keyname', 'security_group_ids'] ], widgets: [{ @@ -294,6 +310,30 @@ required: true, size: 'Two' }, { + name: 'network_id', + type: ComboBox, + label: _('Configure Network') + + ' (' + + _('more information') + + ')' + + ' [' + + _('Reload') + + ']', + dynamicOptions: {conn_name: this.cloud.name}, + dynamicValues: types.getCloudListNetwork, + staticValues: [ { id: 'default', label: _('Launch into default Network') } ], + onChange: lang.hitch(this, function(newVal) { + var widget = this.getWidget('details', 'subnet_id'); + widget.set('disabled', newVal == 'default'); + }), + }, { + name: 'subnet_id', + type: ComboBox, + label: _('Configure Subnet'), + dynamicOptions: {conn_name: this.cloud.name}, + dynamicValues: types.getCloudListSubnet, + depends: 'network_id' + }, { name: 'security_group_ids', type: ComboBox, label: _('Configure Security Group') + @@ -302,6 +342,7 @@ ')', dynamicOptions: {conn_name: this.cloud.name}, dynamicValues: types.getCloudListSecgroup, + depends: 'network_id', required: true }] }; Index: umc/js/uvmm/types.js =================================================================== --- umc/js/uvmm/types.js (Revision 59571) +++ umc/js/uvmm/types.js (Arbeitskopie) @@ -333,6 +333,16 @@ return data.result; }); }, + getCloudListNetwork: function(options) { + return tools.umcpCommand('uvmm/cloud/list/network', options).then(function(data) { + return data.result; + }); + }, + getCloudListSubnet: function(options) { + return tools.umcpCommand('uvmm/cloud/list/subnet', options).then(function(data) { + return data.result; + }); + }, getNodeType: function( uri ) { var colon = uri.indexOf( ':' ); if ( colon == -1 ) { Index: umc/js/uvmm/EC2.js =================================================================== --- umc/js/uvmm/EC2.js (Revision 59571) +++ umc/js/uvmm/EC2.js (Arbeitskopie) @@ -71,7 +71,8 @@ name: 'region', type: ComboBox, staticValues: [ - { id: 'EC2_EU_WEST', label: 'EU (Ireland)' }, + { id: 'EC2_EU_WEST', label: 'EU West (Ireland)' }, + { id: 'EC2_EU_CENTRAL', label: 'EU Central (Frankfurt)' }, { id: 'EC2_US_EAST', label: 'US East (N. Virginia)' }, { id: 'EC2_US_WEST', label: 'US West (N. California)' }, { id: 'EC2_US_WEST_OREGON', label: 'US West (Oregon)' }, Index: umc/js/de.po =================================================================== --- umc/js/de.po (Revision 59571) +++ umc/js/de.po (Arbeitskopie) @@ -34,7 +34,7 @@ msgstr "" "Project-Id-Version: univention-virtual-machina-manager-daemon 1.0.103-1\n" "Report-Msgid-Bugs-To: packages@univention.de\n" -"POT-Creation-Date: 2015-02-13 09:59+0100\n" +"POT-Creation-Date: 2015-03-25 13:30+0100\n" "PO-Revision-Date: 2013-07-24 19:03+0200\n" "Last-Translator: Univention GmbH \n" "Language-Team: German \n" @@ -150,7 +150,7 @@ "docs.univention.de/handbuch-4.0.html#uvmm:chapter\" target=\"_blank\">im " "Handbuch zu finden." -#: umc/js/uvmm/InstanceWizard.js:102 +#: umc/js/uvmm/InstanceWizard.js:103 msgid "" "A key pair consists of a public and private key to log in using SSH. The " "configuration of all keys takes place directly via the administration page " @@ -171,7 +171,7 @@ "Der Name für die virtuelle Maschine wird benötigt und sollte nicht der " "vorgeschlagenen Namenspräfix entsprechen" -#: umc/js/uvmm/InstanceWizard.js:105 +#: umc/js/uvmm/InstanceWizard.js:106 msgid "" "A security group acts as a virtual firewall that controls the traffic of the " "instance. To enable access, correct rules have to be configured (for " @@ -283,9 +283,9 @@ msgid "Authentication URL endpoint" msgstr "URL des Authentifizierungs-Endpunktes" -#: umc/js/uvmm/DomainPage.js:91 umc/js/uvmm/DomainWizard.js:215 -#: umc/js/uvmm/CreatePage.js:104 umc/js/uvmm/CloudConnectionWizard.js:62 -#: umc/js/uvmm/InstancePage.js:72 umc/js/uvmm/InstanceWizard.js:75 +#: umc/js/uvmm/DomainWizard.js:215 umc/js/uvmm/InstancePage.js:72 +#: umc/js/uvmm/InstanceWizard.js:75 umc/js/uvmm/CreatePage.js:104 +#: umc/js/uvmm/DomainPage.js:91 umc/js/uvmm/CloudConnectionWizard.js:62 msgid "Back to overview" msgstr "Zurück zur Übersicht" @@ -334,9 +334,9 @@ msgid "Caching" msgstr "Caching" +#: umc/js/uvmm/DriveGrid.js:303 umc/js/uvmm/DriveGrid.js:332 #: umc/js/uvmm/SnapshotGrid.js:181 umc/js/uvmm/SnapshotGrid.js:207 #: umc/js/uvmm/SnapshotGrid.js:244 umc/js/uvmm/InterfaceGrid.js:134 -#: umc/js/uvmm/DriveGrid.js:303 umc/js/uvmm/DriveGrid.js:332 #: umc/js/uvmm.js:476 umc/js/uvmm.js:595 umc/js/uvmm.js:656 umc/js/uvmm.js:935 #: umc/js/uvmm.js:1104 msgid "Cancel" @@ -347,15 +347,15 @@ msgid "Change medium" msgstr "Medium wechseln" -#: umc/js/uvmm/InstanceWizard.js:288 +#: umc/js/uvmm/InstanceWizard.js:293 msgid "Choose an AMI" msgstr "Wählen Sie ein AMI aus" -#: umc/js/uvmm/InstanceWizard.js:197 +#: umc/js/uvmm/InstanceWizard.js:201 msgid "Choose an Image" msgstr "Auswahl eines Images" -#: umc/js/uvmm/InstanceWizard.js:207 umc/js/uvmm/InstanceWizard.js:271 +#: umc/js/uvmm/InstanceWizard.js:211 umc/js/uvmm/InstanceWizard.js:276 msgid "Choose an Instance Size" msgstr "Wahl der Instanzgröße" @@ -379,10 +379,18 @@ msgid "Cloud instance" msgstr "Cloud-Instanz" -#: umc/js/uvmm/InstanceWizard.js:224 umc/js/uvmm/InstanceWizard.js:299 +#: umc/js/uvmm/InstanceWizard.js:304 +msgid "Configure Network" +msgstr "Netzwerk konfigurieren" + +#: umc/js/uvmm/InstanceWizard.js:228 umc/js/uvmm/InstanceWizard.js:328 msgid "Configure Security Group" msgstr "Konfigurieren einer Sicherheitsgruppe" +#: umc/js/uvmm/InstanceWizard.js:321 +msgid "Configure Subnet" +msgstr "Subnetz konfigurieren" + #: umc/js/uvmm/DriveGrid.js:291 msgid "Configure cache behaviour of host." msgstr "Cache-Verhalten des Hosts konfigurieren." @@ -412,7 +420,7 @@ msgid "Create a new cloud connection service account." msgstr "Erstellen einer neuen Cloud-Verbindung." -#: umc/js/uvmm/OpenStack.js:52 umc/js/uvmm/EC2.js:46 +#: umc/js/uvmm/EC2.js:46 umc/js/uvmm/OpenStack.js:52 msgid "Create a new cloud connection." msgstr "Erstellen einer neuen Cloud-Verbindung." @@ -420,7 +428,7 @@ msgid "Create a new image" msgstr "Erstellen einer neuen Image-Datei" -#: umc/js/uvmm/CreatePage.js:122 umc/js/uvmm/InstanceWizard.js:117 +#: umc/js/uvmm/InstanceWizard.js:121 umc/js/uvmm/CreatePage.js:122 msgid "Create a new virtual machine instance." msgstr "Erstellen einer neuen virtuellen Instanz." @@ -482,9 +490,10 @@ msgid "Default (RealTek RTL-8139)" msgstr "Voreinstellung (RealTek RTL-8139)" +#: umc/js/uvmm/DriveGrid.js:97 umc/js/uvmm/DriveGrid.js:328 #: umc/js/uvmm/SnapshotGrid.js:64 umc/js/uvmm/SnapshotGrid.js:240 -#: umc/js/uvmm/DriveGrid.js:97 umc/js/uvmm/DriveGrid.js:328 umc/js/uvmm.js:283 -#: umc/js/uvmm.js:587 umc/js/uvmm.js:648 umc/js/uvmm.js:1355 +#: umc/js/uvmm.js:283 umc/js/uvmm.js:587 umc/js/uvmm.js:648 +#: umc/js/uvmm.js:1355 msgid "Delete" msgstr "Löschen" @@ -496,7 +505,7 @@ msgid "Delete an instance" msgstr "Löschen einer Instanz" -#: umc/js/uvmm/DomainPage.js:140 umc/js/uvmm/DomainWizard.js:171 +#: umc/js/uvmm/DomainWizard.js:171 umc/js/uvmm/DomainPage.js:140 msgid "Description" msgstr "Beschreibung" @@ -512,7 +521,7 @@ msgid "Devices" msgstr "Geräte" -#: umc/js/uvmm/DomainPage.js:228 umc/js/uvmm/DomainWizard.js:205 +#: umc/js/uvmm/DomainWizard.js:205 umc/js/uvmm/DomainPage.js:228 msgid "Direct access (VNC)" msgstr "Direktzugriff (VNC)" @@ -528,11 +537,11 @@ msgid "Drive type" msgstr "Laufwerktyp" -#: umc/js/uvmm/InterfaceGrid.js:75 umc/js/uvmm/InterfaceWizard.js:76 +#: umc/js/uvmm/InterfaceWizard.js:76 umc/js/uvmm/InterfaceGrid.js:75 msgid "Driver" msgstr "Treiber" -#: umc/js/uvmm/DomainPage.js:295 umc/js/uvmm/DomainWizard.js:113 +#: umc/js/uvmm/DomainWizard.js:113 umc/js/uvmm/DomainPage.js:295 msgid "Drives" msgstr "Laufwerke" @@ -571,7 +580,7 @@ "Speicherbereich ausgewählt, wird die Liste der verfügbaren ISO-Images " "aktualisiert." -#: umc/js/uvmm/InterfaceGrid.js:91 umc/js/uvmm/DriveGrid.js:86 +#: umc/js/uvmm/DriveGrid.js:86 umc/js/uvmm/InterfaceGrid.js:91 #: umc/js/uvmm.js:271 umc/js/uvmm.js:1290 umc/js/uvmm.js:1377 msgid "Edit" msgstr "Bearbeiten" @@ -654,7 +663,7 @@ msgid "General" msgstr "Allgemein" -#: umc/js/uvmm/DomainPage.js:110 umc/js/uvmm/InstancePage.js:64 +#: umc/js/uvmm/InstancePage.js:64 umc/js/uvmm/DomainPage.js:110 msgid "General settings" msgstr "Allgemeine Einstellungen" @@ -678,8 +687,8 @@ msgid "Guest controlled" msgstr "Gast-gesteuert" -#: umc/js/uvmm/types.js:54 umc/js/uvmm/types.js:204 -#: umc/js/uvmm/InstanceWizard.js:154 +#: umc/js/uvmm/InstanceWizard.js:158 umc/js/uvmm/types.js:54 +#: umc/js/uvmm/types.js:204 msgid "Hard drive" msgstr "Festplatte" @@ -738,7 +747,7 @@ "gewechselt und zu dieser wieder zurückgesprungen werden. Das neue ISO-Image " "sollte angezeigt werden." -#: umc/js/uvmm/InstancePage.js:116 umc/js/uvmm/DriveGrid.js:75 +#: umc/js/uvmm/DriveGrid.js:75 umc/js/uvmm/InstancePage.js:116 msgid "Image" msgstr "Image" @@ -750,7 +759,7 @@ msgid "Inherit MAC addresses" msgstr "MAC-Adressen übernehmen" -#: umc/js/uvmm/InstanceWizard.js:181 umc/js/uvmm/InstanceWizard.js:255 +#: umc/js/uvmm/InstanceWizard.js:185 umc/js/uvmm/InstanceWizard.js:260 msgid "Instance Name" msgstr "Instanzname" @@ -790,6 +799,10 @@ msgid "Latvian" msgstr "Lettisch" +#: umc/js/uvmm/InstanceWizard.js:313 +msgid "Launch into default Network" +msgstr "In Standard-Netzwerk starten" + #: umc/js/uvmm/types.js:157 msgid "Lithuanian" msgstr "Litauisch" @@ -798,7 +811,7 @@ msgid "Local time zone" msgstr "Lokale Zeitzone" -#: umc/js/uvmm/InterfaceGrid.js:81 umc/js/uvmm/InterfaceWizard.js:93 +#: umc/js/uvmm/InterfaceWizard.js:93 umc/js/uvmm/InterfaceGrid.js:81 msgid "MAC address" msgstr "MAC-Adresse" @@ -814,7 +827,7 @@ msgid "Machine" msgstr "Maschine" -#: umc/js/uvmm/DomainPage.js:211 umc/js/uvmm/InstanceWizard.js:153 +#: umc/js/uvmm/InstanceWizard.js:157 umc/js/uvmm/DomainPage.js:211 msgid "Memory" msgstr "Speicher" @@ -838,10 +851,10 @@ msgid "NAT" msgstr "NAT" -#: umc/js/uvmm/DomainPage.js:121 umc/js/uvmm/SnapshotGrid.js:56 -#: umc/js/uvmm/OpenStack.js:74 umc/js/uvmm/DomainWizard.js:165 -#: umc/js/uvmm/InstancePage.js:90 umc/js/uvmm/EC2.js:58 umc/js/uvmm.js:1151 -#: umc/js/uvmm.js:1169 umc/js/uvmm.js:1184 +#: umc/js/uvmm/DomainWizard.js:165 umc/js/uvmm/InstancePage.js:90 +#: umc/js/uvmm/EC2.js:58 umc/js/uvmm/DomainPage.js:121 +#: umc/js/uvmm/SnapshotGrid.js:56 umc/js/uvmm/OpenStack.js:74 +#: umc/js/uvmm.js:1151 umc/js/uvmm.js:1169 umc/js/uvmm.js:1184 msgid "Name" msgstr "Name" @@ -886,8 +899,8 @@ msgid "Not removable" msgstr "Nicht löschbar" -#: umc/js/uvmm/DomainPage.js:187 umc/js/uvmm/DomainWizard.js:199 -#: umc/js/uvmm/InstanceWizard.js:151 +#: umc/js/uvmm/DomainWizard.js:199 umc/js/uvmm/InstanceWizard.js:155 +#: umc/js/uvmm/DomainPage.js:187 msgid "Number of CPUs" msgstr "Anzahl der CPUs" @@ -1059,7 +1072,7 @@ msgid "Read/write caching, sync filtered out (unsafe)" msgstr "Lese-/Schreib-Caching, herausgefiltertes sync (unsafe)" -#: umc/js/uvmm.js:290 +#: umc/js/uvmm/InstanceWizard.js:309 umc/js/uvmm.js:290 msgid "Reload" msgstr "Neu laden" @@ -1096,7 +1109,7 @@ msgid "Russian" msgstr "Russisch" -#: umc/js/uvmm/DomainPage.js:96 umc/js/uvmm/DriveGrid.js:296 +#: umc/js/uvmm/DriveGrid.js:296 umc/js/uvmm/DomainPage.js:96 msgid "Save" msgstr "Speichern" @@ -1116,10 +1129,27 @@ msgid "Security group" msgstr "Sicherheitsgruppe" -#: umc/js/uvmm/InstanceWizard.js:187 umc/js/uvmm/InstanceWizard.js:261 +#: umc/js/uvmm/InstanceWizard.js:191 umc/js/uvmm/InstanceWizard.js:266 msgid "Select a key pair" msgstr "Auswahl eines Schlüsselpaares" +#: umc/js/uvmm/InstanceWizard.js:109 +msgid "" +"Select a network in which the new virtual machine instance should be " +"launched. The network configuration has to be done at the provider's " +"administration interface. Use this link for more information about Amazon VPC " +"and this link to configure VPC." +msgstr "" +"Wählen Sie das Netzwerk aus, in welchem die neue virtuelle Instanz gestartet " +"werden soll. Die Netzwerkkonfiguration erfolgt direkt über die " +"Verwaltungsseite der Cloud. Nutzen Sie diesen Link um weitere " +"Informationen über Amazon VPC zu erhalten und diesen Link um VPC zu " +"konfigurieren." + #: umc/js/uvmm/CreatePage.js:116 msgid "" "Select if you want to create a new machine using an established connection, " @@ -1134,7 +1164,7 @@ "Select the cloud in which a new virtual machine instance is going to be " "created. Alternatively, it is possible to register a new cloud connection." msgstr "" -"Wählen sie die Cloud aus, in der eine neue virtuelle Instanz erzeugt werden " +"Wählen Sie die Cloud aus, in der eine neue virtuelle Instanz erzeugt werden " "soll. Alternativ ist es ebenfalls möglich, eine neue Cloud-Verbindung " "einzutragen." @@ -1158,7 +1188,7 @@ msgid "Service type" msgstr "Servicetyp" -#: umc/js/uvmm/DomainPage.js:153 umc/js/uvmm/InstancePage.js:126 +#: umc/js/uvmm/InstancePage.js:126 umc/js/uvmm/DomainPage.js:153 msgid "Settings" msgstr "Einstellungen" @@ -1237,7 +1267,7 @@ msgid "Snapshots settings" msgstr "Einstellungen für Sicherungspunkte" -#: umc/js/uvmm/InterfaceGrid.js:72 umc/js/uvmm/InterfaceWizard.js:83 +#: umc/js/uvmm/InterfaceWizard.js:83 umc/js/uvmm/InterfaceGrid.js:72 msgid "Source" msgstr "Quelle" @@ -1309,7 +1339,7 @@ msgid "The device cannot be modified by the guest." msgstr "Das Gerät kann nicht vom Gast modifiziert werden." -#: umc/js/uvmm/DomainPage.js:382 umc/js/uvmm/InstancePage.js:152 +#: umc/js/uvmm/InstancePage.js:152 umc/js/uvmm/DomainPage.js:382 #: umc/js/uvmm/DriveWizard.js:363 msgid "The entered data is not valid. Please correct your input." msgstr "" @@ -1337,7 +1367,7 @@ "Die Instanz {label} läuft noch nicht. Bitte warten und klicken Sie auf " "\"Suchen\", um die Ansicht zu aktualisieren." -#: umc/js/uvmm/DomainPage.js:210 umc/js/uvmm/DomainWizard.js:194 +#: umc/js/uvmm/DomainWizard.js:194 umc/js/uvmm/DomainPage.js:210 msgid "The memory size is invalid (e.g. 3GB or 1024 MB), minimum 4 MB" msgstr "" "Die angegebenen Speicherkapazität is ungültig (bspw. 3GB oder 1024 MB), " @@ -1463,8 +1493,8 @@ "univention.de/handbuch-4.0.html#uvmm:networkinterfaces\" target=\"_blank" "\">im Handbuch zu finden." -#: umc/js/uvmm/InterfaceGrid.js:59 umc/js/uvmm/DriveGrid.js:69 -#: umc/js/uvmm/InterfaceWizard.js:62 +#: umc/js/uvmm/DriveGrid.js:69 umc/js/uvmm/InterfaceWizard.js:62 +#: umc/js/uvmm/InterfaceGrid.js:59 msgid "Type" msgstr "Typ" @@ -1538,8 +1568,9 @@ msgid "automatic" msgstr "Automatisch" -#: umc/js/uvmm/InstanceWizard.js:189 umc/js/uvmm/InstanceWizard.js:226 -#: umc/js/uvmm/InstanceWizard.js:263 umc/js/uvmm/InstanceWizard.js:301 +#: umc/js/uvmm/InstanceWizard.js:193 umc/js/uvmm/InstanceWizard.js:230 +#: umc/js/uvmm/InstanceWizard.js:268 umc/js/uvmm/InstanceWizard.js:306 +#: umc/js/uvmm/InstanceWizard.js:330 msgid "more information" msgstr "mehr Informationen" @@ -1575,8 +1606,8 @@ msgid "terminated" msgstr "terminiert" -#: umc/js/uvmm/InterfaceGrid.js:61 umc/js/uvmm/InterfaceGrid.js:77 -#: umc/js/uvmm/DriveGrid.js:71 +#: umc/js/uvmm/DriveGrid.js:71 umc/js/uvmm/InterfaceGrid.js:61 +#: umc/js/uvmm/InterfaceGrid.js:77 msgid "unknown" msgstr "Unbekannt" @@ -1587,6 +1618,9 @@ #~ msgid "Boot device" #~ msgstr "Bootmedium" +#~ msgid "Create new Network" +#~ msgstr "Erstellen einer neuen Image-Datei" + #~ msgid "Full virtualization (KVM)" #~ msgstr "Voll-Virtualisierung (KVM)" Index: umc/python/uvmm/de.po =================================================================== --- umc/python/uvmm/de.po (Revision 59571) +++ umc/python/uvmm/de.po (Arbeitskopie) @@ -34,7 +34,7 @@ msgstr "" "Project-Id-Version: univention-management-console-module-uvmm 2.0.40-1\n" "Report-Msgid-Bugs-To: packages@univention.de\n" -"POT-Creation-Date: 2015-02-02 13:33+0100\n" +"POT-Creation-Date: 2015-03-25 09:15+0100\n" "PO-Revision-Date: 2013-05-23 09:17+0100\n" "Last-Translator: Univention GmbH \n" "Language-Team: German \n" @@ -93,7 +93,7 @@ "Weitere Informationen können in den folgenden Protokolldateien gefunden " "werden:" -#: umc/python/uvmm/nodes.py:98 umc/python/uvmm/__init__.py:144 +#: umc/python/uvmm/__init__.py:144 umc/python/uvmm/nodes.py:98 msgid "Physical servers" msgstr "Physikalische Server" @@ -101,14 +101,18 @@ msgid "" "The connection to the univention-virtual-machine-manager-daemon service " "failed." -msgstr "Die Verbindung zum univention-virtual-machine-manager-daemon-Dienst ist fehlgeschlagen." +msgstr "" +"Die Verbindung zum univention-virtual-machine-manager-daemon-Dienst ist " +"fehlgeschlagen." #: umc/python/uvmm/uvmmd.py:66 #, python-format msgid "" "The connection to the univention-virtual-machine-manager-daemon service " "failed: %s" -msgstr "Die Verbindung zum univention-virtual-machine-manager-daemon-Dienst ist fehlgeschlagen: %s" +msgstr "" +"Die Verbindung zum univention-virtual-machine-manager-daemon-Dienst ist " +"fehlgeschlagen: %s" #: umc/python/uvmm/uvmmd.py:85 msgid "The given UVMM command is not known" @@ -118,7 +122,9 @@ msgid "" "This might be a temporary problem. Please wait some minutes for the " "connection to reestablish or restart the UVMM service." -msgstr "Dies kann ein temporäres Problem sein. Bitte warten Sie einige Minuten damit die Verbindung wiederhergestellt wird oder starten Sie den UVMM-Dienst neu." +msgstr "" +"Dies kann ein temporäres Problem sein. Bitte warten Sie einige Minuten damit " +"die Verbindung wiederhergestellt wird oder starten Sie den UVMM-Dienst neu." #: umc/python/uvmm/domains.py:420 #, python-format Index: umc/python/uvmm/cloud.py =================================================================== --- umc/python/uvmm/cloud.py (Revision 59571) +++ umc/python/uvmm/cloud.py (Arbeitskopie) @@ -285,6 +285,7 @@ """ self.required_options(request, 'conn_name') conn_name = request.options.get('conn_name') + network_id = request.options.get('network_id') def _finished(thread, result, request): """ @@ -298,7 +299,7 @@ secgroup_list = [ {'id': item.id, 'label': item.name} for conn_name, images in data.items() - for item in images + for item in images if network_id in ('default', item.network_id) ] self.finished(request.id, secgroup_list) @@ -316,6 +317,87 @@ conn_name=conn_name ) + def cloud_list_network(self, request): + """ + Returns a list of networks for the given cloud conn_name. + """ + self.required_options(request, 'conn_name') + conn_name = request.options.get('conn_name') + + def _finished(thread, result, request): + """ + Process asynchronous UVMM L_CLOUD_NETWORK_LIST answer. + """ + if self._check_thread_error(thread, result, request): + return + + success, data = result + if success: + network_list = [ + { + 'id': item.id, + 'label': '%s %s' % (item.name, item.cidr or "") + } + for conn_name, images in data.items() + for item in images + ] + + self.finished(request.id, network_list) + else: + self.finished( + request.id, + None, + message=str(data), + status=MODULE_ERR_COMMAND_FAILED + ) + + self.uvmm.send( + 'L_CLOUD_NETWORK_LIST', + Callback(_finished, request), + conn_name=conn_name + ) + + def cloud_list_subnet(self, request): + """ + Returns a list of subnet for the given cloud conn_name. + """ + self.required_options(request, 'conn_name') + conn_name = request.options.get('conn_name') + network_id = request.options.get('network_id') + + def _finished(thread, result, request): + """ + Process asynchronous UVMM L_CLOUD_SUBNET_LIST answer. + """ + if self._check_thread_error(thread, result, request): + return + + success, data = result + if success: + subnet_list = [ + { + 'id': item.id, + 'label': '%s %s' % (item.name, item.cidr or "") + } + for conn_name, images in data.items() + for item in images if network_id == item.network_id + ] + + self.finished(request.id, subnet_list) + else: + self.finished( + request.id, + None, + message=str(data), + status=MODULE_ERR_COMMAND_FAILED + ) + + self.uvmm.send( + 'L_CLOUD_SUBNET_LIST', + Callback(_finished, request), + conn_name=conn_name + ) + @sanitize(domainPattern=SearchSanitizer(default='*')) def instance_query(self, request): """ Index: umc/uvmm.xml =================================================================== --- umc/uvmm.xml (Revision 59571) +++ umc/uvmm.xml (Arbeitskopie) @@ -46,6 +46,8 @@ + + Index: src/univention/uvmm/cloudnode.py =================================================================== --- src/univention/uvmm/cloudnode.py (Revision 59571) +++ src/univention/uvmm/cloudnode.py (Arbeitskopie) @@ -205,6 +205,15 @@ return networks + def list_conn_subnets(self, conn_name="*"): + connection_list = self._get_connections(conn_name) + + subnets = {} + for connection in connection_list: + subnets[connection.publicdata.name] = connection.list_subnets() + + return subnets + def instance_state(self, conn_name, instance_id, state): self._check_if_connection_exists(conn_name) self[conn_name].instance_state(instance_id, state) Index: src/univention/uvmm/openstackcloud.py =================================================================== --- src/univention/uvmm/openstackcloud.py (Revision 59571) +++ src/univention/uvmm/openstackcloud.py (Arbeitskopie) @@ -266,6 +266,9 @@ return networks + def list_subnets(self): + return [] + def _boot_instance(self, instance): self._exec_libcloud(lambda: self.driver.ex_hard_reboot_node(instance)) Index: src/univention/uvmm/ec2cloud.py =================================================================== --- src/univention/uvmm/ec2cloud.py (Revision 59571) +++ src/univention/uvmm/ec2cloud.py (Arbeitskopie) @@ -47,7 +47,7 @@ from node import PersistentCached from helpers import N_ as _ from cloudconnection import CloudConnection, CloudConnectionError -from protocol import Cloud_Data_Instance, Cloud_Data_Location, Cloud_Data_Secgroup, Cloud_Data_Size, Cloud_Data_Network +from protocol import Cloud_Data_Instance, Cloud_Data_Location, Cloud_Data_Secgroup, Cloud_Data_Size, Cloud_Data_Network, Cloud_Data_Subnet import univention.config_registry as ucr configRegistry = ucr.ConfigRegistry() @@ -72,7 +72,7 @@ "location": "location", "keyname": "ex_keyname", "userdata": "ex_userdata", - "security_group_ids": "ex_security_groups", + "security_group_ids": {'group_name': "ex_security_groups", 'group_id': 'ex_security_group_ids'}, "metadata": "ex_metadata", "min_instance_count": "ex_mincount", "max_instance_count": "ex_maxcount", @@ -80,7 +80,7 @@ "blockdevicemappings": "ex_blockdevicemappings", "iamprofile": "ex_iamprofile", "ebs_optimized": "ex_ebs_optimized", - "subnet": "ex_subnet" + "subnet_id": "ex_subnet" } @@ -94,14 +94,15 @@ PROVIDER_MAPPING = { - "EC2_US_EAST": Provider.EC2_US_EAST, - "EC2_EU_WEST": Provider.EC2_EU_WEST, - "EC2_US_WEST": Provider.EC2_US_WEST, - "EC2_US_WEST_OREGON": Provider.EC2_US_WEST_OREGON, - "EC2_AP_SOUTHEAST": Provider.EC2_AP_SOUTHEAST, - "EC2_AP_NORTHEAST": Provider.EC2_AP_NORTHEAST, - "EC2_SA_EAST": Provider.EC2_SA_EAST, - "EC2_AP_SOUTHEAST2": Provider.EC2_AP_SOUTHEAST2, + "EC2_US_EAST": "us-east-1", + "EC2_EU_WEST": "eu-west-1", + "EC2_US_WEST": "us-west-1", + "EC2_US_WEST_OREGON": "us-west-2", + "EC2_AP_SOUTHEAST": "ap-southeast-1", + "EC2_AP_NORTHEAST": "ap-northeast-1", + "EC2_SA_EAST": "sa-east-1", + "EC2_AP_SOUTHEAST2": "ap-southeast-2", + "EC2_EU_CENTRAL": "eu-central-1", } @@ -138,7 +139,8 @@ if 'secure' not in params: params['secure'] = True - os = get_driver(PROVIDER_MAPPING[cloud["region"]]) + os = get_driver(Provider.EC2) + params['region'] = PROVIDER_MAPPING[cloud["region"]] p = params.copy() p["secret"] = "******" @@ -165,6 +167,7 @@ self._keypairs = self._exec_libcloud(lambda: self.driver.list_key_pairs()) self._security_groups = self._exec_libcloud(lambda: self.driver.ex_get_security_groups()) # ex_get_ for ec2! self._networks = self._exec_libcloud(lambda: self.driver.ex_list_networks()) + self._subnets = self._exec_libcloud(lambda: self.driver.ex_list_subnets()) self._last_expensive_update = time.time() def list_instances(self, pattern="*"): @@ -228,6 +231,8 @@ s.out_rules = secgroup.egress_rules s.extra = secgroup.extra s.tenant_id = secgroup.extra["owner_id"] + s.driver = self.driver.name # missing in libcloud EC2SecurityGroup + s.network_id = secgroup.extra["vpc_id"] secgroups.append(s) @@ -258,6 +263,7 @@ s = Cloud_Data_Network() s.id = network.id s.name = network.name + s.driver = self.driver.name # missing in libcloud EC2Network s.extra = network.extra s.cidr = network.cidr_block @@ -265,6 +271,21 @@ return networks + def list_subnets(self): + subnets = [] + for subnet in self._subnets: + s = Cloud_Data_Subnet() + s.id = subnet.id + s.name = subnet.name + s.driver = self.driver.name # missing in libcloud EC2NetworkSubnet + s.cidr = subnet.extra['cidr_block'] + s.network_id = subnet.extra["vpc_id"] + s.extra = subnet.extra + + subnets.append(s) + + return subnets + def to_cloud_data_image(self, image): cloud_data_image = super(EC2CloudConnection, self).to_cloud_data_image(image) cloud_data_image.name = "%s (%s)" % (image.name, image.id) @@ -421,7 +442,10 @@ if not secgroups: raise EC2CloudConnectionError("No security group with id %s found." % args["security_group_ids"]) - kwargs[EC2_CREATE_ATTRIBUTES["security_group_ids"]] = [s.name for s in secgroups] + if "subnet_id" in args and args["subnet_id"] != '': # vpc + kwargs[EC2_CREATE_ATTRIBUTES["security_group_ids"]["group_id"]] = [s.id for s in secgroups] + else: # default + kwargs[EC2_CREATE_ATTRIBUTES["security_group_ids"]["group_name"]] = [s.name for s in secgroups] if "min_instance_count" in args: if not (isinstance(args["min_instance_count"], int)): @@ -457,10 +481,13 @@ raise EC2CloudConnectionError(" attribute must be a bool") kwargs[EC2_CREATE_ATTRIBUTES["ebs_optimized"]] = args["ebs_optimized"] - if "subnet" in args: - if not (isinstance(args["subnet"], str)): - raise EC2CloudConnectionError(" attribute must be a string") - kwargs[EC2_CREATE_ATTRIBUTES["subnet"]] = args["subnet"] + if "subnet_id" in args and args["subnet_id"] != '': + if not (isinstance(args["subnet_id"], str) or isinstance(args["userdata"], unicode)): + raise EC2CloudConnectionError(" attribute must be a string") + subnet = [s for s in self._subnets if s.id == args["subnet_id"]] + if not subnet: + raise EC2CloudConnectionError("No subnet with id %s found." % args["subnet_id"]) + kwargs[EC2_CREATE_ATTRIBUTES["subnet_id"]] = subnet[0] # libcloud call try: Index: src/univention/uvmm/commands.py =================================================================== --- src/univention/uvmm/commands.py (Revision 59571) +++ src/univention/uvmm/commands.py (Arbeitskopie) @@ -204,6 +204,19 @@ raise CommandError('L_CLOUD_NETWORK_LIST', e) @staticmethod + def L_CLOUD_SUBNET_LIST(server, request): + """List available cloud subnets of cloud connections""" + logger.debug('L_CLOUD_SUBNET_LIST') + if not isinstance(request.conn_name, basestring): + raise CommandError('L_CLOUD_SUBNET_LIST', _('conn_name != string: %(conn_name)s'), conn_name=request.conn_name) + try: + res = protocol.Response_DUMP() + res.data = cloudnode.cloudconnections.list_conn_subnets(request.conn_name) + return res + except cloudnode.CloudConnectionError, e: + raise CommandError('L_CLOUD_SUBNET_LIST', e) + + @staticmethod def L_CLOUD_INSTANCE_STATE(server, request): """Change instance state""" logger.debug('L_CLOUD_INSTANCE_STATE') Index: src/univention/uvmm/protocol.py =================================================================== --- src/univention/uvmm/protocol.py (Revision 59571) +++ src/univention/uvmm/protocol.py (Arbeitskopie) @@ -340,6 +340,12 @@ self.command = 'L_CLOUD_NETWORK_LIST' self.conn_name = None +class Request_L_CLOUD_SUBNET_LIST(Request): + """List available cloud subnets of cloud connections""" + def _default(self): + self.command = 'L_CLOUD_SUBNET_LIST' + self.conn_name = None + class Request_L_CLOUD_INSTANCE_STATE(Request): """Change instance state""" def _default(self): @@ -542,6 +548,7 @@ self.in_rules = {} self.out_rules = {} self.extra = {} + self.network_id = None class Cloud_Data_Secgroup_Rule(object): @@ -569,6 +576,17 @@ self.extra = {} +class Cloud_Data_Subnet(object): + """Container for libcloud subnet statistics""" + def __init__(self): + self.name = None + self.id = None + self.driver = None + self.cidr = None + self.network_id = None + self.extra = {} + + class Data_Snapshot(object): """Container for snapshot data.""" def __init__(self): Index: src/univention/uvmm/cloudconnection.py =================================================================== --- src/univention/uvmm/cloudconnection.py (Revision 59571) +++ src/univention/uvmm/cloudconnection.py (Arbeitskopie) @@ -98,6 +98,7 @@ self._images = [] self._sizes = [] self._networks = [] + self._subnets = [] def _create_connection(self, cloud, testconnection=True): pass Index: src/univention-virtual-machine-manager =================================================================== --- src/univention-virtual-machine-manager (Revision 59571) +++ src/univention-virtual-machine-manager (Arbeitskopie) @@ -719,6 +719,15 @@ """ return protocol.Request_L_CLOUD_NETWORK_LIST(conn_name=name) + def cloud_subnet_list(self, name="*"): + """ + %prog cloud_subnet_list + + List available cloud subnets + name is the cloud connection name. If empty, list information from all connections + """ + return protocol.Request_L_CLOUD_SUBNET_LIST(conn_name=name) + def cloud_instance_state(self, name, instance_id, state): """ %prog cloud_instance_state