You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by vb...@apache.org on 2015/03/24 17:06:19 UTC

ambari git commit: AMBARI-10193. Hosts in Ambari showing IP as 127.0.0.1.(vbrodetskyi)

Repository: ambari
Updated Branches:
  refs/heads/trunk 2cb80ce3f -> 241f83115


AMBARI-10193. Hosts in Ambari showing IP as 127.0.0.1.(vbrodetskyi)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/241f8311
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/241f8311
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/241f8311

Branch: refs/heads/trunk
Commit: 241f83115983038ae26784b3ec36e75d50b81ece
Parents: 2cb80ce
Author: Vitaly Brodetskyi <vb...@hortonworks.com>
Authored: Tue Mar 24 18:05:12 2015 +0200
Committer: Vitaly Brodetskyi <vb...@hortonworks.com>
Committed: Tue Mar 24 18:05:12 2015 +0200

----------------------------------------------------------------------
 .../src/main/python/ambari_agent/Facter.py      | 48 ++++++++++----------
 .../test/python/ambari_agent/TestHardware.py    | 17 ++++++-
 2 files changed, 39 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/241f8311/ambari-agent/src/main/python/ambari_agent/Facter.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/ambari_agent/Facter.py b/ambari-agent/src/main/python/ambari_agent/Facter.py
index aaed859..fcadee5 100644
--- a/ambari-agent/src/main/python/ambari_agent/Facter.py
+++ b/ambari-agent/src/main/python/ambari_agent/Facter.py
@@ -25,6 +25,8 @@ import platform
 import re
 import shlex
 import socket
+import fcntl
+import struct
 import multiprocessing
 import subprocess
 from ambari_commons.shell import shellRunner
@@ -52,6 +54,10 @@ class Facter(object):
   def __init__(self):
     pass
 
+  # Return first ip adress
+  def getIpAddress(self):
+    return socket.gethostbyname(socket.getfqdn().lower())
+
   # Returns the currently running user id
   def getId(self):
     return getpass.getuser()
@@ -188,10 +194,6 @@ class FacterWindows(Facter):
   GET_PAGE_FILE_INFO = '$pgo=(Get-WmiObject Win32_PageFileUsage); echo "$($pgo.AllocatedBaseSize) $($pgo.AllocatedBaseSize-$pgo.CurrentUsage)"'
   GET_UPTIME_CMD = 'echo $([int]((get-date)-[system.management.managementdatetimeconverter]::todatetime((get-wmiobject -class win32_operatingsystem).Lastbootuptime)).TotalSeconds)'
 
-  # Return first ip adress
-  def getIpAddress(self):
-    #TODO check if we need ipconfig
-    return socket.gethostbyname(socket.gethostname().lower())
 
   # Return  netmask
   def getNetmask(self):
@@ -355,29 +357,27 @@ class FacterLinux(Facter):
 
     return result
 
-  # Return first ip adress
-  def getIpAddress(self):
-    ip_pattern="(?: inet addr:)(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})"
-    if OSCheck.is_redhat7():
-      ip_pattern="(?: inet )(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})"
-    result = self.data_return_first(ip_pattern,self.DATA_IFCONFIG_OUTPUT)
-    if result == '':
-      log.warn("Can't get an ip address from {0}".format(self.DATA_IFCONFIG_OUTPUT))
-      return socket.gethostbyname(socket.gethostname().lower())
-    else:
-      return result
-
   # Return  netmask
   def getNetmask(self):
-    mask_pattern="(?: Mask:)(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})"
+    primary_ip = self.getIpAddress().strip()
+    interface_pattern="(\w+)(?:.*Link encap:)"
     if OSCheck.is_redhat7():
-      mask_pattern="(?: netmask )(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})"
-    result = self.data_return_first(mask_pattern,self.DATA_IFCONFIG_OUTPUT)
-    if result == '':
-      log.warn("Can't get a netmask from {0}".format(self.DATA_IFCONFIG_OUTPUT))
-      return 'OS NOT SUPPORTED'
-    else:
-      return result
+      interface_pattern="(\w+)(?:.*flags=)"
+    for i in re.findall(interface_pattern, self.DATA_IFCONFIG_OUTPUT):
+      if primary_ip == self.get_ip_address_by_ifname(i.strip()).strip():
+        return socket.inet_ntoa(fcntl.ioctl(socket.socket(socket.AF_INET, socket.SOCK_DGRAM), 35099, struct.pack('256s', i))[20:24])
+        
+
+      
+  # Return IP by interface name
+  def get_ip_address_by_ifname(self, ifname):
+    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+    return socket.inet_ntoa(fcntl.ioctl(
+        s.fileno(),
+        0x8915,  # SIOCGIFADDR
+        struct.pack('256s', ifname[:15])
+    )[20:24])
+
 
   # Return interfaces
   def getInterfaces(self):

http://git-wip-us.apache.org/repos/asf/ambari/blob/241f8311/ambari-agent/src/test/python/ambari_agent/TestHardware.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/test/python/ambari_agent/TestHardware.py b/ambari-agent/src/test/python/ambari_agent/TestHardware.py
index 164417b..9bffaf6 100644
--- a/ambari-agent/src/test/python/ambari_agent/TestHardware.py
+++ b/ambari-agent/src/test/python/ambari_agent/TestHardware.py
@@ -144,11 +144,21 @@ SwapFree:        1598676 kB
     self.assertEquals(result['swapsize'], '2.04 GB')
     self.assertEquals(result['swapfree'], '1.52 GB')
 
+  @patch("fcntl.ioctl")
+  @patch("socket.socket")
+  @patch("struct.pack")
+  @patch("socket.inet_ntoa")
+  @patch.object(FacterLinux, "get_ip_address_by_ifname")
+  @patch.object(Facter, "getIpAddress")
   @patch.object(FacterLinux, "setDataIfConfigOutput")
   @patch.object(OSCheck, "get_os_type")
   @patch.object(OSCheck, "get_os_version")
-  def test_facterDataIfConfigOutput(self, get_os_version_mock, get_os_type_mock, facter_setDataIfConfigOutput_mock):
-
+  def test_facterDataIfConfigOutput(self, get_os_version_mock, get_os_type_mock, facter_setDataIfConfigOutput_mock,
+                                    getIpAddress_mock, get_ip_address_by_ifname_mock, inet_ntoa_mock, struct_pack_mock,
+                                    socket_socket_mock, fcntl_ioctl_mock):
+    getIpAddress_mock.return_value = "10.0.2.15"
+    get_ip_address_by_ifname_mock.return_value = "10.0.2.15"
+    inet_ntoa_mock.return_value = "255.255.255.0"
     facter_setDataIfConfigOutput_mock.return_value = '''
 eth0      Link encap:Ethernet  HWaddr 08:00:27:C9:39:9E
           inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
@@ -182,6 +192,9 @@ lo        Link encap:Local Loopback
     get_os_version_mock.return_value = "11"
     result = Facter().facterInfo()
 
+    self.assertTrue(inet_ntoa_mock.called)
+    self.assertTrue(get_ip_address_by_ifname_mock.called)
+    self.assertTrue(getIpAddress_mock.called)
     self.assertEquals(result['ipaddress'], '10.0.2.15')
     self.assertEquals(result['netmask'], '255.255.255.0')
     self.assertEquals(result['interfaces'], 'eth0,eth1,lo')