The integration testing proposal introduced new set of requirements which would require that the infrastructure be controlled at the code level in order to write the tests.
## Proposed Change
The following components shall be required
### Network driver `ND`
The network driver is module which would implement the basic infrastructure management operations which would then be used in test cases to simulate different scenarios.
The `Node` class shall have the following methods:
-`start()`: Start a node. This api will ensure that all components required for a fully functional node are up and running.
-`stop()`: Stop a given node.
-`reset()`: Reset the state of an existing node i.e. data stored in Tendermint and MongoDB will be purged. **NOTE**: It is only realistic to reset the nodes after all the tests have been executed rather than resetting the network after each test.
-`start_tendermint()`: Run Tendermint process on a given node.
-`stop_tendermint()`: Stop Tendermint process on a given node.
-`configure_tendermint()`: Alter Tendermint configuration on a given node.
-`reset_tendermint()`: Reset Tendermint i.e. `tendermint unsafe_reset_all`.
-`start_db()`: Start MongoDB daemon on a given node.
-`stop_db()`: Stop MongoDB daemon on a given node.
-`reset_db()`: Flush `Bigchain` collection from MongoDB.
-`configure_clock()`: The method should allow to change the clock on a given node. This could facilitate simulation of nodes located in different time zones.
-`configure_QoS()`: Configure different scenarios like network latency, packet loss etc. The underlying implementation could be facilitated via [tc](https://wiki.linuxfoundation.org/networking/netem).
A detailed list of testing scenarios can be found [here](https://github.com/bigchaindb/bigchaindb/blob/tendermint/proposals/integration-test-cases.md).
Kubernetes can be run locally using `minikube` but the default parameters used when running Kubernetes via `minikube` start a single-node Kubernetes cluster using a virtual machine which results in major resource consumption. This could be avoided by using command line flag, `minikube start --vm-driver=none`. For more details refer [here](https://github.com/kubernetes/minikube#linux-continuous-integration-with-vm-support).
The network driver would facilitate the design and implementation of components essential for integration testing. But this introduces Kubernetes as a dependency for tests which should be installed and configured before running tests on Travis CI (refer [here](https://blog.travis-ci.com/2017-10-26-running-kubernetes-on-travis-ci-with-minikube)).