Ver Fonte

AMBARI-13196. Designate Active Ambari Server (Nahappan Somasundaram via smohanty)

Sumit Mohanty há 10 anos atrás
pai
commit
e24e3c8b75

+ 22 - 0
ambari-server/src/main/python/ambari_server/serverConfiguration.py

@@ -170,6 +170,8 @@ JDK_RELEASES="java.releases"
 
 VIEWS_DIR_PROPERTY = "views.dir"
 
+ACTIVE_INSTANCE_PROPERTY = "active.instance"
+
 #Common setup or upgrade message
 SETUP_OR_UPGRADE_MSG = "- If this is a new setup, then run the \"ambari-server setup\" command to create the user\n" \
                        "- If this is an upgrade of an existing setup, run the \"ambari-server upgrade\" command.\n" \
@@ -522,6 +524,26 @@ def read_ambari_user():
       return user
   return None
 
+def get_is_active_instance():
+  # active.instance, if missing, will be considered to be true;
+  # if present, it should be explicitly set to "true" to set this as the active instance;
+  # any other value will be taken as a "false"
+  properties = get_ambari_properties()
+  # Get the value of active.instance.
+  active_instance_value = None
+  if properties != -1:
+    if ACTIVE_INSTANCE_PROPERTY in properties.propertyNames():
+      active_instance_value = properties[ACTIVE_INSTANCE_PROPERTY]
+
+  if active_instance_value is None:  # property is missing
+    is_active_instance = True
+  elif (active_instance_value == 'true'): # property is explicitly set to true
+    is_active_instance = True
+  else:  # any other value
+    is_active_instance = False
+
+  return is_active_instance
+
 def get_value_from_properties(properties, key, default=""):
   try:
     value = properties.get_property(key)

+ 7 - 0
ambari-server/src/main/python/ambari_server_main.py

@@ -31,6 +31,7 @@ from ambari_server.dbConfiguration import ensure_dbms_is_running, ensure_jdbc_dr
   get_native_libs_path, get_jdbc_driver_path
 from ambari_server.serverConfiguration import configDefaults, find_jdk, get_ambari_classpath, get_ambari_properties, \
   get_conf_dir, get_is_persisted, get_is_secure, get_java_exe_path, get_original_master_key, read_ambari_user, \
+  get_is_active_instance, \
   PID_NAME, SECURITY_KEY_ENV_VAR_NAME, SECURITY_MASTER_KEY_LOCATION, \
   SETUP_OR_UPGRADE_MSG, check_database_name_property, parse_properties_file
 from ambari_server.serverUtils import refresh_stack_hash
@@ -219,6 +220,12 @@ def server_process_main(options, scmStatus=None):
   check_database_name_property()
   parse_properties_file(options)
 
+  is_active_instance = get_is_active_instance()
+  if not is_active_instance:
+      print_warning_msg("This instance of ambari server is not designated as active. Cannot start ambari server.")
+      err = "This is not an active instance. Shutting down..."
+      raise FatalException(1, err)
+
   ambari_user = read_ambari_user()
   current_user = ensure_can_start_under_current_user(ambari_user)
 

+ 56 - 1
ambari-server/src/test/python/TestAmbariServer.py

@@ -63,6 +63,7 @@ with patch("platform.linux_distribution", return_value = os_distro_value):
           check_database_name_property, OS_FAMILY_PROPERTY, \
           find_properties_file, get_ambari_classpath, get_ambari_jars, get_ambari_properties, get_JAVA_HOME, \
           parse_properties_file, read_ambari_user, update_ambari_properties, update_properties_2, write_property, find_jdk, \
+          get_is_active_instance, \
           AMBARI_CONF_VAR, AMBARI_SERVER_LIB, JDBC_DATABASE_PROPERTY, JDBC_RCA_PASSWORD_FILE_PROPERTY, \
           PERSISTENCE_TYPE_PROPERTY, JDBC_URL_PROPERTY, get_conf_dir, JDBC_USER_NAME_PROPERTY, JDBC_PASSWORD_PROPERTY, \
           JDBC_DATABASE_NAME_PROPERTY, OS_TYPE_PROPERTY, validate_jdk, JDBC_POSTGRES_SCHEMA_PROPERTY, \
