313 lines
8.9 KiB
Python
313 lines
8.9 KiB
Python
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
|
|
from django.conf import settings
|
|
|
|
import cloudfiles
|
|
import glance.client
|
|
import httplib
|
|
import json
|
|
import logging
|
|
import openstack.compute
|
|
import openstackx.admin
|
|
import openstackx.extras
|
|
import openstackx.auth
|
|
from urlparse import urlparse
|
|
|
|
|
|
LOG = logging.getLogger('django_openstack.api')
|
|
|
|
|
|
def url_for(request, service_name, admin=False):
|
|
catalog = request.session['serviceCatalog']
|
|
if admin:
|
|
rv = catalog[service_name][0]['adminURL']
|
|
else:
|
|
rv = catalog[service_name][0]['internalURL']
|
|
return rv
|
|
|
|
|
|
def compute_api(request):
|
|
compute = openstack.compute.Compute(
|
|
auth_token=request.session['token'],
|
|
management_url=url_for(request, 'nova'))
|
|
# this below hack is necessary to make the jacobian compute client work
|
|
compute.client.auth_token = request.session['token']
|
|
compute.client.management_url = url_for(request, 'nova')
|
|
LOG.debug('compute_api connection created using token "%s"'
|
|
' and url "%s"' %
|
|
(request.session['token'], url_for(request, 'nova')))
|
|
return compute
|
|
|
|
|
|
def account_api(request):
|
|
LOG.debug('account_api connection created using token "%s"'
|
|
' and url "%s"' %
|
|
(request.session['token'],
|
|
url_for(request, 'keystone', True)))
|
|
return openstackx.extras.Account(
|
|
auth_token=request.session['token'],
|
|
management_url=url_for(request, 'keystone', True))
|
|
|
|
|
|
def glance_api(request):
|
|
o = urlparse(url_for(request, 'glance'))
|
|
LOG.debug('glance_api connection created for host "%s:%d"' %
|
|
(o.hostname, o.port))
|
|
return glance.client.Client(o.hostname, o.port)
|
|
|
|
|
|
def admin_api(request):
|
|
LOG.debug('admin_api connection created using token "%s"'
|
|
' and url "%s"' %
|
|
(request.session['token'], url_for(request, 'nova', True)))
|
|
return openstackx.admin.Admin(auth_token=request.session['token'],
|
|
management_url=url_for(request, 'nova', True))
|
|
|
|
|
|
def extras_api(request):
|
|
LOG.debug('extras_api connection created using token "%s"'
|
|
' and url "%s"' %
|
|
(request.session['token'], url_for(request, 'nova')))
|
|
return openstackx.extras.Extras(auth_token=request.session['token'],
|
|
management_url=url_for(request, 'nova'))
|
|
|
|
|
|
def auth_api():
|
|
LOG.debug('auth_api connection created using url "%s"' %
|
|
settings.OPENSTACK_KEYSTONE_URL)
|
|
return openstackx.auth.Auth(
|
|
management_url=settings.OPENSTACK_KEYSTONE_URL)
|
|
|
|
|
|
def swift_api():
|
|
return cloudfiles.get_connection(
|
|
settings.SWIFT_ACCOUNT + ":" + settings.SWIFT_USER,
|
|
settings.SWIFT_PASS,
|
|
authurl=settings.SWIFT_AUTHURL)
|
|
|
|
|
|
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=user_data, key_name=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"}
|
|
|
|
o = urlparse(token.serviceCatalog['keystone'][0]['adminURL'])
|
|
conn = httplib.HTTPConnection(o.hostname, o.port)
|
|
conn.request("GET", "/v2.0/tokens/%s" % token.id, headers=hdrs)
|
|
response = conn.getresponse()
|
|
data = json.loads(response.read())
|
|
|
|
admin = False
|
|
for role in data['auth']['user']['roleRefs']:
|
|
if role['roleId'] == 'Admin':
|
|
admin = True
|
|
|
|
return {'tenant': data['auth']['user']['tenantId'],
|
|
'user': data['auth']['user']['username'],
|
|
'admin': admin}
|
|
|
|
|
|
def usage_get(request, tenant_id, start, end):
|
|
LOG.debug('Usage_get for tenant "%s" from %s to %s"' %
|
|
(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)
|
|
|
|
|
|
def swift_get_containers():
|
|
return [{"name":c.name} for c in swift_api().get_all_containers()]
|
|
|
|
|
|
def swift_create_container(name):
|
|
return swift_api().create_container(name)
|
|
|
|
|
|
def swift_delete_container(name):
|
|
return swift_api().delete_container(name)
|
|
|
|
|
|
def swift_get_objects(container_name):
|
|
container = swift_api().get_container(container_name)
|
|
return [{"name":obj.name} for obj in container.get_objects()]
|
|
|
|
|
|
def swift_upload_object(container_name, object_name, object_data):
|
|
container = swift_api().get_container(container_name)
|
|
obj = container.create_object(object_name)
|
|
return obj.write(object_data)
|
|
|
|
|
|
def swift_delete_object(container_name, object_name):
|
|
container = swift_api().get_container(container_name)
|
|
return container.delete_object(object_name)
|
|
|
|
|
|
def swift_get_object_data(container_name, object_name):
|
|
container = swift_api().get_container(container_name)
|
|
return container.get_object(object_name).stream()
|