Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
Gelencsér Szabolcs
/
circlestack
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
327e7892
authored
Mar 02, 2018
by
Szabolcs Gelencser
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Implement start vm
parent
55430047
Show whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
550 additions
and
482 deletions
+550
-482
.idea/codeStyles/codeStyleConfig.xml
+6
-0
.idea/workspace.xml
+259
-289
circle/circle/db.sqlite3
+0
-0
circle/dashboard/forms.py
+42
-0
circle/dashboard/templates/dashboard/_vm-create-1.html
+14
-2
circle/dashboard/templates/dashboard/vm-plain-image-create.html
+19
-0
circle/dashboard/urls.py
+6
-6
circle/dashboard/views/index.py
+3
-0
circle/dashboard/views/util.py
+4
-0
circle/dashboard/views/vm.py
+42
-40
circle/network/forms.py
+1
-9
circle/network/models.py
+2
-42
circle/openstack_api/__init__.py
+2
-2
circle/openstack_api/neutron.py
+81
-83
circle/openstack_api/nova.py
+4
-4
circle/openstack_api/policy.py
+56
-0
circle/request/urls.py
+4
-4
circle/vm/models/instance.py
+5
-1
No files found.
.idea/codeStyles/codeStyleConfig.xml
0 → 100644
View file @
327e7892
<component
name=
"ProjectCodeStyleConfiguration"
>
<state>
<option
name=
"PREFERRED_PROJECT_CODE_STYLE"
value=
"Default"
/>
</state>
</component>
\ No newline at end of file
.idea/workspace.xml
View file @
327e7892
...
@@ -2,13 +2,23 @@
...
@@ -2,13 +2,23 @@
<project
version=
"4"
>
<project
version=
"4"
>
<component
name=
"ChangeListManager"
>
<component
name=
"ChangeListManager"
>
<list
default=
"true"
id=
"1fbec8af-5a7c-40f9-b994-83ac07d1ae1d"
name=
"Default"
comment=
""
>
<list
default=
"true"
id=
"1fbec8af-5a7c-40f9-b994-83ac07d1ae1d"
name=
"Default"
comment=
""
>
<change
beforePath=
""
afterPath=
"$PROJECT_DIR$/circle/dashboard/templates/dashboard/vm-plain-image-create.html"
/>
<change
beforePath=
""
afterPath=
"$PROJECT_DIR$/circle/openstack_api/policy.py"
/>
<change
beforePath=
"$PROJECT_DIR$/.idea/workspace.xml"
afterPath=
"$PROJECT_DIR$/.idea/workspace.xml"
/>
<change
beforePath=
"$PROJECT_DIR$/circle/circle/db.sqlite3"
afterPath=
"$PROJECT_DIR$/circle/circle/db.sqlite3"
/>
<change
beforePath=
"$PROJECT_DIR$/circle/circle/db.sqlite3"
afterPath=
"$PROJECT_DIR$/circle/circle/db.sqlite3"
/>
<change
beforePath=
"$PROJECT_DIR$/circle/common/views.py"
afterPath=
"$PROJECT_DIR$/circle/common/views.py"
/>
<change
beforePath=
"$PROJECT_DIR$/circle/dashboard/forms.py"
afterPath=
"$PROJECT_DIR$/circle/dashboard/forms.py"
/>
<change
beforePath=
"$PROJECT_DIR$/circle/dashboard/templates/auth/login.html"
afterPath=
"$PROJECT_DIR$/circle/dashboard/templates/auth/login.html"
/>
<change
beforePath=
"$PROJECT_DIR$/circle/dashboard/templates/dashboard/_vm-create-1.html"
afterPath=
"$PROJECT_DIR$/circle/dashboard/templates/dashboard/_vm-create-1.html"
/>
<change
beforePath=
"$PROJECT_DIR$/circle/dashboard/urls.py"
afterPath=
"$PROJECT_DIR$/circle/dashboard/urls.py"
/>
<change
beforePath=
"$PROJECT_DIR$/circle/dashboard/views/index.py"
afterPath=
"$PROJECT_DIR$/circle/dashboard/views/index.py"
/>
<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/network/forms.py"
afterPath=
"$PROJECT_DIR$/circle/network/forms.py"
/>
<change
beforePath=
"$PROJECT_DIR$/circle/network/forms.py"
afterPath=
"$PROJECT_DIR$/circle/network/forms.py"
/>
<change
beforePath=
"$PROJECT_DIR$/circle/network/models.py"
afterPath=
"$PROJECT_DIR$/circle/network/models.py"
/>
<change
beforePath=
"$PROJECT_DIR$/circle/network/models.py"
afterPath=
"$PROJECT_DIR$/circle/network/models.py"
/>
<change
beforePath=
"$PROJECT_DIR$/circle/network/templates/network/editor.html"
afterPath=
"$PROJECT_DIR$/circle/network/templates/network/editor.html"
/>
<change
beforePath=
"$PROJECT_DIR$/circle/openstack_api/__init__.py"
afterPath=
"$PROJECT_DIR$/circle/openstack_api/__init__.py"
/>
<change
beforePath=
"$PROJECT_DIR$/circle/network/views.py"
afterPath=
"$PROJECT_DIR$/circle/network/views.py"
/>
<change
beforePath=
"$PROJECT_DIR$/circle/openstack_api/neutron.py"
afterPath=
"$PROJECT_DIR$/circle/openstack_api/neutron.py"
/>
<change
beforePath=
"$PROJECT_DIR$/circle/openstack_api/nova.py"
afterPath=
"$PROJECT_DIR$/circle/openstack_api/nova.py"
/>
<change
beforePath=
"$PROJECT_DIR$/circle/request/urls.py"
afterPath=
"$PROJECT_DIR$/circle/request/urls.py"
/>
<change
beforePath=
"$PROJECT_DIR$/circle/vm/models/instance.py"
afterPath=
"$PROJECT_DIR$/circle/vm/models/instance.py"
/>
</list>
</list>
<option
name=
"EXCLUDED_CONVERTED_TO_IGNORED"
value=
"true"
/>
<option
name=
"EXCLUDED_CONVERTED_TO_IGNORED"
value=
"true"
/>
<option
name=
"TRACKING_ENABLED"
value=
"true"
/>
<option
name=
"TRACKING_ENABLED"
value=
"true"
/>
...
@@ -34,50 +44,16 @@
...
@@ -34,50 +44,16 @@
</component>
</component>
<component
name=
"FileEditorManager"
>
<component
name=
"FileEditorManager"
>
<leaf
SIDE_TABS_SIZE_LIMIT_KEY=
"300"
>
<leaf
SIDE_TABS_SIZE_LIMIT_KEY=
"300"
>
<file
leaf-file-name=
"user.py"
pinned=
"false"
current-in-tab=
"false"
>
<file
leaf-file-name=
"__init__.py"
pinned=
"false"
current-in-tab=
"true"
>
<entry
file=
"file://$PROJECT_DIR$/circle/dashboard/views/user.py"
>
<entry
file=
"file://$PROJECT_DIR$/circle/openstack_api/__init__.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"306"
>
<caret
line=
"107"
column=
"29"
lean-forward=
"false"
selection-start-line=
"107"
selection-start-column=
"29"
selection-end-line=
"107"
selection-end-column=
"29"
/>
<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=
"323"
>
<caret
line=
"1076"
column=
"28"
lean-forward=
"true"
selection-start-line=
"1076"
selection-start-column=
"28"
selection-end-line=
"1076"
selection-end-column=
"28"
/>
<folding>
<element
signature=
"e#732#770#0"
expanded=
"true"
/>
</folding>
</state>
</provider>
</entry>
</file>
<file
leaf-file-name=
"login.html"
pinned=
"false"
current-in-tab=
"false"
>
<entry
file=
"file://$PROJECT_DIR$/circle/templates/registration/login.html"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"
0
"
>
<state
relative-caret-position=
"
284
"
>
<caret
line=
"
0"
column=
"28"
lean-forward=
"true"
selection-start-line=
"0"
selection-start-column=
"28"
selection-end-line=
"0"
selection-end-column=
"28
"
/>
<caret
line=
"
38"
column=
"0"
lean-forward=
"false"
selection-start-line=
"38"
selection-start-column=
"0"
selection-end-line=
"38"
selection-end-column=
"0
"
/>
<folding
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
</file>
</file>
<file
leaf-file-name=
"login.html"
pinned=
"false"
current-in-tab=
"true"
>
<entry
file=
"file://$PROJECT_DIR$/circle/dashboard/templates/auth/login.html"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"714"
>
<caret
line=
"42"
column=
"0"
lean-forward=
"false"
selection-start-line=
"42"
selection-start-column=
"0"
selection-end-line=
"42"
selection-end-column=
"0"
/>
<folding>
<element
signature=
"n#style#0;n#h4#0;n#div#2;n#div#0;n#!!top"
expanded=
"true"
/>
</folding>
</state>
</provider>
</entry>
</file>
</leaf>
</leaf>
</component>
</component>
<component
name=
"FileTemplateManagerImpl"
>
<component
name=
"FileTemplateManagerImpl"
>
...
@@ -90,39 +66,40 @@
...
@@ -90,39 +66,40 @@
</component>
</component>
<component
name=
"FindInProjectRecents"
>
<component
name=
"FindInProjectRecents"
>
<findStrings>
<findStrings>
<find>
InstanceOperation(
</find>
<find>
openstack_aut
</find>
<find>
policy
</find>
<find>
get_operat
</find>
<find>
get_operations
</find>
<find>
vm_ops =
</find>
<find>
wakeupOper
</find>
<find>
Deployopera
</find>
<find>
((
"
compute
"
,
"
compute:start
"
),)wa
</find>
<find>
wakeup
</find>
<find>
sleepoper
</find>
<find>
rebootoper
</find>
<find>
"
compute:resume
"
</find>
<find>
reboot
</find>
<find>
shutoff
</find>
<find>
destroyope
</find>
<find>
ACL_LEVELS
</find>
<find>
a
</find>
<find>
get_env_variable
</find>
<find>
editor
</find>
<find>
network
</find>
<find>
acl
</find>
<find>
check
</find>
<find>
checked
</find>
<find>
admin_and_matching_domain_id
</find>
<find>
admin_and_matching_domain_id
</find>
<find>
network-editor
</find>
<find>
network-editor
</find>
<find>
editor.es
</find>
<find>
editor.es
</find>
<find>
editor.es6
</find>
<find>
editor.es6
</find>
<find>
{% cris
</find>
<find>
{% cris
</find>
<find>
FormHelper
</find>
<find>
FormHelper
</find>
<find>
vxlan
</find>
<find>
disk
</find>
<find>
disk(
</find>
<find>
instance(
</find>
<find>
template
</find>
<find>
class
</find>
<find>
vmcreate
</find>
<find>
priority_choices
</find>
<find>
plain
</find>
<find>
asd
</find>
<find>
vmcreat
</find>
<find>
customize
</find>
<find>
custom
</find>
<find>
customized
</find>
<find>
policy
</find>
<find>
profile
</find>
<find>
@profiler.trace
</find>
<find>
vmdetail
</find>
<find>
create(
</find>
<find>
pk
</find>
<find>
get_ab
</find>
<find>
vmdeta
</find>
<find>
instanc
</find>
<find>
[a-z0-9-]+
</find>
</findStrings>
</findStrings>
<replaceStrings>
<replaceStrings>
<replace>
'ACTIVE'
</replace>
<replace>
'ACTIVE'
</replace>
<replace>
[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
</replace>
</replaceStrings>
</replaceStrings>
</component>
</component>
<component
name=
"Git.Settings"
>
<component
name=
"Git.Settings"
>
...
@@ -131,57 +108,57 @@
...
@@ -131,57 +108,57 @@
<component
name=
"IdeDocumentHistory"
>
<component
name=
"IdeDocumentHistory"
>
<option
name=
"CHANGED_PATHS"
>
<option
name=
"CHANGED_PATHS"
>
<list>
<list>
<option
value=
"$PROJECT_DIR$/circle/openstack_auth/user_key.py"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/tables.py"
/>
<option
value=
"$PROJECT_DIR$/circle/circle/settings/local.py"
/>
<option
value=
"$PROJECT_DIR$/circle/openstack_auth/plugin/password.py"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/views/user.py"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/templates/login.html"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/context_processors.py"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/context_processors.py"
/>
<option
value=
"$PROJECT_DIR$/circle/openstack_auth/user.py"
/>
<option
value=
"$PROJECT_DIR$/circle/openstack_auth/user.py"
/>
<option
value=
"$PROJECT_DIR$/circle/openstack_api/base.py"
/>
<option
value=
"$PROJECT_DIR$/circle/openstack_api/base.py"
/>
<option
value=
"$PROJECT_DIR$/circle/openstack_api/exceptions.py"
/>
<option
value=
"$PROJECT_DIR$/circle/openstack_api/exceptions.py"
/>
<option
value=
"$PROJECT_DIR$/circle/openstack_api/__init__.py"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/templatetags/instance_tags.py"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/templatetags/instance_tags.py"
/>
<option
value=
"$PROJECT_DIR$/circle/storage/models.py"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/templates/dashboard/index-vm.html"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/templates/dashboard/index-vm.html"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/templates/base.html"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/templates/base.html"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/templates/dashboard/base.html"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/templates/dashboard/base.html"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/forms.py"
/>
<option
value=
"$PROJECT_DIR$/circle/vm/managers/os_instance_manager.py"
/>
<option
value=
"$PROJECT_DIR$/circle/vm/managers/os_instance_manager.py"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/templates/dashboard/vm-detail/home.html"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/templates/dashboard/vm-detail/home.html"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/templates/dashboard/vm-detail/access.html"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/templates/dashboard/vm-detail/access.html"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/views/__init__.py"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/views/__init__.py"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/views/index.py"
/>
<option
value=
"$PROJECT_DIR$/circle/openstack_api/nova.py"
/>
<option
value=
"$PROJECT_DIR$/circle/openstack_api/glance.py"
/>
<option
value=
"$PROJECT_DIR$/circle/openstack_api/glance.py"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/templates/dashboard/vm-detail.html"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/templates/dashboard/vm-detail.html"
/>
<option
value=
"$PROJECT_DIR$/circle/acl/models.py"
/>
<option
value=
"$PROJECT_DIR$/circle/acl/models.py"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/urls.py"
/>
<option
value=
"$PROJECT_DIR$/circle/circle/os_policies/neutron_policy.json"
/>
<option
value=
"$PROJECT_DIR$/circle/circle/os_policies/neutron_policy.json"
/>
<option
value=
"$PROJECT_DIR$/circle/circle/os_policies/cinder_policy.json"
/>
<option
value=
"$PROJECT_DIR$/circle/circle/os_policies/cinder_policy.json"
/>
<option
value=
"$PROJECT_DIR$/circle/circle/os_policies/glance_policy.json"
/>
<option
value=
"$PROJECT_DIR$/circle/circle/os_policies/glance_policy.json"
/>
<option
value=
"$PROJECT_DIR$/circle/circle/os_policies/keystone_policy.json"
/>
<option
value=
"$PROJECT_DIR$/circle/circle/os_policies/keystone_policy.json"
/>
<option
value=
"$PROJECT_DIR$/circle/openstack_auth/__init__.py"
/>
<option
value=
"$PROJECT_DIR$/circle/openstack_auth/__init__.py"
/>
<option
value=
"$PROJECT_DIR$/circle/circle/os_policies/nova_policy.json"
/>
<option
value=
"$PROJECT_DIR$/circle/circle/os_policies/nova_policy.json"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/views/util.py"
/>
<option
value=
"$PROJECT_DIR$/circle/common/operations.py"
/>
<option
value=
"$PROJECT_DIR$/circle/common/operations.py"
/>
<option
value=
"$PROJECT_DIR$/circle/vm/models/common.py"
/>
<option
value=
"$PROJECT_DIR$/circle/vm/models/common.py"
/>
<option
value=
"$PROJECT_DIR$/circle/vm/models/instance.py"
/>
<option
value=
"$PROJECT_DIR$/circle/firewall/models.py"
/>
<option
value=
"$PROJECT_DIR$/circle/firewall/models.py"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/models.py"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/models.py"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/views/vm.py"
/>
<option
value=
"$PROJECT_DIR$/circle/circle/settings/base.py"
/>
<option
value=
"$PROJECT_DIR$/circle/circle/settings/base.py"
/>
<option
value=
"$PROJECT_DIR$/circle/vm/operations.py"
/>
<option
value=
"$PROJECT_DIR$/circle/vm/operations.py"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/templates/dashboard/index.html"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/templates/dashboard/index.html"
/>
<option
value=
"$PROJECT_DIR$/circle/circle/urls.py"
/>
<option
value=
"$PROJECT_DIR$/circle/circle/urls.py"
/>
<option
value=
"$PROJECT_DIR$/circle/network/forms.py"
/>
<option
value=
"$PROJECT_DIR$/circle/common/views.py"
/>
<option
value=
"$PROJECT_DIR$/circle/common/views.py"
/>
<option
value=
"$PROJECT_DIR$/circle/network/views.py"
/>
<option
value=
"$PROJECT_DIR$/circle/network/views.py"
/>
<option
value=
"$PROJECT_DIR$/circle/network/models.py"
/>
<option
value=
"$PROJECT_DIR$/circle/network/templates/network/editor.html"
/>
<option
value=
"$PROJECT_DIR$/circle/network/templates/network/editor.html"
/>
<option
value=
"$PROJECT_DIR$/circle/circle/settings/static_and_pipeline.py"
/>
<option
value=
"$PROJECT_DIR$/circle/circle/settings/static_and_pipeline.py"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/templates/auth/login.html"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/templates/auth/login.html"
/>
<option
value=
"$PROJECT_DIR$/circle/network/models.py"
/>
<option
value=
"$PROJECT_DIR$/circle/network/forms.py"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/views/index.py"
/>
<option
value=
"$PROJECT_DIR$/circle/storage/models.py"
/>
<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"
/>
<option
value=
"$PROJECT_DIR$/circle/openstack_api/policy.py"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/forms.py"
/>
<option
value=
"$PROJECT_DIR$/circle/openstack_api/nova.py"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/templates/dashboard/vm-plain-image-create.html"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/views/vm.py"
/>
<option
value=
"$PROJECT_DIR$/circle/vm/models/instance.py"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/views/util.py"
/>
<option
value=
"$PROJECT_DIR$/circle/dashboard/urls.py"
/>
<option
value=
"$PROJECT_DIR$/circle/request/urls.py"
/>
</list>
</list>
</option>
</option>
</component>
</component>
...
@@ -194,8 +171,8 @@
...
@@ -194,8 +171,8 @@
<component
name=
"ProjectFrameBounds"
>
<component
name=
"ProjectFrameBounds"
>
<option
name=
"x"
value=
"-2"
/>
<option
name=
"x"
value=
"-2"
/>
<option
name=
"y"
value=
"-1"
/>
<option
name=
"y"
value=
"-1"
/>
<option
name=
"width"
value=
"1
924
"
/>
<option
name=
"width"
value=
"1
370
"
/>
<option
name=
"height"
value=
"
1063
"
/>
<option
name=
"height"
value=
"
751
"
/>
</component>
</component>
<component
name=
"ProjectInspectionProfilesVisibleTreeState"
>
<component
name=
"ProjectInspectionProfilesVisibleTreeState"
>
<entry
key=
"Project Default"
>
<entry
key=
"Project Default"
>
...
@@ -234,7 +211,7 @@
...
@@ -234,7 +211,7 @@
<foldersAlwaysOnTop
value=
"true"
/>
<foldersAlwaysOnTop
value=
"true"
/>
</navigator>
</navigator>
<panes>
<panes>
<pane
id=
"Sc
ratches
"
/>
<pane
id=
"Sc
ope
"
/>
<pane
id=
"ProjectPane"
>
<pane
id=
"ProjectPane"
>
<subPane>
<subPane>
<expand>
<expand>
...
@@ -258,30 +235,28 @@
...
@@ -258,30 +235,28 @@
<item
name=
"cloud"
type=
"462c0819:PsiDirectoryNode"
/>
<item
name=
"cloud"
type=
"462c0819:PsiDirectoryNode"
/>
<item
name=
"circle"
type=
"462c0819:PsiDirectoryNode"
/>
<item
name=
"circle"
type=
"462c0819:PsiDirectoryNode"
/>
<item
name=
"dashboard"
type=
"462c0819:PsiDirectoryNode"
/>
<item
name=
"dashboard"
type=
"462c0819:PsiDirectoryNode"
/>
<item
name=
"
template
s"
type=
"462c0819:PsiDirectoryNode"
/>
<item
name=
"
view
s"
type=
"462c0819:PsiDirectoryNode"
/>
</path>
</path>
<path>
<path>
<item
name=
"cloud"
type=
"b2602c69:ProjectViewProjectNode"
/>
<item
name=
"cloud"
type=
"b2602c69:ProjectViewProjectNode"
/>
<item
name=
"cloud"
type=
"462c0819:PsiDirectoryNode"
/>
<item
name=
"cloud"
type=
"462c0819:PsiDirectoryNode"
/>
<item
name=
"circle"
type=
"462c0819:PsiDirectoryNode"
/>
<item
name=
"circle"
type=
"462c0819:PsiDirectoryNode"
/>
<item
name=
"dashboard"
type=
"462c0819:PsiDirectoryNode"
/>
<item
name=
"request"
type=
"462c0819:PsiDirectoryNode"
/>
<item
name=
"templates"
type=
"462c0819:PsiDirectoryNode"
/>
<item
name=
"auth"
type=
"462c0819:PsiDirectoryNode"
/>
</path>
</path>
</expand>
</expand>
<select
/>
<select
/>
</subPane>
</subPane>
</pane>
</pane>
<pane
id=
"Sc
ope
"
/>
<pane
id=
"Sc
ratches
"
/>
</panes>
</panes>
</component>
</component>
<component
name=
"PropertiesComponent"
>
<component
name=
"PropertiesComponent"
>
<property
name=
"WebServerToolWindowFactoryState"
value=
"false"
/>
<property
name=
"WebServerToolWindowFactoryState"
value=
"false"
/>
<property
name=
"last_opened_file_path"
value=
"$PROJECT_DIR$/circle"
/>
<property
name=
"last_opened_file_path"
value=
"$PROJECT_DIR$/circle"
/>
<property
name=
"settings.editor.selected.configurable"
value=
"preferences.
keymap
"
/>
<property
name=
"settings.editor.selected.configurable"
value=
"preferences.
sourceCode.HTML
"
/>
<property
name=
"NewWatcherDialog.advanced.open"
value=
"true"
/>
<property
name=
"NewWatcherDialog.advanced.open"
value=
"true"
/>
<property
name=
"DefaultHtmlFileTemplate"
value=
"HTML File"
/>
<property
name=
"DefaultHtmlFileTemplate"
value=
"HTML File"
/>
<property
name=
"SearchEverywhereHistoryKey"
value=
"
loginV	null	null instance	FILE	file:///home/h3yduck/cloud/circle/vm/models/instance.py
index.html	FILE	file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/index.html sleep	null	null Deploy	null	null Instance	null	null Vmdeta	null	null list_from	null	null aclupda	null	null base.htm	FILE	file:///home/h3yduck/cloud/circle/dashboard/templates/base.html method	ACTION	GoToMenuEx base.ht	FILE	file:///home/h3yduck/cloud/circle/dashboard/templates/base.html base.html	FILE	file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/base.html index.py	FILE	file:///home/h3yduck/cloud/circle/dashboard/views/index.py index.htm	FILE	file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/index.html server	null	null Disk	null	null"
/>
<property
name=
"SearchEverywhereHistoryKey"
value=
"
instance	FILE	file:///home/h3yduck/cloud/circle/vm/models/instance.py index	FILE	file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/index-vm.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 Instance	null	null Vmdeta	null	null list_from	null	null aclupda	null	null base.htm	FILE	file:///home/h3yduck/cloud/circle/dashboard/templates/base.html method	ACTION	GoToMenuEx base.ht	FILE	file:///home/h3yduck/cloud/circle/dashboard/templates/base.html base.html	FILE	file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/base.html index.py	FILE	file:///home/h3yduck/cloud/circle/dashboard/views/index.py index.htm	FILE	file:///home/h3yduck/cloud/circle/dashboard/templates/dashboard/index.html server	null	null Disk	null	null"
/>
</component>
</component>
<component
name=
"RecentsManager"
>
<component
name=
"RecentsManager"
>
<key
name=
"MoveFile.RECENT_KEYS"
>
<key
name=
"MoveFile.RECENT_KEYS"
>
...
@@ -351,28 +326,28 @@
...
@@ -351,28 +326,28 @@
</todo-panel>
</todo-panel>
</component>
</component>
<component
name=
"ToolWindowManager"
>
<component
name=
"ToolWindowManager"
>
<frame
x=
"-2"
y=
"-1"
width=
"1
924"
height=
"1063
"
extended-state=
"0"
/>
<frame
x=
"-2"
y=
"-1"
width=
"1
370"
height=
"751
"
extended-state=
"0"
/>
<editor
active=
"true"
/>
<editor
active=
"true"
/>
<layout>
<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=
"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=
"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=
"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.32875264"
sideWeight=
"0.5"
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.32875264"
sideWeight=
"0.4978701"
order=
"2"
side_tool=
"false"
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.32875264"
sideWeight=
"0.4978701"
order=
"2"
side_tool=
"false"
content_ui=
"tabs"
/>
<window_info
id=
"Version Control"
active=
"false"
anchor=
"bottom"
auto_hide=
"false"
internal_type=
"DOCKED"
type=
"DOCKED"
visible=
"true"
show_stripe_button=
"true"
weight=
"0.3280757"
sideWeight=
"0.5"
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=
"Terminal"
active=
"false"
anchor=
"bottom"
auto_hide=
"false"
internal_type=
"DOCKED"
type=
"DOCKED"
visible=
"false"
show_stripe_button=
"true"
weight=
"0.5264271"
sideWeight=
"0.44888178"
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.5264271"
sideWeight=
"0.44888178"
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.
20766774
"
sideWeight=
"0.5"
order=
"0"
side_tool=
"false"
content_ui=
"combo"
/>
<window_info
id=
"Project"
active=
"false"
anchor=
"left"
auto_hide=
"false"
internal_type=
"DOCKED"
type=
"DOCKED"
visible=
"true"
show_stripe_button=
"true"
weight=
"0.
18504532
"
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=
"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=
"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.32980973"
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=
"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=
"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=
"Debug"
active=
"false"
anchor=
"bottom"
auto_hide=
"false"
internal_type=
"DOCKED"
type=
"DOCKED"
visible=
"false"
show_stripe_button=
"true"
weight=
"0.35962147"
sideWeight=
"0.5511182"
order=
"3"
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=
"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.5264271"
sideWeight=
"0.5511182"
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=
"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=
"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=
"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=
"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"
/>
<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=
"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=
"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.32980973"
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"
/>
<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>
<layout-to-restore>
<layout-to-restore>
...
@@ -449,7 +424,7 @@
...
@@ -449,7 +424,7 @@
</properties>
</properties>
</breakpoint>
</breakpoint>
</default-breakpoints>
</default-breakpoints>
<option
name=
"time"
value=
"1
24
"
/>
<option
name=
"time"
value=
"1
55
"
/>
</breakpoint-manager>
</breakpoint-manager>
<watches-manager
/>
<watches-manager
/>
</component>
</component>
...
@@ -482,201 +457,203 @@
...
@@ -482,201 +457,203 @@
</expressions>
</expressions>
<expressions
id=
"evaluateExpression"
>
<expressions
id=
"evaluateExpression"
>
<expression>
<expression>
<expression-string>
import_string(
"
openstack_auth.policy.check
"
)
</expression-string>
<expression-string>
self.get_object().pk
</expression-string>
<language-id>
Python
</language-id>
<language-id>
Python
</language-id>
<evaluation-mode>
EXPRESSION
</evaluation-mode>
<evaluation-mode>
EXPRESSION
</evaluation-mode>
</expression>
</expression>
<expression>
<expression>
<expression-string>
policy = import_string(
"
openstack_auth.policy.check
"
)
</expression-string>
<expression-string>
self.get_object(
)
</expression-string>
<language-id>
Python
</language-id>
<language-id>
Python
</language-id>
<evaluation-mode>
EXPRESSION
</evaluation-mode>
<evaluation-mode>
EXPRESSION
</evaluation-mode>
</expression>
</expression>
<expression>
<expression>
<expression-string>
policy = import_string(
"
POLICY_CHECK_FUNCTION
"
)
</expression-string>
<expression-string>
request.POST.get(
"
network
"
)
</expression-string>
<language-id>
Python
</language-id>
<language-id>
Python
</language-id>
<evaluation-mode>
EXPRESSION
</evaluation-mode>
<evaluation-mode>
EXPRESSION
</evaluation-mode>
</expression>
</expression>
<expression>
<expression>
<expression-string>
instance._os_server.tenant_id
</expression-string>
<expression-string>
request.POST.get(
"
name
"
)
</expression-string>
<language-id>
Python
</language-id>
<language-id>
Python
</language-id>
<evaluation-mode>
EXPRESSION
</evaluation-mode>
<evaluation-mode>
EXPRESSION
</evaluation-mode>
</expression>
</expression>
<expression>
<expression>
<expression-string>
instance._os_server._attrs
</expression-string>
<expression-string>
request.POST
</expression-string>
<language-id>
Python
</language-id>
<language-id>
Python
</language-id>
<evaluation-mode>
EXPRESSION
</evaluation-mode>
<evaluation-mode>
EXPRESSION
</evaluation-mode>
</expression>
</expression>
<expression>
<expression>
<expression-string>
openstack_api.glance.
</expression-string>
<expression-string>
request.POST.get(
"
from_plain_image
"
)
</expression-string>
<language-id>
Python
</language-id>
<language-id>
Python
</language-id>
<evaluation-mode>
EXPRESSION
</evaluation-mode>
<evaluation-mode>
EXPRESSION
</evaluation-mode>
</expression>
</expression>
<expression>
<expression>
<expression-string>
openstack_api.
glance.get_image_upload_mode(
)
</expression-string>
<expression-string>
openstack_api.
nova.flavor_list(request
)
</expression-string>
<language-id>
Python
</language-id>
<language-id>
Python
</language-id>
<evaluation-mode>
EXPRESSION
</evaluation-mode>
<evaluation-mode>
EXPRESSION
</evaluation-mode>
</expression>
</expression>
<expression>
<expression>
<expression-string>
openstack_api.glance.tenant_quota_get(request, '31911a90329944c18c285398ec72e4f6'
)
</expression-string>
<expression-string>
templates.all().all(
)
</expression-string>
<language-id>
Python
</language-id>
<language-id>
Python
</language-id>
<evaluation-mode>
EXPRESSION
</evaluation-mode>
<evaluation-mode>
EXPRESSION
</evaluation-mode>
</expression>
</expression>
<expression>
<expression>
<expression-string>
openstack_api.cinder.tenant_quota_get(request, '31911a90329944c18c285398ec72e4f6'
)
</expression-string>
<expression-string>
templates.all(
)
</expression-string>
<language-id>
Python
</language-id>
<language-id>
Python
</language-id>
<evaluation-mode>
EXPRESSION
</evaluation-mode>
<evaluation-mode>
EXPRESSION
</evaluation-mode>
</expression>
</expression>
</expressions>
</expressions>
</component>
</component>
<component
name=
"editorHistoryManager"
>
<component
name=
"editorHistoryManager"
>
<entry
file=
"file://$
USER_HOME$/.virtualenvs/cloud/local/lib/python2.7/site-packages/django/core/handlers/exception
.py"
>
<entry
file=
"file://$
PROJECT_DIR$/circle/common/views
.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"
494
"
>
<state
relative-caret-position=
"
220
"
>
<caret
line=
"
59"
column=
"37"
lean-forward=
"false"
selection-start-line=
"59"
selection-start-column=
"37"
selection-end-line=
"59"
selection-end-column=
"37
"
/>
<caret
line=
"
66"
column=
"38"
lean-forward=
"false"
selection-start-line=
"66"
selection-start-column=
"38"
selection-end-line=
"66"
selection-end-column=
"38
"
/>
<folding
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$
PROJECT_DIR$/circle/dashboard/views/__init__
.py"
>
<entry
file=
"file://$
USER_HOME$/.virtualenvs/cloud/local/lib/python2.7/site-packages/django/contrib/messages/views
.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"
187
"
>
<state
relative-caret-position=
"
51
"
>
<caret
line=
"
11"
column=
"5"
lean-forward=
"false"
selection-start-line=
"11"
selection-start-column=
"5"
selection-end-line=
"11"
selection-end-column=
"5
"
/>
<caret
line=
"
3"
column=
"6"
lean-forward=
"false"
selection-start-line=
"3"
selection-start-column=
"6"
selection-end-line=
"3"
selection-end-column=
"6
"
/>
<folding
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/circle/os_policies/neutron_policy.json"
>
<entry
file=
"file://$PROJECT_DIR$/circle/static_collected/jsPlumb/demo/logo.svg"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"images"
>
<state
relative-caret-position=
"455"
>
<state
/>
<caret
line=
"234"
column=
"1"
lean-forward=
"false"
selection-start-line=
"234"
selection-start-column=
"1"
selection-end-line=
"234"
selection-end-column=
"1"
/>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/
circle/os_policies/glance_policy.json
"
>
<entry
file=
"file://$PROJECT_DIR$/circle/
static_collected/js/network.js
"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"
183
"
>
<state
relative-caret-position=
"
-1540
"
>
<caret
line=
"
46"
column=
"0"
lean-forward=
"true"
selection-start-line=
"46"
selection-start-column=
"0"
selection-end-line=
"46
"
selection-end-column=
"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>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/
common/models.py
"
>
<entry
file=
"file://$PROJECT_DIR$/circle/
network/templates/network/editor.html
"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"
185
"
>
<state
relative-caret-position=
"
760
"
>
<caret
line=
"
280"
column=
"19"
lean-forward=
"false"
selection-start-line=
"280"
selection-start-column=
"11"
selection-end-line=
"280"
selection-end-column=
"19
"
/>
<caret
line=
"
51"
column=
"24"
lean-forward=
"false"
selection-start-line=
"51"
selection-start-column=
"17"
selection-end-line=
"51"
selection-end-column=
"24
"
/>
<folding
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/
acl/models
.py"
>
<entry
file=
"file://$PROJECT_DIR$/circle/
circle/settings/static_and_pipeline
.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"-515"
>
<state
relative-caret-position=
"624"
>
<caret
line=
"59"
column=
"13"
lean-forward=
"false"
selection-start-line=
"59"
selection-start-column=
"4"
selection-end-line=
"59"
selection-end-column=
"13"
/>
<caret
line=
"157"
column=
"10"
lean-forward=
"false"
selection-start-line=
"157"
selection-start-column=
"10"
selection-end-line=
"157"
selection-end-column=
"10"
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://
/usr/lib/python2.7/collection
s.py"
>
<entry
file=
"file://
$PROJECT_DIR$/circle/openstack_auth/view
s.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"
171
"
>
<state
relative-caret-position=
"
-612
"
>
<caret
line=
"
137"
column=
"8"
lean-forward=
"false"
selection-start-line=
"137"
selection-start-column=
"8"
selection-end-line=
"137"
selection-end-column=
"8
"
/>
<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
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://
/usr/lib/python2.7/importlib/__init__.py
"
>
<entry
file=
"file://
$PROJECT_DIR$/circle/dashboard/templates/auth/login.html
"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"377"
>
<state
relative-caret-position=
"510"
>
<caret
line=
"36"
column=
"0"
lean-forward=
"false"
selection-start-line=
"36"
selection-start-column=
"0"
selection-end-line=
"36"
selection-end-column=
"0"
/>
<caret
line=
"30"
column=
"33"
lean-forward=
"false"
selection-start-line=
"30"
selection-start-column=
"33"
selection-end-line=
"30"
selection-end-column=
"33"
/>
<folding
/>
<folding>
<element
signature=
"n#style#0;n#h4#0;n#div#2;n#div#0;n#!!top"
expanded=
"false"
/>
</folding>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$
USER_HOME$/.virtualenvs/cloud/local/lib/python2.7/site-packages/django/apps/registry.py
"
>
<entry
file=
"file://$
PROJECT_DIR$/circle/templates/registration/login.html
"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"
171
"
>
<state
relative-caret-position=
"
0
"
>
<caret
line=
"
246"
column=
"0"
lean-forward=
"false"
selection-start-line=
"246"
selection-start-column=
"0"
selection-end-line=
"246"
selection-end-column=
"0
"
/>
<caret
line=
"
0"
column=
"28"
lean-forward=
"false"
selection-start-line=
"0"
selection-start-column=
"28"
selection-end-line=
"0"
selection-end-column=
"28
"
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$
USER_HOME$/.virtualenvs/cloud/local/lib/python2.7/site-packages/django/contrib/auth/base_
user.py"
>
<entry
file=
"file://$
PROJECT_DIR$/circle/dashboard/views/
user.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"
171
"
>
<state
relative-caret-position=
"
272
"
>
<caret
line=
"
51"
column=
"0"
lean-forward=
"false"
selection-start-line=
"51"
selection-start-column=
"0"
selection-end-line=
"51
"
selection-end-column=
"0"
/>
<caret
line=
"
105"
column=
"0"
lean-forward=
"true"
selection-start-line=
"105"
selection-start-column=
"0"
selection-end-line=
"105
"
selection-end-column=
"0"
/>
<folding
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$
USER_HOME$/.virtualenvs/cloud/local/lib/python2.7/site-packages/django/contrib/auth/model
s.py"
>
<entry
file=
"file://$
PROJECT_DIR$/circle/network/form
s.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"
51
"
>
<state
relative-caret-position=
"
794
"
>
<caret
line=
"3
"
column=
"0"
lean-forward=
"false"
selection-start-line=
"3"
selection-start-column=
"0"
selection-end-line=
"3
"
selection-end-column=
"0"
/>
<caret
line=
"3
92"
column=
"0"
lean-forward=
"true"
selection-start-line=
"392"
selection-start-column=
"0"
selection-end-line=
"392
"
selection-end-column=
"0"
/>
<folding
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$
PROJECT_DIR$/circle/openstack_auth/user
.py"
>
<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"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"182"
>
<state
relative-caret-position=
"132"
>
<caret
line=
"137"
column=
"17"
lean-forward=
"false"
selection-start-line=
"137"
selection-start-column=
"17"
selection-end-line=
"137"
selection-end-column=
"17"
/>
<caret
line=
"276"
column=
"0"
lean-forward=
"false"
selection-start-line=
"276"
selection-start-column=
"0"
selection-end-line=
"276"
selection-end-column=
"0"
/>
<folding>
<folding
/>
<element
signature=
"e#546#561#0"
expanded=
"false"
/>
</folding>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/
openstack_auth/__init__
.py"
>
<entry
file=
"file://$PROJECT_DIR$/circle/
network/models
.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"
0
"
>
<state
relative-caret-position=
"
471
"
>
<caret
line=
"
0"
column=
"0"
lean-forward=
"false"
selection-start-line=
"0"
selection-start-column=
"0"
selection-end-line=
"0"
selection-end-column=
"0
"
/>
<caret
line=
"
56"
column=
"9"
lean-forward=
"true"
selection-start-line=
"56"
selection-start-column=
"9"
selection-end-line=
"56"
selection-end-column=
"9
"
/>
<folding
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/
circle/os_policies/cinder_policy.json
"
>
<entry
file=
"file://$PROJECT_DIR$/circle/
network/urls.py
"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"2754"
>
<state
relative-caret-position=
"140"
>
<caret
line=
"162"
column=
"1"
lean-forward=
"false"
selection-start-line=
"162"
selection-start-column=
"1"
selection-end-line=
"162"
selection-end-column=
"1"
/>
<caret
line=
"18"
column=
"0"
lean-forward=
"false"
selection-start-line=
"18"
selection-start-column=
"0"
selection-end-line=
"18"
selection-end-column=
"0"
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/
openstack_api/base
.py"
>
<entry
file=
"file://$PROJECT_DIR$/circle/
network/views
.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"171"
>
<state
relative-caret-position=
"132"
>
<caret
line=
"118"
column=
"0"
lean-forward=
"false"
selection-start-line=
"118"
selection-start-column=
"0"
selection-end-line=
"118"
selection-end-column=
"0"
/>
<caret
line=
"50"
column=
"0"
lean-forward=
"false"
selection-start-line=
"50"
selection-start-column=
"0"
selection-end-line=
"50"
selection-end-column=
"0"
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$
USER_HOME$/.virtualenvs/cloud/local/lib/python2.7/site-packages/oslo_policy/policy.py
"
>
<entry
file=
"file://$
PROJECT_DIR$/circle/dashboard/templates/dashboard/index-vxlans.html
"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"
163
"
>
<state
relative-caret-position=
"
238
"
>
<caret
line=
"
540"
column=
"0"
lean-forward=
"false"
selection-start-line=
"540"
selection-start-column=
"0"
selection-end-line=
"540"
selection-end-column=
"0
"
/>
<caret
line=
"
14"
column=
"28"
lean-forward=
"false"
selection-start-line=
"14"
selection-start-column=
"22"
selection-end-line=
"14"
selection-end-column=
"28
"
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/
openstack_auth/policy.py
"
>
<entry
file=
"file://$PROJECT_DIR$/circle/
dashboard/templates/dashboard/index.html
"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"299"
>
<state
relative-caret-position=
"306"
>
<caret
line=
"156"
column=
"0"
lean-forward=
"false"
selection-start-line=
"156"
selection-start-column=
"0"
selection-end-line=
"156"
selection-end-column=
"0"
/>
<caret
line=
"18"
column=
"36"
lean-forward=
"false"
selection-start-line=
"18"
selection-start-column=
"36"
selection-end-line=
"18"
selection-end-column=
"36"
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/dashboard/views/
util
.py"
>
<entry
file=
"file://$PROJECT_DIR$/circle/dashboard/views/
index
.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"4437"
>
<state
relative-caret-position=
"436"
>
<caret
line=
"290"
column=
"50"
lean-forward=
"false"
selection-start-line=
"290"
selection-start-column=
"50"
selection-end-line=
"290"
selection-end-column=
"50"
/>
<caret
line=
"108"
column=
"9"
lean-forward=
"false"
selection-start-line=
"108"
selection-start-column=
"9"
selection-end-line=
"108"
selection-end-column=
"9"
/>
<folding
/>
<folding>
<element
signature=
"e#731#787#0"
expanded=
"false"
/>
</folding>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/
circle/os_policies/nova_policy.json
"
>
<entry
file=
"file://$PROJECT_DIR$/circle/
request/models.py
"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"
88
4"
>
<state
relative-caret-position=
"
19
4"
>
<caret
line=
"
52"
column=
"0"
lean-forward=
"false"
selection-start-line=
"52"
selection-start-column=
"0"
selection-end-line=
"52"
selection-end-column=
"0
"
/>
<caret
line=
"
63"
column=
"6"
lean-forward=
"false"
selection-start-line=
"63"
selection-start-column=
"6"
selection-end-line=
"63"
selection-end-column=
"6
"
/>
<folding
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/
acl/management/commands/update_levels
.py"
>
<entry
file=
"file://$PROJECT_DIR$/circle/
dashboard/views/storage
.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"0"
>
<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"
/>
<caret
line=
"0"
column=
"0"
lean-forward=
"false"
selection-start-line=
"0"
selection-start-column=
"0"
selection-end-line=
"0"
selection-end-column=
"0"
/>
...
@@ -684,264 +661,257 @@
...
@@ -684,264 +661,257 @@
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/
common/operation
s.py"
>
<entry
file=
"file://$PROJECT_DIR$/circle/
storage/model
s.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"
426
"
>
<state
relative-caret-position=
"
163
"
>
<caret
line=
"
74"
column=
"41"
lean-forward=
"false"
selection-start-line=
"74"
selection-start-column=
"41"
selection-end-line=
"74"
selection-end-column=
"41
"
/>
<caret
line=
"
120"
column=
"0"
lean-forward=
"false"
selection-start-line=
"120"
selection-start-column=
"0"
selection-end-line=
"120"
selection-end-column=
"0
"
/>
<folding
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$
USER_HOME$/.virtualenvs/cloud/local/lib/python2.7/site-packages/django/db/models/base.py
"
>
<entry
file=
"file://$
PROJECT_DIR$/circle/dashboard/templates/dashboard/_template-create.html
"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"306"
>
<state
relative-caret-position=
"0"
>
<caret
line=
"470"
column=
"6"
lean-forward=
"false"
selection-start-line=
"470"
selection-start-column=
"6"
selection-end-line=
"470"
selection-end-column=
"6"
/>
<caret
line=
"0"
column=
"15"
lean-forward=
"true"
selection-start-line=
"0"
selection-start-column=
"15"
selection-end-line=
"1"
selection-end-column=
"28"
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/
vm/models/common
.py"
>
<entry
file=
"file://$PROJECT_DIR$/circle/
openstack_api/glance
.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"-816"
>
<state
relative-caret-position=
"-1581"
>
<caret
line=
"29"
column=
"41"
lean-forward=
"false"
selection-start-line=
"29"
selection-start-column=
"41"
selection-end-line=
"29"
selection-end-column=
"41"
/>
<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>
<folding
/>
<element
signature=
"e#732#788#0"
expanded=
"false"
/>
</folding>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/
firewall/models
.py"
>
<entry
file=
"file://$PROJECT_DIR$/circle/
dashboard/views/template
.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"
182
"
>
<state
relative-caret-position=
"
-90
"
>
<caret
line=
"
357"
column=
"48"
lean-forward=
"false"
selection-start-line=
"357"
selection-start-column=
"48"
selection-end-line=
"357"
selection-end-column=
"48
"
/>
<caret
line=
"
105"
column=
"22"
lean-forward=
"false"
selection-start-line=
"105"
selection-start-column=
"22"
selection-end-line=
"105"
selection-end-column=
"22
"
/>
<folding>
<folding>
<
element
signature=
"e#757#789#0"
expanded=
"fals
e"
/>
<
marker
date=
"1518171677270"
expanded=
"true"
signature=
"9976:10189"
ph=
"SELECT count... vm_instanc
e"
/>
</folding>
</folding>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$
PROJECT_DIR$/circle/dashboard/views/vm
.py"
>
<entry
file=
"file://$
USER_HOME$/.virtualenvs/cloud/local/lib/python2.7/site-packages/django/forms/forms
.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"
47
6"
>
<state
relative-caret-position=
"
36
6"
>
<caret
line=
"
141"
column=
"39"
lean-forward=
"false"
selection-start-line=
"141"
selection-start-column=
"39"
selection-end-line=
"141"
selection-end-column=
"39
"
/>
<caret
line=
"
509"
column=
"6"
lean-forward=
"false"
selection-start-line=
"509"
selection-start-column=
"6"
selection-end-line=
"509"
selection-end-column=
"6
"
/>
<folding
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$
PROJECT_DIR$/circle/dashboard/models
.py"
>
<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"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"182"
>
<state
relative-caret-position=
"195"
>
<caret
line=
"359"
column=
"58"
lean-forward=
"false"
selection-start-line=
"359"
selection-start-column=
"58"
selection-end-line=
"359"
selection-end-column=
"58"
/>
<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>
<folding
/>
<element
signature=
"e#732#770#0"
expanded=
"false"
/>
</folding>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/
circle/settings/base.py
"
>
<entry
file=
"file://$PROJECT_DIR$/circle/
dashboard/templates/dashboard/nojs-wrapper.html
"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"313"
>
<state
relative-caret-position=
"0"
>
<caret
line=
"541"
column=
"35"
lean-forward=
"true"
selection-start-line=
"541"
selection-start-column=
"35"
selection-end-line=
"541"
selection-end-column=
"35"
/>
<caret
line=
"0"
column=
"0"
lean-forward=
"false"
selection-start-line=
"0"
selection-start-column=
"0"
selection-end-line=
"3"
selection-end-column=
"19"
/>
<folding>
<element
signature=
"e#782#791#0"
expanded=
"false"
/>
</folding>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/
vm/operations.py
"
>
<entry
file=
"file://$PROJECT_DIR$/circle/
dashboard/templates/dashboard/_vm-create-1.html
"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"
299
"
>
<state
relative-caret-position=
"
391
"
>
<caret
line=
"
198"
column=
"25"
lean-forward=
"true"
selection-start-line=
"198"
selection-start-column=
"25"
selection-end-line=
"198"
selection-end-column=
"25
"
/>
<caret
line=
"
95"
column=
"34"
lean-forward=
"false"
selection-start-line=
"95"
selection-start-column=
"34"
selection-end-line=
"95"
selection-end-column=
"34
"
/>
<folding>
<folding>
<element
signature=
"
e#732#788#0"
expanded=
"fals
e"
/>
<element
signature=
"
n#style#0;n#a#0;n#div#1;n#div#0;n#!!top"
expanded=
"tru
e"
/>
</folding>
</folding>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/
dashboard/templates/dashboard/index.html
"
>
<entry
file=
"file://$PROJECT_DIR$/circle/
circle/os_policies/keystone_policy.json
"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"4
71
"
>
<state
relative-caret-position=
"4
25
"
>
<caret
line=
"
39"
column=
"41"
lean-forward=
"true"
selection-start-line=
"39"
selection-start-column=
"41"
selection-end-line=
"39"
selection-end-column=
"41
"
/>
<caret
line=
"
61"
column=
"39"
lean-forward=
"false"
selection-start-line=
"61"
selection-start-column=
"39"
selection-end-line=
"61"
selection-end-column=
"39
"
/>
<folding
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/
dashboard/urls.py
"
>
<entry
file=
"file://$PROJECT_DIR$/circle/
circle/os_policies/nova_policy.json
"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"-931"
>
<state
relative-caret-position=
"298"
>
<caret
line=
"55"
column=
"61"
lean-forward=
"false"
selection-start-line=
"55"
selection-start-column=
"61"
selection-end-line=
"55"
selection-end-column=
"61"
/>
<caret
line=
"37"
column=
"56"
lean-forward=
"false"
selection-start-line=
"37"
selection-start-column=
"56"
selection-end-line=
"37"
selection-end-column=
"56"
/>
<folding>
<folding
/>
<element
signature=
"e#732#770#0"
expanded=
"false"
/>
</folding>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/
circle/urls.py
"
>
<entry
file=
"file://$PROJECT_DIR$/circle/
dashboard/templates/dashboard/_vm-create-2.html
"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"
8
5"
>
<state
relative-caret-position=
"
42
5"
>
<caret
line=
"
33"
column=
"36"
lean-forward=
"false"
selection-start-line=
"33"
selection-start-column=
"36"
selection-end-line=
"33"
selection-end-column=
"36
"
/>
<caret
line=
"
25"
column=
"31"
lean-forward=
"false"
selection-start-line=
"25"
selection-start-column=
"31"
selection-end-line=
"26"
selection-end-column=
"17
"
/>
<folding
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/
acl/views
.py"
>
<entry
file=
"file://$PROJECT_DIR$/circle/
openstack_auth/policy
.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"
-89
"
>
<state
relative-caret-position=
"
126
"
>
<caret
line=
"
0"
column=
"0"
lean-forward=
"false"
selection-start-line=
"0"
selection-start-column=
"0"
selection-end-line=
"0
"
selection-end-column=
"0"
/>
<caret
line=
"
23"
column=
"0"
lean-forward=
"false"
selection-start-line=
"23"
selection-start-column=
"0"
selection-end-line=
"23
"
selection-end-column=
"0"
/>
<folding
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$
USER_HOME$/.virtualenvs/cloud/local/lib/python2.7/site-packages/django/conf/urls/__init__
.py"
>
<entry
file=
"file://$
PROJECT_DIR$/circle/openstack_api/policy
.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"3
18
"
>
<state
relative-caret-position=
"3
4
"
>
<caret
line=
"
57"
column=
"45"
lean-forward=
"true"
selection-start-line=
"57"
selection-start-column=
"45"
selection-end-line=
"57"
selection-end-column=
"45
"
/>
<caret
line=
"
14"
column=
"18"
lean-forward=
"false"
selection-start-line=
"14"
selection-start-column=
"18"
selection-end-line=
"14"
selection-end-column=
"18
"
/>
<folding
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/
network/urls
.py"
>
<entry
file=
"file://$PROJECT_DIR$/circle/
openstack_api/neutron
.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"2
057
"
>
<state
relative-caret-position=
"2
55
"
>
<caret
line=
"
138"
column=
"34"
lean-forward=
"false"
selection-start-line=
"138"
selection-start-column=
"34"
selection-end-line=
"138"
selection-end-column=
"34
"
/>
<caret
line=
"
39"
column=
"18"
lean-forward=
"false"
selection-start-line=
"39"
selection-start-column=
"18"
selection-end-line=
"39"
selection-end-column=
"18
"
/>
<folding
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$
PROJECT_DIR$/circle/circle/os_policies/keystone_policy.json
"
>
<entry
file=
"file://$
USER_HOME$/.virtualenvs/cloud/local/lib/python2.7/site-packages/django/core/handlers/wsgi.py
"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"
81
6"
>
<state
relative-caret-position=
"
12
6"
>
<caret
line=
"
48"
column=
"24"
lean-forward=
"false"
selection-start-line=
"48"
selection-start-column=
"14"
selection-end-line=
"48"
selection-end-column=
"24
"
/>
<caret
line=
"
124"
column=
"0"
lean-forward=
"false"
selection-start-line=
"124"
selection-start-column=
"0"
selection-end-line=
"124"
selection-end-column=
"0
"
/>
<folding
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$USER_HOME$/.virtualenvs/cloud/local/lib/python2.7/site-packages/django/
forms/model
s.py"
>
<entry
file=
"file://$USER_HOME$/.virtualenvs/cloud/local/lib/python2.7/site-packages/django/
utils/datastructure
s.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"
273
"
>
<state
relative-caret-position=
"
126
"
>
<caret
line=
"
276"
column=
"0"
lean-forward=
"false"
selection-start-line=
"276"
selection-start-column=
"0"
selection-end-line=
"276
"
selection-end-column=
"0"
/>
<caret
line=
"
125"
column=
"0"
lean-forward=
"false"
selection-start-line=
"125"
selection-start-column=
"0"
selection-end-line=
"125
"
selection-end-column=
"0"
/>
<folding
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$
PROJECT_DIR$/circle/common/view
s.py"
>
<entry
file=
"file://$
USER_HOME$/.virtualenvs/cloud/local/lib/python2.7/site-packages/novaclient/v2/server
s.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"2
20
"
>
<state
relative-caret-position=
"2
62
"
>
<caret
line=
"
66"
column=
"38"
lean-forward=
"false"
selection-start-line=
"66"
selection-start-column=
"38"
selection-end-line=
"66"
selection-end-column=
"38
"
/>
<caret
line=
"
1221"
column=
"51"
lean-forward=
"false"
selection-start-line=
"1221"
selection-start-column=
"51"
selection-end-line=
"1221"
selection-end-column=
"51
"
/>
<folding
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$
USER_HOME$/.virtualenvs/cloud/local/lib/python2.7/site-packages/django/contrib/messages/views
.py"
>
<entry
file=
"file://$
PROJECT_DIR$/circle/openstack_api/nova
.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"
5
1"
>
<state
relative-caret-position=
"
10
1"
>
<caret
line=
"
3"
column=
"6"
lean-forward=
"false"
selection-start-line=
"3"
selection-start-column=
"6"
selection-end-line=
"3"
selection-end-column=
"6
"
/>
<caret
line=
"
510"
column=
"58"
lean-forward=
"false"
selection-start-line=
"510"
selection-start-column=
"58"
selection-end-line=
"510"
selection-end-column=
"58
"
/>
<folding
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/
network/forms.py
"
>
<entry
file=
"file://$PROJECT_DIR$/circle/
dashboard/templates/dashboard/vm-plain-image-create.html
"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"2
39
"
>
<state
relative-caret-position=
"2
21
"
>
<caret
line=
"
294"
column=
"48"
lean-forward=
"false"
selection-start-line=
"294"
selection-start-column=
"48"
selection-end-line=
"294"
selection-end-column=
"48
"
/>
<caret
line=
"
13"
column=
"40"
lean-forward=
"true"
selection-start-line=
"13"
selection-start-column=
"40"
selection-end-line=
"13"
selection-end-column=
"40
"
/>
<folding
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/
network
/models.py"
>
<entry
file=
"file://$PROJECT_DIR$/circle/
dashboard
/models.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"182"
>
<state
relative-caret-position=
"182"
>
<caret
line=
"
79"
column=
"32"
lean-forward=
"true"
selection-start-line=
"79"
selection-start-column=
"32"
selection-end-line=
"79"
selection-end-column=
"32
"
/>
<caret
line=
"
359"
column=
"40"
lean-forward=
"true"
selection-start-line=
"359"
selection-start-column=
"40"
selection-end-line=
"359"
selection-end-column=
"40
"
/>
<folding
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$
PROJECT_DIR$/circle/network/views
.py"
>
<entry
file=
"file://$
USER_HOME$/.virtualenvs/cloud/local/lib/python2.7/site-packages/django/db/models/base
.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"
24
6"
>
<state
relative-caret-position=
"
12
6"
>
<caret
line=
"
1021"
column=
"19"
lean-forward=
"false"
selection-start-line=
"1021"
selection-start-column=
"19"
selection-end-line=
"1021"
selection-end-column=
"19
"
/>
<caret
line=
"
474"
column=
"0"
lean-forward=
"false"
selection-start-line=
"474"
selection-start-column=
"0"
selection-end-line=
"474"
selection-end-column=
"0
"
/>
<folding
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/static_collected/jsPlumb/demo/logo.svg"
>
<entry
file=
"file://$PROJECT_DIR$/circle/common/operations.py"
>
<provider
selected=
"true"
editor-type-id=
"images"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
/>
<state
relative-caret-position=
"-233"
>
<caret
line=
"159"
column=
"6"
lean-forward=
"false"
selection-start-line=
"159"
selection-start-column=
"6"
selection-end-line=
"159"
selection-end-column=
"6"
/>
<folding
/>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/
static_collected/js/network.js
"
>
<entry
file=
"file://$PROJECT_DIR$/circle/
dashboard/forms.py
"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"-1540"
>
<state
relative-caret-position=
"516"
>
<caret
line=
"0"
column=
"0"
lean-forward=
"false"
selection-start-line=
"0"
selection-start-column=
"0"
selection-end-line=
"0"
selection-end-column=
"0"
/>
<caret
line=
"150"
column=
"9"
lean-forward=
"true"
selection-start-line=
"150"
selection-start-column=
"9"
selection-end-line=
"150"
selection-end-column=
"9"
/>
<folding
/>
<folding>
<element
signature=
"e#732#770#0"
expanded=
"true"
/>
</folding>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$
PROJECT_DIR$/circle/network/templates/network/editor.html
"
>
<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"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"
760
"
>
<state
relative-caret-position=
"
126
"
>
<caret
line=
"
51"
column=
"24"
lean-forward=
"false"
selection-start-line=
"51"
selection-start-column=
"17"
selection-end-line=
"51"
selection-end-column=
"24
"
/>
<caret
line=
"
21"
column=
"8"
lean-forward=
"false"
selection-start-line=
"21"
selection-start-column=
"8"
selection-end-line=
"21"
selection-end-column=
"8
"
/>
<folding
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/
circle/settings/static_and_pipeline
.py"
>
<entry
file=
"file://$PROJECT_DIR$/circle/
dashboard/views/vm
.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"624"
>
<state
relative-caret-position=
"189"
>
<caret
line=
"157"
column=
"10"
lean-forward=
"false"
selection-start-line=
"157"
selection-start-column=
"10"
selection-end-line=
"157"
selection-end-column=
"10"
/>
<caret
line=
"109"
column=
"8"
lean-forward=
"false"
selection-start-line=
"109"
selection-start-column=
"8"
selection-end-line=
"109"
selection-end-column=
"81"
/>
<folding
/>
<folding>
<element
signature=
"e#40141#41312#0"
expanded=
"false"
/>
</folding>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/vm/models/instance.py"
>
<entry
file=
"file://$PROJECT_DIR$/circle/vm/models/instance.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"
-226
"
>
<state
relative-caret-position=
"
308
"
>
<caret
line=
"
212"
column=
"11"
lean-forward=
"false"
selection-start-line=
"212"
selection-start-column=
"11"
selection-end-line=
"212"
selection-end-column=
"11
"
/>
<caret
line=
"
485"
column=
"46"
lean-forward=
"true"
selection-start-line=
"485"
selection-start-column=
"46"
selection-end-line=
"485"
selection-end-column=
"46
"
/>
<folding
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/
dashboard/form
s.py"
>
<entry
file=
"file://$PROJECT_DIR$/circle/
request/url
s.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"323"
>
<state
relative-caret-position=
"601"
>
<caret
line=
"1076"
column=
"28"
lean-forward=
"true"
selection-start-line=
"1076"
selection-start-column=
"28"
selection-end-line=
"1076"
selection-end-column=
"28"
/>
<caret
line=
"61"
column=
"161"
lean-forward=
"false"
selection-start-line=
"61"
selection-start-column=
"161"
selection-end-line=
"61"
selection-end-column=
"161"
/>
<folding>
<folding
/>
<element
signature=
"e#732#770#0"
expanded=
"true"
/>
</folding>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/dashboard/
views/user
.py"
>
<entry
file=
"file://$PROJECT_DIR$/circle/dashboard/
urls
.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"
306
"
>
<state
relative-caret-position=
"
133
"
>
<caret
line=
"
107"
column=
"29"
lean-forward=
"false"
selection-start-line=
"107"
selection-start-column=
"29"
selection-end-line=
"107"
selection-end-column=
"29
"
/>
<caret
line=
"
59"
column=
"46"
lean-forward=
"true"
selection-start-line=
"59"
selection-start-column=
"46"
selection-end-line=
"59"
selection-end-column=
"46
"
/>
<folding
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/
openstack_auth/views
.py"
>
<entry
file=
"file://$PROJECT_DIR$/circle/
dashboard/views/util
.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"
-612
"
>
<state
relative-caret-position=
"
206
"
>
<caret
line=
"
0"
column=
"0"
lean-forward=
"false"
selection-start-line=
"0"
selection-start-column=
"0"
selection-end-line=
"0
"
selection-end-column=
"0"
/>
<caret
line=
"
242"
column=
"0"
lean-forward=
"false"
selection-start-line=
"242"
selection-start-column=
"0"
selection-end-line=
"242
"
selection-end-column=
"0"
/>
<folding
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/
templates/registration/login
.html"
>
<entry
file=
"file://$PROJECT_DIR$/circle/
dashboard/templates/dashboard/index-vm
.html"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"0"
>
<state
relative-caret-position=
"
23
0"
>
<caret
line=
"
0"
column=
"28"
lean-forward=
"true"
selection-start-line=
"0"
selection-start-column=
"28"
selection-end-line=
"0"
selection-end-column=
"28
"
/>
<caret
line=
"
95"
column=
"36"
lean-forward=
"true"
selection-start-line=
"95"
selection-start-column=
"36"
selection-end-line=
"95"
selection-end-column=
"36
"
/>
<folding
/>
<folding
/>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/circle/
dashboard/templates/auth/login.html
"
>
<entry
file=
"file://$PROJECT_DIR$/circle/
openstack_api/__init__.py
"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"714"
>
<state
relative-caret-position=
"284"
>
<caret
line=
"42"
column=
"0"
lean-forward=
"false"
selection-start-line=
"42"
selection-start-column=
"0"
selection-end-line=
"42"
selection-end-column=
"0"
/>
<caret
line=
"38"
column=
"0"
lean-forward=
"false"
selection-start-line=
"38"
selection-start-column=
"0"
selection-end-line=
"38"
selection-end-column=
"0"
/>
<folding>
<folding
/>
<element
signature=
"n#style#0;n#h4#0;n#div#2;n#div#0;n#!!top"
expanded=
"true"
/>
</folding>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
...
...
circle/circle/db.sqlite3
View file @
327e7892
No preview for this file type
circle/dashboard/forms.py
View file @
327e7892
...
@@ -20,6 +20,7 @@ from __future__ import absolute_import
...
@@ -20,6 +20,7 @@ from __future__ import absolute_import
from
datetime
import
timedelta
from
datetime
import
timedelta
from
urlparse
import
urlparse
from
urlparse
import
urlparse
import
openstack_api
import
pyotp
import
pyotp
from
django.forms
import
ModelForm
from
django.forms
import
ModelForm
...
@@ -107,6 +108,47 @@ class VmSaveForm(OperationForm):
...
@@ -107,6 +108,47 @@ class VmSaveForm(OperationForm):
help_text
=
_
(
"Clone the access list of parent template. Useful "
help_text
=
_
(
"Clone the access list of parent template. Useful "
"for updating a template."
))
"for updating a template."
))
class
VmFromPlainImageForm
(
forms
.
Form
):
name
=
forms
.
CharField
(
widget
=
forms
.
TextInput
(
attrs
=
{
'class'
:
"form-control"
,
'required'
:
""
,
}))
image
=
forms
.
ChoiceField
([],
widget
=
forms
.
Select
(
attrs
=
{
'class'
:
"form-control input-tags"
,
}))
flavor
=
forms
.
ChoiceField
([],
widget
=
forms
.
Select
(
attrs
=
{
'class'
:
"form-control input-tags"
,
}))
network
=
forms
.
ChoiceField
([],
widget
=
forms
.
Select
(
attrs
=
{
'class'
:
"form-control input-tags"
,
}))
def
__init__
(
self
,
request
,
*
args
,
**
kwargs
):
super
(
VmFromPlainImageForm
,
self
)
.
__init__
(
*
args
,
**
kwargs
)
images
=
openstack_api
.
glance
.
image_list_detailed
(
request
)[
0
]
#TODO: flatten?
def
sizeof_fmt
(
num
,
suffix
=
'B'
):
for
unit
in
[
''
,
'K'
,
'M'
,
'G'
,
'T'
]:
if
abs
(
num
)
<
1024.0
:
return
"
%3.1
f
%
s
%
s"
%
(
num
,
unit
,
suffix
)
num
/=
1024.0
return
"
%.1
f
%
s
%
s"
%
(
num
,
'Yi'
,
suffix
)
self
.
fields
[
'image'
]
.
choices
=
(
(
image
.
id
,
'
%
s -
%
s'
%
(
image
.
name
,
sizeof_fmt
(
image
.
size
)))
for
image
in
images
)
flavors
=
openstack_api
.
nova
.
flavor_list
(
request
)
#TODO: flattent
self
.
fields
[
'flavor'
]
.
choices
=
(
(
flavor
.
id
,
'
%
s -
%
s CPUs,
%
s MB RAM'
%
(
flavor
.
name
,
flavor
.
vcpus
,
flavor
.
ram
))
for
flavor
in
flavors
)
networks
=
openstack_api
.
neutron
.
network_list_for_tenant
(
request
,
request
.
user
.
tenant_id
)
self
.
fields
[
'network'
]
.
choices
=
(
(
network
.
id
,
'
%
s'
%
(
network
.
name
))
for
network
in
networks
)
class
VmCustomizeForm
(
forms
.
Form
):
class
VmCustomizeForm
(
forms
.
Form
):
name
=
forms
.
CharField
(
widget
=
forms
.
TextInput
(
attrs
=
{
name
=
forms
.
CharField
(
widget
=
forms
.
TextInput
(
attrs
=
{
...
...
circle/dashboard/templates/dashboard/_vm-create-1.html
View file @
327e7892
{% load sizefieldtags %}
{% load sizefieldtags %}
{% load i18n %}
{% load i18n %}
{% load crispy_forms_tags %}
<div
class=
"vm-create-template-list"
>
<div
class=
"vm-create-template-list"
>
{% for t in templates %}
{% for t in templates %}
...
@@ -87,9 +88,20 @@
...
@@ -87,9 +88,20 @@
{% include "request/_request-template-form.html" %}
{% include "request/_request-template-form.html" %}
{% endif %}
{% endif %}
{% endfor %}
{% endfor %}
<div
class=
"vm-create-template"
>
<a
href=
"{% url "
dashboard
.
views
.
vm-plain-image-create
"
%}"
style=
"text-decoration: none; color: #333333"
>
<div
class=
"vm-create-template-summary"
>
<span
class=
"vm-create-list-name"
>
New VM from plain OS image
</span>
<div
class=
"clearfix"
></div>
</div>
</a>
</div>
</div>
</div>
{% if templates and template_access_types %}
{% if templates and template_access_types %}
{% url "request.views.request-template" as request_url %}
{% url "request.views.request-template" as request_url %}
<hr
/>
<hr
/>
<p
class=
"text-right"
>
<p
class=
"text-right"
>
...
@@ -97,7 +109,7 @@
...
@@ -97,7 +109,7 @@
Need other templates? Submit a new
<a
href=
"{{ url }}"
>
request
</a>
.
Need other templates? Submit a new
<a
href=
"{{ url }}"
>
request
</a>
.
{% endblocktrans %}
{% endblocktrans %}
</p>
</p>
{% endif %}
{% endif %}
<style>
<style>
.progress
{
.progress
{
...
...
circle/dashboard/templates/dashboard/vm-plain-image-create.html
0 → 100644
View file @
327e7892
{% extends "dashboard/base.html" %}
{% load sizefieldtags %}
{% load i18n %}
{% load crispy_forms_tags %}
{% load staticfiles %}
{% block content %}
<form
method=
"POST"
action=
"{% url "
dashboard
.
views
.
vm-plain-image-create
"
%}
"
>
{% csrf_token %}
{{ form.name|as_crispy_field }}
{{ form.image|as_crispy_field }}
{{ form.flavor|as_crispy_field }}
{# {{ form.network|as_crispy_field }}#}
<button
class=
"btn btn-success btn-xs vm-create-start pull-right text-right"
type=
"submit"
>
<i
class=
"fa fa-play"
></i>
{% trans "Start" %}
</button>
</form>
{% endblock %}
\ No newline at end of file
circle/dashboard/urls.py
View file @
327e7892
...
@@ -18,7 +18,7 @@
...
@@ -18,7 +18,7 @@
from
__future__
import
absolute_import
from
__future__
import
absolute_import
from
dashboard.views.autocomplete
import
AclUserGroupAutocomplete
,
AclUserAutocomplete
from
dashboard.views.autocomplete
import
AclUserGroupAutocomplete
,
AclUserAutocomplete
from
dashboard.views.vm
import
VmDetailView
,
VmList
,
VmCreate
,
vm_activity
,
vm_ops
,
FavouriteView
from
dashboard.views.vm
import
VmDetailView
,
VmList
,
VmCreate
,
vm_activity
,
vm_ops
,
FavouriteView
,
VmPlainImageCreate
from
django.conf.urls
import
url
from
django.conf.urls
import
url
from
.views
import
(
from
.views
import
(
...
@@ -55,7 +55,7 @@ urlpatterns = [
...
@@ -55,7 +55,7 @@ urlpatterns = [
# name="dashboard.views.template-delete"),
# name="dashboard.views.template-delete"),
# url(r'^template/(?P<pk>\d+)/tx/$', TransferTemplateOwnershipView.as_view(),
# url(r'^template/(?P<pk>\d+)/tx/$', TransferTemplateOwnershipView.as_view(),
# name='dashboard.views.template-transfer-ownership'),
# name='dashboard.views.template-transfer-ownership'),
url
(
r'^vm/(?P<pk>
\d+
)/$'
,
VmDetailView
.
as_view
(),
url
(
r'^vm/(?P<pk>
[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
)/$'
,
VmDetailView
.
as_view
(),
name
=
'dashboard.views.detail'
),
name
=
'dashboard.views.detail'
),
# url(r'^vm/(?P<pk>\d+)/vnctoken/$', VmDetailVncTokenView.as_view(),
# url(r'^vm/(?P<pk>\d+)/vnctoken/$', VmDetailVncTokenView.as_view(),
# name='dashboard.views.detail-vnc'),
# name='dashboard.views.detail-vnc'),
...
@@ -64,9 +64,9 @@ urlpatterns = [
...
@@ -64,9 +64,9 @@ urlpatterns = [
# url(r'^vm/(?P<pk>\d+)/tx/$', TransferInstanceOwnershipView.as_view(),
# url(r'^vm/(?P<pk>\d+)/tx/$', TransferInstanceOwnershipView.as_view(),
# name='dashboard.views.vm-transfer-ownership'),
# name='dashboard.views.vm-transfer-ownership'),
url
(
r'^vm/list/$'
,
VmList
.
as_view
(),
name
=
'dashboard.views.vm-list'
),
url
(
r'^vm/list/$'
,
VmList
.
as_view
(),
name
=
'dashboard.views.vm-list'
),
url
(
r'^vm/create/$'
,
VmCreate
.
as_view
(),
url
(
r'^vm/create/$'
,
VmCreate
.
as_view
(),
name
=
'dashboard.views.vm-create'
),
name
=
'dashboard.views.vm
-create'
),
url
(
r'^vm-plain-image-create$'
,
VmPlainImageCreate
.
as_view
(),
name
=
'dashboard.views.vm-plain-image
-create'
),
url
(
r'^vm/(?P<pk>
\d+
)/activity/$'
,
vm_activity
,
url
(
r'^vm/(?P<pk>
[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
)/activity/$'
,
vm_activity
,
name
=
'dashboard.views.vm-activity-list'
),
name
=
'dashboard.views.vm-activity-list'
),
# url(r'^vm/activity/(?P<pk>\d+)/$', InstanceActivityDetail.as_view(),
# url(r'^vm/activity/(?P<pk>\d+)/$', InstanceActivityDetail.as_view(),
# name='dashboard.views.vm-activity'),
# name='dashboard.views.vm-activity'),
...
@@ -223,7 +223,7 @@ urlpatterns = [
...
@@ -223,7 +223,7 @@ urlpatterns = [
]
]
urlpatterns
+=
[
urlpatterns
+=
[
url
(
r'^vm/(?P<pk>
\d+
)/op/
%
s/$'
%
op
,
v
.
as_view
(),
name
=
v
.
get_urlname
())
url
(
r'^vm/(?P<pk>
[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
)/op/
%
s/$'
%
op
,
v
.
as_view
(),
name
=
v
.
get_urlname
())
for
op
,
v
in
vm_ops
.
iteritems
()
for
op
,
v
in
vm_ops
.
iteritems
()
]
]
#
#
...
...
circle/dashboard/views/index.py
View file @
327e7892
...
@@ -105,6 +105,9 @@ class IndexView(LoginRequiredMixin, TemplateView):
...
@@ -105,6 +105,9 @@ class IndexView(LoginRequiredMixin, TemplateView):
context
[
'templates'
]
=
InstanceTemplate
.
get_objects_with_level
(
context
[
'templates'
]
=
InstanceTemplate
.
get_objects_with_level
(
'operator'
,
user
,
disregard_superuser
=
True
)
.
all
()[:
5
]
'operator'
,
user
,
disregard_superuser
=
True
)
.
all
()[:
5
]
# vxlan
#context['vxlans'] = Instance.list_from_os(self.request)[:5]
# toplist
# toplist
if
settings
.
STORE_URL
:
if
settings
.
STORE_URL
:
cache_key
=
"files-
%
d"
%
self
.
request
.
user
.
pk
cache_key
=
"files-
%
d"
%
self
.
request
.
user
.
pk
...
...
circle/dashboard/views/util.py
View file @
327e7892
...
@@ -42,6 +42,7 @@ from django.views.decorators.csrf import csrf_protect
...
@@ -42,6 +42,7 @@ from django.views.decorators.csrf import csrf_protect
from
django.views.decorators.debug
import
sensitive_post_parameters
from
django.views.decorators.debug
import
sensitive_post_parameters
from
django.views.generic
import
DetailView
,
View
,
DeleteView
,
FormView
from
django.views.generic
import
DetailView
,
View
,
DeleteView
,
FormView
from
django.views.generic.detail
import
SingleObjectMixin
from
django.views.generic.detail
import
SingleObjectMixin
from
vm.models
import
Instance
from
..models
import
GroupProfile
from
..models
import
GroupProfile
...
@@ -238,6 +239,9 @@ class OperationView(RedirectToLoginMixin, DetailView):
...
@@ -238,6 +239,9 @@ class OperationView(RedirectToLoginMixin, DetailView):
else
:
else
:
return
[
'dashboard/_base.html'
]
return
[
'dashboard/_base.html'
]
def
get_object
(
self
):
return
Instance
(
os_server_id
=
self
.
kwargs
[
'pk'
])
.
get_from_os
(
self
.
request
)
@classmethod
@classmethod
def
get_op_by_object
(
cls
,
obj
):
def
get_op_by_object
(
cls
,
obj
):
return
getattr
(
obj
,
cls
.
op
)
return
getattr
(
obj
,
cls
.
op
)
...
...
circle/dashboard/views/vm.py
View file @
327e7892
...
@@ -48,17 +48,19 @@ from common.models import (
...
@@ -48,17 +48,19 @@ from common.models import (
)
)
from
firewall.models
import
Vlan
,
Host
,
Rule
from
firewall.models
import
Vlan
,
Host
,
Rule
from
manager.scheduler
import
SchedulerError
from
manager.scheduler
import
SchedulerError
from
request.forms
import
TemplateRequestForm
from
request.models
import
TemplateAccessType
from
storage.models
import
Disk
from
storage.models
import
Disk
from
vm.models
import
(
from
vm.models
import
(
Instance
,
InstanceActivity
,
Interface
,
Instance
,
InstanceActivity
,
Interface
,
)
InstanceTemplate
)
from
.util
import
(
from
.util
import
(
CheckedDetailView
,
AjaxOperationMixin
,
OperationView
,
AclUpdateView
,
CheckedDetailView
,
AjaxOperationMixin
,
OperationView
,
AclUpdateView
,
FormOperationMixin
,
FilterMixin
,
GraphMixin
FormOperationMixin
,
FilterMixin
,
GraphMixin
)
)
from
..forms
import
(
from
..forms
import
(
AclUserOrGroupAddForm
,
VmResourcesForm
,
VmCustomizeForm
,
VmDeployForm
)
AclUserOrGroupAddForm
,
VmResourcesForm
,
VmCustomizeForm
,
VmDeployForm
,
VmFromPlainImageForm
)
logger
=
logging
.
getLogger
(
__name__
)
logger
=
logging
.
getLogger
(
__name__
)
...
@@ -105,7 +107,7 @@ class VmDetailView(LoginRequiredMixin, GraphMixin, DetailView):
...
@@ -105,7 +107,7 @@ class VmDetailView(LoginRequiredMixin, GraphMixin, DetailView):
"password"
:
instance
.
pw
}
"password"
:
instance
.
pw
}
def
get_object
(
self
,
queryset
=
None
):
def
get_object
(
self
,
queryset
=
None
):
return
super
(
VmDetailView
,
self
)
.
get_object
(
queryset
)
.
get_from_os
(
self
.
request
)
return
Instance
(
os_server_id
=
self
.
kwargs
[
'pk'
]
)
.
get_from_os
(
self
.
request
)
def
get_context_data
(
self
,
**
kwargs
):
def
get_context_data
(
self
,
**
kwargs
):
context
=
super
(
VmDetailView
,
self
)
.
get_context_data
(
**
kwargs
)
context
=
super
(
VmDetailView
,
self
)
.
get_context_data
(
**
kwargs
)
...
@@ -1007,6 +1009,28 @@ class VmList(LoginRequiredMixin, FilterMixin, ListView):
...
@@ -1007,6 +1009,28 @@ class VmList(LoginRequiredMixin, FilterMixin, ListView):
"interface_set__host"
)
.
distinct
()
"interface_set__host"
)
.
distinct
()
class
VmPlainImageCreate
(
LoginRequiredMixin
,
TemplateView
):
form_class
=
VmFromPlainImageForm
template_name
=
"dashboard/vm-plain-image-create.html"
def
get
(
self
,
request
,
*
args
,
**
kwargs
):
context
=
self
.
get_context_data
(
**
kwargs
)
context
.
update
({
'form'
:
VmFromPlainImageForm
(
request
),
})
return
self
.
render_to_response
(
context
)
def
post
(
self
,
request
,
*
args
,
**
kwargs
):
server_created
=
openstack_api
.
nova
.
server_create
(
request
,
request
.
POST
.
get
(
"name"
),
request
.
POST
.
get
(
"image"
),
request
.
POST
.
get
(
"flavor"
),
)
return
HttpResponseRedirect
(
"vm/
%
s#activity"
%
server_created
.
id
)
class
VmCreate
(
LoginRequiredMixin
,
TemplateView
):
class
VmCreate
(
LoginRequiredMixin
,
TemplateView
):
form_class
=
VmCustomizeForm
form_class
=
VmCustomizeForm
...
@@ -1030,9 +1054,6 @@ class VmCreate(LoginRequiredMixin, TemplateView):
...
@@ -1030,9 +1054,6 @@ class VmCreate(LoginRequiredMixin, TemplateView):
return
template
return
template
def
get
(
self
,
request
,
form
=
None
,
*
args
,
**
kwargs
):
def
get
(
self
,
request
,
form
=
None
,
*
args
,
**
kwargs
):
if
not
request
.
user
.
has_perm
(
'vm.create_vm'
):
raise
PermissionDenied
()
if
form
is
None
:
if
form
is
None
:
template_pk
=
request
.
GET
.
get
(
"template"
)
template_pk
=
request
.
GET
.
get
(
"template"
)
else
:
else
:
...
@@ -1043,8 +1064,9 @@ class VmCreate(LoginRequiredMixin, TemplateView):
...
@@ -1043,8 +1064,9 @@ class VmCreate(LoginRequiredMixin, TemplateView):
if
form
is
None
:
if
form
is
None
:
form
=
self
.
form_class
(
user
=
request
.
user
,
template
=
template
)
form
=
self
.
form_class
(
user
=
request
.
user
,
template
=
template
)
else
:
else
:
templates
=
InstanceTemplate
.
get_objects_with_level
(
templates
=
InstanceTemplate
.
objects
'user'
,
request
.
user
,
disregard_superuser
=
True
)
images
=
openstack_api
.
glance
.
image_list_detailed
(
request
)
context
=
self
.
get_context_data
(
**
kwargs
)
context
=
self
.
get_context_data
(
**
kwargs
)
if
template_pk
:
if
template_pk
:
...
@@ -1062,17 +1084,20 @@ class VmCreate(LoginRequiredMixin, TemplateView):
...
@@ -1062,17 +1084,20 @@ class VmCreate(LoginRequiredMixin, TemplateView):
'ajax_title'
:
True
,
'ajax_title'
:
True
,
'templates'
:
templates
.
all
(),
'templates'
:
templates
.
all
(),
'template_access_types'
:
TemplateAccessType
.
objects
.
exists
(),
'template_access_types'
:
TemplateAccessType
.
objects
.
exists
(),
'form'
:
TemplateRequestForm
(
request
=
request
)
,
'form'
:
TemplateRequestForm
(
request
=
request
)
})
})
return
self
.
render_to_response
(
context
)
return
self
.
render_to_response
(
context
)
def
__create_normal
(
self
,
request
,
template
,
*
args
,
**
kwargs
):
def
_create_from_plain_image
(
self
,
request
,
*
args
,
**
kwargs
):
pass
def
__create_normal
(
self
,
request
,
*
args
,
**
kwargs
):
instances
=
[
Instance
.
create_from_template
(
instances
=
[
Instance
.
create_from_template
(
template
=
template
,
template
=
template
,
owner
=
request
.
user
)]
owner
=
request
.
user
)]
return
self
.
__deploy
(
request
,
instances
)
return
self
.
__deploy
(
request
,
instances
)
def
__create_customized
(
self
,
request
,
template
,
*
args
,
**
kwargs
):
def
__create_customized
(
self
,
request
,
*
args
,
**
kwargs
):
user
=
request
.
user
user
=
request
.
user
# no form yet, using POST directly:
# no form yet, using POST directly:
form
=
self
.
form_class
(
form
=
self
.
form_class
(
...
@@ -1130,39 +1155,16 @@ class VmCreate(LoginRequiredMixin, TemplateView):
...
@@ -1130,39 +1155,16 @@ class VmCreate(LoginRequiredMixin, TemplateView):
return
HttpResponseRedirect
(
"
%
s#activity"
%
path
)
return
HttpResponseRedirect
(
"
%
s#activity"
%
path
)
def
post
(
self
,
request
,
*
args
,
**
kwargs
):
def
post
(
self
,
request
,
*
args
,
**
kwargs
):
user
=
request
.
user
#TODO: check if user can create VM
#TODO: limit chekcs
if
not
request
.
user
.
has_perm
(
'vm.create_vm'
):
raise
PermissionDenied
()
template
=
self
.
get_template
(
request
,
request
.
POST
.
get
(
"template"
))
# limit chekcs
try
:
limit
=
user
.
profile
.
instance_limit
except
Exception
as
e
:
logger
.
debug
(
'No profile or instance limit:
%
s'
,
e
)
else
:
try
:
amount
=
int
(
request
.
POST
.
get
(
"amount"
,
1
))
except
:
amount
=
limit
# TODO this should definitely use a Form
current
=
Instance
.
active
.
filter
(
owner
=
user
)
.
count
()
logger
.
debug
(
'current use:
%
d, limit:
%
d'
,
current
,
limit
)
if
current
+
amount
>
limit
:
messages
.
error
(
request
,
_
(
'Instance limit (
%
d) exceeded.'
)
%
limit
)
if
request
.
is_ajax
():
return
HttpResponse
(
json
.
dumps
({
'redirect'
:
'/'
}),
content_type
=
"application/json"
)
else
:
return
redirect
(
'/'
)
create_func
=
(
self
.
__create_normal
if
create_func
=
(
self
.
_create_from_plain_image
if
request
.
POST
.
get
(
"from_plain_image"
)
is
not
None
else
self
.
__create_normal
if
request
.
POST
.
get
(
"customized"
)
is
None
else
request
.
POST
.
get
(
"customized"
)
is
None
else
self
.
__create_customized
)
self
.
__create_customized
)
return
create_func
(
request
,
template
,
*
args
,
**
kwargs
)
return
create_func
(
request
,
*
args
,
**
kwargs
)
# @require_GET
# @require_GET
...
...
circle/network/forms.py
View file @
327e7892
...
@@ -362,6 +362,7 @@ class VxlanSuperUserForm(ModelForm):
...
@@ -362,6 +362,7 @@ class VxlanSuperUserForm(ModelForm):
'vlan'
,
'vlan'
,
'description'
,
'description'
,
'comment'
,
'comment'
,
'owner'
,
)
)
),
),
FormActions
(
FormActions
(
...
@@ -371,11 +372,6 @@ class VxlanSuperUserForm(ModelForm):
...
@@ -371,11 +372,6 @@ class VxlanSuperUserForm(ModelForm):
)
)
)
)
class
Meta
:
model
=
Vxlan
fields
=
(
'name'
,
'vni'
,
'vlan'
,
'description'
,
'comment'
,
)
class
VxlanForm
(
ModelForm
):
class
VxlanForm
(
ModelForm
):
helper
=
FormHelper
()
helper
=
FormHelper
()
helper
.
layout
=
Layout
(
helper
.
layout
=
Layout
(
...
@@ -394,7 +390,3 @@ class VxlanForm(ModelForm):
...
@@ -394,7 +390,3 @@ class VxlanForm(ModelForm):
'network.vxlan-list'
))
'network.vxlan-list'
))
)
)
)
)
class
Meta
:
model
=
Vxlan
fields
=
(
'name'
,
'description'
,
'comment'
,
'vni'
,
)
circle/network/models.py
View file @
327e7892
...
@@ -18,6 +18,7 @@
...
@@ -18,6 +18,7 @@
from
django.db
import
models
from
django.db
import
models
from
django.core.validators
import
MinValueValidator
,
MaxValueValidator
from
django.core.validators
import
MinValueValidator
,
MaxValueValidator
from
django.core.urlresolvers
import
reverse
from
django.core.urlresolvers
import
reverse
from
django.db.models
import
CharField
from
django.utils.translation
import
ugettext_lazy
as
_
from
django.utils.translation
import
ugettext_lazy
as
_
from
django.contrib.contenttypes.fields
import
(
from
django.contrib.contenttypes.fields
import
(
GenericRelation
,
GenericForeignKey
GenericRelation
,
GenericForeignKey
...
@@ -60,53 +61,12 @@ class Vxlan(models.Model):
...
@@ -60,53 +61,12 @@ class Vxlan(models.Model):
"""
"""
A virtual L2 network,
A virtual L2 network,
These networks are isolated by the vxlan (virtual extensible lan)
technology, which is commonly used by managed network switches
to partition the network, with a more scalable way opposite vlan
technology. Usually, it used over vlan networks.
Each vxlan network has a unique identifier (VNI), a name, and
a server vlan network.
"""
"""
os_network_id
=
CharField
(
blank
=
False
,
max_length
=
100
,
unique
=
True
)
# NOTE: VXLAN VNI's maximal value is 2^24-1, but MAC address generator
# only supports 2^12-1 maximal value.
vni
=
models
.
IntegerField
(
unique
=
True
,
verbose_name
=
_
(
'VNI'
),
help_text
=
_
(
'VXLAN Network Identifier.'
),
validators
=
[
MinValueValidator
(
0
),
MaxValueValidator
(
2
**
12
-
1
)])
vlan
=
models
.
ForeignKey
(
Vlan
,
verbose_name
=
_
(
'vlan'
),
help_text
=
_
(
'The server vlan.'
))
name
=
models
.
CharField
(
max_length
=
20
,
verbose_name
=
_
(
'Name'
),
help_text
=
_
(
'The short name of the '
'virtual network.'
),
validators
=
[
val_alfanum
])
description
=
models
.
TextField
(
blank
=
True
,
verbose_name
=
_
(
'description'
),
help_text
=
_
(
'Description of the goals and elements '
'of the virtual network.'
))
comment
=
models
.
TextField
(
blank
=
True
,
verbose_name
=
_
(
'comment'
),
help_text
=
_
(
'Notes, comments about the network'
))
created_at
=
models
.
DateTimeField
(
auto_now_add
=
True
,
verbose_name
=
_
(
'created at'
))
modified_at
=
models
.
DateTimeField
(
auto_now
=
True
,
verbose_name
=
_
(
'modified at'
))
editor_elements
=
GenericRelation
(
EditorElement
)
editor_elements
=
GenericRelation
(
EditorElement
)
class
Meta
:
class
Meta
:
app_label
=
'network'
app_label
=
'network'
verbose_name
=
_
(
"vxlan"
)
verbose_name_plural
=
_
(
"vxlans"
)
ordering
=
(
'vni'
,
)
permissions
=
(
(
'create_vxlan'
,
_
(
'Can create a Vxlan network.'
)),
)
def
__unicode__
(
self
):
def
__unicode__
(
self
):
return
self
.
name
return
self
.
name
...
...
circle/openstack_api/__init__.py
View file @
327e7892
...
@@ -33,10 +33,10 @@ Keystone/Nova/Glance/Swift et. al.
...
@@ -33,10 +33,10 @@ Keystone/Nova/Glance/Swift et. al.
"""
"""
from
openstack_api
import
base
from
openstack_api
import
base
# from openstack_api import cinder
# from openstack_api import cinder
#
from openstack_api import glance
from
openstack_api
import
glance
# from openstack_api import keystone
# from openstack_api import keystone
# from openstack_api import network
# from openstack_api import network
#
from openstack_api import neutron
from
openstack_api
import
neutron
from
openstack_api
import
nova
from
openstack_api
import
nova
# from openstack_api import swift
# from openstack_api import swift
...
...
circle/openstack_api/neutron.py
View file @
327e7892
...
@@ -32,14 +32,12 @@ from neutronclient.v2_0 import client as neutron_client
...
@@ -32,14 +32,12 @@ from neutronclient.v2_0 import client as neutron_client
from
novaclient
import
exceptions
as
nova_exc
from
novaclient
import
exceptions
as
nova_exc
import
six
import
six
from
horizon
import
exceptions
from
openstack_api
import
exceptions
from
horizon
import
messages
from
openstack_api
import
messages
from
horizon.utils.memoized
import
memoized
from
openstack_api.utils.memoized
import
memoized
from
openstack_dashboard.api
import
base
from
openstack_api
import
base
from
openstack_dashboard.api
import
nova
from
openstack_api
import
nova
from
openstack_dashboard.contrib.developer.profiler
import
api
as
profiler
from
openstack_api
import
policy
from
openstack_dashboard
import
policy
LOG
=
logging
.
getLogger
(
__name__
)
LOG
=
logging
.
getLogger
(
__name__
)
...
@@ -326,7 +324,7 @@ class SecurityGroupManager(object):
...
@@ -326,7 +324,7 @@ class SecurityGroupManager(object):
secgroups
=
self
.
client
.
list_security_groups
(
**
filters
)
secgroups
=
self
.
client
.
list_security_groups
(
**
filters
)
return
[
SecurityGroup
(
sg
)
for
sg
in
secgroups
.
get
(
'security_groups'
)]
return
[
SecurityGroup
(
sg
)
for
sg
in
secgroups
.
get
(
'security_groups'
)]
@profiler.trace
def
list
(
self
,
**
params
):
def
list
(
self
,
**
params
):
"""Fetches a list all security groups.
"""Fetches a list all security groups.
...
@@ -348,7 +346,7 @@ class SecurityGroupManager(object):
...
@@ -348,7 +346,7 @@ class SecurityGroupManager(object):
related_sgs
=
related_sgs
.
get
(
'security_groups'
)
related_sgs
=
related_sgs
.
get
(
'security_groups'
)
return
dict
((
sg
[
'id'
],
sg
[
'name'
])
for
sg
in
related_sgs
)
return
dict
((
sg
[
'id'
],
sg
[
'name'
])
for
sg
in
related_sgs
)
@profiler.trace
def
get
(
self
,
sg_id
):
def
get
(
self
,
sg_id
):
"""Fetches the security group.
"""Fetches the security group.
...
@@ -358,7 +356,7 @@ class SecurityGroupManager(object):
...
@@ -358,7 +356,7 @@ class SecurityGroupManager(object):
sg_dict
=
self
.
_sg_name_dict
(
sg_id
,
secgroup
[
'security_group_rules'
])
sg_dict
=
self
.
_sg_name_dict
(
sg_id
,
secgroup
[
'security_group_rules'
])
return
SecurityGroup
(
secgroup
,
sg_dict
)
return
SecurityGroup
(
secgroup
,
sg_dict
)
@profiler.trace
def
create
(
self
,
name
,
desc
):
def
create
(
self
,
name
,
desc
):
"""Create a new security group.
"""Create a new security group.
...
@@ -370,19 +368,19 @@ class SecurityGroupManager(object):
...
@@ -370,19 +368,19 @@ class SecurityGroupManager(object):
secgroup
=
self
.
client
.
create_security_group
(
body
)
secgroup
=
self
.
client
.
create_security_group
(
body
)
return
SecurityGroup
(
secgroup
.
get
(
'security_group'
))
return
SecurityGroup
(
secgroup
.
get
(
'security_group'
))
@profiler.trace
def
update
(
self
,
sg_id
,
name
,
desc
):
def
update
(
self
,
sg_id
,
name
,
desc
):
body
=
{
'security_group'
:
{
'name'
:
name
,
body
=
{
'security_group'
:
{
'name'
:
name
,
'description'
:
desc
}}
'description'
:
desc
}}
secgroup
=
self
.
client
.
update_security_group
(
sg_id
,
body
)
secgroup
=
self
.
client
.
update_security_group
(
sg_id
,
body
)
return
SecurityGroup
(
secgroup
.
get
(
'security_group'
))
return
SecurityGroup
(
secgroup
.
get
(
'security_group'
))
@profiler.trace
def
delete
(
self
,
sg_id
):
def
delete
(
self
,
sg_id
):
"""Delete the specified security group."""
"""Delete the specified security group."""
self
.
client
.
delete_security_group
(
sg_id
)
self
.
client
.
delete_security_group
(
sg_id
)
@profiler.trace
def
rule_create
(
self
,
parent_group_id
,
def
rule_create
(
self
,
parent_group_id
,
direction
=
None
,
ethertype
=
None
,
direction
=
None
,
ethertype
=
None
,
ip_protocol
=
None
,
from_port
=
None
,
to_port
=
None
,
ip_protocol
=
None
,
from_port
=
None
,
to_port
=
None
,
...
@@ -429,12 +427,12 @@ class SecurityGroupManager(object):
...
@@ -429,12 +427,12 @@ class SecurityGroupManager(object):
sg_dict
=
self
.
_sg_name_dict
(
parent_group_id
,
[
rule
])
sg_dict
=
self
.
_sg_name_dict
(
parent_group_id
,
[
rule
])
return
SecurityGroupRule
(
rule
,
sg_dict
)
return
SecurityGroupRule
(
rule
,
sg_dict
)
@profiler.trace
def
rule_delete
(
self
,
sgr_id
):
def
rule_delete
(
self
,
sgr_id
):
"""Delete the specified security group rule."""
"""Delete the specified security group rule."""
self
.
client
.
delete_security_group_rule
(
sgr_id
)
self
.
client
.
delete_security_group_rule
(
sgr_id
)
@profiler.trace
def
list_by_instance
(
self
,
instance_id
):
def
list_by_instance
(
self
,
instance_id
):
"""Gets security groups of an instance.
"""Gets security groups of an instance.
...
@@ -446,7 +444,7 @@ class SecurityGroupManager(object):
...
@@ -446,7 +444,7 @@ class SecurityGroupManager(object):
sg_ids
+=
p
.
security_groups
sg_ids
+=
p
.
security_groups
return
self
.
_list
(
id
=
set
(
sg_ids
))
if
sg_ids
else
[]
return
self
.
_list
(
id
=
set
(
sg_ids
))
if
sg_ids
else
[]
@profiler.trace
def
update_instance_security_group
(
self
,
instance_id
,
def
update_instance_security_group
(
self
,
instance_id
,
new_security_group_ids
):
new_security_group_ids
):
"""Update security groups of a specified instance."""
"""Update security groups of a specified instance."""
...
@@ -516,7 +514,7 @@ class FloatingIpManager(object):
...
@@ -516,7 +514,7 @@ class FloatingIpManager(object):
self
.
request
=
request
self
.
request
=
request
self
.
client
=
neutronclient
(
request
)
self
.
client
=
neutronclient
(
request
)
@profiler.trace
def
list_pools
(
self
):
def
list_pools
(
self
):
"""Fetches a list of all floating IP pools.
"""Fetches a list of all floating IP pools.
...
@@ -543,7 +541,7 @@ class FloatingIpManager(object):
...
@@ -543,7 +541,7 @@ class FloatingIpManager(object):
fip
[
'instance_id'
]
=
None
fip
[
'instance_id'
]
=
None
fip
[
'instance_type'
]
=
None
fip
[
'instance_type'
]
=
None
@profiler.trace
def
list
(
self
,
all_tenants
=
False
,
**
search_opts
):
def
list
(
self
,
all_tenants
=
False
,
**
search_opts
):
"""Fetches a list of all floating IPs.
"""Fetches a list of all floating IPs.
...
@@ -568,7 +566,7 @@ class FloatingIpManager(object):
...
@@ -568,7 +566,7 @@ class FloatingIpManager(object):
self
.
_set_instance_info
(
fip
,
port_dict
.
get
(
fip
[
'port_id'
]))
self
.
_set_instance_info
(
fip
,
port_dict
.
get
(
fip
[
'port_id'
]))
return
[
FloatingIp
(
fip
)
for
fip
in
fips
]
return
[
FloatingIp
(
fip
)
for
fip
in
fips
]
@profiler.trace
def
get
(
self
,
floating_ip_id
):
def
get
(
self
,
floating_ip_id
):
"""Fetches the floating IP.
"""Fetches the floating IP.
...
@@ -578,7 +576,7 @@ class FloatingIpManager(object):
...
@@ -578,7 +576,7 @@ class FloatingIpManager(object):
self
.
_set_instance_info
(
fip
)
self
.
_set_instance_info
(
fip
)
return
FloatingIp
(
fip
)
return
FloatingIp
(
fip
)
@profiler.trace
def
allocate
(
self
,
pool
,
tenant_id
=
None
,
**
params
):
def
allocate
(
self
,
pool
,
tenant_id
=
None
,
**
params
):
"""Allocates a floating IP to the tenant.
"""Allocates a floating IP to the tenant.
...
@@ -602,12 +600,12 @@ class FloatingIpManager(object):
...
@@ -602,12 +600,12 @@ class FloatingIpManager(object):
self
.
_set_instance_info
(
fip
)
self
.
_set_instance_info
(
fip
)
return
FloatingIp
(
fip
)
return
FloatingIp
(
fip
)
@profiler.trace
def
release
(
self
,
floating_ip_id
):
def
release
(
self
,
floating_ip_id
):
"""Releases a floating IP specified."""
"""Releases a floating IP specified."""
self
.
client
.
delete_floatingip
(
floating_ip_id
)
self
.
client
.
delete_floatingip
(
floating_ip_id
)
@profiler.trace
def
associate
(
self
,
floating_ip_id
,
port_id
):
def
associate
(
self
,
floating_ip_id
,
port_id
):
"""Associates the floating IP to the port.
"""Associates the floating IP to the port.
...
@@ -625,7 +623,7 @@ class FloatingIpManager(object):
...
@@ -625,7 +623,7 @@ class FloatingIpManager(object):
self
.
client
.
update_floatingip
(
floating_ip_id
,
self
.
client
.
update_floatingip
(
floating_ip_id
,
{
'floatingip'
:
update_dict
})
{
'floatingip'
:
update_dict
})
@profiler.trace
def
disassociate
(
self
,
floating_ip_id
):
def
disassociate
(
self
,
floating_ip_id
):
"""Disassociates the floating IP specified."""
"""Disassociates the floating IP specified."""
update_dict
=
{
'port_id'
:
None
}
update_dict
=
{
'port_id'
:
None
}
...
@@ -659,7 +657,7 @@ class FloatingIpManager(object):
...
@@ -659,7 +657,7 @@ class FloatingIpManager(object):
for
s
in
n
.
subnets
])
for
s
in
n
.
subnets
])
return
reachable_subnets
|
shared
return
reachable_subnets
|
shared
@profiler.trace
def
list_targets
(
self
):
def
list_targets
(
self
):
"""Returns a list of association targets of instance VIFs.
"""Returns a list of association targets of instance VIFs.
...
@@ -699,7 +697,7 @@ class FloatingIpManager(object):
...
@@ -699,7 +697,7 @@ class FloatingIpManager(object):
search_opts
=
{
'device_id'
:
instance_id
}
search_opts
=
{
'device_id'
:
instance_id
}
return
port_list
(
self
.
request
,
**
search_opts
)
return
port_list
(
self
.
request
,
**
search_opts
)
@profiler.trace
def
list_targets_by_instance
(
self
,
instance_id
,
target_list
=
None
):
def
list_targets_by_instance
(
self
,
instance_id
,
target_list
=
None
):
"""Returns a list of FloatingIpTarget objects of FIP association.
"""Returns a list of FloatingIpTarget objects of FIP association.
...
@@ -771,7 +769,7 @@ def neutronclient(request):
...
@@ -771,7 +769,7 @@ def neutronclient(request):
return
c
return
c
@profiler.trace
def
list_resources_with_long_filters
(
list_method
,
def
list_resources_with_long_filters
(
list_method
,
filter_attr
,
filter_values
,
**
params
):
filter_attr
,
filter_values
,
**
params
):
"""List neutron resources with handling RequestURITooLong exception.
"""List neutron resources with handling RequestURITooLong exception.
...
@@ -826,21 +824,21 @@ def list_resources_with_long_filters(list_method,
...
@@ -826,21 +824,21 @@ def list_resources_with_long_filters(list_method,
return
resources
return
resources
@profiler.trace
def
trunk_show
(
request
,
trunk_id
):
def
trunk_show
(
request
,
trunk_id
):
LOG
.
debug
(
"trunk_show(): trunk_id=
%
s"
,
trunk_id
)
LOG
.
debug
(
"trunk_show(): trunk_id=
%
s"
,
trunk_id
)
trunk
=
neutronclient
(
request
)
.
show_trunk
(
trunk_id
)
.
get
(
'trunk'
)
trunk
=
neutronclient
(
request
)
.
show_trunk
(
trunk_id
)
.
get
(
'trunk'
)
return
Trunk
(
trunk
)
return
Trunk
(
trunk
)
@profiler.trace
def
trunk_list
(
request
,
**
params
):
def
trunk_list
(
request
,
**
params
):
LOG
.
debug
(
"trunk_list(): params=
%
s"
,
params
)
LOG
.
debug
(
"trunk_list(): params=
%
s"
,
params
)
trunks
=
neutronclient
(
request
)
.
list_trunks
(
**
params
)
.
get
(
'trunks'
)
trunks
=
neutronclient
(
request
)
.
list_trunks
(
**
params
)
.
get
(
'trunks'
)
return
[
Trunk
(
t
)
for
t
in
trunks
]
return
[
Trunk
(
t
)
for
t
in
trunks
]
@profiler.trace
def
trunk_create
(
request
,
**
params
):
def
trunk_create
(
request
,
**
params
):
LOG
.
debug
(
"trunk_create(): params=
%
s"
,
params
)
LOG
.
debug
(
"trunk_create(): params=
%
s"
,
params
)
if
'project_id'
not
in
params
:
if
'project_id'
not
in
params
:
...
@@ -850,7 +848,7 @@ def trunk_create(request, **params):
...
@@ -850,7 +848,7 @@ def trunk_create(request, **params):
return
Trunk
(
trunk
)
return
Trunk
(
trunk
)
@profiler.trace
def
trunk_delete
(
request
,
trunk_id
):
def
trunk_delete
(
request
,
trunk_id
):
LOG
.
debug
(
"trunk_delete(): trunk_id=
%
s"
,
trunk_id
)
LOG
.
debug
(
"trunk_delete(): trunk_id=
%
s"
,
trunk_id
)
neutronclient
(
request
)
.
delete_trunk
(
trunk_id
)
neutronclient
(
request
)
.
delete_trunk
(
trunk_id
)
...
@@ -871,7 +869,7 @@ def _prepare_body_add_subports(subports):
...
@@ -871,7 +869,7 @@ def _prepare_body_add_subports(subports):
return
{
'sub_ports'
:
subports
}
return
{
'sub_ports'
:
subports
}
@profiler.trace
def
trunk_update
(
request
,
trunk_id
,
old_trunk
,
new_trunk
):
def
trunk_update
(
request
,
trunk_id
,
old_trunk
,
new_trunk
):
"""Handle update to a trunk in (at most) three neutron calls.
"""Handle update to a trunk in (at most) three neutron calls.
...
@@ -960,7 +958,7 @@ def trunk_update(request, trunk_id, old_trunk, new_trunk):
...
@@ -960,7 +958,7 @@ def trunk_update(request, trunk_id, old_trunk, new_trunk):
return
Trunk
(
trunk
)
return
Trunk
(
trunk
)
@profiler.trace
def
network_list
(
request
,
**
params
):
def
network_list
(
request
,
**
params
):
LOG
.
debug
(
"network_list(): params=
%
s"
,
params
)
LOG
.
debug
(
"network_list(): params=
%
s"
,
params
)
networks
=
neutronclient
(
request
)
.
list_networks
(
**
params
)
.
get
(
'networks'
)
networks
=
neutronclient
(
request
)
.
list_networks
(
**
params
)
.
get
(
'networks'
)
...
@@ -976,7 +974,7 @@ def network_list(request, **params):
...
@@ -976,7 +974,7 @@ def network_list(request, **params):
return
[
Network
(
n
)
for
n
in
networks
]
return
[
Network
(
n
)
for
n
in
networks
]
@profiler.trace
def
network_list_for_tenant
(
request
,
tenant_id
,
include_external
=
False
,
def
network_list_for_tenant
(
request
,
tenant_id
,
include_external
=
False
,
**
params
):
**
params
):
"""Return a network list available for the tenant.
"""Return a network list available for the tenant.
...
@@ -1019,7 +1017,7 @@ def network_list_for_tenant(request, tenant_id, include_external=False,
...
@@ -1019,7 +1017,7 @@ def network_list_for_tenant(request, tenant_id, include_external=False,
return
networks
return
networks
@profiler.trace
def
network_get
(
request
,
network_id
,
expand_subnet
=
True
,
**
params
):
def
network_get
(
request
,
network_id
,
expand_subnet
=
True
,
**
params
):
LOG
.
debug
(
"network_get(): netid=
%(network_id)
s, params=
%(params)
s"
,
LOG
.
debug
(
"network_get(): netid=
%(network_id)
s, params=
%(params)
s"
,
{
'network_id'
:
network_id
,
'params'
:
params
})
{
'network_id'
:
network_id
,
'params'
:
params
})
...
@@ -1046,7 +1044,7 @@ def network_get(request, network_id, expand_subnet=True, **params):
...
@@ -1046,7 +1044,7 @@ def network_get(request, network_id, expand_subnet=True, **params):
return
Network
(
network
)
return
Network
(
network
)
@profiler.trace
def
network_create
(
request
,
**
kwargs
):
def
network_create
(
request
,
**
kwargs
):
"""Create a network object.
"""Create a network object.
...
@@ -1063,7 +1061,7 @@ def network_create(request, **kwargs):
...
@@ -1063,7 +1061,7 @@ def network_create(request, **kwargs):
return
Network
(
network
)
return
Network
(
network
)
@profiler.trace
def
network_update
(
request
,
network_id
,
**
kwargs
):
def
network_update
(
request
,
network_id
,
**
kwargs
):
LOG
.
debug
(
"network_update(): netid=
%(network_id)
s, params=
%(params)
s"
,
LOG
.
debug
(
"network_update(): netid=
%(network_id)
s, params=
%(params)
s"
,
{
'network_id'
:
network_id
,
'params'
:
kwargs
})
{
'network_id'
:
network_id
,
'params'
:
kwargs
})
...
@@ -1073,13 +1071,13 @@ def network_update(request, network_id, **kwargs):
...
@@ -1073,13 +1071,13 @@ def network_update(request, network_id, **kwargs):
return
Network
(
network
)
return
Network
(
network
)
@profiler.trace
def
network_delete
(
request
,
network_id
):
def
network_delete
(
request
,
network_id
):
LOG
.
debug
(
"network_delete(): netid=
%
s"
,
network_id
)
LOG
.
debug
(
"network_delete(): netid=
%
s"
,
network_id
)
neutronclient
(
request
)
.
delete_network
(
network_id
)
neutronclient
(
request
)
.
delete_network
(
network_id
)
@profiler.trace
@memoized
@memoized
def
subnet_list
(
request
,
**
params
):
def
subnet_list
(
request
,
**
params
):
LOG
.
debug
(
"subnet_list(): params=
%
s"
,
params
)
LOG
.
debug
(
"subnet_list(): params=
%
s"
,
params
)
...
@@ -1087,7 +1085,7 @@ def subnet_list(request, **params):
...
@@ -1087,7 +1085,7 @@ def subnet_list(request, **params):
return
[
Subnet
(
s
)
for
s
in
subnets
]
return
[
Subnet
(
s
)
for
s
in
subnets
]
@profiler.trace
def
subnet_get
(
request
,
subnet_id
,
**
params
):
def
subnet_get
(
request
,
subnet_id
,
**
params
):
LOG
.
debug
(
"subnet_get(): subnetid=
%(subnet_id)
s, params=
%(params)
s"
,
LOG
.
debug
(
"subnet_get(): subnetid=
%(subnet_id)
s, params=
%(params)
s"
,
{
'subnet_id'
:
subnet_id
,
'params'
:
params
})
{
'subnet_id'
:
subnet_id
,
'params'
:
params
})
...
@@ -1096,7 +1094,7 @@ def subnet_get(request, subnet_id, **params):
...
@@ -1096,7 +1094,7 @@ def subnet_get(request, subnet_id, **params):
return
Subnet
(
subnet
)
return
Subnet
(
subnet
)
@profiler.trace
def
subnet_create
(
request
,
network_id
,
**
kwargs
):
def
subnet_create
(
request
,
network_id
,
**
kwargs
):
"""Create a subnet on a specified network.
"""Create a subnet on a specified network.
...
@@ -1125,7 +1123,7 @@ def subnet_create(request, network_id, **kwargs):
...
@@ -1125,7 +1123,7 @@ def subnet_create(request, network_id, **kwargs):
return
Subnet
(
subnet
)
return
Subnet
(
subnet
)
@profiler.trace
def
subnet_update
(
request
,
subnet_id
,
**
kwargs
):
def
subnet_update
(
request
,
subnet_id
,
**
kwargs
):
LOG
.
debug
(
"subnet_update(): subnetid=
%(subnet_id)
s, kwargs=
%(kwargs)
s"
,
LOG
.
debug
(
"subnet_update(): subnetid=
%(subnet_id)
s, kwargs=
%(kwargs)
s"
,
{
'subnet_id'
:
subnet_id
,
'kwargs'
:
kwargs
})
{
'subnet_id'
:
subnet_id
,
'kwargs'
:
kwargs
})
...
@@ -1135,13 +1133,13 @@ def subnet_update(request, subnet_id, **kwargs):
...
@@ -1135,13 +1133,13 @@ def subnet_update(request, subnet_id, **kwargs):
return
Subnet
(
subnet
)
return
Subnet
(
subnet
)
@profiler.trace
def
subnet_delete
(
request
,
subnet_id
):
def
subnet_delete
(
request
,
subnet_id
):
LOG
.
debug
(
"subnet_delete(): subnetid=
%
s"
,
subnet_id
)
LOG
.
debug
(
"subnet_delete(): subnetid=
%
s"
,
subnet_id
)
neutronclient
(
request
)
.
delete_subnet
(
subnet_id
)
neutronclient
(
request
)
.
delete_subnet
(
subnet_id
)
@profiler.trace
def
subnetpool_list
(
request
,
**
params
):
def
subnetpool_list
(
request
,
**
params
):
LOG
.
debug
(
"subnetpool_list(): params=
%
s"
,
params
)
LOG
.
debug
(
"subnetpool_list(): params=
%
s"
,
params
)
subnetpools
=
\
subnetpools
=
\
...
@@ -1149,7 +1147,7 @@ def subnetpool_list(request, **params):
...
@@ -1149,7 +1147,7 @@ def subnetpool_list(request, **params):
return
[
SubnetPool
(
s
)
for
s
in
subnetpools
]
return
[
SubnetPool
(
s
)
for
s
in
subnetpools
]
@profiler.trace
def
subnetpool_get
(
request
,
subnetpool_id
,
**
params
):
def
subnetpool_get
(
request
,
subnetpool_id
,
**
params
):
LOG
.
debug
(
"subnetpool_get(): subnetpoolid=
%(subnetpool_id)
s, "
LOG
.
debug
(
"subnetpool_get(): subnetpoolid=
%(subnetpool_id)
s, "
"params=
%(params)
s"
,
{
'subnetpool_id'
:
subnetpool_id
,
"params=
%(params)
s"
,
{
'subnetpool_id'
:
subnetpool_id
,
...
@@ -1160,7 +1158,7 @@ def subnetpool_get(request, subnetpool_id, **params):
...
@@ -1160,7 +1158,7 @@ def subnetpool_get(request, subnetpool_id, **params):
return
SubnetPool
(
subnetpool
)
return
SubnetPool
(
subnetpool
)
@profiler.trace
def
subnetpool_create
(
request
,
name
,
prefixes
,
**
kwargs
):
def
subnetpool_create
(
request
,
name
,
prefixes
,
**
kwargs
):
"""Create a subnetpool.
"""Create a subnetpool.
...
@@ -1198,7 +1196,7 @@ def subnetpool_create(request, name, prefixes, **kwargs):
...
@@ -1198,7 +1196,7 @@ def subnetpool_create(request, name, prefixes, **kwargs):
return
SubnetPool
(
subnetpool
)
return
SubnetPool
(
subnetpool
)
@profiler.trace
def
subnetpool_update
(
request
,
subnetpool_id
,
**
kwargs
):
def
subnetpool_update
(
request
,
subnetpool_id
,
**
kwargs
):
LOG
.
debug
(
"subnetpool_update(): subnetpoolid=
%(subnetpool_id)
s, "
LOG
.
debug
(
"subnetpool_update(): subnetpoolid=
%(subnetpool_id)
s, "
"kwargs=
%(kwargs)
s"
,
{
'subnetpool_id'
:
subnetpool_id
,
"kwargs=
%(kwargs)
s"
,
{
'subnetpool_id'
:
subnetpool_id
,
...
@@ -1210,13 +1208,13 @@ def subnetpool_update(request, subnetpool_id, **kwargs):
...
@@ -1210,13 +1208,13 @@ def subnetpool_update(request, subnetpool_id, **kwargs):
return
SubnetPool
(
subnetpool
)
return
SubnetPool
(
subnetpool
)
@profiler.trace
def
subnetpool_delete
(
request
,
subnetpool_id
):
def
subnetpool_delete
(
request
,
subnetpool_id
):
LOG
.
debug
(
"subnetpool_delete(): subnetpoolid=
%
s"
,
subnetpool_id
)
LOG
.
debug
(
"subnetpool_delete(): subnetpoolid=
%
s"
,
subnetpool_id
)
return
neutronclient
(
request
)
.
delete_subnetpool
(
subnetpool_id
)
return
neutronclient
(
request
)
.
delete_subnetpool
(
subnetpool_id
)
@profiler.trace
@memoized
@memoized
def
port_list
(
request
,
**
params
):
def
port_list
(
request
,
**
params
):
LOG
.
debug
(
"port_list(): params=
%
s"
,
params
)
LOG
.
debug
(
"port_list(): params=
%
s"
,
params
)
...
@@ -1224,7 +1222,7 @@ def port_list(request, **params):
...
@@ -1224,7 +1222,7 @@ def port_list(request, **params):
return
[
Port
(
p
)
for
p
in
ports
]
return
[
Port
(
p
)
for
p
in
ports
]
@profiler.trace
@memoized
@memoized
def
port_list_with_trunk_types
(
request
,
**
params
):
def
port_list_with_trunk_types
(
request
,
**
params
):
"""List neutron Ports for this tenant with possible TrunkPort indicated
"""List neutron Ports for this tenant with possible TrunkPort indicated
...
@@ -1269,7 +1267,7 @@ def port_list_with_trunk_types(request, **params):
...
@@ -1269,7 +1267,7 @@ def port_list_with_trunk_types(request, **params):
return
[
_get_port_info
(
p
)
for
p
in
ports
]
return
[
_get_port_info
(
p
)
for
p
in
ports
]
@profiler.trace
def
port_get
(
request
,
port_id
,
**
params
):
def
port_get
(
request
,
port_id
,
**
params
):
LOG
.
debug
(
"port_get(): portid=
%(port_id)
s, params=
%(params)
s"
,
LOG
.
debug
(
"port_get(): portid=
%(port_id)
s, params=
%(params)
s"
,
{
'port_id'
:
port_id
,
'params'
:
params
})
{
'port_id'
:
port_id
,
'params'
:
params
})
...
@@ -1284,7 +1282,7 @@ def unescape_port_kwargs(**kwargs):
...
@@ -1284,7 +1282,7 @@ def unescape_port_kwargs(**kwargs):
return
kwargs
return
kwargs
@profiler.trace
def
port_create
(
request
,
network_id
,
**
kwargs
):
def
port_create
(
request
,
network_id
,
**
kwargs
):
"""Create a port on a specified network.
"""Create a port on a specified network.
...
@@ -1306,13 +1304,13 @@ def port_create(request, network_id, **kwargs):
...
@@ -1306,13 +1304,13 @@ def port_create(request, network_id, **kwargs):
return
Port
(
port
)
return
Port
(
port
)
@profiler.trace
def
port_delete
(
request
,
port_id
):
def
port_delete
(
request
,
port_id
):
LOG
.
debug
(
"port_delete(): portid=
%
s"
,
port_id
)
LOG
.
debug
(
"port_delete(): portid=
%
s"
,
port_id
)
neutronclient
(
request
)
.
delete_port
(
port_id
)
neutronclient
(
request
)
.
delete_port
(
port_id
)
@profiler.trace
def
port_update
(
request
,
port_id
,
**
kwargs
):
def
port_update
(
request
,
port_id
,
**
kwargs
):
LOG
.
debug
(
"port_update(): portid=
%(port_id)
s, kwargs=
%(kwargs)
s"
,
LOG
.
debug
(
"port_update(): portid=
%(port_id)
s, kwargs=
%(kwargs)
s"
,
{
'port_id'
:
port_id
,
'kwargs'
:
kwargs
})
{
'port_id'
:
port_id
,
'kwargs'
:
kwargs
})
...
@@ -1322,7 +1320,7 @@ def port_update(request, port_id, **kwargs):
...
@@ -1322,7 +1320,7 @@ def port_update(request, port_id, **kwargs):
return
Port
(
port
)
return
Port
(
port
)
@profiler.trace
def
router_create
(
request
,
**
kwargs
):
def
router_create
(
request
,
**
kwargs
):
LOG
.
debug
(
"router_create():, kwargs=
%
s"
,
kwargs
)
LOG
.
debug
(
"router_create():, kwargs=
%
s"
,
kwargs
)
body
=
{
'router'
:
{}}
body
=
{
'router'
:
{}}
...
@@ -1333,7 +1331,7 @@ def router_create(request, **kwargs):
...
@@ -1333,7 +1331,7 @@ def router_create(request, **kwargs):
return
Router
(
router
)
return
Router
(
router
)
@profiler.trace
def
router_update
(
request
,
r_id
,
**
kwargs
):
def
router_update
(
request
,
r_id
,
**
kwargs
):
LOG
.
debug
(
"router_update(): router_id=
%(r_id)
s, kwargs=
%(kwargs)
s"
,
LOG
.
debug
(
"router_update(): router_id=
%(r_id)
s, kwargs=
%(kwargs)
s"
,
{
'r_id'
:
r_id
,
'kwargs'
:
kwargs
})
{
'r_id'
:
r_id
,
'kwargs'
:
kwargs
})
...
@@ -1343,20 +1341,20 @@ def router_update(request, r_id, **kwargs):
...
@@ -1343,20 +1341,20 @@ def router_update(request, r_id, **kwargs):
return
Router
(
router
[
'router'
])
return
Router
(
router
[
'router'
])
@profiler.trace
def
router_get
(
request
,
router_id
,
**
params
):
def
router_get
(
request
,
router_id
,
**
params
):
router
=
neutronclient
(
request
)
.
show_router
(
router_id
,
router
=
neutronclient
(
request
)
.
show_router
(
router_id
,
**
params
)
.
get
(
'router'
)
**
params
)
.
get
(
'router'
)
return
Router
(
router
)
return
Router
(
router
)
@profiler.trace
def
router_list
(
request
,
**
params
):
def
router_list
(
request
,
**
params
):
routers
=
neutronclient
(
request
)
.
list_routers
(
**
params
)
.
get
(
'routers'
)
routers
=
neutronclient
(
request
)
.
list_routers
(
**
params
)
.
get
(
'routers'
)
return
[
Router
(
r
)
for
r
in
routers
]
return
[
Router
(
r
)
for
r
in
routers
]
@profiler.trace
def
router_list_on_l3_agent
(
request
,
l3_agent_id
,
**
params
):
def
router_list_on_l3_agent
(
request
,
l3_agent_id
,
**
params
):
routers
=
neutronclient
(
request
)
.
\
routers
=
neutronclient
(
request
)
.
\
list_routers_on_l3_agent
(
l3_agent_id
,
list_routers_on_l3_agent
(
l3_agent_id
,
...
@@ -1364,12 +1362,12 @@ def router_list_on_l3_agent(request, l3_agent_id, **params):
...
@@ -1364,12 +1362,12 @@ def router_list_on_l3_agent(request, l3_agent_id, **params):
return
[
Router
(
r
)
for
r
in
routers
]
return
[
Router
(
r
)
for
r
in
routers
]
@profiler.trace
def
router_delete
(
request
,
router_id
):
def
router_delete
(
request
,
router_id
):
neutronclient
(
request
)
.
delete_router
(
router_id
)
neutronclient
(
request
)
.
delete_router
(
router_id
)
@profiler.trace
def
router_add_interface
(
request
,
router_id
,
subnet_id
=
None
,
port_id
=
None
):
def
router_add_interface
(
request
,
router_id
,
subnet_id
=
None
,
port_id
=
None
):
body
=
{}
body
=
{}
if
subnet_id
:
if
subnet_id
:
...
@@ -1380,7 +1378,7 @@ def router_add_interface(request, router_id, subnet_id=None, port_id=None):
...
@@ -1380,7 +1378,7 @@ def router_add_interface(request, router_id, subnet_id=None, port_id=None):
return
client
.
add_interface_router
(
router_id
,
body
)
return
client
.
add_interface_router
(
router_id
,
body
)
@profiler.trace
def
router_remove_interface
(
request
,
router_id
,
subnet_id
=
None
,
port_id
=
None
):
def
router_remove_interface
(
request
,
router_id
,
subnet_id
=
None
,
port_id
=
None
):
body
=
{}
body
=
{}
if
subnet_id
:
if
subnet_id
:
...
@@ -1390,7 +1388,7 @@ def router_remove_interface(request, router_id, subnet_id=None, port_id=None):
...
@@ -1390,7 +1388,7 @@ def router_remove_interface(request, router_id, subnet_id=None, port_id=None):
neutronclient
(
request
)
.
remove_interface_router
(
router_id
,
body
)
neutronclient
(
request
)
.
remove_interface_router
(
router_id
,
body
)
@profiler.trace
def
router_add_gateway
(
request
,
router_id
,
network_id
,
enable_snat
=
None
):
def
router_add_gateway
(
request
,
router_id
,
network_id
,
enable_snat
=
None
):
body
=
{
'network_id'
:
network_id
}
body
=
{
'network_id'
:
network_id
}
if
enable_snat
is
not
None
:
if
enable_snat
is
not
None
:
...
@@ -1398,12 +1396,12 @@ def router_add_gateway(request, router_id, network_id, enable_snat=None):
...
@@ -1398,12 +1396,12 @@ def router_add_gateway(request, router_id, network_id, enable_snat=None):
neutronclient
(
request
)
.
add_gateway_router
(
router_id
,
body
)
neutronclient
(
request
)
.
add_gateway_router
(
router_id
,
body
)
@profiler.trace
def
router_remove_gateway
(
request
,
router_id
):
def
router_remove_gateway
(
request
,
router_id
):
neutronclient
(
request
)
.
remove_gateway_router
(
router_id
)
neutronclient
(
request
)
.
remove_gateway_router
(
router_id
)
@profiler.trace
def
router_static_route_list
(
request
,
router_id
=
None
):
def
router_static_route_list
(
request
,
router_id
=
None
):
router
=
router_get
(
request
,
router_id
)
router
=
router_get
(
request
,
router_id
)
try
:
try
:
...
@@ -1416,7 +1414,7 @@ def router_static_route_list(request, router_id=None):
...
@@ -1416,7 +1414,7 @@ def router_static_route_list(request, router_id=None):
return
routes
return
routes
@profiler.trace
def
router_static_route_remove
(
request
,
router_id
,
route_ids
):
def
router_static_route_remove
(
request
,
router_id
,
route_ids
):
currentroutes
=
router_static_route_list
(
request
,
router_id
=
router_id
)
currentroutes
=
router_static_route_list
(
request
,
router_id
=
router_id
)
newroutes
=
[]
newroutes
=
[]
...
@@ -1429,7 +1427,7 @@ def router_static_route_remove(request, router_id, route_ids):
...
@@ -1429,7 +1427,7 @@ def router_static_route_remove(request, router_id, route_ids):
return
new
return
new
@profiler.trace
def
router_static_route_add
(
request
,
router_id
,
newroute
):
def
router_static_route_add
(
request
,
router_id
,
newroute
):
body
=
{}
body
=
{}
currentroutes
=
router_static_route_list
(
request
,
router_id
=
router_id
)
currentroutes
=
router_static_route_list
(
request
,
router_id
=
router_id
)
...
@@ -1440,71 +1438,71 @@ def router_static_route_add(request, router_id, newroute):
...
@@ -1440,71 +1438,71 @@ def router_static_route_add(request, router_id, newroute):
return
new
return
new
@profiler.trace
def
tenant_quota_get
(
request
,
tenant_id
):
def
tenant_quota_get
(
request
,
tenant_id
):
return
base
.
QuotaSet
(
neutronclient
(
request
)
.
show_quota
(
tenant_id
)[
'quota'
])
return
base
.
QuotaSet
(
neutronclient
(
request
)
.
show_quota
(
tenant_id
)[
'quota'
])
@profiler.trace
def
tenant_quota_update
(
request
,
tenant_id
,
**
kwargs
):
def
tenant_quota_update
(
request
,
tenant_id
,
**
kwargs
):
quotas
=
{
'quota'
:
kwargs
}
quotas
=
{
'quota'
:
kwargs
}
return
neutronclient
(
request
)
.
update_quota
(
tenant_id
,
quotas
)
return
neutronclient
(
request
)
.
update_quota
(
tenant_id
,
quotas
)
@profiler.trace
def
tenant_quota_detail_get
(
request
,
tenant_id
=
None
):
def
tenant_quota_detail_get
(
request
,
tenant_id
=
None
):
tenant_id
=
tenant_id
or
request
.
user
.
tenant_id
tenant_id
=
tenant_id
or
request
.
user
.
tenant_id
response
=
neutronclient
(
request
)
.
get
(
'/quotas/
%
s/details'
%
tenant_id
)
response
=
neutronclient
(
request
)
.
get
(
'/quotas/
%
s/details'
%
tenant_id
)
return
response
[
'quota'
]
return
response
[
'quota'
]
@profiler.trace
def
default_quota_get
(
request
,
tenant_id
=
None
):
def
default_quota_get
(
request
,
tenant_id
=
None
):
tenant_id
=
tenant_id
or
request
.
user
.
tenant_id
tenant_id
=
tenant_id
or
request
.
user
.
tenant_id
response
=
neutronclient
(
request
)
.
show_quota_default
(
tenant_id
)
response
=
neutronclient
(
request
)
.
show_quota_default
(
tenant_id
)
return
base
.
QuotaSet
(
response
[
'quota'
])
return
base
.
QuotaSet
(
response
[
'quota'
])
@profiler.trace
def
agent_list
(
request
,
**
params
):
def
agent_list
(
request
,
**
params
):
agents
=
neutronclient
(
request
)
.
list_agents
(
**
params
)
agents
=
neutronclient
(
request
)
.
list_agents
(
**
params
)
return
[
Agent
(
a
)
for
a
in
agents
[
'agents'
]]
return
[
Agent
(
a
)
for
a
in
agents
[
'agents'
]]
@profiler.trace
def
list_dhcp_agent_hosting_networks
(
request
,
network
,
**
params
):
def
list_dhcp_agent_hosting_networks
(
request
,
network
,
**
params
):
agents
=
neutronclient
(
request
)
.
list_dhcp_agent_hosting_networks
(
network
,
agents
=
neutronclient
(
request
)
.
list_dhcp_agent_hosting_networks
(
network
,
**
params
)
**
params
)
return
[
Agent
(
a
)
for
a
in
agents
[
'agents'
]]
return
[
Agent
(
a
)
for
a
in
agents
[
'agents'
]]
@profiler.trace
def
list_l3_agent_hosting_router
(
request
,
router
,
**
params
):
def
list_l3_agent_hosting_router
(
request
,
router
,
**
params
):
agents
=
neutronclient
(
request
)
.
list_l3_agent_hosting_routers
(
router
,
agents
=
neutronclient
(
request
)
.
list_l3_agent_hosting_routers
(
router
,
**
params
)
**
params
)
return
[
Agent
(
a
)
for
a
in
agents
[
'agents'
]]
return
[
Agent
(
a
)
for
a
in
agents
[
'agents'
]]
@profiler.trace
def
show_network_ip_availability
(
request
,
network_id
):
def
show_network_ip_availability
(
request
,
network_id
):
ip_availability
=
neutronclient
(
request
)
.
show_network_ip_availability
(
ip_availability
=
neutronclient
(
request
)
.
show_network_ip_availability
(
network_id
)
network_id
)
return
ip_availability
return
ip_availability
@profiler.trace
def
add_network_to_dhcp_agent
(
request
,
dhcp_agent
,
network_id
):
def
add_network_to_dhcp_agent
(
request
,
dhcp_agent
,
network_id
):
body
=
{
'network_id'
:
network_id
}
body
=
{
'network_id'
:
network_id
}
return
neutronclient
(
request
)
.
add_network_to_dhcp_agent
(
dhcp_agent
,
body
)
return
neutronclient
(
request
)
.
add_network_to_dhcp_agent
(
dhcp_agent
,
body
)
@profiler.trace
def
remove_network_from_dhcp_agent
(
request
,
dhcp_agent
,
network_id
):
def
remove_network_from_dhcp_agent
(
request
,
dhcp_agent
,
network_id
):
return
neutronclient
(
request
)
.
remove_network_from_dhcp_agent
(
dhcp_agent
,
return
neutronclient
(
request
)
.
remove_network_from_dhcp_agent
(
dhcp_agent
,
network_id
)
network_id
)
@profiler.trace
def
provider_list
(
request
):
def
provider_list
(
request
):
providers
=
neutronclient
(
request
)
.
list_service_providers
()
providers
=
neutronclient
(
request
)
.
list_service_providers
()
return
providers
[
'service_providers'
]
return
providers
[
'service_providers'
]
...
@@ -1603,7 +1601,7 @@ def server_update_security_groups(request, instance_id,
...
@@ -1603,7 +1601,7 @@ def server_update_security_groups(request, instance_id,
# TODO(pkarikh) need to uncomment when osprofiler will have no
# TODO(pkarikh) need to uncomment when osprofiler will have no
# issues with unicode in:
# issues with unicode in:
# openstack_dashboard/test/test_data/nova_data.py#L470 data
# openstack_dashboard/test/test_data/nova_data.py#L470 data
#
@profiler.trace
#
def
servers_update_addresses
(
request
,
servers
,
all_tenants
=
False
):
def
servers_update_addresses
(
request
,
servers
,
all_tenants
=
False
):
"""Retrieve servers networking information from Neutron if enabled.
"""Retrieve servers networking information from Neutron if enabled.
...
@@ -1703,7 +1701,7 @@ def _server_get_addresses(request, server, ports, floating_ips, network_names):
...
@@ -1703,7 +1701,7 @@ def _server_get_addresses(request, server, ports, floating_ips, network_names):
return
dict
(
addresses
)
return
dict
(
addresses
)
@profiler.trace
@memoized
@memoized
def
list_extensions
(
request
):
def
list_extensions
(
request
):
try
:
try
:
...
@@ -1716,7 +1714,7 @@ def list_extensions(request):
...
@@ -1716,7 +1714,7 @@ def list_extensions(request):
return
()
return
()
@profiler.trace
@memoized
@memoized
def
is_extension_supported
(
request
,
extension_alias
):
def
is_extension_supported
(
request
,
extension_alias
):
extensions
=
list_extensions
(
request
)
extensions
=
list_extensions
(
request
)
...
@@ -1872,7 +1870,7 @@ def policy_list(request, **kwargs):
...
@@ -1872,7 +1870,7 @@ def policy_list(request, **kwargs):
return
[
QoSPolicy
(
p
)
for
p
in
policies
]
return
[
QoSPolicy
(
p
)
for
p
in
policies
]
@profiler.trace
def
policy_get
(
request
,
policy_id
,
**
kwargs
):
def
policy_get
(
request
,
policy_id
,
**
kwargs
):
"""Get QoS policy for a given policy id."""
"""Get QoS policy for a given policy id."""
policy
=
neutronclient
(
request
)
.
show_qos_policy
(
policy
=
neutronclient
(
request
)
.
show_qos_policy
(
...
@@ -1880,7 +1878,7 @@ def policy_get(request, policy_id, **kwargs):
...
@@ -1880,7 +1878,7 @@ def policy_get(request, policy_id, **kwargs):
return
QoSPolicy
(
policy
)
return
QoSPolicy
(
policy
)
@profiler.trace
def
list_availability_zones
(
request
,
resource
=
None
,
state
=
None
):
def
list_availability_zones
(
request
,
resource
=
None
,
state
=
None
):
az_list
=
neutronclient
(
request
)
.
list_availability_zones
()
.
get
(
az_list
=
neutronclient
(
request
)
.
list_availability_zones
()
.
get
(
'availability_zones'
)
'availability_zones'
)
...
...
circle/openstack_api/nova.py
View file @
327e7892
...
@@ -506,16 +506,16 @@ def keypair_get(request, name):
...
@@ -506,16 +506,16 @@ def keypair_get(request, name):
def
server_create
(
request
,
name
,
image
,
flavor
,
key_name
,
user_data
,
def
server_create
(
request
,
name
,
image
,
flavor
,
key_name
=
None
,
user_data
=
None
,
security_groups
,
block_device_mapping
=
None
,
security_groups
=
None
,
block_device_mapping
=
None
,
block_device_mapping_v2
=
None
,
nics
=
None
,
block_device_mapping_v2
=
None
,
nics
=
"auto"
,
availability_zone
=
None
,
instance_count
=
1
,
admin_pass
=
None
,
availability_zone
=
None
,
instance_count
=
1
,
admin_pass
=
None
,
disk_config
=
None
,
config_drive
=
None
,
meta
=
None
,
disk_config
=
None
,
config_drive
=
None
,
meta
=
None
,
scheduler_hints
=
None
,
description
=
None
):
scheduler_hints
=
None
,
description
=
None
):
kwargs
=
{}
kwargs
=
{}
if
description
is
not
None
:
if
description
is
not
None
:
kwargs
[
'description'
]
=
description
kwargs
[
'description'
]
=
description
return
Instance
Server
(
get_novaclient_with_instance_desc
(
request
)
.
servers
.
create
(
return
Server
(
get_novaclient_with_instance_desc
(
request
)
.
servers
.
create
(
name
.
strip
(),
image
,
flavor
,
userdata
=
user_data
,
name
.
strip
(),
image
,
flavor
,
userdata
=
user_data
,
security_groups
=
security_groups
,
security_groups
=
security_groups
,
key_name
=
key_name
,
block_device_mapping
=
block_device_mapping
,
key_name
=
key_name
,
block_device_mapping
=
block_device_mapping
,
...
...
circle/openstack_api/policy.py
0 → 100644
View file @
327e7892
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from
openstack_api.utils
import
settings
as
utils_settings
def
check
(
actions
,
request
,
target
=
None
):
"""Wrapper of the configurable policy method."""
policy_check
=
utils_settings
.
import_setting
(
"POLICY_CHECK_FUNCTION"
)
if
policy_check
:
return
policy_check
(
actions
,
request
,
target
)
return
True
class
PolicyTargetMixin
(
object
):
"""Mixin that adds the get_policy_target function
policy_target_attrs - a tuple of tuples which defines
the relationship between attributes in the policy
target dict and attributes in the passed datum object.
policy_target_attrs can be overwritten by sub-classes
which do not use the default, so they can neatly define
their policy target information, without overriding the
entire get_policy_target function.
"""
policy_target_attrs
=
((
"project_id"
,
"tenant_id"
),
(
"tenant_id"
,
"tenant_id"
),
(
"user_id"
,
"user_id"
),
(
"domain_id"
,
"domain_id"
),
(
"target.project.domain_id"
,
"domain_id"
),
(
"target.user.domain_id"
,
"domain_id"
),
(
"target.group.domain_id"
,
"domain_id"
))
def
get_policy_target
(
self
,
request
,
datum
=
None
):
policy_target
=
{}
for
policy_attr
,
datum_attr
in
self
.
policy_target_attrs
:
if
datum
:
policy_target
[
policy_attr
]
=
getattr
(
datum
,
datum_attr
,
None
)
else
:
policy_target
[
policy_attr
]
=
None
return
policy_target
circle/request/urls.py
View file @
327e7892
...
@@ -29,7 +29,7 @@ from .views import (
...
@@ -29,7 +29,7 @@ from .views import (
urlpatterns
=
[
urlpatterns
=
[
url
(
r'^list/$'
,
RequestList
.
as_view
(),
url
(
r'^list/$'
,
RequestList
.
as_view
(),
name
=
"request.views.request-list"
),
name
=
"request.views.request-list"
),
url
(
r'^(?P<pk>
\d+
)/$'
,
RequestDetail
.
as_view
(),
url
(
r'^(?P<pk>
[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
)/$'
,
RequestDetail
.
as_view
(),
name
=
"request.views.request-detail"
),
name
=
"request.views.request-detail"
),
url
(
r'^type/list/$'
,
RequestTypeList
.
as_view
(),
url
(
r'^type/list/$'
,
RequestTypeList
.
as_view
(),
...
@@ -55,10 +55,10 @@ urlpatterns = [
...
@@ -55,10 +55,10 @@ urlpatterns = [
# request views (visible for users)
# request views (visible for users)
url
(
r'template/$'
,
TemplateRequestView
.
as_view
(),
url
(
r'template/$'
,
TemplateRequestView
.
as_view
(),
name
=
"request.views.request-template"
),
name
=
"request.views.request-template"
),
url
(
r'lease/(?P<vm_pk>
\d+
)/$'
,
LeaseRequestView
.
as_view
(),
url
(
r'lease/(?P<vm_pk>
[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
)/$'
,
LeaseRequestView
.
as_view
(),
name
=
"request.views.request-lease"
),
name
=
"request.views.request-lease"
),
url
(
r'resource/(?P<vm_pk>
\d+
)/$'
,
ResourceRequestView
.
as_view
(),
url
(
r'resource/(?P<vm_pk>
[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
)/$'
,
ResourceRequestView
.
as_view
(),
name
=
"request.views.request-resource"
),
name
=
"request.views.request-resource"
),
url
(
r'resize/(?P<vm_pk>
\d+)/(?P<disk_pk>\d+
)/$'
,
url
(
r'resize/(?P<vm_pk>
[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/(?P<disk_pk>[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
)/$'
,
ResizeRequestView
.
as_view
(),
name
=
"request.views.request-resize"
),
ResizeRequestView
.
as_view
(),
name
=
"request.views.request-resize"
),
]
]
circle/vm/models/instance.py
View file @
327e7892
...
@@ -305,6 +305,10 @@ class Instance(OperatedMixin, TimeStampedModel):
...
@@ -305,6 +305,10 @@ class Instance(OperatedMixin, TimeStampedModel):
return
" "
.
join
(
s
for
s
in
parts
if
s
!=
""
)
return
" "
.
join
(
s
for
s
in
parts
if
s
!=
""
)
@property
@property
def
pk
(
self
):
return
self
.
os_server_id
@property
def
name
(
self
):
def
name
(
self
):
return
self
.
_os_server
.
name
return
self
.
_os_server
.
name
...
@@ -470,7 +474,7 @@ class Instance(OperatedMixin, TimeStampedModel):
...
@@ -470,7 +474,7 @@ class Instance(OperatedMixin, TimeStampedModel):
@permalink
@permalink
def
get_absolute_url
(
self
):
def
get_absolute_url
(
self
):
return
(
'dashboard.views.detail'
,
None
,
{
'pk'
:
self
.
id
})
return
(
'dashboard.views.detail'
,
None
,
{
'pk'
:
self
.
os_server_
id
})
@property
@property
def
vm_name
(
self
):
def
vm_name
(
self
):
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment