def test_launch_keypairlist_error(self): IMAGE_ID = '2' self.mox.StubOutWithMock(api, 'image_get') api.image_get(IsA(http.HttpRequest), IMAGE_ID).AndReturn(self.visibleImage) self.mox.StubOutWithMock(api, 'token_get_tenant') api.token_get_tenant(IsA(http.HttpRequest), self.TEST_TENANT).AndReturn(self.TEST_TENANT) self.mox.StubOutWithMock(api, 'tenant_quota_get') api.tenant_quota_get(IsA(http.HttpRequest), self.TEST_TENANT).AndReturn(FakeQuota) self.mox.StubOutWithMock(api, 'flavor_list') api.flavor_list(IsA(http.HttpRequest)).AndReturn(self.flavors) exception = api_exceptions.ApiException('apiException') self.mox.StubOutWithMock(api, 'keypair_list') api.keypair_list(IsA(http.HttpRequest)).AndRaise(exception) self.mox.ReplayAll() res = self.client.get(reverse('dash_images_launch', args=[self.TEST_TENANT, IMAGE_ID])) self.assertTemplateUsed(res, 'dash_launch.html') form = res.context['form'] form_keyfield = form.fields['key_name'] self.assertEqual(len(form_keyfield.choices), 0) self.mox.VerifyAll()
def test_image_name(self): self.mox.StubOutWithMock(api, "image_get") api.image_get(IsA(http.HttpRequest), self.IMAGE_OBJ["id"]).AndReturn(api.Image({"name": self.IMAGE_NAME})) server = api.Server(self.inner_server, self.request) self.mox.ReplayAll() image_name = server.image_name self.assertEqual(image_name, self.IMAGE_NAME) self.mox.VerifyAll()
def test_launch_get(self): IMAGE_ID = '1' self.mox.StubOutWithMock(api, 'image_get') api.image_get(IsA(http.HttpRequest), IMAGE_ID).AndReturn(self.visibleImage) self.mox.StubOutWithMock(api, 'tenant_quota_get') api.tenant_quota_get(IsA(http.HttpRequest), self.TEST_TENANT).AndReturn(FakeQuota) self.mox.StubOutWithMock(api, 'token_get_tenant') api.token_get_tenant(IsA(http.HttpRequest), self.TEST_TENANT).AndReturn(self.TEST_TENANT) self.mox.StubOutWithMock(api, 'flavor_list') api.flavor_list(IsA(http.HttpRequest)).AndReturn(self.flavors) self.mox.StubOutWithMock(api, 'keypair_list') api.keypair_list(IsA(http.HttpRequest)).AndReturn(self.keypairs) self.mox.StubOutWithMock(api, 'security_group_list') api.security_group_list(IsA(http.HttpRequest)).AndReturn( self.security_groups) self.mox.ReplayAll() res = self.client.get(reverse('dash_images_launch', args=[self.TEST_TENANT, IMAGE_ID])) self.assertTemplateUsed(res, 'django_openstack/dash/images/launch.html') image = res.context['image'] self.assertEqual(image.name, self.visibleImage.name) self.assertEqual(res.context['tenant'], self.TEST_TENANT) form = res.context['form'] form_flavorfield = form.fields['flavor'] self.assertIn('m1.massive', form_flavorfield.choices[0][1]) form_keyfield = form.fields['key_name'] self.assertEqual(form_keyfield.choices[0][0], self.keypairs[0].name) self.mox.VerifyAll()
def update(request, tenant_id, image_id): try: image = api.image_get(request, image_id) except glance_exception.ClientConnectionError, e: LOG.exception("Error connecting to glance") messages.error(request, _("Error connecting to glance: %s") % e.message)
def launch(request, tenant_id, image_id): def flavorlist(): try: fl = api.flavor_list(request) # TODO add vcpu count to flavors sel = [(f.id, '%s (%svcpu / %sGB Disk / %sMB Ram )' % (f.name, f.vcpus, f.disk, f.ram)) for f in fl] return sorted(sel) except api_exceptions.ApiException: LOG.error('Unable to retrieve list of instance types', exc_info=True) return [(1, 'm1.tiny')] def keynamelist(): try: fl = api.keypair_list(request) sel = [(f.key_name, f.key_name) for f in fl] return sel except api_exceptions.ApiException: LOG.error('Unable to retrieve list of keypairs', exc_info=True) return [] # TODO(mgius): Any reason why these can't be after the launchform logic? # If The form is valid, we've just wasted these two api calls image = api.image_get(request, image_id) tenant = api.token_get_tenant(request, request.user.tenant) quotas = api.tenant_quota_get(request, request.user.tenant) try: quotas.ram = int(quotas.ram)/100 except Exception, e: messages.error(request, 'Error parsing quota for %s: %s' % (image_id, e.message)) return redirect('dash_instances', tenant_id)
def launch(request, tenant_id, image_id): def flavorlist(): try: fl = api.flavor_list(request) # TODO add vcpu count to flavors sel = [(f.id, '%s (%svcpu / %sGB Disk / %sMB Ram )' % (f.name, f.vcpus, f.disk, f.ram)) for f in fl] return sorted(sel) except: return [(1, 'm1.tiny')] def keynamelist(): try: fl = api.keypair_list(request) sel = [(f.key_name, f.key_name) for f in fl] return sel except: return [] image = api.image_get(request, image_id) tenant = api.token_get_tenant(request, request.user.tenant) form, handled = LaunchForm.maybe_handle( request, initial={'flavorlist': flavorlist(), 'keynamelist': keynamelist(), 'image_id': image_id}) if handled: return handled return render_to_response('dash_launch.html', { 'tenant': tenant, 'image': image, 'form': form, }, context_instance=template.RequestContext(request))
def test_launch_get(self): IMAGE_ID = '1' self.mox.StubOutWithMock(api, 'image_get') api.image_get(IsA(http.HttpRequest), IMAGE_ID).AndReturn(self.visibleImage) self.mox.StubOutWithMock(api, 'tenant_quota_get') api.tenant_quota_get(IsA(http.HttpRequest), self.TEST_TENANT).AndReturn(FakeQuota) self.mox.StubOutWithMock(api, 'token_get_tenant') api.token_get_tenant(IsA(http.HttpRequest), self.TEST_TENANT).AndReturn(self.TEST_TENANT) self.mox.StubOutWithMock(api, 'flavor_list') api.flavor_list(IsA(http.HttpRequest)).AndReturn(self.flavors) self.mox.StubOutWithMock(api, 'keypair_list') api.keypair_list(IsA(http.HttpRequest)).AndReturn(self.keypairs) self.mox.StubOutWithMock(api, 'security_group_list') api.security_group_list(IsA(http.HttpRequest)).AndReturn( self.security_groups) self.mox.ReplayAll() res = self.client.get( reverse('dash_images_launch', args=[self.TEST_TENANT, IMAGE_ID])) self.assertTemplateUsed(res, 'django_openstack/dash/images/launch.html') image = res.context['image'] self.assertEqual(image.name, self.visibleImage.name) self.assertEqual(res.context['tenant'], self.TEST_TENANT) form = res.context['form'] form_flavorfield = form.fields['flavor'] self.assertIn('m1.massive', form_flavorfield.choices[0][1]) form_keyfield = form.fields['key_name'] self.assertEqual(form_keyfield.choices[0][0], self.keypairs[0].name) self.mox.VerifyAll()
def handle(self, request, data): image_id = data['image_id'] tenant_id = request.user.tenant_id error_retrieving = _('Unable to retreive image info from glance: %s' % image_id) error_updating = _('Error updating image with id: %s' % image_id) try: image = api.image_get(request, image_id) except glance_exception.ClientConnectionError, e: LOG.exception(_('Error connecting to glance')) messages.error(request, error_retrieving)
def test_image_get(self): IMAGE_ID = "1" glance_api = self.stub_glance_api() glance_api.get_image(IMAGE_ID).AndReturn([TEST_RETURN]) self.mox.ReplayAll() ret_val = api.image_get(self.request, IMAGE_ID) self.assertIsInstance(ret_val, api.Image) self.assertEqual(ret_val._apidict, TEST_RETURN)
def test_launch_flavorlist_error(self): IMAGE_ID = '1' self.mox.StubOutWithMock(api, 'image_get') api.image_get(IsA(http.HttpRequest), IMAGE_ID).AndReturn(self.visibleImage) self.mox.StubOutWithMock(api, 'token_get_tenant') api.token_get_tenant(IsA(http.HttpRequest), self.TEST_TENANT).AndReturn(self.TEST_TENANT) self.mox.StubOutWithMock(api, 'tenant_quota_get') api.tenant_quota_get(IsA(http.HttpRequest), self.TEST_TENANT).AndReturn(FakeQuota) exception = api_exceptions.ApiException('apiException') self.mox.StubOutWithMock(api, 'flavor_list') api.flavor_list(IsA(http.HttpRequest)).AndRaise(exception) self.mox.StubOutWithMock(api, 'keypair_list') api.keypair_list(IsA(http.HttpRequest)).AndReturn(self.keypairs) self.mox.StubOutWithMock(api, 'security_group_list') api.security_group_list(IsA(http.HttpRequest)).AndReturn( self.security_groups) self.mox.ReplayAll() res = self.client.get(reverse('dash_images_launch', args=[self.TEST_TENANT, IMAGE_ID])) self.assertTemplateUsed(res, 'django_openstack/dash/images/launch.html') form = res.context['form'] form_flavorfield = form.fields['flavor'] self.assertIn('m1.tiny', form_flavorfield.choices[0][1]) self.mox.VerifyAll()
def test_launch_keypairlist_error(self): IMAGE_ID = '2' self.mox.StubOutWithMock(api, 'image_get') api.image_get(IsA(http.HttpRequest), IMAGE_ID).AndReturn(self.visibleImage) self.mox.StubOutWithMock(api, 'token_get_tenant') api.token_get_tenant(IsA(http.HttpRequest), self.TEST_TENANT).AndReturn(self.TEST_TENANT) self.mox.StubOutWithMock(api, 'tenant_quota_get') api.tenant_quota_get(IsA(http.HttpRequest), self.TEST_TENANT).AndReturn(FakeQuota) self.mox.StubOutWithMock(api, 'flavor_list') api.flavor_list(IsA(http.HttpRequest)).AndReturn(self.flavors) exception = api_exceptions.ApiException('apiException') self.mox.StubOutWithMock(api, 'keypair_list') api.keypair_list(IsA(http.HttpRequest)).AndRaise(exception) self.mox.StubOutWithMock(api, 'security_group_list') api.security_group_list(IsA(http.HttpRequest)).AndReturn( self.security_groups) self.mox.ReplayAll() res = self.client.get( reverse('dash_images_launch', args=[self.TEST_TENANT, IMAGE_ID])) self.assertTemplateUsed(res, 'django_openstack/dash/images/launch.html') form = res.context['form'] form_keyfield = form.fields['key_name'] self.assertEqual(len(form_keyfield.choices), 0) self.mox.VerifyAll()
def handle(self, request, data): image_id = data['image_id'] tenant_id = request.user.tenant_id try: image = api.image_get(request, image_id) if image.owner == request.user.username: api.image_delete(request, image_id) else: messages.info(request, _("Unable to delete image, you are not \ its owner.")) return redirect('dash_images_update', tenant_id, image_id) except glance_exception.ClientConnectionError, e: LOG.exception("Error connecting to glance") messages.error(request, _("Error connecting to glance: %s") % e.message)
def handle(self, request, data): image_id = data['image_id'] tenant_id = request.user.tenant_id try: image = api.image_get(request, image_id) if image.owner == request.user.username: api.image_delete(request, image_id) else: messages.info( request, "Unable to delete image, you are not \ its owner.") return redirect('dash_images_update', tenant_id, image_id) except glance_exception.ClientConnectionError, e: LOG.exception("Error connecting to glance") messages.error(request, "Error connecting to glance: %s" % e.message)
def handle(self, request, data): image_id = data['image_id'] try: image = api.image_get(request, image_id) flavor = api.flavor_get(request, data['flavor']) api.server_create(request, data['name'], image, flavor, user_data=data['user_data'], key_name=data.get('key_name')) messages.success(request, "Instance was successfully\ launched.") return shortcuts.redirect(request.build_absolute_uri()) except api_exceptions.ApiException, e: messages.error(request, 'Unable to launch instance: %s' % e.message)
def handle(self, request, data): image_id = data['image_id'] tenant_id = data['tenant_id'] try: image = api.image_get(request, image_id) flavor = api.flavor_get(request, data['flavor']) api.server_create(request, data['name'], image, flavor, data.get('key_name'), normalize_newlines(data.get('user_data')), data.get('security_groups')) msg = 'Instance was successfully launched' LOG.info(msg) messages.success(request, msg) return redirect('dash_instances', tenant_id) except api_exceptions.ApiException, e: LOG.exception( 'ApiException while creating instances of image "%s"' % image_id) messages.error(request, 'Unable to launch instance: %s' % e.message)
def handle(self, request, data): image_id = data['image_id'] tenant_id = data['tenant_id'] try: image = api.image_get(request, image_id) flavor = api.flavor_get(request, data['flavor']) api.server_create(request, data['name'], image, flavor, data.get('key_name'), data.get('user_data')) msg = 'Instance was successfully launched' LOG.info(msg) messages.success(request, msg) return redirect('dash_instances', tenant_id) except api_exceptions.ApiException, e: LOG.error('ApiException while creating instances of image "%s"' % image_id, exc_info=True) messages.error(request, 'Unable to launch instance: %s' % e.message)
def test_launch_form_apiexception(self): FLAVOR_ID = self.flavors[0].id IMAGE_ID = '1' KEY_NAME = self.keypairs[0].name SERVER_NAME = 'serverName' USER_DATA = 'userData' form_data = { 'method': 'LaunchForm', 'flavor': FLAVOR_ID, 'image_id': IMAGE_ID, 'key_name': KEY_NAME, 'name': SERVER_NAME, 'tenant_id': self.TEST_TENANT, 'user_data': USER_DATA, 'security_groups': 'default', } self.mox.StubOutWithMock(api, 'image_get') api.image_get(IgnoreArg(), IMAGE_ID).AndReturn(self.visibleImage) self.mox.StubOutWithMock(api, 'token_get_tenant') api.token_get_tenant(IgnoreArg(), self.TEST_TENANT).AndReturn(self.TEST_TENANT) self.mox.StubOutWithMock(api, 'tenant_quota_get') api.tenant_quota_get(IsA(http.HttpRequest), self.TEST_TENANT).AndReturn(FakeQuota) self.mox.StubOutWithMock(api, 'flavor_list') api.flavor_list(IgnoreArg()).AndReturn(self.flavors) self.mox.StubOutWithMock(api, 'keypair_list') api.keypair_list(IgnoreArg()).AndReturn(self.keypairs) self.mox.StubOutWithMock(api, 'security_group_list') api.security_group_list(IsA(http.HttpRequest)).AndReturn( self.security_groups) # called again by the form api.image_get(IgnoreArg(), IMAGE_ID).AndReturn(self.visibleImage) self.mox.StubOutWithMock(api, 'flavor_get') api.flavor_get(IgnoreArg(), IsA(unicode)).AndReturn(self.flavors[0]) self.mox.StubOutWithMock(api, 'server_create') exception = api_exceptions.ApiException('apiException') api.server_create(IsA(http.HttpRequest), SERVER_NAME, self.visibleImage, self.flavors[0], KEY_NAME, USER_DATA, self.security_groups).AndRaise(exception) self.mox.StubOutWithMock(messages, 'error') messages.error(IsA(http.HttpRequest), IsA(str)) self.mox.ReplayAll() url = reverse('dash_images_launch', args=[self.TEST_TENANT, IMAGE_ID]) res = self.client.post(url, form_data) self.assertTemplateUsed(res, 'django_openstack/dash/images/launch.html') self.mox.VerifyAll()
except api_exceptions.ApiException: LOG.exception('Unable to retrieve list of keypairs') return [] def securitygrouplist(): try: fl = api.security_group_list(request) sel = [(f.name, f.name) for f in fl] return sel except novaclient_exceptions.ClientException, e: LOG.exception('Unable to retrieve list of security groups') return [] # TODO(mgius): Any reason why these can't be after the launchform logic? # If The form is valid, we've just wasted these two api calls image = api.image_get(request, image_id) tenant = api.token_get_tenant(request, request.user.tenant_id) quotas = api.tenant_quota_get(request, request.user.tenant_id) try: quotas.ram = int(quotas.ram) / 100 except Exception, e: messages.error( request, 'Error parsing quota for %s: %s' % (image_id, e.message)) return redirect('dash_instances', tenant_id) form, handled = LaunchForm.maybe_handle(request, initial={ 'flavorlist': flavorlist(), 'keynamelist': keynamelist(),
def test_launch_post(self): FLAVOR_ID = self.flavors[0].id IMAGE_ID = '1' KEY_NAME = self.keypairs[0].name SERVER_NAME = 'serverName' USER_DATA = 'userData' form_data = { 'method': 'LaunchForm', 'flavor': FLAVOR_ID, 'image_id': IMAGE_ID, 'key_name': KEY_NAME, 'name': SERVER_NAME, 'user_data': USER_DATA, 'tenant_id': self.TEST_TENANT, 'security_groups': 'default', } self.mox.StubOutWithMock(api, 'image_get') api.image_get(IsA(http.HttpRequest), IMAGE_ID).AndReturn(self.visibleImage) self.mox.StubOutWithMock(api, 'token_get_tenant') api.token_get_tenant(IsA(http.HttpRequest), self.TEST_TENANT).AndReturn(self.TEST_TENANT) self.mox.StubOutWithMock(api, 'tenant_quota_get') api.tenant_quota_get(IsA(http.HttpRequest), self.TEST_TENANT).AndReturn(FakeQuota) self.mox.StubOutWithMock(api, 'flavor_list') api.flavor_list(IsA(http.HttpRequest)).AndReturn(self.flavors) self.mox.StubOutWithMock(api, 'keypair_list') api.keypair_list(IsA(http.HttpRequest)).AndReturn(self.keypairs) self.mox.StubOutWithMock(api, 'security_group_list') api.security_group_list(IsA(http.HttpRequest)).AndReturn( self.security_groups) # called again by the form api.image_get(IsA(http.HttpRequest), IMAGE_ID).AndReturn(self.visibleImage) self.mox.StubOutWithMock(api, 'flavor_get') api.flavor_get(IsA(http.HttpRequest), IsA(unicode)).AndReturn(self.flavors[0]) self.mox.StubOutWithMock(api, 'server_create') api.server_create(IsA(http.HttpRequest), SERVER_NAME, self.visibleImage, self.flavors[0], KEY_NAME, USER_DATA, [self.security_groups[0].name]) self.mox.StubOutWithMock(messages, 'success') messages.success(IsA(http.HttpRequest), IsA(str)) self.mox.ReplayAll() res = self.client.post( reverse('dash_images_launch', args=[self.TEST_TENANT, IMAGE_ID]), form_data) self.assertRedirectsNoFollow( res, reverse('dash_instances', args=[self.TEST_TENANT])) self.mox.VerifyAll()
def update(request, image_id): try: image = api.image_get(request, image_id) except GlanceClientConnectionError, e: messages.error(request, "Error connecting to glance: %s" % e.message)
def update(request, image_id): try: image = api.image_get(request, image_id) except glance_exception.ClientConnectionError, e: LOG.error("Error connecting to glance", exc_info=True) messages.error(request, "Error connecting to glance: %s" % e.message)
def test_launch_post(self): FLAVOR_ID = self.flavors[0].id IMAGE_ID = '1' KEY_NAME = self.keypairs[0].name SERVER_NAME = 'serverName' USER_DATA = 'userData' form_data = {'method': 'LaunchForm', 'flavor': FLAVOR_ID, 'image_id': IMAGE_ID, 'key_name': KEY_NAME, 'name': SERVER_NAME, 'user_data': USER_DATA, 'tenant_id': self.TEST_TENANT, 'security_groups': 'default', } self.mox.StubOutWithMock(api, 'image_get') api.image_get(IsA(http.HttpRequest), IMAGE_ID).AndReturn(self.visibleImage) self.mox.StubOutWithMock(api, 'token_get_tenant') api.token_get_tenant(IsA(http.HttpRequest), self.TEST_TENANT).AndReturn(self.TEST_TENANT) self.mox.StubOutWithMock(api, 'tenant_quota_get') api.tenant_quota_get(IsA(http.HttpRequest), self.TEST_TENANT).AndReturn(FakeQuota) self.mox.StubOutWithMock(api, 'flavor_list') api.flavor_list(IsA(http.HttpRequest)).AndReturn(self.flavors) self.mox.StubOutWithMock(api, 'keypair_list') api.keypair_list(IsA(http.HttpRequest)).AndReturn(self.keypairs) self.mox.StubOutWithMock(api, 'security_group_list') api.security_group_list(IsA(http.HttpRequest)).AndReturn( self.security_groups) # called again by the form api.image_get(IsA(http.HttpRequest), IMAGE_ID).AndReturn(self.visibleImage) self.mox.StubOutWithMock(api, 'flavor_get') api.flavor_get(IsA(http.HttpRequest), IsA(unicode)).AndReturn(self.flavors[0]) self.mox.StubOutWithMock(api, 'server_create') api.server_create(IsA(http.HttpRequest), SERVER_NAME, self.visibleImage, self.flavors[0], KEY_NAME, USER_DATA, [self.security_groups[0].name]) self.mox.StubOutWithMock(messages, 'success') messages.success(IsA(http.HttpRequest), IsA(str)) self.mox.ReplayAll() res = self.client.post(reverse('dash_images_launch', args=[self.TEST_TENANT, IMAGE_ID]), form_data) self.assertRedirectsNoFollow(res, reverse('dash_instances', args=[self.TEST_TENANT])) self.mox.VerifyAll()
def test_launch_form_apiexception(self): FLAVOR_ID = self.flavors[0].id IMAGE_ID = '1' KEY_NAME = self.keypairs[0].name SERVER_NAME = 'serverName' USER_DATA = 'userData' form_data = {'method': 'LaunchForm', 'flavor': FLAVOR_ID, 'image_id': IMAGE_ID, 'key_name': KEY_NAME, 'name': SERVER_NAME, 'tenant_id': self.TEST_TENANT, 'user_data': USER_DATA, 'security_groups': 'default', } self.mox.StubOutWithMock(api, 'image_get') api.image_get(IgnoreArg(), IMAGE_ID).AndReturn(self.visibleImage) self.mox.StubOutWithMock(api, 'token_get_tenant') api.token_get_tenant(IgnoreArg(), self.TEST_TENANT).AndReturn(self.TEST_TENANT) self.mox.StubOutWithMock(api, 'tenant_quota_get') api.tenant_quota_get(IsA(http.HttpRequest), self.TEST_TENANT).AndReturn(FakeQuota) self.mox.StubOutWithMock(api, 'flavor_list') api.flavor_list(IgnoreArg()).AndReturn(self.flavors) self.mox.StubOutWithMock(api, 'keypair_list') api.keypair_list(IgnoreArg()).AndReturn(self.keypairs) self.mox.StubOutWithMock(api, 'security_group_list') api.security_group_list(IsA(http.HttpRequest)).AndReturn( self.security_groups) # called again by the form api.image_get(IgnoreArg(), IMAGE_ID).AndReturn(self.visibleImage) self.mox.StubOutWithMock(api, 'flavor_get') api.flavor_get(IgnoreArg(), IsA(unicode)).AndReturn(self.flavors[0]) self.mox.StubOutWithMock(api, 'server_create') exception = api_exceptions.ApiException('apiException') api.server_create(IsA(http.HttpRequest), SERVER_NAME, self.visibleImage, self.flavors[0], KEY_NAME, USER_DATA, self.security_groups).AndRaise(exception) self.mox.StubOutWithMock(messages, 'error') messages.error(IsA(http.HttpRequest), IsA(str)) self.mox.ReplayAll() url = reverse('dash_images_launch', args=[self.TEST_TENANT, IMAGE_ID]) res = self.client.post(url, form_data) self.assertTemplateUsed(res, 'django_openstack/dash/images/launch.html') self.mox.VerifyAll()
except api_exceptions.ApiException: LOG.exception('Unable to retrieve list of keypairs') return [] def securitygrouplist(): try: fl = api.security_group_list(request) sel = [(f.name, f.name) for f in fl] return sel except novaclient_exceptions.ClientException, e: LOG.exception('Unable to retrieve list of security groups') return [] # TODO(mgius): Any reason why these can't be after the launchform logic? # If The form is valid, we've just wasted these two api calls image = api.image_get(request, image_id) tenant = api.token_get_tenant(request, request.user.tenant_id) quotas = api.tenant_quota_get(request, request.user.tenant_id) try: quotas.ram = int(quotas.ram) except Exception, e: messages.error(request, _('Error parsing quota for %(image)s: %(msg)s') % {"image": image_id, "msg": e.message}) return redirect('dash_instances', tenant_id) form, handled = LaunchForm.maybe_handle( request, initial={'flavorlist': flavorlist(), 'keynamelist': keynamelist(), 'securitygrouplist': securitygrouplist(), 'image_id': image_id,