Use UUIDs for flavor create/edit.

Now that Nova accepts strings as flavor IDs we can just use UUIDs
on our end and get rid of the horrors of trying to guess the next
integer ID. This fixes all the instability in flavor editing.

Fixes bug 1057799.

Change-Id: I55eb1d7408655fd27e81cc1196f15ceb3659a7b4
This commit is contained in:
Gabriel Hurley 2012-10-24 14:03:17 -07:00
parent a0ad0d49a9
commit ef4e9314eb
2 changed files with 7 additions and 25 deletions

View File

@ -19,6 +19,7 @@
# under the License.
import logging
import uuid
from django.utils.translation import ugettext_lazy as _
@ -39,22 +40,6 @@ class CreateFlavor(forms.SelfHandlingForm):
disk_gb = forms.IntegerField(label=_("Root Disk GB"))
eph_gb = forms.IntegerField(label=_("Ephemeral Disk GB"))
def _get_new_flavor_id(self):
# TODO(gabriel): Get rid of this hack after flavor
# id handling is improved in Nova's API.
flavors = []
try:
flavors = api.nova.flavor_list(self.request)
except:
exceptions.handle(self.request,
_("Unable to get unique ID for new flavor."))
if flavors:
largest_id = max(flavors, key=lambda f: f.id).id
flavor_id = int(largest_id) + 1
else:
flavor_id = 1
return flavor_id
def handle(self, request, data):
try:
flavor = api.nova.flavor_create(request,
@ -62,7 +47,7 @@ class CreateFlavor(forms.SelfHandlingForm):
data['memory_mb'],
data['vcpus'],
data['disk_gb'],
self._get_new_flavor_id(),
uuid.uuid4(),
ephemeral=data['eph_gb'])
msg = _('Created flavor "%s".') % data['name']
messages.success(request, msg)
@ -87,7 +72,7 @@ class EditFlavor(CreateFlavor):
data['memory_mb'],
data['vcpus'],
data['disk_gb'],
self._get_new_flavor_id(),
uuid.uuid4(),
ephemeral=data['eph_gb'])
msg = _('Updated flavor "%s".') % data['name']
messages.success(request, msg)

View File

@ -1,3 +1,5 @@
import uuid
from django import http
from django.core.urlresolvers import reverse
from mox import IsA
@ -14,13 +16,12 @@ class FlavorsTests(test.BaseAdminViewTests):
self.mox.StubOutWithMock(api.nova, 'flavor_create')
# no pre-existing flavors
api.nova.flavor_list(IsA(http.HttpRequest)).AndReturn([])
api.nova.flavor_create(IsA(http.HttpRequest),
flavor.name,
flavor.ram,
flavor.vcpus,
flavor.disk,
1, # Flavor id 1 because there are no others.
IsA(uuid.uuid4()),
ephemeral=eph).AndReturn(flavor)
self.mox.ReplayAll()
@ -39,9 +40,7 @@ class FlavorsTests(test.BaseAdminViewTests):
reverse("horizon:admin:flavors:index"))
def test_edit_flavor(self):
flavors = self.flavors.list()
flavor = self.flavors.first()
next_id = int(max(flavors, key=lambda f: f.id).id) + 1
eph = getattr(flavor, 'OS-FLV-EXT-DATA:ephemeral')
self.mox.StubOutWithMock(api.nova, 'flavor_list')
self.mox.StubOutWithMock(api.nova, 'flavor_get')
@ -54,14 +53,12 @@ class FlavorsTests(test.BaseAdminViewTests):
# POST
api.nova.flavor_get(IsA(http.HttpRequest), flavor.id).AndReturn(flavor)
api.nova.flavor_delete(IsA(http.HttpRequest), int(flavor.id))
api.nova.flavor_list(IsA(http.HttpRequest)) \
.AndReturn(flavors)
api.nova.flavor_create(IsA(http.HttpRequest),
flavor.name,
flavor.ram,
flavor.vcpus + 1,
flavor.disk,
next_id,
IsA(uuid.uuid4()),
ephemeral=eph).AndReturn(flavor)
self.mox.ReplayAll()