diff --git a/.idea/workspace.xml b/.idea/workspace.xml index a008da6..1682526 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -3,9 +3,8 @@ <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/templates/dashboard/vm-detail/network.html" afterPath="$PROJECT_DIR$/circle/dashboard/templates/dashboard/vm-detail/network.html" /> - <change beforePath="$PROJECT_DIR$/circle/dashboard/views/util.py" afterPath="$PROJECT_DIR$/circle/dashboard/views/util.py" /> <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" /> @@ -31,23 +30,46 @@ </component> <component name="FileEditorManager"> <leaf SIDE_TABS_SIZE_LIMIT_KEY="300"> - <file leaf-file-name="network.html" pinned="false" current-in-tab="false"> - <entry file="file://$PROJECT_DIR$/circle/dashboard/templates/dashboard/vm-detail/network.html"> + <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="264"> + <caret line="537" column="31" lean-forward="true" selection-start-line="537" selection-start-column="31" selection-end-line="537" selection-end-column="31" /> + <folding> + <element signature="e#41548#42719#0" expanded="false" /> + </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="289"> - <caret line="17" column="32" lean-forward="false" selection-start-line="17" selection-start-column="28" selection-end-line="17" selection-end-column="32" /> + <state relative-caret-position="318"> + <caret line="501" column="49" lean-forward="true" selection-start-line="501" selection-start-column="49" selection-end-line="501" selection-end-column="49" /> <folding /> </state> </provider> </entry> </file> - <file leaf-file-name="vm.py" pinned="false" current-in-tab="true"> - <entry file="file://$PROJECT_DIR$/circle/dashboard/views/vm.py"> + <file leaf-file-name="urls.py" pinned="false" current-in-tab="false"> + <entry file="file://$PROJECT_DIR$/circle/dashboard/urls.py"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="423"> + <caret line="226" column="22" lean-forward="false" selection-start-line="226" selection-start-column="22" selection-end-line="226" selection-end-column="22" /> + <folding /> + </state> + </provider> + </entry> + </file> + <file leaf-file-name="template.py" pinned="false" current-in-tab="true"> + <entry file="file://$PROJECT_DIR$/circle/dashboard/views/template.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="416"> - <caret line="156" column="80" lean-forward="false" selection-start-line="156" selection-start-column="80" selection-end-line="156" selection-end-column="80" /> + <state relative-caret-position="369"> + <caret line="69" column="45" lean-forward="false" selection-start-line="69" selection-start-column="45" selection-end-line="69" selection-end-column="45" /> <folding> - <element signature="e#41570#42741#0" expanded="false" /> + <element signature="e#731#787#0" expanded="true" /> + <marker date="1520947233801" expanded="true" signature="9976:10189" ph="SELECT count... vm_instance" /> </folding> </state> </provider> @@ -65,14 +87,6 @@ </component> <component name="FindInProjectRecents"> <findStrings> - <find>polic</find> - <find>addinterfa</find> - <find>interface</find> - <find>os_</find> - <find>instanceoper</find> - <find>Vxlan.list</find> - <find>instanceoperat</find> - <find>operatedmixin</find> <find>dashboard.views.vm-activity-list</find> <find>op.get</find> <find>request.views.request-resource</find> @@ -86,7 +100,6 @@ <find>get_from_os</find> <find>OperationView(</find> <find>get_abl</find> - <find>shutoff</find> <find>vmaddinter</find> <find>addinterface</find> <find>shut</find> @@ -95,6 +108,15 @@ <find>get_object</find> <find>class server</find> <find>vmdetail</find> + <find>policy</find> + <find>vm_ops</find> + <find>VmSaveView</find> + <find>saveaste</find> + <find>shutoff</find> + <find>compute:</find> + <find>wtf</find> + <find>True</find> + <find>template</find> </findStrings> <replaceStrings> <replace>'ACTIVE'</replace> @@ -112,7 +134,6 @@ <component name="IdeDocumentHistory"> <option name="CHANGED_PATHS"> <list> - <option value="$PROJECT_DIR$/circle/dashboard/templates/dashboard/_vm-create-2.html" /> <option value="$PROJECT_DIR$/circle/dashboard/templates/dashboard/_vm-create-1.html" /> <option value="$PROJECT_DIR$/circle/openstack_api/__init__.py" /> <option value="$PROJECT_DIR$/circle/openstack_api/neutron.py" /> @@ -137,7 +158,6 @@ <option value="$PROJECT_DIR$/circle/network/static/js/horizon.flatnetworktopology.js" /> <option value="$PROJECT_DIR$/circle/network/urls.py" /> <option value="$PROJECT_DIR$/circle/network/templates/network/editor.html" /> - <option value="$PROJECT_DIR$/circle/dashboard/urls.py" /> <option value="$PROJECT_DIR$/circle/dashboard/views/user.py" /> <option value="$PROJECT_DIR$/circle/dashboard/templates/dashboard/base.html" /> <option value="$PROJECT_DIR$/circle/bower.json" /> @@ -158,11 +178,13 @@ <option value="$PROJECT_DIR$/circle/dashboard/templates/dashboard/vm-detail/console.html" /> <option value="$PROJECT_DIR$/circle/common/operations.py" /> <option value="$PROJECT_DIR$/circle/dashboard/forms.py" /> - <option value="$PROJECT_DIR$/circle/vm/operations.py" /> <option value="$PROJECT_DIR$/circle/dashboard/templates/dashboard/vm-detail/network.html" /> <option value="$PROJECT_DIR$/circle/dashboard/views/util.py" /> <option value="$PROJECT_DIR$/circle/openstack_api/nova.py" /> + <option value="$PROJECT_DIR$/circle/dashboard/views/template.py" /> <option value="$PROJECT_DIR$/circle/dashboard/views/vm.py" /> + <option value="$PROJECT_DIR$/circle/vm/operations.py" /> + <option value="$PROJECT_DIR$/circle/dashboard/urls.py" /> </list> </option> </component> @@ -235,14 +257,7 @@ <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="openstack_api" type="462c0819:PsiDirectoryNode" /> + <item name="requirements" type="462c0819:PsiDirectoryNode" /> </path> </expand> <select /> @@ -258,7 +273,7 @@ <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="base	FILE	file:///home/h3yduck/cloud/circle/circle/settings/base.py vmadd	null	null vmdetail	null	null addinterfa	null	null addin	null	null server	null	null Instance	null	null instance	FILE	file:///home/h3yduck/cloud/circle/vm/models/instance.py operat	null	null ins	FILE	file:///home/h3yduck/cloud/circle/vm/models/instance.py operations	FILE	file:///home/h3yduck/cloud/circle/common/operations.py vmdetai	null	null index	FILE	file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/index-vm.html operationvi	null	null ser	null	null server.	FILE	file:///home/h3yduck/.virtualenvs/cloud/local/lib/python2.7/site-packages/novaclient/v2/servers.py resources.	FILE	file:///home/h3yduck/cloud/circle/request/templates/request/initials/resources.html vm-de	FILE	file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/vm-detail.html vxla	null	null urls	FILE	file:///home/h3yduck/cloud/circle/dashboard/urls.py index-v	FILE	file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/index-vxlans.html index-vm	FILE	file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/index-vm.html opera	null	null vmdeta	null	null create	FILE	file:///home/h3yduck/cloud/circle/network/templates/network/vxlan-create.html vxl	null	null nov	FILE	file:///home/h3yduck/cloud/circle/openstack_api/nova.py nova.p	FILE	file:///home/h3yduck/cloud/circle/openstack_api/nova.py vmdetailv	null	null editor	null	null networktopo	FILE	file:///home/h3yduck/cloud/circle/network/static/js/horizon.networktopology.js bow	FILE	file:///home/h3yduck/cloud/circle/bower.json base.py	FILE	file:///home/h3yduck/cloud/circle/circle/settings/base.py local	null	null vnc	null	null plain	FILE	file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/vm-plain-image-create.html forms	null	null vxlanform	null	null instanc	FILE	file:///home/h3yduck/cloud/circle/vm/models/instance.py index-vxla	FILE	file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/index-vxlans.html _vm-c	FILE	file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/_vm-create-1.html vmcrea	null	null loginV	null	null index.html	FILE	file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/index.html sleep	null	null Deploy	null	null Vmdeta	null	null list_from	null	null aclupda	null	null base.htm	FILE	file:///home/h3yduck/cloud/circle/dashboard/templates/base.html" /> + <property name="SearchEverywhereHistoryKey" value="opera	FILE	file:///home/h3yduck/cloud/circle/vm/operations.py operations	FILE	file:///home/h3yduck/cloud/circle/common/operations.py templat	null	null base	FILE	file:///home/h3yduck/cloud/circle/circle/settings/base.py vmadd	null	null vmdetail	null	null addinterfa	null	null addin	null	null server	null	null Instance	null	null instance	FILE	file:///home/h3yduck/cloud/circle/vm/models/instance.py operat	null	null ins	FILE	file:///home/h3yduck/cloud/circle/vm/models/instance.py vmdetai	null	null index	FILE	file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/index-vm.html operationvi	null	null ser	null	null server.	FILE	file:///home/h3yduck/.virtualenvs/cloud/local/lib/python2.7/site-packages/novaclient/v2/servers.py resources.	FILE	file:///home/h3yduck/cloud/circle/request/templates/request/initials/resources.html vm-de	FILE	file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/vm-detail.html vxla	null	null urls	FILE	file:///home/h3yduck/cloud/circle/dashboard/urls.py index-v	FILE	file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/index-vxlans.html index-vm	FILE	file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/index-vm.html vmdeta	null	null create	FILE	file:///home/h3yduck/cloud/circle/network/templates/network/vxlan-create.html vxl	null	null nov	FILE	file:///home/h3yduck/cloud/circle/openstack_api/nova.py nova.p	FILE	file:///home/h3yduck/cloud/circle/openstack_api/nova.py vmdetailv	null	null editor	null	null networktopo	FILE	file:///home/h3yduck/cloud/circle/network/static/js/horizon.networktopology.js bow	FILE	file:///home/h3yduck/cloud/circle/bower.json base.py	FILE	file:///home/h3yduck/cloud/circle/circle/settings/base.py local	null	null vnc	null	null plain	FILE	file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/vm-plain-image-create.html forms	null	null vxlanform	null	null instanc	FILE	file:///home/h3yduck/cloud/circle/vm/models/instance.py index-vxla	FILE	file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/index-vxlans.html _vm-c	FILE	file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/_vm-create-1.html vmcrea	null	null loginV	null	null index.html	FILE	file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/index.html sleep	null	null Deploy	null	null Vmdeta	null	null list_from	null	null" /> </component> <component name="RecentsManager"> <key name="MoveFile.RECENT_KEYS"> @@ -378,14 +393,14 @@ </component> <component name="ToolWindowManager"> <frame x="-2" y="-1" width="1924" height="1063" extended-state="0" /> - <editor active="true" /> <layout> <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32980973" sideWeight="0.4978701" order="6" 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="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.327818" sideWeight="0.5021299" order="7" side_tool="true" content_ui="tabs" /> - <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.3280757" sideWeight="0.5234139" order="7" side_tool="false" content_ui="tabs" /> + <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.32769555" sideWeight="0.5234139" 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.3911205" sideWeight="0.48988286" order="7" side_tool="true" 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.7114165" sideWeight="0.48988286" 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.18051118" 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" /> @@ -393,9 +408,8 @@ <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="false" show_stripe_button="true" weight="0.7114165" sideWeight="0.5101172" order="3" side_tool="false" content_ui="tabs" /> + <window_info id="Debug" active="true" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.7114165" sideWeight="0.5101172" 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" /> <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" /> <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" /> @@ -557,39 +571,6 @@ </expressions> </component> <component name="editorHistoryManager"> - <entry file="file://$PROJECT_DIR$/circle/dashboard/templates/dashboard/base.html"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="0"> - <caret line="0" column="18" lean-forward="false" selection-start-line="0" selection-start-column="18" selection-end-line="0" selection-end-column="18" /> - <folding /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/circle/dashboard/static/vue.css"> - <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" /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/circle/dashboard/templates/base.html"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="272"> - <caret line="16" column="20" lean-forward="false" selection-start-line="16" selection-start-column="20" selection-end-line="16" selection-end-column="20" /> - <folding /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/circle/network/templates/network/vxlan-edit.html"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="204"> - <caret line="12" column="0" lean-forward="false" selection-start-line="12" selection-start-column="0" selection-end-line="12" selection-end-column="0" /> - <folding> - <element signature="e#422#429#1#HTML" expanded="true" /> - </folding> - </state> - </provider> - </entry> <entry file="file://$PROJECT_DIR$/circle/network/forms.py"> <provider selected="true" editor-type-id="text-editor"> <state relative-caret-position="6273"> @@ -850,14 +831,6 @@ </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/circle/dashboard/urls.py"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="-2636"> - <caret line="58" column="36" lean-forward="false" selection-start-line="58" selection-start-column="14" selection-end-line="58" selection-end-column="36" /> - <folding /> - </state> - </provider> - </entry> <entry file="file://$USER_HOME$/.virtualenvs/cloud/local/lib/python2.7/site-packages/django/forms/models.py"> <provider selected="true" editor-type-id="text-editor"> <state relative-caret-position="306"> @@ -898,16 +871,6 @@ </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/circle/vm/operations.py"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="301"> - <caret line="189" column="0" lean-forward="false" selection-start-line="189" selection-start-column="0" selection-end-line="189" selection-end-column="0" /> - <folding> - <element signature="e#732#788#0" expanded="true" /> - </folding> - </state> - </provider> - </entry> <entry file="file://$USER_HOME$/.virtualenvs/cloud/local/lib/python2.7/site-packages/neutronclient/v2_0/client.py"> <provider selected="true" editor-type-id="text-editor"> <state relative-caret-position="256"> @@ -932,14 +895,6 @@ </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/circle/common/operations.py"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="454"> - <caret line="232" column="0" lean-forward="true" selection-start-line="232" selection-start-column="0" selection-end-line="232" selection-end-column="0" /> - <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="233"> @@ -956,6 +911,14 @@ </state> </provider> </entry> + <entry file="file://$PROJECT_DIR$/requirements/circlestack.txt"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="173"> + <caret line="80" column="11" lean-forward="false" selection-start-line="80" selection-start-column="5" selection-end-line="80" selection-end-column="11" /> + <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="289"> @@ -964,12 +927,63 @@ </state> </provider> </entry> + <entry file="file://$PROJECT_DIR$/circle/common/operations.py"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="478"> + <caret line="232" column="0" lean-forward="true" selection-start-line="232" selection-start-column="0" selection-end-line="232" selection-end-column="0" /> + <folding /> + </state> + </provider> + </entry> + <entry file="file://$USER_HOME$/.virtualenvs/cloud/local/lib/python2.7/site-packages/django/core/checks/urls.py"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="289"> + <caret line="55" column="2" lean-forward="false" selection-start-line="55" selection-start-column="2" selection-end-line="55" selection-end-column="2" /> + <folding /> + </state> + </provider> + </entry> + <entry file="file:///usr/lib/python2.7/re.py"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="306"> + <caret line="142" column="4" lean-forward="false" selection-start-line="142" selection-start-column="4" selection-end-line="142" selection-end-column="4" /> + <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="318"> + <caret line="501" column="49" lean-forward="true" selection-start-line="501" selection-start-column="49" selection-end-line="501" selection-end-column="49" /> + <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="416"> - <caret line="156" column="80" lean-forward="false" selection-start-line="156" selection-start-column="80" selection-end-line="156" selection-end-column="80" /> + <state relative-caret-position="264"> + <caret line="537" column="31" lean-forward="true" selection-start-line="537" selection-start-column="31" selection-end-line="537" selection-end-column="31" /> + <folding> + <element signature="e#41548#42719#0" expanded="false" /> + </folding> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/circle/dashboard/urls.py"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="423"> + <caret line="226" column="22" lean-forward="false" selection-start-line="226" selection-start-column="22" selection-end-line="226" selection-end-column="22" /> + <folding /> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/circle/dashboard/views/template.py"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="369"> + <caret line="69" column="45" lean-forward="false" selection-start-line="69" selection-start-column="45" selection-end-line="69" selection-end-column="45" /> <folding> - <element signature="e#41570#42741#0" expanded="false" /> + <element signature="e#731#787#0" expanded="true" /> + <marker date="1520947233801" expanded="true" signature="9976:10189" ph="SELECT count... vm_instance" /> </folding> </state> </provider> diff --git a/circle/dashboard/views/vm.py b/circle/dashboard/views/vm.py index 72e4e8f..72e1815 100644 --- a/circle/dashboard/views/vm.py +++ b/circle/dashboard/views/vm.py @@ -62,7 +62,7 @@ from .util import ( ) from ..forms import ( AclUserOrGroupAddForm, VmResourcesForm, VmCustomizeForm, VmDeployForm, VmFromPlainImageForm, VmRemoveInterfaceForm, - VmAddInterfaceForm) + VmAddInterfaceForm, VmSaveForm) logger = logging.getLogger(__name__) @@ -523,24 +523,24 @@ class VmAddInterfaceView(FormOperationMixin, VmOperationView): # return val # # -# class VmSaveView(FormOperationMixin, VmOperationView): -# -# op = 'save_as_template' -# icon = 'save' -# effect = 'info' -# form_class = VmSaveForm -# -# def get_form_kwargs(self): -# op = self.get_op() -# val = super(VmSaveView, self).get_form_kwargs() -# val['default'] = op._rename(op.instance.name) -# obj = self.get_object() -# if obj.template and obj.template.has_level( -# self.request.user, "owner"): -# val['clone'] = True -# return val -# -# +class VmSaveView(FormOperationMixin, VmOperationView): + + op = 'save_as_template' + icon = 'save' + effect = 'info' + form_class = VmSaveForm + + def get_form_kwargs(self): + context = super(VmSaveView, self).get_form_kwargs() + op = self.get_op() + + context['default'] = op._rename(op.instance.name) + obj = self.get_object() + + #context['clone'] = True #TODO: if instance has a template already this option allows clone of permissions + return context + + # class VmResourcesChangeView(VmOperationView): # op = 'resources_change' # icon = "save" @@ -761,7 +761,7 @@ vm_ops = OrderedDict([ ('sleep', VmOperationView.factory( op='sleep', icon='moon-o', effect='info')), # ('migrate', VmMigrateView), - # ('save_as_template', VmSaveView), + ('save_as_template', VmSaveView), ('reboot', VmOperationView.factory( op='reboot', icon='refresh', effect='warning')), # ('reset', VmOperationView.factory( diff --git a/circle/vm/operations.py b/circle/vm/operations.py index 165c419..fddb82f 100644 --- a/circle/vm/operations.py +++ b/circle/vm/operations.py @@ -124,16 +124,17 @@ class InstanceOperation(Operation): raise self.instance.WrongStateError(self.instance) def check_auth(self, user, request): - from django.utils.module_loading import import_string - check = import_string("openstack_auth.policy.check") + if self.os_policy_actions: + from django.utils.module_loading import import_string + check = import_string("openstack_auth.policy.check") - has_rights = check(self.os_policy_actions, request, - {'project_id': self.instance.tenant_id}) + has_rights = check(self.os_policy_actions, request, + {'project_id': self.instance.tenant_id}) - if not has_rights: - raise humanize_exception(ugettext_noop( - "operation not permitted"), - PermissionDenied()) + if not has_rights: + raise humanize_exception(ugettext_noop( + "operation not permitted"), + PermissionDenied()) super(InstanceOperation, self).check_auth(user=user) @@ -505,15 +506,8 @@ class SaveAsTemplateOperation(InstanceOperation): "with users and groups. Anyone who has access to a " "template (and to the networks it uses) will be able to " "start an instance of it.") - has_percentage = True - abortable = True - required_perms = ('vm.create_template',) - accept_states = ('ACTIVE', 'STOPPED') - async_queue = "localhost.man.slow" - - def is_preferred(self): - return (self.instance.is_base and - self.instance.status == self.instance.STATUS.RUNNING) + accept_states = ('SHUTOFF', 'ACTIVE') # TODO: try other states + # os_policy_actions = (("compute", "compute:stop"),) @staticmethod def _rename(name): @@ -525,87 +519,13 @@ class SaveAsTemplateOperation(InstanceOperation): v = 1 return "%s v%d" % (name, v) - def on_abort(self, activity, error): - if hasattr(self, 'disks'): - for disk in self.disks: - disk.destroy() - - def _operation(self, activity, user, system, name=None, + def _operation(self, request, user, system, name=None, with_shutdown=True, clone=False, task=None, **kwargs): - try: - self.instance._cleanup(parent_activity=activity, user=user) - except: - pass - - if with_shutdown: - try: - self.instance.shutdown(parent_activity=activity, - user=user, task=task) - except Instance.WrongStateError: - pass - - # prepare parameters - params = { - 'access_method': self.instance.access_method, - 'arch': self.instance.arch, - 'boot_menu': self.instance.boot_menu, - 'description': self.instance.description, - 'lease': self.instance.lease, # Can be problem in new VM - 'max_ram_size': self.instance.max_ram_size, - 'name': name or self._rename(self.instance.name), - 'num_cores': self.instance.num_cores, - 'owner': user, - 'parent': self.instance.template or None, # Can be problem - 'priority': self.instance.priority, - 'ram_size': self.instance.ram_size, - 'raw_data': self.instance.raw_data, - 'system': self.instance.system, - } - params.update(kwargs) - params.pop("parent_activity", None) - - from storage.models import Disk - - def __try_save_disk(disk): - try: - return disk.save_as(task) - except Disk.WrongDiskTypeError: - return disk - - self.disks = [] - for disk in self.instance.disks.all(): - with activity.sub_activity( - 'saving_disk', - readable_name=create_readable( - ugettext_noop("saving disk %(name)s"), - name=disk.name) - ): - self.disks.append(__try_save_disk(disk)) - - # create template and do additional setup - tmpl = InstanceTemplate(**params) - tmpl.full_clean() # Avoiding database errors. - tmpl.save() - # Copy traits from the VM instance - tmpl.req_traits.add(*self.instance.req_traits.all()) - if clone: - tmpl.clone_acl(self.instance.template) - # Add permission for the original owner of the template - tmpl.set_level(self.instance.template.owner, 'owner') - tmpl.set_level(user, 'owner') - try: - tmpl.disks.add(*self.disks) - # create interface templates - for i in self.instance.interface_set.all(): - i.save_as_template(tmpl) - except: - tmpl.delete() - raise - else: - return create_readable( - ugettext_noop("New template: %(template)s"), - template=reverse('dashboard.views.template-detail', - kwargs={'pk': tmpl.pk})) + print "TODO: create template" + # return create_readable( + # ugettext_noop("New template: %(template)s"), + # template=reverse('dashboard.views.template-detail', + # kwargs={'pk': 0})) @register_operation