diff --git a/django-openstack/django_openstack/api.py b/django-openstack/django_openstack/api.py index 4bbc7d4ac..6150fb752 100644 --- a/django-openstack/django_openstack/api.py +++ b/django-openstack/django_openstack/api.py @@ -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): - tenants = auth_api().tenants.for_token(request.session['token']) - for t in tenants: - if str(t.id) == str(tenant_id): - return t +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 token_info(token): + +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 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) diff --git a/django-openstack/django_openstack/auth/views.py b/django-openstack/django_openstack/auth/views.py index 3ba533c9c..cad64106b 100644 --- a/django-openstack/django_openstack/auth/views.py +++ b/django-openstack/django_openstack/auth/views.py @@ -18,10 +18,11 @@ class Login(forms.SelfHandlingForm): def handle(self, request, data): try: - token = api.auth_api().tokens.create("", - data['username'], - data['password']) - info = api.token_info(token) + token = api.token_create(request, + "", + data['username'], + data['password']) + 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(): diff --git a/django-openstack/django_openstack/context_processors.py b/django-openstack/django_openstack/context_processors.py index 0c2042ae7..579a068b3 100644 --- a/django-openstack/django_openstack/context_processors.py +++ b/django-openstack/django_openstack/context_processors.py @@ -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)} diff --git a/django-openstack/django_openstack/dash/views/images.py b/django-openstack/django_openstack/dash/views/images.py index 455588bda..3ee41fcb3 100644 --- a/django-openstack/django_openstack/dash/views/images.py +++ b/django-openstack/django_openstack/dash/views/images.py @@ -67,13 +67,14 @@ 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, - flavor, - user_data=data['user_data'], - key_name=data.get('key_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'], + key_name=data.get('key_name')) messages.success(request, "Instance was successfully\ launched.") @@ -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(), diff --git a/django-openstack/django_openstack/dash/views/instances.py b/django-openstack/django_openstack/dash/views/instances.py index 17ca5851b..fd86819ed 100644 --- a/django-openstack/django_openstack/dash/views/instances.py +++ b/django-openstack/django_openstack/dash/views/instances.py @@ -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, diff --git a/django-openstack/django_openstack/dash/views/keypairs.py b/django-openstack/django_openstack/dash/views/keypairs.py index d91c91d9f..da1b3fbe6 100644 --- a/django-openstack/django_openstack/dash/views/keypairs.py +++ b/django-openstack/django_openstack/dash/views/keypairs.py @@ -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) diff --git a/django-openstack/django_openstack/syspanel/views/flavors.py b/django-openstack/django_openstack/syspanel/views/flavors.py index e692f7661..03b6c3cec 100644 --- a/django-openstack/django_openstack/syspanel/views/flavors.py +++ b/django-openstack/django_openstack/syspanel/views/flavors.py @@ -24,11 +24,12 @@ 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'], - int(data['memory_mb']), - int(data['vcpus']), - int(data['disk_gb']), - int(data['flavorid'])) + api.flavor_create(request, + data['name'], + int(data['memory_mb']), + int(data['vcpus']), + int(data['disk_gb']), + int(data['flavorid'])) messages.success(request, '%s was successfully added to flavors.' % data['name']) return redirect('syspanel_flavors') @@ -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) diff --git a/django-openstack/django_openstack/syspanel/views/images.py b/django-openstack/django_openstack/syspanel/views/images.py index d08a68b97..ed0bbabe9 100644 --- a/django-openstack/django_openstack/syspanel/views/images.py +++ b/django-openstack/django_openstack/syspanel/views/images.py @@ -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: diff --git a/django-openstack/django_openstack/syspanel/views/instances.py b/django-openstack/django_openstack/syspanel/views/instances.py index 3856dfb38..115ab9258 100644 --- a/django-openstack/django_openstack/syspanel/views/instances.py +++ b/django-openstack/django_openstack/syspanel/views/instances.py @@ -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'] =\ diff --git a/django-openstack/django_openstack/syspanel/views/services.py b/django-openstack/django_openstack/syspanel/views/services.py index 070256680..ead74cd7b 100644 --- a/django-openstack/django_openstack/syspanel/views/services.py +++ b/django-openstack/django_openstack/syspanel/views/services.py @@ -28,9 +28,10 @@ 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'], - not service.disabled) + 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" % data['name']) @@ -40,7 +41,7 @@ class ToggleService(forms.SelfHandlingForm): except api_exceptions.ApiException, e: messages.error(request, "Unable to update service '%s': %s" % data['name'], e.message) - + return redirect(request.build_absolute_uri()) @@ -52,13 +53,13 @@ def index(request): return handled services = [] - try: - services = api.admin_api(request).services.list() + try: + services = api.service_list(request) except api_exceptions.ApiException, e: messages.error(request, 'Unable to get service info: %s' % e.message) - + other_services = [] - + for k, v in request.session['serviceCatalog'].iteritems(): v = v[0] try: @@ -70,7 +71,7 @@ def index(request): row = {'type': k, 'internalURL': v['internalURL'], 'host': hostname, 'region': v['region'], 'up': up } other_services.append(row) - + return render_to_response('syspanel_services.html', { 'services': services, 'service_toggle_enabled_form': ToggleService, diff --git a/django-openstack/django_openstack/syspanel/views/tenants.py b/django-openstack/django_openstack/syspanel/views/tenants.py index ec9891902..2853e3c53 100644 --- a/django-openstack/django_openstack/syspanel/views/tenants.py +++ b/django-openstack/django_openstack/syspanel/views/tenants.py @@ -26,9 +26,11 @@ class CreateTenant(forms.SelfHandlingForm): enabled = forms.BooleanField(label="Enabled", required=False) def handle(self, request, data): - try: - api.account_api(request).tenants.create(data['id'], - data['description'], data['enabled']) + try: + 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}) diff --git a/django-openstack/django_openstack/syspanel/views/users.py b/django-openstack/django_openstack/syspanel/views/users.py index c5d30dd4d..31b3595ea 100644 --- a/django-openstack/django_openstack/syspanel/views/users.py +++ b/django-openstack/django_openstack/syspanel/views/users.py @@ -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,11 +127,12 @@ def create(request): user = form.clean() # TODO Make this a real request try: - api.account_api(request).users.create(user['id'], - user['email'], - user['password'], - user['tenant_id'], - True) + api.user_create(request, + user['id'], + user['email'], + user['password'], + user['tenant_id'], + True) messages.success(request, '%s was successfully created.'