Commit 02238427 by Szabolcs Gelencser

Add public IP display, associate operation

parent 7a0b9b2b
......@@ -3,8 +3,10 @@
<component name="ChangeListManager">
<list default="true" id="1fbec8af-5a7c-40f9-b994-83ac07d1ae1d" name="Default" comment="">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
<change beforePath="$PROJECT_DIR$/circle/dashboard/forms.py" afterPath="$PROJECT_DIR$/circle/dashboard/forms.py" />
<change beforePath="$PROJECT_DIR$/circle/dashboard/templates/dashboard/vm-detail/network.html" afterPath="$PROJECT_DIR$/circle/dashboard/templates/dashboard/vm-detail/network.html" />
<change beforePath="$PROJECT_DIR$/circle/dashboard/views/vm.py" afterPath="$PROJECT_DIR$/circle/dashboard/views/vm.py" />
<change beforePath="$PROJECT_DIR$/circle/vm/operations.py" afterPath="$PROJECT_DIR$/circle/vm/operations.py" />
</list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="TRACKING_ENABLED" value="true" />
......@@ -37,8 +39,28 @@
<file leaf-file-name="vm.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/circle/dashboard/views/vm.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="284">
<caret line="167" column="51" lean-forward="false" selection-start-line="167" selection-start-column="47" selection-end-line="167" selection-end-column="51" />
<state relative-caret-position="293">
<caret line="182" column="81" lean-forward="false" selection-start-line="182" selection-start-column="81" selection-end-line="182" selection-end-column="81" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="forms.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/circle/dashboard/forms.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="304">
<caret line="1018" column="40" lean-forward="false" selection-start-line="1018" selection-start-column="40" selection-end-line="1018" selection-end-column="40" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="operations.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/circle/vm/operations.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="306">
<caret line="465" column="0" lean-forward="true" selection-start-line="465" selection-start-column="0" selection-end-line="465" selection-end-column="0" />
<folding />
</state>
</provider>
......@@ -47,9 +69,11 @@
<file leaf-file-name="network.html" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/circle/dashboard/templates/dashboard/vm-detail/network.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="187">
<caret line="39" column="0" lean-forward="false" selection-start-line="39" selection-start-column="2" selection-end-line="39" selection-end-column="75" />
<folding />
<state relative-caret-position="323">
<caret line="64" column="20" lean-forward="true" selection-start-line="64" selection-start-column="20" selection-end-line="64" selection-end-column="20" />
<folding>
<marker date="1524051869354" expanded="false" signature="3016:3034" ph="..." />
</folding>
</state>
</provider>
</entry>
......@@ -66,25 +90,6 @@
</component>
<component name="FindInProjectRecents">
<findStrings>
<find>request</find>
<find>SuperuserRequiredMixin</find>
<find>#TODO</find>
<find>localhost</find>
<find>requests</find>
<find>cert</find>
<find>saml</find>
<find>saml_ava</find>
<find>loginview</find>
<find>sso</find>
<find>settings.</find>
<find>microsofttranslator</find>
<find>markupsafe</find>
<find>lx</find>
<find>ET</find>
<find>domain_validator</find>
<find>connect_command_template_validator</find>
<find>M2Crypto</find>
<find>salt</find>
<find>LocalClient</find>
<find>trait</find>
<find>class NodeActivity</find>
......@@ -96,6 +101,25 @@
<find>forwar</find>
<find>DEFAULT_SUBNETPOOL_NAME_FOR_USER</find>
<find>get_id</find>
<find>add_port</find>
<find>vm_ops</find>
<find>VmPortAddView</find>
<find>VmPortAddForm</find>
<find>vm_opts</find>
<find>removeport</find>
<find>vm_op</find>
<find>remove</find>
<find>port</find>
<find>VmPublicIpAddForm</find>
<find>f</find>
<find>forms.Choicefi</find>
<find>pools</find>
<find>Hidden</find>
<find>port_id</find>
<find>Public IP</find>
<find>publicip</find>
<find>portadd</find>
<find>vmdeta</find>
</findStrings>
<replaceStrings>
<replace>'ACTIVE'</replace>
......@@ -116,7 +140,6 @@
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
<option value="$PROJECT_DIR$/circle/dashboard/static/vue.css" />
<option value="$PROJECT_DIR$/circle/network/templates/network/vxlan-edit.html" />
<option value="$PROJECT_DIR$/circle/network/forms.py" />
<option value="$PROJECT_DIR$/circle/network/views.py" />
......@@ -159,11 +182,12 @@
<option value="$PROJECT_DIR$/circle/dashboard/tables.py" />
<option value="$PROJECT_DIR$/circle/vm/models/activity.py" />
<option value="$PROJECT_DIR$/circle/vm/models/__init__.py" />
<option value="$PROJECT_DIR$/circle/vm/operations.py" />
<option value="$PROJECT_DIR$/circle/vm/admin.py" />
<option value="$PROJECT_DIR$/circle/dashboard/templates/dashboard/vm-plain-image-create.html" />
<option value="$PROJECT_DIR$/circle/circle/settings/base.py" />
<option value="$PROJECT_DIR$/circle/network/models.py" />
<option value="$PROJECT_DIR$/circle/vm/operations.py" />
<option value="$PROJECT_DIR$/circle/dashboard/templates/dashboard/vm-detail/_network-public-ip-add.html" />
<option value="$PROJECT_DIR$/circle/dashboard/forms.py" />
<option value="$PROJECT_DIR$/circle/dashboard/views/vm.py" />
<option value="$PROJECT_DIR$/circle/dashboard/templates/dashboard/vm-detail/network.html" />
......@@ -241,40 +265,6 @@
<item name="cloud" type="b2602c69:ProjectViewProjectNode" />
<item name="cloud" type="462c0819:PsiDirectoryNode" />
<item name="circle" type="462c0819:PsiDirectoryNode" />
<item name="circle" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="cloud" type="b2602c69:ProjectViewProjectNode" />
<item name="cloud" type="462c0819:PsiDirectoryNode" />
<item name="circle" type="462c0819:PsiDirectoryNode" />
<item name="circle" type="462c0819:PsiDirectoryNode" />
<item name="settings" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="cloud" type="b2602c69:ProjectViewProjectNode" />
<item name="cloud" type="462c0819:PsiDirectoryNode" />
<item name="circle" type="462c0819:PsiDirectoryNode" />
<item name="common" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="cloud" type="b2602c69:ProjectViewProjectNode" />
<item name="cloud" type="462c0819:PsiDirectoryNode" />
<item name="circle" type="462c0819:PsiDirectoryNode" />
<item name="common" type="462c0819:PsiDirectoryNode" />
<item name="management" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="cloud" type="b2602c69:ProjectViewProjectNode" />
<item name="cloud" type="462c0819:PsiDirectoryNode" />
<item name="circle" type="462c0819:PsiDirectoryNode" />
<item name="common" type="462c0819:PsiDirectoryNode" />
<item name="management" type="462c0819:PsiDirectoryNode" />
<item name="commands" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="cloud" type="b2602c69:ProjectViewProjectNode" />
<item name="cloud" type="462c0819:PsiDirectoryNode" />
<item name="circle" type="462c0819:PsiDirectoryNode" />
<item name="dashboard" type="462c0819:PsiDirectoryNode" />
</path>
<path>
......@@ -314,16 +304,17 @@
<property name="settings.editor.selected.configurable" value="watcher.settings" />
<property name="NewWatcherDialog.advanced.open" value="true" />
<property name="DefaultHtmlFileTemplate" value="HTML File" />
<property name="SearchEverywhereHistoryKey" value="vxlanc&#9;null&#9;null&#10;plain&#9;null&#9;null&#10;base.&#9;FILE&#9;file:///home/h3yduck/cloud/circle/circle/settings/base.py&#10;local&#9;FILE&#9;file:///home/h3yduck/cloud/circle/circle/settings/local.py&#10;views.&#9;FILE&#9;file:///home/h3yduck/cloud/circle/openstack_auth/views.py&#10;login.html&#9;FILE&#9;file:///home/h3yduck/cloud/circle/dashboard/templates/auth/login.html&#10;LoginVi&#9;null&#9;null&#10;indexv&#9;null&#9;null&#10;index-vm&#9;FILE&#9;file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/index-vm.html&#10;index.&#9;FILE&#9;file:///home/h3yduck/cloud/circle/dashboard/views/index.py&#10;index&#9;FILE&#9;file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/index.html&#10;bas&#9;FILE&#9;file:///home/h3yduck/cloud/circle/openstack_api/base.py&#10;save&#9;null&#9;null&#10;plainc&#9;null&#9;null&#10;vmdeta&#9;null&#9;null&#10;templatedet&#9;null&#9;null&#10;instancetemp&#9;null&#9;null&#10;instancetem&#9;null&#9;null&#10;url&#9;FILE&#9;file:///home/h3yduck/cloud/circle/dashboard/urls.py&#10;vmcreate&#9;null&#9;null&#10;base&#9;FILE&#9;file:///home/h3yduck/cloud/circle/circle/settings/base.py&#10;opera&#9;FILE&#9;file:///home/h3yduck/cloud/circle/vm/operations.py&#10;operations&#9;FILE&#9;file:///home/h3yduck/cloud/circle/common/operations.py&#10;templat&#9;null&#9;null&#10;vmadd&#9;null&#9;null&#10;vmdetail&#9;null&#9;null&#10;addinterfa&#9;null&#9;null&#10;addin&#9;null&#9;null&#10;server&#9;null&#9;null&#10;Instance&#9;null&#9;null&#10;instance&#9;FILE&#9;file:///home/h3yduck/cloud/circle/vm/models/instance.py&#10;operat&#9;null&#9;null&#10;ins&#9;FILE&#9;file:///home/h3yduck/cloud/circle/vm/models/instance.py&#10;vmdetai&#9;null&#9;null&#10;operationvi&#9;null&#9;null&#10;ser&#9;null&#9;null&#10;server.&#9;FILE&#9;file:///home/h3yduck/.virtualenvs/cloud/local/lib/python2.7/site-packages/novaclient/v2/servers.py&#10;resources.&#9;FILE&#9;file:///home/h3yduck/cloud/circle/request/templates/request/initials/resources.html&#10;vm-de&#9;FILE&#9;file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/vm-detail.html&#10;vxla&#9;null&#9;null&#10;urls&#9;FILE&#9;file:///home/h3yduck/cloud/circle/dashboard/urls.py&#10;index-v&#9;FILE&#9;file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/index-vxlans.html&#10;create&#9;FILE&#9;file:///home/h3yduck/cloud/circle/network/templates/network/vxlan-create.html&#10;vxl&#9;null&#9;null&#10;nov&#9;FILE&#9;file:///home/h3yduck/cloud/circle/openstack_api/nova.py&#10;nova.p&#9;FILE&#9;file:///home/h3yduck/cloud/circle/openstack_api/nova.py&#10;vmdetailv&#9;null&#9;null&#10;editor&#9;null&#9;null&#10;networktopo&#9;FILE&#9;file:///home/h3yduck/cloud/circle/network/static/js/horizon.networktopology.js&#10;bow&#9;FILE&#9;file:///home/h3yduck/cloud/circle/bower.json" />
<property name="SearchEverywhereHistoryKey" value="vmdeta&#9;null&#9;null&#10;indexview&#9;null&#9;null&#10;operatio&#9;FILE&#9;file:///home/h3yduck/cloud/circle/vm/operations.py&#10;vxlanc&#9;null&#9;null&#10;plain&#9;null&#9;null&#10;base.&#9;FILE&#9;file:///home/h3yduck/cloud/circle/circle/settings/base.py&#10;local&#9;FILE&#9;file:///home/h3yduck/cloud/circle/circle/settings/local.py&#10;views.&#9;FILE&#9;file:///home/h3yduck/cloud/circle/openstack_auth/views.py&#10;login.html&#9;FILE&#9;file:///home/h3yduck/cloud/circle/dashboard/templates/auth/login.html&#10;LoginVi&#9;null&#9;null&#10;indexv&#9;null&#9;null&#10;index-vm&#9;FILE&#9;file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/index-vm.html&#10;index.&#9;FILE&#9;file:///home/h3yduck/cloud/circle/dashboard/views/index.py&#10;index&#9;FILE&#9;file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/index.html&#10;bas&#9;FILE&#9;file:///home/h3yduck/cloud/circle/openstack_api/base.py&#10;save&#9;null&#9;null&#10;plainc&#9;null&#9;null&#10;templatedet&#9;null&#9;null&#10;instancetemp&#9;null&#9;null&#10;instancetem&#9;null&#9;null&#10;url&#9;FILE&#9;file:///home/h3yduck/cloud/circle/dashboard/urls.py&#10;vmcreate&#9;null&#9;null&#10;base&#9;FILE&#9;file:///home/h3yduck/cloud/circle/circle/settings/base.py&#10;opera&#9;FILE&#9;file:///home/h3yduck/cloud/circle/vm/operations.py&#10;operations&#9;FILE&#9;file:///home/h3yduck/cloud/circle/common/operations.py&#10;templat&#9;null&#9;null&#10;vmadd&#9;null&#9;null&#10;vmdetail&#9;null&#9;null&#10;addinterfa&#9;null&#9;null&#10;addin&#9;null&#9;null&#10;server&#9;null&#9;null&#10;Instance&#9;null&#9;null&#10;instance&#9;FILE&#9;file:///home/h3yduck/cloud/circle/vm/models/instance.py&#10;operat&#9;null&#9;null&#10;ins&#9;FILE&#9;file:///home/h3yduck/cloud/circle/vm/models/instance.py&#10;vmdetai&#9;null&#9;null&#10;operationvi&#9;null&#9;null&#10;ser&#9;null&#9;null&#10;server.&#9;FILE&#9;file:///home/h3yduck/.virtualenvs/cloud/local/lib/python2.7/site-packages/novaclient/v2/servers.py&#10;resources.&#9;FILE&#9;file:///home/h3yduck/cloud/circle/request/templates/request/initials/resources.html&#10;vm-de&#9;FILE&#9;file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/vm-detail.html&#10;vxla&#9;null&#9;null&#10;urls&#9;FILE&#9;file:///home/h3yduck/cloud/circle/dashboard/urls.py&#10;index-v&#9;FILE&#9;file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/index-vxlans.html&#10;create&#9;FILE&#9;file:///home/h3yduck/cloud/circle/network/templates/network/vxlan-create.html&#10;vxl&#9;null&#9;null&#10;nov&#9;FILE&#9;file:///home/h3yduck/cloud/circle/openstack_api/nova.py&#10;nova.p&#9;FILE&#9;file:///home/h3yduck/cloud/circle/openstack_api/nova.py&#10;vmdetailv&#9;null&#9;null&#10;editor&#9;null&#9;null" />
</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/circle/dashboard/templates/dashboard/vm-detail" />
<recent name="$PROJECT_DIR$/circle/circle/os_policies" />
</key>
<key name="MoveFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/circle/circle" />
<recent name="$PROJECT_DIR$/circle/dashboard/templates/auth" />
</key>
<key name="CopyFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/circle/circle/os_policies" />
</key>
</component>
<component name="RunDashboard">
<option name="ruleStates">
......@@ -466,14 +457,15 @@
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32492113" sideWeight="0.50745475" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Python Console" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.43023255" sideWeight="0.43610224" order="7" side_tool="true" content_ui="tabs" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32769555" sideWeight="0.49574015" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.47568712" sideWeight="0.5037274" order="7" side_tool="true" content_ui="tabs" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.14110756" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.5674653" sideWeight="0.5058573" order="7" side_tool="true" content_ui="tabs" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.20074548" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
<window_info id="Docker" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="false" weight="0.33" sideWeight="0.5" order="8" side_tool="false" content_ui="tabs" />
<window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32875264" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="SciView" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.47568712" sideWeight="0.49627262" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.47568712" sideWeight="0.4941427" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
<window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
......@@ -481,7 +473,6 @@
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
<window_info id="Coverage" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="true" content_ui="tabs" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32875264" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
</layout>
<layout-to-restore>
......@@ -549,6 +540,11 @@
<line>82</line>
<option name="timeStamp" value="13" />
</line-breakpoint>
<line-breakpoint enabled="true" suspend="THREAD" type="python-line">
<url>file://$PROJECT_DIR$/circle/common/operations.py</url>
<line>69</line>
<option name="timeStamp" value="317" />
</line-breakpoint>
</breakpoints>
<breakpoints-dialog>
<breakpoints-dialog />
......@@ -560,13 +556,18 @@
</properties>
</breakpoint>
</default-breakpoints>
<option name="time" value="310" />
<option name="time" value="329" />
</breakpoint-manager>
<watches-manager />
</component>
<component name="debuggerHistoryManager">
<expressions id="evaluateCodeFragment">
<expression>
<expression-string>openstack_api.neutron.floating_ip_associate(request, '726906f3-0d05-4440-9027-da11bedef351', port_id)</expression-string>
<language-id>Python</language-id>
<evaluation-mode>CODE_FRAGMENT</evaluation-mode>
</expression>
<expression>
<expression-string>openstack_api.neutron.subnetpool_get(request, 'default')</expression-string>
<language-id>Python</language-id>
<evaluation-mode>CODE_FRAGMENT</evaluation-mode>
......@@ -608,14 +609,6 @@ certifi.where()</expression-string>
<language-id>Python</language-id>
<evaluation-mode>CODE_FRAGMENT</evaluation-mode>
</expression>
<expression>
<expression-string>import requests
r = requests.certs.old_where()
print(r)</expression-string>
<language-id>Python</language-id>
<evaluation-mode>CODE_FRAGMENT</evaluation-mode>
</expression>
</expressions>
<expressions id="breakpointCondition">
<expression>
......@@ -631,97 +624,53 @@ print(r)</expression-string>
</expressions>
<expressions id="evaluateExpression">
<expression>
<expression-string>instance.VirtualInterfaces</expression-string>
<expression-string>openstack_api.neutron.tenant_floating_ip_list(self.request)</expression-string>
<language-id>Python</language-id>
<evaluation-mode>EXPRESSION</evaluation-mode>
</expression>
<expression>
<expression-string>instance.virtualInterfaces</expression-string>
<expression-string>openstack_api.neutron.tenant_floating_ip_list(request)</expression-string>
<language-id>Python</language-id>
<evaluation-mode>EXPRESSION</evaluation-mode>
</expression>
<expression>
<expression-string>instance.virtualinterfaces</expression-string>
<expression-string>openstack_api.neutron.tenant_floating_ip_list()</expression-string>
<language-id>Python</language-id>
<evaluation-mode>EXPRESSION</evaluation-mode>
</expression>
<expression>
<expression-string>instance.addresses</expression-string>
<expression-string>openstack_api.neutron.tar</expression-string>
<language-id>Python</language-id>
<evaluation-mode>EXPRESSION</evaluation-mode>
</expression>
<expression>
<expression-string>instance.private_ip</expression-string>
<expression-string>openstack_api.neutron.tenant_floating_ip_allocate(request, pool, request.user.project_id)</expression-string>
<language-id>Python</language-id>
<evaluation-mode>EXPRESSION</evaluation-mode>
</expression>
<expression>
<expression-string>nics</expression-string>
<expression-string>self.request.POST</expression-string>
<language-id>Python</language-id>
<evaluation-mode>EXPRESSION</evaluation-mode>
</expression>
<expression>
<expression-string>nincs</expression-string>
<expression-string>self.request.GET</expression-string>
<language-id>Python</language-id>
<evaluation-mode>EXPRESSION</evaluation-mode>
</expression>
<expression>
<expression-string>nic_info</expression-string>
<expression-string>self.request</expression-string>
<language-id>Python</language-id>
<evaluation-mode>EXPRESSION</evaluation-mode>
</expression>
<expression>
<expression-string>openstack_api.neutron.router_get(request, &quot;default&quot;)</expression-string>
<expression-string>openstack_api.neutron.float</expression-string>
<language-id>Python</language-id>
<evaluation-mode>EXPRESSION</evaluation-mode>
</expression>
</expressions>
</component>
<component name="editorHistoryManager">
<entry file="file://$USER_HOME$/.virtualenvs/cloud/local/lib/python2.7/site-packages/novaclient/client.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="562">
<caret line="45" column="38" lean-forward="true" selection-start-line="45" selection-start-column="38" selection-end-line="45" selection-end-column="38" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/requirements.txt">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/requirements/base.txt">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="595">
<caret line="35" column="8" lean-forward="false" selection-start-line="35" selection-start-column="8" selection-end-line="35" selection-end-column="8" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/manage.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="408">
<caret line="24" column="0" lean-forward="false" selection-start-line="24" selection-start-column="0" selection-end-line="24" selection-end-column="0" />
</state>
</provider>
</entry>
<entry file="file://$APPLICATION_HOME_DIR$/helpers/pydev/pydevd.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="110">
<caret line="1071" column="0" lean-forward="false" selection-start-line="1071" selection-start-column="0" selection-end-line="1071" selection-end-column="0" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/dashboard/views/user.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="306">
<caret line="107" column="24" lean-forward="false" selection-start-line="107" selection-start-column="24" selection-end-line="107" selection-end-column="24" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/circle/os_policies/circle_policy.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="136">
......@@ -743,18 +692,11 @@ print(r)</expression-string>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/dashboard/views/util.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="284">
<caret line="776" column="47" lean-forward="true" selection-start-line="776" selection-start-column="47" selection-end-line="776" selection-end-column="47" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/openstack_auth/utils.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="236">
<caret line="155" column="54" lean-forward="false" selection-start-line="155" selection-start-column="40" selection-end-line="155" selection-end-column="54" />
<folding />
</state>
</provider>
</entry>
......@@ -791,6 +733,7 @@ print(r)</expression-string>
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1887">
<caret line="122" column="0" lean-forward="false" selection-start-line="122" selection-start-column="0" selection-end-line="122" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
......@@ -842,6 +785,7 @@ print(r)</expression-string>
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="94">
<caret line="24" column="0" lean-forward="false" selection-start-line="24" selection-start-column="0" selection-end-line="24" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
......@@ -853,14 +797,6 @@ print(r)</expression-string>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/common/operations.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="94">
<caret line="231" column="0" lean-forward="false" selection-start-line="231" selection-start-column="0" selection-end-line="231" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/dashboard/tables.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="163">
......@@ -868,14 +804,6 @@ print(r)</expression-string>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/dashboard/views/index.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="102">
<caret line="27" column="30" lean-forward="false" selection-start-line="27" selection-start-column="30" selection-end-line="27" selection-end-column="30" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/vm/models/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="34">
......@@ -928,13 +856,6 @@ print(r)</expression-string>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/vm/operations.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="50">
<caret line="52" column="59" lean-forward="false" selection-start-line="52" selection-start-column="59" selection-end-line="52" selection-end-column="59" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/vm/admin.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="482">
......@@ -976,13 +897,6 @@ print(r)</expression-string>
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="306">
<caret line="886" column="8" lean-forward="false" selection-start-line="886" selection-start-column="8" selection-end-line="886" selection-end-column="8" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/openstack_api/base.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="156">
<caret line="156" column="0" lean-forward="false" selection-start-line="156" selection-start-column="0" selection-end-line="156" selection-end-column="0" />
<folding />
</state>
</provider>
......@@ -995,14 +909,6 @@ print(r)</expression-string>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/openstack_api/neutron.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="306">
<caret line="359" column="8" lean-forward="false" selection-start-line="359" selection-start-column="8" selection-end-line="359" selection-end-column="8" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/openstack_api/nova.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="156">
......@@ -1026,15 +932,15 @@ print(r)</expression-string>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/dashboard/forms.py">
<entry file="file://$USER_HOME$/.virtualenvs/cloud/local/lib/python2.7/site-packages/django/views/generic/detail.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="340">
<caret line="122" column="69" lean-forward="false" selection-start-line="122" selection-start-column="69" selection-end-line="122" selection-end-column="69" />
<state relative-caret-position="156">
<caret line="115" column="0" lean-forward="false" selection-start-line="115" selection-start-column="0" selection-end-line="115" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/dashboard/templates/dashboard/vm-detail/_network-port-add.html">
<entry file="file://$PROJECT_DIR$/circle/dashboard/templates/dashboard/vm-detail/console.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
......@@ -1042,29 +948,133 @@ print(r)</expression-string>
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/.virtualenvs/cloud/local/lib/python2.7/site-packages/django/views/generic/detail.py">
<entry file="file://$PROJECT_DIR$/circle/dashboard/urls.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="590">
<caret line="228" column="19" lean-forward="true" selection-start-line="228" selection-start-column="19" selection-end-line="228" selection-end-column="19" />
<folding>
<element signature="e#732#770#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/dashboard/templates/dashboard/vm-detail/_network-port-add.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="238">
<caret line="14" column="55" lean-forward="false" selection-start-line="14" selection-start-column="55" selection-end-line="14" selection-end-column="55" />
<folding>
<element signature="n#style#0;n#select#0;n#div#0;n#form#0;n#div#0;n#!!top" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/openstack_api/keystone.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="289">
<caret line="634" column="31" lean-forward="false" selection-start-line="634" selection-start-column="19" selection-end-line="634" selection-end-column="31" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/dashboard/templates/dashboard/vm-detail/_network-public-ip-add.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="34">
<caret line="2" column="65" lean-forward="true" selection-start-line="2" selection-start-column="46" selection-end-line="2" selection-end-column="65" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/dashboard/views/index.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-357">
<caret line="36" column="6" lean-forward="false" selection-start-line="36" selection-start-column="6" selection-end-line="36" selection-end-column="6" />
<folding>
<element signature="e#731#787#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/openstack_api/base.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="156">
<caret line="115" column="0" lean-forward="false" selection-start-line="115" selection-start-column="0" selection-end-line="115" selection-end-column="0" />
<caret line="156" column="0" lean-forward="false" selection-start-line="156" selection-start-column="0" selection-end-line="156" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/openstack_api/neutron.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="156">
<caret line="619" column="0" lean-forward="false" selection-start-line="619" selection-start-column="0" selection-end-line="619" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/openstack_api/utils/memoized.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="148">
<caret line="104" column="0" lean-forward="false" selection-start-line="104" selection-start-column="0" selection-end-line="104" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/common/operations.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="182">
<caret line="93" column="0" lean-forward="true" selection-start-line="93" selection-start-column="0" selection-end-line="93" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/.virtualenvs/cloud/local/lib/python2.7/site-packages/django/views/generic/base.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="156">
<caret line="87" column="0" lean-forward="false" selection-start-line="87" selection-start-column="0" selection-end-line="87" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/dashboard/views/util.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="530">
<caret line="306" column="39" lean-forward="false" selection-start-line="306" selection-start-column="24" selection-end-line="306" selection-end-column="39" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/dashboard/views/vm.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="284">
<caret line="167" column="51" lean-forward="false" selection-start-line="167" selection-start-column="47" selection-end-line="167" selection-end-column="51" />
<state relative-caret-position="293">
<caret line="182" column="81" lean-forward="false" selection-start-line="182" selection-start-column="81" selection-end-line="182" selection-end-column="81" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/dashboard/templates/dashboard/vm-detail/network.html">
<entry file="file://$PROJECT_DIR$/circle/dashboard/forms.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="187">
<caret line="39" column="0" lean-forward="false" selection-start-line="39" selection-start-column="2" selection-end-line="39" selection-end-column="75" />
<state relative-caret-position="304">
<caret line="1018" column="40" lean-forward="false" selection-start-line="1018" selection-start-column="40" selection-end-line="1018" selection-end-column="40" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/vm/operations.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="306">
<caret line="465" column="0" lean-forward="true" selection-start-line="465" selection-start-column="0" selection-end-line="465" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/circle/dashboard/templates/dashboard/vm-detail/network.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="323">
<caret line="64" column="20" lean-forward="true" selection-start-line="64" selection-start-column="20" selection-end-line="64" selection-end-column="20" />
<folding>
<marker date="1524051869354" expanded="false" signature="3016:3034" ph="..." />
</folding>
</state>
</provider>
</entry>
</component>
</project>
\ No newline at end of file
......@@ -1005,6 +1005,27 @@ class VmPortAddForm(OperationForm):
)
return helper
class VmPublicIpAddForm(OperationForm):
def __init__(self, *args, **kwargs):
pools = kwargs.pop('pools')
port_id = kwargs.pop('port_id')
poolsDict = (
(pool.id, pool.name,) for pool in pools
)
super(VmPublicIpAddForm, self).__init__(*args, **kwargs)
self.fields['pool'] = forms.ChoiceField(poolsDict, required=True, label=_('Pool'))
self.fields['port_id'] = forms.CharField(widget=forms.HiddenInput(), initial=port_id)
@property
def helper(self):
helper = super(VmPublicIpAddForm, self).helper
helper.layout = Layout(
Field("pool"),
Field("port_id"),
)
return helper
class CircleAuthenticationForm(AuthenticationForm):
# fields: username, password
......
......@@ -48,95 +48,116 @@
{# </dd>#}
</dl>
</div>
{% if i.host %}
<div class="col-md-7">
<ul class="nav nav-pills pull-right">
<li class="active"><a href="#ipv4_{{ i.host.vlan.pk }}" data-toggle="pill" class="text-center">{% trans "IPv4" %}</a></li>
<li><a href="#ipv6_{{ i.host.vlan.pk }}" data-toggle="pill" class="text-center">{% trans "IPv6" %}</a></li>
</ul>
<h4>{% trans "Port access" %}</h4>
<div class="tab-content" style="padding-top: 10px;">
<div class="tab-pane active" id="ipv4_{{ i.host.vlan.pk }}">
<table class="table table-striped rule-table">
<thead>
<tr><th>
<i class="fa fa-globe fa-2x"></i>
<i class="fa fa-long-arrow-right fa-2x"></i>
</th><th>
<i class="fa fa-shield fa-2x"></i>
</th><th colspan="2">
<i class="fa fa-long-arrow-right fa-2x"></i>
<i class="fa fa-desktop fa-2x"></i>
</th></tr>
</thead>
<tbody>
{% for l in i.host.list_ports %}
{% if l.ipv4 %}
<tr>
<td>
{% display_portforward4 l %}
</td>
<td><i class="fa fa-long-arrow-right"></i></td>
<td>
{{ l.private }}/{{ l.proto }}
</td>
<td>
<span class="operation-wrapper">
<a href="{{ op.remove_port.get_url }}?rule={{ l.ipv4.pk }}"
class="btn btn-link btn-xs operation"
title="{% trans "Remove" %}"
{% if not op.remove_port %}disabled{% endif %}>
<i class="fa fa-times"><span class="sr-only">{% trans "Remove" %}</span></i>
</a>
</span>
</td>
</tr>
{% endif %}
{% endfor %}
</tbody>
</table>
</div> <!-- /ipv4 -->
<div class="tab-pane" id="ipv6_{{ i.host.vlan.pk }}">
{% if i.host.ipv6 %}
<table class="table table-striped rule-table">
<thead>
<tr><th>
<i class="fa fa-globe fa-2x"></i>
</th><th>
<i class="fa fa-long-arrow-right fa-2x"></i>
</th><th colspan="2">
<i class="fa fa-desktop fa-2x"></i>
</th></tr>
</thead>
<tbody>
{% for l in i.host.list_ports %}
{% if l.ipv6 %}
<tr>
<td>
{% display_portforward6 l %}
</td>
<td><i class="fa fa-long-arrow-right"></i></td>
<td>
{{ l.private }}/{{ l.proto }}
</td>
<td>
<a href="{{ op.remove_port.get_url }}?rule={{ l.ipv4.pk }}" class="btn btn-link btn-xs vm-details-remove-port" data-rule="{{ l.ipv6.pk }}" title="{% trans "Remove" %}" {% if not op.remove_port %}disabled{% endif %}>
<i class="fa fa-times"><span class="sr-only">{% trans "Remove" %}</span></i>
</a>
</td>
</tr>
{% endif %}
{% endfor %}
</tbody>
</table>
{% if i.internet_access %}
<div class="col-md-7">
<span class="pull-right">
{% if i.public_ip %}
<dl>
<dt>{% trans "Public IP address" %}:</dt>
<dd>{{ i.public_ip }}</dd>
</dl>
{% else %}
<h4>{% trans "This VM doesn't have an IPv6 address!" %}</h4>
{% with op=op.add_public_ip %}{% if op %}
<span class="operation-wrapper">
<a href="{{op.get_url}}?port_id={{ i.port_id }}_{{ i.ipv4 }}"
class="btn btn-{{op.effect}} btn-xs operation"
{% if op.disabled %}disabled{% endif %}>{% trans "Associate public IP" %}
</a>
</span>
{% endif %}{% endwith %}
{% endif %}
</div><!-- /ipv6 -->
{% include "dashboard/vm-detail/_network-port-add.html" %}
</span>
</div>
</div>
{% endif %}
{# {% if i.host %}#}
{# <div class="col-md-7">#}
{# <ul class="nav nav-pills pull-right">#}
{# <li class="active"><a href="#ipv4_{{ i.host.vlan.pk }}" data-toggle="pill" class="text-center">{% trans "IPv4" %}</a></li>#}
{# <li><a href="#ipv6_{{ i.host.vlan.pk }}" data-toggle="pill" class="text-center">{% trans "IPv6" %}</a></li>#}
{# </ul>#}
{# <h4>{% trans "Port access" %}</h4>#}
{# <div class="tab-content" style="padding-top: 10px;">#}
{# <div class="tab-pane active" id="ipv4_{{ i.host.vlan.pk }}">#}
{# <table class="table table-striped rule-table">#}
{# <thead>#}
{# <tr><th>#}
{# <i class="fa fa-globe fa-2x"></i>#}
{# <i class="fa fa-long-arrow-right fa-2x"></i>#}
{# </th><th>#}
{# <i class="fa fa-shield fa-2x"></i>#}
{# </th><th colspan="2">#}
{# <i class="fa fa-long-arrow-right fa-2x"></i>#}
{# <i class="fa fa-desktop fa-2x"></i>#}
{# </th></tr>#}
{# </thead>#}
{# <tbody>#}
{# {% for l in i.host.list_ports %}#}
{# {% if l.ipv4 %}#}
{# <tr>#}
{# <td>#}
{# {% display_portforward4 l %}#}
{# </td>#}
{# <td><i class="fa fa-long-arrow-right"></i></td>#}
{# <td>#}
{# {{ l.private }}/{{ l.proto }}#}
{# </td>#}
{# <td>#}
{# <span class="operation-wrapper">#}
{# <a href="{{ op.remove_port.get_url }}?rule={{ l.ipv4.pk }}"#}
{# class="btn btn-link btn-xs operation"#}
{# title="{% trans "Remove" %}"#}
{# {% if not op.remove_port %}disabled{% endif %}>#}
{# <i class="fa fa-times"><span class="sr-only">{% trans "Remove" %}</span></i>#}
{# </a>#}
{# </span>#}
{# </td>#}
{# </tr>#}
{# {% endif %}#}
{# {% endfor %}#}
{# </tbody>#}
{# </table>#}
{# </div> <!-- /ipv4 -->#}
{# <div class="tab-pane" id="ipv6_{{ i.host.vlan.pk }}">#}
{# {% if i.host.ipv6 %}#}
{# <table class="table table-striped rule-table">#}
{# <thead>#}
{# <tr><th>#}
{# <i class="fa fa-globe fa-2x"></i>#}
{# </th><th>#}
{# <i class="fa fa-long-arrow-right fa-2x"></i>#}
{# </th><th colspan="2">#}
{# <i class="fa fa-desktop fa-2x"></i>#}
{# </th></tr>#}
{# </thead>#}
{# <tbody>#}
{# {% for l in i.host.list_ports %}#}
{# {% if l.ipv6 %}#}
{# <tr>#}
{# <td>#}
{# {% display_portforward6 l %}#}
{# </td>#}
{# <td><i class="fa fa-long-arrow-right"></i></td>#}
{# <td>#}
{# {{ l.private }}/{{ l.proto }}#}
{# </td>#}
{# <td>#}
{# <a href="{{ op.remove_port.get_url }}?rule={{ l.ipv4.pk }}" class="btn btn-link btn-xs vm-details-remove-port" data-rule="{{ l.ipv6.pk }}" title="{% trans "Remove" %}" {% if not op.remove_port %}disabled{% endif %}>#}
{# <i class="fa fa-times"><span class="sr-only">{% trans "Remove" %}</span></i>#}
{# </a>#}
{# </td>#}
{# </tr>#}
{# {% endif %}#}
{# {% endfor %}#}
{# </tbody>#}
{# </table>#}
{# {% else %}#}
{# <h4>{% trans "This VM doesn't have an IPv6 address!" %}</h4>#}
{# {% endif %}#}
{# </div><!-- /ipv6 -->#}
{# {% include "dashboard/vm-detail/_network-port-add.html" %}#}
{# </div>#}
{# </div>#}
{# {% endif %}#}
</div>
</div>
{% endfor %}
......@@ -63,7 +63,7 @@ from .util import (
)
from ..forms import (
AclUserOrGroupAddForm, VmResourcesForm, VmCustomizeForm, VmDeployForm, VmFromPlainImageForm, VmRemoveInterfaceForm,
VmAddInterfaceForm, VmSaveForm)
VmAddInterfaceForm, VmSaveForm, VmPortAddForm, VmPublicIpAddForm)
logger = logging.getLogger(__name__)
......@@ -122,7 +122,14 @@ class VmDetailView(LoginRequiredMixin, GraphMixin, DetailView):
try:
vnc_console = openstack_api.nova.server_vnc_console(self.request, instance.id)
except:
pass #TODO
pass
if vnc_console is None:
try:
vnc_console = openstack_api.nova.server_spice_console(self.request, instance.id)
except:
pass
context.update({
'graphite_enabled': settings.GRAPHITE_URL is not None,
'vnc_url': vnc_console.url if vnc_console else None,
......@@ -149,6 +156,7 @@ class VmDetailView(LoginRequiredMixin, GraphMixin, DetailView):
ports = openstack_api.neutron.port_list(self.request)
instance_ports = [p for p in ports if p.device_id == self.object.id]
instance_ports_by_id = {p.id: p for p in ports if p.device_id == self.object.id}
instance_net_ids = [p.network_id for p in instance_ports]
all_networks = openstack_api.neutron.network_list(self.request)
......@@ -166,11 +174,18 @@ class VmDetailView(LoginRequiredMixin, GraphMixin, DetailView):
for port in instance_ports:
instance_networks[port.network_id].ipv4 = port.fixed_ips[0]['ip_address']
instance_networks[port.network_id].port_id = port.id
# set default subnets for networks
for id in instance_networks:
instance_networks[id].subnet = instance_networks[id].subnets[0]
floating_ips = openstack_api.neutron.tenant_floating_ip_list(self.request)
for floating_ip in floating_ips:
if floating_ip.port_id in instance_ports_by_id.keys():
port = instance_ports_by_id[floating_ip.port_id]
instance_networks[port.network_id].public_ip = floating_ip.ip
context['networks'] = instance_networks.values()
# context['vlans'] = Vlan.get_objects_with_level(
......@@ -537,6 +552,25 @@ class VmAddInterfaceView(FormOperationMixin, VmOperationView):
# return val
#
#
class VmPublicIpAddView(FormOperationMixin, VmOperationView):
op = 'add_public_ip'
show_in_toolbar = False
icon = 'plus'
effect = "success"
form_class = VmPublicIpAddForm
def get_form_kwargs(self):
ip_pools = openstack_api.neutron.floating_ip_pools_list(self.request)
port_id = self.request.GET.get('port_id')
val = super(VmPublicIpAddView, self).get_form_kwargs()
val.update({'pools': ip_pools})
val.update({'port_id': port_id})
return val
class VmSaveView(FormOperationMixin, VmOperationView):
op = 'save_as_template'
......@@ -802,6 +836,7 @@ vm_ops = OrderedDict([
('remove_interface', VmRemoveInterfaceView),
# ('remove_port', VmPortRemoveView),
# ('add_port', VmPortAddView),
('add_public_ip', VmPublicIpAddView),
# ('renew', VmRenewView),
# ('resources_change', VmResourcesChangeView),
# ('password_reset', VmOperationView.factory(
......
......@@ -438,7 +438,6 @@ class RemovePortOperation(InstanceOperation):
proto=rule.proto, port=rule.dport, host=rule.host)
rule.delete()
@register_operation
class AddPortOperation(InstanceOperation):
id = 'add_port'
......@@ -456,6 +455,14 @@ class AddPortOperation(InstanceOperation):
ugettext_noop("open %(proto)s/%(port)d on %(host)s"),
proto=proto, port=port, host=host)
@register_operation
class AddPublicIPOperation(InstanceOperation):
id = 'add_public_ip'
name = _("add public ip")
def _operation(self, request, pool, port_id):
floating_ip = openstack_api.neutron.tenant_floating_ip_allocate(request, pool, request.user.project_id)
openstack_api.neutron.floating_ip_associate(request, floating_ip.id, port_id)
@register_operation
class RemoveDiskOperation(InstanceOperation):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment