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