From 45555c53d8436f7594fd993cd14bf1d4f59d1c83 Mon Sep 17 00:00:00 2001
From: Robert Latta <robert.latta@geant.org>
Date: Thu, 12 Nov 2020 11:15:59 +0000
Subject: [PATCH] added first attempt at coriant route

---
 inventory_provider/routes/ims_classifier.py | 81 +++++++++++++++++++++
 1 file changed, 81 insertions(+)

diff --git a/inventory_provider/routes/ims_classifier.py b/inventory_provider/routes/ims_classifier.py
index fc0eea3a..319ab8d6 100644
--- a/inventory_provider/routes/ims_classifier.py
+++ b/inventory_provider/routes/ims_classifier.py
@@ -592,3 +592,84 @@ def get_fiberlink_trap_metadata(ne_name_str, object_name_str):
                 mimetype="text/html")
 
     return Response(result, mimetype="application/json")
+
+
+@routes.route('/coriant-info/<equipment_name>/<path:entity_string>',
+              methods=['GET', 'POST'])
+@common.require_accepts_json
+def get_coriant_info(equipment_name, entity_string):
+    r = common.get_current_redis()
+    equipment_name = get_ims_equipment_name(equipment_name)
+
+    cache_key = 'ims-classifier-cache:coriant:%s:%s' % (
+        equipment_name, entity_string)
+
+    # result = r.get(cache_key)
+    result = False
+
+    if result:
+        result = result.decode('utf-8')
+    else:
+
+        m = re.match(r'^(\d+\-\d+)\.(\d+)', entity_string)
+        if not m:
+            logger.error(
+                'invalid coriant entity string format: %r' % entity_string)
+            return Response(
+                response="no available info for '{}' '{}'".format(
+                    equipment_name, entity_string),
+                status=404,
+                mimetype="text/html")
+        result = {
+            'equipment name': equipment_name,
+            'card id': m.group(1).replace('-', '/'),
+            'port number': m.group(2),
+            'locations': []
+        }
+        interface_name = f'{result["card id"]}/{result["port number"]}'
+
+        top_level_services = []
+
+        services = r.get(
+            f'ims:interface_services:{equipment_name}:{interface_name}')
+        if services:
+            result['services'] = json.loads(services.decode('utf=8'))
+            for s in result['services']:
+                top_level_services.extend(get_top_level_services(s['id'], r))
+
+                result['locations'] += \
+                    _location_from_equipment(s['equipment'], r)
+                result['locations'] += \
+                    _location_from_equipment(s['other_end_equipment'], r)
+
+        def _related_services():
+            for related in related_interfaces(equipment_name, interface_name):
+                logger.debug(f'Related Interface: {related}')
+                rs = r.get(f'ims:interface_services:{equipment_name}:'
+                           f'{related.upper()}')
+                if rs:
+                    for s in json.loads(rs.decode('utf-8')):
+                        top_level_services.extend(
+                            get_top_level_services(s['id'], r))
+                        yield {
+                            'name': s['name'],
+                            'status': s['status'],
+                            'circuit_type': s['circuit_type'],
+                            'project': s['project']
+                        }
+
+        related_services = list(_related_services())
+        if related_services:
+            top_level_services.extend(related_services)
+        if top_level_services:
+            result['related-services'] = top_level_services
+
+        if not result['locations']:
+            result['locations'] = _location_from_equipment(equipment_name, r)
+
+        result['locations'] = _remove_duplicates_from_list(result['locations'])
+        result = json.dumps(result)
+        # cache this data for the next call
+        r.set(cache_key, result.encode('utf-8'))
+
+    return Response(result, mimetype="application/json")
-- 
GitLab