def launch(request, tenant_id, image_id):
    def flavorlist():
        try:
            fl = api.extras_api(request).flavors.list()

            # 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.extras_api(request).keypairs.list()
            sel = [(f.key_name, f.key_name) for f in fl]
            return sel
        except:
            return []

    image = api.compute_api(request).images.get(image_id)
    tenant = api.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 index(request, tenant_id):
    tenant = api.get_tenant(request, request.user.tenant)
    all_images = []
    try:
        all_images = api.glance_api(request).get_images_detailed()
        if not all_images:
            messages.info(request, "There are currently no images.")
    except GlanceClientConnectionError, e:
        messages.error(request, "Error connecting to glance: %s" % e.message)