func printVersion(c CommandLine, api libmachine.API, out io.Writer) error { if len(c.Args()) == 0 { c.ShowVersion() return nil } if len(c.Args()) != 1 { return ErrExpectedOneMachine } host, err := api.Load(c.Args().First()) if err != nil { return err } version, err := mcndockerclient.DockerVersion(host) if err != nil { return err } fmt.Fprintln(out, version) return nil }
// PERFORMANCE: The code of this function is complicated because we try // to call the underlying drivers as less as possible to get the information // we need. func attemptGetHostItem(h *host.Host, stateQueryChan chan<- commands.HostListItem) { url := "" currentState := state.None dockerVersion := "Unknown" hostError := "" url, err := h.URL() // PERFORMANCE: if we have the url, it's ok to assume the host is running // This reduces the number of calls to the drivers if err == nil { if url != "" { currentState = state.Running } else { currentState, err = h.Driver.GetState() } } else { currentState, _ = h.Driver.GetState() } if err == nil && url != "" { // PERFORMANCE: Reuse the url instead of asking the host again. // This reduces the number of calls to the drivers dockerHost := &mcndockerclient.RemoteDocker{ HostURL: url, AuthOption: h.AuthOptions(), } dockerVersion, err = mcndockerclient.DockerVersion(dockerHost) if err != nil { dockerVersion = "Unknown" } else { dockerVersion = fmt.Sprintf("v%s", dockerVersion) } } if err != nil { hostError = err.Error() } if hostError == drivers.ErrHostIsNotRunning.Error() { hostError = "" } var swarmOptions *swarm.Options var engineOptions *engine.Options if h.HostOptions != nil { swarmOptions = h.HostOptions.SwarmOptions engineOptions = h.HostOptions.EngineOptions } isMaster := false swarmHost := "" if swarmOptions != nil { isMaster = swarmOptions.Master swarmHost = swarmOptions.Host } activeHost := isActive(currentState, url) activeSwarm := isSwarmActive(currentState, url, isMaster, swarmHost) active := "-" if activeHost { active = "*" } if activeSwarm { active = "* (swarm)" } stateQueryChan <- commands.HostListItem{ Name: h.Name, Active: active, ActiveHost: activeHost, ActiveSwarm: activeSwarm, DriverName: h.Driver.DriverName(), State: currentState, URL: url, SwarmOptions: swarmOptions, EngineOptions: engineOptions, DockerVersion: dockerVersion, Error: hostError, } }
func (h *Host) DockerVersion() (string, error) { return mcndockerclient.DockerVersion(h) }