瀏覽代碼

AMBARI-12125. If agent is not restarted after upgrade, it reads new version file and registers as a new version (dlysnichenko)

Lisnichenko Dmitro 10 年之前
父節點
當前提交
d998d056fc

+ 11 - 1
ambari-agent/src/main/python/ambari_agent/Controller.py

@@ -57,6 +57,7 @@ class Controller(threading.Thread):
     if heartbeat_stop_callback is None:
       heartbeat_stop_callback = HeartbeatStopHandlers()
 
+    self.version = self.read_agent_version(config)
     self.lock = threading.Lock()
     self.safeMode = True
     self.credential = None
@@ -102,6 +103,15 @@ class Controller(threading.Thread):
     self.alert_scheduler_handler.start()
 
 
+  def read_agent_version(self, config):
+    data_dir = config.get('agent', 'prefix')
+    ver_file = os.path.join(data_dir, 'version')
+    f = open(ver_file, "r")
+    version = f.read().strip()
+    f.close()
+    return version
+
+
   def __del__(self):
     logger.info("Server connection disconnected.")
 
@@ -117,7 +127,7 @@ class Controller(threading.Thread):
 
     while not self.isRegistered:
       try:
-        data = json.dumps(self.register.build())
+        data = json.dumps(self.register.build(self.version))
         prettyData = pprint.pformat(data)
 
         try:

+ 1 - 10
ambari-agent/src/main/python/ambari_agent/Register.py

@@ -34,7 +34,7 @@ class Register:
     self.hardware = Hardware()
     self.config = config
 
-  def build(self, id='-1'):
+  def build(self, version, id='-1'):
     global clusterId, clusterDefinitionRevision, firstContact
     timestamp = int(time.time()*1000)
 
@@ -42,7 +42,6 @@ class Register:
     agentEnv = { }
     hostInfo.register(agentEnv, False, False)
 
-    version = self.read_agent_version()
     current_ping_port = self.config.get('agent','current_ping_port')
 
     register = { 'responseId'        : int(id),
@@ -56,11 +55,3 @@ class Register:
                  'prefix'            : self.config.get('agent', 'prefix')
                }
     return register
-
-  def read_agent_version(self):
-    data_dir = self.config.get('agent', 'prefix')
-    ver_file = os.path.join(data_dir, 'version')
-    f = open(ver_file, "r")
-    version = f.read().strip()
-    f.close()
-    return version

+ 21 - 2
ambari-agent/src/test/python/ambari_agent/TestController.py

@@ -20,7 +20,9 @@ limitations under the License.
 '''
 
 import StringIO
+import os
 import ssl
+import tempfile
 import unittest, threading
 import sys
 from mock.mock import patch, MagicMock, call, Mock
@@ -36,6 +38,7 @@ from ambari_agent.Controller import AGENT_AUTO_RESTART_EXIT_CODE
 from ambari_commons import OSCheck
 from ambari_agent.Hardware import Hardware
 from ambari_agent.ExitHelper import ExitHelper
+from ambari_agent.AmbariConfig import AmbariConfig
 import ambari_commons
 
 OPERATING_SYSTEM_DISTRO = ('Suse','11','Final')
@@ -48,15 +51,16 @@ class TestController(unittest.TestCase):
 
   @patch.object(Controller, "NetUtil", MagicMock())
   @patch.object(Controller, "AlertSchedulerHandler", MagicMock())
+  @patch.object(Controller.Controller, "read_agent_version")
   @patch("threading.Thread")
   @patch("threading.Lock")
   @patch.object(hostname, "hostname")
-  def setUp(self, hostname_method, lockMock, threadMock):
+  def setUp(self, hostname_method, lockMock, threadMock, read_agent_versionMock):
 
     Controller.logger = MagicMock()
     lockMock.return_value = MagicMock()
     hostname_method.return_value = "test_hostname"
-
+    read_agent_versionMock.return_value = '2.1.0'
 
     config = MagicMock()
     #config.get.return_value = "something"
@@ -66,6 +70,21 @@ class TestController(unittest.TestCase):
     self.controller.netutil.MINIMUM_INTERVAL_BETWEEN_HEARTBEATS = 0.1
     self.controller.netutil.HEARTBEAT_NOT_IDDLE_INTERVAL_SEC = 0.1
 
+  @patch.object(OSCheck, "get_os_type")
+  @patch.object(OSCheck, "get_os_version")
+  def test_read_agent_version(self, get_os_version_mock, get_os_type_mock):
+    config = AmbariConfig().getConfig()
+    tmpdir = tempfile.gettempdir()
+    config.set('agent', 'prefix', tmpdir)
+    config.set('agent', 'current_ping_port', '33777')
+    ver_file = os.path.join(tmpdir, "version")
+    reference_version = "1.3.0"
+    with open(ver_file, "w") as text_file:
+      text_file.write(reference_version)
+    version = self.controller.read_agent_version(config)
+    os.remove(ver_file)
+    self.assertEqual(reference_version, version)
+
 
   @patch("ambari_simplejson.dumps")
   @patch("time.sleep")

+ 4 - 7
ambari-agent/src/test/python/ambari_agent/TestRegistration.py

@@ -44,12 +44,9 @@ class TestRegistration(TestCase):
     get_os_type_mock.return_value = "suse"
     get_os_version_mock.return_value = "11"
     run_os_cmd_mock.return_value = (3, "", "")
-    ver_file = os.path.join(tmpdir, "version")
-    with open(ver_file, "w") as text_file:
-      text_file.write("1.3.0")
-
     register = Register(config)
-    data = register.build(1)
+    reference_version = '2.1.0'
+    data = register.build(reference_version, 1)
     #print ("Register: " + pprint.pformat(data))
     self.assertEquals(len(data['hardwareProfile']) > 0, True, "hardwareProfile should contain content")
     self.assertEquals(data['hostname'] != "", True, "hostname should not be empty")
@@ -57,11 +54,11 @@ class TestRegistration(TestCase):
     self.assertEquals(data['responseId'], 1)
     self.assertEquals(data['timestamp'] > 1353678475465L, True, "timestamp should not be empty")
     self.assertEquals(len(data['agentEnv']) > 0, True, "agentEnv should not be empty")
-    self.assertEquals(data['agentVersion'], '1.3.0', "agentVersion should not be empty")
+    self.assertEquals(data['agentVersion'], reference_version, "agentVersion should not be empty")
     print data['agentEnv']['umask']
     self.assertEquals(not data['agentEnv']['umask']== "", True, "agents umask should not be empty")
     self.assertEquals(data['currentPingPort'] == 33777, True, "current ping port should be 33777")
     self.assertEquals(data['prefix'], config.get('agent', 'prefix'), 'The prefix path does not match')
     self.assertEquals(len(data), 9)
 
-    os.remove(ver_file)
+