# Local environment setup

This script configures a full environment to simulate a Gerrit Multi-Site setup.
The environment is composed by:

- 2 gerrit instances deployed by default in /tmp
- 1 zookeeper node
- 1 Broker node (either kafka or kinesis)
- 1 HA-PROXY

## Requirements

- java
- docker and docker-compose
- wget
- envsubst
- haproxy
- aws-cli (only when broker_type is "kinesis")

## Examples

Simplest setup with all default values and cleanup previous deployment. This
will deploy kafka broker

```bash
sh setup_local_env/setup.sh --release-war-file /path/to/gerrit.war --multisite-lib-file /path/to/multi-site.jar
```

Deploy Kinesis broker

```bash
sh setup_local_env/setup.sh \
    --release-war-file /path/to/gerrit.war \
    --multisite-lib-file /path/to/multi-site.jar \
    --broker-type kinesis
```


Cleanup the previous deployments

```bash
sh setup_local_env/setup.sh --just-cleanup-env true
```

Help

```bash
Usage: sh ./setup.sh [--option ]

[--release-war-file]            Location to release.war file
[--multisite-lib-file]          Location to lib multi-site.jar file

[--new-deployment]              Cleans up previous gerrit deployment and re-installs it. default true
[--get-websession-plugin]       Download websession-broker plugin from CI lastSuccessfulBuild; default true
[--deployment-location]         Base location for the test deployment; default /tmp

[--gerrit-canonical-host]       The default host for Gerrit to be accessed through; default localhost
[--gerrit-canonical-port]       The default port for Gerrit to be accessed throug; default 8080

[--gerrit-ssh-advertised-port]  Gerrit Instance 1 sshd port; default 29418

[--gerrit1-httpd-port]          Gerrit Instance 1 http port; default 18080
[--gerrit1-sshd-port]           Gerrit Instance 1 sshd port; default 39418

[--gerrit2-httpd-port]          Gerrit Instance 2 http port; default 18081
[--gerrit2-sshd-port]           Gerrit Instance 2 sshd port; default 49418

[--replication-type]            Options [file,ssh]; default ssh
[--replication-ssh-user]        SSH user for the replication plugin; default $(whoami)
[--replication-delay]           Replication delay across the two instances in seconds

[--just-cleanup-env]            Cleans up previous deployment; default false

[--enabled-https]               Enabled https; default true

[--broker_type]                 events broker type; either 'kafka' or 'kinesis'. Default 'kafka'
```

## Limitations

- Assumes the ssh replication is done always on port 22 on both instances
- When cloning projects via ssh, public keys entries are added to `known_hosts`
  - Clean up the old entries when doing a new deployment, otherwise just use HTTP
