factor out api calls

This commit is contained in:
termie
2011-06-22 11:33:09 -07:00
parent 764efad3b6
commit a960144e20
12 changed files with 255 additions and 97 deletions

View File

@@ -1,3 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
from django.conf import settings
import logging
@@ -50,15 +53,138 @@ def auth_api():
settings.OPENSTACK_KEYSTONE_URL)
def get_tenant(request, tenant_id):
def console_create(request, instance_id, kind=None):
return extras_api(request).consoles.create(instance_id, kind)
def flavor_create(request, name, memory, vcpu, disk, flavor_id):
return admin_api(request).flavors.create(
name, int(memory), int(vcpu), int(disk), flavor_id)
def flavor_delete(request, flavor_id, purge=False):
return admin_api(request).flavors.delete(flavor_id, purge)
def flavor_get(request, flavor_id):
return compute_api(request).flavors.get(flavor_id)
def flavor_list(request):
return extras_api(request).flavors.list()
def flavor_list_admin(request):
return extras_api(request).flavors.list()
def image_all_metadata(request):
images = glance_api(request).get_images_detailed()
image_dict = {}
for image in images:
image_dict[image['id']] = image
return image_dict
def image_create(request, image_meta, image_file):
return glance_api(request).add_image(image_meta, image_file)
def image_delete(request, image_id):
return glance_api(request).delete_image(image_id)
def image_get(request, image_id):
return glance_api(request).get_image(image_id)[0]
def image_list_detailed(request):
return glance_api(request).get_images_detailed()
def image_update(request, image_id, image_meta=None):
image_meta = image_meta and image_meta or {}
return glance_api(request).update_image(image_id, image_meta=image_meta)
def keypair_create(request, name):
return extras_api(request).keypairs.create(name)
def keypair_delete(request, keypair_id):
return extras_api(request).keypairs.delete(keypair_id)
def keypair_list(request):
return extras_api(request).keypairs.list()
def server_create(request, name, image, flavor, user_data, key_name):
return extras_api(request).servers.create(
name, image, flavor, user_data, key_name)
def server_delete(request, instance):
return compute_api(request).servers.delete(instance)
def server_get(request, instance_id):
return compute_api(request).servers.get(instance_id)
def server_list(request):
return extras_api(request).servers.list()
def server_reboot(request, instance_id, hardness=openstack.compute.servers.REBOOT_HARD):
server = server_get(request, instance_id)
return server.reboot(hardness)
def service_get(request, name):
return admin_api(request).services.get(name)
def service_list(request):
return admin_api(request).services.list()
def service_update(request, name, enabled):
return admin_api(request).services.update(name, enabled)
def token_get_tenant(request, tenant_id):
tenants = auth_api().tenants.for_token(request.session['token'])
for t in tenants:
if str(t.id) == str(tenant_id):
return t
def token_list_tenants(request, token):
return auth_api().tenants.for_token(token)
def token_info(token):
def tenant_create(request, tenant_id, description, enabled):
return account_api(request).tenants.create(tenant_id, description, enabled)
def tenant_get(request, tenant_id):
return account_api(request).tenants.get(tenant_id)
def tenant_list(request):
return account_api(request).tenants.list()
def tenant_update(request, tenant_id, description, enabled):
return account_api(request).tenants.update(tenant_id, description, enabled)
def token_create(request, tenant, username, password):
return auth_api().tokens.create(tenant, username, password)
def token_info(request, token):
hdrs = {"Content-type": "application/json",
"X_AUTH_TOKEN": settings.OPENSTACK_ADMIN_TOKEN,
"Accept": "text/json"}
@@ -79,9 +205,38 @@ def token_info(token):
'admin': admin}
def get_image_cache(request):
images = glance_api(request).get_images_detailed()
image_dict = {}
for image in images:
image_dict[image['id']] = image
return image_dict
def usage_get(request, tenant_id, start, end):
return extras_api(request).usage.get(tenant_id, start, end)
def usage_list(request, start, end):
return extras_api(request).usage.list(start, end)
def user_create(request, user_id, email, password, tenant_id):
return account_api(request).users.create(
user_id, email, password, tenant_id)
def user_delete(request, user_id):
return account_api(request).users.delete(user_id)
def user_get(request, user_id):
return account_api(request).users.get(user_id)
def user_list(request):
return account_api(request).users.list()
def user_update_email(request, user_id, email):
return account_api(request).users.update_email(user_id, email)
def user_update_password(request, user_id, password):
return account_api(request).users.update_password(user_id, password)
def user_update_tenant(request, user_id, tenant_id):
return account_api(request).users.update_tenant(user_id, tenant_id)

