package docker import ( "fmt" "io/ioutil" "strings" "time" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/registry" "github.com/docker/docker/api/types/swarm" ) var info = types.Info{ Containers: 108, ContainersRunning: 98, ContainersStopped: 6, ContainersPaused: 3, OomKillDisable: false, SystemTime: "2016-02-24T00:55:09.15073105-05:00", NEventsListener: 0, ID: "5WQQ:TFWR:FDNG:OKQ3:37Y4:FJWG:QIKK:623T:R3ME:QTKB:A7F7:OLHD", Debug: false, LoggingDriver: "json-file", KernelVersion: "4.3.0-1-amd64", IndexServerAddress: "https://index.docker.io/v1/", MemTotal: 3840757760, Images: 199, CPUCfsQuota: true, Name: "absol", SwapLimit: false, IPv4Forwarding: true, ExperimentalBuild: false, CPUCfsPeriod: true, RegistryConfig: ®istry.ServiceConfig{ IndexConfigs: map[string]*registry.IndexInfo{ "docker.io": { Name: "docker.io", Mirrors: []string{}, Official: true, Secure: true, }, }, InsecureRegistryCIDRs: []*registry.NetIPNet{{IP: []byte{127, 0, 0, 0}, Mask: []byte{255, 0, 0, 0}}}, Mirrors: []string{}}, OperatingSystem: "Linux Mint LMDE (containerized)", BridgeNfIptables: true, HTTPSProxy: "", Labels: []string{}, MemoryLimit: false, DriverStatus: [][2]string{{"Pool Name", "docker-8:1-1182287-pool"}, {"Pool Blocksize", "65.54 kB"}, {"Backing Filesystem", "extfs"}, {"Data file", "/dev/loop0"}, {"Metadata file", "/dev/loop1"}, {"Data Space Used", "17.3 GB"}, {"Data Space Total", "107.4 GB"}, {"Data Space Available", "36.53 GB"}, {"Metadata Space Used", "20.97 MB"}, {"Metadata Space Total", "2.147 GB"}, {"Metadata Space Available", "2.127 GB"}, {"Udev Sync Supported", "true"}, {"Deferred Removal Enabled", "false"}, {"Data loop file", "/var/lib/docker/devicemapper/devicemapper/data"}, {"Metadata loop file", "/var/lib/docker/devicemapper/devicemapper/metadata"}, {"Library Version", "1.02.115 (2016-01-25)"}}, NFd: 19, HTTPProxy: "", Driver: "devicemapper", NGoroutines: 39, NCPU: 4, DockerRootDir: "/var/lib/docker", NoProxy: "", BridgeNfIP6tables: true, ServerVersion: "17.09.0-ce", } var containerList = []types.Container{ { ID: "e2173b9478a6ae55e237d4d74f8bbb753f0817192b5081334dc78476296b7dfb", Names: []string{"/etcd"}, Image: "quay.io/coreos/etcd:v2.2.2", Command: "/etcd -name etcd0 -advertise-client-urls http://localhost:2379 -listen-client-urls http://0.0.0.0:2379", Created: 1455941930, Status: "Up 4 hours", Ports: []types.Port{ { PrivatePort: 7001, PublicPort: 0, Type: "tcp", }, { PrivatePort: 4001, PublicPort: 0, Type: "tcp", }, { PrivatePort: 2380, PublicPort: 0, Type: "tcp", }, { PrivatePort: 2379, PublicPort: 2379, Type: "tcp", IP: "0.0.0.0", }, }, Labels: map[string]string{ "label1": "test_value_1", "label2": "test_value_2", }, SizeRw: 0, SizeRootFs: 0, }, { ID: "b7dfbb9478a6ae55e237d4d74f8bbb753f0817192b5081334dc78476296e2173", Names: []string{"/etcd2"}, Image: "quay.io:4443/coreos/etcd:v2.2.2", Command: "/etcd -name etcd2 -advertise-client-urls http://localhost:2379 -listen-client-urls http://0.0.0.0:2379", Created: 1455941933, Status: "Up 4 hours", Ports: []types.Port{ { PrivatePort: 7002, PublicPort: 0, Type: "tcp", }, { PrivatePort: 4002, PublicPort: 0, Type: "tcp", }, { PrivatePort: 2381, PublicPort: 0, Type: "tcp", }, { PrivatePort: 2382, PublicPort: 2382, Type: "tcp", IP: "0.0.0.0", }, }, Labels: map[string]string{ "label1": "test_value_1", "label2": "test_value_2", }, SizeRw: 0, SizeRootFs: 0, }, { ID: "e8a713dd90604f5a257b97c15945e047ab60ed5b2c4397c5a6b5bf40e1bd2791", Names: []string{"/acme"}, }, { ID: "9bc6faf9ba8106fae32e8faafd38a1dd6f6d262bec172398cc10bc03c0d6841a", Names: []string{"/acme-test"}, }, { ID: "d4ccced494a1d5fe8ebdb0a86335a0dab069319912221e5838a132ab18a8bc84", Names: []string{"/foo"}, }, } var two = uint64(2) var ServiceList = []swarm.Service{ { ID: "qolkls9g5iasdiuihcyz9rnx2", Spec: swarm.ServiceSpec{ Annotations: swarm.Annotations{ Name: "test1", }, Mode: swarm.ServiceMode{ Replicated: &swarm.ReplicatedService{ Replicas: &two, }, }, }, }, { ID: "qolkls9g5iasdiuihcyz9rn3", Spec: swarm.ServiceSpec{ Annotations: swarm.Annotations{ Name: "test2", }, Mode: swarm.ServiceMode{ Global: &swarm.GlobalService{}, }, }, }, } var TaskList = []swarm.Task{ { ID: "kwh0lv7hwwbh", ServiceID: "qolkls9g5iasdiuihcyz9rnx2", NodeID: "0cl4jturcyd1ks3fwpd010kor", Status: swarm.TaskStatus{ State: "running", }, DesiredState: "running", }, { ID: "u78m5ojbivc3", ServiceID: "qolkls9g5iasdiuihcyz9rnx2", NodeID: "0cl4jturcyd1ks3fwpd010kor", Status: swarm.TaskStatus{ State: "running", }, DesiredState: "running", }, { ID: "1n1uilkhr98l", ServiceID: "qolkls9g5iasdiuihcyz9rn3", NodeID: "0cl4jturcyd1ks3fwpd010kor", Status: swarm.TaskStatus{ State: "running", }, DesiredState: "running", }, } var NodeList = []swarm.Node{ { ID: "0cl4jturcyd1ks3fwpd010kor", Status: swarm.NodeStatus{ State: "ready", }, }, { ID: "0cl4jturcyd1ks3fwpd010kor", Status: swarm.NodeStatus{ State: "ready", }, }, } func containerStats(s string) types.ContainerStats { var stat types.ContainerStats var name string switch s { case "e2173b9478a6ae55e237d4d74f8bbb753f0817192b5081334dc78476296b7dfb": name = "etcd" case "b7dfbb9478a6ae55e237d4d74f8bbb753f0817192b5081334dc78476296e2173": name = "etcd2" case "e8a713dd90604f5a257b97c15945e047ab60ed5b2c4397c5a6b5bf40e1bd2791": name = "/acme" case "9bc6faf9ba8106fae32e8faafd38a1dd6f6d262bec172398cc10bc03c0d6841a": name = "/acme-test" case "d4ccced494a1d5fe8ebdb0a86335a0dab069319912221e5838a132ab18a8bc84": name = "/foo" } jsonStat := fmt.Sprintf(` { "name": "%s", "blkio_stats": { "io_service_bytes_recursive": [ { "major": 252, "minor": 1, "op": "Read", "value": 753664 }, { "major": 252, "minor": 1, "op": "Write" }, { "major": 252, "minor": 1, "op": "Sync" }, { "major": 252, "minor": 1, "op": "Async", "value": 753664 }, { "major": 252, "minor": 1, "op": "Total", "value": 753664 } ], "io_serviced_recursive": [ { "major": 252, "minor": 1, "op": "Read", "value": 26 }, { "major": 252, "minor": 1, "op": "Write" }, { "major": 252, "minor": 1, "op": "Sync" }, { "major": 252, "minor": 1, "op": "Async", "value": 26 }, { "major": 252, "minor": 1, "op": "Total", "value": 26 } ] }, "cpu_stats": { "cpu_usage": { "percpu_usage": [ 17871, 4959158, 1646137, 1231652, 11829401, 244656, 369972, 0 ], "total_usage": 20298847, "usage_in_usermode": 10000000 }, "system_cpu_usage": 24052607520000000, "throttling_data": {} }, "memory_stats": { "limit": 18935443456, "stats": {} }, "precpu_stats": { "cpu_usage": { "percpu_usage": [ 17871, 4959158, 1646137, 1231652, 11829401, 244656, 369972, 0 ], "total_usage": 20298847, "usage_in_usermode": 10000000 }, "system_cpu_usage": 24052599550000000, "throttling_data": {} }, "read": "2016-02-24T11:42:27.472459608-05:00" }`, name) stat.Body = ioutil.NopCloser(strings.NewReader(jsonStat)) return stat } func testStats() *types.StatsJSON { stats := &types.StatsJSON{} stats.Read = time.Now() stats.Networks = make(map[string]types.NetworkStats) stats.CPUStats.OnlineCPUs = 2 stats.CPUStats.CPUUsage.PercpuUsage = []uint64{1, 1002, 0, 0} stats.CPUStats.CPUUsage.UsageInUsermode = 100 stats.CPUStats.CPUUsage.TotalUsage = 500 stats.CPUStats.CPUUsage.UsageInKernelmode = 200 stats.CPUStats.SystemUsage = 100 stats.CPUStats.ThrottlingData.Periods = 1 stats.PreCPUStats.CPUUsage.TotalUsage = 400 stats.PreCPUStats.SystemUsage = 50 stats.MemoryStats.Stats = make(map[string]uint64) stats.MemoryStats.Stats["active_anon"] = 0 stats.MemoryStats.Stats["active_file"] = 1 stats.MemoryStats.Stats["cache"] = 0 stats.MemoryStats.Stats["hierarchical_memory_limit"] = 0 stats.MemoryStats.Stats["inactive_anon"] = 0 stats.MemoryStats.Stats["inactive_file"] = 3 stats.MemoryStats.Stats["mapped_file"] = 0 stats.MemoryStats.Stats["pgfault"] = 2 stats.MemoryStats.Stats["pgmajfault"] = 0 stats.MemoryStats.Stats["pgpgin"] = 0 stats.MemoryStats.Stats["pgpgout"] = 0 stats.MemoryStats.Stats["rss"] = 0 stats.MemoryStats.Stats["rss_huge"] = 0 stats.MemoryStats.Stats["total_active_anon"] = 0 stats.MemoryStats.Stats["total_active_file"] = 0 stats.MemoryStats.Stats["total_cache"] = 0 stats.MemoryStats.Stats["total_inactive_anon"] = 0 stats.MemoryStats.Stats["total_inactive_file"] = 0 stats.MemoryStats.Stats["total_mapped_file"] = 0 stats.MemoryStats.Stats["total_pgfault"] = 0 stats.MemoryStats.Stats["total_pgmajfault"] = 0 stats.MemoryStats.Stats["total_pgpgin"] = 4 stats.MemoryStats.Stats["total_pgpgout"] = 0 stats.MemoryStats.Stats["total_rss"] = 44 stats.MemoryStats.Stats["total_rss_huge"] = 444 stats.MemoryStats.Stats["total_unevictable"] = 0 stats.MemoryStats.Stats["total_writeback"] = 55 stats.MemoryStats.Stats["unevictable"] = 0 stats.MemoryStats.Stats["writeback"] = 0 stats.MemoryStats.MaxUsage = 1001 stats.MemoryStats.Usage = 1111 stats.MemoryStats.Failcnt = 1 stats.MemoryStats.Limit = 2000 stats.Networks["eth0"] = types.NetworkStats{ RxDropped: 1, RxBytes: 2, RxErrors: 3, TxPackets: 4, TxDropped: 1, RxPackets: 2, TxErrors: 3, TxBytes: 4, } stats.Networks["eth1"] = types.NetworkStats{ RxDropped: 5, RxBytes: 6, RxErrors: 7, TxPackets: 8, TxDropped: 5, RxPackets: 6, TxErrors: 7, TxBytes: 8, } sbr := types.BlkioStatEntry{ Major: 6, Minor: 0, Op: "read", Value: 100, } sr := types.BlkioStatEntry{ Major: 6, Minor: 0, Op: "write", Value: 101, } sr2 := types.BlkioStatEntry{ Major: 6, Minor: 1, Op: "write", Value: 201, } stats.BlkioStats.IoServiceBytesRecursive = append( stats.BlkioStats.IoServiceBytesRecursive, sbr) stats.BlkioStats.IoServicedRecursive = append( stats.BlkioStats.IoServicedRecursive, sr) stats.BlkioStats.IoServicedRecursive = append( stats.BlkioStats.IoServicedRecursive, sr2) return stats } func containerStatsWindows() types.ContainerStats { var stat types.ContainerStats jsonStat := ` { "read":"2017-01-11T08:32:46.2413794Z", "preread":"0001-01-01T00:00:00Z", "num_procs":64, "cpu_stats":{ "cpu_usage":{ "total_usage":536718750, "usage_in_kernelmode":390468750, "usage_in_usermode":390468750 }, "throttling_data":{ "periods":0, "throttled_periods":0, "throttled_time":0 } }, "precpu_stats":{ "cpu_usage":{ "total_usage":0, "usage_in_kernelmode":0, "usage_in_usermode":0 }, "throttling_data":{ "periods":0, "throttled_periods":0, "throttled_time":0 } }, "memory_stats":{ "commitbytes":77160448, "commitpeakbytes":105000960, "privateworkingset":59961344 }, "name":"/gt_test_iis", }` stat.Body = ioutil.NopCloser(strings.NewReader(jsonStat)) return stat } func containerInspect() types.ContainerJSON { return types.ContainerJSON{ Config: &container.Config{ Env: []string{ "ENVVAR1=loremipsum", "ENVVAR1FOO=loremipsum", "ENVVAR2=dolorsitamet", "ENVVAR3==ubuntu:10.04", "ENVVAR4", "ENVVAR5=", "ENVVAR6= ", "ENVVAR7=ENVVAR8=ENVVAR9", "PATH=/bin:/sbin", }, }, ContainerJSONBase: &types.ContainerJSONBase{ State: &types.ContainerState{ Health: &types.Health{ FailingStreak: 1, Status: "Unhealthy", }, Status: "running", OOMKilled: false, Pid: 1234, ExitCode: 0, StartedAt: "2018-06-14T05:48:53.266176036Z", FinishedAt: "0001-01-01T00:00:00Z", }, }, } }