From 7280e5043c649d5ad2dc285dc3671a9f907199b1 Mon Sep 17 00:00:00 2001
From: Nathaniel Kofalt <nathaniel@kofalt.com>
Date: Thu, 18 Aug 2016 11:27:20 -0500
Subject: [PATCH] Add route to return a gear's invocation schema

---
 api/api.py           |  3 ++-
 api/jobs/gears.py    |  5 +++++
 api/jobs/handlers.py | 10 +++++++++-
 3 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/api/api.py b/api/api.py
index a8f368bf..dee8d8e5 100644
--- a/api/api.py
+++ b/api/api.py
@@ -123,7 +123,8 @@ routes = [
     ]),
     webapp2.Route(r'/api/gears',             GearsHandler),
     webapp2_extras.routes.PathPrefixRoute(r'/api/gears', [
-        webapp2.Route(r'/<:[^/]+>',         GearHandler,  name='job'),
+        webapp2.Route(r'/<:[^/]+>',            GearHandler),
+        webapp2.Route(r'/<:[^/]+>/invocation', GearHandler, handler_method='get_invocation'),
     ]),
     webapp2.Route(r'/api/rules',             RulesHandler),
     webapp2.Route(r'/api/groups',                                   grouphandler.GroupHandler, handler_method='get_all', methods=['GET']),
diff --git a/api/jobs/gears.py b/api/jobs/gears.py
index 7091286a..f236370b 100644
--- a/api/jobs/gears.py
+++ b/api/jobs/gears.py
@@ -5,6 +5,8 @@ Gears
 from .. import config
 from .jobs import Job
 
+import gear_tools
+
 log = config.log
 
 # For now, gears are in a singleton, prefixed by a key
@@ -49,6 +51,9 @@ def get_gear_by_name(name):
     # Mongo returns the full document: { '_id' : 'gears', 'gear_list' : [ { .. } ] }, so strip that out
     return gear_doc[SINGLETON_KEY][0]
 
+def get_invocation(gear):
+    return gear_tools.derive_invocation_schema(gear['manifest'])
+
 def insert_gear(doc):
     config.db.singletons.update(
         {"_id" : "gears"},
diff --git a/api/jobs/handlers.py b/api/jobs/handlers.py
index f61ec822..b7a52de9 100644
--- a/api/jobs/handlers.py
+++ b/api/jobs/handlers.py
@@ -9,7 +9,7 @@ from ..dao.containerutil import create_filereference_from_dictionary, create_con
 from .. import base
 from .. import config
 
-from .gears import get_gears, get_gear_by_name, remove_gear, upsert_gear
+from .gears import get_gears, get_gear_by_name, get_invocation, remove_gear, upsert_gear
 from .jobs import Job
 from .queue import Queue
 
@@ -41,6 +41,14 @@ class GearHandler(base.RequestHandler):
 
         return get_gear_by_name(_id)
 
+    def get_invocation(self, _id):
+
+        if self.public_request:
+            self.abort(403, 'Request requires login')
+
+        gear = get_gear_by_name(_id)
+        return get_invocation(gear)
+
     def post(self, _id):
         """Upsert an entire gear document."""
 
-- 
GitLab