From bf92aeeea4b1fd943fb23b20e611d71372dd32fe Mon Sep 17 00:00:00 2001 From: Bach Dániel <bd@ik.bme.hu> Date: Wed, 15 Apr 2015 13:19:50 +0200 Subject: [PATCH] vm: add InstallKeysOperation --- circle/common/operations.py | 2 +- circle/dashboard/models.py | 9 ++------- circle/dashboard/templates/dashboard/vm-detail/home.html | 10 ++++++++++ circle/dashboard/views/vm.py | 4 ++++ circle/vm/operations.py | 29 +++++++++++++++++++++++++++++ 5 files changed, 46 insertions(+), 8 deletions(-) diff --git a/circle/common/operations.py b/circle/common/operations.py index 4d5e19e..a84bba7 100644 --- a/circle/common/operations.py +++ b/circle/common/operations.py @@ -76,7 +76,7 @@ class Operation(object): user = auxargs.pop('user') parent_activity = auxargs.pop('parent_activity') if parent_activity and user is None and not skip_auth_check: - user = parent_activity.user + user = allargs['user'] = parent_activity.user if user is None: # parent was a system call skip_auth_check = True diff --git a/circle/dashboard/models.py b/circle/dashboard/models.py index 6231f88..7ff8101 100644 --- a/circle/dashboard/models.py +++ b/circle/dashboard/models.py @@ -46,7 +46,6 @@ from model_utils import Choices from acl.models import AclBase from common.models import HumanReadableObject, create_readable, Encoder -from vm.tasks.agent_tasks import add_keys, del_keys from vm.models.instance import ACCESS_METHODS from .store_api import Store, NoStoreException, NotOkException, Timeout @@ -409,9 +408,7 @@ def add_ssh_keys(sender, **kwargs): 'user', userkey.user).filter(status='RUNNING') for i in instances: logger.info('called add_keys(%s, %s)', i, userkey) - queue = i.get_remote_queue_name("agent") - add_keys.apply_async(args=(i.vm_name, [userkey.key]), - queue=queue) + i.install_keys(user=userkey.user, keys=[userkey.key]) def del_ssh_keys(sender, **kwargs): @@ -422,9 +419,7 @@ def del_ssh_keys(sender, **kwargs): 'user', userkey.user).filter(status='RUNNING') for i in instances: logger.info('called del_keys(%s, %s)', i, userkey) - queue = i.get_remote_queue_name("agent") - del_keys.apply_async(args=(i.vm_name, [userkey.key]), - queue=queue) + i.remove_keys(user=userkey.user, keys=[userkey.key]) post_save.connect(add_ssh_keys, sender=UserKey) diff --git a/circle/dashboard/templates/dashboard/vm-detail/home.html b/circle/dashboard/templates/dashboard/vm-detail/home.html index f3f44cf..ed7b161 100644 --- a/circle/dashboard/templates/dashboard/vm-detail/home.html +++ b/circle/dashboard/templates/dashboard/vm-detail/home.html @@ -157,6 +157,16 @@ </a> </div> {% endif %} + {% if op.install_keys %} + <strong>{% trans "SSH keys" %}</strong> + <div class="operation-wrapper"> + <a href="{{ op.install_keys.get_url }}" class="btn btn-info btn-xs operation" + {% if op.install_keys.disabled %}disabled{% endif %}> + <i class="fa fa-{{op.install_keys.icon}}"></i> + {{ op.install_keys.name }} + </a> + </div> + {% endif %} </div> <div class="col-md-8"> {% if graphite_enabled %} diff --git a/circle/dashboard/views/vm.py b/circle/dashboard/views/vm.py index 190650d..245714c 100644 --- a/circle/dashboard/views/vm.py +++ b/circle/dashboard/views/vm.py @@ -771,6 +771,10 @@ vm_ops = OrderedDict([ op='mount_store', icon='briefcase', effect='info', show_in_toolbar=False, )), + ('install_keys', VmOperationView.factory( + op='install_keys', icon='key', effect='info', + show_in_toolbar=False, + )), ]) diff --git a/circle/vm/operations.py b/circle/vm/operations.py index 76efdc9..43f9f59 100644 --- a/circle/vm/operations.py +++ b/circle/vm/operations.py @@ -1390,6 +1390,34 @@ class PasswordResetOperation(RemoteAgentOperation): @register_operation +class InstallKeysOperation(RemoteAgentOperation): + id = 'install_keys' + name = _("install SSH keys") + acl_level = "user" + task = agent_tasks.add_keys + required_perms = () + + def _get_remote_args(self, user, keys=None, **kwargs): + if keys is None: + keys = list(user.userkey_set.values_list('key', flat=True)) + return (super(InstallKeysOperation, self)._get_remote_args(**kwargs) + + [keys]) + + +@register_operation +class RemoveKeysOperation(RemoteAgentOperation): + id = 'remove_keys' + name = _("remove SSH keys") + acl_level = "user" + task = agent_tasks.del_keys + required_perms = () + + def _get_remote_args(self, user, keys, **kwargs): + return (super(RemoveKeysOperation, self)._get_remote_args(**kwargs) + + [keys]) + + +@register_operation class AgentStartedOperation(InstanceOperation): id = 'agent_started' name = _("agent") @@ -1462,6 +1490,7 @@ class AgentStartedOperation(InstanceOperation): self.instance._cleanup(parent_activity=activity) self.instance.password_reset( parent_activity=activity, password=self.instance.pw) + self.instance.install_keys(parent_activity=activity) self.instance._set_time(parent_activity=activity) self.instance._set_hostname(parent_activity=activity) -- libgit2 0.26.0