Browse Source

Add hostname and IP info

Gabriel-Adrian Samfira 6 years ago
parent
commit
2bb31bc7cc

+ 0 - 1
coriolis/api/v1/diagnostics.py

@@ -20,7 +20,6 @@ class DiagnosticsController(api_wsgi.Controller):
 
     def index(self, req):
         context = req.environ['coriolis.context']
-        LOG.debug(">>> %r" % context.to_dict())
         context.can(
             diagnostics.get_diagnostics_policy_label("get"))
 

+ 3 - 0
coriolis/conductor/rpc/client.py

@@ -295,3 +295,6 @@ class ConductorClient(object):
 
     def get_diagnostics(self, ctxt):
         return self._client.call(ctxt, 'get_diagnostics')
+
+    def get_all_diagnostics(self, ctxt):
+        return self._client.call(ctxt, 'get_all_diagnostics')

+ 10 - 0
coriolis/conductor/rpc/server.py

@@ -105,6 +105,16 @@ class ConductorServerEndpoint(object):
         self._rpc_worker_client = rpc_worker_client.WorkerClient()
         self._replica_cron_client = rpc_cron_client.ReplicaCronClient()
 
+    def get_all_diagnostics(self, ctxt):
+        conductor = self.get_diagnostics(ctxt)
+        cron = self._replica_cron_client.get_diagnostics(ctxt)
+        worker = self._rpc_worker_client.get_diagnostics(ctxt)
+        return [
+            conductor,
+            cron,
+            worker,
+        ]
+
     def _check_delete_reservation_for_transfer(self, transfer_action):
         action_id = transfer_action.base_id
         if not self._licensing_client:

+ 3 - 9
coriolis/diagnostics/api.py

@@ -12,13 +12,7 @@ class API(object):
         self._worker_cli = worker_rpc.WorkerClient()
 
     def get(self, ctxt):
-        conductor = self._conductor_cli.get_diagnostics(ctxt)
-        cron = self._cron_cli.get_diagnostics(ctxt)
-        worker = self._worker_cli.get_diagnostics(ctxt)
+        diag = self._conductor_cli.get_all_diagnostics(ctxt)
         api = utils.get_diagnostics_info()
-        return [
-            conductor,
-            cron,
-            worker,
-            api,
-        ]
+        diag.append(api)
+        return diag

+ 34 - 1
coriolis/utils.py

@@ -11,6 +11,7 @@ import io
 import json
 import os
 import pickle
+import platform
 import re
 import socket
 import string
@@ -26,6 +27,8 @@ import OpenSSL
 from oslo_config import cfg
 from oslo_log import log as logging
 from oslo_serialization import jsonutils
+
+import netifaces
 import paramiko
 # NOTE(gsamfira): I am aware that this is not ideal, but pip
 # developers have decided to move all logic inside an _internal
@@ -84,13 +87,43 @@ exec %(cmdline)s
 """
 
 
+def _get_local_ips():
+    ifaces = netifaces.interfaces()
+    ret = []
+    for iface in ifaces:
+        if iface == "lo":
+            continue
+        addrs = netifaces.ifaddresses(iface)
+        ret.append(
+            {
+                iface: {
+                    "ipv4": addrs.get(netifaces.AF_INET),
+                    "ipv6": addrs.get(netifaces.AF_INET6),
+                },
+            }
+        )
+    return ret
+
+
+def _get_host_os_info():
+    info = None
+    # This exists on all modern Linux systems
+    if os.path.isfile("/etc/os-release"):
+        with open("/etc/os-release") as fd:
+            info = fd.read().split('\n')
+    return info
+
+
 def get_diagnostics_info():
     # TODO(gsamfira): decide if we want any other kind of
     # diagnostics.
     packages = list(freeze.freeze())
     return {
         "application": os.path.basename(main.__file__),
-        "packages": packages
+        "packages": packages,
+        "os_info": _get_host_os_info(),
+        "hostname": platform.node(),
+        "ip_addresses": _get_local_ips(),
     }