<!--
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
-->

# OpenWhisk on Vagrant

The following instructions were tested on Mac OS X El Capitan, Ubuntu 16.04 LTS.

## Requirements
-   Install [VirtualBox](https://www.virtualbox.org/wiki/Downloads) (tested with version 6.0.2)
-   Install [Vagrant](https://www.vagrantup.com/downloads.html) (tested with version 2.2.3)

*There is an issue with the `ubuntu/xenial64` image (v20190118.0.0 at the time of writing this) on MacOS Mojave 10.14.2 and VirtualBox 6. This can be fixed by replacing this image with `bento/ubuntu-16.04`. See below the "Override Vagrant Box" section to find out how to use another image.*

## Setup

### Clone the repository and change directory to `tools/vagrant`

```
git clone --depth=1 https://github.com/apache/incubator-openwhisk.git openwhisk
cd openwhisk/tools/vagrant
```

### Create a Vagrant VM

#### Option A: Using the default local CouchDB container
**Important** We advise that you use this method for development of OpenWhisk.

```
# Configure with couchdb docker container running inside the VM
./hello
```
#### Option B - Using a remote Database

**Note:** Follow instructions [tools/db/README.md](../db/README.md) on how to
configure the remote DB for OpenWhisk.

##### Option B.1 - Setting a remote Cloudant DB
```
# Provide credentials for cloudant database with admin permissions
OW_DB=cloudant OW_DB_USERNAME=xxxxx OW_DB_PASSWORD=yyyyyy ./hello
```

##### Option B.2 - Setting a remote CouchDB

```
# Provide credentials for couchdb database with admin permissions
export OW_DB=couchdb
export OW_DB_USERNAME=<username>
export OW_DB_PASSWORD=<password>
export OW_DB_PROTOCOL=http
export OW_DB_HOST=<ip_address>
export OW_DB_PORT=5984 ./hello
```

**Note:**
Data will persist after [safe re-deploy](#safe-re-deploy-after-vm-restart),
but will be destroyed if you
initialize the DB. For more information on data store configurations see
[tools/db/README.md](../db/README.md).


### Wait for hello action output
```
wsk action invoke /whisk.system/utils/echo -p message hello --result
{
    "message": "hello"
}
```
**Tip:**
The very first build may take 30 minutes or more depending on network speed. If
there are any build failures, it might be due to network timeouts, to recover
follow the manual process to build and deploy in
[ansible/README.md](../../ansible/README.md)

**Tip:**
By default, each `docker` command will timeout after 840 seconds (14 minutes).
If you're on a really slow connection, this might be too short. You can modify
the timeout value in [docker.gradle](../../gradle/docker.gradle#L22).


### Using CLI from outside the VM
You can use the CLI from the host machine as well as from inside the virtual
machine. The IP address of the virtual machine accessible from outside is
`192.168.33.16`. If you start another Vagrant VM take into account that the IP
address will conflict, use `vagrant suspend` before starting another VM with the
same IP address.

The CLI is available in `../../bin`.
The CLI `../../bin/wsk` is for Linux amd64.
The CLI for all other operating systems and architectures (as well as Linux) can be
downloaded in a compressed format from [https://github.com/apache/incubator-openwhisk-cli/releases](https://github.com/apache/incubator-openwhisk-cli/releases) .
For more details, please consult the relevant [documentation](https://openwhisk.apache.org/documentation.html) section "Download and
install the wsk CLI from (Linux, Mac or Windows):".

When using the CLI with a local deployment of OpenWhisk (which provides an
insecure/self-signed SSL certificate), you must use the argument `-i` to permit
an insecure HTTPS connection to OpenWhisk. This should be used for development
purposes only.

Call the binary directly or setup your environment variable PATH to include the
location of the binary that corresponds to your environment.

From your _host_, configure `wsk` to use your Vagrant-hosted OpenWhisk
deployment and run the "echo" action again to test. The following commands
assume that you have `wsk` setup correctly in your PATH (and that you are using
Powershell if your deployment is hosted in Windows).
```
# Set your OpenWhisk Authorization Key.

wsk property set --apihost 192.168.33.16 --auth $(vagrant ssh -- cat openwhisk/ansible/files/auth.guest)

# Run the hello sample action
wsk -i action invoke /whisk.system/utils/echo -p message hello --result
{
    "message": "hello"
}
```

**Tip:**
You need to use the `-i` switch as the default SSL certificate used by the
Vagrant installation is self-signed. Alternatively, you can configure your
_apihost_ to use the non-SSL interface:

```
wsk property set --apihost http://192.168.33.16:10001 --auth $(vagrant ssh -- cat openwhisk/ansible/files/auth.guest)
```

You do not need to use the `-i` switch to `wsk` now. Note, however, that `wsk
sdk` will not work, so you need to pass use `wsk -i --apihost 192.168.33.16  sdk
{command}` in this case.


**Note:**
To connect to a different host API (i.e. openwhisk.example.com) with the CLI, you will
need to configure the CLI with new values for _apihost_, and _auth_ key.

### Use the wsk CLI inside the VM
For your convenience, a `wsk` wrapper is provided inside the VM which delegates
CLI commands to `$OPENWHISK_HOME/bin/linux/amd64/wsk` and adds the `-i`
parameter that is required for insecure access to the local OpenWhisk
deployment.

Calling the wsk CLI via `vagrant ssh` directly
```
vagrant ssh -- wsk action invoke /whisk.system/utils/echo -p message hello --result
```
Calling the wsk CLI by login into the Vagrant VM
```
vagrant ssh
wsk action invoke /whisk.system/utils/echo -p message hello --result
```

## Running OpenWhisk tests
```
vagrant ssh
cd ${OPENWHISK_HOME}
# run all tests
./gradlew tests:test
# or run a subset of tests using the --tests flag
./gradlew tests:test --tests system.basic.ConsoleTests
```

## Building OpenWhisk
Use Gradle to build docker images from inside the VM, this is done automatically
once at VM creation.

```
vagrant ssh
cd ${OPENWHISK_HOME}
./gradlew distDocker
```

## Using docker-runc
Only for experimental use:
To use docker-runc in the invoker, the version of docker-runc needs to match the version of docker engine on the host.
Get the version of the docker engine on the host like the following:
```
$ docker version | grep Version
Version:	18.03.0-ce
```
You need to use the same version for docker-runc in the Invoker, to use a newer version of docker-runc in the invoker, update the invoker Dockerfile.
1. compare the docker-runc version obtained on the local system against the docker-runc configured for the invoker
2. if the versions are different, only then do you need to update the invoker dockerfile to point to the matching docker download

Edit the [core/invoker/Dockefile](../../core/invoker/Dockefile)
Update the variable with the version
```
ENV DOCKER_VERSION 18.03.0-ce
```
Then update line with the curl download command like
```
RUN curl -sSL -o docker-${DOCKER_VERSION}.tgz https://download.docker.com/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz && \
```
Notice that the hostname where to download the CLI is different for newer versions.

Then update the Ansible configuration to enable the use of runc, edit [](../../ansible/environments/vagrant/group_vars/all)
```
invoker_use_runc: true
```

Then rebuild and redeploy the invoker component
```
wskdev invoker
```

### Teardown and Deploy
The following commands are helpful to deploy a fresh OpenWhisk and data store
```
vagrant ssh
cd ${ANSIBLE_HOME}
# teardown all containers
wskdev teardown
# deploy openwhisk containers
wskdev fresh
```
**Tip**
Do not restart the VM using Virtual Box tools, and always use `vagrant` from the
command line: `vagrant up` to start the VM and `vagrant reload` to restart it.
This allows the `$HOME/openwhisk` folder to be available inside the VM.

**Tip** If you have problems with data stores check that `ansible/db_local.ini` exists.

**Tip**
To initialize the data store from scratch run `ansible-playbook -i
environments/local initdb.yml` inside the VM as described in
[ansible setup](../../../ansible/README.md).

Once deployed, several Docker containers will be running in your virtual
machine. You can check that containers are running by using the docker cli with
the command `vagrant ssh -- docker ps`.

## Adding OpenWhisk users (Optional)

An OpenWhisk user, also known as a _subject_, requires a valid authorization
key. OpenWhisk is preconfigured with a guest key located in
`ansible/files/auth.guest`.

You may use this key if you like, or use [`wskadmin`](../admin) inside the VM to
create a new key.

```
vagrant ssh
wskadmin user create <subject>
```
For more information on `wskadmin` check the [documentation](../admin).

## SSL certificate configuration (Optional)

OpenWhisk includes a _self-signed_ SSL certificate and the `wsk` CLI allows
untrusted certificates via `-i` on the command line. The certificate is
generated during setup and stored in
`ansible/roles/nginx/files/openwhisk-cert.pem`.

Do not use these certificates in production: replace with your own and modify
the configuration to use trusted certificates instead.

## Misc commands
```
# Suspend Vagrant VM when done having fun
  vagrant suspend

# Resume Vagrant VM to have fun again
  vagrant up

# Do not restart via Virtual Box, use Vagrant reload to mount $HOME/openwhisk as a shared directory
  vagrant reload

# Read the help for wsk CLI
  vagrant ssh -- wsk -h
  vagrant ssh -- wsk <command> -h
```
**Tip**:
Don't use `vagrant resume`. See
[here](https://github.com/mitchellh/vagrant/issues/6787) for related issue.

## Override Vagrant Box
By default the Vagrant VM will use `ubuntu/xenial64` if you want to use `ubuntu/trusty64` you can override with an environment variable `BOX_OS`.
```
BOX_OS="ubuntu/trusty64" ./hello
```

## Using Vagrant VM in GUI mode (Optional)
Create VM with Desktop GUI. The `username` and `password` are both set to
`vagrant` by default.

```
  gui=true ./hello
  gui=true vagrant reload
```

**Tip**:
Ignore error message `Sub-process /usr/bin/dpkg returned an error code (1)` when
creating Vagrant VM using `gui-true`. Remember to use `gui=true` every time you
do `vagrant reload`. Or, you can enable the GUI directly by editing the Vagrant
file.

## Lean Setup
To have a lean setup (no Kafka, Zookeeper and no Invokers as separate entities)

Set environment variable LEAN to true before creating vagrant VM
```
export LEAN=true
```

