Add ability to choose flavor in dashboard if value "0"

Adds the ability to choose flavor smaller than that of the glance.min_disk
if the value is "0". The "0" case is a special case which uses the native
base image size as the size of the ephemeral root volume.

Change-Id: I2ed98a2a07fd075b1ea6362d8955911604286d7c
Closes-Bug: #1677206
This commit is contained in:
Beth Elwell 2017-05-17 17:06:40 +01:00 committed by Radomir Dopieralski
parent 8ecb9c141b
commit 5ae41997c4
3 changed files with 29 additions and 18 deletions

View File

@ -1775,8 +1775,9 @@ class InstanceTests(helpers.ResetImageAPIVersionMixin, helpers.TestCase):
image = self.images.first()
image.min_ram = flavor.ram
image.min_disk = flavor.disk
self._test_launch_form_instance_requirement_error(image, flavor,
keypair_require=True)
res = self._launch_form_instance(image, flavor, keypair=None)
msg = "This field is required"
self.assertContains(res, msg)
@django.test.utils.override_settings(
LAUNCH_INSTANCE_DEFAULTS={'config_drive': True})
@ -2897,9 +2898,7 @@ class InstanceTests(helpers.ResetImageAPIVersionMixin, helpers.TestCase):
'volume_snapshot_list',),
quotas: ('tenant_quota_usages',
'tenant_limit_usages')})
def _test_launch_form_instance_requirement_error(self, image, flavor,
keypair_require=False):
keypair = self.keypairs.first()
def _launch_form_instance(self, image, flavor, keypair=None):
server = self.servers.first()
volume = self.volumes.first()
sec_group = self.security_groups.first()
@ -2952,24 +2951,22 @@ class InstanceTests(helpers.ResetImageAPIVersionMixin, helpers.TestCase):
'volume_id': volume_choice,
'device_name': device_name,
'count': 1}
if not keypair_require:
if keypair:
form_data['keypair'] = keypair.name
url = reverse('horizon:project:instances:launch')
res = self.client.post(url, form_data)
if keypair_require:
msg = "This field is required"
self.assertContains(res, msg)
else:
msg = "The flavor '%s' is too small" % flavor.name
self.assertContains(res, msg)
return res
def test_launch_form_instance_requirement_error_disk(self):
flavor = self.flavors.first()
flavor = self.flavors.get(id="bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb")
image = self.versioned_images.first()
image.min_ram = flavor.ram
image.min_disk = flavor.disk + 1
self._test_launch_form_instance_requirement_error(image, flavor)
keypair = self.keypairs.first()
res = self._launch_form_instance(image, flavor, keypair)
msg = "The flavor '%s' is too small" % flavor.name
self.assertContains(res, msg)
@override_settings(OPENSTACK_API_VERSIONS={'image': 1})
def test_launch_form_instance_requirement_error_disk_glance_v1(self):
@ -2980,7 +2977,20 @@ class InstanceTests(helpers.ResetImageAPIVersionMixin, helpers.TestCase):
image = self.versioned_images.first()
image.min_ram = flavor.ram + 1
image.min_disk = flavor.disk
self._test_launch_form_instance_requirement_error(image, flavor)
keypair = self.keypairs.first()
res = self._launch_form_instance(image, flavor, keypair)
msg = "The flavor '%s' is too small" % flavor.name
self.assertContains(res, msg)
def test_launch_form_instance_zero_value_flavor_with_min_req(self):
flavor = self.flavors.first()
image = self.versioned_images.first()
image.min_ram = flavor.ram
image.min_disk = flavor.disk + 1
keypair = self.keypairs.first()
res = self._launch_form_instance(image, flavor, keypair)
msg = "The flavor '%s' is too small" % flavor.name
self.assertNotContains(res, msg)
@helpers.create_stubs({api.glance: ('image_list_detailed',),
api.neutron: ('network_list',

View File

@ -265,8 +265,9 @@ class SetInstanceDetailsAction(workflows.Action):
return
props_mapping = (("min_ram", "ram"), ("min_disk", "disk"))
for iprop, fprop in props_mapping:
if getattr(image, iprop) > 0 and \
getattr(image, iprop) > getattr(flavor, fprop):
if (getattr(image, iprop) > 0 and
getattr(flavor, fprop) > 0 and
getattr(image, iprop) > getattr(flavor, fprop)):
msg = (_("The flavor '%(flavor)s' is too small "
"for requested image.\n"
"Minimum requirements: "

View File

@ -330,7 +330,7 @@
var sourceType = launchInstanceModel.newInstanceSpec.source_type;
if (source && sourceType &&
(sourceType.type === 'image' || sourceType.type === 'snapshot')) {
if (source.min_disk > 0 && source.min_disk > flavor.disk) {
if (source.min_disk > 0 && flavor.disk > 0 && source.min_disk > flavor.disk) {
/*eslint-disable max-len */
var srcMinDiskMsg = gettext('The selected %(sourceType)s source requires a flavor with at least %(minDisk)s GB of root disk. Select a flavor with a larger root disk or use a different %(sourceType)s source.');
/*eslint-enable max-len */