diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1bfcb74edc..efd3736387 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -99,21 +99,13 @@ This will generate and open the report file: ### Advanced build targets -Just build the machine binary itself (native): +Build for all supported OSes and architectures (binaries will be in the `bin` project subfolder): - make machine + make build-x -Just build the plugins (native): +Build for a specific list of OSes and architectures: - make plugins - -Build for all supported oses and architectures (binaries will be in the `bin` project subfolder): - - make cross - -Build for a specific list of oses and architectures: - - TARGET_OS=linux TARGET_ARCH="amd64 arm" make cross + TARGET_OS=linux TARGET_ARCH="amd64 arm" make build-x You can further control build options through the following environment variables: diff --git a/cmd/machine-driver-amazonec2.go b/cmd/machine-driver-amazonec2.go deleted file mode 100644 index 0c63e87455..0000000000 --- a/cmd/machine-driver-amazonec2.go +++ /dev/null @@ -1,10 +0,0 @@ -package main - -import ( - "github.com/docker/machine/drivers/amazonec2" - "github.com/docker/machine/libmachine/drivers/plugin" -) - -func main() { - plugin.RegisterDriver(amazonec2.NewDriver("", "")) -} diff --git a/cmd/machine-driver-azure.go b/cmd/machine-driver-azure.go deleted file mode 100644 index 98abfbbbdf..0000000000 --- a/cmd/machine-driver-azure.go +++ /dev/null @@ -1,10 +0,0 @@ -package main - -import ( - "github.com/docker/machine/drivers/azure" - "github.com/docker/machine/libmachine/drivers/plugin" -) - -func main() { - plugin.RegisterDriver(azure.NewDriver("", "")) -} diff --git a/cmd/machine-driver-digitalocean.go b/cmd/machine-driver-digitalocean.go deleted file mode 100644 index 3ededa771a..0000000000 --- a/cmd/machine-driver-digitalocean.go +++ /dev/null @@ -1,10 +0,0 @@ -package main - -import ( - "github.com/docker/machine/drivers/digitalocean" - "github.com/docker/machine/libmachine/drivers/plugin" -) - -func main() { - plugin.RegisterDriver(digitalocean.NewDriver("", "")) -} diff --git a/cmd/machine-driver-exoscale.go b/cmd/machine-driver-exoscale.go deleted file mode 100644 index 1515de7dde..0000000000 --- a/cmd/machine-driver-exoscale.go +++ /dev/null @@ -1,10 +0,0 @@ -package main - -import ( - "github.com/docker/machine/drivers/exoscale" - "github.com/docker/machine/libmachine/drivers/plugin" -) - -func main() { - plugin.RegisterDriver(exoscale.NewDriver("", "")) -} diff --git a/cmd/machine-driver-generic.go b/cmd/machine-driver-generic.go deleted file mode 100644 index 01f0a77e57..0000000000 --- a/cmd/machine-driver-generic.go +++ /dev/null @@ -1,10 +0,0 @@ -package main - -import ( - "github.com/docker/machine/drivers/generic" - "github.com/docker/machine/libmachine/drivers/plugin" -) - -func main() { - plugin.RegisterDriver(generic.NewDriver("", "")) -} diff --git a/cmd/machine-driver-google.go b/cmd/machine-driver-google.go deleted file mode 100644 index 6ac965c3b4..0000000000 --- a/cmd/machine-driver-google.go +++ /dev/null @@ -1,10 +0,0 @@ -package main - -import ( - "github.com/docker/machine/drivers/google" - "github.com/docker/machine/libmachine/drivers/plugin" -) - -func main() { - plugin.RegisterDriver(google.NewDriver("", "")) -} diff --git a/cmd/machine-driver-hyperv.go b/cmd/machine-driver-hyperv.go deleted file mode 100644 index b51ce17c70..0000000000 --- a/cmd/machine-driver-hyperv.go +++ /dev/null @@ -1,10 +0,0 @@ -package main - -import ( - "github.com/docker/machine/drivers/hyperv" - "github.com/docker/machine/libmachine/drivers/plugin" -) - -func main() { - plugin.RegisterDriver(hyperv.NewDriver("", "")) -} diff --git a/cmd/machine-driver-none.go b/cmd/machine-driver-none.go deleted file mode 100644 index f077d12ede..0000000000 --- a/cmd/machine-driver-none.go +++ /dev/null @@ -1,10 +0,0 @@ -package main - -import ( - "github.com/docker/machine/drivers/none" - "github.com/docker/machine/libmachine/drivers/plugin" -) - -func main() { - plugin.RegisterDriver(none.NewDriver("", "")) -} diff --git a/cmd/machine-driver-openstack.go b/cmd/machine-driver-openstack.go deleted file mode 100644 index e3f62df3ba..0000000000 --- a/cmd/machine-driver-openstack.go +++ /dev/null @@ -1,10 +0,0 @@ -package main - -import ( - "github.com/docker/machine/drivers/openstack" - "github.com/docker/machine/libmachine/drivers/plugin" -) - -func main() { - plugin.RegisterDriver(openstack.NewDriver("", "")) -} diff --git a/cmd/machine-driver-rackspace.go b/cmd/machine-driver-rackspace.go deleted file mode 100644 index e8346c4957..0000000000 --- a/cmd/machine-driver-rackspace.go +++ /dev/null @@ -1,10 +0,0 @@ -package main - -import ( - "github.com/docker/machine/drivers/rackspace" - "github.com/docker/machine/libmachine/drivers/plugin" -) - -func main() { - plugin.RegisterDriver(rackspace.NewDriver("", "")) -} diff --git a/cmd/machine-driver-softlayer.go b/cmd/machine-driver-softlayer.go deleted file mode 100644 index 6d40820b27..0000000000 --- a/cmd/machine-driver-softlayer.go +++ /dev/null @@ -1,10 +0,0 @@ -package main - -import ( - "github.com/docker/machine/drivers/softlayer" - "github.com/docker/machine/libmachine/drivers/plugin" -) - -func main() { - plugin.RegisterDriver(softlayer.NewDriver("", "")) -} diff --git a/cmd/machine-driver-virtualbox.go b/cmd/machine-driver-virtualbox.go deleted file mode 100644 index 625cfc3bdf..0000000000 --- a/cmd/machine-driver-virtualbox.go +++ /dev/null @@ -1,10 +0,0 @@ -package main - -import ( - "github.com/docker/machine/drivers/virtualbox" - "github.com/docker/machine/libmachine/drivers/plugin" -) - -func main() { - plugin.RegisterDriver(virtualbox.NewDriver("", "")) -} diff --git a/cmd/machine-driver-vmwarefusion.go b/cmd/machine-driver-vmwarefusion.go deleted file mode 100644 index 76401e05d6..0000000000 --- a/cmd/machine-driver-vmwarefusion.go +++ /dev/null @@ -1,10 +0,0 @@ -package main - -import ( - "github.com/docker/machine/drivers/vmwarefusion" - "github.com/docker/machine/libmachine/drivers/plugin" -) - -func main() { - plugin.RegisterDriver(vmwarefusion.NewDriver("", "")) -} diff --git a/cmd/machine-driver-vmwarevcloudair.go b/cmd/machine-driver-vmwarevcloudair.go deleted file mode 100644 index 25c197064c..0000000000 --- a/cmd/machine-driver-vmwarevcloudair.go +++ /dev/null @@ -1,10 +0,0 @@ -package main - -import ( - "github.com/docker/machine/drivers/vmwarevcloudair" - "github.com/docker/machine/libmachine/drivers/plugin" -) - -func main() { - plugin.RegisterDriver(vmwarevcloudair.NewDriver("", "")) -} diff --git a/cmd/machine-driver-vmwarevsphere.go b/cmd/machine-driver-vmwarevsphere.go deleted file mode 100644 index 311bbc4f44..0000000000 --- a/cmd/machine-driver-vmwarevsphere.go +++ /dev/null @@ -1,10 +0,0 @@ -package main - -import ( - "github.com/docker/machine/drivers/vmwarevsphere" - "github.com/docker/machine/libmachine/drivers/plugin" -) - -func main() { - plugin.RegisterDriver(vmwarevsphere.NewDriver("", "")) -} diff --git a/cmd/machine.go b/cmd/machine.go index bb0efff365..9c55a60445 100644 --- a/cmd/machine.go +++ b/cmd/machine.go @@ -9,6 +9,23 @@ import ( "github.com/codegangsta/cli" "github.com/docker/machine/commands" "github.com/docker/machine/commands/mcndirs" + "github.com/docker/machine/drivers/amazonec2" + "github.com/docker/machine/drivers/azure" + "github.com/docker/machine/drivers/digitalocean" + "github.com/docker/machine/drivers/exoscale" + "github.com/docker/machine/drivers/generic" + "github.com/docker/machine/drivers/google" + "github.com/docker/machine/drivers/hyperv" + "github.com/docker/machine/drivers/none" + "github.com/docker/machine/drivers/openstack" + "github.com/docker/machine/drivers/rackspace" + "github.com/docker/machine/drivers/softlayer" + "github.com/docker/machine/drivers/virtualbox" + "github.com/docker/machine/drivers/vmwarefusion" + "github.com/docker/machine/drivers/vmwarevcloudair" + "github.com/docker/machine/drivers/vmwarevsphere" + "github.com/docker/machine/libmachine/drivers/plugin" + "github.com/docker/machine/libmachine/drivers/plugin/localbinary" "github.com/docker/machine/libmachine/log" "github.com/docker/machine/version" ) @@ -65,6 +82,12 @@ func setDebugOutputLevel() { } func main() { + if os.Getenv(localbinary.PluginEnvKey) == localbinary.PluginEnvVal { + driverName := os.Getenv(localbinary.PluginEnvDriverName) + runDriver(driverName) + return + } + setDebugOutputLevel() cli.AppHelpTemplate = AppHelpTemplate cli.CommandHelpTemplate = CommandHelpTemplate @@ -133,6 +156,44 @@ func main() { } } +func runDriver(driverName string) { + switch driverName { + case "amazonec2": + plugin.RegisterDriver(amazonec2.NewDriver("", "")) + case "azure": + plugin.RegisterDriver(azure.NewDriver("", "")) + case "digitalocean": + plugin.RegisterDriver(digitalocean.NewDriver("", "")) + case "exoscale": + plugin.RegisterDriver(exoscale.NewDriver("", "")) + case "generic": + plugin.RegisterDriver(generic.NewDriver("", "")) + case "google": + plugin.RegisterDriver(google.NewDriver("", "")) + case "hyperv": + plugin.RegisterDriver(hyperv.NewDriver("", "")) + case "none": + plugin.RegisterDriver(none.NewDriver("", "")) + case "openstack": + plugin.RegisterDriver(openstack.NewDriver("", "")) + case "rackspace": + plugin.RegisterDriver(rackspace.NewDriver("", "")) + case "softlayer": + plugin.RegisterDriver(softlayer.NewDriver("", "")) + case "virtualbox": + plugin.RegisterDriver(virtualbox.NewDriver("", "")) + case "vmwarefusion": + plugin.RegisterDriver(vmwarefusion.NewDriver("", "")) + case "vmwarevcloudair": + plugin.RegisterDriver(vmwarevcloudair.NewDriver("", "")) + case "vmwarevsphere": + plugin.RegisterDriver(vmwarevsphere.NewDriver("", "")) + default: + fmt.Fprintf(os.Stderr, "Unsupported driver: %s\n", driverName) + os.Exit(1) + } +} + func cmdNotFound(c *cli.Context, command string) { log.Fatalf( "%s: '%s' is not a %s command. See '%s --help'.", diff --git a/libmachine/drivers/plugin/localbinary/plugin.go b/libmachine/drivers/plugin/localbinary/plugin.go index da6ff8b561..fd57e02cf9 100644 --- a/libmachine/drivers/plugin/localbinary/plugin.go +++ b/libmachine/drivers/plugin/localbinary/plugin.go @@ -16,13 +16,18 @@ var ( // Timeout where we will bail if we're not able to properly contact the // plugin server. defaultTimeout = 10 * time.Second + CoreDrivers = [...]string{"amazonec2", "azure", "digitalocean", + "exoscale", "generic", "google", "hyperv", "none", "openstack", + "rackspace", "softlayer", "virtualbox", "vmwarefusion", + "vmwarevcloudair", "vmwarevsphere"} ) const ( - pluginOutPrefix = "(%s) " - pluginErrPrefix = "(%s) DBG | " - PluginEnvKey = "MACHINE_PLUGIN_TOKEN" - PluginEnvVal = "42" + pluginOutPrefix = "(%s) " + pluginErrPrefix = "(%s) DBG | " + PluginEnvKey = "MACHINE_PLUGIN_TOKEN" + PluginEnvVal = "42" + PluginEnvDriverName = "MACHINE_PLUGIN_DRIVER_NAME" ) type PluginStreamer interface { @@ -84,8 +89,19 @@ func (e ErrPluginBinaryNotFound) Error() string { return fmt.Sprintf("Driver %q not found. Do you have the plugin binary accessible in your PATH?", e.driverName) } +func driverPath(driverName string) string { + for _, coreDriver := range CoreDrivers { + if coreDriver == driverName { + return os.Args[0] // "docker-machine" + } + } + + return fmt.Sprintf("docker-machine-driver-%s", driverName) +} + func NewPlugin(driverName string) (*Plugin, error) { - binaryPath, err := exec.LookPath(fmt.Sprintf("docker-machine-driver-%s", driverName)) + driverPath := driverPath(driverName) + binaryPath, err := exec.LookPath(driverPath) if err != nil { return nil, ErrPluginBinaryNotFound{driverName} } @@ -123,6 +139,7 @@ func (lbe *Executor) Start() (*bufio.Scanner, *bufio.Scanner, error) { errScanner := bufio.NewScanner(lbe.pluginStderr) os.Setenv(PluginEnvKey, PluginEnvVal) + os.Setenv(PluginEnvDriverName, lbe.DriverName) if err := cmd.Start(); err != nil { return nil, nil, fmt.Errorf("Error starting plugin binary: %s", err) diff --git a/mk/build.mk b/mk/build.mk index 3967ab5bd1..99efbf9e51 100644 --- a/mk/build.mk +++ b/mk/build.mk @@ -1,31 +1,22 @@ -build-clean: - rm -Rf $(PREFIX)/bin/* - extension = $(patsubst windows,.exe,$(filter windows,$(1))) -# Cross builder helper define gocross - GOOS=$(1) GOARCH=$(2) CGO_ENABLED=0 go build \ + GOOS=$(1) GOARCH=$(2) CGO_ENABLED=0 $(GO) build \ -o $(PREFIX)/bin/docker-machine_$(1)-$(2)/docker-$(patsubst cmd/%.go,%,$3)$(call extension,$(GOOS)) \ -a $(VERBOSE_GO) -tags "static_build netgo $(BUILDTAGS)" -installsuffix netgo \ -ldflags "$(GO_LDFLAGS) -extldflags -static" $(GO_GCFLAGS) $(3); endef -# XXX building with -a fails in debug (with -N -l) ???? +build-clean: + rm -Rf $(PREFIX)/bin/* -# Independent targets for every bin -$(PREFIX)/bin/docker-%: ./cmd/%.go $(shell find . -type f -name '*.go') - $(GO) build -o $@$(call extension,$(GOOS)) $(VERBOSE_GO) -tags "$(BUILDTAGS)" -ldflags "$(GO_LDFLAGS)" $(GO_GCFLAGS) $< - -# Cross-compilation targets -build-x-%: ./cmd/%.go $(shell find . -type f -name '*.go') +build-x: ./cmd/machine.go $(foreach GOARCH,$(TARGET_ARCH),$(foreach GOOS,$(TARGET_OS),$(call gocross,$(GOOS),$(GOARCH),$<))) -# Build just machine -build-machine: $(PREFIX)/bin/docker-machine +$(PREFIX)/bin/docker-machine$(call extension,$(GOOS)): ./cmd/machine.go + $(GO) build \ + -o $@ \ + $(VERBOSE_GO) -tags "$(BUILDTAGS)" \ + -ldflags "$(GO_LDFLAGS)" $(GO_GCFLAGS) $< -# Build all plugins -build-plugins: $(patsubst ./cmd/%.go,$(PREFIX)/bin/docker-%,$(filter-out %_test.go, $(wildcard ./cmd/machine-driver-*.go))) - -# Overall cross-build -build-x: $(patsubst ./cmd/%.go,build-x-%,$(filter-out %_test.go, $(wildcard ./cmd/*.go))) +build: $(PREFIX)/bin/docker-machine diff --git a/mk/main.mk b/mk/main.mk index c7e271917c..f479f97aab 100644 --- a/mk/main.mk +++ b/mk/main.mk @@ -44,24 +44,16 @@ include mk/release.mk include mk/test.mk include mk/validate.mk -.all_build: build build-clean build-x build-machine build-plugins +.all_build: build build-clean build-x .all_coverage: coverage-generate coverage-html coverage-send coverage-serve coverage-clean .all_release: release-checksum release .all_test: test-short test-long test-integration .all_validate: dco fmt vet lint default: build -# Build native machine and all drivers -build: build-machine build-plugins -# Just build native machine itself -machine: build-machine -# Just build the native plugins -plugins: build-plugins -# Build all, cross platform -cross: build-x install: - cp $(PREFIX)/bin/docker-machine $(PREFIX)/bin/docker-machine-driver* /usr/local/bin + cp $(PREFIX)/bin/docker-machine /usr/local/bin clean: coverage-clean build-clean test: dco fmt test-short lint vet