浏览代码

AMBARI-12473. Replace checks for redhat7 in code to more generic to avoid issues with os support in future (aonishuk)

Andrew Onishuk 10 年之前
父节点
当前提交
dca90aaa2e

+ 20 - 25
ambari-agent/src/main/python/ambari_agent/Facter.py

@@ -285,7 +285,7 @@ class FacterWindows(Facter):
 class FacterLinux(Facter):
   # selinux command
   GET_SE_LINUX_ST_CMD = "/usr/sbin/sestatus"
-  GET_IFCONFIG_CMD = "ifconfig"
+  GET_IFCONFIG_SHORT_CMD = "ifconfig -s"
   GET_UPTIME_CMD = "cat /proc/uptime"
   GET_MEMINFO_CMD = "cat /proc/meminfo"
 
@@ -294,18 +294,18 @@ class FacterLinux(Facter):
 
   def __init__(self):
 
-    self.DATA_IFCONFIG_OUTPUT = FacterLinux.setDataIfConfigOutput()
+    self.DATA_IFCONFIG_SHORT_OUTPUT = FacterLinux.setDataIfConfigShortOutput()
     self.DATA_UPTIME_OUTPUT = FacterLinux.setDataUpTimeOutput()
     self.DATA_MEMINFO_OUTPUT = FacterLinux.setMemInfoOutput()
 
   @staticmethod
-  def setDataIfConfigOutput():
+  def setDataIfConfigShortOutput():
 
     try:
-      result = os.popen(FacterLinux.GET_IFCONFIG_CMD).read()
+      result = os.popen(FacterLinux.GET_IFCONFIG_SHORT_CMD).read()
       return result
     except OSError:
-      log.warn("Can't execute {0}".format(FacterLinux.GET_IFCONFIG_CMD))
+      log.warn("Can't execute {0}".format(FacterLinux.GET_IFCONFIG_SHORT_CMD))
     return ""
 
   @staticmethod
@@ -353,13 +353,11 @@ class FacterLinux(Facter):
       log.warn("Could not run {0}: OK".format(FacterLinux.GET_SE_LINUX_ST_CMD))
     return False
 
-  # Function that returns list of values that matches
-  # Return empty str if no matches
-  def data_return_list(self, patern, data):
-    full_list = re.findall(patern, data)
+  def return_first_words_from_list(self, list):
     result = ""
-    for i in full_list:
-      result = result + i + ","
+    for i in list:
+      if i.strip():
+        result = result + i.split()[0].strip() + ","
 
     result = re.sub(r',$', "", result)
     return result
@@ -377,15 +375,15 @@ class FacterLinux(Facter):
     import fcntl
     import struct
     primary_ip = self.getIpAddress().strip()
-    interface_pattern="(\w+)(?:.*Link encap:)"
-    if OSCheck.is_redhat7():
-      interface_pattern="(\w+)(?:.*flags=)"
-    for i in re.findall(interface_pattern, self.DATA_IFCONFIG_OUTPUT):
-      ip_address_by_ifname = self.get_ip_address_by_ifname(i.strip())
-      if ip_address_by_ifname is not None:
-        if primary_ip == ip_address_by_ifname.strip():
-          return socket.inet_ntoa(fcntl.ioctl(socket.socket(socket.AF_INET, socket.SOCK_DGRAM), 35099, struct.pack('256s', i))[20:24])
-        
+
+    for line in self.DATA_IFCONFIG_SHORT_OUTPUT.splitlines()[1:]:
+      if line.strip():
+        i = line.split()[0]
+        ip_address_by_ifname = self.get_ip_address_by_ifname(i.strip())
+        if ip_address_by_ifname is not None:
+          if primary_ip == ip_address_by_ifname.strip():
+            return socket.inet_ntoa(fcntl.ioctl(socket.socket(socket.AF_INET, socket.SOCK_DGRAM), 35099, struct.pack('256s', i))[20:24])
+
     return None
       
   # Return IP by interface name
