[autotest] Add JSON output to atest server list

JSON output allows atest to be used to access server_db information in
admin scripts.

BUG=None
TEST=Run atest server list

Change-Id: I84240cb56a36a68f457b361d13131af694d7e645
Reviewed-on: https://chromium-review.googlesource.com/404689
Commit-Ready: Allen Li <[email protected]>
Tested-by: Allen Li <[email protected]>
Reviewed-by: Allen Li <[email protected]>
diff --git a/site_utils/server_manager_utils.py b/site_utils/server_manager_utils.py
index b9e6ea7..e69d6f2 100644
--- a/site_utils/server_manager_utils.py
+++ b/site_utils/server_manager_utils.py
@@ -8,6 +8,7 @@
 """
 
 import collections
+import json
 import socket
 import subprocess
 import sys
@@ -92,6 +93,37 @@
     return '\n'.join(str(server) for server in servers)
 
 
+def format_servers_json(servers):
+    """Format servers for printing as JSON.
+
+    Example output:
+
+        Hostname     : server2
+        Status       : primary
+        Roles        : drone
+        Attributes   : {'max_processes':300}
+        Date Created : 2014-11-25 12:00:00
+        Date Modified: None
+        Note         : Drone in lab1
+
+    @param servers: Sequence of Server instances.
+    @returns: String.
+    """
+    server_dicts = []
+    for server in servers:
+        if server.date_modified is None:
+            date_modified = None
+        else:
+            date_modified = str(server.date_modified)
+        server_dicts.append({'hostname': server.hostname,
+                             'status': server.status,
+                             'roles': server.get_role_names(),
+                             'date_created': str(server.date_created),
+                             'date_modified': date_modified,
+                             'note': server.note})
+    return json.dumps(server_dicts)
+
+
 _SERVER_TABLE_FORMAT = ('%(hostname)-30s | %(status)-7s | %(roles)-20s |'
                         ' %(date_created)-19s | %(date_modified)-19s |'
                         ' %(note)s')