Merge "Support creation of instance reservation"

This commit is contained in:
Jenkins 2017-08-18 12:16:38 +00:00 committed by Gerrit Code Review
commit 0d6c547552
2 changed files with 83 additions and 10 deletions

View File

@ -56,7 +56,7 @@ class CreateForm(forms.SelfHandlingForm):
required=True,
choices=(
('host', _('Physical Host')),
('instance', _('Virtual Instance (Not yet supported in GUI)'))
('instance', _('Virtual Instance'))
),
widget=forms.ThemableSelectWidget(attrs={
'class': 'switchable',
@ -108,6 +108,52 @@ class CreateForm(forms.SelfHandlingForm):
'placeholder': 'e.g. ["==", "$extra_key", "extra_value"]'})
)
# Fields for instance reservation
amount = forms.IntegerField(
label=_('Instance Count'),
required=False,
help_text=_('Enter the number of instances to reserve.'),
min_value=1,
initial=1,
widget=forms.NumberInput(attrs={
'class': 'switched',
'data-switch-on': 'source',
'data-source-instance': _('Instance Count')})
)
vcpus = forms.IntegerField(
label=_('Number of VCPUs'),
required=False,
help_text=_('Enter the number of VCPUs per instance.'),
min_value=1,
initial=1,
widget=forms.NumberInput(attrs={
'class': 'switched',
'data-switch-on': 'source',
'data-source-instance': _('Number of VCPUs')})
)
memory_mb = forms.IntegerField(
label=_('RAM (MB)'),
required=False,
help_text=_('Enter the size of RAM (MB) per instance'),
min_value=1,
initial=1,
widget=forms.NumberInput(attrs={
'class': 'switched',
'data-switch-on': 'source',
'data-source-instance': _('RAM (MB)')})
)
disk_gb = forms.IntegerField(
label=_('Root Disk (GB)'),
required=False,
help_text=_('Enter the root disk size (GB) per instance'),
min_value=0,
initial=0,
widget=forms.NumberInput(attrs={
'class': 'switched',
'data-switch-on': 'source',
'data-source-instance': _('Root Disk (GB)')})
)
def handle(self, request, data):
if data['resource_type'] == 'host':
reservations = [
@ -121,8 +167,16 @@ class CreateForm(forms.SelfHandlingForm):
}
]
elif data['resource_type'] == 'instance':
raise forms.ValidationError('Virtual instance is not yet '
'supported in GUI')
reservations = [
{
'resource_type': 'virtual:instance',
'amount': data['amount'],
'vcpus': data['vcpus'],
'memory_mb': data['memory_mb'],
'disk_gb': data['disk_gb'],
'affinity': False
}
]
events = []
@ -161,10 +215,6 @@ class CreateForm(forms.SelfHandlingForm):
cleaned_data['end_date'] = (cleaned_data['start_date']
+ datetime.timedelta(days=1))
if cleaned_data['resource_type'] == 'instance':
raise forms.ValidationError('Resource type "virtual instance" is '
'not yet supported in GUI')
class UpdateForm(forms.SelfHandlingForm):

View File

@ -133,17 +133,40 @@ class LeasesTests(test.TestCase):
def test_create_lease_instance_reservation(self):
start_date = datetime(2030, 6, 27, 18, 0, tzinfo=pytz.utc)
end_date = datetime(2030, 6, 30, 18, 0, tzinfo=pytz.utc)
dummy_lease = {}
api.client.lease_create(
IsA(http.HttpRequest),
'lease-1',
start_date.strftime('%Y-%m-%d %H:%M'),
end_date.strftime('%Y-%m-%d %H:%M'),
[
{
'resource_type': 'virtual:instance',
'amount': 3,
'vcpus': 2,
'memory_mb': 4096,
'disk_gb': 128,
'affinity': False
}
],
[]
).AndReturn(dummy_lease)
self.mox.ReplayAll()
form_data = {
'name': 'lease-1',
'start_date': start_date.strftime('%Y-%m-%d %H:%M'),
'end_date': end_date.strftime('%Y-%m-%d %H:%M'),
'resource_type': 'instance',
'amount': 3,
'vcpus': 2,
'memory_mb': 4096,
'disk_gb': 128
}
res = self.client.post(CREATE_URL, form_data)
self.assertTemplateUsed(res, CREATE_TEMPLATE)
self.assertFormErrors(res, 1)
self.assertContains(res, 'not yet supported')
self.assertNoFormErrors(res)
self.assertMessageCount(success=1)
self.assertRedirectsNoFollow(res, INDEX_URL)
@test.create_stubs({api.client: ('lease_create', )})
def test_create_lease_client_error(self):