@@ -408,12 +406,9 @@ class FacterLinux(Facter):
 
   # Return interfaces
   def getInterfaces(self):
-    interface_pattern="(\w+)(?:.*Link encap:)"
-    if OSCheck.is_redhat7():
-      interface_pattern="(\w+)(?:.*flags=)"
-    result = self.data_return_list(interface_pattern, self.DATA_IFCONFIG_OUTPUT)
+    result = self.return_first_words_from_list(self.DATA_IFCONFIG_SHORT_OUTPUT.splitlines()[1:])
     if result == '':
-      log.warn("Can't get a network interfaces list from {0}".format(self.DATA_IFCONFIG_OUTPUT))
+      log.warn("Can't get a network interfaces list from {0}".format(self.DATA_IFCONFIG_SHORT_OUTPUT))
       return 'OS NOT SUPPORTED'
     else:
       return result

+ 5 - 0
ambari-agent/src/test/python/ambari_agent/TestController.py

@@ -39,6 +39,7 @@ from ambari_commons import OSCheck
 from ambari_agent.Hardware import Hardware
 from ambari_agent.ExitHelper import ExitHelper
 from ambari_agent.AmbariConfig import AmbariConfig
+from ambari_agent.Facter import FacterLinux
 import ambari_commons
 
 OPERATING_SYSTEM_DISTRO = ('Suse','11','Final')
@@ -183,6 +184,8 @@ class TestController(unittest.TestCase):
 
 
   @patch.object(Hardware, "_chk_mount", new = MagicMock(return_value=True))
+  @patch.object(FacterLinux, "facterInfo", new = MagicMock(return_value={}))
+  @patch.object(FacterLinux, "__init__", new = MagicMock(return_value = None))
   @patch("urllib2.build_opener")
   @patch("urllib2.install_opener")
   @patch.object(Controller, "ActionQueue")
@@ -222,6 +225,8 @@ class TestController(unittest.TestCase):
 
 
   @patch.object(Hardware, "_chk_mount", new = MagicMock(return_value=True))
+  @patch.object(FacterLinux, "facterInfo", new = MagicMock(return_value={}))
+  @patch.object(FacterLinux, "__init__", new = MagicMock(return_value = None))
   @patch("urllib2.build_opener")
   @patch("urllib2.install_opener")
   @patch.object(ActionQueue.ActionQueue, "run")

+ 12 - 76
ambari-agent/src/test/python/ambari_agent/TestHardware.py

@@ -34,9 +34,15 @@ from ambari_commons import OSCheck
 @patch.object(platform,"linux_distribution", new = ('Suse','11','Final'))
 @patch.object(socket, "getfqdn", new = MagicMock(return_value = "ambari.apache.org"))
 @patch.object(socket, "gethostbyname", new = MagicMock(return_value = "192.168.1.1"))
+@patch.object(FacterLinux, "setDataIfConfigShortOutput", new = MagicMock(return_value ='''Iface   MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
+eth0   1500   0     9986      0      0      0     5490      0      0      0 BMRU
+eth1   1500   0        0      0      0      0        6      0      0      0 BMRU
+eth2   1500   0        0      0      0      0        6      0      0      0 BMRU
+lo    16436   0        2      0      0      0        2      0      0      0 LRU'''))
 class TestHardware(TestCase):
 
   @patch.object(Hardware, "_chk_mount", new = MagicMock(return_value=True))
+  @patch.object(FacterLinux, "get_ip_address_by_ifname", new = MagicMock(return_value=None))
   @patch.object(OSCheck, "get_os_type")
   @patch.object(OSCheck, "get_os_version")
   def test_build(self, get_os_version_mock, get_os_type_mock):
@@ -123,6 +129,7 @@ class TestHardware(TestCase):
 
     self.assertEquals(result, None)
 
