From 864e0f163d1863d39fd078616cffa0407ded7dd4 Mon Sep 17 00:00:00 2001
From: Erik Reid <erik.reid@geant.org>
Date: Tue, 1 Oct 2019 16:16:50 +0200
Subject: [PATCH] always return a skeleton structure for any interface name

---
 inventory_provider/juniper.py           |  2 ++
 inventory_provider/routes/classifier.py | 24 ++++++++++++++++++------
 2 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/inventory_provider/juniper.py b/inventory_provider/juniper.py
index 2925b707..d7eca477 100644
--- a/inventory_provider/juniper.py
+++ b/inventory_provider/juniper.py
@@ -209,6 +209,8 @@ def list_interfaces(netconf_config):
     """
 
     def _ifc_info(e):
+        # warning: this structure should match the default
+        #          returned from routes.classifier.juniper_link_info
         name = e.find('name')
         assert name is not None, "expected interface 'name' child element"
         ifc = {
diff --git a/inventory_provider/routes/classifier.py b/inventory_provider/routes/classifier.py
index c8c36c5e..c29d2d8e 100644
--- a/inventory_provider/routes/classifier.py
+++ b/inventory_provider/routes/classifier.py
@@ -107,6 +107,16 @@ def get_juniper_link_info(source_equipment, interface):
             'netconf-interfaces:%s:%s' % (source_equipment, interface))
         if ifc_info:
             result['interface'] = json.loads(ifc_info.decode('utf-8'))
+        else:
+            # warning: this should match the structure returned by
+            #          juniper:list_interfaces:_ifc_info
+            result['interface'] = {
+                'name': interface,
+                'description': '',
+                'bundle': [],
+                'ipv4': [],
+                'ipv6': []
+            }
 
         def _related_services():
             for related in related_interfaces(source_equipment, interface):
@@ -123,12 +133,14 @@ def get_juniper_link_info(source_equipment, interface):
             related_services.extend(top_level_services)
             result['related-services'] = related_services
 
-        if not result:
-            return Response(
-                response="no available info for {} {}".format(
-                    source_equipment, interface),
-                status=404,
-                mimetype="text/html")
+        # no longer possible, now that at least 'interface' is
+        # returned for unknown interfaces
+        # if not result:
+        #     return Response(
+        #         response="no available info for {} {}".format(
+        #             source_equipment, interface),
+        #         status=404,
+        #         mimetype="text/html")
 
         result = json.dumps(result)
         # cache this data for the next call
-- 
GitLab