From a4ba8e14a68e88887a94ae73f42e36b7bfede7f8 Mon Sep 17 00:00:00 2001 From: Lin Hua Cheng Date: Fri, 22 Mar 2013 16:57:45 -0700 Subject: [PATCH] Add flavor name regex validation to match nova. Fixes bug 1148372 Change-Id: Ia1f4d974ddac6cd22c0b8979e98b2ea8f31deb21 (cherry picked from commit a1012242d7e07c326a485d33371814be9892e1a1) --- .../dashboards/admin/flavors/forms.py | 7 +++- .../dashboards/admin/flavors/tests.py | 37 +++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/openstack_dashboard/dashboards/admin/flavors/forms.py b/openstack_dashboard/dashboards/admin/flavors/forms.py index 28e2df9534..43007fd1ec 100644 --- a/openstack_dashboard/dashboards/admin/flavors/forms.py +++ b/openstack_dashboard/dashboards/admin/flavors/forms.py @@ -33,7 +33,12 @@ LOG = logging.getLogger(__name__) class CreateFlavor(forms.SelfHandlingForm): - name = forms.CharField(max_length="25", label=_("Name")) + name = forms.RegexField(label=_("Name"), + max_length=25, + regex=r'^[\w\.\- ]+$', + error_messages={'invalid': _('Name may only ' + 'contain letters, numbers, underscores, ' + 'periods and hyphens.')}) vcpus = forms.IntegerField(label=_("VCPUs")) memory_mb = forms.IntegerField(label=_("RAM MB")) disk_gb = forms.IntegerField(label=_("Root Disk GB")) diff --git a/openstack_dashboard/dashboards/admin/flavors/tests.py b/openstack_dashboard/dashboards/admin/flavors/tests.py index 10949c4572..93f6be944f 100644 --- a/openstack_dashboard/dashboards/admin/flavors/tests.py +++ b/openstack_dashboard/dashboards/admin/flavors/tests.py @@ -159,6 +159,43 @@ class FlavorsTests(test.BaseAdminViewTests): self.assertRedirectsNoFollow(resp, reverse("horizon:admin:flavors:index")) + @test.create_stubs({api.nova: ('flavor_list', + 'flavor_get'), }) + def test_edit_flavor_set_invalid_name(self): + flavor_a = self.flavors.list()[0] + flavor_b = self.flavors.list()[1] + eph = getattr(flavor_a, 'OS-FLV-EXT-DATA:ephemeral') + invalid_flavor_name = "m1.tiny()" + + # GET + api.nova.flavor_get(IsA(http.HttpRequest), + flavor_a.id).AndReturn(flavor_a) + + # POST + api.nova.flavor_list(IsA(http.HttpRequest)) \ + .AndReturn(self.flavors.list()) + api.nova.flavor_get(IsA(http.HttpRequest), + flavor_a.id).AndReturn(flavor_a) + self.mox.ReplayAll() + + # get_test + url = reverse('horizon:admin:flavors:edit', args=[flavor_a.id]) + resp = self.client.get(url) + self.assertEqual(resp.status_code, 200) + self.assertTemplateUsed(resp, "admin/flavors/edit.html") + + # post test + data = {'flavor_id': flavor_a.id, + 'name': invalid_flavor_name, + 'vcpus': flavor_a.vcpus + 1, + 'memory_mb': flavor_a.ram, + 'disk_gb': flavor_a.disk, + 'swap_mb': flavor_a.swap, + 'eph_gb': eph} + resp = self.client.post(url, data) + self.assertFormErrors(resp, 1, 'Name may only contain letters, ' + 'numbers, underscores, periods and hyphens.') + @test.create_stubs({api.nova: ('flavor_list', 'flavor_get'), }) def test_edit_flavor_set_existing_name(self):