def test_guess_java_home_on_debian(self): self.assertEqual( "/usr/lib/jvm/java-8-oracle", io.guess_java_home(major_version=8, runner=mock_debian)) self.assertEqual( "/usr/lib/jvm/java-7-openjdk-amd64", io.guess_java_home(major_version=7, runner=mock_debian))
def test_guess_java_home_on_mac_os_x(self): def runner(return_value): return lambda args, fallback=None: [return_value] java_home = io.guess_java_home(major_version=8, runner=runner("/Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home")) self.assertEqual("/Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home", java_home) java_home = io.guess_java_home(major_version=9, runner=runner("/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home")) self.assertEqual("/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home", java_home)
def test_guess_java_home_on_redhat(self, islink, isdir): def runner(args, fallback=None): return ["Unknown option --list"] if args[0] == "update-alternatives" else None islink.return_value = False isdir.return_value = True self.assertEqual("/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.91-5.b14.fc23.x86_64", io.guess_java_home(major_version=8, runner=runner, read_symlink=mock_red_hat)) # simulate not installed version self.assertIsNone(io.guess_java_home(major_version=7, runner=runner, read_symlink=mock_red_hat))
def test_guess_java_home_on_redhat(self, islink, isdir): islink.return_value = False isdir.return_value = True self.assertEqual( "/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.91-5.b14.fc23.x86_64", io.guess_java_home(major_version=8, runner=runner(None), read_symlink=mock_red_hat)) # simulate not installed version self.assertIsNone( io.guess_java_home(major_version=7, runner=runner(None), read_symlink=mock_red_hat))
def test_guess_java_home_on_mac_os_x(self): java_home = io.guess_java_home( major_version=8, runner=runner( "/Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home" )) self.assertEqual( "/Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home", java_home) java_home = io.guess_java_home( major_version=9, runner=runner( "/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home")) self.assertEqual( "/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home", java_home)
def create_config(self, config_file, advanced_config=False, assume_defaults=False, use_gradle_wrapper=False, java_home=None, runtime_java_home=None): """ Either creates a new configuration file or overwrites an existing one. Will ask the user for input on configurable properties and writes them to the configuration file in ~/.rally/rally.ini. :param config_file: :param advanced_config: Whether to ask for properties that are not necessary for everyday use (on a dev machine). Default: False. :param assume_defaults: If True, assume the user accepted all values for which defaults are provided. Mainly intended for automatic configuration in CI run. Default: False. :param use_gradle_wrapper: If True, use the Gradle wrapper, otherwise use the system's Gradle version. Default: False. """ self.prompter = Prompter(self.i, self.sec_i, self.o, assume_defaults) if advanced_config: self.o( "Running advanced configuration. You can get additional help at:" ) self.o("") self.o(" %s" % console.format.link("%sconfiguration.html" % DOC_LINK)) self.o("") else: self.o( "Running simple configuration. Run the advanced configuration with:" ) self.o("") self.o(" %s configure --advanced-config" % PROGRAM_NAME) self.o("") if config_file.present: self.o("\nWARNING: Will overwrite existing config file at [%s]\n" % config_file.location) logger.debug("Detected an existing configuration file at [%s]" % config_file.location) else: logger.debug( "Did not detect a configuration file at [%s]. Running initial configuration routine." % config_file.location) # Autodetect settings self.o("* Autodetecting available third-party software") git_path = io.guess_install_location("git") gradle_bin = "./gradlew" if use_gradle_wrapper else io.guess_install_location( "gradle") java_8_home = runtime_java_home if runtime_java_home else io.guess_java_home( major_version=8) java_9_home = java_home if java_home else io.guess_java_home( major_version=9) from esrally.utils import jvm if java_8_home: auto_detected_java_home = java_8_home # Don't auto-detect an EA release and bring trouble to the user later on. They can still configure it manually if they want to. elif java_9_home and not jvm.is_early_access_release(java_9_home): auto_detected_java_home = java_9_home else: auto_detected_java_home = None self.print_detection_result("git ", git_path) self.print_detection_result("gradle ", gradle_bin) self.print_detection_result( "JDK ", auto_detected_java_home, warn_if_missing=True, additional_message= "You cannot benchmark Elasticsearch on this machine without a JDK." ) self.o("") # users that don't have Gradle available cannot benchmark from sources benchmark_from_sources = gradle_bin if not benchmark_from_sources: self.o( "********************************************************************************" ) self.o( "You don't have the required software to benchmark Elasticsearch source builds." ) self.o("") self.o("You can still benchmark binary distributions with e.g.:") self.o("") self.o(" %s --distribution-version=6.0.0" % PROGRAM_NAME) self.o( "********************************************************************************" ) self.o("") root_dir = io.normalize_path( os.path.abspath(os.path.join(config_file.config_dir, "benchmarks"))) if advanced_config: root_dir = io.normalize_path( self._ask_property("Enter the benchmark data directory", default_value=root_dir)) else: self.o("* Setting up benchmark data directory in %s" % root_dir) if benchmark_from_sources: if not java_9_home or jvm.is_early_access_release(java_9_home): raw_java_9_home = self._ask_property( "Enter the JDK 9 root directory", check_path_exists=True, mandatory=False) if raw_java_9_home and jvm.major_version( raw_java_9_home ) == 9 and not jvm.is_early_access_release(raw_java_9_home): java_9_home = io.normalize_path( raw_java_9_home) if raw_java_9_home else None else: benchmark_from_sources = False self.o( "********************************************************************************" ) self.o( "You don't have a valid JDK 9 installation and cannot benchmark source builds." ) self.o("") self.o( "You can still benchmark binary distributions with e.g.:" ) self.o("") self.o(" %s --distribution-version=6.0.0" % PROGRAM_NAME) self.o( "********************************************************************************" ) self.o("") if benchmark_from_sources: # We try to autodetect an existing ES source directory guess = self._guess_es_src_dir() if guess: source_dir = guess logger.debug( "Autodetected Elasticsearch project directory at [%s]." % source_dir) else: default_src_dir = os.path.join(root_dir, "src", "elasticsearch") logger.debug( "Could not autodetect Elasticsearch project directory. Providing [%s] as default." % default_src_dir) source_dir = default_src_dir if advanced_config: source_dir = io.normalize_path( self._ask_property( "Enter your Elasticsearch project directory:", default_value=source_dir)) if not advanced_config: self.o("* Setting up benchmark source directory in %s" % source_dir) self.o("") # Not everybody might have SSH access. Play safe with the default. It may be slower but this will work for everybody. repo_url = "https://github.com/elastic/elasticsearch.git" if auto_detected_java_home: java_home = auto_detected_java_home local_benchmarks = True else: raw_java_home = self._ask_property( "Enter the JDK root directory (version 8 or later)", check_path_exists=True, mandatory=False) java_home = io.normalize_path( raw_java_home) if raw_java_home else None if not java_home: local_benchmarks = False self.o("") self.o( "********************************************************************************" ) self.o( "You don't have a JDK installed but Elasticsearch requires one to run. This means" ) self.o( "that you cannot benchmark Elasticsearch on this machine.") self.o("") self.o("You can still benchmark against remote machines e.g.:") self.o("") self.o( " %s --pipeline=benchmark-only --target-host=\"NODE_IP:9200\"" % PROGRAM_NAME) self.o("") self.o("See %s for further info." % console.format.link("%srecipes.html" % DOC_LINK)) self.o( "********************************************************************************" ) self.o("") else: local_benchmarks = True if advanced_config: data_store_choice = self._ask_property( "Where should metrics be kept?" "\n\n" "(1) In memory (simpler but less options for analysis)\n" "(2) Elasticsearch (requires a separate ES instance, keeps all raw samples for analysis)" "\n\n", default_value="1", choices=["1", "2"]) if data_store_choice == "1": env_name = "local" data_store_type = "in-memory" data_store_host, data_store_port, data_store_secure, data_store_user, data_store_password = "", "", "", "", "" else: data_store_type = "elasticsearch" data_store_host, data_store_port, data_store_secure, data_store_user, data_store_password = self._ask_data_store( ) env_name = self._ask_env_name() preserve_install = convert.to_bool( self._ask_property( "Do you want Rally to keep the Elasticsearch benchmark candidate " "installation including the index (will use several GB per trial run)?", default_value=False)) else: # Does not matter for an in-memory store env_name = "local" data_store_type = "in-memory" data_store_host, data_store_port, data_store_secure, data_store_user, data_store_password = "", "", "", "", "" preserve_install = False config = configparser.ConfigParser() config["meta"] = {} config["meta"]["config.version"] = str(Config.CURRENT_CONFIG_VERSION) config["system"] = {} config["system"]["env.name"] = env_name config["node"] = {} config["node"]["root.dir"] = root_dir if benchmark_from_sources: # user has provided the Elasticsearch directory but the root for Elasticsearch and related plugins will be one level above final_source_dir = io.normalize_path( os.path.abspath(os.path.join(source_dir, os.pardir))) config["node"]["src.root.dir"] = final_source_dir config["source"] = {} config["source"]["remote.repo.url"] = repo_url # the Elasticsearch directory is just the last path component (relative to the source root directory) config["source"]["elasticsearch.src.subdir"] = io.basename( source_dir) if gradle_bin: config["build"] = {} config["build"]["gradle.bin"] = gradle_bin config["runtime"] = {} if java_home: config["runtime"]["java.home"] = java_home if java_9_home: config["runtime"]["java9.home"] = java_9_home config["benchmarks"] = {} config["benchmarks"]["local.dataset.cache"] = "${node:root.dir}/data" config["reporting"] = {} config["reporting"]["datastore.type"] = data_store_type config["reporting"]["datastore.host"] = data_store_host config["reporting"]["datastore.port"] = data_store_port config["reporting"]["datastore.secure"] = data_store_secure config["reporting"]["datastore.user"] = data_store_user config["reporting"]["datastore.password"] = data_store_password config["tracks"] = {} config["tracks"][ "default.url"] = "https://github.com/elastic/rally-tracks" config["teams"] = {} config["teams"][ "default.url"] = "https://github.com/elastic/rally-teams" config["defaults"] = {} config["defaults"]["preserve_benchmark_candidate"] = str( preserve_install) config["distributions"] = {} config["distributions"]["release.1.url"] = "https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-" \ "{{VERSION}}.tar.gz" config["distributions"]["release.2.url"] = "https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/" \ "distribution/tar/elasticsearch/{{VERSION}}/elasticsearch-{{VERSION}}.tar.gz" config["distributions"][ "release.url"] = "https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-{{VERSION}}.tar.gz" config["distributions"]["release.cache"] = "true" config_file.store(config) self.o( "Configuration successfully written to %s. Happy benchmarking!" % config_file.location) self.o("") if local_benchmarks and benchmark_from_sources: self.o( "To benchmark Elasticsearch with the default benchmark, run:") self.o("") self.o(" %s" % PROGRAM_NAME) self.o("") elif local_benchmarks: self.o( "To benchmark Elasticsearch 6.0.0 with the default benchmark, run:" ) self.o("") self.o(" %s --distribution-version=6.0.0" % PROGRAM_NAME) self.o("") else: # we've already printed an info for the user. No need to repeat that. pass self.o("More info about Rally:") self.o("") self.o("* Type %s --help" % PROGRAM_NAME) self.o("* Read the documentation at %s" % console.format.link(DOC_LINK)) self.o("* Ask a question on the forum at %s" % console.format.link( "https://discuss.elastic.co/c/elasticsearch/rally"))
def migrate(config_file, current_version, target_version, out=print, i=input): prompter = Prompter(i=i, o=out, assume_defaults=False) logger.info("Upgrading configuration from version [%s] to [%s]." % (current_version, target_version)) # Something is really fishy. We don't want to downgrade the configuration. if current_version >= target_version: raise ConfigError( "The existing config file is available in a later version already. Expected version <= [%s] but found [%s]" % (target_version, current_version)) # but first a backup... config_file.backup() config = config_file.load(interpolation=None) if current_version == 0 and target_version > current_version: logger.info("Migrating config from version [0] to [1]") current_version = 1 config["meta"] = {} config["meta"]["config.version"] = str(current_version) # in version 1 we changed some directories from being absolute to being relative config["system"]["log.root.dir"] = "logs" config["provisioning"]["local.install.dir"] = "install" config["reporting"]["report.base.dir"] = "reports" if current_version == 1 and target_version > current_version: logger.info("Migrating config from version [1] to [2]") current_version = 2 config["meta"]["config.version"] = str(current_version) # no need to ask the user now if we are about to upgrade to version 4 config["reporting"]["datastore.type"] = "in-memory" config["reporting"]["datastore.host"] = "" config["reporting"]["datastore.port"] = "" config["reporting"]["datastore.secure"] = "" config["reporting"]["datastore.user"] = "" config["reporting"]["datastore.password"] = "" config["system"]["env.name"] = "local" if current_version == 2 and target_version > current_version: logger.info("Migrating config from version [2] to [3]") current_version = 3 config["meta"]["config.version"] = str(current_version) # Remove obsolete settings config["reporting"].pop("report.base.dir") config["reporting"].pop("output.html.report.filename") if current_version == 3 and target_version > current_version: root_dir = config["system"]["root.dir"] out(""" ***************************************************************************************** You have an old configuration of Rally. Rally has now a much simpler setup routine which will autodetect lots of settings for you and it also does not require you to setup a metrics store anymore. Rally will now migrate your configuration but if you don't need advanced features like a metrics store, then you should delete the configuration directory: rm -rf {0} and then rerun Rally's configuration routine: {1} configure Please also note you have {2:.1f} GB of data in your current benchmark directory at {3} You might want to clean up this directory also. For more details please see {4} ***************************************************************************************** Pausing for 10 seconds to let you consider this message. """.format( config_file.config_dir, PROGRAM_NAME, convert.bytes_to_gb(io.get_size(root_dir)), root_dir, console.format.link( "https://github.com/elastic/rally/blob/master/CHANGELOG.md#030" ))) time.sleep(10) logger.info("Migrating config from version [3] to [4]") current_version = 4 config["meta"]["config.version"] = str(current_version) if len(config["reporting"]["datastore.host"]) > 0: config["reporting"]["datastore.type"] = "elasticsearch" else: config["reporting"]["datastore.type"] = "in-memory" # Remove obsolete settings config["build"].pop("maven.bin") config["benchmarks"].pop("metrics.stats.disk.device") if current_version == 4 and target_version > current_version: config["tracks"] = {} config["tracks"][ "default.url"] = "https://github.com/elastic/rally-tracks" current_version = 5 config["meta"]["config.version"] = str(current_version) if current_version == 5 and target_version > current_version: config["defaults"] = {} config["defaults"]["preserve_benchmark_candidate"] = str(False) current_version = 6 config["meta"]["config.version"] = str(current_version) if current_version == 6 and target_version > current_version: # Remove obsolete settings config.pop("provisioning") config["system"].pop("log.root.dir") current_version = 7 config["meta"]["config.version"] = str(current_version) if current_version == 7 and target_version > current_version: # move [system][root.dir] to [node][root.dir] if "node" not in config: config["node"] = {} config["node"]["root.dir"] = config["system"].pop("root.dir") # also move all references! for section in config: for k, v in config[section].items(): config[section][k] = v.replace("${system:root.dir}", "${node:root.dir}") current_version = 8 config["meta"]["config.version"] = str(current_version) if current_version == 8 and target_version > current_version: config["teams"] = {} config["teams"][ "default.url"] = "https://github.com/elastic/rally-teams" current_version = 9 config["meta"]["config.version"] = str(current_version) if current_version == 9 and target_version > current_version: config["distributions"] = {} config["distributions"]["release.1.url"] = "https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-" \ "{{VERSION}}.tar.gz" config["distributions"]["release.2.url"] = "https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/" \ "distribution/tar/elasticsearch/{{VERSION}}/elasticsearch-{{VERSION}}.tar.gz" config["distributions"][ "release.url"] = "https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-{{VERSION}}.tar.gz" config["distributions"]["release.cache"] = "true" current_version = 10 config["meta"]["config.version"] = str(current_version) if current_version == 10 and target_version > current_version: config["runtime"]["java.home"] = config["runtime"].pop("java8.home") current_version = 11 config["meta"]["config.version"] = str(current_version) if current_version == 11 and target_version > current_version: # As this is a rather complex migration, we log more than usual to understand potential migration problems better. if "source" in config: if "local.src.dir" in config["source"]: previous_root = config["source"].pop("local.src.dir") logger.info("Set [source][local.src.dir] to [%s]." % previous_root) # if this directory was Rally's default location, then move it on the file system because to allow for checkouts of plugins # in the sibling directory. if previous_root == os.path.join(config["node"]["root.dir"], "src"): new_root_dir_all_sources = previous_root new_es_sub_dir = "elasticsearch" new_root = os.path.join(new_root_dir_all_sources, new_es_sub_dir) # only attempt to move if the directory exists. It may be possible that users never ran a source benchmark although they # have configured it. In that case the source directory will not yet exist. if io.exists(previous_root): logger.info( "Previous source directory was at Rally's default location [%s]. Moving to [%s]." % (previous_root, new_root)) try: # we need to do this in two steps as we need to move the sources to a subdirectory tmp_path = io.normalize_path( os.path.join(new_root_dir_all_sources, os.pardir, "tmp_src_mig")) os.rename(previous_root, tmp_path) io.ensure_dir(new_root) os.rename(tmp_path, new_root) except OSError: logger.exception( "Could not move source directory from [%s] to [%s]." % (previous_root, new_root)) # A warning is sufficient as Rally should just do a fresh checkout if moving did not work. console.warn( "Elasticsearch source directory could not be moved from [%s] to [%s]. Please check the logs." % (previous_root, new_root)) else: logger.info( "Source directory is configured at Rally's default location [%s] but does not exist yet." % previous_root) else: logger.info( "Previous source directory was the custom directory [%s]." % previous_root) new_root_dir_all_sources = io.normalize_path( os.path.join(previous_root, os.path.pardir)) # name of the elasticsearch project directory. new_es_sub_dir = io.basename(previous_root) logger.info("Setting [node][src.root.dir] to [%s]." % new_root_dir_all_sources) config["node"]["src.root.dir"] = new_root_dir_all_sources logger.info( "Setting [source][elasticsearch.src.subdir] to [%s]" % new_es_sub_dir) config["source"]["elasticsearch.src.subdir"] = new_es_sub_dir else: logger.info( "Key [local.src.dir] not found. Advancing without changes." ) else: logger.info( "No section named [source] found in config. Advancing without changes." ) current_version = 12 config["meta"]["config.version"] = str(current_version) if current_version == 12 and target_version > current_version: # the current configuration allows to benchmark from sources if "build" in config and "gradle.bin" in config["build"]: java_9_home = io.guess_java_home(major_version=9) from esrally.utils import jvm if java_9_home and not jvm.is_early_access_release(java_9_home): logger.debug("Autodetected a JDK 9 installation at [%s]" % java_9_home) if "runtime" not in config: config["runtime"] = {} config["runtime"]["java9.home"] = java_9_home else: logger.debug( "Could not autodetect a JDK 9 installation. Checking [java.home] already points to a JDK 9." ) detected = False if "runtime" in config: java_home = config["runtime"]["java.home"] if jvm.major_version( java_home ) == 9 and not jvm.is_early_access_release(java_home): config["runtime"]["java9.home"] = java_home detected = True if not detected: logger.debug( "Could not autodetect a JDK 9 installation. Asking user." ) raw_java_9_home = prompter.ask_property( "Enter the JDK 9 root directory", check_path_exists=True, mandatory=False) if raw_java_9_home and jvm.major_version( raw_java_9_home ) == 9 and not jvm.is_early_access_release( raw_java_9_home): java_9_home = io.normalize_path( raw_java_9_home) if raw_java_9_home else None config["runtime"]["java9.home"] = java_9_home else: out("********************************************************************************" ) out("You don't have a valid JDK 9 installation and cannot benchmark source builds." ) out("") out("You can still benchmark binary distributions with e.g.:" ) out("") out(" %s --distribution-version=6.0.0" % PROGRAM_NAME) out("********************************************************************************" ) out("") current_version = 13 config["meta"]["config.version"] = str(current_version) # all migrations done config_file.store(config) logger.info("Successfully self-upgraded configuration to version [%s]" % target_version)
def test_guess_java_home_on_redhat(self): self.assertEqual("/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.91-5.b14.fc23.x86_64", io.guess_java_home(major_version=8, runner=lambda args, fallback=None: None, read_symlink=mock_red_hat)) # simulate not installed version self.assertIsNone(io.guess_java_home(major_version=7, runner=lambda args, fallback=None: None, read_symlink=mock_red_hat))
def create_config(self, config_file, advanced_config=False, assume_defaults=False): """ Either creates a new configuration file or overwrites an existing one. Will ask the user for input on configurable properties and writes them to the configuration file in ~/.rally/rally.ini. :param config_file: :param advanced_config: Whether to ask for properties that are not necessary for everyday use (on a dev machine). Default: False. :param assume_defaults: If True, assume the user accepted all values for which defaults are provided. Mainly intended for automatic configuration in CI run. Default: False. """ self.assume_defaults = assume_defaults if advanced_config: self.o( "Running advanced configuration. You can get additional help at:" ) self.o("") self.o(" %s" % console.format.link("%sconfiguration.html" % DOC_LINK)) self.o("") logger.info("Running advanced configuration routine.") self.o("") else: self.o( "Running simple configuration. Run the advanced configuration with:" ) self.o("") self.o(" %s configure --advanced-config" % PROGRAM_NAME) self.o("") logger.info("Running simple configuration routine.") if config_file.present: self.o("\nWARNING: Will overwrite existing config file at [%s]\n" % config_file.location) logger.debug("Detected an existing configuration file at [%s]" % config_file.location) else: logger.debug( "Did not detect a configuration file at [%s]. Running initial configuration routine." % config_file.location) # Autodetect settings self.o("* Autodetecting available third-party software") git_path = io.guess_install_location("git") gradle_bin = io.guess_install_location("gradle") java_9_home = io.guess_java_home(major_version=9) from esrally.utils import jvm # Don't auto-detect an EA release and bring trouble to the user later on. They can still configure it manually if they want to. if java_9_home and not jvm.is_early_access_release(java_9_home): auto_detected_java_home = java_9_home else: auto_detected_java_home = io.guess_java_home(major_version=8) self.print_detection_result("git ", git_path) self.print_detection_result("gradle ", gradle_bin) self.print_detection_result( "JDK ", auto_detected_java_home, warn_if_missing=True, additional_message= "You cannot benchmark Elasticsearch without a JDK installation") self.o("") # users that don't have Gradle available cannot benchmark from sources benchmark_from_sources = gradle_bin if not benchmark_from_sources: self.o( "**********************************************************************************" ) self.o( "You don't have the necessary software to benchmark source builds of Elasticsearch." ) self.o("") self.o("You can still benchmark binary distributions with e.g.:") self.o("") self.o(" %s --distribution-version=5.0.0" % PROGRAM_NAME) self.o( "**********************************************************************************" ) self.o("") root_dir = "%s/benchmarks" % config_file.config_dir if advanced_config: root_dir = io.normalize_path( self._ask_property("Enter the benchmark data directory:", default_value=root_dir)) else: self.o( "* Setting up benchmark data directory in [%s] (needs several GB)." % root_dir) if benchmark_from_sources: # We try to autodetect an existing ES source directory guess = self._guess_es_src_dir() if guess: source_dir = guess self.o( "Autodetected Elasticsearch project directory at [%s]." % source_dir) logger.debug( "Autodetected Elasticsearch project directory at [%s]." % source_dir) else: default_src_dir = "%s/src" % root_dir logger.debug( "Could not autodetect Elasticsearch project directory. Providing [%s] as default." % default_src_dir) source_dir = io.normalize_path( self._ask_property( "Enter your Elasticsearch project directory:", default_value=default_src_dir)) # Not everybody might have SSH access. Play safe with the default. It may be slower but this will work for everybody. repo_url = "https://github.com/elastic/elasticsearch.git" if auto_detected_java_home: java_home = auto_detected_java_home else: self.o("") java_home = io.normalize_path( self._ask_property("Enter the JDK root directory:", check_path_exists=True)) if advanced_config: env_name = self._ask_env_name() data_store_type = "elasticsearch" data_store_host, data_store_port, data_store_secure, data_store_user, data_store_password = self._ask_data_store( ) preserve_install = convert.to_bool( self._ask_property( "Do you want Rally to keep the Elasticsearch benchmark candidate " "installation including the index (will use lots of disk space)?", default_value=False)) else: # Does not matter too much for an in-memory store env_name = "local" data_store_type = "in-memory" data_store_host, data_store_port, data_store_secure, data_store_user, data_store_password = "", "", "", "", "" preserve_install = False config = configparser.ConfigParser() config["meta"] = {} config["meta"]["config.version"] = str(Config.CURRENT_CONFIG_VERSION) config["system"] = {} config["system"]["env.name"] = env_name config["node"] = {} config["node"]["root.dir"] = root_dir if benchmark_from_sources: config["source"] = {} config["source"]["local.src.dir"] = source_dir config["source"]["remote.repo.url"] = repo_url config["build"] = {} config["build"]["gradle.bin"] = gradle_bin config["runtime"] = {} config["runtime"]["java.home"] = java_home config["benchmarks"] = {} config["benchmarks"]["local.dataset.cache"] = "${node:root.dir}/data" config["reporting"] = {} config["reporting"]["datastore.type"] = data_store_type config["reporting"]["datastore.host"] = data_store_host config["reporting"]["datastore.port"] = data_store_port config["reporting"]["datastore.secure"] = data_store_secure config["reporting"]["datastore.user"] = data_store_user config["reporting"]["datastore.password"] = data_store_password config["tracks"] = {} config["tracks"][ "default.url"] = "https://github.com/elastic/rally-tracks" config["teams"] = {} config["teams"][ "default.url"] = "https://github.com/elastic/rally-teams" config["defaults"] = {} config["defaults"]["preserve_benchmark_candidate"] = str( preserve_install) config["distributions"] = {} config["distributions"]["release.1.url"] = "https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-" \ "{{VERSION}}.tar.gz" config["distributions"]["release.2.url"] = "https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/" \ "distribution/tar/elasticsearch/{{VERSION}}/elasticsearch-{{VERSION}}.tar.gz" config["distributions"][ "release.url"] = "https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-{{VERSION}}.tar.gz" config["distributions"]["release.cache"] = "true" config_file.store(config) self.o( "Configuration successfully written to [%s]. Happy benchmarking!" % config_file.location) self.o("") if benchmark_from_sources: self.o( "To benchmark Elasticsearch with the default benchmark run:") self.o("") self.o(" %s" % PROGRAM_NAME) else: self.o( "To benchmark Elasticsearch 5.0.0 with the default benchmark run:" ) self.o("") self.o(" %s --distribution-version=5.0.0" % PROGRAM_NAME) self.o("") self.o("For help, type %s --help or see the user documentation at %s" % (PROGRAM_NAME, console.format.link(DOC_LINK)))
def test_guess_java_home_on_mac_os_x(self): java_home = io.guess_java_home(major_version=8, runner=lambda args, fallback=None: ["/Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home"]) self.assertEqual("/Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home", java_home)
def test_guess_java_home_on_debian(self): self.assertEqual("/usr/lib/jvm/java-8-oracle", io.guess_java_home(major_version=8, runner=mock_debian)) self.assertEqual("/usr/lib/jvm/java-7-openjdk-amd64", io.guess_java_home(major_version=7, runner=mock_debian))
def create_config(self, advanced_config=False): """ Either creates a new configuration file or overwrites an existing one. Will ask the user for input on configurable properties and writes them to the configuration file in ~/.rally/rally.ini. :param advanced_config: Whether to ask for properties that are not necessary for everyday use (on a dev machine). Default: False. """ if self.config_present(): print("\nWARNING: Will overwrite existing config file at [%s]\n" % self._config_file.location) else: print("Rally has not detected any configuration file at %s. It will ask a few questions about the environment.\n\n" % self._config_file.location) print("The benchmark root directory contains benchmark data, logs, etc. . It will consume several GB of free space depending on " "which benchmarks are executed (expect at least 10 GB).") benchmark_root_dir = self._ask_property("Enter the benchmark root directory (will be created automatically)") env_name = self._ask_env_name() only_binary = self._ask_property("Do you want to benchmark only official binary distributions of Elasticsearch? Note: If you " "answer with 'Yes' you will not need certain software (like Gradle or git) but you will not " "be able to benchmark the latest development versions from Elasticsearch unless you reconfigure " "Rally with esrally --configure again.", check_pattern=Config.BOOLEAN_PATTERN, default_value="No") if not (self._to_bool(only_binary)): default_src_dir = "%s/src" % benchmark_root_dir source_dir = self._ask_property("Enter the directory where sources are located (your Elasticsearch project directory)", default_value=default_src_dir) # Not everybody might have SSH access. Play safe with the default. It may be slower but this will work for everybody. repo_url = self._ask_property("Enter the Elasticsearch repo URL", default_value="https://github.com/elastic/elasticsearch.git") default_gradle_location = io.guess_install_location("gradle", fallback="/usr/local/bin/gradle") gradle_bin = self._ask_property("Enter the full path to the Gradle binary", default_value=default_gradle_location, check_path_exists=True) if advanced_config: default_mvn_location = io.guess_install_location("mvn", fallback="/usr/local/bin/mvn") maven_bin = self._ask_property("Enter the full path to the Maven 3 binary", default_value=default_mvn_location, check_path_exists=True) else: maven_bin = "" default_jdk_8 = io.guess_java_home(major_version=8, fallback="") jdk8_home = self._ask_property( "Enter the JDK 8 root directory (e.g. something like /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home on a Mac)", default_value=default_jdk_8, check_path_exists=True) if advanced_config: stats_disk_device = self._ask_property("Enter the HDD device name for stats (e.g. /dev/disk1)") else: stats_disk_device = "" data_store_host, data_store_port, data_store_secure, data_store_user, data_store_password = self._ask_data_store() config = configparser.ConfigParser() config["meta"] = {} config["meta"]["config.version"] = str(self.CURRENT_CONFIG_VERSION) config["system"] = {} config["system"]["root.dir"] = benchmark_root_dir config["system"]["log.root.dir"] = "logs" config["system"]["env.name"] = env_name if not (self._to_bool(only_binary)): config["source"] = {} config["source"]["local.src.dir"] = source_dir config["source"]["remote.repo.url"] = repo_url config["build"] = {} config["build"]["gradle.bin"] = gradle_bin config["build"]["maven.bin"] = maven_bin config["provisioning"] = {} config["provisioning"]["local.install.dir"] = "install" config["runtime"] = {} config["runtime"]["java8.home"] = jdk8_home config["benchmarks"] = {} config["benchmarks"]["local.dataset.cache"] = "${system:root.dir}/data" config["benchmarks"]["metrics.stats.disk.device"] = stats_disk_device config["reporting"] = {} config["reporting"]["datastore.host"] = data_store_host config["reporting"]["datastore.port"] = data_store_port config["reporting"]["datastore.secure"] = data_store_secure config["reporting"]["datastore.user"] = data_store_user config["reporting"]["datastore.password"] = data_store_password self._config_file.store(config) print("\nConfiguration successfully written to '%s'. Please rerun esrally now." % self._config_file.location)
def migrate(config_file, current_version, target_version, out=print, i=input): logger = logging.getLogger(__name__) if current_version < Config.EARLIEST_SUPPORTED_VERSION: raise ConfigError("The config file in {} is too old. Please delete it and reconfigure Rally from scratch with {} configure." .format(config_file.location, PROGRAM_NAME)) prompter = Prompter(i=i, o=out, assume_defaults=False) logger.info("Upgrading configuration from version [%s] to [%s].", current_version, target_version) # Something is really fishy. We don't want to downgrade the configuration. if current_version >= target_version: raise ConfigError("The existing config file is available in a later version already. Expected version <= [%s] but found [%s]" % (target_version, current_version)) # but first a backup... config_file.backup() config = config_file.load() if current_version == 12 and target_version > current_version: # the current configuration allows to benchmark from sources if "build" in config and "gradle.bin" in config["build"]: java_9_home = io.guess_java_home(major_version=9) from esrally.utils import jvm if java_9_home and not jvm.is_early_access_release(java_9_home): logger.debug("Autodetected a JDK 9 installation at [%s]", java_9_home) if "runtime" not in config: config["runtime"] = {} config["runtime"]["java9.home"] = java_9_home else: logger.debug("Could not autodetect a JDK 9 installation. Checking [java.home] already points to a JDK 9.") detected = False if "runtime" in config: java_home = config["runtime"]["java.home"] if jvm.major_version(java_home) == 9 and not jvm.is_early_access_release(java_home): config["runtime"]["java9.home"] = java_home detected = True if not detected: logger.debug("Could not autodetect a JDK 9 installation. Asking user.") raw_java_9_home = prompter.ask_property("Enter the JDK 9 root directory", check_path_exists=True, mandatory=False) if raw_java_9_home and jvm.major_version(raw_java_9_home) == 9 and not jvm.is_early_access_release(raw_java_9_home): java_9_home = io.normalize_path(raw_java_9_home) if raw_java_9_home else None config["runtime"]["java9.home"] = java_9_home else: out("********************************************************************************") out("You don't have a valid JDK 9 installation and cannot benchmark source builds.") out("") out("You can still benchmark binary distributions with e.g.:") out("") out(" %s --distribution-version=6.0.0" % PROGRAM_NAME) out("********************************************************************************") out("") current_version = 13 config["meta"]["config.version"] = str(current_version) if current_version == 13 and target_version > current_version: # This version replaced java9.home with java10.home if "build" in config and "gradle.bin" in config["build"]: java_10_home = io.guess_java_home(major_version=10) from esrally.utils import jvm if java_10_home and not jvm.is_early_access_release(java_10_home): logger.debug("Autodetected a JDK 10 installation at [%s]", java_10_home) if "runtime" not in config: config["runtime"] = {} config["runtime"]["java10.home"] = java_10_home else: logger.debug("Could not autodetect a JDK 10 installation. Checking [java.home] already points to a JDK 10.") detected = False if "runtime" in config: java_home = config["runtime"]["java.home"] if jvm.major_version(java_home) == 10 and not jvm.is_early_access_release(java_home): config["runtime"]["java10.home"] = java_home detected = True if not detected: logger.debug("Could not autodetect a JDK 10 installation. Asking user.") raw_java_10_home = prompter.ask_property("Enter the JDK 10 root directory", check_path_exists=True, mandatory=False) if raw_java_10_home and jvm.major_version(raw_java_10_home) == 10 and not jvm.is_early_access_release(raw_java_10_home): java_10_home = io.normalize_path(raw_java_10_home) if raw_java_10_home else None config["runtime"]["java10.home"] = java_10_home else: out("********************************************************************************") out("You don't have a valid JDK 10 installation and cannot benchmark source builds.") out("") out("You can still benchmark binary distributions with e.g.:") out("") out(" %s --distribution-version=6.0.0" % PROGRAM_NAME) out("********************************************************************************") out("") current_version = 14 config["meta"]["config.version"] = str(current_version) if current_version == 14 and target_version > current_version: # Be agnostic about build tools. Let use specify build commands for plugins and elasticsearch # but also use gradlew by default for Elasticsearch and Core plugin builds, if nothing else has been specified. def warn_if_plugin_build_task_is_in_use(config): if "source" not in config: return for k, v in config["source"].items(): plugin_match = re.match(r"^plugin\.([^.]+)\.build\.task$",k) if plugin_match != None and len(plugin_match.groups()) > 0 : plugin_name = plugin_match.group(1) new_key = "plugin.{}.build.command".format(plugin_name) out("\n" "WARNING:" " The build.task property for plugins has been obsoleted in favor of the full build.command." " You will need to edit the plugin [{}] section in {} and change from:" " [{} = {}] to [{} = <the full command>]." " Please refer to the documentation for more details:" " {}.\n".format(plugin_match.group(1), config_file.location, k, v, new_key, console.format.link(doc_link("elasticsearch_plugins.html#running-a-benchmark-with-plugins")))) if "build" in config: logger.info("Removing Gradle configuration as Rally now uses the Gradle Wrapper to build Elasticsearch.") config.pop("build", None) warn_if_plugin_build_task_is_in_use(config) current_version = 15 config["meta"]["config.version"] = str(current_version) if current_version == 15 and target_version > current_version: if "distributions" in config: # Remove obsolete settings config["distributions"].pop("release.1.url", None) config["distributions"].pop("release.2.url", None) config["distributions"].pop("release.url", None) current_version = 16 config["meta"]["config.version"] = str(current_version) if current_version == 16 and target_version > current_version: config.pop("runtime", None) if "benchmarks" in config and "local.dataset.cache" in config["benchmarks"]: if config["benchmarks"]["local.dataset.cache"] == "${node:root.dir}/data": root_dir = config["node"]["root.dir"] config["benchmarks"]["local.dataset.cache"] = os.path.join(root_dir, "data") current_version = 17 config["meta"]["config.version"] = str(current_version) # all migrations done config_file.store(config) logger.info("Successfully self-upgraded configuration to version [%s]", target_version)
def create_config(self, advanced_config=False): """ Either creates a new configuration file or overwrites an existing one. Will ask the user for input on configurable properties and writes them to the configuration file in ~/.rally/rally.ini. :param advanced_config: Whether to ask for properties that are not necessary for everyday use (on a dev machine). Default: False. """ if self.config_present(): print("\nWARNING: Will overwrite existing config file at [%s]\n" % self._config_file.location) else: print( "Rally has not detected any configuration file at %s. It will ask a few questions about the environment.\n\n" % self._config_file.location) print( "The benchmark root directory contains benchmark data, logs, etc. . It will consume several GB of free space depending on " "which benchmarks are executed (expect at least 10 GB).") benchmark_root_dir = self._ask_property( "Enter the benchmark root directory (will be created automatically)" ) env_name = self._ask_env_name() only_binary = self._ask_property( "Do you want to benchmark only official binary distributions of Elasticsearch? Note: If you " "answer with 'Yes' you will not need certain software (like Gradle or git) but you will not " "be able to benchmark the latest development versions from Elasticsearch unless you reconfigure " "Rally with esrally --configure again.", check_pattern=Config.BOOLEAN_PATTERN, default_value="No") if not (self._to_bool(only_binary)): default_src_dir = "%s/src" % benchmark_root_dir source_dir = self._ask_property( "Enter the directory where sources are located (your Elasticsearch project directory)", default_value=default_src_dir) # Not everybody might have SSH access. Play safe with the default. It may be slower but this will work for everybody. repo_url = self._ask_property( "Enter the Elasticsearch repo URL", default_value="https://github.com/elastic/elasticsearch.git") default_gradle_location = io.guess_install_location( "gradle", fallback="/usr/local/bin/gradle") gradle_bin = self._ask_property( "Enter the full path to the Gradle binary", default_value=default_gradle_location, check_path_exists=True) if advanced_config: default_mvn_location = io.guess_install_location( "mvn", fallback="/usr/local/bin/mvn") maven_bin = self._ask_property( "Enter the full path to the Maven 3 binary", default_value=default_mvn_location, check_path_exists=True) else: maven_bin = "" default_jdk_8 = io.guess_java_home(major_version=8, fallback="") jdk8_home = self._ask_property( "Enter the JDK 8 root directory (e.g. something like /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home on a Mac)", default_value=default_jdk_8, check_path_exists=True) if advanced_config: stats_disk_device = self._ask_property( "Enter the HDD device name for stats (e.g. /dev/disk1)") else: stats_disk_device = "" data_store_host, data_store_port, data_store_secure, data_store_user, data_store_password = self._ask_data_store( ) config = configparser.ConfigParser() config["meta"] = {} config["meta"]["config.version"] = str(self.CURRENT_CONFIG_VERSION) config["system"] = {} config["system"]["root.dir"] = benchmark_root_dir config["system"]["log.root.dir"] = "logs" config["system"]["env.name"] = env_name if not (self._to_bool(only_binary)): config["source"] = {} config["source"]["local.src.dir"] = source_dir config["source"]["remote.repo.url"] = repo_url config["build"] = {} config["build"]["gradle.bin"] = gradle_bin config["build"]["maven.bin"] = maven_bin config["provisioning"] = {} config["provisioning"]["local.install.dir"] = "install" config["runtime"] = {} config["runtime"]["java8.home"] = jdk8_home config["benchmarks"] = {} config["benchmarks"]["local.dataset.cache"] = "${system:root.dir}/data" config["benchmarks"]["metrics.stats.disk.device"] = stats_disk_device config["reporting"] = {} config["reporting"]["datastore.host"] = data_store_host config["reporting"]["datastore.port"] = data_store_port config["reporting"]["datastore.secure"] = data_store_secure config["reporting"]["datastore.user"] = data_store_user config["reporting"]["datastore.password"] = data_store_password self._config_file.store(config) print( "\nConfiguration successfully written to '%s'. Please rerun esrally now." % self._config_file.location)
def create_config(self, config_file, advanced_config=False): """ Either creates a new configuration file or overwrites an existing one. Will ask the user for input on configurable properties and writes them to the configuration file in ~/.rally/rally.ini. :param advanced_config: Whether to ask for properties that are not necessary for everyday use (on a dev machine). Default: False. """ if advanced_config: self.o( "Running advanced configuration. You can get additional help at:" ) self.o("") self.o(" %s" % format.link( "https://esrally.readthedocs.io/en/latest/configuration.html")) self.o("") logger.debug("Running advanced configuration routine.") self.o("") else: self.o( "Running simple configuration. You can run the advanced configuration with:" ) self.o("") self.o(" %s configure --advanced-config" % PROGRAM_NAME) self.o("") logger.debug("Running simple configuration routine.") if config_file.present: self.o("\nWARNING: Will overwrite existing config file at [%s]\n" % config_file.location) logger.debug("Detected an existing configuration file at [%s]" % config_file.location) else: logger.debug( "Did not detect a configuration file at [%s]. Running initial configuration routine." % config_file.location) # Autodetect settings self.o("[✓] Autodetecting available third-party software") git_path = io.guess_install_location("git") gradle_bin = io.guess_install_location("gradle") # default_jdk_7 = io.guess_java_home(major_version=7) default_jdk_8 = io.guess_java_home(major_version=8) self.print_detection_result("git ", git_path) self.print_detection_result("gradle ", gradle_bin) # self.print_detection_result("JDK 7 ", default_jdk_7, warn_if_missing=True, additional_message="Cannot benchmark Elasticsearch 2.x") self.print_detection_result( "JDK 8 ", default_jdk_8, warn_if_missing=True, additional_message= "You cannot benchmark Elasticsearch 5.x without a JDK 8 installation" ) # self.print_detection_result("JDK 9 ", default_jdk_9, warn_if_missing=True) self.o("") # users that don't have Gradle available cannot benchmark from sources benchmark_from_sources = gradle_bin if not benchmark_from_sources: self.o( "**********************************************************************************" ) self.o( "You don't have the necessary software to benchmark source builds of Elasticsearch." ) self.o("") self.o("You can still benchmark binary distributions with e.g.:") self.o("") self.o( " %s --pipeline=from-distribution --distribution-version=5.0.0-alpha2" % PROGRAM_NAME) self.o("") self.o("See %s" % format.link( "https://esrally.readthedocs.io/en/latest/pipelines.html#from-distribution" )) self.o( "**********************************************************************************" ) self.o("") root_dir = "%s/benchmarks" % config_file.config_dir self.o( "[✓] Setting up benchmark data directory in [%s] (needs several GB)." % root_dir) if benchmark_from_sources: # We try to autodetect an existing ES source directory guess = self._guess_es_src_dir() if guess: source_dir = guess self.o( "[✓] Autodetected Elasticsearch project directory at [%s]." % source_dir) logger.debug( "Autodetected Elasticsearch project directory at [%s]." % source_dir) else: default_src_dir = "%s/src" % root_dir logger.debug( "Could not autodetect Elasticsearch project directory. Providing [%s] as default." % default_src_dir) source_dir = io.normalize_path( self._ask_property( "Enter your Elasticsearch project directory:", default_value=default_src_dir)) # Not everybody might have SSH access. Play safe with the default. It may be slower but this will work for everybody. repo_url = "https://github.com/elastic/elasticsearch.git" if default_jdk_8: jdk8_home = default_jdk_8 else: self.o("") jdk8_home = io.normalize_path( self._ask_property("Enter the JDK 8 root directory:", check_path_exists=True)) if advanced_config: env_name = self._ask_env_name() data_store_type = "elasticsearch" data_store_host, data_store_port, data_store_secure, data_store_user, data_store_password = self._ask_data_store( ) preserve_install = convert.to_bool( self._ask_property( "Do you want Rally to keep the Elasticsearch benchmark candidate " "installation including all data (will use lots of disk space)", default_value=False)) else: # Does not matter too much for an in-memory store env_name = "local" data_store_type = "in-memory" data_store_host, data_store_port, data_store_secure, data_store_user, data_store_password = "", "", "", "", "" preserve_install = False config = configparser.ConfigParser() config["meta"] = {} config["meta"]["config.version"] = str(Config.CURRENT_CONFIG_VERSION) config["system"] = {} config["system"]["root.dir"] = root_dir config["system"]["log.root.dir"] = "logs" config["system"]["env.name"] = env_name if benchmark_from_sources: config["source"] = {} config["source"]["local.src.dir"] = source_dir config["source"]["remote.repo.url"] = repo_url config["build"] = {} config["build"]["gradle.bin"] = gradle_bin config["provisioning"] = {} config["provisioning"]["local.install.dir"] = "install" config["runtime"] = {} config["runtime"]["java8.home"] = jdk8_home config["benchmarks"] = {} config["benchmarks"]["local.dataset.cache"] = "${system:root.dir}/data" config["reporting"] = {} config["reporting"]["datastore.type"] = data_store_type config["reporting"]["datastore.host"] = data_store_host config["reporting"]["datastore.port"] = data_store_port config["reporting"]["datastore.secure"] = data_store_secure config["reporting"]["datastore.user"] = data_store_user config["reporting"]["datastore.password"] = data_store_password config["tracks"] = {} config["tracks"][ "default.url"] = "https://github.com/elastic/rally-tracks" config["defaults"] = {} config["defaults"]["preserve_benchmark_candidate"] = str( preserve_install) config_file.store(config) self.o( "[✓] Configuration successfully written to [%s]. Happy benchmarking!" % config_file.location) self.o("") if benchmark_from_sources: self.o( "To benchmark the currently checked out version of Elasticsearch with the default benchmark run:" ) self.o("") self.o(" %s" % PROGRAM_NAME) else: self.o( "To benchmark Elasticsearch 5.0.0-alpha2 with the default benchmark run:" ) self.o("") self.o( " %s --pipeline=from-distribution --distribution-version=5.0.0-alpha2" % PROGRAM_NAME) self.o() self.o("For help, type %s --help or see the user documentation at %s" % (PROGRAM_NAME, format.link("https://esrally.readthedocs.io")))
def create_config(self, config_file, advanced_config=False, assume_defaults=False): """ Either creates a new configuration file or overwrites an existing one. Will ask the user for input on configurable properties and writes them to the configuration file in ~/.rally/rally.ini. :param config_file: :param advanced_config: Whether to ask for properties that are not necessary for everyday use (on a dev machine). Default: False. :param assume_defaults: If True, assume the user accepted all values for which defaults are provided. Mainly intended for automatic configuration in CI run. Default: False. """ self.assume_defaults = assume_defaults if advanced_config: self.o("Running advanced configuration. You can get additional help at:") self.o("") self.o(" %s" % console.format.link("%sconfiguration.html" % DOC_LINK)) self.o("") logger.info("Running advanced configuration routine.") self.o("") else: self.o("Running simple configuration. Run the advanced configuration with:") self.o("") self.o(" %s configure --advanced-config" % PROGRAM_NAME) self.o("") logger.info("Running simple configuration routine.") if config_file.present: self.o("\nWARNING: Will overwrite existing config file at [%s]\n" % config_file.location) logger.debug("Detected an existing configuration file at [%s]" % config_file.location) else: logger.debug("Did not detect a configuration file at [%s]. Running initial configuration routine." % config_file.location) # Autodetect settings self.o("[✓] Autodetecting available third-party software") git_path = io.guess_install_location("git") gradle_bin = io.guess_install_location("gradle") # default_jdk_7 = io.guess_java_home(major_version=7) default_jdk_8 = io.guess_java_home(major_version=8) self.print_detection_result("git ", git_path) self.print_detection_result("gradle ", gradle_bin) self.print_detection_result("JDK 8 ", default_jdk_8, warn_if_missing=True, additional_message="You cannot benchmark Elasticsearch 5.x without a JDK 8 installation") # self.print_detection_result("JDK 9 ", default_jdk_9, warn_if_missing=True) self.o("") # users that don't have Gradle available cannot benchmark from sources benchmark_from_sources = gradle_bin if not benchmark_from_sources: self.o("**********************************************************************************") self.o("You don't have the necessary software to benchmark source builds of Elasticsearch.") self.o("") self.o("You can still benchmark binary distributions with e.g.:") self.o("") self.o(" %s --distribution-version=5.0.0" % PROGRAM_NAME) self.o("**********************************************************************************") self.o("") root_dir = "%s/benchmarks" % config_file.config_dir self.o("[✓] Setting up benchmark data directory in [%s] (needs several GB)." % root_dir) if benchmark_from_sources: # We try to autodetect an existing ES source directory guess = self._guess_es_src_dir() if guess: source_dir = guess self.o("[✓] Autodetected Elasticsearch project directory at [%s]." % source_dir) logger.debug("Autodetected Elasticsearch project directory at [%s]." % source_dir) else: default_src_dir = "%s/src" % root_dir logger.debug("Could not autodetect Elasticsearch project directory. Providing [%s] as default." % default_src_dir) source_dir = io.normalize_path(self._ask_property("Enter your Elasticsearch project directory:", default_value=default_src_dir)) # Not everybody might have SSH access. Play safe with the default. It may be slower but this will work for everybody. repo_url = "https://github.com/elastic/elasticsearch.git" if default_jdk_8: jdk8_home = default_jdk_8 else: self.o("") jdk8_home = io.normalize_path(self._ask_property("Enter the JDK 8 root directory:", check_path_exists=True)) if advanced_config: env_name = self._ask_env_name() data_store_type = "elasticsearch" data_store_host, data_store_port, data_store_secure, data_store_user, data_store_password = self._ask_data_store() preserve_install = convert.to_bool(self._ask_property("Do you want Rally to keep the Elasticsearch benchmark candidate " "installation including the index (will use lots of disk space)?", default_value=False)) else: # Does not matter too much for an in-memory store env_name = "local" data_store_type = "in-memory" data_store_host, data_store_port, data_store_secure, data_store_user, data_store_password = "", "", "", "", "" preserve_install = False config = configparser.ConfigParser() config["meta"] = {} config["meta"]["config.version"] = str(Config.CURRENT_CONFIG_VERSION) config["system"] = {} config["system"]["root.dir"] = root_dir config["system"]["log.root.dir"] = "logs" config["system"]["env.name"] = env_name if benchmark_from_sources: config["source"] = {} config["source"]["local.src.dir"] = source_dir config["source"]["remote.repo.url"] = repo_url config["build"] = {} config["build"]["gradle.bin"] = gradle_bin config["provisioning"] = {} config["provisioning"]["local.install.dir"] = "install" config["runtime"] = {} config["runtime"]["java8.home"] = jdk8_home config["benchmarks"] = {} config["benchmarks"]["local.dataset.cache"] = "${system:root.dir}/data" config["reporting"] = {} config["reporting"]["datastore.type"] = data_store_type config["reporting"]["datastore.host"] = data_store_host config["reporting"]["datastore.port"] = data_store_port config["reporting"]["datastore.secure"] = data_store_secure config["reporting"]["datastore.user"] = data_store_user config["reporting"]["datastore.password"] = data_store_password config["tracks"] = {} config["tracks"]["default.url"] = "https://github.com/elastic/rally-tracks" config["defaults"] = {} config["defaults"]["preserve_benchmark_candidate"] = str(preserve_install) config_file.store(config) self.o("[✓] Configuration successfully written to [%s]. Happy benchmarking!" % config_file.location) self.o("") if benchmark_from_sources: self.o("To benchmark Elasticsearch with the default benchmark run:") self.o("") self.o(" %s" % PROGRAM_NAME) else: self.o("To benchmark Elasticsearch 5.0.0 with the default benchmark run:") self.o("") self.o(" %s --distribution-version=5.0.0" % PROGRAM_NAME) self.o("") self.o("For help, type %s --help or see the user documentation at %s" % (PROGRAM_NAME, console.format.link(DOC_LINK)))