+  @patch.object(FacterLinux, "get_ip_address_by_ifname", new = MagicMock(return_value=None))
   @patch.object(hostname,"hostname")
   @patch.object(FacterLinux, "getFqdn")
   @patch.object(OSCheck, "get_os_type")
@@ -138,6 +145,7 @@ class TestHardware(TestCase):
     self.assertEquals(result['domain'], "apache.org")
     self.assertEquals(result['fqdn'], (result['hostname'] + '.' + result['domain']))
 
+  @patch.object(FacterLinux, "get_ip_address_by_ifname", new = MagicMock(return_value=None))
   @patch.object(FacterLinux, "setDataUpTimeOutput")
   @patch.object(OSCheck, "get_os_type")
   @patch.object(OSCheck, "get_os_version")
@@ -152,6 +160,7 @@ class TestHardware(TestCase):
     self.assertEquals(result['uptime_hours'], '73')
     self.assertEquals(result['uptime_days'], '3')
 
+  @patch.object(FacterLinux, "get_ip_address_by_ifname", new = MagicMock(return_value=None))
   @patch.object(FacterLinux, "setMemInfoOutput")
   @patch.object(OSCheck, "get_os_type")
   @patch.object(OSCheck, "get_os_version")
@@ -184,51 +193,14 @@ SwapFree:        1598676 kB
   @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,
                                     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
-          inet6 addr: fe80::a00:27ff:fec9:399e/64 Scope:Link
-          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
-          RX packets:7575 errors:0 dropped:0 overruns:0 frame:0
-          TX packets:3463 errors:0 dropped:0 overruns:0 carrier:0
-          collisions:0 txqueuelen:1000
-          RX bytes:9383574 (8.9 MiB)  TX bytes:231609 (226.1 KiB)
-
-eth1      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
-          inet6 addr: fe80::a00:27ff:fec9:399e/64 Scope:Link
-          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
-          RX packets:7575 errors:0 dropped:0 overruns:0 frame:0
-          TX packets:3463 errors:0 dropped:0 overruns:0 carrier:0
-          collisions:0 txqueuelen:1000
-          RX bytes:9383574 (8.9 MiB)  TX bytes:231609 (226.1 KiB)
-
-eth2      Link encap:Ethernet  HWaddr 08:00:27:9A:9A:45
-          inet addr:192.168.64.101  Bcast:192.168.64.255  Mask:255.255.255.0
-          inet6 addr: fe80::a00:27ff:fe9a:9a45/64 Scope:Link
-          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
-          RX packets:180 errors:0 dropped:0 overruns:0 frame:0
-          TX packets:89 errors:0 dropped:0 overruns:0 carrier:0
-          collisions:0 txqueuelen:1000
-          RX bytes:18404 (17.9 KiB)  TX bytes:17483 (17.0 KiB)
-
-lo        Link encap:Local Loopback
-          inet addr:127.0.0.1  Mask:255.0.0.0
-          inet6 addr: ::1/128 Scope:Host
-          UP LOOPBACK RUNNING  MTU:16436  Metric:1
-          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
-          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
-          collisions:0 txqueuelen:0
-          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
-    '''
 
     get_os_type_mock.return_value = "suse"
     get_os_version_mock.return_value = "11"
@@ -247,51 +219,14 @@ lo        Link encap:Local Loopback
   @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_facterDataIfConfigOutputNone(self, get_os_version_mock, get_os_type_mock, facter_setDataIfConfigOutput_mock,
+  def test_facterDataIfConfigOutputNone(self, get_os_version_mock, get_os_type_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 = ""
     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
-          inet6 addr: fe80::a00:27ff:fec9:399e/64 Scope:Link
-          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
-          RX packets:7575 errors:0 dropped:0 overruns:0 frame:0
-          TX packets:3463 errors:0 dropped:0 overruns:0 carrier:0
-          collisions:0 txqueuelen:1000
-          RX bytes:9383574 (8.9 MiB)  TX bytes:231609 (226.1 KiB)
-
-eth1      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
-          inet6 addr: fe80::a00:27ff:fec9:399e/64 Scope:Link
-          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
-          RX packets:7575 errors:0 dropped:0 overruns:0 frame:0
-          TX packets:3463 errors:0 dropped:0 overruns:0 carrier:0
-          collisions:0 txqueuelen:1000
-          RX bytes:9383574 (8.9 MiB)  TX bytes:231609 (226.1 KiB)
-
-eth2      Link encap:Ethernet  HWaddr 08:00:27:9A:9A:45
-          inet addr:192.168.64.101  Bcast:192.168.64.255  Mask:255.255.255.0
-          inet6 addr: fe80::a00:27ff:fe9a:9a45/64 Scope:Link
-          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
-          RX packets:180 errors:0 dropped:0 overruns:0 frame:0
-          TX packets:89 errors:0 dropped:0 overruns:0 carrier:0
-          collisions:0 txqueuelen:1000
-          RX bytes:18404 (17.9 KiB)  TX bytes:17483 (17.0 KiB)
-
-lo        Link encap:Local Loopback
-          inet addr:127.0.0.1  Mask:255.0.0.0
-          inet6 addr: ::1/128 Scope:Host
-          UP LOOPBACK RUNNING  MTU:16436  Metric:1
-          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
-          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
-          collisions:0 txqueuelen:0
-          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
-    '''
 
     get_os_type_mock.return_value = "suse"
     get_os_version_mock.return_value = "11"