@@ -1110,6 +1111,45 @@ class TestAmbariServer(TestCase):
     self.assertEquals(user, None)
     pass
 
+  @patch("ambari_server.serverConfiguration.get_ambari_properties")
+  @patch("ambari_server.serverConfiguration.Properties")
+  def test_read_active_instance(self, properties_mock, get_ambari_properties_mock):
+    # Set up the mock
+    properties_mock.propertyNames = MagicMock(return_value=['active.instance'])
+    get_ambari_properties_mock.return_value = properties_mock
+
+    # Test with explicitly set value of "false" (should return False)
+    properties_mock.__getitem__.return_value = "false"
+    is_active_instance = get_is_active_instance()
+    self.assertFalse(is_active_instance)
+
+    # Test with empty string  (should return False)
+    properties_mock.__getitem__.return_value = ""
+    is_active_instance = get_is_active_instance()
+    self.assertFalse(is_active_instance)
+
+    # Test with a random string (should return False)
+    properties_mock.__getitem__.return_value = "xyz"
+    is_active_instance = get_is_active_instance()
+    self.assertFalse(is_active_instance)
+
+    # Test with a explicit false string (should return False)
+    properties_mock.__getitem__.return_value = "false"
+    is_active_instance = get_is_active_instance()
+    self.assertFalse(is_active_instance)
+
+    # Test with explicitly set value of "true"  (should return True)
+    properties_mock.__getitem__.return_value = "true"
+    is_active_instance = get_is_active_instance()
+    self.assertTrue(is_active_instance)
+
+    # Test with missing active.instance entry (should return True)
+    properties_mock.propertyNames = MagicMock(return_value=[])
+    is_active_instance = get_is_active_instance()
+    self.assertTrue(is_active_instance)
+
+    pass
+
   @patch("ambari_server.setupSecurity.get_file_owner")
   @patch("ambari_server.setupSecurity.get_ambari_repo_file_full_name")
   @patch("os.path.exists")
@@ -4115,6 +4155,7 @@ class TestAmbariServer(TestCase):
 
 
   @not_for_platform(PLATFORM_WINDOWS)
+  @patch("ambari_server_main.get_is_active_instance")
   @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value))
   @patch("sys.stdout.flush")
   @patch("sys.stdout.write")
@@ -4168,10 +4209,13 @@ class TestAmbariServer(TestCase):
                  save_master_key_method, get_master_key_location_method,
                  os_chown_mock, is_server_running_mock, locate_file_mock,
                  os_makedirs_mock, check_exitcode_mock, save_main_pid_ex_mock,
-                 wait_for_pid_mock, looking_for_pid_mock, stdout_write_mock, stdout_flush_mock):
+                 wait_for_pid_mock, looking_for_pid_mock, stdout_write_mock, stdout_flush_mock,
+                 get_is_active_instance_mock):
 
     def reset_mocks():
       pexistsMock.reset_mock()
+      get_is_active_instance_mock.reset_mock()
+      get_is_active_instance_mock.return_value = True
 
       args = MagicMock()
       del args.dbms
@@ -4261,6 +4305,17 @@ class TestAmbariServer(TestCase):
       self.assertTrue('Unable to start Ambari Server as user' in e.reason)
       #self.assertFalse(parse_properties_file_mock.called)
 
+    # If not active instance, exception should be thrown
+    args = reset_mocks()
+    get_is_active_instance_mock.return_value = False
+    try:
+      _ambari_server_.start(args)
+      self.fail("Should fail with 'This is not an active instance. Shutting down...'")
+    except FatalException as e:
+      # Expected
+      self.assertTrue('This is not an active instance' in e.reason)
+      pass
+
     # Checking "jdk not found"
     args = reset_mocks()
     is_root_3_mock.return_value = \