From: Tony Mack Date: Thu, 2 May 2013 14:09:51 +0000 (-0400) Subject: keys and users work when openstack is disabled or unavailable X-Git-Tag: 1.0~72 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=d685bfa5ed612efda76048802ad5bbb3d53d4e53;p=plstackapi.git keys and users work when openstack is disabled or unavailable --- diff --git a/plstackapi/core/admin.py b/plstackapi/core/admin.py index 4bb9a98..58f5f58 100644 --- a/plstackapi/core/admin.py +++ b/plstackapi/core/admin.py @@ -63,25 +63,7 @@ class PlanetStackBaseAdmin(admin.ModelAdmin): save_on_top = False class OSModelAdmin(PlanetStackBaseAdmin): - """Attach client connection to openstack on delete() and save()""" - - def save_model(self, request, obj, form, change): - client = OpenStackClient(tenant=request.user.site.login_base, **request.session.get('auth', {})) - obj.driver = OpenStackDriver(client=client) - obj.caller = request.user - obj.save() - - def delete_model(self, request, obj): - client = OpenStackClient(tenant=request.user.site.login_base, **request.session.get('auth', {})) - obj.driver = OpenStackDriver(client=client) - obj.caller = request.user - obj.delete() - -class RoleAdmin(PlanetStackBaseAdmin): - fieldsets = [ - ('Role', {'fields': ['role_type']}) - ] - list_display = ('role_type',) + """Attach client connection to openstack on delete() and save()""" def save_model(self, request, obj, form, change): auth = request.session.get('auth', {}) @@ -93,7 +75,14 @@ class RoleAdmin(PlanetStackBaseAdmin): auth = request.session.get('auth', {}) auth['tenant'] = request.user.site.login_base obj.os_manager = OpenStackManager(auth=auth, caller=request.user) - obj.delete() + obj.delete() + +class RoleAdmin(OSModelAdmin): + fieldsets = [ + ('Role', {'fields': ['role_type']}) + ] + list_display = ('role_type',) + class DeploymentNetworkAdminForm(forms.ModelForm): sites = forms.ModelMultipleChoiceField( diff --git a/plstackapi/core/models/key.py b/plstackapi/core/models/key.py index 3e4f56f..afbebff 100644 --- a/plstackapi/core/models/key.py +++ b/plstackapi/core/models/key.py @@ -16,15 +16,10 @@ class Key(PlCoreBase): def __unicode__(self): return u'%s' % (self.name) def save(self, *args, **kwds): - if not self.key_id: - key_fields = {'name': self.name, - 'key': self.key} - nova_key = self.driver.create_keypair(**key_fields) - self.key_id = nova_key.id + self.os_manager.save_key(self) super(Key, self).save(*args, **kwds) def delete(self, *args, **kwds): - if self.key_id: - self.driver.delete_keypair(self.key_id) + self.os_manager.delete_key(self) super(Key, self).delete(*args, **kwds) diff --git a/plstackapi/core/models/pluser.py b/plstackapi/core/models/pluser.py index f914662..474f044 100644 --- a/plstackapi/core/models/pluser.py +++ b/plstackapi/core/models/pluser.py @@ -3,7 +3,7 @@ import datetime from django.db import models from plstackapi.core.models import PlCoreBase from plstackapi.core.models import Site -from plstackapi.openstack.driver import OpenStackDriver +from plstackapi.openstack.manager import OpenStackManager from django.contrib.auth.models import User, AbstractBaseUser, UserManager, BaseUserManager # Create your models here. @@ -101,22 +101,16 @@ class PLUser(AbstractBaseUser): def save(self, *args, **kwds): - if not self.user_id: - if not self.driver: - setattr(self, 'driver', OpenStackDriver()) - name = self.email[:self.email.find('@')] - user_fields = {'name': name, - 'email': self.email, - 'password': self.password, - 'enabled': True} - keystone_user = self.driver.create_user(**user_fields) - self.user_id = keystone_user.id + if not hasattr(self, 'os_manager'): + setattr(self, 'os_manager', OpenStackManager()) + + self.os_manager.save_user(self) self.set_password(self.password) super(PLUser, self).save(*args, **kwds) def delete(self, *args, **kwds): - if self.user_id: - if not getattr(self, 'driver'): - setattr(self, 'driver', OpenStackDriver()) - self.driver.delete_user(self.user_id) + if not hasattr(self, 'os_manager'): + setattr(self, 'os_manager', OpenStackManager()) + + self.os_manager.delete_user(self) super(PLUser, self).delete(*args, **kwds) diff --git a/plstackapi/openstack/manager.py b/plstackapi/openstack/manager.py index b4ad8d2..79403a8 100644 --- a/plstackapi/openstack/manager.py +++ b/plstackapi/openstack/manager.py @@ -1,15 +1,19 @@ from plstackapi.planetstack import settings from django.core import management management.setup_environ(settings) -from plstackapi.openstack.client import OpenStackClient -from plstackapi.openstack.driver import OpenStackDriver -from plstackapi.planetstack.config import Config -from plstackapi.core.models import * +try: + from plstackapi.openstack.client import OpenStackClient + from plstackapi.openstack.driver import OpenStackDriver + from plstackapi.planetstack.config import Config + from plstackapi.core.models import * + has_openstack = True +except: + has_openstack = False def require_enabled(callable): enabled = Config().api_nova_enabled def wrapper(*args, **kwds): - if enabled: + if enabled and has_openstack: return callable(*args, **kwds) else: return None @@ -35,8 +39,38 @@ class OpenStackManager: @require_enabled def delete_role(self, role): if role.role_id: - self.driver.delete_role({'id': role.role_id}) - + self.driver.delete_role({'id': role.role_id}) + + @require_enabled + def save_key(self, key): + if not key.key_id: + key_fields = {'name': key.name, + 'key': key.key} + nova_key = self.driver.create_keypair(**key_fields) + key.key_id = nova_key.id + + @require_enabled + def delete_key(self, key): + if key.key_id: + self.driver.delete_keypair(key.key_id) + + @require_enabled + def save_user(self, user): + if not user.user_id: + name = user.email[:user.email.find('@')] + user_fields = {'name': name, + 'email': user.email, + 'password': user.password, + 'enabled': True} + keystone_user = self.driver.create_user(**user_fields) + user.user_id = keystone_user.id + + @require_enabled + def delete_user(self, user): + if user.user_id: + self.driver.delete_user(user.user_id) + + def refresh_nodes(self): # collect local nodes nodes = Node.objects.all()