@@ -301,6 +236,7 @@ lo        Link encap:Local Loopback
     self.assertEquals(result['netmask'], None)
 
 
+  @patch.object(FacterLinux, "get_ip_address_by_ifname", new = MagicMock(return_value=None))
   @patch.object(OSCheck, "get_os_type")
   @patch.object(OSCheck, "get_os_family")
   @patch.object(OSCheck, "get_os_version")

+ 3 - 0
ambari-agent/src/test/python/ambari_agent/TestRegistration.py

@@ -28,11 +28,14 @@ from ambari_commons.os_check import OSCheck
 from ambari_agent.Register import Register
 from ambari_agent.AmbariConfig import AmbariConfig
 from ambari_agent.Hardware import Hardware
+from ambari_agent.Facter import FacterLinux
 
 @not_for_platform(PLATFORM_WINDOWS)
 class TestRegistration(TestCase):
 
   @patch.object(Hardware, "_chk_mount", new = MagicMock(return_value=True))
+  @patch.object(FacterLinux, "facterInfo", new = MagicMock(return_value={}))
+  @patch.object(FacterLinux, "__init__", new = MagicMock(return_value = None))
   @patch("ambari_commons.firewall.run_os_command")
   @patch.object(OSCheck, "get_os_type")
   @patch.object(OSCheck, "get_os_version")

+ 0 - 15
ambari-common/src/main/python/ambari_commons/os_check.py

@@ -308,21 +308,6 @@ class OSCheck:
       pass
     return False    
 
-  @staticmethod
-  def is_redhat7():
-    """
-     Return true if it is so or false if not
-
-     This is safe check for redhat7 , doesn't generate exception
-    """
-    try:
-      ostemp=OSCheck.get_os_family()+OSCheck().get_os_major_version()
-      if ostemp == 'redhat7':
-        return True
-    except Exception:
-      pass
-    return False
-
   @staticmethod
   def is_windows_family():
     """

+ 1 - 1
ambari-server/src/main/python/ambari_server/utils.py

@@ -216,7 +216,7 @@ def get_postgre_hba_dir(OS_FAMILY):
     # Like: /etc/postgresql/9.1/main/
     return os.path.join(get_pg_hba_init_files(), get_ubuntu_pg_version(),
                         "main")
-  elif OSCheck.is_redhat7():
+  elif OSCheck.is_redhat_family() and int(OSCheck.get_os_major_version()) >= 7:
     return PG_HBA_ROOT_DEFAULT
   else:
     if not os.path.isfile(get_pg_hba_init_files()):