mirror of
https://github.com/docker/docs.git
synced 2026-11-05 00:14:17 +03:00
- Clear out some cruft tightly coupling libmachine to filestore - Comment out drivers other than virtualbox for now - Change way too many things - Mostly, break out the code to be more modular. - Destroy all traces of "provider" in its current form. It will be brought back as something more sensible, instead of something which overlaps in function with both Host and Store. - Fix mis-managed config passthru - Remove a few instances of state stored in env vars - This should be explicitly communicated in Go-land, not through the shell. - Rename "store" module to "persist" - This is done mostly to avoid confusion about the fact that a concrete instance of a "Store" interface is oftentimes referred to as "store" in the code. - Rip out repetitive antipattern for getting store - This replaces the previous repetive idiom for getting the cert info, and consequently the store, with a much less repetitive idiom. - Also, some redundant methods in commands.go for accessing hosts have either been simplified or removed entirely. - First steps towards fixing up tests - Test progress continues - Replace unit tests with integration tests - MAKE ALL UNIT TESTS PASS YAY - Add helper test files - Don't write to disk in libmachine/host - Heh.. coverage check strikes again - Fix remove code - Move cert code around - Continued progress: simplify Driver - Fixups and make creation work with new model - Move drivers module inside of libmachine - Move ssh module inside of libmachine - Move state module to libmachine - Move utils module to libmachine - Move version module to libmachine - Move log module to libmachine - Modify some constructor methods around - Change Travis build dep structure - Boring gofmt fix - Add version module - Move NewHost to store - Update some boring cert path infos to make API easier to use - Fix up some issues around the new model - Clean up some cert path stuff - Don't use shady functions to get store path :D - Continue artifact work - Fix silly machines dir bug - Continue fixing silly path issues - Change up output of vbm a bit - Continue work to make example go - Change output a little more - Last changes needed to make create finish properly - Fix config.go to use libmachine - Cut down code duplication and make both methods work with libmachine - Add pluggable logging implementation - Return error when machine already in desired state - Update example to show log method - Fix file:// bug - Fix Swarm defaults - Remove unused TLS settings from Engine and Swarm options - Remove spurious error - Correct bug detecting if migration was performed - Fix compilation errors from tests - Fix most of remaining test issues - Fix final silly bug in tests - Remove extraneous debug code - Add -race to test command - Appease the gofmt - Appease the generate coverage - Making executive decision to remove Travis coverage check In the early days I thought this would be a good idea because it would encourage people to write tests in case they added a new module. Well, in fact it has just turned into a giant nuisance and made refactoring work like this even more difficult. - Move Get to Load - Move HostListItem code to CLI Signed-off-by: Nathan LeClaire <nathan.leclaire@gmail.com>
161 lines
3.9 KiB
Go
161 lines
3.9 KiB
Go
package drivers
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"sort"
|
|
|
|
"github.com/codegangsta/cli"
|
|
"github.com/docker/machine/libmachine/log"
|
|
"github.com/docker/machine/libmachine/state"
|
|
)
|
|
|
|
// Driver defines how a host is created and controlled. Different types of
|
|
// driver represent different ways hosts can be created (e.g. different
|
|
// hypervisors, different cloud providers)
|
|
type Driver interface {
|
|
// Create a host using the driver's config
|
|
Create() error
|
|
|
|
// DriverName returns the name of the driver as it is registered
|
|
DriverName() string
|
|
|
|
// GetIP returns an IP or hostname that this host is available at
|
|
// e.g. 1.2.3.4 or docker-host-d60b70a14d3a.cloudapp.net
|
|
GetIP() (string, error)
|
|
|
|
// GetMachineName returns the name of the machine
|
|
GetMachineName() string
|
|
|
|
// GetSSHHostname returns hostname for use with ssh
|
|
GetSSHHostname() (string, error)
|
|
|
|
// GetSSHKeyPath returns key path for use with ssh
|
|
GetSSHKeyPath() string
|
|
|
|
// GetSSHPort returns port for use with ssh
|
|
GetSSHPort() (int, error)
|
|
|
|
// GetSSHUsername returns username for use with ssh
|
|
GetSSHUsername() string
|
|
|
|
// GetURL returns a Docker compatible host URL for connecting to this host
|
|
// e.g. tcp://1.2.3.4:2376
|
|
GetURL() (string, error)
|
|
|
|
// GetState returns the state that the host is in (running, stopped, etc)
|
|
GetState() (state.State, error)
|
|
|
|
// Kill stops a host forcefully
|
|
Kill() error
|
|
|
|
// PreCreateCheck allows for pre-create operations to make sure a driver is ready for creation
|
|
PreCreateCheck() error
|
|
|
|
// Remove a host
|
|
Remove() error
|
|
|
|
// Restart a host. This may just call Stop(); Start() if the provider does not
|
|
// have any special restart behaviour.
|
|
Restart() error
|
|
|
|
// SetConfigFromFlags configures the driver with the object that was returned
|
|
// by RegisterCreateFlags
|
|
SetConfigFromFlags(flags DriverOptions) error
|
|
|
|
// Start a host
|
|
Start() error
|
|
|
|
// Stop a host gracefully
|
|
Stop() error
|
|
}
|
|
|
|
// RegisteredDriver is a wrapper struct used to "register" drivers so that
|
|
// information about them can be displayed in the CLI.
|
|
type RegisteredDriver struct {
|
|
// GetCreateFlags gets the FlagSet for "docker-machine create" for
|
|
// display to the user.
|
|
GetCreateFlags func() []cli.Flag
|
|
}
|
|
|
|
var ErrHostIsNotRunning = errors.New("Host is not running")
|
|
|
|
var (
|
|
drivers map[string]*RegisteredDriver
|
|
)
|
|
|
|
func init() {
|
|
drivers = make(map[string]*RegisteredDriver)
|
|
}
|
|
|
|
// Register a driver
|
|
func Register(name string, registeredDriver *RegisteredDriver) error {
|
|
if _, exists := drivers[name]; exists {
|
|
return fmt.Errorf("Name already registered %s", name)
|
|
}
|
|
|
|
drivers[name] = registeredDriver
|
|
return nil
|
|
}
|
|
|
|
// GetCreateFlags runs GetCreateFlags for all of the drivers and
|
|
// returns their return values indexed by the driver name
|
|
func GetCreateFlags() []cli.Flag {
|
|
flags := []cli.Flag{}
|
|
|
|
for driverName := range drivers {
|
|
driver := drivers[driverName]
|
|
for _, f := range driver.GetCreateFlags() {
|
|
flags = append(flags, f)
|
|
}
|
|
}
|
|
|
|
sort.Sort(ByFlagName(flags))
|
|
|
|
return flags
|
|
}
|
|
|
|
func GetCreateFlagsForDriver(name string) ([]cli.Flag, error) {
|
|
|
|
for driverName := range drivers {
|
|
if name == driverName {
|
|
driver := drivers[driverName]
|
|
flags := driver.GetCreateFlags()
|
|
sort.Sort(ByFlagName(flags))
|
|
return flags, nil
|
|
}
|
|
}
|
|
|
|
return nil, fmt.Errorf("Driver %s not found", name)
|
|
}
|
|
|
|
// GetDriverNames returns a slice of all registered driver names
|
|
func GetDriverNames() []string {
|
|
names := make([]string, 0, len(drivers))
|
|
for k := range drivers {
|
|
names = append(names, k)
|
|
}
|
|
sort.Strings(names)
|
|
return names
|
|
}
|
|
|
|
type DriverOptions interface {
|
|
String(key string) string
|
|
StringSlice(key string) []string
|
|
Int(key string) int
|
|
Bool(key string) bool
|
|
}
|
|
|
|
func MachineInState(d Driver, desiredState state.State) func() bool {
|
|
return func() bool {
|
|
currentState, err := d.GetState()
|
|
if err != nil {
|
|
log.Debugf("Error getting machine state: %s", err)
|
|
}
|
|
if currentState == desiredState {
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
}
|