def download_and_install_jdk()

in ambari-server/src/main/python/ambari_server/serverSetup.py [0:0]


  def download_and_install_jdk(self, args, properties, ambariOnly=False):
    jcePolicyWarn = (
      "JCE Policy files are required for configuring Kerberos security. If you plan to use Kerberos,"
      "please make sure JCE Unlimited Strength Jurisdiction Policy Files are valid on all hosts."
    )

    if args.ambari_java_home:
      print("start setting AMBARI_JAVA_HOME for Ambari...")
      if not validate_jdk(args.ambari_java_home):
        err = (
          "Path to Ambari java home "
          + args.ambari_java_home
          + " or java binary file does not exist"
        )
        raise FatalException(1, err)

      print_warning_msg(
        "AMBARI_JAVA_HOME " + args.ambari_java_home + " must be valid on ALL hosts"
      )
      print_warning_msg(jcePolicyWarn)

      properties.process_pair(AMBARI_JAVA_HOME_PROPERTY, args.ambari_java_home)
      properties.removeOldProp(JDK_NAME_PROPERTY)
      properties.removeOldProp(JCE_NAME_PROPERTY)

      if not ambariOnly:
        properties.process_pair(STACK_JAVA_HOME_PROPERTY, args.ambari_java_home)
        properties.removeOldProp(STACK_JDK_NAME_PROPERTY)
        properties.removeOldProp(STACK_JCE_NAME_PROPERTY)

      self._ensure_java_home_env_var_is_set(args.ambari_java_home)
      self.jdk_index = self.custom_jdk_number
      print('Setting AMBARI_JAVA_HOME for Ambari finished')


    if args.java_home:
      # java_home was specified among the command-line arguments. Use it as custom JDK location.
      if not validate_jdk(args.java_home):
        err = (
          "Path to java home " + args.java_home + " or java binary file does not exists"
        )
        raise FatalException(1, err)

      print_warning_msg("JAVA_HOME " + args.java_home + " must be valid on ALL hosts")
      print_warning_msg(jcePolicyWarn)
      IS_CUSTOM_JDK = True

      properties.process_pair(JAVA_HOME_PROPERTY, args.java_home)
      properties.removeOldProp(JDK_NAME_PROPERTY)
      properties.removeOldProp(JCE_NAME_PROPERTY)

      if not ambariOnly:
        properties.process_pair(STACK_JAVA_HOME_PROPERTY, args.java_home)
        properties.removeOldProp(STACK_JDK_NAME_PROPERTY)
        properties.removeOldProp(STACK_JCE_NAME_PROPERTY)

      self._ensure_java_home_env_var_is_set(args.java_home)
      self.jdk_index = self.custom_jdk_number

      if (
        args.stack_java_home
      ):  # reset stack specific jdk properties if stack_java_home exists
        print("Setting JAVA_HOME for stack services...")
        print_warning_msg(
          "JAVA_HOME " + args.stack_java_home + " (Stack) must be valid on ALL hosts"
        )
        print_warning_msg(jcePolicyWarn)
        properties.process_pair(STACK_JAVA_HOME_PROPERTY, args.stack_java_home)
        properties.removeOldProp(STACK_JDK_NAME_PROPERTY)
        properties.removeOldProp(STACK_JCE_NAME_PROPERTY)

      return

    java_home_var = get_JAVA_HOME()
    if OS_FAMILY == OSConst.WINSRV_FAMILY:
      progress_func = None
    else:
      progress_func = download_progress

    if java_home_var:
      message = "Do you want to change Oracle JDK [y/n] (n)? "
      if ambariOnly:
        message = "Do you want to change Oracle JDK for Ambari Server [y/n] (n)? "
      change_jdk = get_YN_input(message, False)
      if not change_jdk:
        self._ensure_java_home_env_var_is_set(java_home_var)
        self.jdk_index = self.custom_jdk_number
        return

    # Continue with the normal setup, taking the first listed JDK version as the default option
    jdk_num = str(self.jdk_index + 1)
    (self.jdks, jdk_choice_prompt, jdk_valid_choices, self.custom_jdk_number) = (
      self._populate_jdk_configs(properties, jdk_num, ambariOnly)
    )

    jdk_num = get_validated_string_input(
      jdk_choice_prompt, jdk_num, jdk_valid_choices, "Invalid number.", False
    )

    self.jdk_index = int(jdk_num) - 1

    if self.jdk_index == self.custom_jdk_number:
      print_warning_msg(
        "JDK must be installed on all hosts and JAVA_HOME must be valid on all hosts."
      )
      print_warning_msg(jcePolicyWarn)

      if get_silent():
        print_error_msg("Path to JAVA_HOME should be specified via -j option.")
        sys.exit(1)

      args.java_home = get_validated_string_input(
        "Path to JAVA_HOME: ", None, None, None, False, False
      )
      if not os.path.exists(args.java_home) or not os.path.isfile(
        os.path.join(args.java_home, "bin", self.JAVA_BIN)
      ):
        err = "Java home path or java binary file is unavailable. Please put correct path to java home."
        raise FatalException(1, err)
      print("Validating JDK on Ambari Server...done.")

      properties.process_pair(JAVA_HOME_PROPERTY, args.java_home)
      properties.removeOldProp(JDK_NAME_PROPERTY)
      properties.removeOldProp(JCE_NAME_PROPERTY)

      if not ambariOnly:
        properties.process_pair(STACK_JAVA_HOME_PROPERTY, args.java_home)
        properties.removeOldProp(STACK_JDK_NAME_PROPERTY)
        properties.removeOldProp(STACK_JCE_NAME_PROPERTY)

      # Make sure any previously existing JDK and JCE name properties are removed. These will
      # confuse things in a Custom JDK scenario
      properties.removeProp(JDK_NAME_PROPERTY)
      properties.removeProp(JCE_NAME_PROPERTY)
      if not ambariOnly:
        properties.removeOldProp(STACK_JDK_NAME_PROPERTY)
        properties.removeOldProp(STACK_JCE_NAME_PROPERTY)

      self._ensure_java_home_env_var_is_set(args.java_home)
      return

    jdk_cfg = self.jdks[self.jdk_index]

    resources_dir = get_resources_location(properties)

    dest_file = os.path.abspath(os.path.join(str(resources_dir), jdk_cfg.dest_file))
    if os.path.exists(dest_file):
      print("JDK already exists, using " + dest_file)
    elif properties[JDK_DOWNLOAD_SUPPORTED_PROPERTY].upper() == "FALSE":
      print(
        "ERROR: Oracle JDK is not found in {1}. JDK download is not supported in this distribution. Please download Oracle JDK "
        "archive ({0}) manually from Oracle site, place it into {1} and re-run this script.".format(
          jdk_cfg.dest_file, dest_file
        )
      )
      print(
        f"NOTE: If you have already downloaded the file, please verify if the name is exactly same as {jdk_cfg.dest_file}."
      )
      print("Exiting...")
      sys.exit(1)
    else:
      ok = get_YN_input(
        "To download the Oracle JDK and the Java Cryptography Extension (JCE) "
        "Policy Files you must accept the "
        "license terms found at "
        "http://www.oracle.com/technetwork/java/javase/"
        "terms/license/index.html and not accepting will "
        "cancel the Ambari Server setup and you must install the JDK and JCE "
        "files manually.\nDo you accept the "
        "Oracle Binary Code License Agreement [y/n] (y)? ",
        True,
      )
      if not ok:
        print("Exiting...")
        sys.exit(1)

      jdk_url = jdk_cfg.url

      print("Downloading JDK from " + jdk_url + " to " + dest_file)
      self._download_jdk(jdk_url, dest_file, progress_func)

    try:
      (retcode, out, java_home_dir) = self._install_jdk(dest_file, jdk_cfg)
    except Exception as e:
      print(f"Installation of JDK has failed: {str(e)}\n")
      file_exists = os.path.isfile(dest_file)
      if file_exists:
        ok = get_YN_input(
          "JDK found at " + dest_file + ". "
          "Would you like to re-download the JDK [y/n] (y)? ",
          not get_silent(),
        )
        if not ok:
          err = (
            "Unable to install JDK. Please remove JDK file found at "
            + dest_file
            + " and re-run Ambari Server setup"
          )
          raise FatalException(1, err)
        else:
          jdk_url = jdk_cfg.url

          print("Re-downloading JDK from " + jdk_url + " to " + dest_file)
          self._download_jdk(jdk_url, dest_file, progress_func)
          print("Successfully re-downloaded JDK distribution to " + dest_file)

          try:
            (retcode, out) = self._install_jdk(dest_file, jdk_cfg)
          except Exception as e:
            print(f"Installation of JDK was failed: {str(e)}\n")
            err = (
              "Unable to install JDK. Please remove JDK, file found at "
              + dest_file
              + " and re-run Ambari Server setup"
            )
            raise FatalException(1, err)

      else:
        err = (
          "Unable to install JDK. File " + dest_file + " does not exist, "
          "please re-run Ambari Server setup"
        )
        raise FatalException(1, err)

    properties.process_pair(JDK_NAME_PROPERTY, jdk_cfg.dest_file)
    properties.process_pair(JAVA_HOME_PROPERTY, java_home_dir)
    if not ambariOnly:
      properties.process_pair(STACK_JDK_NAME_PROPERTY, jdk_cfg.dest_file)
      properties.process_pair(STACK_JAVA_HOME_PROPERTY, java_home_dir)

    self._ensure_java_home_env_var_is_set(java_home_dir)