def test_read_env_from_env_file(): assert "STUFF" not in os.environ with tempfile.NamedTemporaryFile(suffix=".env") as f: f.write(b"STUFF=todo") f.seek(0) merge_vars(var_files=[f.name]) assert os.environ["STUFF"] == "todo" os.environ.clear()
def test_merge_secret_vars_from_yaml_file(): with tempfile.NamedTemporaryFile(suffix=".yaml") as f: f.write(yaml.dump({"secrets": {"otherstuff": "tobedone"}}).encode("utf-8")) f.seek(0) assert merge_vars({"stuff": "todo"}, [f.name]) == ( {"stuff": "todo"}, {"otherstuff": "tobedone"}, )
def test_merge_config_vars_from_json_file(): with tempfile.NamedTemporaryFile(suffix=".json") as f: f.write( json.dumps({"configuration": {"otherstuff": "tobedone"}}).encode("utf-8") ) f.seek(0) assert merge_vars({"stuff": "todo"}, [f.name]) == ( {"stuff": "todo", "otherstuff": "tobedone"}, {}, )
def test_env_var_can_be_used_with_loading_dynamic_config(fixtures_dir: str): env_file = os.path.join(fixtures_dir, "env_vars_issue252.json") cfg_vars, _ = merge_vars(None, [env_file]) cfg = load_configuration( { "some_config_1": "hello", "some_config_2": "there" }, extra_vars=cfg_vars) dcfg = load_dynamic_configuration(cfg) assert dcfg["some_config_1"] == os.getcwd() assert dcfg["some_config_2"] is True
def test_merge_config_vars_from_yaml_file(): with tempfile.NamedTemporaryFile(suffix=".yaml") as f: f.write( yaml.dump({ "configuration": { "otherstuff": "tobedone" } }).encode('utf-8')) f.seek(0) assert merge_vars({"stuff": "todo"}, [f.name]) == ({ "stuff": "todo", "otherstuff": "tobedone" }, {})
def test_merge_secret_vars_from_json_file(): with tempfile.NamedTemporaryFile(suffix=".json") as f: f.write( json.dumps({ "secrets": { "otherstuff": "tobedone" } }).encode('utf-8')) f.seek(0) assert merge_vars({"stuff": "todo"}, [f.name]) == ({ "stuff": "todo" }, { "otherstuff": "tobedone" })
def run( ctx: click.Context, source: str, journal_path: str = "./journal.json", dry: Optional[str] = None, no_validation: bool = False, no_exit: bool = False, no_verify_tls: bool = False, rollback_strategy: str = "default", var: Dict[str, Any] = None, var_file: List[str] = None, hypothesis_strategy: str = "default", hypothesis_frequency: float = 1.0, fail_fast: bool = False, ) -> Journal: """Run the experiment loaded from SOURCE, either a local file or a HTTP resource. SOURCE can be formatted as JSON or YAML.""" settings = load_settings(ctx.obj["settings_path"]) or {} has_deviated = False has_failed = False experiment_vars = merge_vars(var, var_file) load_global_controls(settings) try: experiment = load_experiment(source, settings, verify_tls=not no_verify_tls) except InvalidSource as x: logger.error(str(x)) logger.debug(x) ctx.exit(1) notify(settings, RunFlowEvent.RunStarted, experiment) if not no_validation: try: ensure_experiment_is_valid(experiment) except ChaosException as x: logger.error(str(x)) logger.debug(x) ctx.exit(1) experiment["dry"] = Dry.from_string(dry) settings.setdefault("runtime", {}).setdefault("rollbacks", {}).setdefault( "strategy", rollback_strategy ) hypothesis_strategy = check_hypothesis_strategy_spelling(hypothesis_strategy) schedule = Schedule( continuous_hypothesis_frequency=hypothesis_frequency, fail_fast=fail_fast ) journal = run_experiment( experiment, settings=settings, strategy=hypothesis_strategy, schedule=schedule, experiment_vars=experiment_vars, ) has_deviated = journal.get("deviated", False) has_failed = journal["status"] != "completed" if "dry" in journal["experiment"]: journal["experiment"]["dry"] = dry with open(journal_path, "w") as r: json.dump(journal, r, indent=2, ensure_ascii=False, default=encoder) if journal["status"] == "completed": notify(settings, RunFlowEvent.RunCompleted, journal) elif has_failed: notify(settings, RunFlowEvent.RunFailed, journal) if has_deviated: notify(settings, RunFlowEvent.RunDeviated, journal) if (has_failed or has_deviated) and not no_exit: ctx.exit(1) return journal
def test_merge_vars_from_keys_only_for_configs(): assert merge_vars({"stuff": "todo"}) == ({"stuff": "todo"}, {})