func attemptGetHostState(h *host.Host, stateQueryChan chan<- HostListItem) { url := "" hostError := "" dockerVersion := "Unknown" currentState, err := h.Driver.GetState() if err == nil { url, err = h.URL() } if err == nil { dockerVersion, err = h.DockerVersion() 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 } stateQueryChan <- HostListItem{ Name: h.Name, Active: isActive(currentState, url), DriverName: h.Driver.DriverName(), State: currentState, URL: url, SwarmOptions: swarmOptions, EngineOptions: engineOptions, DockerVersion: dockerVersion, Error: hostError, } }
// 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, } }