xokdinst 0.8.1

Wrapper for openshift-install
xokdinst
---

Wraps [openshift-installer](https://github.com/openshift/installer/) with a
few added features.

Installation
---

You'll need `cargo`; you can get it from `yum -y install cargo` or [rustup](https://rustup.rs/).
Operating under the theory that you're a developer/tester/etc of OpenShift
itself, we'll clone this git repository so you can help contribute a bit more
easily to the wrapper, then install from that clone:

```
$ git clone https://github.com/cgwalters/xokdinst
$ cd xokdinst
$ cargo install --path .
```

Quick start
---

Launch a cluster named `mycluster` (you may be more creative with names):

```
$ xokdinst launch mycluster
<fill out installer fields>
```

For more commands, just run `xokdinst --help`.

Features/differences over openshift-installer
---

The primary feature is that `xokdinst` by default has an opinionated place
to store configuration, in platform-specific "appdirs" as defined by
the Rust [directories crate](https://crates.io/crates/directories) - e.g. on Linux/Unix
this is `~/.config/xokdinst`.

This builds on the upstream installer support for [multiple invocations](https://github.com/openshift/installer/blob/3d904d3364e68251cc067782344b72b626e65573/docs/user/overview.md#multiple-invocations).
We're always using the `--dir` option of the upstream installer and naming that
directory after the cluster name. This makes it more convenient to manage
multiple clusters.

Auto-injection of pull secrets
---

If you omit the `pullSecret` from your install-config, `xokdinst` will [automatically inject `~/.docker/config.json`](https://github.com/cgwalters/xokdinst/commit/8c2308d4bf0b02cd38f20323d551d4c5bcc0b40f).

Nicer flow for injecting manifests
---

It's [easier to inject manifests](https://github.com/cgwalters/xokdinst/commit/0bef3d726af5fa76fbc19f35735757494808ee43).

Platform configuration inheritance
---

`xokdinst` also has the concept of a "default config" for a given platform.
And if you only have used one platform, it becomes the default config.
When you run `launch` the first time, we introspect the platform chosen and
save the config as `config-<platform>.yaml`.

For example, running this:

```
$ xokdinst launch mycluster2
```

Will create a second cluster that inherits everything except the name from the
base. If for example the first cluster you created is for the AWS platform,
the `mycluster2` will launch using `config-aws.yaml`.

If you want to use multiple platforms (e.g. `aws` and `libvirt`), then you'll
want to make a new config:

```
$ xokdinst gen-config
```

This time choose `libvirt` as a platform, and the config generated will be
`config-libvirt.yaml`.

From now on, you will need to specify the platform any time you launch
a cluster, e.g.

```
$ xokdinst launch -p aws mycluster2

$ xokdinst launch -p libvirt mycluster3
```

Why not add this to the installer upstream?
---

It'd be a notable UX change; I'd like to do so of course.

Why is this implemented in Rust
---

Originally it was in Python but I really feel the lack of static types there.
Go is annoying for "scripts" for a few reasons, mainly how verbose error
handling is versus Rust's simple and elegant `?` operator.
Also, I feel at home writing Rust.