Skip to content
Snippets Groups Projects
theodolite.py 4.56 KiB
Newer Older
#!/usr/bin/env python
from lib.cli_parser import benchmark_parser
import logging  # logging
from strategies.config import ExperimentConfig
import strategies.strategies.domain_restriction.lower_bound_strategy as lower_bound_strategy
import strategies.strategies.domain_restriction.no_lower_bound_strategy as no_lower_bound_strategy
import strategies.strategies.search.check_all_strategy as check_all_strategy
import strategies.strategies.search.linear_search_strategy as linear_search_strategy
import strategies.strategies.search.binary_search_strategy as binary_search_strategy
from strategies.experiment_execution import ExperimentExecutor
import strategies.subexperiment_execution.subexperiment_executor as subexperiment_executor
import strategies.subexperiment_evaluation.subexperiment_evaluator as subexperiment_evaluator
def load_variables():
    """Load the CLI variables given at the command line"""
    print('Load CLI variables')
    parser = benchmark_parser("Run theodolite benchmarking")
    args = parser.parse_args()
    print(args)
    if args.uc is None or args.loads is None or args.instances_list is None:
        print('The options --uc, --loads and --instances are mandatory.')
        print('Some might not be set!')
        sys.exit(1)
def main(uc, loads, instances_list, partitions, cpu_limit, memory_limit,
         commit_ms, duration, domain_restriction, search_strategy,
         prometheus_base_url, reset, namespace, result_path):
    print(f"Domain restriction of search space activated: {domain_restriction}")
    print(f"Chosen search strategy: {search_strategy}")
    counter_path = f"{result_path}/exp_counter.txt"

    if os.path.exists(counter_path):
        with open(counter_path, mode="r") as read_stream:
            exp_id = int(read_stream.read())
        # Create the directory if not exists
        os.makedirs(result_path, exist_ok=True)
    # Store metadata
    separator = ","
    lines = [
            f"UC={uc}\n",
            f"DIM_VALUES={separator.join(map(str, loads))}\n",
            f"REPLICAS={separator.join(map(str, instances_list))}\n",
            f"PARTITIONS={partitions}\n",
            f"CPU_LIMIT={cpu_limit}\n",
            f"MEMORY_LIMIT={memory_limit}\n",
            f"KAFKA_STREAMS_COMMIT_INTERVAL_MS={commit_ms}\n",
            f"EXECUTION_MINUTES={duration}\n",
            f"DOMAIN_RESTRICTION={domain_restriction}\n",
            f"SEARCH_STRATEGY={search_strategy}"
            ]
    with open(f"{result_path}/exp{exp_id}_uc{uc}_meta.txt", "w") as stream:
    with open(counter_path, mode="w") as write_stream:
        write_stream.write(str(exp_id + 1))

    domain_restriction_strategy = None
    search_strategy = None

    # Select domain restriction
    if domain_restriction:
        # domain restriction
        domain_restriction_strategy = lower_bound_strategy
    else:
        # no domain restriction
        domain_restriction_strategy = no_lower_bound_strategy

    # select search strategy
    if search_strategy == "linear-search":
        print(f"Going to execute at most {len(loads)+len(instances_list)-1} subexperiments in total..")
        search_strategy = linear_search_strategy
    elif search_strategy == "binary-search":
        search_strategy = binary_search_strategy
        print(f"Going to execute {len(loads)*len(instances_list)} subexperiments in total..")
        search_strategy = check_all_strategy

    experiment_config = ExperimentConfig(
        use_case=uc,
        exp_id=exp_id,
        dim_values=loads,
        replicass=instances_list,
        partitions=partitions,
        cpu_limit=cpu_limit,
        memory_limit=memory_limit,
        kafka_streams_commit_interval_ms=commit_ms,
        execution_minutes=duration,
        prometheus_base_url=prometheus_base_url,
        reset=reset,
        namespace=namespace,
        result_path=result_path,
        domain_restriction_strategy=domain_restriction_strategy,
        search_strategy=search_strategy,
        subexperiment_executor=subexperiment_executor,
        subexperiment_evaluator=subexperiment_evaluator)

    executor = ExperimentExecutor(experiment_config)
    executor.execute()

if __name__ == '__main__':
    logging.basicConfig(level=logging.INFO)
    args = load_variables()
    main(args.uc, args.loads, args.instances_list, args.partitions, args.cpu_limit,
         args.memory_limit, args.commit_ms, args.duration,
         args.domain_restriction, args.search_strategy, args.prometheus,