REST API for getting ssh keys
diff --git a/xos/core/models/sliver.py b/xos/core/models/sliver.py
index e45152f..ff1e9b4 100644
--- a/xos/core/models/sliver.py
+++ b/xos/core/models/sliver.py
@@ -5,7 +5,7 @@
from core.models import PlCoreBase,PlCoreBaseManager,PlCoreBaseDeletionManager
from core.models.plcorebase import StrippedCharField
from core.models import Image
-from core.models import Slice
+from core.models import Slice, SlicePrivilege
from core.models import Node
from core.models import Site
from core.models import Deployment
@@ -170,3 +170,18 @@
return None
else:
return 'ssh -o "ProxyCommand ssh -q %s@%s" ubuntu@%s' % (self.instance_id, self.node.name, self.instance_name)
+
+ def get_public_keys(self):
+ slice_memberships = SlicePrivilege.objects.filter(slice=self.slice)
+ pubkeys = set([sm.user.public_key for sm in slice_memberships if sm.user.public_key])
+
+ if self.creator.public_key:
+ pubkeys.add(self.creator.public_key)
+
+ if self.slice.creator.public_key:
+ pubkeys.add(self.slice.creator.public_key)
+
+ if self.slice.service and self.slice.service.public_key:
+ pubkeys.add(self.slice.service.public_key)
+
+ return pubkeys
diff --git a/xos/core/xoslib/methods/sshkeys.py b/xos/core/xoslib/methods/sshkeys.py
new file mode 100644
index 0000000..31121fc
--- /dev/null
+++ b/xos/core/xoslib/methods/sshkeys.py
@@ -0,0 +1,36 @@
+from rest_framework.decorators import api_view
+from rest_framework.response import Response
+from rest_framework.reverse import reverse
+from rest_framework import serializers
+from rest_framework import generics
+from rest_framework.views import APIView
+from core.models import *
+from django.forms import widgets
+from syndicate_storage.models import Volume
+from django.core.exceptions import PermissionDenied
+from xos.exceptions import XOSNotFound
+
+class SSHKeyList(APIView):
+ method_kind = "list"
+ method_name = "sshkeys"
+
+ def get(self, request, format=None):
+ instances=[]
+ for sliver in Sliver.objects.all():
+ if sliver.instance_id:
+ instances.append( {"id": sliver.instance_id,
+ "public_keys": sliver.get_public_keys() } )
+
+ return Response(instances)
+
+class SSHKeyDetail(APIView):
+ method_kind = "detail"
+ method_name = "sshkeys"
+
+ def get(self, request, format=None, pk=0):
+ slivers = Sliver.objects.filter(instance_id=pk)
+ if not slivers:
+ raise XOSNotFound("didn't find sliver for instance %s" % pk)
+ return Response( [ {"id": slivers[0].instance_id,
+ "public_keys": slivers[0].get_public_keys() } ])
+
diff --git a/xos/xos/exceptions.py b/xos/xos/exceptions.py
index c13de49..9ce38a3 100644
--- a/xos/xos/exceptions.py
+++ b/xos/xos/exceptions.py
@@ -20,6 +20,13 @@
"specific_error": why,
"fields": fields})
+class XOSNotFound(RestFrameworkPermissionDenied):
+ status_code=404
+ def __init__(self, why="object not found", fields={}):
+ APIException.__init__(self, {"error": "XOSNotFound",
+ "specific_error": why,
+ "fields": fields})
+
class XOSValidationError(APIException):
status_code=403
def __init__(self, why="validation error", fields={}):