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
A prog2-höz tartozó friss repo anyagok itt elérhetőek:
https://git.iit.bme.hu/
Commit
04bbf626
authored
Sep 16, 2014
by
Őry Máté
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' into feature-titles
parents
60fedbfc
ea3039d6
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
127 additions
and
87 deletions
+127
-87
circle/common/models.py
+8
-0
circle/dashboard/forms.py
+2
-2
circle/dashboard/models.py
+6
-2
circle/dashboard/templates/dashboard/template-edit.html
+1
-0
circle/dashboard/views.py
+2
-1
circle/network/forms.py
+32
-29
circle/network/views.py
+20
-29
circle/storage/models.py
+2
-1
circle/vm/migrations/0027_auto__add_field_instance_has_agent__add_field_instancetemplate_has_age.py
+0
-0
circle/vm/models/activity.py
+19
-10
circle/vm/models/instance.py
+6
-1
circle/vm/operations.py
+16
-6
circle/vm/tasks/local_agent_tasks.py
+11
-6
circle/vm/tests/test_models.py
+2
-0
No files found.
circle/common/models.py
View file @
04bbf626
...
@@ -214,6 +214,14 @@ class ActivityModel(TimeStampedModel):
...
@@ -214,6 +214,14 @@ class ActivityModel(TimeStampedModel):
self
.
result_data
=
None
if
value
is
None
else
value
.
to_dict
()
self
.
result_data
=
None
if
value
is
None
else
value
.
to_dict
()
@classmethod
def
construct_activity_code
(
cls
,
code_suffix
,
sub_suffix
=
None
):
code
=
join_activity_code
(
cls
.
ACTIVITY_CODE_BASE
,
code_suffix
)
if
sub_suffix
:
return
join_activity_code
(
code
,
sub_suffix
)
else
:
return
code
@celery.task
()
@celery.task
()
def
compute_cached
(
method
,
instance
,
memcached_seconds
,
def
compute_cached
(
method
,
instance
,
memcached_seconds
,
...
...
circle/dashboard/forms.py
View file @
04bbf626
...
@@ -143,7 +143,7 @@ class VmCustomizeForm(forms.Form):
...
@@ -143,7 +143,7 @@ class VmCustomizeForm(forms.Form):
self
.
template
=
kwargs
.
pop
(
"template"
,
None
)
self
.
template
=
kwargs
.
pop
(
"template"
,
None
)
super
(
VmCustomizeForm
,
self
)
.
__init__
(
*
args
,
**
kwargs
)
super
(
VmCustomizeForm
,
self
)
.
__init__
(
*
args
,
**
kwargs
)
if
self
.
user
.
has_perm
(
"vm
_set_resou
ces"
):
if
self
.
user
.
has_perm
(
"vm
.set_resour
ces"
):
self
.
allowed_fields
=
tuple
(
self
.
fields
.
keys
())
self
.
allowed_fields
=
tuple
(
self
.
fields
.
keys
())
# set displayed disk and network list
# set displayed disk and network list
self
.
fields
[
'disks'
]
.
queryset
=
self
.
template
.
disks
.
all
()
self
.
fields
[
'disks'
]
.
queryset
=
self
.
template
.
disks
.
all
()
...
@@ -481,7 +481,7 @@ class TemplateForm(forms.ModelForm):
...
@@ -481,7 +481,7 @@ class TemplateForm(forms.ModelForm):
else
:
else
:
self
.
allowed_fields
=
(
self
.
allowed_fields
=
(
'name'
,
'access_method'
,
'description'
,
'system'
,
'tags'
,
'name'
,
'access_method'
,
'description'
,
'system'
,
'tags'
,
'arch'
,
'lease'
)
'arch'
,
'lease'
,
'has_agent'
)
if
(
self
.
user
.
has_perm
(
'vm.change_template_resources'
)
if
(
self
.
user
.
has_perm
(
'vm.change_template_resources'
)
or
not
self
.
instance
.
pk
):
or
not
self
.
instance
.
pk
):
self
.
allowed_fields
+=
tuple
(
set
(
self
.
fields
.
keys
())
-
self
.
allowed_fields
+=
tuple
(
set
(
self
.
fields
.
keys
())
-
...
...
circle/dashboard/models.py
View file @
04bbf626
...
@@ -261,7 +261,7 @@ def get_or_create_profile(self):
...
@@ -261,7 +261,7 @@ def get_or_create_profile(self):
Group
.
profile
=
property
(
get_or_create_profile
)
Group
.
profile
=
property
(
get_or_create_profile
)
def
create_profile
(
sender
,
user
,
request
,
**
kwargs
):
def
create_profile
(
user
):
if
not
user
.
pk
:
if
not
user
.
pk
:
return
False
return
False
profile
,
created
=
Profile
.
objects
.
get_or_create
(
user
=
user
)
profile
,
created
=
Profile
.
objects
.
get_or_create
(
user
=
user
)
...
@@ -272,7 +272,11 @@ def create_profile(sender, user, request, **kwargs):
...
@@ -272,7 +272,11 @@ def create_profile(sender, user, request, **kwargs):
logger
.
exception
(
"Can't create user
%
s"
,
unicode
(
user
))
logger
.
exception
(
"Can't create user
%
s"
,
unicode
(
user
))
return
created
return
created
user_logged_in
.
connect
(
create_profile
)
def
create_profile_hook
(
sender
,
user
,
request
,
**
kwargs
):
return
create_profile
(
user
)
user_logged_in
.
connect
(
create_profile_hook
)
if
hasattr
(
settings
,
'SAML_ORG_ID_ATTRIBUTE'
):
if
hasattr
(
settings
,
'SAML_ORG_ID_ATTRIBUTE'
):
logger
.
debug
(
"Register save_org_id to djangosaml2 pre_user_save"
)
logger
.
debug
(
"Register save_org_id to djangosaml2 pre_user_save"
)
...
...
circle/dashboard/templates/dashboard/template-edit.html
View file @
04bbf626
...
@@ -51,6 +51,7 @@
...
@@ -51,6 +51,7 @@
{{ form.req_traits|as_crispy_field }}
{{ form.req_traits|as_crispy_field }}
{{ form.description|as_crispy_field }}
{{ form.description|as_crispy_field }}
{{ form.system|as_crispy_field }}
{{ form.system|as_crispy_field }}
{{ form.has_agent|as_crispy_field }}
</fieldset>
</fieldset>
<fieldset>
<fieldset>
<legend>
{% trans "External resources" %}
</legend>
<legend>
{% trans "External resources" %}
</legend>
...
...
circle/dashboard/views.py
View file @
04bbf626
...
@@ -91,7 +91,7 @@ from vm.models import (
...
@@ -91,7 +91,7 @@ from vm.models import (
from
storage.models
import
Disk
from
storage.models
import
Disk
from
firewall.models
import
Vlan
,
Host
,
Rule
from
firewall.models
import
Vlan
,
Host
,
Rule
from
.models
import
(
Favourite
,
Profile
,
GroupProfile
,
FutureMember
,
from
.models
import
(
Favourite
,
Profile
,
GroupProfile
,
FutureMember
,
ConnectCommand
)
ConnectCommand
,
create_profile
)
from
.store_api
import
Store
,
NoStoreException
,
NotOkException
from
.store_api
import
Store
,
NoStoreException
,
NotOkException
...
@@ -3288,6 +3288,7 @@ class UserCreationView(LoginRequiredMixin, PermissionRequiredMixin,
...
@@ -3288,6 +3288,7 @@ class UserCreationView(LoginRequiredMixin, PermissionRequiredMixin,
self
.
get_group
(
group_pk
)
self
.
get_group
(
group_pk
)
ret
=
super
(
UserCreationView
,
self
)
.
post
(
*
args
,
**
kwargs
)
ret
=
super
(
UserCreationView
,
self
)
.
post
(
*
args
,
**
kwargs
)
if
self
.
object
:
if
self
.
object
:
create_profile
(
self
.
object
)
self
.
object
.
groups
.
add
(
self
.
group
)
self
.
object
.
groups
.
add
(
self
.
group
)
return
redirect
(
return
redirect
(
reverse
(
'dashboard.views.group-detail'
,
args
=
[
group_pk
]))
reverse
(
'dashboard.views.group-detail'
,
args
=
[
group_pk
]))
...
...
circle/network/forms.py
View file @
04bbf626
...
@@ -17,6 +17,7 @@
...
@@ -17,6 +17,7 @@
from
django.forms
import
ModelForm
from
django.forms
import
ModelForm
from
django.core.urlresolvers
import
reverse_lazy
from
django.core.urlresolvers
import
reverse_lazy
from
django.utils.translation
import
ugettext_lazy
as
_
from
crispy_forms.helper
import
FormHelper
from
crispy_forms.helper
import
FormHelper
from
crispy_forms.layout
import
Layout
,
Fieldset
,
Div
,
Submit
,
BaseInput
from
crispy_forms.layout
import
Layout
,
Fieldset
,
Div
,
Submit
,
BaseInput
...
@@ -56,8 +57,9 @@ class BlacklistItemForm(ModelForm):
...
@@ -56,8 +57,9 @@ class BlacklistItemForm(ModelForm):
)
)
),
),
FormActions
(
FormActions
(
Submit
(
'submit'
,
'Save changes'
),
Submit
(
'submit'
,
_
(
'Save changes'
)),
LinkButton
(
'back'
,
'Back'
,
reverse_lazy
(
'network.blacklist_list'
))
LinkButton
(
'back'
,
_
(
"Back"
),
reverse_lazy
(
'network.blacklist_list'
))
)
)
)
)
...
@@ -77,8 +79,8 @@ class DomainForm(ModelForm):
...
@@ -77,8 +79,8 @@ class DomainForm(ModelForm):
),
),
),
),
FormActions
(
FormActions
(
Submit
(
'submit'
,
'Save'
),
Submit
(
'submit'
,
_
(
'Save'
)
),
LinkButton
(
'back'
,
'Back'
,
reverse_lazy
(
'network.domain_list'
))
LinkButton
(
'back'
,
_
(
"Back"
)
,
reverse_lazy
(
'network.domain_list'
))
)
)
)
)
...
@@ -91,15 +93,15 @@ class GroupForm(ModelForm):
...
@@ -91,15 +93,15 @@ class GroupForm(ModelForm):
helper
.
layout
=
Layout
(
helper
.
layout
=
Layout
(
Div
(
Div
(
Fieldset
(
Fieldset
(
'
Identity
'
,
''
,
'name'
,
'name'
,
'description'
,
'description'
,
'owner'
,
'owner'
,
),
),
),
),
FormActions
(
FormActions
(
Submit
(
'submit'
,
'Save'
),
Submit
(
'submit'
,
_
(
'Save'
)
),
LinkButton
(
'back'
,
'Back'
,
reverse_lazy
(
'network.group_list'
))
LinkButton
(
'back'
,
_
(
"Back"
)
,
reverse_lazy
(
'network.group_list'
))
)
)
)
)
...
@@ -112,13 +114,13 @@ class HostForm(ModelForm):
...
@@ -112,13 +114,13 @@ class HostForm(ModelForm):
helper
.
layout
=
Layout
(
helper
.
layout
=
Layout
(
Div
(
Div
(
Fieldset
(
Fieldset
(
'
Identity
'
,
''
,
'hostname'
,
'hostname'
,
'reverse'
,
'reverse'
,
'mac'
,
'mac'
,
),
),
Fieldset
(
Fieldset
(
'Network'
,
_
(
'Network'
)
,
'vlan'
,
'vlan'
,
'ipv4'
,
'ipv4'
,
'ipv6'
,
'ipv6'
,
...
@@ -126,7 +128,7 @@ class HostForm(ModelForm):
...
@@ -126,7 +128,7 @@ class HostForm(ModelForm):
'external_ipv4'
,
'external_ipv4'
,
),
),
Fieldset
(
Fieldset
(
'Information'
,
_
(
'Information'
)
,
'description'
,
'description'
,
'location'
,
'location'
,
'comment'
,
'comment'
,
...
@@ -134,8 +136,8 @@ class HostForm(ModelForm):
...
@@ -134,8 +136,8 @@ class HostForm(ModelForm):
),
),
),
),
FormActions
(
FormActions
(
Submit
(
'submit'
,
'Save'
),
Submit
(
'submit'
,
_
(
'Save'
)
),
LinkButton
(
'back'
,
'Back'
,
reverse_lazy
(
'network.host_list'
)))
LinkButton
(
'back'
,
_
(
'Back'
)
,
reverse_lazy
(
'network.host_list'
)))
)
)
class
Meta
:
class
Meta
:
...
@@ -159,8 +161,8 @@ class RecordForm(ModelForm):
...
@@ -159,8 +161,8 @@ class RecordForm(ModelForm):
)
)
),
),
FormActions
(
FormActions
(
Submit
(
'submit'
,
'Save'
),
Submit
(
'submit'
,
_
(
"Save"
)
),
LinkButton
(
'back'
,
'Back'
,
reverse_lazy
(
'network.record_list'
))
LinkButton
(
'back'
,
_
(
"Back"
)
,
reverse_lazy
(
'network.record_list'
))
)
)
)
)
...
@@ -173,7 +175,7 @@ class RuleForm(ModelForm):
...
@@ -173,7 +175,7 @@ class RuleForm(ModelForm):
helper
.
layout
=
Layout
(
helper
.
layout
=
Layout
(
Div
(
Div
(
Fieldset
(
Fieldset
(
'
Identity
'
,
''
,
'direction'
,
'direction'
,
'description'
,
'description'
,
'foreign_network'
,
'foreign_network'
,
...
@@ -189,7 +191,7 @@ class RuleForm(ModelForm):
...
@@ -189,7 +191,7 @@ class RuleForm(ModelForm):
'nat_external_ipv4'
,
'nat_external_ipv4'
,
),
),
Fieldset
(
Fieldset
(
'External'
,
_
(
'External'
)
,
'vlan'
,
'vlan'
,
'vlangroup'
,
'vlangroup'
,
'host'
,
'host'
,
...
@@ -198,8 +200,8 @@ class RuleForm(ModelForm):
...
@@ -198,8 +200,8 @@ class RuleForm(ModelForm):
)
)
),
),
FormActions
(
FormActions
(
Submit
(
'submit'
,
'Save'
),
Submit
(
'submit'
,
_
(
"Save"
)
),
LinkButton
(
'back'
,
'Back'
,
reverse_lazy
(
'network.rule_list'
))
LinkButton
(
'back'
,
_
(
"Back"
)
,
reverse_lazy
(
'network.rule_list'
))
)
)
)
)
...
@@ -219,8 +221,8 @@ class SwitchPortForm(ModelForm):
...
@@ -219,8 +221,8 @@ class SwitchPortForm(ModelForm):
)
)
),
),
FormActions
(
FormActions
(
Submit
(
'submit'
,
'Save'
),
Submit
(
'submit'
,
_
(
"Save"
)
),
LinkButton
(
'back'
,
'Back'
,
LinkButton
(
'back'
,
_
(
"Back"
)
,
reverse_lazy
(
'network.switch_port_list'
))
reverse_lazy
(
'network.switch_port_list'
))
)
)
)
)
...
@@ -234,41 +236,42 @@ class VlanForm(ModelForm):
...
@@ -234,41 +236,42 @@ class VlanForm(ModelForm):
helper
.
layout
=
Layout
(
helper
.
layout
=
Layout
(
Div
(
Div
(
Fieldset
(
Fieldset
(
'
Identity
'
,
''
,
'name'
,
'name'
,
'vid'
,
'vid'
,
'network_type'
,
'network_type'
,
'managed'
,
'managed'
,
),
),
Fieldset
(
Fieldset
(
'IPv4'
,
_
(
'IPv4'
)
,
'network4'
,
'network4'
,
'snat_to'
,
'snat_to'
,
'snat_ip'
,
'snat_ip'
,
'dhcp_pool'
,
'dhcp_pool'
,
),
),
Fieldset
(
Fieldset
(
'IPv6'
,
_
(
'IPv6'
)
,
'network6'
,
'network6'
,
'ipv6_template'
,
'ipv6_template'
,
'host_ipv6_prefixlen'
,
'host_ipv6_prefixlen'
,
),
),
Fieldset
(
Fieldset
(
'Domain name service'
,
_
(
'Domain name service'
)
,
'domain'
,
'domain'
,
'reverse_domain'
,
'reverse_domain'
,
),
),
Fieldset
(
Fieldset
(
'Info'
,
_
(
'Info'
)
,
'description'
,
'description'
,
'comment'
,
'comment'
,
'owner'
,
# 'created_at',
# 'created_at',
# 'modified_at',
# 'modified_at',
),
),
),
),
FormActions
(
FormActions
(
Submit
(
'submit'
,
'Save'
),
Submit
(
'submit'
,
_
(
"Save"
)
),
LinkButton
(
'back'
,
'Back'
,
reverse_lazy
(
'network.vlan_list'
))
LinkButton
(
'back'
,
_
(
"Back"
)
,
reverse_lazy
(
'network.vlan_list'
))
)
)
)
)
...
@@ -289,8 +292,8 @@ class VlanGroupForm(ModelForm):
...
@@ -289,8 +292,8 @@ class VlanGroupForm(ModelForm):
)
)
),
),
FormActions
(
FormActions
(
Submit
(
'submit'
,
'Save'
),
Submit
(
'submit'
,
_
(
"Save"
)
),
LinkButton
(
'back'
,
'Back'
,
reverse_lazy
(
LinkButton
(
'back'
,
_
(
"Back"
)
,
reverse_lazy
(
'network.vlan_group_list'
))
'network.vlan_group_list'
))
)
)
)
)
...
...
circle/network/views.py
View file @
04bbf626
...
@@ -34,6 +34,7 @@ from .forms import (HostForm, VlanForm, DomainForm, GroupForm, RecordForm,
...
@@ -34,6 +34,7 @@ from .forms import (HostForm, VlanForm, DomainForm, GroupForm, RecordForm,
BlacklistItemForm
,
RuleForm
,
VlanGroupForm
,
SwitchPortForm
)
BlacklistItemForm
,
RuleForm
,
VlanGroupForm
,
SwitchPortForm
)
from
django.contrib
import
messages
from
django.contrib
import
messages
from
django.contrib.messages.views
import
SuccessMessageMixin
from
django.views.generic.edit
import
FormMixin
from
django.views.generic.edit
import
FormMixin
from
django.utils.translation
import
ugettext_lazy
as
_
from
django.utils.translation
import
ugettext_lazy
as
_
from
braces.views
import
LoginRequiredMixin
,
SuperuserRequiredMixin
from
braces.views
import
LoginRequiredMixin
,
SuperuserRequiredMixin
...
@@ -45,22 +46,11 @@ from dashboard.views import AclUpdateView
...
@@ -45,22 +46,11 @@ from dashboard.views import AclUpdateView
from
dashboard.forms
import
AclUserOrGroupAddForm
from
dashboard.forms
import
AclUserOrGroupAddForm
class
SuccessMessageMixin
(
FormMixin
):
class
InitialOwnerMixin
(
FormMixin
):
"""
def
get_initial
(
self
):
Adds a success message on successful form submission.
initial
=
super
(
InitialOwnerMixin
,
self
)
.
get_initial
()
From django/contrib/messages/views.py@9a85ad89
initial
[
'owner'
]
=
self
.
request
.
user
"""
return
initial
success_message
=
''
def
form_valid
(
self
,
form
):
response
=
super
(
SuccessMessageMixin
,
self
)
.
form_valid
(
form
)
success_message
=
self
.
get_success_message
(
form
.
cleaned_data
)
if
success_message
:
messages
.
success
(
self
.
request
,
success_message
)
return
response
def
get_success_message
(
self
,
cleaned_data
):
return
self
.
success_message
%
cleaned_data
class
IndexView
(
LoginRequiredMixin
,
SuperuserRequiredMixin
,
TemplateView
):
class
IndexView
(
LoginRequiredMixin
,
SuperuserRequiredMixin
,
TemplateView
):
...
@@ -190,7 +180,7 @@ class DomainDetail(LoginRequiredMixin, SuperuserRequiredMixin,
...
@@ -190,7 +180,7 @@ class DomainDetail(LoginRequiredMixin, SuperuserRequiredMixin,
class
DomainCreate
(
LoginRequiredMixin
,
SuperuserRequiredMixin
,
class
DomainCreate
(
LoginRequiredMixin
,
SuperuserRequiredMixin
,
SuccessMessageMixin
,
CreateView
):
SuccessMessageMixin
,
InitialOwnerMixin
,
CreateView
):
model
=
Domain
model
=
Domain
template_name
=
"network/domain-create.html"
template_name
=
"network/domain-create.html"
form_class
=
DomainForm
form_class
=
DomainForm
...
@@ -274,7 +264,7 @@ class GroupList(LoginRequiredMixin, SuperuserRequiredMixin, SingleTableView):
...
@@ -274,7 +264,7 @@ class GroupList(LoginRequiredMixin, SuperuserRequiredMixin, SingleTableView):
class
GroupCreate
(
LoginRequiredMixin
,
SuperuserRequiredMixin
,
class
GroupCreate
(
LoginRequiredMixin
,
SuperuserRequiredMixin
,
SuccessMessageMixin
,
CreateView
):
SuccessMessageMixin
,
InitialOwnerMixin
,
CreateView
):
model
=
Group
model
=
Group
template_name
=
"network/group-create.html"
template_name
=
"network/group-create.html"
form_class
=
GroupForm
form_class
=
GroupForm
...
@@ -413,7 +403,7 @@ class HostDetail(LoginRequiredMixin, SuperuserRequiredMixin,
...
@@ -413,7 +403,7 @@ class HostDetail(LoginRequiredMixin, SuperuserRequiredMixin,
class
HostCreate
(
LoginRequiredMixin
,
SuperuserRequiredMixin
,
class
HostCreate
(
LoginRequiredMixin
,
SuperuserRequiredMixin
,
SuccessMessageMixin
,
CreateView
):
SuccessMessageMixin
,
InitialOwnerMixin
,
CreateView
):
model
=
Host
model
=
Host
template_name
=
"network/host-create.html"
template_name
=
"network/host-create.html"
form_class
=
HostForm
form_class
=
HostForm
...
@@ -497,7 +487,7 @@ class RecordDetail(LoginRequiredMixin, SuperuserRequiredMixin,
...
@@ -497,7 +487,7 @@ class RecordDetail(LoginRequiredMixin, SuperuserRequiredMixin,
class
RecordCreate
(
LoginRequiredMixin
,
SuperuserRequiredMixin
,
class
RecordCreate
(
LoginRequiredMixin
,
SuperuserRequiredMixin
,
SuccessMessageMixin
,
CreateView
):
SuccessMessageMixin
,
InitialOwnerMixin
,
CreateView
):
model
=
Record
model
=
Record
template_name
=
"network/record-create.html"
template_name
=
"network/record-create.html"
form_class
=
RecordForm
form_class
=
RecordForm
...
@@ -505,21 +495,21 @@ class RecordCreate(LoginRequiredMixin, SuperuserRequiredMixin,
...
@@ -505,21 +495,21 @@ class RecordCreate(LoginRequiredMixin, SuperuserRequiredMixin,
success_message
=
_
(
u'Successfully created record!'
)
success_message
=
_
(
u'Successfully created record!'
)
def
get_initial
(
self
):
def
get_initial
(
self
):
initial
=
super
(
RecordCreate
,
self
)
.
get_initial
()
initial
[
'domain'
]
=
self
.
request
.
GET
.
get
(
'domain'
)
host_pk
=
self
.
request
.
GET
.
get
(
"host"
)
host_pk
=
self
.
request
.
GET
.
get
(
"host"
)
try
:
try
:
host
=
Host
.
objects
.
get
(
pk
=
host_pk
)
host
=
Host
.
objects
.
get
(
pk
=
host_pk
)
except
(
Host
.
DoesNotExist
,
ValueError
):
except
(
Host
.
DoesNotExist
,
ValueError
):
host
=
None
host
=
None
initial
=
{
'owner'
:
self
.
request
.
user
}
if
host
:
if
host
:
initial
.
update
({
initial
.
update
({
'type'
:
"CNAME"
,
'type'
:
"CNAME"
,
'host'
:
host
,
'host'
:
host
,
'address'
:
host
.
get_fqdn
(),
'address'
:
host
.
get_fqdn
(),
})
})
else
:
initial
[
'domain'
]
=
self
.
request
.
GET
.
get
(
'domain'
)
return
initial
return
initial
...
@@ -569,18 +559,19 @@ class RuleDetail(LoginRequiredMixin, SuperuserRequiredMixin,
...
@@ -569,18 +559,19 @@ class RuleDetail(LoginRequiredMixin, SuperuserRequiredMixin,
class
RuleCreate
(
LoginRequiredMixin
,
SuperuserRequiredMixin
,
class
RuleCreate
(
LoginRequiredMixin
,
SuperuserRequiredMixin
,
SuccessMessageMixin
,
CreateView
):
SuccessMessageMixin
,
InitialOwnerMixin
,
CreateView
):
model
=
Rule
model
=
Rule
template_name
=
"network/rule-create.html"
template_name
=
"network/rule-create.html"
form_class
=
RuleForm
form_class
=
RuleForm
success_message
=
_
(
u'Successfully created rule!'
)
success_message
=
_
(
u'Successfully created rule!'
)
def
get_initial
(
self
):
def
get_initial
(
self
):
return
{
initial
=
super
(
RuleCreate
,
self
)
.
get_initial
()
# 'owner': 1,
initial
.
update
({
'host'
:
self
.
request
.
GET
.
get
(
'host'
),
'host'
:
self
.
request
.
GET
.
get
(
'host'
),
'hostgroup'
:
self
.
request
.
GET
.
get
(
'hostgroup'
)
'hostgroup'
:
self
.
request
.
GET
.
get
(
'hostgroup'
)
}
})
return
initial
class
RuleDelete
(
LoginRequiredMixin
,
SuperuserRequiredMixin
,
DeleteView
):
class
RuleDelete
(
LoginRequiredMixin
,
SuperuserRequiredMixin
,
DeleteView
):
...
@@ -680,7 +671,7 @@ class VlanDetail(LoginRequiredMixin, SuperuserRequiredMixin,
...
@@ -680,7 +671,7 @@ class VlanDetail(LoginRequiredMixin, SuperuserRequiredMixin,
class
VlanCreate
(
LoginRequiredMixin
,
SuperuserRequiredMixin
,
class
VlanCreate
(
LoginRequiredMixin
,
SuperuserRequiredMixin
,
SuccessMessageMixin
,
CreateView
):
SuccessMessageMixin
,
InitialOwnerMixin
,
CreateView
):
model
=
Vlan
model
=
Vlan
template_name
=
"network/vlan-create.html"
template_name
=
"network/vlan-create.html"
form_class
=
VlanForm
form_class
=
VlanForm
...
@@ -760,7 +751,7 @@ class VlanGroupDetail(LoginRequiredMixin, SuperuserRequiredMixin,
...
@@ -760,7 +751,7 @@ class VlanGroupDetail(LoginRequiredMixin, SuperuserRequiredMixin,
class
VlanGroupCreate
(
LoginRequiredMixin
,
SuperuserRequiredMixin
,
class
VlanGroupCreate
(
LoginRequiredMixin
,
SuperuserRequiredMixin
,
SuccessMessageMixin
,
CreateView
):
SuccessMessageMixin
,
InitialOwnerMixin
,
CreateView
):
model
=
VlanGroup
model
=
VlanGroup
template_name
=
"network/vlan-group-create.html"
template_name
=
"network/vlan-group-create.html"
form_class
=
VlanGroupForm
form_class
=
VlanGroupForm
...
...
circle/storage/models.py
View file @
04bbf626
...
@@ -367,7 +367,8 @@ class Disk(TimeStampedModel):
...
@@ -367,7 +367,8 @@ class Disk(TimeStampedModel):
disk
=
cls
.
__create
(
user
,
params
)
disk
=
cls
.
__create
(
user
,
params
)
disk
.
clean
()
disk
.
clean
()
disk
.
save
()
disk
.
save
()
logger
.
debug
(
"Disk created:
%
s"
,
params
)
logger
.
debug
(
u"Disk created from:
%
s"
,
unicode
(
params
.
get
(
"base"
,
"nobase"
)))
return
disk
return
disk
@classmethod
@classmethod
...
...
circle/vm/migrations/0027_auto__add_field_instance_has_agent__add_field_instancetemplate_has_age.py
0 → 100644
View file @
04bbf626
This diff is collapsed.
Click to expand it.
circle/vm/models/activity.py
View file @
04bbf626
...
@@ -24,7 +24,7 @@ from celery.signals import worker_ready
...
@@ -24,7 +24,7 @@ from celery.signals import worker_ready
from
celery.contrib.abortable
import
AbortableAsyncResult
from
celery.contrib.abortable
import
AbortableAsyncResult
from
django.core.urlresolvers
import
reverse
from
django.core.urlresolvers
import
reverse
from
django.db.models
import
CharField
,
ForeignKey
from
django.db.models
import
CharField
,
ForeignKey
,
BooleanField
from
django.utils
import
timezone
from
django.utils
import
timezone
from
django.utils.translation
import
ugettext_lazy
as
_
,
ugettext_noop
from
django.utils.translation
import
ugettext_lazy
as
_
,
ugettext_noop
...
@@ -70,6 +70,8 @@ class InstanceActivity(ActivityModel):
...
@@ -70,6 +70,8 @@ class InstanceActivity(ActivityModel):
help_text
=
_
(
'Instance this activity works on.'
),
help_text
=
_
(
'Instance this activity works on.'
),
verbose_name
=
_
(
'instance'
))
verbose_name
=
_
(
'instance'
))
resultant_state
=
CharField
(
blank
=
True
,
max_length
=
20
,
null
=
True
)
resultant_state
=
CharField
(
blank
=
True
,
max_length
=
20
,
null
=
True
)
interruptible
=
BooleanField
(
default
=
False
,
help_text
=
_
(
'Other activities can interrupt this one.'
))
class
Meta
:
class
Meta
:
app_label
=
'vm'
app_label
=
'vm'
...
@@ -91,24 +93,30 @@ class InstanceActivity(ActivityModel):
...
@@ -91,24 +93,30 @@ class InstanceActivity(ActivityModel):
@classmethod
@classmethod
def
create
(
cls
,
code_suffix
,
instance
,
task_uuid
=
None
,
user
=
None
,
def
create
(
cls
,
code_suffix
,
instance
,
task_uuid
=
None
,
user
=
None
,
concurrency_check
=
True
,
readable_name
=
None
,
concurrency_check
=
True
,
readable_name
=
None
,
resultant_state
=
None
):
resultant_state
=
None
,
interruptible
=
False
):
readable_name
=
_normalize_readable_name
(
readable_name
,
code_suffix
)
readable_name
=
_normalize_readable_name
(
readable_name
,
code_suffix
)
# Check for concurrent activities
# Check for concurrent activities
active_activities
=
instance
.
activity_log
.
filter
(
finished__isnull
=
True
)
active_activities
=
instance
.
activity_log
.
filter
(
finished__isnull
=
True
)
if
concurrency_check
and
active_activities
.
exists
():
if
concurrency_check
and
active_activities
.
exists
():
raise
ActivityInProgressError
.
create
(
active_activities
[
0
])
for
i
in
active_activities
:
if
i
.
interruptible
:
activity_code
=
join_activity_code
(
cls
.
ACTIVITY_CODE_BASE
,
code_suffix
)
i
.
finish
(
False
,
result
=
ugettext_noop
(
"Interrupted by other activity."
))
else
:
raise
ActivityInProgressError
.
create
(
i
)
activity_code
=
cls
.
construct_activity_code
(
code_suffix
)
act
=
cls
(
activity_code
=
activity_code
,
instance
=
instance
,
parent
=
None
,
act
=
cls
(
activity_code
=
activity_code
,
instance
=
instance
,
parent
=
None
,
resultant_state
=
resultant_state
,
started
=
timezone
.
now
(),
resultant_state
=
resultant_state
,
started
=
timezone
.
now
(),
readable_name_data
=
readable_name
.
to_dict
(),
readable_name_data
=
readable_name
.
to_dict
(),
task_uuid
=
task_uuid
,
user
=
user
)
task_uuid
=
task_uuid
,
user
=
user
,
interruptible
=
interruptible
)
act
.
save
()
act
.
save
()
return
act
return
act
def
create_sub
(
self
,
code_suffix
,
task_uuid
=
None
,
concurrency_check
=
True
,
def
create_sub
(
self
,
code_suffix
,
task_uuid
=
None
,
concurrency_check
=
True
,
readable_name
=
None
,
resultant_state
=
None
):
readable_name
=
None
,
resultant_state
=
None
,
interruptible
=
False
):
readable_name
=
_normalize_readable_name
(
readable_name
,
code_suffix
)
readable_name
=
_normalize_readable_name
(
readable_name
,
code_suffix
)
# Check for concurrent activities
# Check for concurrent activities
...
@@ -119,7 +127,7 @@ class InstanceActivity(ActivityModel):
...
@@ -119,7 +127,7 @@ class InstanceActivity(ActivityModel):
act
=
InstanceActivity
(
act
=
InstanceActivity
(
activity_code
=
join_activity_code
(
self
.
activity_code
,
code_suffix
),
activity_code
=
join_activity_code
(
self
.
activity_code
,
code_suffix
),
instance
=
self
.
instance
,
parent
=
self
,
instance
=
self
.
instance
,
parent
=
self
,
resultant_state
=
resultant_state
,
resultant_state
=
resultant_state
,
interruptible
=
interruptible
,
readable_name_data
=
readable_name
.
to_dict
(),
started
=
timezone
.
now
(),
readable_name_data
=
readable_name
.
to_dict
(),
started
=
timezone
.
now
(),
task_uuid
=
task_uuid
,
user
=
self
.
user
)
task_uuid
=
task_uuid
,
user
=
self
.
user
)
act
.
save
()
act
.
save
()
...
@@ -183,13 +191,14 @@ class InstanceActivity(ActivityModel):
...
@@ -183,13 +191,14 @@ class InstanceActivity(ActivityModel):
@contextmanager
@contextmanager
def
sub_activity
(
self
,
code_suffix
,
on_abort
=
None
,
on_commit
=
None
,
def
sub_activity
(
self
,
code_suffix
,
on_abort
=
None
,
on_commit
=
None
,
readable_name
=
None
,
task_uuid
=
None
,
readable_name
=
None
,
task_uuid
=
None
,
concurrency_check
=
True
):
concurrency_check
=
True
,
interruptible
=
False
):
"""Create a transactional context for a nested instance activity.
"""Create a transactional context for a nested instance activity.
"""
"""
if
not
readable_name
:
if
not
readable_name
:
warn
(
"Set readable_name"
,
stacklevel
=
3
)
warn
(
"Set readable_name"
,
stacklevel
=
3
)
act
=
self
.
create_sub
(
code_suffix
,
task_uuid
,
concurrency_check
,
act
=
self
.
create_sub
(
code_suffix
,
task_uuid
,
concurrency_check
,
readable_name
=
readable_name
)
readable_name
=
readable_name
,
interruptible
=
interruptible
)
return
activitycontextimpl
(
act
,
on_abort
=
on_abort
,
on_commit
=
on_commit
)
return
activitycontextimpl
(
act
,
on_abort
=
on_abort
,
on_commit
=
on_commit
)
def
get_operation
(
self
):
def
get_operation
(
self
):
...
...
circle/vm/models/instance.py
View file @
04bbf626
...
@@ -123,6 +123,10 @@ class VirtualMachineDescModel(BaseResourceConfigModel):
...
@@ -123,6 +123,10 @@ class VirtualMachineDescModel(BaseResourceConfigModel):
'format like "
%
s".'
)
%
'format like "
%
s".'
)
%
'Ubuntu 12.04 LTS Desktop amd64'
))
'Ubuntu 12.04 LTS Desktop amd64'
))
tags
=
TaggableManager
(
blank
=
True
,
verbose_name
=
_
(
"tags"
))
tags
=
TaggableManager
(
blank
=
True
,
verbose_name
=
_
(
"tags"
))
has_agent
=
BooleanField
(
verbose_name
=
_
(
'has agent'
),
default
=
True
,
help_text
=
_
(
'If the machine has agent installed, and '
'the manager should wait for its start.'
))
class
Meta
:
class
Meta
:
abstract
=
True
abstract
=
True
...
@@ -424,7 +428,8 @@ class Instance(AclBase, VirtualMachineDescModel, StatusModel, OperatedMixin,
...
@@ -424,7 +428,8 @@ class Instance(AclBase, VirtualMachineDescModel, StatusModel, OperatedMixin,
# prepare parameters
# prepare parameters
common_fields
=
[
'name'
,
'description'
,
'num_cores'
,
'ram_size'
,
common_fields
=
[
'name'
,
'description'
,
'num_cores'
,
'ram_size'
,
'max_ram_size'
,
'arch'
,
'priority'
,
'boot_menu'
,
'max_ram_size'
,
'arch'
,
'priority'
,
'boot_menu'
,
'raw_data'
,
'lease'
,
'access_method'
,
'system'
]
'raw_data'
,
'lease'
,
'access_method'
,
'system'
,
'has_agent'
]
params
=
dict
(
template
=
template
,
owner
=
owner
,
pw
=
pwgen
())
params
=
dict
(
template
=
template
,
owner
=
owner
,
pw
=
pwgen
())
params
.
update
([(
f
,
getattr
(
template
,
f
))
for
f
in
common_fields
])
params
.
update
([(
f
,
getattr
(
template
,
f
))
for
f
in
common_fields
])
params
.
update
(
kwargs
)
# override defaults w/ user supplied values
params
.
update
(
kwargs
)
# override defaults w/ user supplied values
...
...
circle/vm/operations.py
View file @
04bbf626
...
@@ -299,16 +299,20 @@ class DeployOperation(InstanceOperation):
...
@@ -299,16 +299,20 @@ class DeployOperation(InstanceOperation):
"deploy network"
)):
"deploy network"
)):
self
.
instance
.
deploy_net
()
self
.
instance
.
deploy_net
()
try
:
self
.
instance
.
renew
(
parent_activity
=
activity
)
except
:
pass
# Resume vm
# Resume vm
with
activity
.
sub_activity
(
with
activity
.
sub_activity
(
'booting'
,
readable_name
=
ugettext_noop
(
'booting'
,
readable_name
=
ugettext_noop
(
"boot virtual machine"
)):
"boot virtual machine"
)):
self
.
instance
.
resume_vm
(
timeout
=
timeout
)
self
.
instance
.
resume_vm
(
timeout
=
timeout
)
try
:
if
self
.
instance
.
has_agent
:
self
.
instance
.
renew
(
parent_activity
=
activity
)
activity
.
sub_activity
(
'os_boot'
,
readable_name
=
ugettext_noop
(
except
:
"wait operating system loading"
),
interruptible
=
True
)
pass
register_operation
(
DeployOperation
)
register_operation
(
DeployOperation
)
...
@@ -425,8 +429,11 @@ class RebootOperation(InstanceOperation):
...
@@ -425,8 +429,11 @@ class RebootOperation(InstanceOperation):
required_perms
=
()
required_perms
=
()
accept_states
=
(
'RUNNING'
,
)
accept_states
=
(
'RUNNING'
,
)
def
_operation
(
self
,
timeout
=
5
):
def
_operation
(
self
,
activity
,
timeout
=
5
):
self
.
instance
.
reboot_vm
(
timeout
=
timeout
)
self
.
instance
.
reboot_vm
(
timeout
=
timeout
)
if
self
.
instance
.
has_agent
:
activity
.
sub_activity
(
'os_boot'
,
readable_name
=
ugettext_noop
(
"wait operating system loading"
),
interruptible
=
True
)
register_operation
(
RebootOperation
)
register_operation
(
RebootOperation
)
...
@@ -499,8 +506,11 @@ class ResetOperation(InstanceOperation):
...
@@ -499,8 +506,11 @@ class ResetOperation(InstanceOperation):
required_perms
=
()
required_perms
=
()
accept_states
=
(
'RUNNING'
,
)
accept_states
=
(
'RUNNING'
,
)
def
_operation
(
self
,
timeout
=
5
):
def
_operation
(
self
,
activity
,
timeout
=
5
):
self
.
instance
.
reset_vm
(
timeout
=
timeout
)
self
.
instance
.
reset_vm
(
timeout
=
timeout
)
if
self
.
instance
.
has_agent
:
activity
.
sub_activity
(
'os_boot'
,
readable_name
=
ugettext_noop
(
"wait operating system loading"
),
interruptible
=
True
)
register_operation
(
ResetOperation
)
register_operation
(
ResetOperation
)
...
...
circle/vm/tasks/local_agent_tasks.py
View file @
04bbf626
...
@@ -85,16 +85,22 @@ def agent_started(vm, version=None):
...
@@ -85,16 +85,22 @@ def agent_started(vm, version=None):
from
vm.models
import
Instance
,
instance_activity
,
InstanceActivity
from
vm.models
import
Instance
,
instance_activity
,
InstanceActivity
instance
=
Instance
.
objects
.
get
(
id
=
int
(
vm
.
split
(
'-'
)[
-
1
]))
instance
=
Instance
.
objects
.
get
(
id
=
int
(
vm
.
split
(
'-'
)[
-
1
]))
queue
=
instance
.
get_remote_queue_name
(
"agent"
)
queue
=
instance
.
get_remote_queue_name
(
"agent"
)
initialized
=
InstanceActivity
.
objects
.
filter
(
initialized
=
instance
.
activity_log
.
filter
(
instance
=
instance
,
activity_code
=
'vm.Instance.agent.cleanup'
)
.
exists
()
activity_code
=
'vm.Instance.agent.cleanup'
)
.
exists
()
with
instance_activity
(
code_suffix
=
'agent'
,
with
instance_activity
(
code_suffix
=
'agent'
,
readable_name
=
ugettext_noop
(
'agent'
),
readable_name
=
ugettext_noop
(
'agent'
),
concurrency_check
=
False
,
instance
=
instance
)
as
act
:
instance
=
instance
)
as
act
:
with
act
.
sub_activity
(
'starting'
,
with
act
.
sub_activity
(
'starting'
,
readable_name
=
ugettext_noop
(
'starting'
)):
readable_name
=
ugettext_noop
(
'starting'
)):
pass
pass
for
i
in
InstanceActivity
.
objects
.
filter
(
instance
=
instance
,
activity_code__endswith
=
'.os_boot'
,
finished__isnull
=
True
):
i
.
finish
(
True
)
if
version
and
version
!=
settings
.
AGENT_VERSION
:
if
version
and
version
!=
settings
.
AGENT_VERSION
:
try
:
try
:
update_agent
(
instance
,
act
)
update_agent
(
instance
,
act
)
...
@@ -108,10 +114,9 @@ def agent_started(vm, version=None):
...
@@ -108,10 +114,9 @@ def agent_started(vm, version=None):
send_init_commands
(
instance
,
act
)
send_init_commands
(
instance
,
act
)
send_networking_commands
(
instance
,
act
)
send_networking_commands
(
instance
,
act
)
with
act
.
sub_activity
(
with
act
.
sub_activity
(
'start_access_server'
,
'start_access_server'
,
readable_name
=
ugettext_noop
(
readable_name
=
ugettext_noop
(
'start access server'
)
'start access server'
)):
):
start_access_server
.
apply_async
(
queue
=
queue
,
args
=
(
vm
,
))
start_access_server
.
apply_async
(
queue
=
queue
,
args
=
(
vm
,
))
...
...
circle/vm/tests/test_models.py
View file @
04bbf626
...
@@ -217,6 +217,8 @@ class InstanceActivityTestCase(TestCase):
...
@@ -217,6 +217,8 @@ class InstanceActivityTestCase(TestCase):
def
test_create_concurrency_check
(
self
):
def
test_create_concurrency_check
(
self
):
instance
=
MagicMock
(
spec
=
Instance
)
instance
=
MagicMock
(
spec
=
Instance
)
instance
.
activity_log
.
filter
.
return_value
.
__iter__
.
return_value
=
iter
(
[
MagicMock
(
spec
=
InstanceActivity
,
interruptible
=
False
)])
instance
.
activity_log
.
filter
.
return_value
.
exists
.
return_value
=
True
instance
.
activity_log
.
filter
.
return_value
.
exists
.
return_value
=
True
with
self
.
assertRaises
(
ActivityInProgressError
):
with
self
.
assertRaises
(
ActivityInProgressError
):
...
...
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