1.44.0 - 2024-08-25
### Fixed
- We have to iterate over all existing distributions in the current environment to hopefully locate the package name of the distribution we are discovering
- Bump dependencies
1.43.2 - 2024-05-07
- Remove
Z
suffix when datetime is timezone aware in discovery payload
1.43.1 - 2024-05-07
- We cannot change all extensions signatures for discovering capabilities so we remove arguments after the collection. Less efficient but more transparent
- Switched from
utcnow()
tonow(timezone.utc)
asutcnow
has been deprecated
1.43.0 - 2024-05-07
- Switching to
importlib.metadata
builtin function to reverse lookup the package name (import name) from the distribution name during discovery. This should be more reliable - Switched log level to debug during discovery to keep output less noisy
- Allow to ignore arguments during discovery for a lighter output
- Update dependencies
1.42.1 - 2024-03-11
- Tolerate
colorama
down to 0.4.4 to satisfy awscli
1.42.0 - 2024-02-20
- Moved to PDM aways from setuptools as a more modern and robust approach to manage dependencies
- Moved to ruff away from flake8 for linter
- Switched to a Pypi trusted publisher
- Upgraded pdm and checkout actions to clean out nodejs deprecation warnings
- Removed
logzero
dependency - Dropped Python 3.7 support as it has been EOL since June 2023
- Read version from scm and package via
importlib_metadata
- Fixed loading of multiple controls from a global control file.
1.41.0 - 2023-11-16
- Interrupting a blocking rollback led to not having any rollbacks being available to the journal. Now all rollbacks up to the one that gets interrupted (inclusive) should be un the journal
1.40.0 - 2023-10-28
-
When working with
jsonpath
tolerances and substitutions like${myvalue}
chaostoolkit
now gives the user an error message with all substituted values when theexpect
block does not match the output of theprobe
. -
Tolerance field can now be substitued with variables even when the tolerance remains a native type. So this is now supported:
{ "configuration": { "expected": 3 }, "steady-state-hypothesis": { "title": "", "probes": [ { "name": "check-stuff", "type": "probe", "tolerance": "${expected}", "provider": { "type": "python", "module": "statistics", "func": "mean", "arguments": { "data": [1, 3, 4, 4] } } } ] } }
1.39.0 - 2023-09-12
- Dropped
chardet
andcchardet
(optionals dependencies) in favour to the faster and friendly-licenced charset-normalizer which will be installed by default - Removed
simplejson
support entirely as this library doesn't seem to be much updated anymore. Sticking with stdlibjson
and maybe one day we'll byte the bullet and migrate toorjson
- Fix different behaviors in checking status from steady-state in Python 3.7
1.38.0 - 2023-08-02
- The http activity provider can now substitute its
timeout
field so it can be read from the configuration - The
expect
field of ajsonpath
tolerance can now be substituted with configuration values 267 - Substitution of list of lists now returns a list of lists instead of flattening
1.37.0 - 2023-07-14
- A new
"skip"
strategy to explicitely dismiss the hypothesis entirely - A log message when an activity is in dry mode
- Bump dependencies
1.36.3 - 2023-07-13
-
When trying to substitute a single value in an argument but that value isn't actually a variable, but instead a string to pass as-is to the function of the activity, we failed with a
KeyError
because we were looking into the configuration/secrets for a key that was not meant to be there. Now, we properly handle this case and leave the string as it should be. This case may easily happen forprocess
activities where you make a reference to an environment variable when the process is executed. For instance:"provider": { "type": "process", "path": "cat", "arguments": "$MY_FILE" },
Here
"$MY_FILE"
is not a pattern for chaos toolkit to replace with a value, it's a literal string to be passed to thecat
command.
1.36.2 - 2023-07-11
- Allow for missing environment variable when
default
property is set, even to aNone
value
1.36.1 - 2023-07-10
- Converting using JSON is a bypass when value is an empty string or
None
1.36.0 - 2023-06-29
-
When declaring an environment variable in a configuration block, you can ask Chaos Toolkit to convert the value read (which is always a string) into an appropriate type: int, float, str, bytes, bool and json
{ "my_var": { "type": "env", "key": "SOME_VAR", "env_var_type": "int" } }
1.35.1 - 2023-06-19
- When a var file has no extension, it couldn't be properly parsed because we searched for an empty string into a string sequence, and that was truthey #263
1.35.0 - 2023-06-13
- Set the status of the experiment to
completed
when we deviated but tolerances did not fail. Only set the status tofailed
if one of the tolerance actually failed to execute. #258 - The order of applying controls. Before, global controls were applied after experiment controls. This has been changed so global controls get applied first. This was never specified so let me know if you get errors.
1.34.1 - 2023-03-04
- Removed restriction on the
importlib-metadata
package
1.34.0 - 2023-03-04
- Use builtin
importlib-metadata
package for Python 3.8+
1.33.1 - 2023-01-29
- Position log correctly in the load_global_controls function
1.33.0 - 2023-01-27
- Support for extra control files loaded as global controls. A control file contains an object where the keys are control names and their values are control definitions
1.32.1 - 2023-01-25
- Switched from a queue to a simple list for tracking method runs internally as the list is thread-safe for insertions anyway
1.32.0 - 2023-01-25
- Internal refactoring so that, when a termination signal is received, the journal still contains the trace of runs that whappened so far. This is essential or we were losing information. As this is internal only, this should not have any side effect but, if you see strange behaviors from your runs, please ping us.
1.31.0 - 2023-01-20
- New
start_activity
andactivity_completed
callbackx in the handler registry to wrap the activities when they run. - Stop logging from the default handler callbacks
1.30.0 - 2023-01-14
- A new
running
callback in the handler registry as thestarted
callback happens too soon in the control lifecycle.
1.29.0 - 2022-09-28
- A new
CHAOSTOOLKIT_LOADER_AUTH_BEARER_TOKEN
environment variable used when loading an experiment from http with an authorization bearer token. It takes precedence over the same information in the settings file if it is defined there too.
1.28.0 - 2022-06-15
- When env variables are provided, first take their values before loading the configuration. This allows to have different scenarios stored outside the experiment itself. #252
- Allow to substitute
pauses
values with configuration or secret values
1.27.3 - 2022-03-31
- Ensure experiment level controls are only played once
1.27.2 - 2022-03-23
- Ensure experiment level controls are applied to activity level controls when activity declares a control too #251
1.27.1 - 2022-02-25
- Ensure dynamic configuration can reference itself #250
1.27.0 - 2022-02-17
chaoslib.canonical_json
that returns a fairly canoniocal view of the experimentchaoslib.experiment_hash
which builds a hash of the experiment's canonical json view- When no steady-state hypothesis strategy was provided, we use the default one
1.26.0 - 2022-02-16
- Pass the event registry to the
configure_control
control if requested throughevent_registry
argument. This allows to add your own event handler to the main registry. Mostly for quite advanced cases only.
1.25.0 - 2022-01-05
- Requires Python 3.7 as a baseline as Python 3.6 is now EOL
- Added Python 3.10 support
1.24.0 - 2021-12-20
configuration.py
now have the ability to have load a dynamic configurations. The dynamic config is a regular activity (probe) in the configuration section. If there's a use-case for setting a configuration dynamically right before the experiment is starting. It executes the probe, and then the return value of this probe will be the config you wish to set.
1.23.1 - 2021-12-02
-
Configuration now supports providing a type to convert environment variables to a provided type. Addressing this issue
To specifically convert an environment variable loaded into configuration to a type, provide the
env_var_type
key in the same block as the "env" declaration. Supported values are:str, int, float, bytes
.
1.23.0 - 2021-11-05
notifications.py
now uses PayloadEncoder to serialisedatetime
objects andException
objects for when usingnotify_with_http
.
- Updated
tests/test_notification.py
to provide more explicit coverage ofnotify
,notify_via_plugin
, andnotify_with_http
- Pinned version of importlib-metadata for Python < 3.8 was too strict. Relaxed a bit.
- Added
callee
,freezegun
, andresponses
asdev
requirements to make testingnotification.py
easier - Added
chaoslib.PayloadEncoder
to correctly encode objects when serialising them to JSON, currently supporting:- date/datetimes
- UUIDs
- Decimals
- Exceptions
1.22.1 - 2021-10-04
- Only display
dry
flag value when new flagDry
was provided. Prevents breaking environments where the cli was not updated yet
1.22.0 - 2021-10-04
- Switched from pycodestyle/pylama to
black
,flake8
,isort
- Update CI builds to build, lint, and test
- Allow nesting of secrets
- Secrets loaded from a vault can be overridden by variables
- In secrets testcases, change the os.environ to be a patch, not an assignment within the testcase.
- Add
.github/workflows/close_stale_issues.yaml
to mark issues asStale
after 365 days of inactivity and to close them after 7 days of being markedStale
. - Run
pyupgrade --py36-plus
across whole project - Updated
.github/workflows/release.yaml
to check that bothCHANGELOG.md
andchaoslib/__init__.py
get updated in line with a new version - Updated
Makefile
to specifypython3
instead ofpython
-
Added
.github/workflows/check_pr.yaml
which checks if a PR has modified the CHANGELOG.md and if it changed/added tests -
Added dry run options:
--dry=activities
runs all activities as dry run. (same as the old flag)--dry=actions
runs all actions as dry run.--dry=probes
runs all probes as dry run.--dry=pause
runs all activities with no pausing.
1.21.0 - 2021-08-23
-
In
run.py
, changed method names containingcontinous
tocontinuous
-
In
run.py
, changed variablecontinous_hypo_event
tocontinuous_hypo_event
-
In
run.py
, changedStrategy.CONTINOUS
toStrategy.CONTINUOUS
-
In
types.py
, changedStrategy.CONTINOUS
toStrategy.CONTINUOUS
(BREAKING COMPATABILITY) -
In
types.py
, changed expectedvalue
fromcontinously
tocontinuously
-
In
types.py
, changed expected paramater fromcontinous_hypothesis_frequency
tocontinuous_hypothesis_frequency
-
In
test_run.py
, changed method names containingcontinous
tocontinuous
and method names containingimmediatly
toimmediately
-
In
test_run.py
, changed parametercontinous_hypothesis_frequency
tocontinuous_hypothesis_frequency
and variable strategy fromStrategy.CONTINOUS
toStrategy.CONTINUOUS
-
In
test_run.py
, changed method names containingcontinous
tocontinuous
-
In
run_handlers.py
, changed method names containingcontinous
tocontinuous
-
Changed other minor typos
1.20.0 - 2021-08-17
- Added a new control function, called
validate_control
that takes a control declaration and allows the control implementation to validate itself. This is useful when you want to ensure your control is well-formed before starting to run the experiment. The control validates itself. It's an optional control hook, like others. See #7 for context.
- Fix activity name in the logs shown when the Python provider links to an unknown function #223
- Remove the problematic log line from exit.py
While using the safeguards addon, when some safeguard probe fails, sometimes it doesn't stop the experiment and instead continues to run. In some cases it gets completely stuck.
Problem is that the chaostoolkit uses Signals in order to interrupt threads. Sometimes the interrupt exception gets caught by that logger and it just swallows it. Therefore the experiment continues to run. #210
1.19.0 - 2021-02-16
- Library now requires Python 3.6 #208
1.18.3 - 2021-02-16
- Fix typo in
setup.cfg
frominstall_require
toinstall_requires
1.18.2 - 2021-02-16
- Fix release workflow by updating to latest setuptools
1.18.1 - 2021-02-16
- Fix release package
1.18.0 - 2021-02-16
1.17.0 - 2021-02-15
- Activities can be requested not to be executed on a per activity basis, not just as all or none. This can be used by a control to dynamically make a decision on what to run.
- Test that demonstrate how to wrap controls into decorators #197
- Moved from TravisCI to GitHub Workflows #201
1.16.0 - 2020-12-02
-
Allow substitution to keep its original type when done in isolation. #180 #195. So let's assume we have the following configuration:
"configuration": { "value": 8 }
We can now use it as an argument of an action:
"provider": { "arguments": { "quantity": "${value}" } }
Now, the
quantity
argument will indeed be an integer, when it was converted to string until now. This works with any support Python objects, whether they are scalars or nested.If, you have something like this however
"provider": { "arguments": { "quantity": "I want ${value} apples" } }
This will always remain a string.
1.15.1 - 2020-11-02
- Fixed a regression where the extra vars were not passed onto configuration and secrets for overriding substitution #192
1.15.0 - 2020-09-11
- Raise the
chaoslib.exceptions.InterruptExecution
onSIGTERM
- New exception
chaoslib.exceptions.ExperimentExitedException
that can only be injected into blocking background activities when we received the SIGUSR2 signal - We now inject
chaoslib.exceptions.ExperimentExitedException
into blocking background activities when we received the SIGUSR2 signal. This is relying on https://docs.python.org/3/c-api/init.html#c.PyThreadState_SetAsyncExc There is much we can to interrupt blocking calls and the limit is now reached because we have no control over any call that is out of the Python VM (just callingtime.sleep()
will get you in that situation). This is a constraint we have to live in and this extension authors must keep this in mind when they create their blocking calls. #185
1.14.1 - 2020-09-10
- SIGTERM signal is now listened for. This triggers the interruption mechanism of the experiment.
1.14.0 - 2020-09-09
-
Add two functions to programmatically exit the experiment as soon as feasible by the Python VM #185:
chaoslib.exit.exit_gracefully
: terminates but abides to the rollback strategychaoslib.exit.exit_ungracefully
: terminates but bypasses rollbacks entirely and does not wait for background actions/probes still running This should mostly be useful to have a harsh way to interrupt an execution and is therefore an advanced concept with undesirable side effects (though Chaos Toolkit tries to do as right as it can).
CAVEAT: Only works on Unix/Linux systems implementing SIGUSR1/SIGUSR2 signals
- Fix chaostoolkit#192 to make sure a failing hypothesis prevents the method to be executed.
1.13.1 - 2020-09-07
- Ensure the method is always executed, even when no steady-state was provided in the experiment.
1.13.0 - 2020-09-07
- Steady-state hypothesos runtime strategies can be now set to determine if the the hypothesis is executed before/after the method as usual (default behavior) or continuously throughout the method too. You can also make it applied before or after only, or even only during the method. #191
- Always pass all secrets to control hookpoints #187
- Massive refactor of the
run_experiment
function so that it raises now events of where it is during the execution so that external plugins to the Chaos Toolkit can react and impact the run. This goes beyond mere controls and is advanced usage. Still, this is a public interface. #178 In theory, this is an internal change only and therun_experiment
function has not changed its API. However, this may have deep impact if you already depended on its internals.
1.12.0 - 2020-08-17
- Added ways to override configuration and secrets from var files or passed to the chaostoolkit cli chaostoolkit#175.
- Always ensure the status in the journal is one of
the specified value, with a default to
"completed"
.
1.11.1 - 2020-07-29
- Controls can now update/change configuration and secrets on the fly as per the specification #181
1.11.0 - 2020-07-06
-
Added runtime strategies for rollback as per chaostoolkit#176. Until now, they were never played an activity would fail during the hypothesis or if the execution was interrupted from a control. With the strategies, you can now decide that they are always applied, never or only when the experiment deviated. This is a flag passed to the settings as follows:
runtime: rollbacks: strategy: "always|never|default|deviated"
The
"default"
strategy remains backward compatible.
1.10.0 - 2020-06-19
- Added function to lookup a value in the settings from a dotted path key chaostoolkit#65
1.9.0 - 2020-04-29
- Only apply rollbacks if experiment has progressed past the initial steady state hypothesis #168
- Allow to not verify certificates when connecting to a HTTPS endpoint using #163 self-signed certificate.
- Refactored run of the experiment so that we can have multiple run strategies such as not running the steady-state hypothesis before or after the method but also one strategy so that the steady-state is continuously applied during the method, with the option to bail the experiment as soon as it deviates. #149
- Potentially breaking. The following functions have moved from
chaoslib.experiment
tochaoslib.run
:initialize_run_journal
,apply_activities
,apply_rollbacks
.
- Fix error on empty string variables call #165
1.8.1 - 2020-02-20
- Build and test on Python 3.8
- Fix importlib_metadata call #162
1.8.0 - 2020-02-20
- Optional default value for environment variable in configuration
- Warn the user for an action process returning a non-zero exit code
- Support for process path relative to homedir ~
- Indicate path in validation when path is not found nor executable #159
- Changed the method's one-step minimum requirement. An experiment with an empty method (without any activities) is now valid.
1.7.1 - 2019-09-27
- Catch
InterruptExecution
during rollbacks so that the experiment terminates gracefully #132. The remaining rollbacks are not applied. - Catch
SIGINT
andSystemExit
during rollbacks so that the experiment terminates gracefully #133. The remaining rollbacks are not applied.
1.7.0 - 2019-09-21
- Fix to ensure a dry run ignores pauses
- Allow substitution from configuration and secrets into regex and jsonpath tolerances
1.6.0 - 2019-09-03
- Two new control hook points before and after the experiment loading. These hooks allow a control to perform certain operations before the experiment is actually applied.
- Experiments can be loaded from HTTP server which returns them using a
text/plain
content-type #130. This allows notably to run directly experiments hosted on GitHub.
- Add the
max_retries
parameter to the HTTP provider - Changed nested tolerance Python probes to return
True
to the experiment in case the nested probe returns an object orTrue
, and to returnFalse
in case ofNone
orFalse
. Before,True
was returned every time except in case of anActivityFailed
exception. [#128][128]. - Global Python controls are now imported from a specific function called
load_global_controls(settings: Settings)
. The reason from loading them separately is so that we can have them declared, and registered, as soon as we can. Before, they were loaded when the experiments started to be executed. Now, we can also run controls when we read the experiment itself, which wasn't possible before. - Read package version by readsing
__version__
from thechaoslib/__init__.py
file directly without importing it, to avoid dependency issues of uninstalled third-party packages.
1.5.0 - 2019-07-01
- Fix
expect
validation when the value is a scalar rather than a sequence. - Controls inheritance was getting too greedy because we were extending the same list over and over again.
- Prevent control initializations' failure to bubble up
- Pass arguments to control initialization function when declared
- Interrupt nicely the experiment from control at the activity level
1.4.0 - 2019-05-16
-
[POTENTIALLY BREAKING] Changed the JSONPath implementation from
jsonpath-ng
tojsonpath2
as the former does not fully, or correctly, implement the JSON Path specification. The latter is based on the ANTLR grammar and implements filters appropriately. The breaking aspect is due to the fact that your path may not work anylonger as they may be rejected by the new implementation which is more correct. #119.Please install
jsonpath2
:$ pip install jsonpath2
1.3.1 - 2019-05-10
- Fix to pass control's state when probe fails during hypothesis #118
1.3.0 - 2019-05-04
-
Fix to ensure a control's
configuration
parameter is populated when it the control is beingconfigured
#114 -
Load and apply global controls, those declared in the settings, from the
run_experiment
function rather than out of band #116This means that global controls will not be applied before the experiment is validated but only when it's executed.
It also means the global controls will be provided with the experiment, its configuration and secrets in case global controls must access these.
1.2.0 - 2019-04-17
- Create settings directory when it doesn't already exist #97
- Pass configuration to tolerance checks so that probe tolerance can access it #98
- Fix using a probe as a tolerance validator #98
- Make settings globally available during the run #99
- Load controls from settings too now #99
- Do not build on MacOSX platform #110
- Run stable Python 3.7 build
1.1.2 - 2019-03-22
- Use a YAML safe loader for settings #92
1.1.1 - 2019-03-22
- Fix a failure when no top-level controls were provided but an activity control was declared #88
- Warn when control Python package is not installed but do not fail experiment during validation #90. Controls should remain optional.
1.1.0 - 2019-03-11
-
a new tolerance type called
range
to support scenarios such as:value type is:
{ "status": 200, "headers": {"content-type": "text/plain"}, "body": "1234.8" }
tolerance is as follows:
{ "type": "range", "range": [1000.0, 2000.0] } }
lower and upper bounds may be integers or floats.
1.0.0 - 2019-02-21
- Delint to clean things up before 1.0
- Do not pin too strictly or this causes havoc when updating chaoslib
1.0.0rc3 - 2019-01-29
- Fix differences of API between Vault KV secret v1 and v2 #80
- Catch Vault AppRole client error #81
- Support now Service Account Vault authentication to access Vault secrets #82
1.0.0rc2 - 2019-01-28
-
Ensure Python control can be found #63
-
Ensure activity is looked up before control is applied #64
-
Ensure controls are applied only once before/after #65
-
Declare the name property in the catch block of the python control validator #66
-
Use
ImportError
exception instead ofModuleNotFoundError
which is not declared in Python 3.5 #67 -
Disallow empty JSON path #68
-
Pass the experiment to each control when requested via the
experiment
parameter of the Python function #69 -
Specify the Vault KV secret default version to be used via the
"vault_kv_version"
configuration property, defaulting to v2 -
Support now AppRole Vault authentication to access Vault secrets thanks to @AlexShemeshWix #74
-
[BREAKING] Vault secrets are now accessed via the
path
property #77 instead of thekey
property as before. A warning message will be displayed.{ "k8s": { "mykey": { "type": "vault", "path": "foo/bar" } } }
In that case, you get the whole secrets payload from Vault set to the
mykey
property. If you want a specific value from that payload, specify its key as follows:{ "k8s": { "mykey": { "type": "vault", "path": "foo/bar", "key": "mypassword" } } }
-
Switch to
yaml.safe_load()
vs the unsafeyaml.load()
to load YAML experiments #78
1.0.0rc1 - 2018-11-30
- Let's get ready to roll 1.0.0
- Pinned dependency versions
0.22.2 - 2018-11-30
- Remove
NoReturn
import as it is not available prior Python 3.6.5 #90
0.22.1 - 2018-11-29
- Bug fix release for missing exporting the chaoslib/control package
- Exposing readme as markdown in https://pypi.org/
0.22.0 - 2018-11-29
-
listing installed Chaos Toolkit extensions #64
-
log (at DEBUG level) which Python file holds an activity or control provider function #59
-
add controls to provide entry points into the execution flow to perform out of band tasks such as tracing, monitoring or run's control #84 Simply add a block such as:
"controls": [ { "name": "tracing", "provider": { "type": "python", "module": "chaostracing.control" } } ]
At the experiment, steady-state and/or activity level. This would apply the
tracing
control before and after the element it is enclosed in.By default, a control defined at the experiment level will be applied before and after, if you want to limit to one or the other, use the
scope
property:"controls": [ { "name": "tracing", "scope": "after", "provider": { "type": "python", "module": "chaostracing.control" } } ]
By default, a control defined at the experiment level will be applied at all sub-levels. You can change that behavior like this:
"controls": [ { "name": "tracing", "automatic": false, "provider": { "type": "python", "module": "chaostracing.control" } } ]
0.21.0 - 2018-09-19
- add codecov integration
- add a new
"deviated"
flag to the journal to signal when the experiment ran fully but the steady state deviated after the experimental method was executed - add a new
RunFlowEvent.RunDeviated
declaration which can be used to signal when the experiment deviated. This can be sent in addition to the other events. This would allow subscribers to be notified when an experiment failed because the system deviated, while not being notified for any other failures that aborted the experiment run altogether [#56][56] - attempt to detect the encoding of the stdout/stderr streams of the process
activities. This is only the case when either the chardet or cchardet
packages are installed. When decoding does fail, raise an
ActivityFailed
exception
- wording of the messages when the experiment deviated [#56][56]
0.20.1 - 2018-08-24
- Pass an
Accept: application/json, application/x+yaml
header when fetching the experiment over HTTP
0.20.0 - 2018-08-09
- renamed
FailedActivity
to a more active style:ActivityFailed
#17
-
support for the
extensions
block. A sequence of extension objects which are free to contain any piece of data they need. Their only mandatory property is aname
#60 -
support for loading experiments from a remote endpoint using the HTTP protocol is now supported #53. Note that we do not perform any validation that the endpoint is safe, it's up to the user to be careful here (for instance by downloading the experiment using curl and reviewing it). We also do not tolerate self-signed endpoints for now.
-
added an
auths
entry to the settings file so that it can be used when loading from a remote endpoint that requires credentials. For now, the credentials should be manually added but this may be addressed when #65 is tackled, below is an example of such an entry:auths: mydomain.com: type: basic value: XYZ otherdomain.com: type: bearer value: UIY localhost:8081: type: digest value: UIY
- jsonpath tolerance can now take an ̀
expect
property to compare the returned results with a given value (which is not really well supported in jsonpath when not dealing with arrays) - Ability to save settings as well as load them.
- Display a warning to the user when a HTTP call (using the HTTP provider) returned a status code above 399. This makes it easier to track, during the experimental method or rollbacks, when the endpoint responded something we may not expected. During the steady state hypothesis checks, this warning is not displayed as this may be expected #46
- when the probe of the steady state hypothesis fails with a
FailedActivity
exception, we now say that the steady state hypothesis was not met. Before, it would simply bail the whole experiment very sadly
0.17.0 - 2018-04-27
- Experiments can now be loaded from YAML as well #54
0.16.0 - 2018-04-13
-
HTTP provider can pass request body as JSON when
"Content-Type: application/json"
is passed in theheaders
object of the provider -
Process provider can also take its arguments as a string now so you can pass the command line arguments as-is. This is needed because some commands do not respect POSIX and this fails with Python subprocess
-
Output a dict from process probes, with keys 'status', 'stdout' and 'stderr'. This is a first step to better tolerance checks on process probes. #21
-
Tolerance is richer now as well. If you provide a dictionary, it won't be considered only as a new probe to run. Instead, it will look for the
type
key. It's a follow-up of #21:- if type is
"probe"
, then it is considered a new probe to run as usual, and the status of the probe makes the status of the tolerance. - if type is
"regex"
, then apattern
key must also be present with a valid Python regex. If atarget
key is also present, it must indicate where to find the content to search for in the tested value. If the tested value comes from a process probe, thetarget
key must be either"stdout"
or"stderr"
. If it is a HTTP probe, thetarget
key must be"body"
. In all other cases, the tested value is checked as-is. - if type is
"jsonpath"
, then apath
key must also be present with a valid JSON Path. If atarget
key is also present, it must indicate where to find the content to search for in the tested value. If the tested value comes from a process probe, thetarget
key must be either"stdout"
or"stderr"
. If it is a HTTP probe, thetarget
key must be"body"
. In all other cases, the tested value is checked as-is. Note that, when the tested value is a string (no matter where read from), we try to parse it as a JSON payload first. Finally, you can provide a ̀count
key as well, there are exactly that number of matches.
- if type is
0.15.1 - 2018-03-09
- Log a message when loading the configuration
- Raise
InvalidExperiment
when a configuration or secret references a key in the environment and that key does not exist (it may not be set however) #40. This bails the experiment at validation time so before it runs.
0.15.0 - 2018-02-20
- Process activities can now take their arguments as a list rather than a dictionary. The rationale is that command line arguments sometimes need ordering and dictionaries only provided ordering (as in insertion ordering) only since Python 3.6. Assuming older versions of Python will eventually get it backported is not reasonable. Therefore, a list is more appropriate now and a warning message will be displayed when your experiment uses the dictionary approach. Notice that HTTP and Python activities will remain mapping only. #34
- Added module to warn about deprecated features.
- Added settings for the user-supplied configurations #35
- Added event support #33
0.14.0 - 2018-02-06
- Do not fail the discovery when an extension is missing the
__all__
attribute #28 - Include extension activity arguments type when discovering extension #19
0.13.1 - 2018-01-30
- Steady state is optional, so don't expect it here
0.13.0 - 2018-01-28
- HTTP provider must be able to connect to self-signed HTTPS endpoint #25
- Steady state is now added to the generated json report
0.12.2 - 2018-01-24
- missing hvac dependency should not break chaos with an exception #23
0.12.1 - 2018-01-20
- yaml is not required in this package
0.12.0 - 2018-01-20
- Various dependencies cleanups
- Added the DCO notice for contributors
0.11.0 - 2018-01-17
- Steady state hypothesis is not mandatory when exploring #18
0.10.0 - 2018-01-16
- New discovery of extension capabilities #16
- Pinning ply dependency version to 3.4 to avoid random install failures #8
0.9.4 - 2018-01-10
- Proper merge of secrets from the different supported loaders
0.9.3 - 2018-01-09
- Do not forget to load inlined secrets
0.9.2 - 2018-01-05
- HTTP probe header dict must be serialiable back to JSON
0.9.1 - 2018-01-05
- HTTP activity will not check status code any longer #10
- Process activity will not check return code any longer #10
0.9.0 - 2018-01-05
- Steady state is now run after the method as well #19
- Allow tolerance to be based on the HTTP status code of the probe #20
- Logging when an activity runs in the background
- Pause after we capture the end time of an activity
- HTTP Probe now returns a dict with status code, headers and body of the response
0.8.2 - 2017-12-18
- Missing transitive dependency "ply"
0.8.1 - 2017-12-18
- Packaging up the dev requirements for install from the tarball
0.8.0 - 2017-12-17
### Added
- Substitution from configuration and secrets so values can be dynamically set
- The journal contains now a global status of the run
- Pausing activity message is logged before the activity running message for better clarity
- Arguments are now substituted with their configuration and secrets values before being applied
0.7.0 - 2017-12-12
- Configuration schema support
- Lots of logging added at the DEBUG level
- [EXPERIMENTAL] Loading secrets from HashiCorp vault
- [BREAKING] Secrets from environment variable now respects the API and do not get detected by parsing the secret's value
- Better handling of the steady hypothesis not matching its expectations Now the experiment terminates cleanly
0.6.0 - 2017-12-06
- [BREAKING]: The specification has changed in a non-compatible way. We are
working towards a 1.0.0 version of the specification as the initial draft was
merely to set the stage. The
method
has been simplified and there are no moresteady
andclose
probes, only probes. We also now define a steady state hypothesis that would fail the experiment should it not meet its expected state. Finally, we define arollbacks
entry so that experiments can revert changes they made
- Experiment captures now SIGINT and system exit signals and swallows them so the journal is returned and can be inspected
- Activities can be cached and referenced from within experiment
0.5.1 - 2017-11-23
- Do not shadow functions
- Log full errors on debug level
- Always pause even if activity failed
0.5.0 - 2017-11-19
- Split the inner of
run_experiment
into various functions for better composability - Pause before/after activity
0.4.0 - 2017-10-18
- Better logging
0.3.0 - 2017-10-18
- An
expected_status
for HTTP probe to consider HTTP errors as expected in some cases
0.2.0 - 2017-10-10
- A first draft to loading secrets from environment
- Passing those secrets as a mapping to actions and probes expecting them
- Added support for background activities
- Dry mode support
### Removed
- Unused layer module
0.1.1 - 2017-10-06
- Package up extra files when installed from source
0.1.0 - 2017-10-06
- Initial release