Sea change in how admin code calls the database layer

Add IPC to VLANd

All read-only admin DB query calls are now routed to the core VLANd
process via IPC, and responses come back from there. Part-way to
removing direct DB calls from admin.py, next is the DB calls that make
changes. They're more involved.

Change-Id: I6a993cd4c7b4e85c2a489ac96f9f0f58f087ca1d
diff --git a/util.py b/util.py
new file mode 100644
index 0000000..aee115f
--- /dev/null
+++ b/util.py
@@ -0,0 +1,67 @@
+import logging
+import os
+from db.db import VlanDB
+from errors import CriticalError, InputError, ConfigError, SocketError
+
+class VlanUtil:
+    """VLANd utility functions"""
+
+    def get_switch_driver(self, switch, config):
+        logging.debug("Trying to find a driver for %s" % switch)
+        driver = config.switches[switch].driver
+        logging.debug("Driver: %s" % driver)
+        module = __import__("drivers.%s" % driver, fromlist=[driver])
+        class_ = getattr(module, driver)
+        return class_(switch)
+
+    # Simple helper wrapper for all the read-only queries
+    def perform_query(self, db, command, data):
+        print command
+        print data
+        ret = {}
+        try:
+            if command == 'status':
+                # data ignored
+                ret['running'] = 'ok'
+            elif command == 'db.all_switches':
+                ret = db.all_switches()
+            elif command == 'db.all_ports':
+                ret = db.all_ports()
+            elif command == 'db.all_vlans':
+                ret = db.all_vlans()
+            elif command == 'db.get_switch_by_id':
+                ret = db.get_switch_by_id(data['switch_id'])
+            elif command == 'db.get_switch_id_by_name':
+                ret = db.get_switch_id_by_name(data['name'])
+            elif command == 'db.get_switch_name_by_id':
+                ret = db.get_switch_name_by_id(data['switch_id'])
+            elif command == 'db.get_port_by_id':
+                ret = db.get_port_by_id(data['port_id'])
+            elif command == 'db.get_ports_by_switch':
+                ret = db.get_ports_by_switch(data['switch_id'])
+            elif command == 'db.get_port_by_switch_and_name':
+                ret = db.get_port_by_switch_and_name(data['switch_id'], data['name'])
+            elif command == 'db.get_current_vlan_id_by_port':
+                ret = db.get_current_vlan_id_by_port(data['port_id'])
+            elif command == 'db.get_base_vlan_id_by_port':
+                ret = db.get_base_vlan_id_by_port(data['port_id'])
+            elif command == 'db.get_ports_by_current_vlan':
+                ret = db.get_ports_by_current_vlan(data['vlan_id'])
+            elif command == 'db.get_ports_by_base_vlan':
+                ret = db.get_ports_by_base_vlan(data['vlan_id'])
+            elif command == 'db.get_vlan_by_id':
+                ret = db.get_vlan_by_id(data['vlan_id'])
+            elif command == 'db.get_vlan_id_by_name':
+                ret = db.get_vlan_id_by_name(data['name'])
+            elif command == 'db.get_vlan_id_by_tag':
+                ret = db.get_vlan_id_by_name(data['tag'])
+            elif command == 'db.get_vlan_name_by_id':
+                ret = db.get_vlan_name_by_id(data['vlan_id'])
+            else:
+                raise InputError("Unknown query command \"%s\"" % command)
+
+        except:
+            raise InputError("Invalid input in query")
+
+        return ret
+