View File

@@ -18,10 +18,11 @@ class Login(forms.SelfHandlingForm):
def handle(self, request, data):
try:
token = api.auth_api().tokens.create("",
token = api.token_create(request,
"",
data['username'],
data['password'])
info = api.token_info(token)
info = api.token_info(request, token)
request.session['token'] = token.id
request.session['user'] = info['user']
request.session['tenant'] = info['tenant']
@@ -37,6 +38,7 @@ class Login(forms.SelfHandlingForm):
except api_exceptions.Unauthorized as e:
messages.error(request, 'Error authenticating: %s' % e.message)
def login(request):
if request.user and request.user.is_authenticated():
if request.user.is_admin():

View File

@@ -5,4 +5,4 @@ from django_openstack import api
def tenants(request):
if not request.user or not request.user.is_authenticated():
return {}
return {'tenants': api.auth_api().tenants.for_token(request.user.token)}
return {'tenants': api.token_list_tenants(request, request.user.token)}

View File

@@ -67,9 +67,10 @@ class LaunchForm(forms.SelfHandlingForm):
def handle(self, request, data):
image_id = data['image_id']
try:
image = api.compute_api(request).images.get(image_id)
flavor = api.compute_api(request).flavors.get(data['flavor'])
api.extras_api(request).servers.create(data['name'],
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'],
@@ -86,10 +87,10 @@ class LaunchForm(forms.SelfHandlingForm):
@login_required
def index(request, tenant_id):
tenant = api.get_tenant(request, request.user.tenant)
tenant = api.token_get_tenant(request, request.user.tenant)
all_images = []
try:
all_images = api.glance_api(request).get_images_detailed()
all_images = api.image_list_detailed(request)
if not all_images:
messages.info(request, "There are currently no images.")
except GlanceClientConnectionError, e:
@@ -121,7 +122,7 @@ def index(request, tenant_id):
def launch(request, tenant_id, image_id):
def flavorlist():
try:
fl = api.extras_api(request).flavors.list()
fl = api.flavor_list(request)
# TODO add vcpu count to flavors
sel = [(f.id, '%s (%svcpu / %sGB Disk / %sMB Ram )' %
@@ -132,14 +133,14 @@ def launch(request, tenant_id, image_id):
def keynamelist():
try:
fl = api.extras_api(request).keypairs.list()
fl = api.keypair_list(request)
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)
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(),

View File

@@ -44,10 +44,10 @@ class TerminateInstance(forms.SelfHandlingForm):
def handle(self, request, data):
instance_id = data['instance']
instance = api.compute_api(request).servers.get(instance_id)
instance = api.server_get(request, instance_id)
try:
api.compute_api(request).servers.delete(instance)
api.server_delete(request, instance)
except api_exceptions.ApiException, e:
messages.error(request,
'Unable to terminate %s: %s' %
@@ -65,8 +65,7 @@ class RebootInstance(forms.SelfHandlingForm):
def handle(self, request, data):
instance_id = data['instance']
try:
server = api.compute_api(request).servers.get(instance_id)
server.reboot(openstack.compute.servers.REBOOT_HARD)
server = api.server_reboot(request, instance_id)
messages.success(request, "Instance rebooting")
except api_exceptions.ApiException, e:
messages.error(request,
@@ -84,8 +83,8 @@ def index(request, tenant_id):
instances = []
try:
image_dict = api.get_image_cache(request)
instances = api.extras_api(request).servers.list()
image_dict = api.image_all_metadata(request)
instances = api.server_list(request)
for instance in instances:
# FIXME - ported this over, but it is hacky
instance._info['attrs']['image_name'] =\
@@ -117,11 +116,9 @@ def usage(request, tenant_id=None):
tenant_id = request.user.tenant
try:
usage = api.extras_api(request).usage.get(tenant_id,
datetime_start, datetime_end)
usage = api.usage_get(request, tenant_id, datetime_start, datetime_end)
except api_exceptions.ApiException, e:
messages.error(request, 'Unable to get usage info: %s' % e.message)
return render_to_response('dash_usage.html', {
'usage': usage,
}, context_instance=template.RequestContext(request))
@@ -130,7 +127,7 @@ def usage(request, tenant_id=None):
@login_required
def console(request, tenant_id, instance_id):
try:
console = api.extras_api(request).consoles.create(instance_id)
console = api.console_create(request, instance_id)
response = http.HttpResponse(mimetype='text/plain')
response.write(console.output)
response.flush()
@@ -145,7 +142,7 @@ def console(request, tenant_id, instance_id):
@login_required
def vnc(request, tenant_id, instance_id):
try:
console = api.extras_api(request).consoles.create(instance_id, 'vnc')
console = api.console_create(request, instance_id, 'vnc')
return redirect(console.output)
except api_exceptions.ApiException, e:
messages.error(request,

View File

@@ -45,8 +45,7 @@ class DeleteKeypair(forms.SelfHandlingForm):
def handle(self, request, data):
try:
keypair = api.extras_api(request).keypairs.delete(
data['keypair_id'])
keypair = api.keypair_delete(request, data['keypair_id'])
messages.info(request, 'Successfully deleted keypair: %s' \
% data['keypair_id'])
except api_exceptions.ApiException, e:
@@ -58,7 +57,7 @@ class CreateKeypair(forms.SelfHandlingForm):
def handle(self, request, data):
try:
keypair = api.extras_api(request).keypairs.create(data['name'])
keypair = api.keypair_create(request, data['name'])
response = http.HttpResponse(mimetype='application/binary')
response['Content-Disposition'] = \
'attachment; filename=%s.pem' % \
@@ -76,7 +75,7 @@ def index(request, tenant_id):
return handled
try:
keypairs = api.extras_api(request).keypairs.list()
keypairs = api.keypair_list(request)
except api_exceptions.ApiException, e:
keypairs = []
messages.error(request, 'Error featching keypairs: %s' % e.message)

View File

@@ -24,7 +24,8 @@ class CreateFlavor(forms.SelfHandlingForm):
disk_gb = forms.CharField(max_length="5", label="Disk GB")
def handle(self, request, data):
api.admin_api(request).flavors.create(data['name'],
api.flavor_create(request,
data['name'],
int(data['memory_mb']),
int(data['vcpus']),
int(data['disk_gb']),
@@ -39,7 +40,7 @@ class DeleteFlavor(forms.SelfHandlingForm):
def handle(self, request, data):
flavor_id = data['flavorid']
api.admin_api(request).flavors.delete(flavor_id, True)
api.flavor_delete(flavor_id, True)
return redirect(request.build_absolute_uri())
@@ -56,7 +57,7 @@ def index(request):
flavors = []
try:
flavors = api.admin_api(request).flavors.list()
flavors = api.flavor_list_admin(request)
except api_exceptions.ApiException, e:
messages.error(request, 'Unable to get usage info: %s' % e.message)

View File

@@ -20,7 +20,7 @@ class DeleteImage(forms.SelfHandlingForm):
def handle(self, request, data):
image_id = data['image_id']
try:
api.glance_api(request).delete_image(image_id)
api.image_delete(request, image_id)
except GlanceClientConnectionError, e:
messages.error(request, "Error connecting to glance: %s" % e.message)
except glance_exception.Error, e:
@@ -32,8 +32,9 @@ class ToggleImage(forms.SelfHandlingForm):
image_id = forms.CharField(required=True)
def handle(self, request, data):
image_id = data['image_id']
try:
api.glance_api(request).update_image(image_id, image_meta={'is_public': False})
api.image_update(request, image_id, image_meta={'is_public': False})
except GlanceClientConnectionError, e:
messages.error(request, "Error connecting to glance: %s" % e.message)
except glance_exception.Error, e:
@@ -56,7 +57,7 @@ def index(request):
images = []
try:
images = api.glance_api(request).get_images_detailed()
images = api.image_list_detailed(request)
if not images:
messages.info(request, "There are currently no images.")
except GlanceClientConnectionError, e:
@@ -74,7 +75,7 @@ def index(request):
@login_required
def update(request, image_id):
try:
image = glance_api(request).get_image(image_id)[0]
image = api.image_get(request, image_id)
except GlanceClientConnectionError, e:
messages.error(request, "Error connecting to glance: %s" % e.message)
except glance_exception.Error, e:
@@ -100,8 +101,7 @@ def update(request, image_id):
'architecture': image_form['architecture'],
'project_id': image_form['project_id'],
}
glance_api(request).update_image(image_id, metadata)
api.image_update(request, image_id, metadata)
messages.success(request, "Image was successfully updated.")
except GlanceClientConnectionError, e:
messages.error(request, "Error connecting to glance: %s" % e.message)
@@ -156,7 +156,7 @@ def upload(request):
messages.error(request, "Image could not be uploaded, please try again.")
try:
glance_api(request).add_image(metadata, image['image_file'])
api.image_create(request, metadata, image['image_file'])
except GlanceClientConnectionError, e:
messages.error(request, "Error connecting to glance: %s" % e.message)
except glance_exception.Error, e:

View File

@@ -61,7 +61,7 @@ def usage(request):
datetime_end = datetime_start
else:
try:
service_list = api.admin_api(request).services.list()
service_list = api.service_list(request)
except api_exceptions.ApiException, e:
messages.error(request, 'Unable to get service info: %s' % e.message)
@@ -71,7 +71,7 @@ def usage(request):
max_gigabytes += service.stats['max_gigabytes']
try:
usage_list = api.extras_api(request).usage.list(datetime_start, datetime_end)
usage_list = api.usage_list(request, datetime_start, datetime_end)
except api_exceptions.ApiException, e:
messages.error(request, 'Unable to get usage info: %s' % e.message)
@@ -142,7 +142,7 @@ def tenant_usage(request, tenant_id):
usage = {}
try:
usage = extras_api(request).usage.get(tenant_id, datetime_start, datetime_end)
usage = api.usage_get(request, tenant_id, datetime_start, datetime_end)
except api_exceptions.ApiException, e:
messages.error(request, 'Unable to get usage info: %s' % e.message)
@@ -162,8 +162,8 @@ def index(request):
instances = []
try:
image_dict = api.get_image_cache(request)
instances = api.extras_api(request).servers.list()
image_dict = api.image_all_metadata(request)
instances = api.server_list(request)
for instance in instances:
# FIXME - ported this over, but it is hacky
instance._info['attrs']['image_name'] =\

View File

@@ -28,8 +28,9 @@ class ToggleService(forms.SelfHandlingForm):
def handle(self, request, data):
try:
service = api.admin_api(request).services.get(data['service'])
api.admin_api(request).services.update(data['service'],
service = api.service_get(request, data['service'])
api.service_update(request,
data['service'],
not service.disabled)
if service.disabled:
messages.info(request, "Service '%s' has been enabled"
@@ -53,7 +54,7 @@ def index(request):
services = []
try:
services = api.admin_api(request).services.list()
services = api.service_list(request)
except api_exceptions.ApiException, e:
messages.error(request, 'Unable to get service info: %s' % e.message)

View File

@@ -27,8 +27,10 @@ class CreateTenant(forms.SelfHandlingForm):
def handle(self, request, data):
try:
api.account_api(request).tenants.create(data['id'],
data['description'], data['enabled'])
api.tenant_create(request,
data['id'],
data['description'],
data['enabled'])
messages.success(request,
'%s was successfully created.'
% data['id'])
@@ -45,8 +47,10 @@ class UpdateTenant(forms.SelfHandlingForm):
def handle(self, request, data):
try:
api.account_api(request).tenants.update(data['id'],
data['description'], data['enabled'])
api.tenant_update(request,
data['id'],
data['description'],
data['enabled'])
messages.success(request,
'%s was successfully updated.'
% data['id'])
@@ -59,7 +63,7 @@ class UpdateTenant(forms.SelfHandlingForm):
def index(request):
tenants = []
try:
tenants = api.account_api(request).tenants.list()
tenants = api.tenant_list(request)
except api_exceptions.ApiException, e:
messages.error(request, 'Unable to get tenant info: %s' % e.message)
tenants.sort(key=lambda x: x.id, reverse=True)
@@ -88,7 +92,7 @@ def update(request, tenant_id):
if request.method == 'GET':
try:
tenant = api.account_api(request).tenants.get(tenant_id)
tenant = api.tenant_get(request, tenant_id)
form = UpdateTenant(initial={'id': tenant.id,
'description': tenant.description,
'enabled': tenant.enabled})

View File

@@ -38,7 +38,7 @@ class UserDeleteForm(forms.SelfHandlingForm):
def handle(self, request, data):
user_id = data['user']
api.account_api(request).users.delete(user_id)
api.user_delete(request, user_id)
messages.success(request,
'%s was successfully deleted.'
% user_id)
@@ -52,7 +52,7 @@ def index(request):
if handled:
return handled
users = api.account_api(request).users.list()
users = api.user_list(request)
user_delete_form = UserDeleteForm()
return render_to_response('syspanel_users.html',{
@@ -64,23 +64,20 @@ def index(request):
@login_required
def update(request, user_id):
if request.method == "POST":
tenants = api.account_api(request).tenants.list()
tenants = api.tenant_list(request)
form = UserForm(request.POST, tenant_list=tenants)
if form.is_valid():
user = form.clean()
updated = []
if user['email']:
updated.append('email')
api.account_api(request).users.update_email(user['id'],
user['email'])
api.user_update_email(request, user['id'], user['email'])
if user['password']:
updated.append('password')
api.account_api(request).users.update_password(user['id'],
user['password'])
api.user_update_password(request, user['id'], user['password'])
if user['tenant_id']:
updated.append('tenant')
api.account_api(request).users.update_tenant(user['id'],
user['tenant_id'])
api.user_update_tenant(request, user['id'], user['tenant_id'])
messages.success(request,
'Updated %s for %s.'
% (', '.join(updated), user_id))
@@ -97,8 +94,8 @@ def update(request, user_id):
}, context_instance = template.RequestContext(request))
else:
u = api.account_api(request).users.get(user_id)
tenants = api.account_api(request).tenants.list()
u = api.user_get(request, user_id)
tenants = api.tenant_list(request)
try:
# FIXME
email = u.email
@@ -122,7 +119,7 @@ def update(request, user_id):
@login_required
def create(request):
tenants = api.account_api(request).tenants.list()
tenants = api.tenant_list(request)
if request.method == "POST":
form = UserForm(request.POST, tenant_list=tenants)
@@ -130,7 +127,8 @@ def create(request):
user = form.clean()
# TODO Make this a real request
try:
api.account_api(request).users.create(user['id'],
api.user_create(request,
user['id'],
user['email'],
user['password'],
user['tenant_id'],