npm package: @lafferty-lounge/route-server
Description: A simple server for storing and reading http routes and their associated certificate information
Author: Craig Lafferty craigplafferty@gmail.com
Latest version: 0.5.0

# The route server

The lafferty lounge route server is used to manage route inside of a kubernetes cluster.
It also holds key/cert information for domains.

## Options

```bash
# flag            default                                     description
--data-dir        # /var/lib/lafferty-lounge/route-server     where the server should store its data
--token           #                                           the Bearer token to verify requests against
--port            # 8080                                      the port to listen on
```
## ENV

Prefix options with `LL_ROUTE_SERVER`.

```bash
LL_ROUTE_SERVER_DATA_DIR="/data/dir"
```

## Joi Schemas

```js
const routeSchema = joi.object({
  match: joi.string().required(),
  target: joi.string().required(),
  priority: joi.number().required(),
  protocols: joi.array().items(joi.string().required()).required(),
  description: joi.string().required()
});
const hostSchema = {
  description: joi.string().required(),
  match: joi.string().required(),
  priority: joi.number().required(),
  routes: joi.object().pattern(/.+/, routeSchema).required()
};
const tlsHostSchema = {
  description: joi.string().required(),
  key: joi.string(),
  cert: joi.string()
};
const tlsAuthSchema = {
  key: joi.string(),
  cert: joi.string()
};
```

## API

### `GET` /api/v1/hosts

```json
{
  "hosts": {
    "lafferty-lounge.com": {
      "match": "^lafferty-lounge.com",
      "description": "the lafferty lounge site",
      "priority": 1,
      "routes": {
        "apis": {
          "match": "^/api/v1/.*",
          "target": {
            "url": "http://lafferty-lounge-api-server-v1",
            "ca": "---BEGIN CERTIFICATE---",
            "protocols": ["https"]
          },
          "priority": 1,
          "description": "the lafferty lounge api server"
        }
      }
    }
  }
}
```

### `PUT` /api/v1/hosts

```js
joi.object().pattern(/.+/, hostSchema).required()
```

### `GET` /api/v1/hosts/:host

```json
{
  "match": "^lafferty-lounge.com",
  "description": "the lafferty lounge site",
  "priority": 1,
  "routes": {
    "apis": {
      "match": "^/api/v1/.*",
      "target": {
        "url": "http://lafferty-lounge-api-server-v1",
        "ca": "---BEGIN CERTIFICATE---",
        "protocols": ["https"]
      },
      "priority": 1,
      "description": "the lafferty lounge api server"
    }
  }
}
```

### `PUT` /api/v1/hosts/:host

```js
const hostSchema = {
  description: joi.string().required(),
  match: joi.string().required(),
  priority: joi.number().required(),
  routes: joi.object().pattern(/.+/, routeSchema).required()
}
```

### `GET` /api/v1/hosts/:host/routes

```json
{
  "apis": {
    "match": "^/api/v1/.*",
    "target": {
      "url": "http://lafferty-lounge-api-server-v1",
      "ca": "---BEGIN CERTIFICATE---",
      "protocols": ["https"]
    },
    "priority": 1,
    "description": "the lafferty lounge api server"
  }
}
```

### `PUT` /api/v1/hosts/:host/routes

```js
joi.object().pattern(/.+/, routeSchema).required()
```

### `GET` /api/v1/hosts/:host/routes/:route

```json
{
  "match": "^/api/v1/.*",
  "target": {
    "url": "http://lafferty-lounge-api-server-v1",
    "ca": "---BEGIN CERTIFICATE---",
    "protocols": ["https"]
  },
  "priority": 1,
  "description": "the lafferty lounge api server"
}
```

### `PUT` /api/v1/hosts/:host/routes/:route

```js
const routeSchema = joi.object({
  match: joi.string().required(),
  target: joi.string().required(),
  priority: joi.number().required(),
  protocols: joi.array().items(joi.string().required()).required(),
  description: joi.string().required()
});
```

### `GET` /api/v1/tls

```json
{
  "hosts": {
    "lafferty-lounge.com": {
      "description": "lafferty lounge main site",
      "cert": "[optional] ---BEGIN CERT---",
      "key": "[optional] ---BEGIN KEY---"
    }
  }
}
```

### `GET` /api/v1/tls/hosts

```json
{
  "lafferty-lounge.com": {
    "description": "lafferty lounge main site",
    "cert": "[optional] ---BEGIN CERT---",
    "key": "[optional] ---BEGIN KEY---"
  }
}
```

### `PUT` /api/v1/tls/hosts

```js
joi.object().pattern(/.+/, tlsHostSchema).required()
```

### `GET` /api/v1/tls/hosts/:host

```json
{
  "description": "lafferty lounge main site",
  "cert": "[optional] ---BEGIN CERT---",
  "key": "[optional] ---BEGIN KEY---"
}
```

### `PUT` /api/v1/tls/hosts/:host

```js
const tlsHostSchema = {
  description: joi.string().required(),
  key: joi.string(),
  cert: joi.string()
};
```

### `PUT` /api/v1/tls/hosts/:host/auth

```js
const tlsAuthSchema = {
  key: joi.string(),
  cert: joi.string()
};
```