Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
Fukász Rómeó Ervin
/
cloud
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
317e11b7
authored
Apr 09, 2014
by
Kálmán Viktor
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dashboard: template wizard draft 2
parent
f1402363
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
549 additions
and
5 deletions
+549
-5
circle/dashboard/static/dashboard/bootstrap-tour.min.css
+20
-0
circle/dashboard/static/dashboard/bootstrap-tour.min.js
+20
-0
circle/dashboard/static/dashboard/vm-tour.js
+130
-0
circle/dashboard/templates/base.html
+1
-0
circle/dashboard/templates/dashboard/_template-create-1.html
+2
-1
circle/dashboard/templates/dashboard/vm-detail.html
+49
-2
circle/dashboard/templates/dashboard/vm-detail/resources.html
+1
-1
circle/dashboard/views.py
+16
-1
circle/vm/migrations/0022_auto__add_field_instance_is_base.py
+309
-0
circle/vm/models/instance.py
+1
-0
No files found.
circle/dashboard/static/dashboard/bootstrap-tour.min.css
0 → 100644
View file @
317e11b7
/* ===========================================================
# bootstrap-tour - v0.9.1
# http://bootstraptour.com
# ==============================================================
# Copyright 2012-2013 Ulrich Sossou
#
# 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.
*/
.tour-backdrop
{
position
:
fixed
;
top
:
0
;
right
:
0
;
bottom
:
0
;
left
:
0
;
z-index
:
1100
;
background-color
:
#000
;
opacity
:
.8
}
.tour-step-backdrop
{
position
:
relative
;
z-index
:
1101
;
background
:
inherit
}
.tour-step-background
{
position
:
absolute
;
z-index
:
1100
;
background
:
inherit
;
border-radius
:
6px
}
.popover
[
class
*=
tour-
]
{
z-index
:
1100
}
.popover
[
class
*=
tour-
]
.popover-navigation
{
padding
:
9px
14px
}
.popover
[
class
*=
tour-
]
.popover-navigation
[
data-role
=
end
]
{
float
:
right
}
.popover
[
class
*=
tour-
]
.popover-navigation
[
data-role
=
prev
],
.popover
[
class
*=
tour-
]
.popover-navigation
[
data-role
=
next
],
.popover
[
class
*=
tour-
]
.popover-navigation
[
data-role
=
end
]
{
cursor
:
pointer
}
.popover
[
class
*=
tour-
]
.popover-navigation
[
data-role
=
prev
]
.disabled
,
.popover
[
class
*=
tour-
]
.popover-navigation
[
data-role
=
next
]
.disabled
,
.popover
[
class
*=
tour-
]
.popover-navigation
[
data-role
=
end
]
.disabled
{
cursor
:
default
}
.popover
[
class
*=
tour-
]
.orphan
{
position
:
fixed
;
margin-top
:
0
}
.popover
[
class
*=
tour-
]
.orphan
.arrow
{
display
:
none
}
\ No newline at end of file
circle/dashboard/static/dashboard/bootstrap-tour.min.js
0 → 100644
View file @
317e11b7
/* ===========================================================
# bootstrap-tour - v0.9.1
# http://bootstraptour.com
# ==============================================================
# Copyright 2012-2013 Ulrich Sossou
#
# 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.
*/
!
function
(
a
,
b
){
var
c
,
d
;
return
d
=
b
.
document
,
c
=
function
(){
function
c
(
c
){
this
.
_options
=
a
.
extend
({
name
:
"tour"
,
steps
:[],
container
:
"body"
,
keyboard
:
!
0
,
storage
:
b
.
localStorage
,
debug
:
!
1
,
backdrop
:
!
1
,
redirect
:
!
0
,
orphan
:
!
1
,
duration
:
!
1
,
basePath
:
""
,
template
:
"<div class='popover'> <div class='arrow'></div> <h3 class='popover-title'></h3> <div class='popover-content'></div> <div class='popover-navigation'> <div class='btn-group'> <button class='btn btn-sm btn-default' data-role='prev'>« Prev</button> <button class='btn btn-sm btn-default' data-role='next'>Next »</button> <button class='btn btn-sm btn-default' data-role='pause-resume' data-pause-text='Pause' data-resume-text='Resume'>Pause</button> </div> <button class='btn btn-sm btn-default' data-role='end'>End tour</button> </div> </div>"
,
afterSetState
:
function
(){},
afterGetState
:
function
(){},
afterRemoveState
:
function
(){},
onStart
:
function
(){},
onEnd
:
function
(){},
onShow
:
function
(){},
onShown
:
function
(){},
onHide
:
function
(){},
onHidden
:
function
(){},
onNext
:
function
(){},
onPrev
:
function
(){},
onPause
:
function
(){},
onResume
:
function
(){}},
c
),
this
.
_force
=!
1
,
this
.
_inited
=!
1
,
this
.
backdrop
=
{
overlay
:
null
,
$element
:
null
,
$background
:
null
,
backgroundShown
:
!
1
,
overlayElementShown
:
!
1
}}
return
c
.
prototype
.
addSteps
=
function
(
a
){
var
b
,
c
,
d
;
for
(
c
=
0
,
d
=
a
.
length
;
d
>
c
;
c
++
)
b
=
a
[
c
],
this
.
addStep
(
b
);
return
this
},
c
.
prototype
.
addStep
=
function
(
a
){
return
this
.
_options
.
steps
.
push
(
a
),
this
},
c
.
prototype
.
getStep
=
function
(
b
){
return
null
!=
this
.
_options
.
steps
[
b
]?
a
.
extend
({
id
:
"step-"
+
b
,
path
:
""
,
placement
:
"right"
,
title
:
""
,
content
:
"<p></p>"
,
next
:
b
===
this
.
_options
.
steps
.
length
-
1
?
-
1
:
b
+
1
,
prev
:
b
-
1
,
animation
:
!
0
,
container
:
this
.
_options
.
container
,
backdrop
:
this
.
_options
.
backdrop
,
redirect
:
this
.
_options
.
redirect
,
orphan
:
this
.
_options
.
orphan
,
duration
:
this
.
_options
.
duration
,
template
:
this
.
_options
.
template
,
onShow
:
this
.
_options
.
onShow
,
onShown
:
this
.
_options
.
onShown
,
onHide
:
this
.
_options
.
onHide
,
onHidden
:
this
.
_options
.
onHidden
,
onNext
:
this
.
_options
.
onNext
,
onPrev
:
this
.
_options
.
onPrev
,
onPause
:
this
.
_options
.
onPause
,
onResume
:
this
.
_options
.
onResume
},
this
.
_options
.
steps
[
b
]):
void
0
},
c
.
prototype
.
init
=
function
(
a
){
return
this
.
_force
=
a
,
this
.
ended
()?(
this
.
_debug
(
"Tour ended, init prevented."
),
this
):(
this
.
setCurrentStep
(),
this
.
_initMouseNavigation
(),
this
.
_initKeyboardNavigation
(),
this
.
_onResize
(
function
(
a
){
return
function
(){
return
a
.
showStep
(
a
.
_current
)}}(
this
)),
null
!==
this
.
_current
&&
this
.
showStep
(
this
.
_current
),
this
.
_inited
=!
0
,
this
)},
c
.
prototype
.
start
=
function
(
a
){
var
b
;
return
null
==
a
&&
(
a
=!
1
),
this
.
_inited
||
this
.
init
(
a
),
null
===
this
.
_current
&&
(
b
=
this
.
_makePromise
(
null
!=
this
.
_options
.
onStart
?
this
.
_options
.
onStart
(
this
):
void
0
),
this
.
_callOnPromiseDone
(
b
,
this
.
showStep
,
0
)),
this
},
c
.
prototype
.
next
=
function
(){
var
a
;
return
a
=
this
.
hideStep
(
this
.
_current
),
this
.
_callOnPromiseDone
(
a
,
this
.
_showNextStep
)},
c
.
prototype
.
prev
=
function
(){
var
a
;
return
a
=
this
.
hideStep
(
this
.
_current
),
this
.
_callOnPromiseDone
(
a
,
this
.
_showPrevStep
)},
c
.
prototype
.
goTo
=
function
(
a
){
var
b
;
return
b
=
this
.
hideStep
(
this
.
_current
),
this
.
_callOnPromiseDone
(
b
,
this
.
showStep
,
a
)},
c
.
prototype
.
end
=
function
(){
var
c
,
e
;
return
c
=
function
(
c
){
return
function
(){
return
a
(
d
).
off
(
"click.tour-"
+
c
.
_options
.
name
),
a
(
d
).
off
(
"keyup.tour-"
+
c
.
_options
.
name
),
a
(
b
).
off
(
"resize.tour-"
+
c
.
_options
.
name
),
c
.
_setState
(
"end"
,
"yes"
),
c
.
_inited
=!
1
,
c
.
_force
=!
1
,
c
.
_clearTimer
(),
null
!=
c
.
_options
.
onEnd
?
c
.
_options
.
onEnd
(
c
):
void
0
}}(
this
),
e
=
this
.
hideStep
(
this
.
_current
),
this
.
_callOnPromiseDone
(
e
,
c
)},
c
.
prototype
.
ended
=
function
(){
return
!
this
.
_force
&&!!
this
.
_getState
(
"end"
)},
c
.
prototype
.
restart
=
function
(){
return
this
.
_removeState
(
"current_step"
),
this
.
_removeState
(
"end"
),
this
.
setCurrentStep
(
0
),
this
.
start
()},
c
.
prototype
.
pause
=
function
(){
var
a
;
return
a
=
this
.
getStep
(
this
.
_current
),
a
&&
a
.
duration
?(
this
.
_paused
=!
0
,
this
.
_duration
-=
(
new
Date
).
getTime
()
-
this
.
_start
,
b
.
clearTimeout
(
this
.
_timer
),
this
.
_debug
(
"Paused/Stopped step "
+
(
this
.
_current
+
1
)
+
" timer ("
+
this
.
_duration
+
" remaining)."
),
null
!=
a
.
onPause
?
a
.
onPause
(
this
,
this
.
_duration
):
void
0
):
this
},
c
.
prototype
.
resume
=
function
(){
var
a
;
return
a
=
this
.
getStep
(
this
.
_current
),
a
&&
a
.
duration
?(
this
.
_paused
=!
1
,
this
.
_start
=
(
new
Date
).
getTime
(),
this
.
_duration
=
this
.
_duration
||
a
.
duration
,
this
.
_timer
=
b
.
setTimeout
(
function
(
a
){
return
function
(){
return
a
.
_isLast
()?
a
.
next
():
a
.
end
()}}(
this
),
this
.
_duration
),
this
.
_debug
(
"Started step "
+
(
this
.
_current
+
1
)
+
" timer with duration "
+
this
.
_duration
),
null
!=
a
.
onResume
&&
this
.
_duration
!==
a
.
duration
?
a
.
onResume
(
this
,
this
.
_duration
):
void
0
):
this
},
c
.
prototype
.
hideStep
=
function
(
b
){
var
c
,
d
,
e
;
return
(
e
=
this
.
getStep
(
b
))?(
this
.
_clearTimer
(),
d
=
this
.
_makePromise
(
null
!=
e
.
onHide
?
e
.
onHide
(
this
,
b
):
void
0
),
c
=
function
(
c
){
return
function
(){
var
d
;
return
d
=
a
(
e
.
element
),
d
.
data
(
"bs.popover"
)
||
d
.
data
(
"popover"
)
||
(
d
=
a
(
"body"
)),
d
.
popover
(
"destroy"
).
removeClass
(
"tour-"
+
c
.
_options
.
name
+
"-element tour-"
+
c
.
_options
.
name
+
"-"
+
b
+
"-element"
),
e
.
reflex
&&
d
.
css
(
"cursor"
,
""
).
off
(
"click.tour-"
+
c
.
_options
.
name
),
e
.
backdrop
&&
c
.
_hideBackdrop
(),
null
!=
e
.
onHidden
?
e
.
onHidden
(
c
):
void
0
}}(
this
),
this
.
_callOnPromiseDone
(
d
,
c
),
d
):
void
0
},
c
.
prototype
.
showStep
=
function
(
a
){
var
b
,
c
,
e
,
f
;
return
this
.
ended
()?(
this
.
_debug
(
"Tour ended, showStep prevented."
),
this
):(
f
=
this
.
getStep
(
a
))?(
e
=
a
<
this
.
_current
,
b
=
this
.
_makePromise
(
null
!=
f
.
onShow
?
f
.
onShow
(
this
,
a
):
void
0
),
c
=
function
(
b
){
return
function
(){
var
c
,
g
;
if
(
b
.
setCurrentStep
(
a
),
g
=
function
(){
switch
({}.
toString
.
call
(
f
.
path
)){
case
"[object Function]"
:
return
f
.
path
();
case
"[object String]"
:
return
this
.
_options
.
basePath
+
f
.
path
;
default
:
return
f
.
path
}}.
call
(
b
),
c
=
[
d
.
location
.
pathname
,
d
.
location
.
hash
].
join
(
""
),
b
.
_isRedirect
(
g
,
c
))
return
void
b
.
_redirect
(
f
,
g
);
if
(
b
.
_isOrphan
(
f
)){
if
(
!
f
.
orphan
)
return
b
.
_debug
(
"Skip the orphan step "
+
(
b
.
_current
+
1
)
+
". Orphan option is false and the element doesn't exist or is hidden."
),
void
(
e
?
b
.
_showPrevStep
():
b
.
_showNextStep
());
b
.
_debug
(
"Show the orphan step "
+
(
b
.
_current
+
1
)
+
". Orphans option is true."
)}
return
f
.
backdrop
&&
b
.
_showBackdrop
(
b
.
_isOrphan
(
f
)?
void
0
:
f
.
element
),
b
.
_scrollIntoView
(
f
.
element
,
function
(){
return
null
!=
f
.
element
&&
f
.
backdrop
&&
b
.
_showOverlayElement
(
f
.
element
),
b
.
_showPopover
(
f
,
a
),
null
!=
f
.
onShown
&&
f
.
onShown
(
b
),
b
.
_debug
(
"Step "
+
(
b
.
_current
+
1
)
+
" of "
+
b
.
_options
.
steps
.
length
)}),
f
.
duration
?
b
.
resume
():
void
0
}}(
this
),
this
.
_callOnPromiseDone
(
b
,
c
),
b
):
void
0
},
c
.
prototype
.
getCurrentStep
=
function
(){
return
this
.
_current
},
c
.
prototype
.
setCurrentStep
=
function
(
a
){
return
null
!=
a
?(
this
.
_current
=
a
,
this
.
_setState
(
"current_step"
,
a
)):(
this
.
_current
=
this
.
_getState
(
"current_step"
),
this
.
_current
=
null
===
this
.
_current
?
null
:
parseInt
(
this
.
_current
,
10
)),
this
},
c
.
prototype
.
_setState
=
function
(
a
,
b
){
var
c
,
d
;
if
(
this
.
_options
.
storage
){
d
=
""
+
this
.
_options
.
name
+
"_"
+
a
;
try
{
this
.
_options
.
storage
.
setItem
(
d
,
b
)}
catch
(
e
){
c
=
e
,
c
.
code
===
DOMException
.
QUOTA_EXCEEDED_ERR
&&
this
.
debug
(
"LocalStorage quota exceeded. State storage failed."
)}
return
this
.
_options
.
afterSetState
(
d
,
b
)}
return
null
==
this
.
_state
&&
(
this
.
_state
=
{}),
this
.
_state
[
a
]
=
b
},
c
.
prototype
.
_removeState
=
function
(
a
){
var
b
;
return
this
.
_options
.
storage
?(
b
=
""
+
this
.
_options
.
name
+
"_"
+
a
,
this
.
_options
.
storage
.
removeItem
(
b
),
this
.
_options
.
afterRemoveState
(
b
)):
null
!=
this
.
_state
?
delete
this
.
_state
[
a
]:
void
0
},
c
.
prototype
.
_getState
=
function
(
a
){
var
b
,
c
;
return
this
.
_options
.
storage
?(
b
=
""
+
this
.
_options
.
name
+
"_"
+
a
,
c
=
this
.
_options
.
storage
.
getItem
(
b
)):
null
!=
this
.
_state
&&
(
c
=
this
.
_state
[
a
]),(
void
0
===
c
||
"null"
===
c
)
&&
(
c
=
null
),
this
.
_options
.
afterGetState
(
a
,
c
),
c
},
c
.
prototype
.
_showNextStep
=
function
(){
var
a
,
b
,
c
;
return
c
=
this
.
getStep
(
this
.
_current
),
b
=
function
(
a
){
return
function
(){
return
a
.
showStep
(
c
.
next
)}}(
this
),
a
=
this
.
_makePromise
(
null
!=
c
.
onNext
?
c
.
onNext
(
this
):
void
0
),
this
.
_callOnPromiseDone
(
a
,
b
)},
c
.
prototype
.
_showPrevStep
=
function
(){
var
a
,
b
,
c
;
return
c
=
this
.
getStep
(
this
.
_current
),
b
=
function
(
a
){
return
function
(){
return
a
.
showStep
(
c
.
prev
)}}(
this
),
a
=
this
.
_makePromise
(
null
!=
c
.
onPrev
?
c
.
onPrev
(
this
):
void
0
),
this
.
_callOnPromiseDone
(
a
,
b
)},
c
.
prototype
.
_debug
=
function
(
a
){
return
this
.
_options
.
debug
?
b
.
console
.
log
(
"Bootstrap Tour '"
+
this
.
_options
.
name
+
"' | "
+
a
):
void
0
},
c
.
prototype
.
_isRedirect
=
function
(
a
,
b
){
return
null
!=
a
&&
""
!==
a
&&
(
"[object RegExp]"
===
toString
.
call
(
a
)
&&!
a
.
test
(
b
)
||
"[object String]"
===
toString
.
call
(
a
)
&&
a
.
replace
(
/
\?
.*$/
,
""
).
replace
(
/
\/?
$/
,
""
)
!==
b
.
replace
(
/
\/?
$/
,
""
))},
c
.
prototype
.
_redirect
=
function
(
b
,
c
){
return
a
.
isFunction
(
b
.
redirect
)?
b
.
redirect
.
call
(
this
,
c
):
b
.
redirect
===!
0
?(
this
.
_debug
(
"Redirect to "
+
c
),
d
.
location
.
href
=
c
):
void
0
},
c
.
prototype
.
_isOrphan
=
function
(
b
){
return
null
==
b
.
element
||!
a
(
b
.
element
).
length
||
a
(
b
.
element
).
is
(
":hidden"
)
&&
"http://www.w3.org/2000/svg"
!==
a
(
b
.
element
)[
0
].
namespaceURI
},
c
.
prototype
.
_isLast
=
function
(){
return
this
.
_current
<
this
.
_options
.
steps
.
length
-
1
},
c
.
prototype
.
_showPopover
=
function
(
b
,
c
){
var
d
,
e
,
f
,
g
,
h
,
i
;
return
i
=
a
.
extend
({},
this
.
_options
),
f
=
a
(
a
.
isFunction
(
b
.
template
)?
b
.
template
(
c
,
b
):
b
.
template
),
e
=
f
.
find
(
".popover-navigation"
),
h
=
this
.
_isOrphan
(
b
),
h
&&
(
b
.
element
=
"body"
,
b
.
placement
=
"top"
,
f
=
f
.
addClass
(
"orphan"
)),
d
=
a
(
b
.
element
),
f
.
addClass
(
"tour-"
+
this
.
_options
.
name
+
" tour-"
+
this
.
_options
.
name
+
"-"
+
c
),
d
.
addClass
(
"tour-"
+
this
.
_options
.
name
+
"-element tour-"
+
this
.
_options
.
name
+
"-"
+
c
+
"-element"
),
b
.
options
&&
a
.
extend
(
i
,
b
.
options
),
b
.
reflex
&&
d
.
css
(
"cursor"
,
"pointer"
).
on
(
"click.tour-"
+
this
.
_options
.
name
,
function
(
a
){
return
function
(){
return
a
.
_isLast
()?
a
.
next
():
a
.
end
()}}(
this
)),
b
.
prev
<
0
&&
e
.
find
(
"[data-role='prev']"
).
addClass
(
"disabled"
),
b
.
next
<
0
&&
e
.
find
(
"[data-role='next']"
).
addClass
(
"disabled"
),
b
.
duration
||
e
.
find
(
"[data-role='pause-resume']"
).
remove
(),
b
.
template
=
f
.
clone
().
wrap
(
"<div>"
).
parent
().
html
(),
d
.
popover
({
placement
:
b
.
placement
,
trigger
:
"manual"
,
title
:
b
.
title
,
content
:
b
.
content
,
html
:
!
0
,
animation
:
b
.
animation
,
container
:
b
.
container
,
template
:
b
.
template
,
selector
:
b
.
element
}).
popover
(
"show"
),
g
=
d
.
data
(
"bs.popover"
)?
d
.
data
(
"bs.popover"
).
tip
():
d
.
data
(
"popover"
).
tip
(),
g
.
attr
(
"id"
,
b
.
id
),
this
.
_reposition
(
g
,
b
),
h
?
this
.
_center
(
g
):
void
0
},
c
.
prototype
.
_reposition
=
function
(
b
,
c
){
var
e
,
f
,
g
,
h
,
i
,
j
,
k
;
if
(
h
=
b
[
0
].
offsetWidth
,
f
=
b
[
0
].
offsetHeight
,
k
=
b
.
offset
(),
i
=
k
.
left
,
j
=
k
.
top
,
e
=
a
(
d
).
outerHeight
()
-
k
.
top
-
b
.
outerHeight
(),
0
>
e
&&
(
k
.
top
=
k
.
top
+
e
),
g
=
a
(
"html"
).
outerWidth
()
-
k
.
left
-
b
.
outerWidth
(),
0
>
g
&&
(
k
.
left
=
k
.
left
+
g
),
k
.
top
<
0
&&
(
k
.
top
=
0
),
k
.
left
<
0
&&
(
k
.
left
=
0
),
b
.
offset
(
k
),
"bottom"
===
c
.
placement
||
"top"
===
c
.
placement
){
if
(
i
!==
k
.
left
)
return
this
.
_replaceArrow
(
b
,
2
*
(
k
.
left
-
i
),
h
,
"left"
)}
else
if
(
j
!==
k
.
top
)
return
this
.
_replaceArrow
(
b
,
2
*
(
k
.
top
-
j
),
f
,
"top"
)},
c
.
prototype
.
_center
=
function
(
c
){
return
c
.
css
(
"top"
,
a
(
b
).
outerHeight
()
/
2
-
c
.
outerHeight
()
/
2
)},
c
.
prototype
.
_replaceArrow
=
function
(
a
,
b
,
c
,
d
){
return
a
.
find
(
".arrow"
).
css
(
d
,
b
?
50
*
(
1
-
b
/
c
)
+
"%"
:
""
)},
c
.
prototype
.
_scrollIntoView
=
function
(
c
,
d
){
var
e
,
f
,
g
,
h
,
i
,
j
;
return
e
=
a
(
c
),
e
.
length
?(
f
=
a
(
b
),
h
=
e
.
offset
().
top
,
j
=
f
.
height
(),
i
=
Math
.
max
(
0
,
h
-
j
/
2
),
this
.
_debug
(
"Scroll into view. ScrollTop: "
+
i
+
". Element offset: "
+
h
+
". Window height: "
+
j
+
"."
),
g
=
0
,
a
(
"body,html"
).
stop
(
!
0
,
!
0
).
animate
({
scrollTop
:
Math
.
ceil
(
i
)},
function
(
a
){
return
function
(){
return
2
===++
g
?(
d
(),
a
.
_debug
(
"Scroll into view. Animation end element offset: "
+
e
.
offset
().
top
+
". Window height: "
+
f
.
height
()
+
"."
)):
void
0
}}(
this
))):
d
()},
c
.
prototype
.
_onResize
=
function
(
c
,
d
){
return
a
(
b
).
on
(
"resize.tour-"
+
this
.
_options
.
name
,
function
(){
return
clearTimeout
(
d
),
d
=
setTimeout
(
c
,
100
)})},
c
.
prototype
.
_initMouseNavigation
=
function
(){
var
b
;
return
b
=
this
,
a
(
d
).
off
(
"click.tour-"
+
this
.
_options
.
name
,
".popover.tour-"
+
this
.
_options
.
name
+
" *[data-role='prev']:not(.disabled)"
).
off
(
"click.tour-"
+
this
.
_options
.
name
,
".popover.tour-"
+
this
.
_options
.
name
+
" *[data-role='next']:not(.disabled)"
).
off
(
"click.tour-"
+
this
.
_options
.
name
,
".popover.tour-"
+
this
.
_options
.
name
+
" *[data-role='end']"
).
off
(
"click.tour-"
+
this
.
_options
.
name
,
".popover.tour-"
+
this
.
_options
.
name
+
" *[data-role='pause-resume']"
).
on
(
"click.tour-"
+
this
.
_options
.
name
,
".popover.tour-"
+
this
.
_options
.
name
+
" *[data-role='next']:not(.disabled)"
,
function
(
a
){
return
function
(
b
){
return
b
.
preventDefault
(),
a
.
next
()}}(
this
)).
on
(
"click.tour-"
+
this
.
_options
.
name
,
".popover.tour-"
+
this
.
_options
.
name
+
" *[data-role='prev']:not(.disabled)"
,
function
(
a
){
return
function
(
b
){
return
b
.
preventDefault
(),
a
.
prev
()}}(
this
)).
on
(
"click.tour-"
+
this
.
_options
.
name
,
".popover.tour-"
+
this
.
_options
.
name
+
" *[data-role='end']"
,
function
(
a
){
return
function
(
b
){
return
b
.
preventDefault
(),
a
.
end
()}}(
this
)).
on
(
"click.tour-"
+
this
.
_options
.
name
,
".popover.tour-"
+
this
.
_options
.
name
+
" *[data-role='pause-resume']"
,
function
(
c
){
var
d
;
return
c
.
preventDefault
(),
d
=
a
(
this
),
d
.
text
(
d
.
data
(
b
.
_paused
?
"pause-text"
:
"resume-text"
)),
b
.
_paused
?
b
.
resume
():
b
.
pause
()})},
c
.
prototype
.
_initKeyboardNavigation
=
function
(){
return
this
.
_options
.
keyboard
?
a
(
d
).
on
(
"keyup.tour-"
+
this
.
_options
.
name
,
function
(
a
){
return
function
(
b
){
if
(
b
.
which
)
switch
(
b
.
which
){
case
39
:
return
b
.
preventDefault
(),
a
.
_isLast
()?
a
.
next
():
a
.
end
();
case
37
:
if
(
b
.
preventDefault
(),
a
.
_current
>
0
)
return
a
.
prev
();
break
;
case
27
:
return
b
.
preventDefault
(),
a
.
end
()}}}(
this
)):
void
0
},
c
.
prototype
.
_makePromise
=
function
(
b
){
return
b
&&
a
.
isFunction
(
b
.
then
)?
b
:
null
},
c
.
prototype
.
_callOnPromiseDone
=
function
(
a
,
b
,
c
){
return
a
?
a
.
then
(
function
(
a
){
return
function
(){
return
b
.
call
(
a
,
c
)}}(
this
)):
b
.
call
(
this
,
c
)},
c
.
prototype
.
_showBackdrop
=
function
(){
return
this
.
backdrop
.
backgroundShown
?
void
0
:(
this
.
backdrop
=
a
(
"<div/>"
,{
"class"
:
"tour-backdrop"
}),
this
.
backdrop
.
backgroundShown
=!
0
,
a
(
"body"
).
append
(
this
.
backdrop
))},
c
.
prototype
.
_hideBackdrop
=
function
(){
return
this
.
_hideOverlayElement
(),
this
.
_hideBackground
()},
c
.
prototype
.
_hideBackground
=
function
(){
return
this
.
backdrop
.
remove
(),
this
.
backdrop
.
overlay
=
null
,
this
.
backdrop
.
backgroundShown
=!
1
},
c
.
prototype
.
_showOverlayElement
=
function
(
b
){
var
c
,
d
,
e
;
return
d
=
a
(
b
),
d
&&
0
!==
d
.
length
&&!
this
.
backdrop
.
overlayElementShown
?(
this
.
backdrop
.
overlayElementShown
=!
0
,
c
=
a
(
"<div/>"
),
e
=
d
.
offset
(),
e
.
top
=
e
.
top
,
e
.
left
=
e
.
left
,
c
.
width
(
d
.
innerWidth
()).
height
(
d
.
innerHeight
()).
addClass
(
"tour-step-background"
).
offset
(
e
),
d
.
addClass
(
"tour-step-backdrop"
),
a
(
"body"
).
append
(
c
),
this
.
backdrop
.
$element
=
d
,
this
.
backdrop
.
$background
=
c
):
void
0
},
c
.
prototype
.
_hideOverlayElement
=
function
(){
return
this
.
backdrop
.
overlayElementShown
?(
this
.
backdrop
.
$element
.
removeClass
(
"tour-step-backdrop"
),
this
.
backdrop
.
$background
.
remove
(),
this
.
backdrop
.
$element
=
null
,
this
.
backdrop
.
$background
=
null
,
this
.
backdrop
.
overlayElementShown
=!
1
):
void
0
},
c
.
prototype
.
_clearTimer
=
function
(){
return
b
.
clearTimeout
(
this
.
_timer
),
this
.
_timer
=
null
,
this
.
_duration
=
null
},
c
}(),
b
.
Tour
=
c
}(
jQuery
,
window
);
\ No newline at end of file
circle/dashboard/static/dashboard/vm-tour.js
0 → 100644
View file @
317e11b7
/* TODO i18n
* https://docs.djangoproject.com/en/1.5/topics/i18n/translation/#internationalization-in-javascript-code
* TODO new tour template
* http://bootstraptour.com/api/
* TODO change placeholder yos
*/
$
(
function
()
{
$
(
".vm-details-start-template-tour"
).
click
(
function
()
{
ttour
=
createTemplateTour
();
ttour
.
init
();
ttour
.
start
();
});
});
function
createTemplateTour
()
{
var
ttour
=
new
Tour
({
storage
:
false
,
});
ttour
.
addStep
({
element
:
".alert-new-template"
,
title
:
"Template Tutorial Tour"
,
content
:
"Welcome to the template tutorial. In this quick tour, we gonna show you how to do the steps described above. "
+
"For the next tour step press the Next button or the right arrow (or Back button/left arrow for the previous step). "
+
"During the tour please don't try the functions because it may lead to graphical glitches, however "
+
"you can end the tour any time you want with the End Tour button!"
,
placement
:
"bottom"
,
backdrop
:
true
,
});
ttour
.
addStep
({
backdrop
:
true
,
element
:
'a[href="#home"]'
,
title
:
"Home tab"
,
content
:
"yo"
,
placement
:
'top'
,
onShow
:
function
()
{
console
.
log
(
"yosag van"
);
$
(
'a[href="#home"]'
).
trigger
(
"click"
);
},
});
ttour
.
addStep
({
element
:
'a[href="#resources"]'
,
title
:
"Resources tab"
,
backdrop
:
true
,
placement
:
'top'
,
content
:
"On the resources tab you can edit the CPU/RAM options and add/remove disks!"
,
onShow
:
function
()
{
$
(
'a[href="#resources"]'
).
trigger
(
"click"
);
},
});
ttour
.
addStep
({
element
:
'#vm-details-resources-form'
,
placement
:
'left'
,
backdrop
:
true
,
title
:
"Resources"
,
content
:
'<p><strong>CPU priority:</strong> higher (or lower?) is better</p>'
+
'<p><strong>CPU count:</strong> yooo</p>'
+
'<p><strong>RAM amount:</strong> yoo RAM</p>'
,
onShow
:
function
()
{
$
(
'a[href="#resources"]'
).
trigger
(
"click"
);
},
});
ttour
.
addStep
({
element
:
'.vm-details-resources-disk'
,
backdrop
:
true
,
placement
:
'left'
,
title
:
"Disks"
,
content
:
"jo a kontent, bar lehetne hosszabb is es akkor nem nez ki ilyen butan az end tour gomb!"
,
onShow
:
function
()
{
$
(
'a[href="#resources"]'
).
trigger
(
"click"
);
},
});
ttour
.
addStep
({
element
:
'a[href="#network"]'
,
backdrop
:
true
,
placement
:
'top'
,
title
:
"Network tab"
,
content
:
'You can add new network interfaces or remove existing ones here.'
,
onShow
:
function
()
{
$
(
'a[href="#network"]'
).
trigger
(
"click"
);
},
});
ttour
.
addStep
({
element
:
"#vm-details-button-deploy"
,
title
:
"Deploy"
,
backdrop
:
true
,
content
:
"Deploy the virtual machine"
,
});
ttour
.
addStep
({
element
:
"#vm-info-pane"
,
title
:
"Connect"
,
backdrop
:
true
,
content
:
"Use the connection string or connect with your choice of client!"
,
});
ttour
.
addStep
({
element
:
".alert-new-template"
,
placement
:
"bottom"
,
title
:
"Customize the virtual machine"
,
content
:
"Do the modifications"
,
});
ttour
.
addStep
({
element
:
".vm-details-button-save-as"
,
title
:
"Save"
,
placement
:
"left"
,
backdrop
:
true
,
content
:
"Press this button and wait!"
,
});
ttour
.
addStep
({
element
:
".alert-new-template"
,
title
:
"Fin"
,
backdrop
:
true
,
placement
:
"bottom"
,
content
:
"Congrats you managed to sit trough this exciting tour!"
,
});
return
ttour
;
}
circle/dashboard/templates/base.html
View file @
317e11b7
...
...
@@ -17,6 +17,7 @@
<script
src=
"{{ STATIC_URL }}dashboard/js/jquery.knob.js"
></script>
<script
src=
"{{ STATIC_URL}}dashboard/bootstrap-slider/bootstrap-slider.js"
></script>
<link
rel=
"stylesheet"
href=
"{{ STATIC_URL }}dashboard/bootstrap-slider/slider.css"
/>
<link
href=
"{{ STATIC_URL }}dashboard/bootstrap-tour.min.css"
rel=
"stylesheet"
>
<link
href=
"{{ STATIC_URL }}dashboard/dashboard.css"
rel=
"stylesheet"
>
<script
src=
"{{ STATIC_URL }}dashboard/dashboard.js"
></script>
</head>
...
...
circle/dashboard/templates/dashboard/_template-create-1.html
View file @
317e11b7
...
...
@@ -4,7 +4,8 @@
{% trans "Customize an existing template or create a brand new one from scratch!" %}
</div>
<form
action=
"{% url "
dashboard
.
views
.
template-create
"
%}"
>
<form
action=
"{% url "
dashboard
.
views
.
template-choose
"
%}"
method=
"POST"
>
{% csrf_token %}
<div
class=
"template-choose-list"
>
{% for t in templates %}
<div
class=
"panel panel-default template-choose-list-element"
>
...
...
circle/dashboard/templates/dashboard/vm-detail.html
View file @
317e11b7
...
...
@@ -4,6 +4,51 @@
{% block title-page %}{{ instance.name }} | vm{% endblock %}
{% block content %}
<style>
.alert-new-template
{
background
:
#3071a9
;
color
:
white
;
font-size
:
25px
;
}
.alert-new-template
ol
{
margin-left
:
25px
;
}
</style>
{% if instance.is_base %}
<div
class=
"alert alert-info alert-new-template"
>
<strong>
{% trans "This is the master vm of your new template" %}
</strong>
<a
href=
"#"
class=
"btn btn-default btn-lg pull-right vm-details-start-template-tour"
>
<i
class=
"icon-play"
></i>
{% trans "Start template tutorial tour" %}
</a>
<ol>
<li>
Modify the vm to suit your needs
<strong>
(optional)
</strong>
<ul>
<li>
Change the description
</li>
<li>
Change the resources it will need (CPU and RAM)
</li>
<li>
Attach or deattach disks
</li>
<li>
Add or remove network interfaces
</li>
</ul>
</li>
<li>
Deploy the vm
</li>
<li>
Connect to the machine
</li>
<li>
Do all the needed installation/customization
</li>
<li>
Log off
</li>
<li>
Press the "Save as template" button
<form
style=
"display: inline;"
class=
"vm-details-button-save-as pull-right"
method=
"POST"
action=
"{% url "
dashboard
.
views
.
detail
"
pk=
instance.pk
%}"
>
{% csrf_token %}
<input
type=
"hidden"
name=
"save_as"
/>
<button
class=
"btn btn-default btn-lg"
type=
"submit"
>
<i
class=
"icon-save"
></i>
{% trans "Save as template" %}
</button>
</form>
</li>
</ol>
</div>
{% endif %}
<div
class=
"body-content"
>
<div
class=
"page-header"
>
<div
class=
"pull-right"
style=
"padding-top: 15px;"
>
...
...
@@ -12,7 +57,7 @@
<input
type=
"hidden"
name=
"sleep"
/>
<button
title=
"{% trans "
Sleep
"
%}"
class=
"btn btn-default btn-xs"
type=
"submit"
><i
class=
"icon-moon"
></i></button>
</form>
<form
style=
"display: inline;"
method=
"POST"
action=
"{% url "
dashboard
.
views
.
detail
"
pk=
instance.pk
%}"
>
<form
style=
"display: inline;"
method=
"POST"
action=
"{% url "
dashboard
.
views
.
detail
"
pk=
instance.pk
%}"
id=
"vm-details-button-deploy"
>
{% csrf_token %}
<input
type=
"hidden"
name=
"deploy"
/>
<button
title=
"{% trans "
Deploy
"
%}"
class=
"btn btn-default btn-xs"
type=
"submit"
><i
class=
"icon-play"
></i></button>
...
...
@@ -47,7 +92,7 @@
<a
title=
"Migrate"
data-vm-pk=
"{{ instance.pk }}"
href=
"{% url "
dashboard
.
views
.
vm-migrate
"
pk=
instance.pk
%}"
class=
"btn btn-default btn-xs vm-migrate"
>
<i
class=
"icon-truck"
></i>
</a>
<form
style=
"display: inline;"
method=
"POST"
action=
"{% url "
dashboard
.
views
.
detail
"
pk=
instance.pk
%}"
>
<form
style=
"display: inline;"
class=
"vm-details-button-save-as"
method=
"POST"
action=
"{% url "
dashboard
.
views
.
detail
"
pk=
instance.pk
%}"
>
{% csrf_token %}
<input
type=
"hidden"
name=
"save_as"
/>
<button
title=
"{% trans "
Save
as
template
"
%}"
class=
"btn btn-default btn-xs"
type=
"submit"
><i
class=
"icon-save"
></i></button>
...
...
@@ -194,8 +239,10 @@
{% endblock %}
{% block extra_js %}
<script
src=
"{{ STATIC_URL }}dashboard/bootstrap-tour.min.js"
></script>
<script
src=
"{{ STATIC_URL }}dashboard/vm-details.js"
></script>
<script
src=
"{{ STATIC_URL }}dashboard/vm-common.js"
></script>
<script
src=
"{{ STATIC_URL }}dashboard/vm-console.js"
></script>
<script
src=
"{{ STATIC_URL }}dashboard/disk-list.js"
></script>
<script
src=
"{{ STATIC_URL }}dashboard/vm-tour.js"
></script>
{% endblock %}
circle/dashboard/templates/dashboard/vm-detail/resources.html
View file @
317e11b7
...
...
@@ -42,7 +42,7 @@
<hr
/>
<div
class=
"row"
>
<div
class=
"row
vm-details-resources-disk
"
>
<div
class=
"col-sm-11"
>
<h3>
{% trans "Disks" %}
...
...
circle/dashboard/views.py
View file @
317e11b7
...
...
@@ -757,10 +757,25 @@ class TemplateChoose(TemplateView):
'box_title'
:
_
(
'Choose template'
),
'ajax_title'
:
False
,
'template'
:
"dashboard/_template-create-1.html"
,
'templates'
:
templates
.
all
(),
'templates'
:
templates
.
all
(),
# TODO acl?
})
return
context
def
post
(
self
,
request
,
*
args
,
**
kwargs
):
if
not
request
.
user
.
has_perm
(
'vm.create_template'
):
raise
PermissionDenied
()
template
=
request
.
POST
.
get
(
"parent"
)
if
template
==
"base_vm"
:
return
redirect
(
reverse
(
"dashboard.views.template-create"
))
else
:
template
=
get_object_or_404
(
InstanceTemplate
,
pk
=
template
)
instance
=
Instance
.
create_from_template
(
template
=
template
,
owner
=
request
.
user
,
is_base
=
True
)
return
redirect
(
instance
.
get_absolute_url
())
class
TemplateClone
(
CreateView
):
template_name
=
"dashboard/template-clone.html"
...
...
circle/vm/migrations/0022_auto__add_field_instance_is_base.py
0 → 100644
View file @
317e11b7
# -*- coding: utf-8 -*-
import
datetime
from
south.db
import
db
from
south.v2
import
SchemaMigration
from
django.db
import
models
class
Migration
(
SchemaMigration
):
def
forwards
(
self
,
orm
):
# Adding field 'Instance.is_base'
db
.
add_column
(
u'vm_instance'
,
'is_base'
,
self
.
gf
(
'django.db.models.fields.BooleanField'
)(
default
=
False
),
keep_default
=
False
)
def
backwards
(
self
,
orm
):
# Deleting field 'Instance.is_base'
db
.
delete_column
(
u'vm_instance'
,
'is_base'
)
models
=
{
u'acl.level'
:
{
'Meta'
:
{
'unique_together'
:
"(('content_type', 'codename'),)"
,
'object_name'
:
'Level'
},
'codename'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'100'
}),
'content_type'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['contenttypes.ContentType']"
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'50'
}),
'weight'
:
(
'django.db.models.fields.IntegerField'
,
[],
{
'null'
:
'True'
})
},
u'acl.objectlevel'
:
{
'Meta'
:
{
'unique_together'
:
"(('content_type', 'object_id', 'level'),)"
,
'object_name'
:
'ObjectLevel'
},
'content_type'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['contenttypes.ContentType']"
}),
'groups'
:
(
'django.db.models.fields.related.ManyToManyField'
,
[],
{
'to'
:
u"orm['auth.Group']"
,
'symmetrical'
:
'False'
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'level'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['acl.Level']"
}),
'object_id'
:
(
'django.db.models.fields.IntegerField'
,
[],
{}),
'users'
:
(
'django.db.models.fields.related.ManyToManyField'
,
[],
{
'to'
:
u"orm['auth.User']"
,
'symmetrical'
:
'False'
})
},
u'auth.group'
:
{
'Meta'
:
{
'object_name'
:
'Group'
},
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'80'
}),
'permissions'
:
(
'django.db.models.fields.related.ManyToManyField'
,
[],
{
'to'
:
u"orm['auth.Permission']"
,
'symmetrical'
:
'False'
,
'blank'
:
'True'
})
},
u'auth.permission'
:
{
'Meta'
:
{
'ordering'
:
"(u'content_type__app_label', u'content_type__model', u'codename')"
,
'unique_together'
:
"((u'content_type', u'codename'),)"
,
'object_name'
:
'Permission'
},
'codename'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'100'
}),
'content_type'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['contenttypes.ContentType']"
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'50'
})
},
u'auth.user'
:
{
'Meta'
:
{
'object_name'
:
'User'
},
'date_joined'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'email'
:
(
'django.db.models.fields.EmailField'
,
[],
{
'max_length'
:
'75'
,
'blank'
:
'True'
}),
'first_name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'30'
,
'blank'
:
'True'
}),
'groups'
:
(
'django.db.models.fields.related.ManyToManyField'
,
[],
{
'to'
:
u"orm['auth.Group']"
,
'symmetrical'
:
'False'
,
'blank'
:
'True'
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'is_active'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'True'
}),
'is_staff'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'False'
}),
'is_superuser'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'False'
}),
'last_login'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'last_name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'30'
,
'blank'
:
'True'
}),
'password'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'128'
}),
'user_permissions'
:
(
'django.db.models.fields.related.ManyToManyField'
,
[],
{
'to'
:
u"orm['auth.Permission']"
,
'symmetrical'
:
'False'
,
'blank'
:
'True'
}),
'username'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'30'
})
},
u'contenttypes.contenttype'
:
{
'Meta'
:
{
'ordering'
:
"('name',)"
,
'unique_together'
:
"(('app_label', 'model'),)"
,
'object_name'
:
'ContentType'
,
'db_table'
:
"'django_content_type'"
},
'app_label'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'100'
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'model'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'100'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'100'
})
},
u'firewall.domain'
:
{
'Meta'
:
{
'object_name'
:
'Domain'
},
'created_at'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'auto_now_add'
:
'True'
,
'blank'
:
'True'
}),
'description'
:
(
'django.db.models.fields.TextField'
,
[],
{
'blank'
:
'True'
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'modified_at'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'auto_now'
:
'True'
,
'blank'
:
'True'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'40'
}),
'owner'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['auth.User']"
}),
'ttl'
:
(
'django.db.models.fields.IntegerField'
,
[],
{
'default'
:
'600'
})
},
u'firewall.group'
:
{
'Meta'
:
{
'object_name'
:
'Group'
},
'created_at'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'auto_now_add'
:
'True'
,
'blank'
:
'True'
}),
'description'
:
(
'django.db.models.fields.TextField'
,
[],
{
'blank'
:
'True'
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'modified_at'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'auto_now'
:
'True'
,
'blank'
:
'True'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'20'
}),
'owner'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['auth.User']"
,
'null'
:
'True'
,
'blank'
:
'True'
})
},
u'firewall.host'
:
{
'Meta'
:
{
'ordering'
:
"('normalized_hostname', 'vlan')"
,
'unique_together'
:
"(('hostname', 'vlan'),)"
,
'object_name'
:
'Host'
},
'comment'
:
(
'django.db.models.fields.TextField'
,
[],
{
'blank'
:
'True'
}),
'created_at'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'auto_now_add'
:
'True'
,
'blank'
:
'True'
}),
'description'
:
(
'django.db.models.fields.TextField'
,
[],
{
'blank'
:
'True'
}),
'groups'
:
(
'django.db.models.fields.related.ManyToManyField'
,
[],
{
'symmetrical'
:
'False'
,
'to'
:
u"orm['firewall.Group']"
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'hostname'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'40'
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'ipv4'
:
(
'firewall.fields.IPAddressField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'100'
}),
'ipv6'
:
(
'firewall.fields.IPAddressField'
,
[],
{
'max_length'
:
'100'
,
'unique'
:
'True'
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'location'
:
(
'django.db.models.fields.TextField'
,
[],
{
'blank'
:
'True'
}),
'mac'
:
(
'firewall.fields.MACAddressField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'17'
}),
'modified_at'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'auto_now'
:
'True'
,
'blank'
:
'True'
}),
'normalized_hostname'
:
(
'common.models.HumanSortField'
,
[],
{
'default'
:
"''"
,
'maximum_number_length'
:
'4'
,
'max_length'
:
'80'
,
'monitor'
:
"'hostname'"
,
'blank'
:
'True'
}),
'owner'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['auth.User']"
}),
'pub_ipv4'
:
(
'firewall.fields.IPAddressField'
,
[],
{
'max_length'
:
'100'
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'reverse'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'40'
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'shared_ip'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'False'
}),
'vlan'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['firewall.Vlan']"
})
},
u'firewall.vlan'
:
{
'Meta'
:
{
'object_name'
:
'Vlan'
},
'comment'
:
(
'django.db.models.fields.TextField'
,
[],
{
'blank'
:
'True'
}),
'created_at'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'auto_now_add'
:
'True'
,
'blank'
:
'True'
}),
'description'
:
(
'django.db.models.fields.TextField'
,
[],
{
'blank'
:
'True'
}),
'dhcp_pool'
:
(
'django.db.models.fields.TextField'
,
[],
{
'blank'
:
'True'
}),
'domain'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['firewall.Domain']"
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'ipv6_template'
:
(
'django.db.models.fields.TextField'
,
[],
{
'default'
:
"'2001:738:2001:4031:
%(b)
d:
%(c)
d:
%(d)
d:0'"
}),
'managed'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'True'
}),
'modified_at'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'auto_now'
:
'True'
,
'blank'
:
'True'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'20'
}),
'network4'
:
(
'firewall.fields.IPNetworkField'
,
[],
{
'max_length'
:
'100'
}),
'network6'
:
(
'firewall.fields.IPNetworkField'
,
[],
{
'max_length'
:
'100'
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'network_type'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'20'
}),
'owner'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['auth.User']"
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'reverse_domain'
:
(
'django.db.models.fields.TextField'
,
[],
{
'default'
:
"'
%(d)
d.
%(c)
d.
%(b)
d.
%(a)
d.in-addr.arpa'"
}),
'snat_ip'
:
(
'django.db.models.fields.GenericIPAddressField'
,
[],
{
'max_length'
:
'39'
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'snat_to'
:
(
'django.db.models.fields.related.ManyToManyField'
,
[],
{
'symmetrical'
:
'False'
,
'to'
:
u"orm['firewall.Vlan']"
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'vid'
:
(
'django.db.models.fields.IntegerField'
,
[],
{
'unique'
:
'True'
})
},
u'storage.datastore'
:
{
'Meta'
:
{
'ordering'
:
"[u'name']"
,
'object_name'
:
'DataStore'
},
'hostname'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'40'
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'100'
}),
'path'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'200'
})
},
u'storage.disk'
:
{
'Meta'
:
{
'ordering'
:
"[u'name']"
,
'object_name'
:
'Disk'
},
'base'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'blank'
:
'True'
,
'related_name'
:
"u'derivatives'"
,
'null'
:
'True'
,
'to'
:
u"orm['storage.Disk']"
}),
'created'
:
(
'model_utils.fields.AutoCreatedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'datastore'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['storage.DataStore']"
}),
'destroyed'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'default'
:
'None'
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'dev_num'
:
(
'django.db.models.fields.CharField'
,
[],
{
'default'
:
"u'a'"
,
'max_length'
:
'1'
}),
'filename'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'256'
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'modified'
:
(
'model_utils.fields.AutoLastModifiedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'100'
,
'blank'
:
'True'
}),
'size'
:
(
'sizefield.models.FileSizeField'
,
[],
{
'default'
:
'None'
,
'null'
:
'True'
}),
'type'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'10'
})
},
u'taggit.tag'
:
{
'Meta'
:
{
'object_name'
:
'Tag'
},
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'100'
}),
'slug'
:
(
'django.db.models.fields.SlugField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'100'
})
},
u'taggit.taggeditem'
:
{
'Meta'
:
{
'object_name'
:
'TaggedItem'
},
'content_type'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'related_name'
:
"u'taggit_taggeditem_tagged_items'"
,
'to'
:
u"orm['contenttypes.ContentType']"
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'object_id'
:
(
'django.db.models.fields.IntegerField'
,
[],
{
'db_index'
:
'True'
}),
'tag'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'related_name'
:
"u'taggit_taggeditem_items'"
,
'to'
:
u"orm['taggit.Tag']"
})
},
u'vm.instance'
:
{
'Meta'
:
{
'ordering'
:
"(u'pk',)"
,
'object_name'
:
'Instance'
},
'access_method'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'10'
}),
'active_since'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'null'
:
'True'
,
'blank'
:
'True'
}),
'arch'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'10'
}),
'boot_menu'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'False'
}),
'created'
:
(
'model_utils.fields.AutoCreatedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'description'
:
(
'django.db.models.fields.TextField'
,
[],
{
'blank'
:
'True'
}),
'destroyed_at'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'null'
:
'True'
,
'blank'
:
'True'
}),
'disks'
:
(
'django.db.models.fields.related.ManyToManyField'
,
[],
{
'related_name'
:
"u'instance_set'"
,
'symmetrical'
:
'False'
,
'to'
:
u"orm['storage.Disk']"
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'is_base'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'False'
}),
'lease'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['vm.Lease']"
}),
'max_ram_size'
:
(
'django.db.models.fields.IntegerField'
,
[],
{}),
'modified'
:
(
'model_utils.fields.AutoLastModifiedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'100'
,
'blank'
:
'True'
}),
'node'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'blank'
:
'True'
,
'related_name'
:
"u'instance_set'"
,
'null'
:
'True'
,
'to'
:
u"orm['vm.Node']"
}),
'num_cores'
:
(
'django.db.models.fields.IntegerField'
,
[],
{}),
'owner'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['auth.User']"
}),
'priority'
:
(
'django.db.models.fields.IntegerField'
,
[],
{}),
'pw'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'20'
}),
'ram_size'
:
(
'django.db.models.fields.IntegerField'
,
[],
{}),
'raw_data'
:
(
'django.db.models.fields.TextField'
,
[],
{
'blank'
:
'True'
}),
'req_traits'
:
(
'django.db.models.fields.related.ManyToManyField'
,
[],
{
'to'
:
u"orm['vm.Trait']"
,
'symmetrical'
:
'False'
,
'blank'
:
'True'
}),
'status'
:
(
'model_utils.fields.StatusField'
,
[],
{
'default'
:
"u'NOSTATE'"
,
'max_length'
:
'100'
,
u'no_check_for_status'
:
'True'
}),
'status_changed'
:
(
'model_utils.fields.MonitorField'
,
[],
{
'default'
:
'datetime.datetime.now'
,
u'monitor'
:
"u'status'"
}),
'system'
:
(
'django.db.models.fields.TextField'
,
[],
{}),
'template'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'blank'
:
'True'
,
'related_name'
:
"u'instance_set'"
,
'null'
:
'True'
,
'on_delete'
:
'models.SET_NULL'
,
'to'
:
u"orm['vm.InstanceTemplate']"
}),
'time_of_delete'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'default'
:
'None'
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'time_of_suspend'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'default'
:
'None'
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'vnc_port'
:
(
'django.db.models.fields.IntegerField'
,
[],
{
'default'
:
'None'
,
'unique'
:
'True'
,
'null'
:
'True'
,
'blank'
:
'True'
})
},
u'vm.instanceactivity'
:
{
'Meta'
:
{
'ordering'
:
"[u'-finished', u'-started', u'instance', u'-id']"
,
'object_name'
:
'InstanceActivity'
},
'activity_code'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'100'
}),
'created'
:
(
'model_utils.fields.AutoCreatedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'finished'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'null'
:
'True'
,
'blank'
:
'True'
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'instance'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'related_name'
:
"u'activity_log'"
,
'to'
:
u"orm['vm.Instance']"
}),
'modified'
:
(
'model_utils.fields.AutoLastModifiedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'parent'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'blank'
:
'True'
,
'related_name'
:
"'children'"
,
'null'
:
'True'
,
'to'
:
u"orm['vm.InstanceActivity']"
}),
'result'
:
(
'django.db.models.fields.TextField'
,
[],
{
'null'
:
'True'
,
'blank'
:
'True'
}),
'resultant_state'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'20'
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'started'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'null'
:
'True'
,
'blank'
:
'True'
}),
'succeeded'
:
(
'django.db.models.fields.NullBooleanField'
,
[],
{
'null'
:
'True'
,
'blank'
:
'True'
}),
'task_uuid'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'50'
,
'unique'
:
'True'
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'user'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['auth.User']"
,
'null'
:
'True'
,
'blank'
:
'True'
})
},
u'vm.instancetemplate'
:
{
'Meta'
:
{
'ordering'
:
"(u'name',)"
,
'object_name'
:
'InstanceTemplate'
},
'access_method'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'10'
}),
'arch'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'10'
}),
'boot_menu'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'False'
}),
'created'
:
(
'model_utils.fields.AutoCreatedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'description'
:
(
'django.db.models.fields.TextField'
,
[],
{
'blank'
:
'True'
}),
'disks'
:
(
'django.db.models.fields.related.ManyToManyField'
,
[],
{
'related_name'
:
"u'template_set'"
,
'symmetrical'
:
'False'
,
'to'
:
u"orm['storage.Disk']"
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'lease'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['vm.Lease']"
}),
'max_ram_size'
:
(
'django.db.models.fields.IntegerField'
,
[],
{}),
'modified'
:
(
'model_utils.fields.AutoLastModifiedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'100'
}),
'num_cores'
:
(
'django.db.models.fields.IntegerField'
,
[],
{}),
'owner'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['auth.User']"
}),
'parent'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['vm.InstanceTemplate']"
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'priority'
:
(
'django.db.models.fields.IntegerField'
,
[],
{}),
'ram_size'
:
(
'django.db.models.fields.IntegerField'
,
[],
{}),
'raw_data'
:
(
'django.db.models.fields.TextField'
,
[],
{
'blank'
:
'True'
}),
'req_traits'
:
(
'django.db.models.fields.related.ManyToManyField'
,
[],
{
'to'
:
u"orm['vm.Trait']"
,
'symmetrical'
:
'False'
,
'blank'
:
'True'
}),
'system'
:
(
'django.db.models.fields.TextField'
,
[],
{})
},
u'vm.interface'
:
{
'Meta'
:
{
'object_name'
:
'Interface'
},
'host'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['firewall.Host']"
,
'null'
:
'True'
,
'blank'
:
'True'
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'instance'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'related_name'
:
"u'interface_set'"
,
'to'
:
u"orm['vm.Instance']"
}),
'vlan'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'related_name'
:
"u'vm_interface'"
,
'to'
:
u"orm['firewall.Vlan']"
})
},
u'vm.interfacetemplate'
:
{
'Meta'
:
{
'object_name'
:
'InterfaceTemplate'
},
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'managed'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'True'
}),
'template'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'related_name'
:
"u'interface_set'"
,
'to'
:
u"orm['vm.InstanceTemplate']"
}),
'vlan'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['firewall.Vlan']"
})
},
u'vm.lease'
:
{
'Meta'
:
{
'ordering'
:
"[u'name']"
,
'object_name'
:
'Lease'
},
'delete_interval_seconds'
:
(
'django.db.models.fields.IntegerField'
,
[],
{
'null'
:
'True'
,
'blank'
:
'True'
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'100'
}),
'suspend_interval_seconds'
:
(
'django.db.models.fields.IntegerField'
,
[],
{
'null'
:
'True'
,
'blank'
:
'True'
})
},
u'vm.namedbaseresourceconfig'
:
{
'Meta'
:
{
'object_name'
:
'NamedBaseResourceConfig'
},
'arch'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'10'
}),
'created'
:
(
'model_utils.fields.AutoCreatedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'max_ram_size'
:
(
'django.db.models.fields.IntegerField'
,
[],
{}),
'modified'
:
(
'model_utils.fields.AutoLastModifiedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'50'
}),
'num_cores'
:
(
'django.db.models.fields.IntegerField'
,
[],
{}),
'priority'
:
(
'django.db.models.fields.IntegerField'
,
[],
{}),
'ram_size'
:
(
'django.db.models.fields.IntegerField'
,
[],
{})
},
u'vm.node'
:
{
'Meta'
:
{
'ordering'
:
"(u'-enabled', u'normalized_name')"
,
'object_name'
:
'Node'
},
'created'
:
(
'model_utils.fields.AutoCreatedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'enabled'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'False'
}),
'host'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['firewall.Host']"
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'modified'
:
(
'model_utils.fields.AutoLastModifiedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'50'
}),
'normalized_name'
:
(
'common.models.HumanSortField'
,
[],
{
'default'
:
"''"
,
'maximum_number_length'
:
'4'
,
'max_length'
:
'100'
,
'monitor'
:
"u'name'"
,
'blank'
:
'True'
}),
'overcommit'
:
(
'django.db.models.fields.FloatField'
,
[],
{
'default'
:
'1.0'
}),
'priority'
:
(
'django.db.models.fields.IntegerField'
,
[],
{}),
'traits'
:
(
'django.db.models.fields.related.ManyToManyField'
,
[],
{
'to'
:
u"orm['vm.Trait']"
,
'symmetrical'
:
'False'
,
'blank'
:
'True'
})
},
u'vm.nodeactivity'
:
{
'Meta'
:
{
'object_name'
:
'NodeActivity'
},
'activity_code'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'100'
}),
'created'
:
(
'model_utils.fields.AutoCreatedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'finished'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'null'
:
'True'
,
'blank'
:
'True'
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'modified'
:
(
'model_utils.fields.AutoLastModifiedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'node'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'related_name'
:
"u'activity_log'"
,
'to'
:
u"orm['vm.Node']"
}),
'parent'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'blank'
:
'True'
,
'related_name'
:
"'children'"
,
'null'
:
'True'
,
'to'
:
u"orm['vm.NodeActivity']"
}),
'result'
:
(
'django.db.models.fields.TextField'
,
[],
{
'null'
:
'True'
,
'blank'
:
'True'
}),
'started'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'null'
:
'True'
,
'blank'
:
'True'
}),
'succeeded'
:
(
'django.db.models.fields.NullBooleanField'
,
[],
{
'null'
:
'True'
,
'blank'
:
'True'
}),
'task_uuid'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'50'
,
'unique'
:
'True'
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'user'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['auth.User']"
,
'null'
:
'True'
,
'blank'
:
'True'
})
},
u'vm.trait'
:
{
'Meta'
:
{
'object_name'
:
'Trait'
},
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'50'
})
}
}
complete_apps
=
[
'vm'
]
\ No newline at end of file
circle/vm/models/instance.py
View file @
317e11b7
...
...
@@ -212,6 +212,7 @@ class Instance(AclBase, VirtualMachineDescModel, StatusModel,
vnc_port
=
IntegerField
(
blank
=
True
,
default
=
None
,
null
=
True
,
help_text
=
_
(
"TCP port where VNC console listens."
),
unique
=
True
,
verbose_name
=
_
(
'vnc_port'
))
is_base
=
BooleanField
(
default
=
False
)
owner
=
ForeignKey
(
User
)
destroyed_at
=
DateTimeField
(
blank
=
True
,
null
=
True
,
help_text
=
_
(
"The virtual machine's time of "
...
...
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