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:
parent
8ecb9c141b
commit
5ae41997c4
|
@ -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',
|
||||
|
|
|
@ -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: "
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue