open-nomad/e2e/framework/provisioning/config_vagrant.go
Tim Gross 2edbdfc8be
e2e: update framework to allow deploying Nomad (#6969)
The e2e framework instantiates clients for Nomad/Consul but the
provisioning of the actual Nomad cluster is left to Terraform. The
Terraform provisioning process uses `remote-exec` to deploy specific
versions of Nomad so that we don't have to bake an AMI every time we
want to test a new version. But Terraform treats the resulting
instances as immutable, so we can't use the same tooling to update the
version of Nomad in-place. This is a prerequisite for upgrade testing.

This changeset extends the e2e framework to provide the option of
deploying Nomad (and, in the future, Consul/Vault) with specific
versions to running infrastructure. This initial implementation is
focused on deploying to a single cluster via `ssh` (because that's our
current need), but provides interfaces to hook the test run at the
start of the run, the start of each suite, or the start of a given
test case.

Terraform work includes:
* provides Terraform output that written to JSON used by the framework
  to configure provisioning via `terraform output provisioning`.
* provides Terraform output that can be used by test operators to
  configure their shell via `$(terraform output environment)`
* drops `remote-exec` provisioning steps from Terraform
* makes changes to the deployment scripts to ensure they can be run
  multiple times w/ different versions against the same host.
2020-01-22 08:48:52 -05:00

54 lines
1.4 KiB
Go

package provisioning
import (
"fmt"
"log"
)
// ProvisionerConfigVagrant targets a single-node Vagrant environment.
func ProvisionerConfigVagrant(config ProvisionerConfig) *ProvisioningTargets {
if config.NomadVersion == "" && config.NomadSha == "" && config.NomadLocalBinary == "" {
log.Fatal("cannot run vagrant provisioning without a '-nomad.*' flag set")
return nil
}
// TODO(tgross): need a better way to get the right root path, rather
// than relying on running at the root of the Nomad source directory.
keyPath := fmt.Sprintf(
"./.vagrant/machines/%s/virtualbox/private_key", config.VagrantBox)
return &ProvisioningTargets{
Servers: []*ProvisioningTarget{
{
Runner: map[string]interface{}{}, // unused
runner: &SSHRunner{
Key: keyPath,
User: "vagrant",
Host: "127.0.0.1",
Port: 2222,
},
Deployment: Deployment{
NomadLocalBinary: config.NomadLocalBinary,
NomadSha: config.NomadSha,
NomadVersion: config.NomadVersion,
RemoteBinaryPath: "/opt/gopath/bin/nomad",
Platform: "linux_amd64",
Bundles: []Bundle{
// TODO(tgross): we need a shared vagrant config
// and service file for this to work.
{
Source: "./config.hcl",
Destination: "/home/vagrant/config.hcl",
},
},
Steps: []string{
"sudo systemctl restart consul",
"sudo systemctl restart nomad",
},
},
},
},
}
}