Run your workloads on ephemeral Virtual Machines.
A simple tool that spawns an arbitrary number of VMs in parallel, runs the same workload on each of them, and collects their outputs.
This requires Vagrant to be installed in your system, and to be properly configured with a supported provider.
vm-spinner uses so-called jobs to do its magic.
Jobs implements a VMJob interface that defines their name, description, and command to be run.
Moreover, there are other 2 interfaces that might be implemented:
VMJobProcessor: to embed private logic to process output from command being runVMJobConfigurator: to embed private logic to define and parse plugin specific flags. This adds an hard dep ongithub.com/urfave/clipackage.
All these interfaces can be found in the vmjob file.
Finally, vm-spinner also supports external plugins; they are go shared objects that implement the VMJob interface(and eventually VMJobProcessor and VMJobConfigurator),
and expose a PluginJob var.
Here is a simple example:
package main
type myJob struct {
	cmd string
}
// PluginJob symbol needs to be exported because it will be loaded by plugin framework
var PluginJob myJob
func (j *myJob) String() string {
	return "testplugin"
}
func (j *myJob) Desc() string {
	return "Run a simple plugin job."
}
func (j *myJob) Cmd() (string, bool) {
	return `echo "I am a plugin"`, false
}You can see that the implementation is fairly simple.
Just a couple of things to note:
- String() returns plugin name. It must be unique foreach plugin
 - When 
VMJobConfiguratorinterface is not implemented, or if the list of plugin flags does not contain animage,iflag, a default image flag is enforced by the framework 
- Printing 
hello worldon an Ubuntu 20.04 VM using VirtualBox (default provider): 
vm-spinner cmd --line "echo hello world" -i "ubuntu/focal64"- Creating a VM and installing Docker.
 
vm-spinner cmd --line "curl -fsSL https://get.docker.com -o get-docker.sh && sh ./get-docker.sh" -i "ubuntu/focal64"- Running a local script in two VM in parallel, by specifying the provisioned resources for each VM:
 
vm-spinner --cpus=2 --parallelism=2 --memory=4096 cmd --file "./script.sh" -i "ubuntu/focal64" -i "ubuntu/bionic64"- Running a plugin:
 
vm-spinner --plugin-dir /$HOME/plugins/ testplugin -i "ubuntu/focal64"