A terraform provider that provides resouces for powering Software Quality as Code by writing
Terraform-based quality requirement scenarios using a composable, modular, and declarative language.
It is intended to be use in conjunction with the Enos CLI and
provide the resources necessary to use Terraform as Enos's execution engine.
Installing the provider
Requirements
Install the released version of the provider from the Terraform registry by following the instructions in the Terraform Registry
terraform {
required_providers {
enos = {
source = "hashicorp-forge/enos"
}
}
}
provider "enos" {
# ...
}
Developing the provider
Requirements
Build from source
For local development, first you will need to build flight-control.
-
If you're not on macOS, make sure upx
installed with your package manager. We use macOS to
pack some embedded flight-control binaries. We don't need this on macOS because
upx
has been removed from Homebrew while they sort out
macOS code signing shenanigans.
-
Run make flight-control install
in the root of this repository. This will build and pack
the enos-flight-control
binaries, build a new terraform-provider-enos
binary and install it into
your local Terraform provider cache.
Flight control
Enos resources that take require a transport
attribute to be configured work by executing remote
commands on a target resources. Often it's resonably safe to assume that the remote target will
provide some common POSIX commands for common tasks, however, there are some targets or operations
where there is no common POSIX utility we can rely on, such as making remote HTTP requests, unziping
archives, or executing against a minimal container. While utilities that can provide those functions
might be accessible via a package manager of some sort, installing global utlities and dealing with
platform specific package managers can become a serious burden.
Rather than cargo cult brittle and complex script to manage various package managers, our solution
to this problem is to bundle common operations into a binary called enos-flight-control
. As part
of our build pipeline we build this utility for every platform and architecture that we support and
embed it into the Terraform plugin. During runtime the provider resources can install it on the
remote targets and then call into it when we need advanced operations.
Commands
Download
The download command downloads a file from a given URL and verify the content SHA and send HTTP
requests. It's sort of a Kirkland Signature version of curl
or wget
.
enos-flight-control download --url https://some/remote/file.txt --destination /local/path/file.txt --mode 0755 --timeout 5m --sha256 02b3...
Flags
auth-user
The username to use for basic auth|
auth-password
The password to use for basic auth|
destination
The destination location where the file will be written|
exit-with-status-code
On failure, exit with the HTTP status code returned. Note that status codes over 256 are not supported|
mode
The desired file permissions of the downloaded file|
replace
Replace the destination file if it exists|
sha256
The expected SHA256 sum of the file to be downloaded. When provided we'll assert that the resulting file matches the SHA or will raise an error|
stdout
Write the output to stdout|
timeout
The maximum allowable time for the download operation|
url
The URL of the remote resource to download|
NOTE one of --destination
or --stdout
is required.
Unzip
The unzip command unzips a zip archive.
enos-flight-control unzip --source /some/file.zip --destination /some/directory --create true
Flags
source
The path to the source Zip archive|
destination
The destination directory where the expanded files will be written|
mode
The desired file permissions of the expanded archive files|
create-destination
Whether or not create the destination directory if does not exist|
destination-mode
The file mode for the destination directory if it is to be created|
replace
Replace any existing destination file if they already exist|
Remote flight
The remoteflight
package is a library where many common operations that need to be performed over
a transport are located. The include installing enos-flight-control
on a target machines.
Releasing a new version
Triggering a new release requires executing the release
workflow and providing the Git SHA you
wish to release. It will automatically use the version present on that SHA as the release tag. The
version at that SHA must not already exist as a tag.