// GET /info func getInfo(c *context, w http.ResponseWriter, r *http.Request) { info := apitypes.Info{ Images: len(c.cluster.Images().Filter(cluster.ImageFilterOptions{})), DriverStatus: c.statusHandler.Status(), NEventsListener: c.eventsHandler.Size(), Debug: c.debug, MemoryLimit: true, SwapLimit: true, CPUCfsPeriod: true, CPUCfsQuota: true, CPUShares: true, CPUSet: true, IPv4Forwarding: true, BridgeNfIptables: true, BridgeNfIP6tables: true, OomKillDisable: true, OperatingSystem: runtime.GOOS, Architecture: runtime.GOARCH, NCPU: int(c.cluster.TotalCpus()), MemTotal: c.cluster.TotalMemory(), HTTPProxy: os.Getenv("http_proxy"), HTTPSProxy: os.Getenv("https_proxy"), NoProxy: os.Getenv("no_proxy"), SystemTime: time.Now().Format(time.RFC3339Nano), ExperimentalBuild: experimental.ENABLED, } if kernelVersion, err := kernel.GetKernelVersion(); err == nil { info.KernelVersion = kernelVersion.String() } for _, c := range c.cluster.Containers() { info.Containers++ if c.Info.State.Paused { info.ContainersPaused++ } else if c.Info.State.Running { info.ContainersRunning++ } else { info.ContainersStopped++ } } if hostname, err := os.Hostname(); err == nil { info.Name = hostname } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(info) }
// GET /info func getInfo(c *context, w http.ResponseWriter, r *http.Request) { info := apitypes.Info{ Images: len(c.cluster.Images().Filter(cluster.ImageFilterOptions{})), NEventsListener: c.eventsHandler.Size(), Debug: c.debug, MemoryLimit: true, SwapLimit: true, CPUCfsPeriod: true, CPUCfsQuota: true, CPUShares: true, CPUSet: true, IPv4Forwarding: true, BridgeNfIptables: true, BridgeNfIP6tables: true, OomKillDisable: true, ServerVersion: "swarm/" + version.VERSION, OperatingSystem: runtime.GOOS, Architecture: runtime.GOARCH, NCPU: int(c.cluster.TotalCpus()), MemTotal: c.cluster.TotalMemory(), HTTPProxy: os.Getenv("http_proxy"), HTTPSProxy: os.Getenv("https_proxy"), NoProxy: os.Getenv("no_proxy"), SystemTime: time.Now().Format(time.RFC3339Nano), ExperimentalBuild: experimental.ENABLED, } // API versions older than 1.22 use DriverStatus and return \b characters in the output status := c.statusHandler.Status() if c.apiVersion != "" && versionpkg.Version(c.apiVersion).LessThan("1.22") { for i := range status { if status[i][0][:1] == " " { status[i][0] = status[i][0][1:] } else { status[i][0] = "\b" + status[i][0] } } info.DriverStatus = status } else { info.SystemStatus = status } kernelVersion := "<unknown>" if kv, err := kernel.GetKernelVersion(); err != nil { log.Warnf("Could not get kernel version: %v", err) } else { kernelVersion = kv.String() } info.KernelVersion = kernelVersion for _, c := range c.cluster.Containers() { info.Containers++ if c.Info.State.Paused { info.ContainersPaused++ } else if c.Info.State.Running { info.ContainersRunning++ } else { info.ContainersStopped++ } } hostname := "<unknown>" if hn, err := os.Hostname(); err != nil { log.Warnf("Could not get hostname: %v", err) } else { hostname = hn } info.Name = hostname w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(info) }