mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-03 19:58:17 +00:00 
			
		
		
		
	Update vendor dependencies
Change-Id: I3b1ca9f2687388c831d9d46a4e1de413ffae06ac
This commit is contained in:
		
							
								
								
									
										213
									
								
								Godeps/Godeps.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										213
									
								
								Godeps/Godeps.json
									
									
									
										generated
									
									
									
								
							@@ -1789,10 +1789,6 @@
 | 
				
			|||||||
			"Comment": "v0.5",
 | 
								"Comment": "v0.5",
 | 
				
			||||||
			"Rev": "342cbe0a04158f6dcb03ca0079991a51a4248c02"
 | 
								"Rev": "342cbe0a04158f6dcb03ca0079991a51a4248c02"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			"ImportPath": "github.com/golang/glog",
 | 
					 | 
				
			||||||
			"Rev": "44145f04b68cf362d9c4df2182967c2275eaefed"
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/golang/groupcache/lru",
 | 
								"ImportPath": "github.com/golang/groupcache/lru",
 | 
				
			||||||
			"Rev": "02826c3e79038b59d737d3b1c0a1d937f71a4433"
 | 
								"Rev": "02826c3e79038b59d737d3b1c0a1d937f71a4433"
 | 
				
			||||||
@@ -1847,188 +1843,188 @@
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/accelerators",
 | 
								"ImportPath": "github.com/google/cadvisor/accelerators",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/cache/memory",
 | 
								"ImportPath": "github.com/google/cadvisor/cache/memory",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/client/v2",
 | 
								"ImportPath": "github.com/google/cadvisor/client/v2",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/collector",
 | 
								"ImportPath": "github.com/google/cadvisor/collector",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/container",
 | 
								"ImportPath": "github.com/google/cadvisor/container",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/container/common",
 | 
								"ImportPath": "github.com/google/cadvisor/container/common",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/container/containerd",
 | 
								"ImportPath": "github.com/google/cadvisor/container/containerd",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/container/crio",
 | 
								"ImportPath": "github.com/google/cadvisor/container/crio",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/container/docker",
 | 
								"ImportPath": "github.com/google/cadvisor/container/docker",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/container/libcontainer",
 | 
								"ImportPath": "github.com/google/cadvisor/container/libcontainer",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/container/mesos",
 | 
								"ImportPath": "github.com/google/cadvisor/container/mesos",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/container/raw",
 | 
								"ImportPath": "github.com/google/cadvisor/container/raw",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/container/rkt",
 | 
								"ImportPath": "github.com/google/cadvisor/container/rkt",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/container/systemd",
 | 
								"ImportPath": "github.com/google/cadvisor/container/systemd",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/devicemapper",
 | 
								"ImportPath": "github.com/google/cadvisor/devicemapper",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/events",
 | 
								"ImportPath": "github.com/google/cadvisor/events",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/fs",
 | 
								"ImportPath": "github.com/google/cadvisor/fs",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/info/v1",
 | 
								"ImportPath": "github.com/google/cadvisor/info/v1",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/info/v2",
 | 
								"ImportPath": "github.com/google/cadvisor/info/v2",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/machine",
 | 
								"ImportPath": "github.com/google/cadvisor/machine",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/manager",
 | 
								"ImportPath": "github.com/google/cadvisor/manager",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/manager/watcher",
 | 
								"ImportPath": "github.com/google/cadvisor/manager/watcher",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/manager/watcher/raw",
 | 
								"ImportPath": "github.com/google/cadvisor/manager/watcher/raw",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/manager/watcher/rkt",
 | 
								"ImportPath": "github.com/google/cadvisor/manager/watcher/rkt",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/metrics",
 | 
								"ImportPath": "github.com/google/cadvisor/metrics",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/storage",
 | 
								"ImportPath": "github.com/google/cadvisor/storage",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/summary",
 | 
								"ImportPath": "github.com/google/cadvisor/summary",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/utils",
 | 
								"ImportPath": "github.com/google/cadvisor/utils",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/utils/cloudinfo",
 | 
								"ImportPath": "github.com/google/cadvisor/utils/cloudinfo",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/utils/cpuload",
 | 
								"ImportPath": "github.com/google/cadvisor/utils/cpuload",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/utils/cpuload/netlink",
 | 
								"ImportPath": "github.com/google/cadvisor/utils/cpuload/netlink",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/utils/docker",
 | 
								"ImportPath": "github.com/google/cadvisor/utils/docker",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/utils/oomparser",
 | 
								"ImportPath": "github.com/google/cadvisor/utils/oomparser",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/utils/sysfs",
 | 
								"ImportPath": "github.com/google/cadvisor/utils/sysfs",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/utils/sysinfo",
 | 
								"ImportPath": "github.com/google/cadvisor/utils/sysinfo",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/version",
 | 
								"ImportPath": "github.com/google/cadvisor/version",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/cadvisor/zfs",
 | 
								"ImportPath": "github.com/google/cadvisor/zfs",
 | 
				
			||||||
			"Comment": "v0.31.0",
 | 
								"Comment": "v0.31.0-34-g4c77cd7d7f7114",
 | 
				
			||||||
			"Rev": "fc17731afdcf184832482e324913c8f1a91b54ee"
 | 
								"Rev": "4c77cd7d7f7114bc8643c5a7d0fd1cbbb661d9c0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/google/certificate-transparency-go",
 | 
								"ImportPath": "github.com/google/certificate-transparency-go",
 | 
				
			||||||
@@ -2361,6 +2357,11 @@
 | 
				
			|||||||
			"ImportPath": "github.com/kardianos/osext",
 | 
								"ImportPath": "github.com/kardianos/osext",
 | 
				
			||||||
			"Rev": "8fef92e41e22a70e700a96b29f066cda30ea24ef"
 | 
								"Rev": "8fef92e41e22a70e700a96b29f066cda30ea24ef"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								"ImportPath": "github.com/karrick/godirwalk",
 | 
				
			||||||
 | 
								"Comment": "v1.7.5",
 | 
				
			||||||
 | 
								"Rev": "2de2192f9e35ce981c152a873ed943b93b79ced4"
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/kisielk/sqlstruct",
 | 
								"ImportPath": "github.com/kisielk/sqlstruct",
 | 
				
			||||||
			"Rev": "648daed35d49dac24a4bff253b190a80da3ab6a5"
 | 
								"Rev": "648daed35d49dac24a4bff253b190a80da3ab6a5"
 | 
				
			||||||
@@ -2380,7 +2381,7 @@
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/kubernetes/repo-infra/kazel",
 | 
								"ImportPath": "github.com/kubernetes/repo-infra/kazel",
 | 
				
			||||||
			"Rev": "d9bb9fdc907665c61c228baa64fed9b91c7dc1b0"
 | 
								"Rev": "f2459dc75fc429b813d92c0622b408fd7f0d4cac"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/lib/pq",
 | 
								"ImportPath": "github.com/lib/pq",
 | 
				
			||||||
@@ -3002,6 +3003,10 @@
 | 
				
			|||||||
			"ImportPath": "github.com/shurcooL/sanitized_anchor_name",
 | 
								"ImportPath": "github.com/shurcooL/sanitized_anchor_name",
 | 
				
			||||||
			"Rev": "10ef21a441db47d8b13ebcc5fd2310f636973c77"
 | 
								"Rev": "10ef21a441db47d8b13ebcc5fd2310f636973c77"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								"ImportPath": "github.com/sigma/go-inotify",
 | 
				
			||||||
 | 
								"Rev": "c87b6cf5033d2c6486046f045eeebdc3d910fd38"
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/sirupsen/logrus",
 | 
								"ImportPath": "github.com/sirupsen/logrus",
 | 
				
			||||||
			"Comment": "v1.0.3-11-g89742aefa4b206",
 | 
								"Comment": "v1.0.3-11-g89742aefa4b206",
 | 
				
			||||||
@@ -3897,100 +3902,104 @@
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "k8s.io/gengo/args",
 | 
								"ImportPath": "k8s.io/gengo/args",
 | 
				
			||||||
			"Rev": "fdcf9f9480fdd5bf2b3c3df9bf4ecd22b25b87e2"
 | 
								"Rev": "51747d6e00da1fc578d5a333a93bb2abcbce7a95"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "k8s.io/gengo/examples/deepcopy-gen/generators",
 | 
								"ImportPath": "k8s.io/gengo/examples/deepcopy-gen/generators",
 | 
				
			||||||
			"Rev": "fdcf9f9480fdd5bf2b3c3df9bf4ecd22b25b87e2"
 | 
								"Rev": "51747d6e00da1fc578d5a333a93bb2abcbce7a95"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "k8s.io/gengo/examples/defaulter-gen/generators",
 | 
								"ImportPath": "k8s.io/gengo/examples/defaulter-gen/generators",
 | 
				
			||||||
			"Rev": "fdcf9f9480fdd5bf2b3c3df9bf4ecd22b25b87e2"
 | 
								"Rev": "51747d6e00da1fc578d5a333a93bb2abcbce7a95"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "k8s.io/gengo/examples/import-boss/generators",
 | 
								"ImportPath": "k8s.io/gengo/examples/import-boss/generators",
 | 
				
			||||||
			"Rev": "fdcf9f9480fdd5bf2b3c3df9bf4ecd22b25b87e2"
 | 
								"Rev": "51747d6e00da1fc578d5a333a93bb2abcbce7a95"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "k8s.io/gengo/examples/set-gen/generators",
 | 
								"ImportPath": "k8s.io/gengo/examples/set-gen/generators",
 | 
				
			||||||
			"Rev": "fdcf9f9480fdd5bf2b3c3df9bf4ecd22b25b87e2"
 | 
								"Rev": "51747d6e00da1fc578d5a333a93bb2abcbce7a95"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "k8s.io/gengo/examples/set-gen/sets",
 | 
								"ImportPath": "k8s.io/gengo/examples/set-gen/sets",
 | 
				
			||||||
			"Rev": "fdcf9f9480fdd5bf2b3c3df9bf4ecd22b25b87e2"
 | 
								"Rev": "51747d6e00da1fc578d5a333a93bb2abcbce7a95"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "k8s.io/gengo/generator",
 | 
								"ImportPath": "k8s.io/gengo/generator",
 | 
				
			||||||
			"Rev": "fdcf9f9480fdd5bf2b3c3df9bf4ecd22b25b87e2"
 | 
								"Rev": "51747d6e00da1fc578d5a333a93bb2abcbce7a95"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "k8s.io/gengo/namer",
 | 
								"ImportPath": "k8s.io/gengo/namer",
 | 
				
			||||||
			"Rev": "fdcf9f9480fdd5bf2b3c3df9bf4ecd22b25b87e2"
 | 
								"Rev": "51747d6e00da1fc578d5a333a93bb2abcbce7a95"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "k8s.io/gengo/parser",
 | 
								"ImportPath": "k8s.io/gengo/parser",
 | 
				
			||||||
			"Rev": "fdcf9f9480fdd5bf2b3c3df9bf4ecd22b25b87e2"
 | 
								"Rev": "51747d6e00da1fc578d5a333a93bb2abcbce7a95"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "k8s.io/gengo/types",
 | 
								"ImportPath": "k8s.io/gengo/types",
 | 
				
			||||||
			"Rev": "fdcf9f9480fdd5bf2b3c3df9bf4ecd22b25b87e2"
 | 
								"Rev": "51747d6e00da1fc578d5a333a93bb2abcbce7a95"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "k8s.io/heapster/metrics/api/v1/types",
 | 
								"ImportPath": "k8s.io/heapster/metrics/api/v1/types",
 | 
				
			||||||
			"Comment": "v1.2.0-beta.1",
 | 
								"Comment": "v1.2.0-beta.1",
 | 
				
			||||||
			"Rev": "c2ac40f1adf8c42a79badddb2a2acd673cae3bcb"
 | 
								"Rev": "c2ac40f1adf8c42a79badddb2a2acd673cae3bcb"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								"ImportPath": "k8s.io/klog",
 | 
				
			||||||
 | 
								"Rev": "8139d8cb77af419532b33dfa7dd09fbc5f1d344f"
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "k8s.io/kube-openapi/cmd/openapi-gen",
 | 
								"ImportPath": "k8s.io/kube-openapi/cmd/openapi-gen",
 | 
				
			||||||
			"Rev": "72693cb1fadd73ae2742f6fe29af77d1aecdd8cd"
 | 
								"Rev": "c59034cc13d587f5ef4e85ca0ade0c1866ae8e1d"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "k8s.io/kube-openapi/cmd/openapi-gen/args",
 | 
								"ImportPath": "k8s.io/kube-openapi/cmd/openapi-gen/args",
 | 
				
			||||||
			"Rev": "72693cb1fadd73ae2742f6fe29af77d1aecdd8cd"
 | 
								"Rev": "c59034cc13d587f5ef4e85ca0ade0c1866ae8e1d"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "k8s.io/kube-openapi/pkg/aggregator",
 | 
								"ImportPath": "k8s.io/kube-openapi/pkg/aggregator",
 | 
				
			||||||
			"Rev": "72693cb1fadd73ae2742f6fe29af77d1aecdd8cd"
 | 
								"Rev": "c59034cc13d587f5ef4e85ca0ade0c1866ae8e1d"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "k8s.io/kube-openapi/pkg/builder",
 | 
								"ImportPath": "k8s.io/kube-openapi/pkg/builder",
 | 
				
			||||||
			"Rev": "72693cb1fadd73ae2742f6fe29af77d1aecdd8cd"
 | 
								"Rev": "c59034cc13d587f5ef4e85ca0ade0c1866ae8e1d"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "k8s.io/kube-openapi/pkg/common",
 | 
								"ImportPath": "k8s.io/kube-openapi/pkg/common",
 | 
				
			||||||
			"Rev": "72693cb1fadd73ae2742f6fe29af77d1aecdd8cd"
 | 
								"Rev": "c59034cc13d587f5ef4e85ca0ade0c1866ae8e1d"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "k8s.io/kube-openapi/pkg/generators",
 | 
								"ImportPath": "k8s.io/kube-openapi/pkg/generators",
 | 
				
			||||||
			"Rev": "72693cb1fadd73ae2742f6fe29af77d1aecdd8cd"
 | 
								"Rev": "c59034cc13d587f5ef4e85ca0ade0c1866ae8e1d"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "k8s.io/kube-openapi/pkg/generators/rules",
 | 
								"ImportPath": "k8s.io/kube-openapi/pkg/generators/rules",
 | 
				
			||||||
			"Rev": "72693cb1fadd73ae2742f6fe29af77d1aecdd8cd"
 | 
								"Rev": "c59034cc13d587f5ef4e85ca0ade0c1866ae8e1d"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "k8s.io/kube-openapi/pkg/handler",
 | 
								"ImportPath": "k8s.io/kube-openapi/pkg/handler",
 | 
				
			||||||
			"Rev": "72693cb1fadd73ae2742f6fe29af77d1aecdd8cd"
 | 
								"Rev": "c59034cc13d587f5ef4e85ca0ade0c1866ae8e1d"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "k8s.io/kube-openapi/pkg/util",
 | 
								"ImportPath": "k8s.io/kube-openapi/pkg/util",
 | 
				
			||||||
			"Rev": "72693cb1fadd73ae2742f6fe29af77d1aecdd8cd"
 | 
								"Rev": "c59034cc13d587f5ef4e85ca0ade0c1866ae8e1d"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "k8s.io/kube-openapi/pkg/util/proto",
 | 
								"ImportPath": "k8s.io/kube-openapi/pkg/util/proto",
 | 
				
			||||||
			"Rev": "72693cb1fadd73ae2742f6fe29af77d1aecdd8cd"
 | 
								"Rev": "c59034cc13d587f5ef4e85ca0ade0c1866ae8e1d"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "k8s.io/kube-openapi/pkg/util/proto/testing",
 | 
								"ImportPath": "k8s.io/kube-openapi/pkg/util/proto/testing",
 | 
				
			||||||
			"Rev": "72693cb1fadd73ae2742f6fe29af77d1aecdd8cd"
 | 
								"Rev": "c59034cc13d587f5ef4e85ca0ade0c1866ae8e1d"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "k8s.io/kube-openapi/pkg/util/proto/validation",
 | 
								"ImportPath": "k8s.io/kube-openapi/pkg/util/proto/validation",
 | 
				
			||||||
			"Rev": "72693cb1fadd73ae2742f6fe29af77d1aecdd8cd"
 | 
								"Rev": "c59034cc13d587f5ef4e85ca0ade0c1866ae8e1d"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "k8s.io/kube-openapi/pkg/util/sets",
 | 
								"ImportPath": "k8s.io/kube-openapi/pkg/util/sets",
 | 
				
			||||||
			"Rev": "72693cb1fadd73ae2742f6fe29af77d1aecdd8cd"
 | 
								"Rev": "c59034cc13d587f5ef4e85ca0ade0c1866ae8e1d"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "k8s.io/utils/clock",
 | 
								"ImportPath": "k8s.io/utils/clock",
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										466
									
								
								Godeps/LICENSES
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										466
									
								
								Godeps/LICENSES
									
									
									
										generated
									
									
									
								
							@@ -50388,205 +50388,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			|||||||
================================================================================
 | 
					================================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
================================================================================
 | 
					 | 
				
			||||||
= vendor/github.com/golang/glog licensed under: =
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Apache License
 | 
					 | 
				
			||||||
Version 2.0, January 2004
 | 
					 | 
				
			||||||
http://www.apache.org/licenses/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
1. Definitions.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"License" shall mean the terms and conditions for use, reproduction, and
 | 
					 | 
				
			||||||
distribution as defined by Sections 1 through 9 of this document.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"Licensor" shall mean the copyright owner or entity authorized by the copyright
 | 
					 | 
				
			||||||
owner that is granting the License.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"Legal Entity" shall mean the union of the acting entity and all other entities
 | 
					 | 
				
			||||||
that control, are controlled by, or are under common control with that entity.
 | 
					 | 
				
			||||||
For the purposes of this definition, "control" means (i) the power, direct or
 | 
					 | 
				
			||||||
indirect, to cause the direction or management of such entity, whether by
 | 
					 | 
				
			||||||
contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
 | 
					 | 
				
			||||||
outstanding shares, or (iii) beneficial ownership of such entity.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"You" (or "Your") shall mean an individual or Legal Entity exercising
 | 
					 | 
				
			||||||
permissions granted by this License.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"Source" form shall mean the preferred form for making modifications, including
 | 
					 | 
				
			||||||
but not limited to software source code, documentation source, and configuration
 | 
					 | 
				
			||||||
files.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"Object" form shall mean any form resulting from mechanical transformation or
 | 
					 | 
				
			||||||
translation of a Source form, including but not limited to compiled object code,
 | 
					 | 
				
			||||||
generated documentation, and conversions to other media types.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"Work" shall mean the work of authorship, whether in Source or Object form, made
 | 
					 | 
				
			||||||
available under the License, as indicated by a copyright notice that is included
 | 
					 | 
				
			||||||
in or attached to the work (an example is provided in the Appendix below).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"Derivative Works" shall mean any work, whether in Source or Object form, that
 | 
					 | 
				
			||||||
is based on (or derived from) the Work and for which the editorial revisions,
 | 
					 | 
				
			||||||
annotations, elaborations, or other modifications represent, as a whole, an
 | 
					 | 
				
			||||||
original work of authorship. For the purposes of this License, Derivative Works
 | 
					 | 
				
			||||||
shall not include works that remain separable from, or merely link (or bind by
 | 
					 | 
				
			||||||
name) to the interfaces of, the Work and Derivative Works thereof.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"Contribution" shall mean any work of authorship, including the original version
 | 
					 | 
				
			||||||
of the Work and any modifications or additions to that Work or Derivative Works
 | 
					 | 
				
			||||||
thereof, that is intentionally submitted to Licensor for inclusion in the Work
 | 
					 | 
				
			||||||
by the copyright owner or by an individual or Legal Entity authorized to submit
 | 
					 | 
				
			||||||
on behalf of the copyright owner. For the purposes of this definition,
 | 
					 | 
				
			||||||
"submitted" means any form of electronic, verbal, or written communication sent
 | 
					 | 
				
			||||||
to the Licensor or its representatives, including but not limited to
 | 
					 | 
				
			||||||
communication on electronic mailing lists, source code control systems, and
 | 
					 | 
				
			||||||
issue tracking systems that are managed by, or on behalf of, the Licensor for
 | 
					 | 
				
			||||||
the purpose of discussing and improving the Work, but excluding communication
 | 
					 | 
				
			||||||
that is conspicuously marked or otherwise designated in writing by the copyright
 | 
					 | 
				
			||||||
owner as "Not a Contribution."
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf
 | 
					 | 
				
			||||||
of whom a Contribution has been received by Licensor and subsequently
 | 
					 | 
				
			||||||
incorporated within the Work.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
2. Grant of Copyright License.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Subject to the terms and conditions of this License, each Contributor hereby
 | 
					 | 
				
			||||||
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
 | 
					 | 
				
			||||||
irrevocable copyright license to reproduce, prepare Derivative Works of,
 | 
					 | 
				
			||||||
publicly display, publicly perform, sublicense, and distribute the Work and such
 | 
					 | 
				
			||||||
Derivative Works in Source or Object form.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
3. Grant of Patent License.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Subject to the terms and conditions of this License, each Contributor hereby
 | 
					 | 
				
			||||||
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
 | 
					 | 
				
			||||||
irrevocable (except as stated in this section) patent license to make, have
 | 
					 | 
				
			||||||
made, use, offer to sell, sell, import, and otherwise transfer the Work, where
 | 
					 | 
				
			||||||
such license applies only to those patent claims licensable by such Contributor
 | 
					 | 
				
			||||||
that are necessarily infringed by their Contribution(s) alone or by combination
 | 
					 | 
				
			||||||
of their Contribution(s) with the Work to which such Contribution(s) was
 | 
					 | 
				
			||||||
submitted. If You institute patent litigation against any entity (including a
 | 
					 | 
				
			||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work or a
 | 
					 | 
				
			||||||
Contribution incorporated within the Work constitutes direct or contributory
 | 
					 | 
				
			||||||
patent infringement, then any patent licenses granted to You under this License
 | 
					 | 
				
			||||||
for that Work shall terminate as of the date such litigation is filed.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
4. Redistribution.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
You may reproduce and distribute copies of the Work or Derivative Works thereof
 | 
					 | 
				
			||||||
in any medium, with or without modifications, and in Source or Object form,
 | 
					 | 
				
			||||||
provided that You meet the following conditions:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
You must give any other recipients of the Work or Derivative Works a copy of
 | 
					 | 
				
			||||||
this License; and
 | 
					 | 
				
			||||||
You must cause any modified files to carry prominent notices stating that You
 | 
					 | 
				
			||||||
changed the files; and
 | 
					 | 
				
			||||||
You must retain, in the Source form of any Derivative Works that You distribute,
 | 
					 | 
				
			||||||
all copyright, patent, trademark, and attribution notices from the Source form
 | 
					 | 
				
			||||||
of the Work, excluding those notices that do not pertain to any part of the
 | 
					 | 
				
			||||||
Derivative Works; and
 | 
					 | 
				
			||||||
If the Work includes a "NOTICE" text file as part of its distribution, then any
 | 
					 | 
				
			||||||
Derivative Works that You distribute must include a readable copy of the
 | 
					 | 
				
			||||||
attribution notices contained within such NOTICE file, excluding those notices
 | 
					 | 
				
			||||||
that do not pertain to any part of the Derivative Works, in at least one of the
 | 
					 | 
				
			||||||
following places: within a NOTICE text file distributed as part of the
 | 
					 | 
				
			||||||
Derivative Works; within the Source form or documentation, if provided along
 | 
					 | 
				
			||||||
with the Derivative Works; or, within a display generated by the Derivative
 | 
					 | 
				
			||||||
Works, if and wherever such third-party notices normally appear. The contents of
 | 
					 | 
				
			||||||
the NOTICE file are for informational purposes only and do not modify the
 | 
					 | 
				
			||||||
License. You may add Your own attribution notices within Derivative Works that
 | 
					 | 
				
			||||||
You distribute, alongside or as an addendum to the NOTICE text from the Work,
 | 
					 | 
				
			||||||
provided that such additional attribution notices cannot be construed as
 | 
					 | 
				
			||||||
modifying the License.
 | 
					 | 
				
			||||||
You may add Your own copyright statement to Your modifications and may provide
 | 
					 | 
				
			||||||
additional or different license terms and conditions for use, reproduction, or
 | 
					 | 
				
			||||||
distribution of Your modifications, or for any such Derivative Works as a whole,
 | 
					 | 
				
			||||||
provided Your use, reproduction, and distribution of the Work otherwise complies
 | 
					 | 
				
			||||||
with the conditions stated in this License.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
5. Submission of Contributions.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Unless You explicitly state otherwise, any Contribution intentionally submitted
 | 
					 | 
				
			||||||
for inclusion in the Work by You to the Licensor shall be under the terms and
 | 
					 | 
				
			||||||
conditions of this License, without any additional terms or conditions.
 | 
					 | 
				
			||||||
Notwithstanding the above, nothing herein shall supersede or modify the terms of
 | 
					 | 
				
			||||||
any separate license agreement you may have executed with Licensor regarding
 | 
					 | 
				
			||||||
such Contributions.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
6. Trademarks.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
This License does not grant permission to use the trade names, trademarks,
 | 
					 | 
				
			||||||
service marks, or product names of the Licensor, except as required for
 | 
					 | 
				
			||||||
reasonable and customary use in describing the origin of the Work and
 | 
					 | 
				
			||||||
reproducing the content of the NOTICE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
7. Disclaimer of Warranty.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Unless required by applicable law or agreed to in writing, Licensor provides the
 | 
					 | 
				
			||||||
Work (and each Contributor provides its Contributions) on an "AS IS" BASIS,
 | 
					 | 
				
			||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
 | 
					 | 
				
			||||||
including, without limitation, any warranties or conditions of TITLE,
 | 
					 | 
				
			||||||
NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
 | 
					 | 
				
			||||||
solely responsible for determining the appropriateness of using or
 | 
					 | 
				
			||||||
redistributing the Work and assume any risks associated with Your exercise of
 | 
					 | 
				
			||||||
permissions under this License.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
8. Limitation of Liability.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
In no event and under no legal theory, whether in tort (including negligence),
 | 
					 | 
				
			||||||
contract, or otherwise, unless required by applicable law (such as deliberate
 | 
					 | 
				
			||||||
and grossly negligent acts) or agreed to in writing, shall any Contributor be
 | 
					 | 
				
			||||||
liable to You for damages, including any direct, indirect, special, incidental,
 | 
					 | 
				
			||||||
or consequential damages of any character arising as a result of this License or
 | 
					 | 
				
			||||||
out of the use or inability to use the Work (including but not limited to
 | 
					 | 
				
			||||||
damages for loss of goodwill, work stoppage, computer failure or malfunction, or
 | 
					 | 
				
			||||||
any and all other commercial damages or losses), even if such Contributor has
 | 
					 | 
				
			||||||
been advised of the possibility of such damages.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
9. Accepting Warranty or Additional Liability.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
While redistributing the Work or Derivative Works thereof, You may choose to
 | 
					 | 
				
			||||||
offer, and charge a fee for, acceptance of support, warranty, indemnity, or
 | 
					 | 
				
			||||||
other liability obligations and/or rights consistent with this License. However,
 | 
					 | 
				
			||||||
in accepting such obligations, You may act only on Your own behalf and on Your
 | 
					 | 
				
			||||||
sole responsibility, not on behalf of any other Contributor, and only if You
 | 
					 | 
				
			||||||
agree to indemnify, defend, and hold each Contributor harmless for any liability
 | 
					 | 
				
			||||||
incurred by, or claims asserted against, such Contributor by reason of your
 | 
					 | 
				
			||||||
accepting any such warranty or additional liability.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
END OF TERMS AND CONDITIONS
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
APPENDIX: How to apply the Apache License to your work
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
To apply the Apache License to your work, attach the following boilerplate
 | 
					 | 
				
			||||||
notice, with the fields enclosed by brackets "[]" replaced with your own
 | 
					 | 
				
			||||||
identifying information. (Don't include the brackets!) The text should be
 | 
					 | 
				
			||||||
enclosed in the appropriate comment syntax for the file format. We also
 | 
					 | 
				
			||||||
recommend that a file or class name and description of purpose be included on
 | 
					 | 
				
			||||||
the same "printed page" as the copyright notice for easier identification within
 | 
					 | 
				
			||||||
third-party archives.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   Copyright [yyyy] [name of copyright owner]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
					 | 
				
			||||||
   you may not use this file except in compliance with the License.
 | 
					 | 
				
			||||||
   You may obtain a copy of the License at
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     http://www.apache.org/licenses/LICENSE-2.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   Unless required by applicable law or agreed to in writing, software
 | 
					 | 
				
			||||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
					 | 
				
			||||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
					 | 
				
			||||||
   See the License for the specific language governing permissions and
 | 
					 | 
				
			||||||
   limitations under the License.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
= vendor/github.com/golang/glog/LICENSE 19cbd64715b51267a47bf3750cc6a8a5
 | 
					 | 
				
			||||||
================================================================================
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
================================================================================
 | 
					================================================================================
 | 
				
			||||||
= vendor/github.com/golang/groupcache/lru licensed under: =
 | 
					= vendor/github.com/golang/groupcache/lru licensed under: =
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -72487,6 +72288,39 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			|||||||
================================================================================
 | 
					================================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					================================================================================
 | 
				
			||||||
 | 
					= vendor/github.com/karrick/godirwalk licensed under: =
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					BSD 2-Clause License
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Copyright (c) 2017, Karrick McDermott
 | 
				
			||||||
 | 
					All rights reserved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					modification, are permitted provided that the following conditions are met:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Redistributions of source code must retain the above copyright notice, this
 | 
				
			||||||
 | 
					  list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Redistributions in binary form must reproduce the above copyright notice,
 | 
				
			||||||
 | 
					  this list of conditions and the following disclaimer in the documentation
 | 
				
			||||||
 | 
					  and/or other materials provided with the distribution.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
				
			||||||
 | 
					AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
				
			||||||
 | 
					IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
				
			||||||
 | 
					DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
 | 
				
			||||||
 | 
					FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
				
			||||||
 | 
					DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 | 
				
			||||||
 | 
					SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 | 
				
			||||||
 | 
					CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 | 
				
			||||||
 | 
					OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
				
			||||||
 | 
					OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					= vendor/github.com/karrick/godirwalk/LICENSE 7bea66fc0a31c6329f9392034bee75d2
 | 
				
			||||||
 | 
					================================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
================================================================================
 | 
					================================================================================
 | 
				
			||||||
= vendor/github.com/kisielk/sqlstruct licensed under: =
 | 
					= vendor/github.com/kisielk/sqlstruct licensed under: =
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -87880,6 +87714,41 @@ THE SOFTWARE.
 | 
				
			|||||||
================================================================================
 | 
					================================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					================================================================================
 | 
				
			||||||
 | 
					= vendor/github.com/sigma/go-inotify licensed under: =
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Copyright (c) 2009 The Go Authors. All rights reserved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					modification, are permitted provided that the following conditions are
 | 
				
			||||||
 | 
					met:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   * Redistributions of source code must retain the above copyright
 | 
				
			||||||
 | 
					notice, this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					   * Redistributions in binary form must reproduce the above
 | 
				
			||||||
 | 
					copyright notice, this list of conditions and the following disclaimer
 | 
				
			||||||
 | 
					in the documentation and/or other materials provided with the
 | 
				
			||||||
 | 
					distribution.
 | 
				
			||||||
 | 
					   * Neither the name of Google Inc. nor the names of its
 | 
				
			||||||
 | 
					contributors may be used to endorse or promote products derived from
 | 
				
			||||||
 | 
					this software without specific prior written permission.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
				
			||||||
 | 
					"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
				
			||||||
 | 
					LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
				
			||||||
 | 
					A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
				
			||||||
 | 
					OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
				
			||||||
 | 
					SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
				
			||||||
 | 
					LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
				
			||||||
 | 
					DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
				
			||||||
 | 
					THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
				
			||||||
 | 
					(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
				
			||||||
 | 
					OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					= vendor/github.com/sigma/go-inotify/LICENSE 5d4950ecb7b26d2c5e4e7b4e0dd74707
 | 
				
			||||||
 | 
					================================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
================================================================================
 | 
					================================================================================
 | 
				
			||||||
= vendor/github.com/sirupsen/logrus licensed under: =
 | 
					= vendor/github.com/sirupsen/logrus licensed under: =
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -108888,6 +108757,205 @@ Apache License
 | 
				
			|||||||
================================================================================
 | 
					================================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					================================================================================
 | 
				
			||||||
 | 
					= vendor/k8s.io/klog licensed under: =
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Apache License
 | 
				
			||||||
 | 
					Version 2.0, January 2004
 | 
				
			||||||
 | 
					http://www.apache.org/licenses/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. Definitions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"License" shall mean the terms and conditions for use, reproduction, and
 | 
				
			||||||
 | 
					distribution as defined by Sections 1 through 9 of this document.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"Licensor" shall mean the copyright owner or entity authorized by the copyright
 | 
				
			||||||
 | 
					owner that is granting the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"Legal Entity" shall mean the union of the acting entity and all other entities
 | 
				
			||||||
 | 
					that control, are controlled by, or are under common control with that entity.
 | 
				
			||||||
 | 
					For the purposes of this definition, "control" means (i) the power, direct or
 | 
				
			||||||
 | 
					indirect, to cause the direction or management of such entity, whether by
 | 
				
			||||||
 | 
					contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
 | 
				
			||||||
 | 
					outstanding shares, or (iii) beneficial ownership of such entity.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"You" (or "Your") shall mean an individual or Legal Entity exercising
 | 
				
			||||||
 | 
					permissions granted by this License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"Source" form shall mean the preferred form for making modifications, including
 | 
				
			||||||
 | 
					but not limited to software source code, documentation source, and configuration
 | 
				
			||||||
 | 
					files.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"Object" form shall mean any form resulting from mechanical transformation or
 | 
				
			||||||
 | 
					translation of a Source form, including but not limited to compiled object code,
 | 
				
			||||||
 | 
					generated documentation, and conversions to other media types.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"Work" shall mean the work of authorship, whether in Source or Object form, made
 | 
				
			||||||
 | 
					available under the License, as indicated by a copyright notice that is included
 | 
				
			||||||
 | 
					in or attached to the work (an example is provided in the Appendix below).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"Derivative Works" shall mean any work, whether in Source or Object form, that
 | 
				
			||||||
 | 
					is based on (or derived from) the Work and for which the editorial revisions,
 | 
				
			||||||
 | 
					annotations, elaborations, or other modifications represent, as a whole, an
 | 
				
			||||||
 | 
					original work of authorship. For the purposes of this License, Derivative Works
 | 
				
			||||||
 | 
					shall not include works that remain separable from, or merely link (or bind by
 | 
				
			||||||
 | 
					name) to the interfaces of, the Work and Derivative Works thereof.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"Contribution" shall mean any work of authorship, including the original version
 | 
				
			||||||
 | 
					of the Work and any modifications or additions to that Work or Derivative Works
 | 
				
			||||||
 | 
					thereof, that is intentionally submitted to Licensor for inclusion in the Work
 | 
				
			||||||
 | 
					by the copyright owner or by an individual or Legal Entity authorized to submit
 | 
				
			||||||
 | 
					on behalf of the copyright owner. For the purposes of this definition,
 | 
				
			||||||
 | 
					"submitted" means any form of electronic, verbal, or written communication sent
 | 
				
			||||||
 | 
					to the Licensor or its representatives, including but not limited to
 | 
				
			||||||
 | 
					communication on electronic mailing lists, source code control systems, and
 | 
				
			||||||
 | 
					issue tracking systems that are managed by, or on behalf of, the Licensor for
 | 
				
			||||||
 | 
					the purpose of discussing and improving the Work, but excluding communication
 | 
				
			||||||
 | 
					that is conspicuously marked or otherwise designated in writing by the copyright
 | 
				
			||||||
 | 
					owner as "Not a Contribution."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"Contributor" shall mean Licensor and any individual or Legal Entity on behalf
 | 
				
			||||||
 | 
					of whom a Contribution has been received by Licensor and subsequently
 | 
				
			||||||
 | 
					incorporated within the Work.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					2. Grant of Copyright License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Subject to the terms and conditions of this License, each Contributor hereby
 | 
				
			||||||
 | 
					grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
 | 
				
			||||||
 | 
					irrevocable copyright license to reproduce, prepare Derivative Works of,
 | 
				
			||||||
 | 
					publicly display, publicly perform, sublicense, and distribute the Work and such
 | 
				
			||||||
 | 
					Derivative Works in Source or Object form.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					3. Grant of Patent License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Subject to the terms and conditions of this License, each Contributor hereby
 | 
				
			||||||
 | 
					grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
 | 
				
			||||||
 | 
					irrevocable (except as stated in this section) patent license to make, have
 | 
				
			||||||
 | 
					made, use, offer to sell, sell, import, and otherwise transfer the Work, where
 | 
				
			||||||
 | 
					such license applies only to those patent claims licensable by such Contributor
 | 
				
			||||||
 | 
					that are necessarily infringed by their Contribution(s) alone or by combination
 | 
				
			||||||
 | 
					of their Contribution(s) with the Work to which such Contribution(s) was
 | 
				
			||||||
 | 
					submitted. If You institute patent litigation against any entity (including a
 | 
				
			||||||
 | 
					cross-claim or counterclaim in a lawsuit) alleging that the Work or a
 | 
				
			||||||
 | 
					Contribution incorporated within the Work constitutes direct or contributory
 | 
				
			||||||
 | 
					patent infringement, then any patent licenses granted to You under this License
 | 
				
			||||||
 | 
					for that Work shall terminate as of the date such litigation is filed.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					4. Redistribution.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You may reproduce and distribute copies of the Work or Derivative Works thereof
 | 
				
			||||||
 | 
					in any medium, with or without modifications, and in Source or Object form,
 | 
				
			||||||
 | 
					provided that You meet the following conditions:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You must give any other recipients of the Work or Derivative Works a copy of
 | 
				
			||||||
 | 
					this License; and
 | 
				
			||||||
 | 
					You must cause any modified files to carry prominent notices stating that You
 | 
				
			||||||
 | 
					changed the files; and
 | 
				
			||||||
 | 
					You must retain, in the Source form of any Derivative Works that You distribute,
 | 
				
			||||||
 | 
					all copyright, patent, trademark, and attribution notices from the Source form
 | 
				
			||||||
 | 
					of the Work, excluding those notices that do not pertain to any part of the
 | 
				
			||||||
 | 
					Derivative Works; and
 | 
				
			||||||
 | 
					If the Work includes a "NOTICE" text file as part of its distribution, then any
 | 
				
			||||||
 | 
					Derivative Works that You distribute must include a readable copy of the
 | 
				
			||||||
 | 
					attribution notices contained within such NOTICE file, excluding those notices
 | 
				
			||||||
 | 
					that do not pertain to any part of the Derivative Works, in at least one of the
 | 
				
			||||||
 | 
					following places: within a NOTICE text file distributed as part of the
 | 
				
			||||||
 | 
					Derivative Works; within the Source form or documentation, if provided along
 | 
				
			||||||
 | 
					with the Derivative Works; or, within a display generated by the Derivative
 | 
				
			||||||
 | 
					Works, if and wherever such third-party notices normally appear. The contents of
 | 
				
			||||||
 | 
					the NOTICE file are for informational purposes only and do not modify the
 | 
				
			||||||
 | 
					License. You may add Your own attribution notices within Derivative Works that
 | 
				
			||||||
 | 
					You distribute, alongside or as an addendum to the NOTICE text from the Work,
 | 
				
			||||||
 | 
					provided that such additional attribution notices cannot be construed as
 | 
				
			||||||
 | 
					modifying the License.
 | 
				
			||||||
 | 
					You may add Your own copyright statement to Your modifications and may provide
 | 
				
			||||||
 | 
					additional or different license terms and conditions for use, reproduction, or
 | 
				
			||||||
 | 
					distribution of Your modifications, or for any such Derivative Works as a whole,
 | 
				
			||||||
 | 
					provided Your use, reproduction, and distribution of the Work otherwise complies
 | 
				
			||||||
 | 
					with the conditions stated in this License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					5. Submission of Contributions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless You explicitly state otherwise, any Contribution intentionally submitted
 | 
				
			||||||
 | 
					for inclusion in the Work by You to the Licensor shall be under the terms and
 | 
				
			||||||
 | 
					conditions of this License, without any additional terms or conditions.
 | 
				
			||||||
 | 
					Notwithstanding the above, nothing herein shall supersede or modify the terms of
 | 
				
			||||||
 | 
					any separate license agreement you may have executed with Licensor regarding
 | 
				
			||||||
 | 
					such Contributions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					6. Trademarks.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This License does not grant permission to use the trade names, trademarks,
 | 
				
			||||||
 | 
					service marks, or product names of the Licensor, except as required for
 | 
				
			||||||
 | 
					reasonable and customary use in describing the origin of the Work and
 | 
				
			||||||
 | 
					reproducing the content of the NOTICE file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					7. Disclaimer of Warranty.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless required by applicable law or agreed to in writing, Licensor provides the
 | 
				
			||||||
 | 
					Work (and each Contributor provides its Contributions) on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
 | 
				
			||||||
 | 
					including, without limitation, any warranties or conditions of TITLE,
 | 
				
			||||||
 | 
					NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
 | 
				
			||||||
 | 
					solely responsible for determining the appropriateness of using or
 | 
				
			||||||
 | 
					redistributing the Work and assume any risks associated with Your exercise of
 | 
				
			||||||
 | 
					permissions under this License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					8. Limitation of Liability.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In no event and under no legal theory, whether in tort (including negligence),
 | 
				
			||||||
 | 
					contract, or otherwise, unless required by applicable law (such as deliberate
 | 
				
			||||||
 | 
					and grossly negligent acts) or agreed to in writing, shall any Contributor be
 | 
				
			||||||
 | 
					liable to You for damages, including any direct, indirect, special, incidental,
 | 
				
			||||||
 | 
					or consequential damages of any character arising as a result of this License or
 | 
				
			||||||
 | 
					out of the use or inability to use the Work (including but not limited to
 | 
				
			||||||
 | 
					damages for loss of goodwill, work stoppage, computer failure or malfunction, or
 | 
				
			||||||
 | 
					any and all other commercial damages or losses), even if such Contributor has
 | 
				
			||||||
 | 
					been advised of the possibility of such damages.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					9. Accepting Warranty or Additional Liability.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					While redistributing the Work or Derivative Works thereof, You may choose to
 | 
				
			||||||
 | 
					offer, and charge a fee for, acceptance of support, warranty, indemnity, or
 | 
				
			||||||
 | 
					other liability obligations and/or rights consistent with this License. However,
 | 
				
			||||||
 | 
					in accepting such obligations, You may act only on Your own behalf and on Your
 | 
				
			||||||
 | 
					sole responsibility, not on behalf of any other Contributor, and only if You
 | 
				
			||||||
 | 
					agree to indemnify, defend, and hold each Contributor harmless for any liability
 | 
				
			||||||
 | 
					incurred by, or claims asserted against, such Contributor by reason of your
 | 
				
			||||||
 | 
					accepting any such warranty or additional liability.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					END OF TERMS AND CONDITIONS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					APPENDIX: How to apply the Apache License to your work
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					To apply the Apache License to your work, attach the following boilerplate
 | 
				
			||||||
 | 
					notice, with the fields enclosed by brackets "[]" replaced with your own
 | 
				
			||||||
 | 
					identifying information. (Don't include the brackets!) The text should be
 | 
				
			||||||
 | 
					enclosed in the appropriate comment syntax for the file format. We also
 | 
				
			||||||
 | 
					recommend that a file or class name and description of purpose be included on
 | 
				
			||||||
 | 
					the same "printed page" as the copyright notice for easier identification within
 | 
				
			||||||
 | 
					third-party archives.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Copyright [yyyy] [name of copyright owner]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					= vendor/k8s.io/klog/LICENSE 19cbd64715b51267a47bf3750cc6a8a5
 | 
				
			||||||
 | 
					================================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
================================================================================
 | 
					================================================================================
 | 
				
			||||||
= vendor/k8s.io/kube-openapi/cmd/openapi-gen licensed under: =
 | 
					= vendor/k8s.io/kube-openapi/cmd/openapi-gen licensed under: =
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/BUILD
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/BUILD
									
									
									
									
										vendored
									
									
								
							@@ -235,7 +235,6 @@ filegroup(
 | 
				
			|||||||
        "//vendor/github.com/gogo/protobuf/sortkeys:all-srcs",
 | 
					        "//vendor/github.com/gogo/protobuf/sortkeys:all-srcs",
 | 
				
			||||||
        "//vendor/github.com/gogo/protobuf/types:all-srcs",
 | 
					        "//vendor/github.com/gogo/protobuf/types:all-srcs",
 | 
				
			||||||
        "//vendor/github.com/gogo/protobuf/vanity:all-srcs",
 | 
					        "//vendor/github.com/gogo/protobuf/vanity:all-srcs",
 | 
				
			||||||
        "//vendor/github.com/golang/glog:all-srcs",
 | 
					 | 
				
			||||||
        "//vendor/github.com/golang/groupcache/lru:all-srcs",
 | 
					        "//vendor/github.com/golang/groupcache/lru:all-srcs",
 | 
				
			||||||
        "//vendor/github.com/golang/mock/gomock:all-srcs",
 | 
					        "//vendor/github.com/golang/mock/gomock:all-srcs",
 | 
				
			||||||
        "//vendor/github.com/golang/protobuf/jsonpb:all-srcs",
 | 
					        "//vendor/github.com/golang/protobuf/jsonpb:all-srcs",
 | 
				
			||||||
@@ -287,6 +286,7 @@ filegroup(
 | 
				
			|||||||
        "//vendor/github.com/json-iterator/go:all-srcs",
 | 
					        "//vendor/github.com/json-iterator/go:all-srcs",
 | 
				
			||||||
        "//vendor/github.com/jteeuwen/go-bindata:all-srcs",
 | 
					        "//vendor/github.com/jteeuwen/go-bindata:all-srcs",
 | 
				
			||||||
        "//vendor/github.com/kardianos/osext:all-srcs",
 | 
					        "//vendor/github.com/kardianos/osext:all-srcs",
 | 
				
			||||||
 | 
					        "//vendor/github.com/karrick/godirwalk:all-srcs",
 | 
				
			||||||
        "//vendor/github.com/kisielk/sqlstruct:all-srcs",
 | 
					        "//vendor/github.com/kisielk/sqlstruct:all-srcs",
 | 
				
			||||||
        "//vendor/github.com/kr/fs:all-srcs",
 | 
					        "//vendor/github.com/kr/fs:all-srcs",
 | 
				
			||||||
        "//vendor/github.com/kr/pretty:all-srcs",
 | 
					        "//vendor/github.com/kr/pretty:all-srcs",
 | 
				
			||||||
@@ -348,6 +348,7 @@ filegroup(
 | 
				
			|||||||
        "//vendor/github.com/satori/go.uuid:all-srcs",
 | 
					        "//vendor/github.com/satori/go.uuid:all-srcs",
 | 
				
			||||||
        "//vendor/github.com/seccomp/libseccomp-golang:all-srcs",
 | 
					        "//vendor/github.com/seccomp/libseccomp-golang:all-srcs",
 | 
				
			||||||
        "//vendor/github.com/shurcooL/sanitized_anchor_name:all-srcs",
 | 
					        "//vendor/github.com/shurcooL/sanitized_anchor_name:all-srcs",
 | 
				
			||||||
 | 
					        "//vendor/github.com/sigma/go-inotify:all-srcs",
 | 
				
			||||||
        "//vendor/github.com/sirupsen/logrus:all-srcs",
 | 
					        "//vendor/github.com/sirupsen/logrus:all-srcs",
 | 
				
			||||||
        "//vendor/github.com/soheilhy/cmux:all-srcs",
 | 
					        "//vendor/github.com/soheilhy/cmux:all-srcs",
 | 
				
			||||||
        "//vendor/github.com/spf13/afero:all-srcs",
 | 
					        "//vendor/github.com/spf13/afero:all-srcs",
 | 
				
			||||||
@@ -455,6 +456,7 @@ filegroup(
 | 
				
			|||||||
        "//vendor/k8s.io/gengo/parser:all-srcs",
 | 
					        "//vendor/k8s.io/gengo/parser:all-srcs",
 | 
				
			||||||
        "//vendor/k8s.io/gengo/types:all-srcs",
 | 
					        "//vendor/k8s.io/gengo/types:all-srcs",
 | 
				
			||||||
        "//vendor/k8s.io/heapster/metrics/api/v1/types:all-srcs",
 | 
					        "//vendor/k8s.io/heapster/metrics/api/v1/types:all-srcs",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/klog:all-srcs",
 | 
				
			||||||
        "//vendor/k8s.io/kube-openapi/cmd/openapi-gen:all-srcs",
 | 
					        "//vendor/k8s.io/kube-openapi/cmd/openapi-gen:all-srcs",
 | 
				
			||||||
        "//vendor/k8s.io/kube-openapi/pkg/aggregator:all-srcs",
 | 
					        "//vendor/k8s.io/kube-openapi/pkg/aggregator:all-srcs",
 | 
				
			||||||
        "//vendor/k8s.io/kube-openapi/pkg/builder:all-srcs",
 | 
					        "//vendor/k8s.io/kube-openapi/pkg/builder:all-srcs",
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/google/cadvisor/accelerators/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/google/cadvisor/accelerators/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -10,9 +10,9 @@ go_library(
 | 
				
			|||||||
    importpath = "github.com/google/cadvisor/accelerators",
 | 
					    importpath = "github.com/google/cadvisor/accelerators",
 | 
				
			||||||
    visibility = ["//visibility:public"],
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/info/v1:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/info/v1:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/mindprince/gonvml:go_default_library",
 | 
					        "//vendor/github.com/mindprince/gonvml:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										20
									
								
								vendor/github.com/google/cadvisor/accelerators/nvidia.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/github.com/google/cadvisor/accelerators/nvidia.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -26,8 +26,8 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	info "github.com/google/cadvisor/info/v1"
 | 
						info "github.com/google/cadvisor/info/v1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
					 | 
				
			||||||
	"github.com/mindprince/gonvml"
 | 
						"github.com/mindprince/gonvml"
 | 
				
			||||||
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type NvidiaManager struct {
 | 
					type NvidiaManager struct {
 | 
				
			||||||
@@ -50,7 +50,7 @@ const nvidiaVendorId = "0x10de"
 | 
				
			|||||||
// Setup initializes NVML if nvidia devices are present on the node.
 | 
					// Setup initializes NVML if nvidia devices are present on the node.
 | 
				
			||||||
func (nm *NvidiaManager) Setup() {
 | 
					func (nm *NvidiaManager) Setup() {
 | 
				
			||||||
	if !detectDevices(nvidiaVendorId) {
 | 
						if !detectDevices(nvidiaVendorId) {
 | 
				
			||||||
		glog.V(4).Info("No NVIDIA devices found.")
 | 
							klog.V(4).Info("No NVIDIA devices found.")
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -63,7 +63,7 @@ func (nm *NvidiaManager) Setup() {
 | 
				
			|||||||
func detectDevices(vendorId string) bool {
 | 
					func detectDevices(vendorId string) bool {
 | 
				
			||||||
	devices, err := ioutil.ReadDir(sysFsPCIDevicesPath)
 | 
						devices, err := ioutil.ReadDir(sysFsPCIDevicesPath)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.Warningf("Error reading %q: %v", sysFsPCIDevicesPath, err)
 | 
							klog.Warningf("Error reading %q: %v", sysFsPCIDevicesPath, err)
 | 
				
			||||||
		return false
 | 
							return false
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -71,11 +71,11 @@ func detectDevices(vendorId string) bool {
 | 
				
			|||||||
		vendorPath := filepath.Join(sysFsPCIDevicesPath, device.Name(), "vendor")
 | 
							vendorPath := filepath.Join(sysFsPCIDevicesPath, device.Name(), "vendor")
 | 
				
			||||||
		content, err := ioutil.ReadFile(vendorPath)
 | 
							content, err := ioutil.ReadFile(vendorPath)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			glog.V(4).Infof("Error while reading %q: %v", vendorPath, err)
 | 
								klog.V(4).Infof("Error while reading %q: %v", vendorPath, err)
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if strings.EqualFold(strings.TrimSpace(string(content)), vendorId) {
 | 
							if strings.EqualFold(strings.TrimSpace(string(content)), vendorId) {
 | 
				
			||||||
			glog.V(3).Infof("Found device with vendorId %q", vendorId)
 | 
								klog.V(3).Infof("Found device with vendorId %q", vendorId)
 | 
				
			||||||
			return true
 | 
								return true
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -88,26 +88,26 @@ var initializeNVML = func(nm *NvidiaManager) {
 | 
				
			|||||||
	if err := gonvml.Initialize(); err != nil {
 | 
						if err := gonvml.Initialize(); err != nil {
 | 
				
			||||||
		// This is under a logging level because otherwise we may cause
 | 
							// This is under a logging level because otherwise we may cause
 | 
				
			||||||
		// log spam if the drivers/nvml is not installed on the system.
 | 
							// log spam if the drivers/nvml is not installed on the system.
 | 
				
			||||||
		glog.V(4).Infof("Could not initialize NVML: %v", err)
 | 
							klog.V(4).Infof("Could not initialize NVML: %v", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	nm.nvmlInitialized = true
 | 
						nm.nvmlInitialized = true
 | 
				
			||||||
	numDevices, err := gonvml.DeviceCount()
 | 
						numDevices, err := gonvml.DeviceCount()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.Warningf("GPU metrics would not be available. Failed to get the number of nvidia devices: %v", err)
 | 
							klog.Warningf("GPU metrics would not be available. Failed to get the number of nvidia devices: %v", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	glog.V(1).Infof("NVML initialized. Number of nvidia devices: %v", numDevices)
 | 
						klog.V(1).Infof("NVML initialized. Number of nvidia devices: %v", numDevices)
 | 
				
			||||||
	nm.nvidiaDevices = make(map[int]gonvml.Device, numDevices)
 | 
						nm.nvidiaDevices = make(map[int]gonvml.Device, numDevices)
 | 
				
			||||||
	for i := 0; i < int(numDevices); i++ {
 | 
						for i := 0; i < int(numDevices); i++ {
 | 
				
			||||||
		device, err := gonvml.DeviceHandleByIndex(uint(i))
 | 
							device, err := gonvml.DeviceHandleByIndex(uint(i))
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			glog.Warningf("Failed to get nvidia device handle %d: %v", i, err)
 | 
								klog.Warningf("Failed to get nvidia device handle %d: %v", i, err)
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		minorNumber, err := device.MinorNumber()
 | 
							minorNumber, err := device.MinorNumber()
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			glog.Warningf("Failed to get nvidia device minor number: %v", err)
 | 
								klog.Warningf("Failed to get nvidia device minor number: %v", err)
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		nm.nvidiaDevices[int(minorNumber)] = device
 | 
							nm.nvidiaDevices[int(minorNumber)] = device
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/google/cadvisor/cache/memory/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/google/cadvisor/cache/memory/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -7,10 +7,10 @@ go_library(
 | 
				
			|||||||
    importpath = "github.com/google/cadvisor/cache/memory",
 | 
					    importpath = "github.com/google/cadvisor/cache/memory",
 | 
				
			||||||
    visibility = ["//visibility:public"],
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/info/v1:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/info/v1:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/storage:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/storage:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/utils:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/utils:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								vendor/github.com/google/cadvisor/cache/memory/memory.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/google/cadvisor/cache/memory/memory.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -23,13 +23,13 @@ import (
 | 
				
			|||||||
	"github.com/google/cadvisor/storage"
 | 
						"github.com/google/cadvisor/storage"
 | 
				
			||||||
	"github.com/google/cadvisor/utils"
 | 
						"github.com/google/cadvisor/utils"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ErrDataNotFound is the error resulting if failed to find a container in memory cache.
 | 
					// ErrDataNotFound is the error resulting if failed to find a container in memory cache.
 | 
				
			||||||
var ErrDataNotFound = errors.New("unable to find data in memory cache")
 | 
					var ErrDataNotFound = errors.New("unable to find data in memory cache")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TODO(vmarmol): See about refactoring this class, we have an unecessary redirection of containerCache and InMemoryCache.
 | 
					// TODO(vmarmol): See about refactoring this class, we have an unnecessary redirection of containerCache and InMemoryCache.
 | 
				
			||||||
// containerCache is used to store per-container information
 | 
					// containerCache is used to store per-container information
 | 
				
			||||||
type containerCache struct {
 | 
					type containerCache struct {
 | 
				
			||||||
	ref         info.ContainerReference
 | 
						ref         info.ContainerReference
 | 
				
			||||||
@@ -91,7 +91,7 @@ func (self *InMemoryCache) AddStats(cInfo *info.ContainerInfo, stats *info.Conta
 | 
				
			|||||||
		// may want to start a pool of goroutines to do write
 | 
							// may want to start a pool of goroutines to do write
 | 
				
			||||||
		// operations.
 | 
							// operations.
 | 
				
			||||||
		if err := self.backend.AddStats(cInfo, stats); err != nil {
 | 
							if err := self.backend.AddStats(cInfo, stats); err != nil {
 | 
				
			||||||
			glog.Error(err)
 | 
								klog.Error(err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return cstore.AddStats(stats)
 | 
						return cstore.AddStats(stats)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/google/cadvisor/container/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/google/cadvisor/container/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -10,9 +10,9 @@ go_library(
 | 
				
			|||||||
    importpath = "github.com/google/cadvisor/container",
 | 
					    importpath = "github.com/google/cadvisor/container",
 | 
				
			||||||
    visibility = ["//visibility:public"],
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/info/v1:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/info/v1:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/manager/watcher:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/manager/watcher:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								vendor/github.com/google/cadvisor/container/common/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/google/cadvisor/container/common/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -12,12 +12,14 @@ go_library(
 | 
				
			|||||||
    importpath = "github.com/google/cadvisor/container/common",
 | 
					    importpath = "github.com/google/cadvisor/container/common",
 | 
				
			||||||
    visibility = ["//visibility:public"],
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/container:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/container:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/fs:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/fs:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/info/v1:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/info/v1:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/utils:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/utils:go_default_library",
 | 
				
			||||||
        "//vendor/golang.org/x/exp/inotify:go_default_library",
 | 
					        "//vendor/github.com/karrick/godirwalk:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/github.com/pkg/errors:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/github.com/sigma/go-inotify:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								vendor/github.com/google/cadvisor/container/common/fsHandler.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/google/cadvisor/container/common/fsHandler.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -22,7 +22,7 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	"github.com/google/cadvisor/fs"
 | 
						"github.com/google/cadvisor/fs"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type FsHandler interface {
 | 
					type FsHandler interface {
 | 
				
			||||||
@@ -118,7 +118,7 @@ func (fh *realFsHandler) trackUsage() {
 | 
				
			|||||||
		case <-time.After(fh.period):
 | 
							case <-time.After(fh.period):
 | 
				
			||||||
			start := time.Now()
 | 
								start := time.Now()
 | 
				
			||||||
			if err := fh.update(); err != nil {
 | 
								if err := fh.update(); err != nil {
 | 
				
			||||||
				glog.Errorf("failed to collect filesystem stats - %v", err)
 | 
									klog.Errorf("failed to collect filesystem stats - %v", err)
 | 
				
			||||||
				fh.period = fh.period * 2
 | 
									fh.period = fh.period * 2
 | 
				
			||||||
				if fh.period > maxBackoffFactor*fh.minPeriod {
 | 
									if fh.period > maxBackoffFactor*fh.minPeriod {
 | 
				
			||||||
					fh.period = maxBackoffFactor * fh.minPeriod
 | 
										fh.period = maxBackoffFactor * fh.minPeriod
 | 
				
			||||||
@@ -132,7 +132,7 @@ func (fh *realFsHandler) trackUsage() {
 | 
				
			|||||||
				// if the long duration is persistent either because of slow
 | 
									// if the long duration is persistent either because of slow
 | 
				
			||||||
				// disk or lots of containers.
 | 
									// disk or lots of containers.
 | 
				
			||||||
				longOp = longOp + time.Second
 | 
									longOp = longOp + time.Second
 | 
				
			||||||
				glog.V(2).Infof("du and find on following dirs took %v: %v; will not log again for this container unless duration exceeds %v", duration, []string{fh.rootfs, fh.extraDir}, longOp)
 | 
									klog.V(2).Infof("du and find on following dirs took %v: %v; will not log again for this container unless duration exceeds %v", duration, []string{fh.rootfs, fh.extraDir}, longOp)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										42
									
								
								vendor/github.com/google/cadvisor/container/common/helpers.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										42
									
								
								vendor/github.com/google/cadvisor/container/common/helpers.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -26,8 +26,10 @@ import (
 | 
				
			|||||||
	"github.com/google/cadvisor/container"
 | 
						"github.com/google/cadvisor/container"
 | 
				
			||||||
	info "github.com/google/cadvisor/info/v1"
 | 
						info "github.com/google/cadvisor/info/v1"
 | 
				
			||||||
	"github.com/google/cadvisor/utils"
 | 
						"github.com/google/cadvisor/utils"
 | 
				
			||||||
 | 
						"github.com/karrick/godirwalk"
 | 
				
			||||||
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func DebugInfo(watches map[string][]string) map[string][]string {
 | 
					func DebugInfo(watches map[string][]string) map[string][]string {
 | 
				
			||||||
@@ -85,7 +87,7 @@ func GetSpec(cgroupPaths map[string]string, machineInfoFactory info.MachineInfoF
 | 
				
			|||||||
			if quota != "" && quota != "-1" {
 | 
								if quota != "" && quota != "-1" {
 | 
				
			||||||
				val, err := strconv.ParseUint(quota, 10, 64)
 | 
									val, err := strconv.ParseUint(quota, 10, 64)
 | 
				
			||||||
				if err != nil {
 | 
									if err != nil {
 | 
				
			||||||
					glog.Errorf("GetSpec: Failed to parse CPUQuota from %q: %s", path.Join(cpuRoot, "cpu.cfs_quota_us"), err)
 | 
										klog.Errorf("GetSpec: Failed to parse CPUQuota from %q: %s", path.Join(cpuRoot, "cpu.cfs_quota_us"), err)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				spec.Cpu.Quota = val
 | 
									spec.Cpu.Quota = val
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -132,7 +134,7 @@ func readString(dirpath string, file string) string {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		// Ignore non-existent files
 | 
							// Ignore non-existent files
 | 
				
			||||||
		if !os.IsNotExist(err) {
 | 
							if !os.IsNotExist(err) {
 | 
				
			||||||
			glog.Errorf("readString: Failed to read %q: %s", cgroupFile, err)
 | 
								klog.Errorf("readString: Failed to read %q: %s", cgroupFile, err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return ""
 | 
							return ""
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -147,7 +149,7 @@ func readUInt64(dirpath string, file string) uint64 {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	val, err := strconv.ParseUint(out, 10, 64)
 | 
						val, err := strconv.ParseUint(out, 10, 64)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.Errorf("readUInt64: Failed to parse int %q from file %q: %s", out, path.Join(dirpath, file), err)
 | 
							klog.Errorf("readUInt64: Failed to parse int %q from file %q: %s", out, path.Join(dirpath, file), err)
 | 
				
			||||||
		return 0
 | 
							return 0
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -156,26 +158,34 @@ func readUInt64(dirpath string, file string) uint64 {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Lists all directories under "path" and outputs the results as children of "parent".
 | 
					// Lists all directories under "path" and outputs the results as children of "parent".
 | 
				
			||||||
func ListDirectories(dirpath string, parent string, recursive bool, output map[string]struct{}) error {
 | 
					func ListDirectories(dirpath string, parent string, recursive bool, output map[string]struct{}) error {
 | 
				
			||||||
	entries, err := ioutil.ReadDir(dirpath)
 | 
						buf := make([]byte, godirwalk.DefaultScratchBufferSize)
 | 
				
			||||||
 | 
						return listDirectories(dirpath, parent, recursive, output, buf)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func listDirectories(dirpath string, parent string, recursive bool, output map[string]struct{}, buf []byte) error {
 | 
				
			||||||
 | 
						dirents, err := godirwalk.ReadDirents(dirpath, buf)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		// Ignore if this hierarchy does not exist.
 | 
							// Ignore if this hierarchy does not exist.
 | 
				
			||||||
		if os.IsNotExist(err) {
 | 
							if os.IsNotExist(errors.Cause(err)) {
 | 
				
			||||||
			err = nil
 | 
								err = nil
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for _, entry := range entries {
 | 
						for _, dirent := range dirents {
 | 
				
			||||||
		// We only grab directories.
 | 
							// We only grab directories.
 | 
				
			||||||
		if entry.IsDir() {
 | 
							if !dirent.IsDir() {
 | 
				
			||||||
			name := path.Join(parent, entry.Name())
 | 
								continue
 | 
				
			||||||
			output[name] = struct{}{}
 | 
							}
 | 
				
			||||||
 | 
							dirname := dirent.Name()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// List subcontainers if asked to.
 | 
							name := path.Join(parent, dirname)
 | 
				
			||||||
			if recursive {
 | 
							output[name] = struct{}{}
 | 
				
			||||||
				err := ListDirectories(path.Join(dirpath, entry.Name()), name, true, output)
 | 
					
 | 
				
			||||||
				if err != nil {
 | 
							// List subcontainers if asked to.
 | 
				
			||||||
					return err
 | 
							if recursive {
 | 
				
			||||||
				}
 | 
								err := listDirectories(path.Join(dirpath, dirname), name, true, output, buf)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									return err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/google/cadvisor/container/common/inotify_watcher.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/google/cadvisor/container/common/inotify_watcher.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -17,7 +17,7 @@ package common
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"golang.org/x/exp/inotify"
 | 
						inotify "github.com/sigma/go-inotify"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Watcher for container-related inotify events in the cgroup hierarchy.
 | 
					// Watcher for container-related inotify events in the cgroup hierarchy.
 | 
				
			||||||
@@ -78,7 +78,7 @@ func (iw *InotifyWatcher) RemoveWatch(containerName, dir string) (bool, error) {
 | 
				
			|||||||
	iw.lock.Lock()
 | 
						iw.lock.Lock()
 | 
				
			||||||
	defer iw.lock.Unlock()
 | 
						defer iw.lock.Unlock()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// If we don't have a watch registed for this, just return.
 | 
						// If we don't have a watch registered for this, just return.
 | 
				
			||||||
	cgroupsWatched, ok := iw.containersWatched[containerName]
 | 
						cgroupsWatched, ok := iw.containersWatched[containerName]
 | 
				
			||||||
	if !ok {
 | 
						if !ok {
 | 
				
			||||||
		return false, nil
 | 
							return false, nil
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/google/cadvisor/container/containerd/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/google/cadvisor/container/containerd/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -20,7 +20,6 @@ go_library(
 | 
				
			|||||||
        "//vendor/github.com/containerd/containerd/errdefs:go_default_library",
 | 
					        "//vendor/github.com/containerd/containerd/errdefs:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/containerd/containerd/namespaces:go_default_library",
 | 
					        "//vendor/github.com/containerd/containerd/namespaces:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/gogo/protobuf/types:go_default_library",
 | 
					        "//vendor/github.com/gogo/protobuf/types:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/container:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/container:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/container/common:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/container/common:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/container/libcontainer:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/container/libcontainer:go_default_library",
 | 
				
			||||||
@@ -32,6 +31,7 @@ go_library(
 | 
				
			|||||||
        "//vendor/github.com/opencontainers/runtime-spec/specs-go:go_default_library",
 | 
					        "//vendor/github.com/opencontainers/runtime-spec/specs-go:go_default_library",
 | 
				
			||||||
        "//vendor/golang.org/x/net/context:go_default_library",
 | 
					        "//vendor/golang.org/x/net/context:go_default_library",
 | 
				
			||||||
        "//vendor/google.golang.org/grpc:go_default_library",
 | 
					        "//vendor/google.golang.org/grpc:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/google/cadvisor/container/containerd/factory.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/google/cadvisor/container/containerd/factory.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -21,8 +21,8 @@ import (
 | 
				
			|||||||
	"regexp"
 | 
						"regexp"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
					 | 
				
			||||||
	"golang.org/x/net/context"
 | 
						"golang.org/x/net/context"
 | 
				
			||||||
 | 
						"k8s.io/klog"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/google/cadvisor/container"
 | 
						"github.com/google/cadvisor/container"
 | 
				
			||||||
	"github.com/google/cadvisor/container/libcontainer"
 | 
						"github.com/google/cadvisor/container/libcontainer"
 | 
				
			||||||
@@ -133,7 +133,7 @@ func Register(factory info.MachineInfoFactory, fsInfo fs.FsInfo, includedMetrics
 | 
				
			|||||||
		return fmt.Errorf("failed to get cgroup subsystems: %v", err)
 | 
							return fmt.Errorf("failed to get cgroup subsystems: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	glog.V(1).Infof("Registering containerd factory")
 | 
						klog.V(1).Infof("Registering containerd factory")
 | 
				
			||||||
	f := &containerdFactory{
 | 
						f := &containerdFactory{
 | 
				
			||||||
		cgroupSubsystems:   cgroupSubsystems,
 | 
							cgroupSubsystems:   cgroupSubsystems,
 | 
				
			||||||
		client:             client,
 | 
							client:             client,
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/google/cadvisor/container/crio/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/google/cadvisor/container/crio/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -11,7 +11,6 @@ go_library(
 | 
				
			|||||||
    importpath = "github.com/google/cadvisor/container/crio",
 | 
					    importpath = "github.com/google/cadvisor/container/crio",
 | 
				
			||||||
    visibility = ["//visibility:public"],
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/container:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/container:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/container/common:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/container/common:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/container/libcontainer:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/container/libcontainer:go_default_library",
 | 
				
			||||||
@@ -20,6 +19,7 @@ go_library(
 | 
				
			|||||||
        "//vendor/github.com/google/cadvisor/manager/watcher:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/manager/watcher:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library",
 | 
					        "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library",
 | 
					        "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/google/cadvisor/container/crio/factory.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/google/cadvisor/container/crio/factory.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -26,7 +26,7 @@ import (
 | 
				
			|||||||
	info "github.com/google/cadvisor/info/v1"
 | 
						info "github.com/google/cadvisor/info/v1"
 | 
				
			||||||
	"github.com/google/cadvisor/manager/watcher"
 | 
						"github.com/google/cadvisor/manager/watcher"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// The namespace under which crio aliases are unique.
 | 
					// The namespace under which crio aliases are unique.
 | 
				
			||||||
@@ -154,7 +154,7 @@ func Register(factory info.MachineInfoFactory, fsInfo fs.FsInfo, includedMetrics
 | 
				
			|||||||
		return fmt.Errorf("failed to get cgroup subsystems: %v", err)
 | 
							return fmt.Errorf("failed to get cgroup subsystems: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	glog.V(1).Infof("Registering CRI-O factory")
 | 
						klog.V(1).Infof("Registering CRI-O factory")
 | 
				
			||||||
	f := &crioFactory{
 | 
						f := &crioFactory{
 | 
				
			||||||
		client:             client,
 | 
							client:             client,
 | 
				
			||||||
		cgroupSubsystems:   cgroupSubsystems,
 | 
							cgroupSubsystems:   cgroupSubsystems,
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/google/cadvisor/container/crio/handler.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/google/cadvisor/container/crio/handler.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -176,7 +176,7 @@ func newCrioContainerHandler(
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	// TODO for env vars we wanted to show from container.Config.Env from whitelist
 | 
						// TODO for env vars we wanted to show from container.Config.Env from whitelist
 | 
				
			||||||
	//for _, exposedEnv := range metadataEnvs {
 | 
						//for _, exposedEnv := range metadataEnvs {
 | 
				
			||||||
	//glog.V(4).Infof("TODO env whitelist: %v", exposedEnv)
 | 
						//klog.V(4).Infof("TODO env whitelist: %v", exposedEnv)
 | 
				
			||||||
	//}
 | 
						//}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return handler, nil
 | 
						return handler, nil
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/google/cadvisor/container/docker/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/google/cadvisor/container/docker/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -17,7 +17,6 @@ go_library(
 | 
				
			|||||||
        "//vendor/github.com/docker/docker/api/types/container:go_default_library",
 | 
					        "//vendor/github.com/docker/docker/api/types/container:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/docker/docker/client:go_default_library",
 | 
					        "//vendor/github.com/docker/docker/client:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/docker/go-connections/tlsconfig:go_default_library",
 | 
					        "//vendor/github.com/docker/go-connections/tlsconfig:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/container:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/container:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/container/common:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/container/common:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/container/libcontainer:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/container/libcontainer:go_default_library",
 | 
				
			||||||
@@ -31,6 +30,7 @@ go_library(
 | 
				
			|||||||
        "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library",
 | 
					        "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library",
 | 
					        "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library",
 | 
				
			||||||
        "//vendor/golang.org/x/net/context:go_default_library",
 | 
					        "//vendor/golang.org/x/net/context:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										8
									
								
								vendor/github.com/google/cadvisor/container/docker/factory.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/google/cadvisor/container/docker/factory.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -36,8 +36,8 @@ import (
 | 
				
			|||||||
	"github.com/google/cadvisor/zfs"
 | 
						"github.com/google/cadvisor/zfs"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	docker "github.com/docker/docker/client"
 | 
						docker "github.com/docker/docker/client"
 | 
				
			||||||
	"github.com/golang/glog"
 | 
					 | 
				
			||||||
	"golang.org/x/net/context"
 | 
						"golang.org/x/net/context"
 | 
				
			||||||
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var ArgDockerEndpoint = flag.String("docker", "unix:///var/run/docker.sock", "docker endpoint")
 | 
					var ArgDockerEndpoint = flag.String("docker", "unix:///var/run/docker.sock", "docker endpoint")
 | 
				
			||||||
@@ -337,7 +337,7 @@ func Register(factory info.MachineInfoFactory, fsInfo fs.FsInfo, includedMetrics
 | 
				
			|||||||
	if storageDriver(dockerInfo.Driver) == devicemapperStorageDriver {
 | 
						if storageDriver(dockerInfo.Driver) == devicemapperStorageDriver {
 | 
				
			||||||
		thinPoolWatcher, err = startThinPoolWatcher(dockerInfo)
 | 
							thinPoolWatcher, err = startThinPoolWatcher(dockerInfo)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			glog.Errorf("devicemapper filesystem stats will not be reported: %v", err)
 | 
								klog.Errorf("devicemapper filesystem stats will not be reported: %v", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Safe to ignore error - driver status should always be populated.
 | 
							// Safe to ignore error - driver status should always be populated.
 | 
				
			||||||
@@ -349,11 +349,11 @@ func Register(factory info.MachineInfoFactory, fsInfo fs.FsInfo, includedMetrics
 | 
				
			|||||||
	if storageDriver(dockerInfo.Driver) == zfsStorageDriver {
 | 
						if storageDriver(dockerInfo.Driver) == zfsStorageDriver {
 | 
				
			||||||
		zfsWatcher, err = startZfsWatcher(dockerInfo)
 | 
							zfsWatcher, err = startZfsWatcher(dockerInfo)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			glog.Errorf("zfs filesystem stats will not be reported: %v", err)
 | 
								klog.Errorf("zfs filesystem stats will not be reported: %v", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	glog.V(1).Infof("Registering Docker factory")
 | 
						klog.V(1).Infof("Registering Docker factory")
 | 
				
			||||||
	f := &dockerFactory{
 | 
						f := &dockerFactory{
 | 
				
			||||||
		cgroupSubsystems:   cgroupSubsystems,
 | 
							cgroupSubsystems:   cgroupSubsystems,
 | 
				
			||||||
		client:             client,
 | 
							client:             client,
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										8
									
								
								vendor/github.com/google/cadvisor/container/docker/handler.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/google/cadvisor/container/docker/handler.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -34,10 +34,10 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	dockercontainer "github.com/docker/docker/api/types/container"
 | 
						dockercontainer "github.com/docker/docker/api/types/container"
 | 
				
			||||||
	docker "github.com/docker/docker/client"
 | 
						docker "github.com/docker/docker/client"
 | 
				
			||||||
	"github.com/golang/glog"
 | 
					 | 
				
			||||||
	cgroupfs "github.com/opencontainers/runc/libcontainer/cgroups/fs"
 | 
						cgroupfs "github.com/opencontainers/runc/libcontainer/cgroups/fs"
 | 
				
			||||||
	libcontainerconfigs "github.com/opencontainers/runc/libcontainer/configs"
 | 
						libcontainerconfigs "github.com/opencontainers/runc/libcontainer/configs"
 | 
				
			||||||
	"golang.org/x/net/context"
 | 
						"golang.org/x/net/context"
 | 
				
			||||||
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
@@ -228,7 +228,7 @@ func newDockerContainerHandler(
 | 
				
			|||||||
		handler.labels["restartcount"] = strconv.Itoa(ctnr.RestartCount)
 | 
							handler.labels["restartcount"] = strconv.Itoa(ctnr.RestartCount)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Obtain the IP address for the contianer.
 | 
						// Obtain the IP address for the container.
 | 
				
			||||||
	// If the NetworkMode starts with 'container:' then we need to use the IP address of the container specified.
 | 
						// If the NetworkMode starts with 'container:' then we need to use the IP address of the container specified.
 | 
				
			||||||
	// This happens in cases such as kubernetes where the containers doesn't have an IP address itself and we need to use the pod's address
 | 
						// This happens in cases such as kubernetes where the containers doesn't have an IP address itself and we need to use the pod's address
 | 
				
			||||||
	ipAddress := ctnr.NetworkSettings.IPAddress
 | 
						ipAddress := ctnr.NetworkSettings.IPAddress
 | 
				
			||||||
@@ -309,7 +309,7 @@ func (h *dockerFsHandler) Usage() common.FsUsage {
 | 
				
			|||||||
			// TODO: ideally we should keep track of how many times we failed to get the usage for this
 | 
								// TODO: ideally we should keep track of how many times we failed to get the usage for this
 | 
				
			||||||
			// device vs how many refreshes of the cache there have been, and display an error e.g. if we've
 | 
								// device vs how many refreshes of the cache there have been, and display an error e.g. if we've
 | 
				
			||||||
			// had at least 1 refresh and we still can't find the device.
 | 
								// had at least 1 refresh and we still can't find the device.
 | 
				
			||||||
			glog.V(5).Infof("unable to get fs usage from thin pool for device %s: %v", h.deviceID, err)
 | 
								klog.V(5).Infof("unable to get fs usage from thin pool for device %s: %v", h.deviceID, err)
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			usage.BaseUsageBytes = thinPoolUsage
 | 
								usage.BaseUsageBytes = thinPoolUsage
 | 
				
			||||||
			usage.TotalUsageBytes += thinPoolUsage
 | 
								usage.TotalUsageBytes += thinPoolUsage
 | 
				
			||||||
@@ -319,7 +319,7 @@ func (h *dockerFsHandler) Usage() common.FsUsage {
 | 
				
			|||||||
	if h.zfsWatcher != nil {
 | 
						if h.zfsWatcher != nil {
 | 
				
			||||||
		zfsUsage, err := h.zfsWatcher.GetUsage(h.zfsFilesystem)
 | 
							zfsUsage, err := h.zfsWatcher.GetUsage(h.zfsFilesystem)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			glog.V(5).Infof("unable to get fs usage from zfs for filesystem %s: %v", h.zfsFilesystem, err)
 | 
								klog.V(5).Infof("unable to get fs usage from zfs for filesystem %s: %v", h.zfsFilesystem, err)
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			usage.BaseUsageBytes = zfsUsage
 | 
								usage.BaseUsageBytes = zfsUsage
 | 
				
			||||||
			usage.TotalUsageBytes += zfsUsage
 | 
								usage.TotalUsageBytes += zfsUsage
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										11
									
								
								vendor/github.com/google/cadvisor/container/factory.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/github.com/google/cadvisor/container/factory.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -20,7 +20,7 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	"github.com/google/cadvisor/manager/watcher"
 | 
						"github.com/google/cadvisor/manager/watcher"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type ContainerHandlerFactory interface {
 | 
					type ContainerHandlerFactory interface {
 | 
				
			||||||
@@ -53,6 +53,7 @@ const (
 | 
				
			|||||||
	NetworkUdpUsageMetrics  MetricKind = "udp"
 | 
						NetworkUdpUsageMetrics  MetricKind = "udp"
 | 
				
			||||||
	AcceleratorUsageMetrics MetricKind = "accelerator"
 | 
						AcceleratorUsageMetrics MetricKind = "accelerator"
 | 
				
			||||||
	AppMetrics              MetricKind = "app"
 | 
						AppMetrics              MetricKind = "app"
 | 
				
			||||||
 | 
						ProcessMetrics          MetricKind = "process"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (mk MetricKind) String() string {
 | 
					func (mk MetricKind) String() string {
 | 
				
			||||||
@@ -105,18 +106,18 @@ func NewContainerHandler(name string, watchType watcher.ContainerWatchSource, in
 | 
				
			|||||||
	for _, factory := range factories[watchType] {
 | 
						for _, factory := range factories[watchType] {
 | 
				
			||||||
		canHandle, canAccept, err := factory.CanHandleAndAccept(name)
 | 
							canHandle, canAccept, err := factory.CanHandleAndAccept(name)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			glog.V(4).Infof("Error trying to work out if we can handle %s: %v", name, err)
 | 
								klog.V(4).Infof("Error trying to work out if we can handle %s: %v", name, err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if canHandle {
 | 
							if canHandle {
 | 
				
			||||||
			if !canAccept {
 | 
								if !canAccept {
 | 
				
			||||||
				glog.V(3).Infof("Factory %q can handle container %q, but ignoring.", factory, name)
 | 
									klog.V(3).Infof("Factory %q can handle container %q, but ignoring.", factory, name)
 | 
				
			||||||
				return nil, false, nil
 | 
									return nil, false, nil
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			glog.V(3).Infof("Using factory %q for container %q", factory, name)
 | 
								klog.V(3).Infof("Using factory %q for container %q", factory, name)
 | 
				
			||||||
			handle, err := factory.NewContainerHandler(name, inHostNamespace)
 | 
								handle, err := factory.NewContainerHandler(name, inHostNamespace)
 | 
				
			||||||
			return handle, canAccept, err
 | 
								return handle, canAccept, err
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			glog.V(4).Infof("Factory %q was unable to handle container %q", factory, name)
 | 
								klog.V(4).Infof("Factory %q was unable to handle container %q", factory, name)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/google/cadvisor/container/libcontainer/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/google/cadvisor/container/libcontainer/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -11,11 +11,11 @@ go_library(
 | 
				
			|||||||
    importpath = "github.com/google/cadvisor/container/libcontainer",
 | 
					    importpath = "github.com/google/cadvisor/container/libcontainer",
 | 
				
			||||||
    visibility = ["//visibility:public"],
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/container:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/container:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/info/v1:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/info/v1:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/opencontainers/runc/libcontainer:go_default_library",
 | 
					        "//vendor/github.com/opencontainers/runc/libcontainer:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library",
 | 
					        "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										67
									
								
								vendor/github.com/google/cadvisor/container/libcontainer/handler.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										67
									
								
								vendor/github.com/google/cadvisor/container/libcontainer/handler.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -29,9 +29,9 @@ import (
 | 
				
			|||||||
	info "github.com/google/cadvisor/info/v1"
 | 
						info "github.com/google/cadvisor/info/v1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"bytes"
 | 
						"bytes"
 | 
				
			||||||
	"github.com/golang/glog"
 | 
					 | 
				
			||||||
	"github.com/opencontainers/runc/libcontainer"
 | 
						"github.com/opencontainers/runc/libcontainer"
 | 
				
			||||||
	"github.com/opencontainers/runc/libcontainer/cgroups"
 | 
						"github.com/opencontainers/runc/libcontainer/cgroups"
 | 
				
			||||||
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
@@ -72,11 +72,11 @@ func (h *Handler) GetStats() (*info.ContainerStats, error) {
 | 
				
			|||||||
	if h.includedMetrics.Has(container.ProcessSchedulerMetrics) {
 | 
						if h.includedMetrics.Has(container.ProcessSchedulerMetrics) {
 | 
				
			||||||
		pids, err := h.cgroupManager.GetAllPids()
 | 
							pids, err := h.cgroupManager.GetAllPids()
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			glog.V(4).Infof("Could not get PIDs for container %d: %v", h.pid, err)
 | 
								klog.V(4).Infof("Could not get PIDs for container %d: %v", h.pid, err)
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			stats.Cpu.Schedstat, err = schedulerStatsFromProcs(h.rootFs, pids, h.pidMetricsCache)
 | 
								stats.Cpu.Schedstat, err = schedulerStatsFromProcs(h.rootFs, pids, h.pidMetricsCache)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				glog.V(4).Infof("Unable to get Process Scheduler Stats: %v", err)
 | 
									klog.V(4).Infof("Unable to get Process Scheduler Stats: %v", err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -88,7 +88,7 @@ func (h *Handler) GetStats() (*info.ContainerStats, error) {
 | 
				
			|||||||
	if h.includedMetrics.Has(container.NetworkUsageMetrics) {
 | 
						if h.includedMetrics.Has(container.NetworkUsageMetrics) {
 | 
				
			||||||
		netStats, err := networkStatsFromProc(h.rootFs, h.pid)
 | 
							netStats, err := networkStatsFromProc(h.rootFs, h.pid)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			glog.V(4).Infof("Unable to get network stats from pid %d: %v", h.pid, err)
 | 
								klog.V(4).Infof("Unable to get network stats from pid %d: %v", h.pid, err)
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			stats.Network.Interfaces = append(stats.Network.Interfaces, netStats...)
 | 
								stats.Network.Interfaces = append(stats.Network.Interfaces, netStats...)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -96,14 +96,14 @@ func (h *Handler) GetStats() (*info.ContainerStats, error) {
 | 
				
			|||||||
	if h.includedMetrics.Has(container.NetworkTcpUsageMetrics) {
 | 
						if h.includedMetrics.Has(container.NetworkTcpUsageMetrics) {
 | 
				
			||||||
		t, err := tcpStatsFromProc(h.rootFs, h.pid, "net/tcp")
 | 
							t, err := tcpStatsFromProc(h.rootFs, h.pid, "net/tcp")
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			glog.V(4).Infof("Unable to get tcp stats from pid %d: %v", h.pid, err)
 | 
								klog.V(4).Infof("Unable to get tcp stats from pid %d: %v", h.pid, err)
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			stats.Network.Tcp = t
 | 
								stats.Network.Tcp = t
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		t6, err := tcpStatsFromProc(h.rootFs, h.pid, "net/tcp6")
 | 
							t6, err := tcpStatsFromProc(h.rootFs, h.pid, "net/tcp6")
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			glog.V(4).Infof("Unable to get tcp6 stats from pid %d: %v", h.pid, err)
 | 
								klog.V(4).Infof("Unable to get tcp6 stats from pid %d: %v", h.pid, err)
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			stats.Network.Tcp6 = t6
 | 
								stats.Network.Tcp6 = t6
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -111,18 +111,30 @@ func (h *Handler) GetStats() (*info.ContainerStats, error) {
 | 
				
			|||||||
	if h.includedMetrics.Has(container.NetworkUdpUsageMetrics) {
 | 
						if h.includedMetrics.Has(container.NetworkUdpUsageMetrics) {
 | 
				
			||||||
		u, err := udpStatsFromProc(h.rootFs, h.pid, "net/udp")
 | 
							u, err := udpStatsFromProc(h.rootFs, h.pid, "net/udp")
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			glog.V(4).Infof("Unable to get udp stats from pid %d: %v", h.pid, err)
 | 
								klog.V(4).Infof("Unable to get udp stats from pid %d: %v", h.pid, err)
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			stats.Network.Udp = u
 | 
								stats.Network.Udp = u
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		u6, err := udpStatsFromProc(h.rootFs, h.pid, "net/udp6")
 | 
							u6, err := udpStatsFromProc(h.rootFs, h.pid, "net/udp6")
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			glog.V(4).Infof("Unable to get udp6 stats from pid %d: %v", h.pid, err)
 | 
								klog.V(4).Infof("Unable to get udp6 stats from pid %d: %v", h.pid, err)
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			stats.Network.Udp6 = u6
 | 
								stats.Network.Udp6 = u6
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if h.includedMetrics.Has(container.ProcessMetrics) {
 | 
				
			||||||
 | 
							paths := h.cgroupManager.GetPaths()
 | 
				
			||||||
 | 
							path, ok := paths["cpu"]
 | 
				
			||||||
 | 
							if !ok {
 | 
				
			||||||
 | 
								klog.V(4).Infof("Could not find cgroups CPU for container %d", h.pid)
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								stats.Processes, err = processStatsFromProcs(h.rootFs, path)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									klog.V(4).Infof("Unable to get Process Stats: %v", err)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// For backwards compatibility.
 | 
						// For backwards compatibility.
 | 
				
			||||||
	if len(stats.Network.Interfaces) > 0 {
 | 
						if len(stats.Network.Interfaces) > 0 {
 | 
				
			||||||
@@ -132,6 +144,41 @@ func (h *Handler) GetStats() (*info.ContainerStats, error) {
 | 
				
			|||||||
	return stats, nil
 | 
						return stats, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func processStatsFromProcs(rootFs string, cgroupPath string) (info.ProcessStats, error) {
 | 
				
			||||||
 | 
						var fdCount uint64
 | 
				
			||||||
 | 
						filePath := path.Join(cgroupPath, "cgroup.procs")
 | 
				
			||||||
 | 
						out, err := ioutil.ReadFile(filePath)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return info.ProcessStats{}, fmt.Errorf("couldn't open cpu cgroup procs file %v : %v", filePath, err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pids := strings.Split(string(out), "\n")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// EOL is also treated as a new line while reading "cgroup.procs" file with ioutil.ReadFile.
 | 
				
			||||||
 | 
						// The last value is an empty string "". Ex: pids = ["22", "1223", ""]
 | 
				
			||||||
 | 
						// Trim the last value
 | 
				
			||||||
 | 
						if len(pids) != 0 && pids[len(pids)-1] == "" {
 | 
				
			||||||
 | 
							pids = pids[:len(pids)-1]
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, pid := range pids {
 | 
				
			||||||
 | 
							dirPath := path.Join(rootFs, "/proc", pid, "fd")
 | 
				
			||||||
 | 
							fds, err := ioutil.ReadDir(dirPath)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								klog.V(4).Infof("error while listing directory %q to measure fd count: %v", dirPath, err)
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							fdCount += uint64(len(fds))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						processStats := info.ProcessStats{
 | 
				
			||||||
 | 
							ProcessCount: uint64(len(pids)),
 | 
				
			||||||
 | 
							FdCount:      fdCount,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return processStats, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func schedulerStatsFromProcs(rootFs string, pids []int, pidMetricsCache map[int]*info.CpuSchedstat) (info.CpuSchedstat, error) {
 | 
					func schedulerStatsFromProcs(rootFs string, pids []int, pidMetricsCache map[int]*info.CpuSchedstat) (info.CpuSchedstat, error) {
 | 
				
			||||||
	for _, pid := range pids {
 | 
						for _, pid := range pids {
 | 
				
			||||||
		f, err := os.Open(path.Join(rootFs, "proc", strconv.Itoa(pid), "schedstat"))
 | 
							f, err := os.Open(path.Join(rootFs, "proc", strconv.Itoa(pid), "schedstat"))
 | 
				
			||||||
@@ -451,13 +498,13 @@ func setCpuStats(s *cgroups.Stats, ret *info.ContainerStats, withPerCPU bool) {
 | 
				
			|||||||
	// We intentionally ignore these extra zeroes.
 | 
						// We intentionally ignore these extra zeroes.
 | 
				
			||||||
	numActual, err := numCpusFunc()
 | 
						numActual, err := numCpusFunc()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.Errorf("unable to determine number of actual cpus; defaulting to maximum possible number: errno %v", err)
 | 
							klog.Errorf("unable to determine number of actual cpus; defaulting to maximum possible number: errno %v", err)
 | 
				
			||||||
		numActual = numPossible
 | 
							numActual = numPossible
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if numActual > numPossible {
 | 
						if numActual > numPossible {
 | 
				
			||||||
		// The real number of cores should never be greater than the number of
 | 
							// The real number of cores should never be greater than the number of
 | 
				
			||||||
		// datapoints reported in cpu usage.
 | 
							// datapoints reported in cpu usage.
 | 
				
			||||||
		glog.Errorf("PercpuUsage had %v cpus, but the actual number is %v; ignoring extra CPUs", numPossible, numActual)
 | 
							klog.Errorf("PercpuUsage had %v cpus, but the actual number is %v; ignoring extra CPUs", numPossible, numActual)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	numActual = minUint32(numPossible, numActual)
 | 
						numActual = minUint32(numPossible, numActual)
 | 
				
			||||||
	ret.Cpu.Usage.PerCpu = make([]uint64, numActual)
 | 
						ret.Cpu.Usage.PerCpu = make([]uint64, numActual)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/google/cadvisor/container/libcontainer/helpers.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/google/cadvisor/container/libcontainer/helpers.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -19,8 +19,8 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	info "github.com/google/cadvisor/info/v1"
 | 
						info "github.com/google/cadvisor/info/v1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
					 | 
				
			||||||
	"github.com/opencontainers/runc/libcontainer/cgroups"
 | 
						"github.com/opencontainers/runc/libcontainer/cgroups"
 | 
				
			||||||
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type CgroupSubsystems struct {
 | 
					type CgroupSubsystems struct {
 | 
				
			||||||
@@ -61,7 +61,7 @@ func getCgroupSubsystemsHelper(allCgroups []cgroups.Mount) (CgroupSubsystems, er
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
			if _, ok := mountPoints[subsystem]; ok {
 | 
								if _, ok := mountPoints[subsystem]; ok {
 | 
				
			||||||
				// duplicate mount for this subsystem; use the first one we saw
 | 
									// duplicate mount for this subsystem; use the first one we saw
 | 
				
			||||||
				glog.V(5).Infof("skipping %s, already using mount at %s", mount.Mountpoint, mountPoints[subsystem])
 | 
									klog.V(5).Infof("skipping %s, already using mount at %s", mount.Mountpoint, mountPoints[subsystem])
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if _, ok := recordedMountpoints[mount.Mountpoint]; !ok {
 | 
								if _, ok := recordedMountpoints[mount.Mountpoint]; !ok {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/google/cadvisor/container/mesos/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/google/cadvisor/container/mesos/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -14,7 +14,6 @@ go_library(
 | 
				
			|||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//vendor/github.com/Rican7/retry:go_default_library",
 | 
					        "//vendor/github.com/Rican7/retry:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/Rican7/retry/strategy:go_default_library",
 | 
					        "//vendor/github.com/Rican7/retry/strategy:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/container:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/container:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/container/common:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/container/common:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/container/libcontainer:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/container/libcontainer:go_default_library",
 | 
				
			||||||
@@ -29,6 +28,7 @@ go_library(
 | 
				
			|||||||
        "//vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli:go_default_library",
 | 
					        "//vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library",
 | 
					        "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library",
 | 
					        "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										23
									
								
								vendor/github.com/google/cadvisor/container/mesos/client.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								vendor/github.com/google/cadvisor/container/mesos/client.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -70,6 +70,11 @@ func Client() (mesosAgentClient, error) {
 | 
				
			|||||||
			),
 | 
								),
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_, err := mesosClient.getVersion()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, fmt.Errorf("failed to get version")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return mesosClient, nil
 | 
						return mesosClient, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -134,6 +139,20 @@ func (self *client) getContainer(id string) (*mContainer, error) {
 | 
				
			|||||||
	return nil, fmt.Errorf("can't locate container %s", id)
 | 
						return nil, fmt.Errorf("can't locate container %s", id)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (self *client) getVersion() (string, error) {
 | 
				
			||||||
 | 
						req := calls.NonStreaming(calls.GetVersion())
 | 
				
			||||||
 | 
						result, err := self.fetchAndDecode(req)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return "", fmt.Errorf("failed to get mesos version: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						version := result.GetVersion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if version == nil {
 | 
				
			||||||
 | 
							return "", fmt.Errorf("failed to get mesos version")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return version.VersionInfo.Version, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (self *client) getContainers() (mContainers, error) {
 | 
					func (self *client) getContainers() (mContainers, error) {
 | 
				
			||||||
	req := calls.NonStreaming(calls.GetContainers())
 | 
						req := calls.NonStreaming(calls.GetContainers())
 | 
				
			||||||
	result, err := self.fetchAndDecode(req)
 | 
						result, err := self.fetchAndDecode(req)
 | 
				
			||||||
@@ -141,6 +160,10 @@ func (self *client) getContainers() (mContainers, error) {
 | 
				
			|||||||
		return nil, fmt.Errorf("failed to get mesos containers: %v", err)
 | 
							return nil, fmt.Errorf("failed to get mesos containers: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	cntrs := result.GetContainers
 | 
						cntrs := result.GetContainers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if cntrs == nil {
 | 
				
			||||||
 | 
							return nil, fmt.Errorf("failed to get mesos containers")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return cntrs, nil
 | 
						return cntrs, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/google/cadvisor/container/mesos/factory.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/google/cadvisor/container/mesos/factory.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -22,12 +22,12 @@ import (
 | 
				
			|||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
					 | 
				
			||||||
	"github.com/google/cadvisor/container"
 | 
						"github.com/google/cadvisor/container"
 | 
				
			||||||
	"github.com/google/cadvisor/container/libcontainer"
 | 
						"github.com/google/cadvisor/container/libcontainer"
 | 
				
			||||||
	"github.com/google/cadvisor/fs"
 | 
						"github.com/google/cadvisor/fs"
 | 
				
			||||||
	info "github.com/google/cadvisor/info/v1"
 | 
						info "github.com/google/cadvisor/info/v1"
 | 
				
			||||||
	"github.com/google/cadvisor/manager/watcher"
 | 
						"github.com/google/cadvisor/manager/watcher"
 | 
				
			||||||
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var MesosAgentAddress = flag.String("mesos_agent", "127.0.0.1:5051", "Mesos agent address")
 | 
					var MesosAgentAddress = flag.String("mesos_agent", "127.0.0.1:5051", "Mesos agent address")
 | 
				
			||||||
@@ -135,7 +135,7 @@ func Register(
 | 
				
			|||||||
		return fmt.Errorf("failed to get cgroup subsystems: %v", err)
 | 
							return fmt.Errorf("failed to get cgroup subsystems: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	glog.V(1).Infof("Registering mesos factory")
 | 
						klog.V(1).Infof("Registering mesos factory")
 | 
				
			||||||
	factory := &mesosFactory{
 | 
						factory := &mesosFactory{
 | 
				
			||||||
		machineInfoFactory: machineInfoFactory,
 | 
							machineInfoFactory: machineInfoFactory,
 | 
				
			||||||
		cgroupSubsystems:   cgroupSubsystems,
 | 
							cgroupSubsystems:   cgroupSubsystems,
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/google/cadvisor/container/raw/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/google/cadvisor/container/raw/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -10,7 +10,6 @@ go_library(
 | 
				
			|||||||
    importpath = "github.com/google/cadvisor/container/raw",
 | 
					    importpath = "github.com/google/cadvisor/container/raw",
 | 
				
			||||||
    visibility = ["//visibility:public"],
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/container:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/container:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/container/common:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/container/common:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/container/libcontainer:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/container/libcontainer:go_default_library",
 | 
				
			||||||
@@ -20,6 +19,7 @@ go_library(
 | 
				
			|||||||
        "//vendor/github.com/google/cadvisor/manager/watcher:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/manager/watcher:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library",
 | 
					        "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library",
 | 
					        "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/google/cadvisor/container/raw/factory.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/google/cadvisor/container/raw/factory.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -26,7 +26,7 @@ import (
 | 
				
			|||||||
	info "github.com/google/cadvisor/info/v1"
 | 
						info "github.com/google/cadvisor/info/v1"
 | 
				
			||||||
	watch "github.com/google/cadvisor/manager/watcher"
 | 
						watch "github.com/google/cadvisor/manager/watcher"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var dockerOnly = flag.Bool("docker_only", false, "Only report docker containers in addition to root stats")
 | 
					var dockerOnly = flag.Bool("docker_only", false, "Only report docker containers in addition to root stats")
 | 
				
			||||||
@@ -94,7 +94,7 @@ func Register(machineInfoFactory info.MachineInfoFactory, fsInfo fs.FsInfo, incl
 | 
				
			|||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	glog.V(1).Infof("Registering Raw factory")
 | 
						klog.V(1).Infof("Registering Raw factory")
 | 
				
			||||||
	factory := &rawFactory{
 | 
						factory := &rawFactory{
 | 
				
			||||||
		machineInfoFactory: machineInfoFactory,
 | 
							machineInfoFactory: machineInfoFactory,
 | 
				
			||||||
		fsInfo:             fsInfo,
 | 
							fsInfo:             fsInfo,
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								vendor/github.com/google/cadvisor/container/raw/handler.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/google/cadvisor/container/raw/handler.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -25,9 +25,9 @@ import (
 | 
				
			|||||||
	info "github.com/google/cadvisor/info/v1"
 | 
						info "github.com/google/cadvisor/info/v1"
 | 
				
			||||||
	"github.com/google/cadvisor/machine"
 | 
						"github.com/google/cadvisor/machine"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
					 | 
				
			||||||
	cgroupfs "github.com/opencontainers/runc/libcontainer/cgroups/fs"
 | 
						cgroupfs "github.com/opencontainers/runc/libcontainer/cgroups/fs"
 | 
				
			||||||
	"github.com/opencontainers/runc/libcontainer/configs"
 | 
						"github.com/opencontainers/runc/libcontainer/configs"
 | 
				
			||||||
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type rawContainerHandler struct {
 | 
					type rawContainerHandler struct {
 | 
				
			||||||
@@ -134,7 +134,7 @@ func (self *rawContainerHandler) GetSpec() (info.ContainerSpec, error) {
 | 
				
			|||||||
		// Get memory and swap limits of the running machine
 | 
							// Get memory and swap limits of the running machine
 | 
				
			||||||
		memLimit, err := machine.GetMachineMemoryCapacity()
 | 
							memLimit, err := machine.GetMachineMemoryCapacity()
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			glog.Warningf("failed to obtain memory limit for machine container")
 | 
								klog.Warningf("failed to obtain memory limit for machine container")
 | 
				
			||||||
			spec.HasMemory = false
 | 
								spec.HasMemory = false
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			spec.Memory.Limit = uint64(memLimit)
 | 
								spec.Memory.Limit = uint64(memLimit)
 | 
				
			||||||
@@ -144,7 +144,7 @@ func (self *rawContainerHandler) GetSpec() (info.ContainerSpec, error) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		swapLimit, err := machine.GetMachineSwapCapacity()
 | 
							swapLimit, err := machine.GetMachineSwapCapacity()
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			glog.Warningf("failed to obtain swap limit for machine container")
 | 
								klog.Warningf("failed to obtain swap limit for machine container")
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			spec.Memory.SwapLimit = uint64(swapLimit)
 | 
								spec.Memory.SwapLimit = uint64(swapLimit)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/google/cadvisor/container/rkt/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/google/cadvisor/container/rkt/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -14,7 +14,6 @@ go_library(
 | 
				
			|||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//vendor/github.com/blang/semver:go_default_library",
 | 
					        "//vendor/github.com/blang/semver:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/coreos/rkt/api/v1alpha:go_default_library",
 | 
					        "//vendor/github.com/coreos/rkt/api/v1alpha:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/container:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/container:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/container/common:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/container/common:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/container/libcontainer:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/container/libcontainer:go_default_library",
 | 
				
			||||||
@@ -25,6 +24,7 @@ go_library(
 | 
				
			|||||||
        "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library",
 | 
					        "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library",
 | 
				
			||||||
        "//vendor/golang.org/x/net/context:go_default_library",
 | 
					        "//vendor/golang.org/x/net/context:go_default_library",
 | 
				
			||||||
        "//vendor/google.golang.org/grpc:go_default_library",
 | 
					        "//vendor/google.golang.org/grpc:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/google/cadvisor/container/rkt/factory.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/google/cadvisor/container/rkt/factory.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -23,7 +23,7 @@ import (
 | 
				
			|||||||
	info "github.com/google/cadvisor/info/v1"
 | 
						info "github.com/google/cadvisor/info/v1"
 | 
				
			||||||
	"github.com/google/cadvisor/manager/watcher"
 | 
						"github.com/google/cadvisor/manager/watcher"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const RktNamespace = "rkt"
 | 
					const RktNamespace = "rkt"
 | 
				
			||||||
@@ -86,7 +86,7 @@ func Register(machineInfoFactory info.MachineInfoFactory, fsInfo fs.FsInfo, incl
 | 
				
			|||||||
		return fmt.Errorf("failed to find supported cgroup mounts for the raw factory")
 | 
							return fmt.Errorf("failed to find supported cgroup mounts for the raw factory")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	glog.V(1).Infof("Registering Rkt factory")
 | 
						klog.V(1).Infof("Registering Rkt factory")
 | 
				
			||||||
	factory := &rktFactory{
 | 
						factory := &rktFactory{
 | 
				
			||||||
		machineInfoFactory: machineInfoFactory,
 | 
							machineInfoFactory: machineInfoFactory,
 | 
				
			||||||
		fsInfo:             fsInfo,
 | 
							fsInfo:             fsInfo,
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/google/cadvisor/container/rkt/handler.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/google/cadvisor/container/rkt/handler.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -27,9 +27,9 @@ import (
 | 
				
			|||||||
	info "github.com/google/cadvisor/info/v1"
 | 
						info "github.com/google/cadvisor/info/v1"
 | 
				
			||||||
	"golang.org/x/net/context"
 | 
						"golang.org/x/net/context"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
					 | 
				
			||||||
	cgroupfs "github.com/opencontainers/runc/libcontainer/cgroups/fs"
 | 
						cgroupfs "github.com/opencontainers/runc/libcontainer/cgroups/fs"
 | 
				
			||||||
	"github.com/opencontainers/runc/libcontainer/configs"
 | 
						"github.com/opencontainers/runc/libcontainer/configs"
 | 
				
			||||||
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type rktContainerHandler struct {
 | 
					type rktContainerHandler struct {
 | 
				
			||||||
@@ -89,7 +89,7 @@ func newRktContainerHandler(name string, rktClient rktapi.PublicAPIClient, rktPa
 | 
				
			|||||||
	annotations := resp.Pod.Annotations
 | 
						annotations := resp.Pod.Annotations
 | 
				
			||||||
	if parsed.Container != "" { // As not empty string, an App container
 | 
						if parsed.Container != "" { // As not empty string, an App container
 | 
				
			||||||
		if contAnnotations, ok := findAnnotations(resp.Pod.Apps, parsed.Container); !ok {
 | 
							if contAnnotations, ok := findAnnotations(resp.Pod.Apps, parsed.Container); !ok {
 | 
				
			||||||
			glog.Warningf("couldn't find app %v in pod", parsed.Container)
 | 
								klog.Warningf("couldn't find app %v in pod", parsed.Container)
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			annotations = append(annotations, contAnnotations...)
 | 
								annotations = append(annotations, contAnnotations...)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/google/cadvisor/container/rkt/helpers.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/google/cadvisor/container/rkt/helpers.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -21,8 +21,8 @@ import (
 | 
				
			|||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rktapi "github.com/coreos/rkt/api/v1alpha"
 | 
						rktapi "github.com/coreos/rkt/api/v1alpha"
 | 
				
			||||||
	"github.com/golang/glog"
 | 
					 | 
				
			||||||
	"golang.org/x/net/context"
 | 
						"golang.org/x/net/context"
 | 
				
			||||||
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type parsedName struct {
 | 
					type parsedName struct {
 | 
				
			||||||
@@ -128,7 +128,7 @@ func getRootFs(root string, parsed *parsedName) string {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	bytes, err := ioutil.ReadFile(tree)
 | 
						bytes, err := ioutil.ReadFile(tree)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.Errorf("ReadFile failed, couldn't read %v to get upper dir: %v", tree, err)
 | 
							klog.Errorf("ReadFile failed, couldn't read %v to get upper dir: %v", tree, err)
 | 
				
			||||||
		return ""
 | 
							return ""
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/google/cadvisor/container/systemd/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/google/cadvisor/container/systemd/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -7,11 +7,11 @@ go_library(
 | 
				
			|||||||
    importpath = "github.com/google/cadvisor/container/systemd",
 | 
					    importpath = "github.com/google/cadvisor/container/systemd",
 | 
				
			||||||
    visibility = ["//visibility:public"],
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/container:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/container:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/fs:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/fs:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/info/v1:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/info/v1:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/manager/watcher:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/manager/watcher:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/google/cadvisor/container/systemd/factory.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/google/cadvisor/container/systemd/factory.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -23,7 +23,7 @@ import (
 | 
				
			|||||||
	info "github.com/google/cadvisor/info/v1"
 | 
						info "github.com/google/cadvisor/info/v1"
 | 
				
			||||||
	"github.com/google/cadvisor/manager/watcher"
 | 
						"github.com/google/cadvisor/manager/watcher"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type systemdFactory struct{}
 | 
					type systemdFactory struct{}
 | 
				
			||||||
@@ -51,7 +51,7 @@ func (f *systemdFactory) DebugInfo() map[string][]string {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Register registers the systemd container factory.
 | 
					// Register registers the systemd container factory.
 | 
				
			||||||
func Register(machineInfoFactory info.MachineInfoFactory, fsInfo fs.FsInfo, includedMetrics container.MetricSet) error {
 | 
					func Register(machineInfoFactory info.MachineInfoFactory, fsInfo fs.FsInfo, includedMetrics container.MetricSet) error {
 | 
				
			||||||
	glog.V(1).Infof("Registering systemd factory")
 | 
						klog.V(1).Infof("Registering systemd factory")
 | 
				
			||||||
	factory := &systemdFactory{}
 | 
						factory := &systemdFactory{}
 | 
				
			||||||
	container.RegisterContainerHandlerFactory(factory, []watcher.ContainerWatchSource{watcher.Raw})
 | 
						container.RegisterContainerHandlerFactory(factory, []watcher.ContainerWatchSource{watcher.Raw})
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/google/cadvisor/devicemapper/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/google/cadvisor/devicemapper/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -12,7 +12,7 @@ go_library(
 | 
				
			|||||||
    importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/devicemapper",
 | 
					    importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/devicemapper",
 | 
				
			||||||
    importpath = "github.com/google/cadvisor/devicemapper",
 | 
					    importpath = "github.com/google/cadvisor/devicemapper",
 | 
				
			||||||
    visibility = ["//visibility:public"],
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
    deps = ["//vendor/github.com/golang/glog:go_default_library"],
 | 
					    deps = ["//vendor/k8s.io/klog:go_default_library"],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
filegroup(
 | 
					filegroup(
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/google/cadvisor/devicemapper/dmsetup_client.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/google/cadvisor/devicemapper/dmsetup_client.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -18,7 +18,7 @@ import (
 | 
				
			|||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// DmsetupClient is a low-level client for interacting with device mapper via
 | 
					// DmsetupClient is a low-level client for interacting with device mapper via
 | 
				
			||||||
@@ -58,6 +58,6 @@ func (c *defaultDmsetupClient) Status(deviceName string) ([]byte, error) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (*defaultDmsetupClient) dmsetup(args ...string) ([]byte, error) {
 | 
					func (*defaultDmsetupClient) dmsetup(args ...string) ([]byte, error) {
 | 
				
			||||||
	glog.V(5).Infof("running dmsetup %v", strings.Join(args, " "))
 | 
						klog.V(5).Infof("running dmsetup %v", strings.Join(args, " "))
 | 
				
			||||||
	return exec.Command("dmsetup", args...).Output()
 | 
						return exec.Command("dmsetup", args...).Output()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								vendor/github.com/google/cadvisor/devicemapper/thin_ls_client.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/google/cadvisor/devicemapper/thin_ls_client.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -21,7 +21,7 @@ import (
 | 
				
			|||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// thinLsClient knows how to run a thin_ls very specific to CoW usage for
 | 
					// thinLsClient knows how to run a thin_ls very specific to CoW usage for
 | 
				
			||||||
@@ -53,7 +53,7 @@ var _ thinLsClient = &defaultThinLsClient{}
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func (c *defaultThinLsClient) ThinLs(deviceName string) (map[string]uint64, error) {
 | 
					func (c *defaultThinLsClient) ThinLs(deviceName string) (map[string]uint64, error) {
 | 
				
			||||||
	args := []string{"--no-headers", "-m", "-o", "DEV,EXCLUSIVE_BYTES", deviceName}
 | 
						args := []string{"--no-headers", "-m", "-o", "DEV,EXCLUSIVE_BYTES", deviceName}
 | 
				
			||||||
	glog.V(4).Infof("running command: thin_ls %v", strings.Join(args, " "))
 | 
						klog.V(4).Infof("running command: thin_ls %v", strings.Join(args, " "))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	output, err := exec.Command(c.thinLsPath, args...).Output()
 | 
						output, err := exec.Command(c.thinLsPath, args...).Output()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -80,7 +80,7 @@ func parseThinLsOutput(output []byte) map[string]uint64 {
 | 
				
			|||||||
		deviceID := fields[0]
 | 
							deviceID := fields[0]
 | 
				
			||||||
		usage, err := strconv.ParseUint(fields[1], 10, 64)
 | 
							usage, err := strconv.ParseUint(fields[1], 10, 64)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			glog.Warningf("unexpected error parsing thin_ls output: %v", err)
 | 
								klog.Warningf("unexpected error parsing thin_ls output: %v", err)
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										20
									
								
								vendor/github.com/google/cadvisor/devicemapper/thin_pool_watcher.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/github.com/google/cadvisor/devicemapper/thin_pool_watcher.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -19,7 +19,7 @@ import (
 | 
				
			|||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ThinPoolWatcher maintains a cache of device name -> usage stats for a
 | 
					// ThinPoolWatcher maintains a cache of device name -> usage stats for a
 | 
				
			||||||
@@ -58,7 +58,7 @@ func NewThinPoolWatcher(poolName, metadataDevice string) (*ThinPoolWatcher, erro
 | 
				
			|||||||
func (w *ThinPoolWatcher) Start() {
 | 
					func (w *ThinPoolWatcher) Start() {
 | 
				
			||||||
	err := w.Refresh()
 | 
						err := w.Refresh()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.Errorf("encountered error refreshing thin pool watcher: %v", err)
 | 
							klog.Errorf("encountered error refreshing thin pool watcher: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for {
 | 
						for {
 | 
				
			||||||
@@ -69,12 +69,12 @@ func (w *ThinPoolWatcher) Start() {
 | 
				
			|||||||
			start := time.Now()
 | 
								start := time.Now()
 | 
				
			||||||
			err = w.Refresh()
 | 
								err = w.Refresh()
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				glog.Errorf("encountered error refreshing thin pool watcher: %v", err)
 | 
									klog.Errorf("encountered error refreshing thin pool watcher: %v", err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// print latency for refresh
 | 
								// print latency for refresh
 | 
				
			||||||
			duration := time.Since(start)
 | 
								duration := time.Since(start)
 | 
				
			||||||
			glog.V(5).Infof("thin_ls(%d) took %s", start.Unix(), duration)
 | 
								klog.V(5).Infof("thin_ls(%d) took %s", start.Unix(), duration)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -115,7 +115,7 @@ func (w *ThinPoolWatcher) Refresh() error {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if currentlyReserved {
 | 
						if currentlyReserved {
 | 
				
			||||||
		glog.V(5).Infof("metadata for %v is currently reserved; releasing", w.poolName)
 | 
							klog.V(5).Infof("metadata for %v is currently reserved; releasing", w.poolName)
 | 
				
			||||||
		_, err = w.dmsetup.Message(w.poolName, 0, releaseMetadataMessage)
 | 
							_, err = w.dmsetup.Message(w.poolName, 0, releaseMetadataMessage)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			err = fmt.Errorf("error releasing metadata snapshot for %v: %v", w.poolName, err)
 | 
								err = fmt.Errorf("error releasing metadata snapshot for %v: %v", w.poolName, err)
 | 
				
			||||||
@@ -123,22 +123,22 @@ func (w *ThinPoolWatcher) Refresh() error {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	glog.V(5).Infof("reserving metadata snapshot for thin-pool %v", w.poolName)
 | 
						klog.V(5).Infof("reserving metadata snapshot for thin-pool %v", w.poolName)
 | 
				
			||||||
	// NOTE: "0" in the call below is for the 'sector' argument to 'dmsetup
 | 
						// NOTE: "0" in the call below is for the 'sector' argument to 'dmsetup
 | 
				
			||||||
	// message'.  It's not needed for thin pools.
 | 
						// message'.  It's not needed for thin pools.
 | 
				
			||||||
	if output, err := w.dmsetup.Message(w.poolName, 0, reserveMetadataMessage); err != nil {
 | 
						if output, err := w.dmsetup.Message(w.poolName, 0, reserveMetadataMessage); err != nil {
 | 
				
			||||||
		err = fmt.Errorf("error reserving metadata for thin-pool %v: %v output: %v", w.poolName, err, string(output))
 | 
							err = fmt.Errorf("error reserving metadata for thin-pool %v: %v output: %v", w.poolName, err, string(output))
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		glog.V(5).Infof("reserved metadata snapshot for thin-pool %v", w.poolName)
 | 
							klog.V(5).Infof("reserved metadata snapshot for thin-pool %v", w.poolName)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	defer func() {
 | 
						defer func() {
 | 
				
			||||||
		glog.V(5).Infof("releasing metadata snapshot for thin-pool %v", w.poolName)
 | 
							klog.V(5).Infof("releasing metadata snapshot for thin-pool %v", w.poolName)
 | 
				
			||||||
		w.dmsetup.Message(w.poolName, 0, releaseMetadataMessage)
 | 
							w.dmsetup.Message(w.poolName, 0, releaseMetadataMessage)
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	glog.V(5).Infof("running thin_ls on metadata device %v", w.metadataDevice)
 | 
						klog.V(5).Infof("running thin_ls on metadata device %v", w.metadataDevice)
 | 
				
			||||||
	newCache, err := w.thinLsClient.ThinLs(w.metadataDevice)
 | 
						newCache, err := w.thinLsClient.ThinLs(w.metadataDevice)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		err = fmt.Errorf("error performing thin_ls on metadata device %v: %v", w.metadataDevice, err)
 | 
							err = fmt.Errorf("error performing thin_ls on metadata device %v: %v", w.metadataDevice, err)
 | 
				
			||||||
@@ -157,7 +157,7 @@ const (
 | 
				
			|||||||
// checkReservation checks to see whether the thin device is currently holding
 | 
					// checkReservation checks to see whether the thin device is currently holding
 | 
				
			||||||
// userspace metadata.
 | 
					// userspace metadata.
 | 
				
			||||||
func (w *ThinPoolWatcher) checkReservation(poolName string) (bool, error) {
 | 
					func (w *ThinPoolWatcher) checkReservation(poolName string) (bool, error) {
 | 
				
			||||||
	glog.V(5).Infof("checking whether the thin-pool is holding a metadata snapshot")
 | 
						klog.V(5).Infof("checking whether the thin-pool is holding a metadata snapshot")
 | 
				
			||||||
	output, err := w.dmsetup.Status(poolName)
 | 
						output, err := w.dmsetup.Status(poolName)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return false, err
 | 
							return false, err
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/google/cadvisor/events/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/google/cadvisor/events/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -7,9 +7,9 @@ go_library(
 | 
				
			|||||||
    importpath = "github.com/google/cadvisor/events",
 | 
					    importpath = "github.com/google/cadvisor/events",
 | 
				
			||||||
    visibility = ["//visibility:public"],
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/info/v1:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/info/v1:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/utils:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/utils:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								vendor/github.com/google/cadvisor/events/handler.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/google/cadvisor/events/handler.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -24,7 +24,7 @@ import (
 | 
				
			|||||||
	info "github.com/google/cadvisor/info/v1"
 | 
						info "github.com/google/cadvisor/info/v1"
 | 
				
			||||||
	"github.com/google/cadvisor/utils"
 | 
						"github.com/google/cadvisor/utils"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type byTimestamp []*info.Event
 | 
					type byTimestamp []*info.Event
 | 
				
			||||||
@@ -322,7 +322,7 @@ func (self *events) AddEvent(e *info.Event) error {
 | 
				
			|||||||
	for _, watchObject := range watchesToSend {
 | 
						for _, watchObject := range watchesToSend {
 | 
				
			||||||
		watchObject.eventChannel.GetChannel() <- e
 | 
							watchObject.eventChannel.GetChannel() <- e
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	glog.V(4).Infof("Added event %v", e)
 | 
						klog.V(4).Infof("Added event %v", e)
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -332,7 +332,7 @@ func (self *events) StopWatch(watchId int) {
 | 
				
			|||||||
	defer self.watcherLock.Unlock()
 | 
						defer self.watcherLock.Unlock()
 | 
				
			||||||
	_, ok := self.watchers[watchId]
 | 
						_, ok := self.watchers[watchId]
 | 
				
			||||||
	if !ok {
 | 
						if !ok {
 | 
				
			||||||
		glog.Errorf("Could not find watcher instance %v", watchId)
 | 
							klog.Errorf("Could not find watcher instance %v", watchId)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	close(self.watchers[watchId].eventChannel.GetChannel())
 | 
						close(self.watchers[watchId].eventChannel.GetChannel())
 | 
				
			||||||
	delete(self.watchers, watchId)
 | 
						delete(self.watchers, watchId)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/google/cadvisor/fs/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/google/cadvisor/fs/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -12,11 +12,11 @@ go_library(
 | 
				
			|||||||
    deps = select({
 | 
					    deps = select({
 | 
				
			||||||
        "@io_bazel_rules_go//go/platform:linux": [
 | 
					        "@io_bazel_rules_go//go/platform:linux": [
 | 
				
			||||||
            "//vendor/github.com/docker/docker/pkg/mount:go_default_library",
 | 
					            "//vendor/github.com/docker/docker/pkg/mount:go_default_library",
 | 
				
			||||||
            "//vendor/github.com/golang/glog:go_default_library",
 | 
					 | 
				
			||||||
            "//vendor/github.com/google/cadvisor/devicemapper:go_default_library",
 | 
					            "//vendor/github.com/google/cadvisor/devicemapper:go_default_library",
 | 
				
			||||||
            "//vendor/github.com/google/cadvisor/utils:go_default_library",
 | 
					            "//vendor/github.com/google/cadvisor/utils:go_default_library",
 | 
				
			||||||
            "//vendor/github.com/google/cadvisor/utils/docker:go_default_library",
 | 
					            "//vendor/github.com/google/cadvisor/utils/docker:go_default_library",
 | 
				
			||||||
            "//vendor/github.com/mistifyio/go-zfs:go_default_library",
 | 
					            "//vendor/github.com/mistifyio/go-zfs:go_default_library",
 | 
				
			||||||
 | 
					            "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
        ],
 | 
					        ],
 | 
				
			||||||
        "//conditions:default": [],
 | 
					        "//conditions:default": [],
 | 
				
			||||||
    }),
 | 
					    }),
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										38
									
								
								vendor/github.com/google/cadvisor/fs/fs.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										38
									
								
								vendor/github.com/google/cadvisor/fs/fs.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -33,11 +33,11 @@ import (
 | 
				
			|||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/docker/docker/pkg/mount"
 | 
						"github.com/docker/docker/pkg/mount"
 | 
				
			||||||
	"github.com/golang/glog"
 | 
					 | 
				
			||||||
	"github.com/google/cadvisor/devicemapper"
 | 
						"github.com/google/cadvisor/devicemapper"
 | 
				
			||||||
	"github.com/google/cadvisor/utils"
 | 
						"github.com/google/cadvisor/utils"
 | 
				
			||||||
	dockerutil "github.com/google/cadvisor/utils/docker"
 | 
						dockerutil "github.com/google/cadvisor/utils/docker"
 | 
				
			||||||
	zfs "github.com/mistifyio/go-zfs"
 | 
						zfs "github.com/mistifyio/go-zfs"
 | 
				
			||||||
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
@@ -114,9 +114,9 @@ func NewFsInfo(context Context) (FsInfo, error) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	fsUUIDToDeviceName, err := getFsUUIDToDeviceNameMap()
 | 
						fsUUIDToDeviceName, err := getFsUUIDToDeviceNameMap()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		// UUID is not always avaiable across different OS distributions.
 | 
							// UUID is not always available across different OS distributions.
 | 
				
			||||||
		// Do not fail if there is an error.
 | 
							// Do not fail if there is an error.
 | 
				
			||||||
		glog.Warningf("Failed to get disk UUID mapping, getting disk info by uuid will not work: %v", err)
 | 
							klog.Warningf("Failed to get disk UUID mapping, getting disk info by uuid will not work: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Avoid devicemapper container mounts - these are tracked by the ThinPoolWatcher
 | 
						// Avoid devicemapper container mounts - these are tracked by the ThinPoolWatcher
 | 
				
			||||||
@@ -139,8 +139,8 @@ func NewFsInfo(context Context) (FsInfo, error) {
 | 
				
			|||||||
	fsInfo.addDockerImagesLabel(context, mounts)
 | 
						fsInfo.addDockerImagesLabel(context, mounts)
 | 
				
			||||||
	fsInfo.addCrioImagesLabel(context, mounts)
 | 
						fsInfo.addCrioImagesLabel(context, mounts)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	glog.V(1).Infof("Filesystem UUIDs: %+v", fsInfo.fsUUIDToDeviceName)
 | 
						klog.V(1).Infof("Filesystem UUIDs: %+v", fsInfo.fsUUIDToDeviceName)
 | 
				
			||||||
	glog.V(1).Infof("Filesystem partitions: %+v", fsInfo.partitions)
 | 
						klog.V(1).Infof("Filesystem partitions: %+v", fsInfo.partitions)
 | 
				
			||||||
	fsInfo.addSystemRootLabel(mounts)
 | 
						fsInfo.addSystemRootLabel(mounts)
 | 
				
			||||||
	return fsInfo, nil
 | 
						return fsInfo, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -165,7 +165,7 @@ func getFsUUIDToDeviceNameMap() (map[string]string, error) {
 | 
				
			|||||||
		path := filepath.Join(dir, file.Name())
 | 
							path := filepath.Join(dir, file.Name())
 | 
				
			||||||
		target, err := os.Readlink(path)
 | 
							target, err := os.Readlink(path)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			glog.Warningf("Failed to resolve symlink for %q", path)
 | 
								klog.Warningf("Failed to resolve symlink for %q", path)
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		device, err := filepath.Abs(filepath.Join(dir, target))
 | 
							device, err := filepath.Abs(filepath.Join(dir, target))
 | 
				
			||||||
@@ -213,7 +213,7 @@ func processMounts(mounts []*mount.Info, excludedMountpointPrefixes []string) ma
 | 
				
			|||||||
		if mount.Fstype == "btrfs" && mount.Major == 0 && strings.HasPrefix(mount.Source, "/dev/") {
 | 
							if mount.Fstype == "btrfs" && mount.Major == 0 && strings.HasPrefix(mount.Source, "/dev/") {
 | 
				
			||||||
			major, minor, err := getBtrfsMajorMinorIds(mount)
 | 
								major, minor, err := getBtrfsMajorMinorIds(mount)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				glog.Warningf("%s", err)
 | 
									klog.Warningf("%s", err)
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				mount.Major = major
 | 
									mount.Major = major
 | 
				
			||||||
				mount.Minor = minor
 | 
									mount.Minor = minor
 | 
				
			||||||
@@ -278,7 +278,7 @@ func (self *RealFsInfo) addSystemRootLabel(mounts []*mount.Info) {
 | 
				
			|||||||
func (self *RealFsInfo) addDockerImagesLabel(context Context, mounts []*mount.Info) {
 | 
					func (self *RealFsInfo) addDockerImagesLabel(context Context, mounts []*mount.Info) {
 | 
				
			||||||
	dockerDev, dockerPartition, err := self.getDockerDeviceMapperInfo(context.Docker)
 | 
						dockerDev, dockerPartition, err := self.getDockerDeviceMapperInfo(context.Docker)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.Warningf("Could not get Docker devicemapper device: %v", err)
 | 
							klog.Warningf("Could not get Docker devicemapper device: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if len(dockerDev) > 0 && dockerPartition != nil {
 | 
						if len(dockerDev) > 0 && dockerPartition != nil {
 | 
				
			||||||
		self.partitions[dockerDev] = *dockerPartition
 | 
							self.partitions[dockerDev] = *dockerPartition
 | 
				
			||||||
@@ -405,7 +405,7 @@ func (self *RealFsInfo) GetFsInfoForPath(mountSet map[string]struct{}) ([]Fs, er
 | 
				
			|||||||
			switch partition.fsType {
 | 
								switch partition.fsType {
 | 
				
			||||||
			case DeviceMapper.String():
 | 
								case DeviceMapper.String():
 | 
				
			||||||
				fs.Capacity, fs.Free, fs.Available, err = getDMStats(device, partition.blockSize)
 | 
									fs.Capacity, fs.Free, fs.Available, err = getDMStats(device, partition.blockSize)
 | 
				
			||||||
				glog.V(5).Infof("got devicemapper fs capacity stats: capacity: %v free: %v available: %v:", fs.Capacity, fs.Free, fs.Available)
 | 
									klog.V(5).Infof("got devicemapper fs capacity stats: capacity: %v free: %v available: %v:", fs.Capacity, fs.Free, fs.Available)
 | 
				
			||||||
				fs.Type = DeviceMapper
 | 
									fs.Type = DeviceMapper
 | 
				
			||||||
			case ZFS.String():
 | 
								case ZFS.String():
 | 
				
			||||||
				fs.Capacity, fs.Free, fs.Available, err = getZfstats(device)
 | 
									fs.Capacity, fs.Free, fs.Available, err = getZfstats(device)
 | 
				
			||||||
@@ -418,11 +418,11 @@ func (self *RealFsInfo) GetFsInfoForPath(mountSet map[string]struct{}) ([]Fs, er
 | 
				
			|||||||
					fs.InodesFree = &inodesFree
 | 
										fs.InodesFree = &inodesFree
 | 
				
			||||||
					fs.Type = VFS
 | 
										fs.Type = VFS
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
					glog.V(4).Infof("unable to determine file system type, partition mountpoint does not exist: %v", partition.mountpoint)
 | 
										klog.V(4).Infof("unable to determine file system type, partition mountpoint does not exist: %v", partition.mountpoint)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				glog.V(4).Infof("Stat fs failed. Error: %v", err)
 | 
									klog.V(4).Infof("Stat fs failed. Error: %v", err)
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				deviceSet[device] = struct{}{}
 | 
									deviceSet[device] = struct{}{}
 | 
				
			||||||
				fs.DeviceInfo = DeviceInfo{
 | 
									fs.DeviceInfo = DeviceInfo{
 | 
				
			||||||
@@ -445,7 +445,7 @@ func getDiskStatsMap(diskStatsFile string) (map[string]DiskStats, error) {
 | 
				
			|||||||
	file, err := os.Open(diskStatsFile)
 | 
						file, err := os.Open(diskStatsFile)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		if os.IsNotExist(err) {
 | 
							if os.IsNotExist(err) {
 | 
				
			||||||
			glog.Warningf("Not collecting filesystem statistics because file %q was not found", diskStatsFile)
 | 
								klog.Warningf("Not collecting filesystem statistics because file %q was not found", diskStatsFile)
 | 
				
			||||||
			return diskStatsMap, nil
 | 
								return diskStatsMap, nil
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
@@ -551,7 +551,7 @@ func (self *RealFsInfo) GetDirFsDevice(dir string) (*DeviceInfo, error) {
 | 
				
			|||||||
	if found && mount.Fstype == "btrfs" && mount.Major == 0 && strings.HasPrefix(mount.Source, "/dev/") {
 | 
						if found && mount.Fstype == "btrfs" && mount.Major == 0 && strings.HasPrefix(mount.Source, "/dev/") {
 | 
				
			||||||
		major, minor, err := getBtrfsMajorMinorIds(mount)
 | 
							major, minor, err := getBtrfsMajorMinorIds(mount)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			glog.Warningf("%s", err)
 | 
								klog.Warningf("%s", err)
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			return &DeviceInfo{mount.Source, uint(major), uint(minor)}, nil
 | 
								return &DeviceInfo{mount.Source, uint(major), uint(minor)}, nil
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -583,12 +583,12 @@ func GetDirDiskUsage(dir string, timeout time.Duration) (uint64, error) {
 | 
				
			|||||||
		return 0, fmt.Errorf("failed to exec du - %v", err)
 | 
							return 0, fmt.Errorf("failed to exec du - %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	timer := time.AfterFunc(timeout, func() {
 | 
						timer := time.AfterFunc(timeout, func() {
 | 
				
			||||||
		glog.Warningf("Killing cmd %v due to timeout(%s)", cmd.Args, timeout.String())
 | 
							klog.Warningf("Killing cmd %v due to timeout(%s)", cmd.Args, timeout.String())
 | 
				
			||||||
		cmd.Process.Kill()
 | 
							cmd.Process.Kill()
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	stdoutb, souterr := ioutil.ReadAll(stdoutp)
 | 
						stdoutb, souterr := ioutil.ReadAll(stdoutp)
 | 
				
			||||||
	if souterr != nil {
 | 
						if souterr != nil {
 | 
				
			||||||
		glog.Errorf("Failed to read from stdout for cmd %v - %v", cmd.Args, souterr)
 | 
							klog.Errorf("Failed to read from stdout for cmd %v - %v", cmd.Args, souterr)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	stderrb, _ := ioutil.ReadAll(stderrp)
 | 
						stderrb, _ := ioutil.ReadAll(stderrp)
 | 
				
			||||||
	err = cmd.Wait()
 | 
						err = cmd.Wait()
 | 
				
			||||||
@@ -622,7 +622,7 @@ func GetDirInodeUsage(dir string, timeout time.Duration) (uint64, error) {
 | 
				
			|||||||
		return 0, fmt.Errorf("failed to exec cmd %v - %v; stderr: %v", findCmd.Args, err, stderr.String())
 | 
							return 0, fmt.Errorf("failed to exec cmd %v - %v; stderr: %v", findCmd.Args, err, stderr.String())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	timer := time.AfterFunc(timeout, func() {
 | 
						timer := time.AfterFunc(timeout, func() {
 | 
				
			||||||
		glog.Warningf("Killing cmd %v due to timeout(%s)", findCmd.Args, timeout.String())
 | 
							klog.Warningf("Killing cmd %v due to timeout(%s)", findCmd.Args, timeout.String())
 | 
				
			||||||
		findCmd.Process.Kill()
 | 
							findCmd.Process.Kill()
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	err := findCmd.Wait()
 | 
						err := findCmd.Wait()
 | 
				
			||||||
@@ -763,7 +763,7 @@ func getBtrfsMajorMinorIds(mount *mount.Info) (int, int, error) {
 | 
				
			|||||||
		return 0, 0, err
 | 
							return 0, 0, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	glog.V(4).Infof("btrfs mount %#v", mount)
 | 
						klog.V(4).Infof("btrfs mount %#v", mount)
 | 
				
			||||||
	if buf.Mode&syscall.S_IFMT == syscall.S_IFBLK {
 | 
						if buf.Mode&syscall.S_IFMT == syscall.S_IFBLK {
 | 
				
			||||||
		err := syscall.Stat(mount.Mountpoint, buf)
 | 
							err := syscall.Stat(mount.Mountpoint, buf)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
@@ -771,8 +771,8 @@ func getBtrfsMajorMinorIds(mount *mount.Info) (int, int, error) {
 | 
				
			|||||||
			return 0, 0, err
 | 
								return 0, 0, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		glog.V(4).Infof("btrfs dev major:minor %d:%d\n", int(major(buf.Dev)), int(minor(buf.Dev)))
 | 
							klog.V(4).Infof("btrfs dev major:minor %d:%d\n", int(major(buf.Dev)), int(minor(buf.Dev)))
 | 
				
			||||||
		glog.V(4).Infof("btrfs rdev major:minor %d:%d\n", int(major(buf.Rdev)), int(minor(buf.Rdev)))
 | 
							klog.V(4).Infof("btrfs rdev major:minor %d:%d\n", int(major(buf.Rdev)), int(minor(buf.Rdev)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return int(major(buf.Dev)), int(minor(buf.Dev)), nil
 | 
							return int(major(buf.Dev)), int(minor(buf.Dev)), nil
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										15
									
								
								vendor/github.com/google/cadvisor/info/v1/container.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								vendor/github.com/google/cadvisor/info/v1/container.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -102,11 +102,11 @@ type ContainerInfoRequest struct {
 | 
				
			|||||||
	NumStats int `json:"num_stats,omitempty"`
 | 
						NumStats int `json:"num_stats,omitempty"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Start time for which to query information.
 | 
						// Start time for which to query information.
 | 
				
			||||||
	// If ommitted, the beginning of time is assumed.
 | 
						// If omitted, the beginning of time is assumed.
 | 
				
			||||||
	Start time.Time `json:"start,omitempty"`
 | 
						Start time.Time `json:"start,omitempty"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// End time for which to query information.
 | 
						// End time for which to query information.
 | 
				
			||||||
	// If ommitted, current time is assumed.
 | 
						// If omitted, current time is assumed.
 | 
				
			||||||
	End time.Time `json:"end,omitempty"`
 | 
						End time.Time `json:"end,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -557,6 +557,14 @@ type AcceleratorStats struct {
 | 
				
			|||||||
	DutyCycle uint64 `json:"duty_cycle"`
 | 
						DutyCycle uint64 `json:"duty_cycle"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ProcessStats struct {
 | 
				
			||||||
 | 
						// Number of processes
 | 
				
			||||||
 | 
						ProcessCount uint64 `json:"process_count"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Number of open file descriptors
 | 
				
			||||||
 | 
						FdCount uint64 `json:"fd_count"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type ContainerStats struct {
 | 
					type ContainerStats struct {
 | 
				
			||||||
	// The time of this stat point.
 | 
						// The time of this stat point.
 | 
				
			||||||
	Timestamp time.Time    `json:"timestamp"`
 | 
						Timestamp time.Time    `json:"timestamp"`
 | 
				
			||||||
@@ -574,6 +582,9 @@ type ContainerStats struct {
 | 
				
			|||||||
	// Metrics for Accelerators. Each Accelerator corresponds to one element in the array.
 | 
						// Metrics for Accelerators. Each Accelerator corresponds to one element in the array.
 | 
				
			||||||
	Accelerators []AcceleratorStats `json:"accelerators,omitempty"`
 | 
						Accelerators []AcceleratorStats `json:"accelerators,omitempty"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// ProcessStats for Containers
 | 
				
			||||||
 | 
						Processes ProcessStats `json:"processes,omitempty"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Custom metrics from all collectors
 | 
						// Custom metrics from all collectors
 | 
				
			||||||
	CustomMetrics map[string][]MetricVal `json:"custom_metrics,omitempty"`
 | 
						CustomMetrics map[string][]MetricVal `json:"custom_metrics,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/google/cadvisor/info/v2/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/google/cadvisor/info/v2/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -11,8 +11,8 @@ go_library(
 | 
				
			|||||||
    importpath = "github.com/google/cadvisor/info/v2",
 | 
					    importpath = "github.com/google/cadvisor/info/v2",
 | 
				
			||||||
    visibility = ["//visibility:public"],
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/info/v1:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/info/v1:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								vendor/github.com/google/cadvisor/info/v2/container.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/google/cadvisor/info/v2/container.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -38,7 +38,7 @@ type CpuSpec struct {
 | 
				
			|||||||
	Mask string `json:"mask,omitempty"`
 | 
						Mask string `json:"mask,omitempty"`
 | 
				
			||||||
	// CPUQuota Default is disabled
 | 
						// CPUQuota Default is disabled
 | 
				
			||||||
	Quota uint64 `json:"quota,omitempty"`
 | 
						Quota uint64 `json:"quota,omitempty"`
 | 
				
			||||||
	// Period is the CPU reference time in ns e.g the quota is compared aginst this.
 | 
						// Period is the CPU reference time in ns e.g the quota is compared against this.
 | 
				
			||||||
	Period uint64 `json:"period,omitempty"`
 | 
						Period uint64 `json:"period,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -254,6 +254,7 @@ type ProcessInfo struct {
 | 
				
			|||||||
	RunningTime   string  `json:"running_time"`
 | 
						RunningTime   string  `json:"running_time"`
 | 
				
			||||||
	CgroupPath    string  `json:"cgroup_path"`
 | 
						CgroupPath    string  `json:"cgroup_path"`
 | 
				
			||||||
	Cmd           string  `json:"cmd"`
 | 
						Cmd           string  `json:"cmd"`
 | 
				
			||||||
 | 
						FdCount       int     `json:"fd_count"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type TcpStat struct {
 | 
					type TcpStat struct {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										10
									
								
								vendor/github.com/google/cadvisor/info/v2/conversion.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/google/cadvisor/info/v2/conversion.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -18,8 +18,8 @@ import (
 | 
				
			|||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
					 | 
				
			||||||
	"github.com/google/cadvisor/info/v1"
 | 
						"github.com/google/cadvisor/info/v1"
 | 
				
			||||||
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func machineFsStatsFromV1(fsStats []v1.FsStats) []MachineFsStats {
 | 
					func machineFsStatsFromV1(fsStats []v1.FsStats) []MachineFsStats {
 | 
				
			||||||
@@ -70,7 +70,7 @@ func MachineStatsFromV1(cont *v1.ContainerInfo) []MachineStats {
 | 
				
			|||||||
			stat.Cpu = &val.Cpu
 | 
								stat.Cpu = &val.Cpu
 | 
				
			||||||
			cpuInst, err := InstCpuStats(last, val)
 | 
								cpuInst, err := InstCpuStats(last, val)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				glog.Warningf("Could not get instant cpu stats: %v", err)
 | 
									klog.Warningf("Could not get instant cpu stats: %v", err)
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				stat.CpuInst = cpuInst
 | 
									stat.CpuInst = cpuInst
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -107,7 +107,7 @@ func ContainerStatsFromV1(containerName string, spec *v1.ContainerSpec, stats []
 | 
				
			|||||||
			stat.Cpu = &val.Cpu
 | 
								stat.Cpu = &val.Cpu
 | 
				
			||||||
			cpuInst, err := InstCpuStats(last, val)
 | 
								cpuInst, err := InstCpuStats(last, val)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				glog.Warningf("Could not get instant cpu stats: %v", err)
 | 
									klog.Warningf("Could not get instant cpu stats: %v", err)
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				stat.CpuInst = cpuInst
 | 
									stat.CpuInst = cpuInst
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -133,7 +133,7 @@ func ContainerStatsFromV1(containerName string, spec *v1.ContainerSpec, stats []
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
			} else if len(val.Filesystem) > 1 && containerName != "/" {
 | 
								} else if len(val.Filesystem) > 1 && containerName != "/" {
 | 
				
			||||||
				// Cannot handle multiple devices per container.
 | 
									// Cannot handle multiple devices per container.
 | 
				
			||||||
				glog.V(4).Infof("failed to handle multiple devices for container %s. Skipping Filesystem stats", containerName)
 | 
									klog.V(4).Infof("failed to handle multiple devices for container %s. Skipping Filesystem stats", containerName)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if spec.HasDiskIo {
 | 
							if spec.HasDiskIo {
 | 
				
			||||||
@@ -168,7 +168,7 @@ func DeprecatedStatsFromV1(cont *v1.ContainerInfo) []DeprecatedContainerStats {
 | 
				
			|||||||
			stat.Cpu = val.Cpu
 | 
								stat.Cpu = val.Cpu
 | 
				
			||||||
			cpuInst, err := InstCpuStats(last, val)
 | 
								cpuInst, err := InstCpuStats(last, val)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				glog.Warningf("Could not get instant cpu stats: %v", err)
 | 
									klog.Warningf("Could not get instant cpu stats: %v", err)
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				stat.CpuInst = cpuInst
 | 
									stat.CpuInst = cpuInst
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/google/cadvisor/machine/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/google/cadvisor/machine/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -11,7 +11,6 @@ go_library(
 | 
				
			|||||||
    visibility = ["//visibility:public"],
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//vendor/github.com/docker/docker/pkg/parsers/operatingsystem:go_default_library",
 | 
					        "//vendor/github.com/docker/docker/pkg/parsers/operatingsystem:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/fs:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/fs:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/info/v1:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/info/v1:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/utils:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/utils:go_default_library",
 | 
				
			||||||
@@ -19,6 +18,7 @@ go_library(
 | 
				
			|||||||
        "//vendor/github.com/google/cadvisor/utils/sysfs:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/utils/sysfs:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/utils/sysinfo:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/utils/sysinfo:go_default_library",
 | 
				
			||||||
        "//vendor/golang.org/x/sys/unix:go_default_library",
 | 
					        "//vendor/golang.org/x/sys/unix:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										14
									
								
								vendor/github.com/google/cadvisor/machine/info.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								vendor/github.com/google/cadvisor/machine/info.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -30,7 +30,7 @@ import (
 | 
				
			|||||||
	"github.com/google/cadvisor/utils/sysfs"
 | 
						"github.com/google/cadvisor/utils/sysfs"
 | 
				
			||||||
	"github.com/google/cadvisor/utils/sysinfo"
 | 
						"github.com/google/cadvisor/utils/sysinfo"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
						"k8s.io/klog"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"golang.org/x/sys/unix"
 | 
						"golang.org/x/sys/unix"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -50,7 +50,7 @@ func getInfoFromFiles(filePaths string) string {
 | 
				
			|||||||
			return strings.TrimSpace(string(id))
 | 
								return strings.TrimSpace(string(id))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	glog.Warningf("Couldn't collect info from any of the files in %q", filePaths)
 | 
						klog.Warningf("Couldn't collect info from any of the files in %q", filePaths)
 | 
				
			||||||
	return ""
 | 
						return ""
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -117,27 +117,27 @@ func Info(sysFs sysfs.SysFs, fsInfo fs.FsInfo, inHostNamespace bool) (*info.Mach
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	filesystems, err := fsInfo.GetGlobalFsInfo()
 | 
						filesystems, err := fsInfo.GetGlobalFsInfo()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.Errorf("Failed to get global filesystem information: %v", err)
 | 
							klog.Errorf("Failed to get global filesystem information: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	diskMap, err := sysinfo.GetBlockDeviceInfo(sysFs)
 | 
						diskMap, err := sysinfo.GetBlockDeviceInfo(sysFs)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.Errorf("Failed to get disk map: %v", err)
 | 
							klog.Errorf("Failed to get disk map: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	netDevices, err := sysinfo.GetNetworkDevices(sysFs)
 | 
						netDevices, err := sysinfo.GetNetworkDevices(sysFs)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.Errorf("Failed to get network devices: %v", err)
 | 
							klog.Errorf("Failed to get network devices: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	topology, numCores, err := GetTopology(sysFs, string(cpuinfo))
 | 
						topology, numCores, err := GetTopology(sysFs, string(cpuinfo))
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.Errorf("Failed to get topology information: %v", err)
 | 
							klog.Errorf("Failed to get topology information: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	systemUUID, err := sysinfo.GetSystemUUID(sysFs)
 | 
						systemUUID, err := sysinfo.GetSystemUUID(sysFs)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.Errorf("Failed to get system UUID: %v", err)
 | 
							klog.Errorf("Failed to get system UUID: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	realCloudInfo := cloudinfo.NewRealCloudInfo()
 | 
						realCloudInfo := cloudinfo.NewRealCloudInfo()
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/google/cadvisor/machine/machine.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/google/cadvisor/machine/machine.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -30,7 +30,7 @@ import (
 | 
				
			|||||||
	"github.com/google/cadvisor/utils/sysfs"
 | 
						"github.com/google/cadvisor/utils/sysfs"
 | 
				
			||||||
	"github.com/google/cadvisor/utils/sysinfo"
 | 
						"github.com/google/cadvisor/utils/sysinfo"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
						"k8s.io/klog"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"golang.org/x/sys/unix"
 | 
						"golang.org/x/sys/unix"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -191,7 +191,7 @@ func GetTopology(sysFs sysfs.SysFs, cpuinfo string) ([]info.Node, int, error) {
 | 
				
			|||||||
	for idx, node := range nodes {
 | 
						for idx, node := range nodes {
 | 
				
			||||||
		caches, err := sysinfo.GetCacheInfo(sysFs, node.Cores[0].Threads[0])
 | 
							caches, err := sysinfo.GetCacheInfo(sysFs, node.Cores[0].Threads[0])
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			glog.Errorf("failed to get cache information for node %d: %v", node.Id, err)
 | 
								klog.Errorf("failed to get cache information for node %d: %v", node.Id, err)
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		numThreadsPerCore := len(node.Cores[0].Threads)
 | 
							numThreadsPerCore := len(node.Cores[0].Threads)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/google/cadvisor/manager/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/google/cadvisor/manager/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -11,7 +11,6 @@ go_library(
 | 
				
			|||||||
    visibility = ["//visibility:public"],
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//vendor/github.com/docker/go-units:go_default_library",
 | 
					        "//vendor/github.com/docker/go-units:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/accelerators:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/accelerators:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/cache/memory:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/cache/memory:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/collector:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/collector:go_default_library",
 | 
				
			||||||
@@ -38,6 +37,7 @@ go_library(
 | 
				
			|||||||
        "//vendor/github.com/google/cadvisor/version:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/version:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library",
 | 
					        "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library",
 | 
				
			||||||
        "//vendor/golang.org/x/net/context:go_default_library",
 | 
					        "//vendor/golang.org/x/net/context:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/utils/clock:go_default_library",
 | 
					        "//vendor/k8s.io/utils/clock:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										46
									
								
								vendor/github.com/google/cadvisor/manager/container.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										46
									
								
								vendor/github.com/google/cadvisor/manager/container.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -39,7 +39,7 @@ import (
 | 
				
			|||||||
	"github.com/google/cadvisor/utils/cpuload"
 | 
						"github.com/google/cadvisor/utils/cpuload"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	units "github.com/docker/go-units"
 | 
						units "github.com/docker/go-units"
 | 
				
			||||||
	"github.com/golang/glog"
 | 
						"k8s.io/klog"
 | 
				
			||||||
	"k8s.io/utils/clock"
 | 
						"k8s.io/utils/clock"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -47,7 +47,9 @@ import (
 | 
				
			|||||||
var enableLoadReader = flag.Bool("enable_load_reader", false, "Whether to enable cpu load reader")
 | 
					var enableLoadReader = flag.Bool("enable_load_reader", false, "Whether to enable cpu load reader")
 | 
				
			||||||
var HousekeepingInterval = flag.Duration("housekeeping_interval", 1*time.Second, "Interval between container housekeepings")
 | 
					var HousekeepingInterval = flag.Duration("housekeeping_interval", 1*time.Second, "Interval between container housekeepings")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var cgroupPathRegExp = regexp.MustCompile(`devices[^:]*:(.*?)[,;$]`)
 | 
					// cgroup type chosen to fetch the cgroup path of a process.
 | 
				
			||||||
 | 
					// Memory has been chosen, as it is one of the default cgroups that is enabled for most containers.
 | 
				
			||||||
 | 
					var cgroupPathRegExp = regexp.MustCompile(`memory[^:]*:(.*?)[,;$]`)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type containerInfo struct {
 | 
					type containerInfo struct {
 | 
				
			||||||
	info.ContainerReference
 | 
						info.ContainerReference
 | 
				
			||||||
@@ -185,8 +187,8 @@ func (c *containerData) getCgroupPath(cgroups string) (string, error) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	matches := cgroupPathRegExp.FindSubmatch([]byte(cgroups))
 | 
						matches := cgroupPathRegExp.FindSubmatch([]byte(cgroups))
 | 
				
			||||||
	if len(matches) != 2 {
 | 
						if len(matches) != 2 {
 | 
				
			||||||
		glog.V(3).Infof("failed to get devices cgroup path from %q", cgroups)
 | 
							klog.V(3).Infof("failed to get memory cgroup path from %q", cgroups)
 | 
				
			||||||
		// return root in case of failures - devices hierarchy might not be enabled.
 | 
							// return root in case of failures - memory hierarchy might not be enabled.
 | 
				
			||||||
		return "/", nil
 | 
							return "/", nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return string(matches[1]), nil
 | 
						return string(matches[1]), nil
 | 
				
			||||||
@@ -206,7 +208,7 @@ func (c *containerData) ReadFile(filepath string, inHostNamespace bool) ([]byte,
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	for _, pid := range pids {
 | 
						for _, pid := range pids {
 | 
				
			||||||
		filePath := path.Join(rootfs, "/proc", pid, "/root", filepath)
 | 
							filePath := path.Join(rootfs, "/proc", pid, "/root", filepath)
 | 
				
			||||||
		glog.V(3).Infof("Trying path %q", filePath)
 | 
							klog.V(3).Infof("Trying path %q", filePath)
 | 
				
			||||||
		data, err := ioutil.ReadFile(filePath)
 | 
							data, err := ioutil.ReadFile(filePath)
 | 
				
			||||||
		if err == nil {
 | 
							if err == nil {
 | 
				
			||||||
			return data, err
 | 
								return data, err
 | 
				
			||||||
@@ -266,6 +268,10 @@ func (c *containerData) getContainerPids(inHostNamespace bool) ([]string, error)
 | 
				
			|||||||
func (c *containerData) GetProcessList(cadvisorContainer string, inHostNamespace bool) ([]v2.ProcessInfo, error) {
 | 
					func (c *containerData) GetProcessList(cadvisorContainer string, inHostNamespace bool) ([]v2.ProcessInfo, error) {
 | 
				
			||||||
	// report all processes for root.
 | 
						// report all processes for root.
 | 
				
			||||||
	isRoot := c.info.Name == "/"
 | 
						isRoot := c.info.Name == "/"
 | 
				
			||||||
 | 
						rootfs := "/"
 | 
				
			||||||
 | 
						if !inHostNamespace {
 | 
				
			||||||
 | 
							rootfs = "/rootfs"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	format := "user,pid,ppid,stime,pcpu,pmem,rss,vsz,stat,time,comm,cgroup"
 | 
						format := "user,pid,ppid,stime,pcpu,pmem,rss,vsz,stat,time,comm,cgroup"
 | 
				
			||||||
	out, err := c.getPsOutput(inHostNamespace, format)
 | 
						out, err := c.getPsOutput(inHostNamespace, format)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -324,6 +330,15 @@ func (c *containerData) GetProcessList(cadvisorContainer string, inHostNamespace
 | 
				
			|||||||
			cgroupPath = cgroup
 | 
								cgroupPath = cgroup
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							var fdCount int
 | 
				
			||||||
 | 
							dirPath := path.Join(rootfs, "/proc", strconv.Itoa(pid), "fd")
 | 
				
			||||||
 | 
							fds, err := ioutil.ReadDir(dirPath)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								klog.V(4).Infof("error while listing directory %q to measure fd count: %v", dirPath, err)
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							fdCount = len(fds)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if isRoot || c.info.Name == cgroup {
 | 
							if isRoot || c.info.Name == cgroup {
 | 
				
			||||||
			processes = append(processes, v2.ProcessInfo{
 | 
								processes = append(processes, v2.ProcessInfo{
 | 
				
			||||||
				User:          fields[0],
 | 
									User:          fields[0],
 | 
				
			||||||
@@ -338,6 +353,7 @@ func (c *containerData) GetProcessList(cadvisorContainer string, inHostNamespace
 | 
				
			|||||||
				RunningTime:   fields[9],
 | 
									RunningTime:   fields[9],
 | 
				
			||||||
				Cmd:           fields[10],
 | 
									Cmd:           fields[10],
 | 
				
			||||||
				CgroupPath:    cgroupPath,
 | 
									CgroupPath:    cgroupPath,
 | 
				
			||||||
 | 
									FdCount:       fdCount,
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -377,7 +393,7 @@ func newContainerData(containerName string, memoryCache *memory.InMemoryCache, h
 | 
				
			|||||||
		// Create cpu load reader.
 | 
							// Create cpu load reader.
 | 
				
			||||||
		loadReader, err := cpuload.New()
 | 
							loadReader, err := cpuload.New()
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			glog.Warningf("Could not initialize cpu load reader for %q: %s", ref.Name, err)
 | 
								klog.Warningf("Could not initialize cpu load reader for %q: %s", ref.Name, err)
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			cont.loadReader = loadReader
 | 
								cont.loadReader = loadReader
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -390,7 +406,7 @@ func newContainerData(containerName string, memoryCache *memory.InMemoryCache, h
 | 
				
			|||||||
	cont.summaryReader, err = summary.New(cont.info.Spec)
 | 
						cont.summaryReader, err = summary.New(cont.info.Spec)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		cont.summaryReader = nil
 | 
							cont.summaryReader = nil
 | 
				
			||||||
		glog.Warningf("Failed to create summary reader for %q: %v", ref.Name, err)
 | 
							klog.Warningf("Failed to create summary reader for %q: %v", ref.Name, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return cont, nil
 | 
						return cont, nil
 | 
				
			||||||
@@ -403,7 +419,7 @@ func (self *containerData) nextHousekeepingInterval() time.Duration {
 | 
				
			|||||||
		stats, err := self.memoryCache.RecentStats(self.info.Name, empty, empty, 2)
 | 
							stats, err := self.memoryCache.RecentStats(self.info.Name, empty, empty, 2)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			if self.allowErrorLogging() {
 | 
								if self.allowErrorLogging() {
 | 
				
			||||||
				glog.Warningf("Failed to get RecentStats(%q) while determining the next housekeeping: %v", self.info.Name, err)
 | 
									klog.Warningf("Failed to get RecentStats(%q) while determining the next housekeeping: %v", self.info.Name, err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		} else if len(stats) == 2 {
 | 
							} else if len(stats) == 2 {
 | 
				
			||||||
			// TODO(vishnuk): Use no processes as a signal.
 | 
								// TODO(vishnuk): Use no processes as a signal.
 | 
				
			||||||
@@ -433,7 +449,7 @@ func (c *containerData) housekeeping() {
 | 
				
			|||||||
	if c.loadReader != nil {
 | 
						if c.loadReader != nil {
 | 
				
			||||||
		err := c.loadReader.Start()
 | 
							err := c.loadReader.Start()
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			glog.Warningf("Could not start cpu load stat collector for %q: %s", c.info.Name, err)
 | 
								klog.Warningf("Could not start cpu load stat collector for %q: %s", c.info.Name, err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		defer c.loadReader.Stop()
 | 
							defer c.loadReader.Stop()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -445,7 +461,7 @@ func (c *containerData) housekeeping() {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Housekeep every second.
 | 
						// Housekeep every second.
 | 
				
			||||||
	glog.V(3).Infof("Start housekeeping for container %q\n", c.info.Name)
 | 
						klog.V(3).Infof("Start housekeeping for container %q\n", c.info.Name)
 | 
				
			||||||
	houseKeepingTimer := c.clock.NewTimer(0 * time.Second)
 | 
						houseKeepingTimer := c.clock.NewTimer(0 * time.Second)
 | 
				
			||||||
	defer houseKeepingTimer.Stop()
 | 
						defer houseKeepingTimer.Stop()
 | 
				
			||||||
	for {
 | 
						for {
 | 
				
			||||||
@@ -466,7 +482,7 @@ func (c *containerData) housekeeping() {
 | 
				
			|||||||
			stats, err := c.memoryCache.RecentStats(c.info.Name, empty, empty, numSamples)
 | 
								stats, err := c.memoryCache.RecentStats(c.info.Name, empty, empty, numSamples)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				if c.allowErrorLogging() {
 | 
									if c.allowErrorLogging() {
 | 
				
			||||||
					glog.Warningf("[%s] Failed to get recent stats for logging usage: %v", c.info.Name, err)
 | 
										klog.Warningf("[%s] Failed to get recent stats for logging usage: %v", c.info.Name, err)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			} else if len(stats) < numSamples {
 | 
								} else if len(stats) < numSamples {
 | 
				
			||||||
				// Ignore, not enough stats yet.
 | 
									// Ignore, not enough stats yet.
 | 
				
			||||||
@@ -483,7 +499,7 @@ func (c *containerData) housekeeping() {
 | 
				
			|||||||
				usageInCores := float64(usageCpuNs) / float64(stats[numSamples-1].Timestamp.Sub(stats[0].Timestamp).Nanoseconds())
 | 
									usageInCores := float64(usageCpuNs) / float64(stats[numSamples-1].Timestamp.Sub(stats[0].Timestamp).Nanoseconds())
 | 
				
			||||||
				usageInHuman := units.HumanSize(float64(usageMemory))
 | 
									usageInHuman := units.HumanSize(float64(usageMemory))
 | 
				
			||||||
				// Don't set verbosity since this is already protected by the logUsage flag.
 | 
									// Don't set verbosity since this is already protected by the logUsage flag.
 | 
				
			||||||
				glog.Infof("[%s] %.3f cores (average: %.3f cores), %s of memory", c.info.Name, instantUsageInCores, usageInCores, usageInHuman)
 | 
									klog.Infof("[%s] %.3f cores (average: %.3f cores), %s of memory", c.info.Name, instantUsageInCores, usageInCores, usageInHuman)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		houseKeepingTimer.Reset(c.nextHousekeepingInterval())
 | 
							houseKeepingTimer.Reset(c.nextHousekeepingInterval())
 | 
				
			||||||
@@ -504,13 +520,13 @@ func (c *containerData) housekeepingTick(timer <-chan time.Time, longHousekeepin
 | 
				
			|||||||
	err := c.updateStats()
 | 
						err := c.updateStats()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		if c.allowErrorLogging() {
 | 
							if c.allowErrorLogging() {
 | 
				
			||||||
			glog.Warningf("Failed to update stats for container \"%s\": %s", c.info.Name, err)
 | 
								klog.Warningf("Failed to update stats for container \"%s\": %s", c.info.Name, err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// Log if housekeeping took too long.
 | 
						// Log if housekeeping took too long.
 | 
				
			||||||
	duration := c.clock.Since(start)
 | 
						duration := c.clock.Since(start)
 | 
				
			||||||
	if duration >= longHousekeeping {
 | 
						if duration >= longHousekeeping {
 | 
				
			||||||
		glog.V(3).Infof("[%s] Housekeeping took %s", c.info.Name, duration)
 | 
							klog.V(3).Infof("[%s] Housekeeping took %s", c.info.Name, duration)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	c.notifyOnDemand()
 | 
						c.notifyOnDemand()
 | 
				
			||||||
	c.statsLastUpdatedTime = c.clock.Now()
 | 
						c.statsLastUpdatedTime = c.clock.Now()
 | 
				
			||||||
@@ -584,7 +600,7 @@ func (c *containerData) updateStats() error {
 | 
				
			|||||||
		err := c.summaryReader.AddSample(*stats)
 | 
							err := c.summaryReader.AddSample(*stats)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			// Ignore summary errors for now.
 | 
								// Ignore summary errors for now.
 | 
				
			||||||
			glog.V(2).Infof("Failed to add summary stats for %q: %v", c.info.Name, err)
 | 
								klog.V(2).Infof("Failed to add summary stats for %q: %v", c.info.Name, err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var customStatsErr error
 | 
						var customStatsErr error
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										82
									
								
								vendor/github.com/google/cadvisor/manager/manager.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										82
									
								
								vendor/github.com/google/cadvisor/manager/manager.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -49,9 +49,9 @@ import (
 | 
				
			|||||||
	"github.com/google/cadvisor/utils/sysfs"
 | 
						"github.com/google/cadvisor/utils/sysfs"
 | 
				
			||||||
	"github.com/google/cadvisor/version"
 | 
						"github.com/google/cadvisor/version"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
					 | 
				
			||||||
	"github.com/opencontainers/runc/libcontainer/cgroups"
 | 
						"github.com/opencontainers/runc/libcontainer/cgroups"
 | 
				
			||||||
	"golang.org/x/net/context"
 | 
						"golang.org/x/net/context"
 | 
				
			||||||
 | 
						"k8s.io/klog"
 | 
				
			||||||
	"k8s.io/utils/clock"
 | 
						"k8s.io/utils/clock"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -152,7 +152,7 @@ func New(memoryCache *memory.InMemoryCache, sysfs sysfs.SysFs, maxHousekeepingIn
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	glog.V(2).Infof("cAdvisor running in container: %q", selfContainer)
 | 
						klog.V(2).Infof("cAdvisor running in container: %q", selfContainer)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		dockerStatus info.DockerStatus
 | 
							dockerStatus info.DockerStatus
 | 
				
			||||||
@@ -163,7 +163,7 @@ func New(memoryCache *memory.InMemoryCache, sysfs sysfs.SysFs, maxHousekeepingIn
 | 
				
			|||||||
	dockerStatus = retryDockerStatus()
 | 
						dockerStatus = retryDockerStatus()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if tmpRktPath, err := rkt.RktPath(); err != nil {
 | 
						if tmpRktPath, err := rkt.RktPath(); err != nil {
 | 
				
			||||||
		glog.V(5).Infof("Rkt not connected: %v", err)
 | 
							klog.V(5).Infof("Rkt not connected: %v", err)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		rktPath = tmpRktPath
 | 
							rktPath = tmpRktPath
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -174,7 +174,7 @@ func New(memoryCache *memory.InMemoryCache, sysfs sysfs.SysFs, maxHousekeepingIn
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	crioInfo, err := crioClient.Info()
 | 
						crioInfo, err := crioClient.Info()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.V(5).Infof("CRI-O not connected: %v", err)
 | 
							klog.V(5).Infof("CRI-O not connected: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	context := fs.Context{
 | 
						context := fs.Context{
 | 
				
			||||||
@@ -226,13 +226,13 @@ func New(memoryCache *memory.InMemoryCache, sysfs sysfs.SysFs, maxHousekeepingIn
 | 
				
			|||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	newManager.machineInfo = *machineInfo
 | 
						newManager.machineInfo = *machineInfo
 | 
				
			||||||
	glog.V(1).Infof("Machine: %+v", newManager.machineInfo)
 | 
						klog.V(1).Infof("Machine: %+v", newManager.machineInfo)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	versionInfo, err := getVersionInfo()
 | 
						versionInfo, err := getVersionInfo()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	glog.V(1).Infof("Version: %+v", *versionInfo)
 | 
						klog.V(1).Infof("Version: %+v", *versionInfo)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	newManager.eventHandler = events.NewEventManager(parseEventsStoragePolicy())
 | 
						newManager.eventHandler = events.NewEventManager(parseEventsStoragePolicy())
 | 
				
			||||||
	return newManager, nil
 | 
						return newManager, nil
 | 
				
			||||||
@@ -250,9 +250,9 @@ func retryDockerStatus() info.DockerStatus {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		switch err {
 | 
							switch err {
 | 
				
			||||||
		case context.DeadlineExceeded:
 | 
							case context.DeadlineExceeded:
 | 
				
			||||||
			glog.Warningf("Timeout trying to communicate with docker during initialization, will retry")
 | 
								klog.Warningf("Timeout trying to communicate with docker during initialization, will retry")
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			glog.V(5).Infof("Docker not connected: %v", err)
 | 
								klog.V(5).Infof("Docker not connected: %v", err)
 | 
				
			||||||
			return info.DockerStatus{}
 | 
								return info.DockerStatus{}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -298,12 +298,12 @@ type manager struct {
 | 
				
			|||||||
func (self *manager) Start() error {
 | 
					func (self *manager) Start() error {
 | 
				
			||||||
	err := docker.Register(self, self.fsInfo, self.includedMetrics)
 | 
						err := docker.Register(self, self.fsInfo, self.includedMetrics)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.V(5).Infof("Registration of the Docker container factory failed: %v.", err)
 | 
							klog.V(5).Infof("Registration of the Docker container factory failed: %v.", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = rkt.Register(self, self.fsInfo, self.includedMetrics)
 | 
						err = rkt.Register(self, self.fsInfo, self.includedMetrics)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.V(5).Infof("Registration of the rkt container factory failed: %v", err)
 | 
							klog.V(5).Infof("Registration of the rkt container factory failed: %v", err)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		watcher, err := rktwatcher.NewRktContainerWatcher()
 | 
							watcher, err := rktwatcher.NewRktContainerWatcher()
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
@@ -314,27 +314,27 @@ func (self *manager) Start() error {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	err = containerd.Register(self, self.fsInfo, self.includedMetrics)
 | 
						err = containerd.Register(self, self.fsInfo, self.includedMetrics)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.V(5).Infof("Registration of the containerd container factory failed: %v", err)
 | 
							klog.V(5).Infof("Registration of the containerd container factory failed: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = crio.Register(self, self.fsInfo, self.includedMetrics)
 | 
						err = crio.Register(self, self.fsInfo, self.includedMetrics)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.V(5).Infof("Registration of the crio container factory failed: %v", err)
 | 
							klog.V(5).Infof("Registration of the crio container factory failed: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = mesos.Register(self, self.fsInfo, self.includedMetrics)
 | 
						err = mesos.Register(self, self.fsInfo, self.includedMetrics)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.V(5).Infof("Registration of the mesos container factory failed: %v", err)
 | 
							klog.V(5).Infof("Registration of the mesos container factory failed: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = systemd.Register(self, self.fsInfo, self.includedMetrics)
 | 
						err = systemd.Register(self, self.fsInfo, self.includedMetrics)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.V(5).Infof("Registration of the systemd container factory failed: %v", err)
 | 
							klog.V(5).Infof("Registration of the systemd container factory failed: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = raw.Register(self, self.fsInfo, self.includedMetrics, self.rawContainerCgroupPathPrefixWhiteList)
 | 
						err = raw.Register(self, self.fsInfo, self.includedMetrics, self.rawContainerCgroupPathPrefixWhiteList)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.Errorf("Registration of the raw container factory failed: %v", err)
 | 
							klog.Errorf("Registration of the raw container factory failed: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rawWatcher, err := rawwatcher.NewRawContainerWatcher()
 | 
						rawWatcher, err := rawwatcher.NewRawContainerWatcher()
 | 
				
			||||||
@@ -346,7 +346,7 @@ func (self *manager) Start() error {
 | 
				
			|||||||
	// Watch for OOMs.
 | 
						// Watch for OOMs.
 | 
				
			||||||
	err = self.watchForNewOoms()
 | 
						err = self.watchForNewOoms()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.Warningf("Could not configure a source for OOM detection, disabling OOM events: %v", err)
 | 
							klog.Warningf("Could not configure a source for OOM detection, disabling OOM events: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// If there are no factories, don't start any housekeeping and serve the information we do have.
 | 
						// If there are no factories, don't start any housekeeping and serve the information we do have.
 | 
				
			||||||
@@ -362,12 +362,12 @@ func (self *manager) Start() error {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	glog.V(2).Infof("Starting recovery of all containers")
 | 
						klog.V(2).Infof("Starting recovery of all containers")
 | 
				
			||||||
	err = self.detectSubcontainers("/")
 | 
						err = self.detectSubcontainers("/")
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	glog.V(2).Infof("Recovery completed")
 | 
						klog.V(2).Infof("Recovery completed")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Watch for new container.
 | 
						// Watch for new container.
 | 
				
			||||||
	quitWatcher := make(chan error)
 | 
						quitWatcher := make(chan error)
 | 
				
			||||||
@@ -418,18 +418,18 @@ func (self *manager) globalHousekeeping(quit chan error) {
 | 
				
			|||||||
			// Check for new containers.
 | 
								// Check for new containers.
 | 
				
			||||||
			err := self.detectSubcontainers("/")
 | 
								err := self.detectSubcontainers("/")
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				glog.Errorf("Failed to detect containers: %s", err)
 | 
									klog.Errorf("Failed to detect containers: %s", err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Log if housekeeping took too long.
 | 
								// Log if housekeeping took too long.
 | 
				
			||||||
			duration := time.Since(start)
 | 
								duration := time.Since(start)
 | 
				
			||||||
			if duration >= longHousekeeping {
 | 
								if duration >= longHousekeeping {
 | 
				
			||||||
				glog.V(3).Infof("Global Housekeeping(%d) took %s", t.Unix(), duration)
 | 
									klog.V(3).Infof("Global Housekeeping(%d) took %s", t.Unix(), duration)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		case <-quit:
 | 
							case <-quit:
 | 
				
			||||||
			// Quit if asked to do so.
 | 
								// Quit if asked to do so.
 | 
				
			||||||
			quit <- nil
 | 
								quit <- nil
 | 
				
			||||||
			glog.Infof("Exiting global housekeeping thread")
 | 
								klog.Infof("Exiting global housekeeping thread")
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -630,7 +630,7 @@ func (self *manager) AllDockerContainers(query *info.ContainerInfoRequest) (map[
 | 
				
			|||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			// Ignore the error because of race condition and return best-effort result.
 | 
								// Ignore the error because of race condition and return best-effort result.
 | 
				
			||||||
			if err == memory.ErrDataNotFound {
 | 
								if err == memory.ErrDataNotFound {
 | 
				
			||||||
				glog.Warningf("Error getting data for container %s because of race condition", name)
 | 
									klog.Warningf("Error getting data for container %s because of race condition", name)
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
@@ -890,7 +890,7 @@ func (m *manager) registerCollectors(collectorConfigs map[string]string, cont *c
 | 
				
			|||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return fmt.Errorf("failed to read config file %q for config %q, container %q: %v", k, v, cont.info.Name, err)
 | 
								return fmt.Errorf("failed to read config file %q for config %q, container %q: %v", k, v, cont.info.Name, err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		glog.V(4).Infof("Got config from %q: %q", v, configFile)
 | 
							klog.V(4).Infof("Got config from %q: %q", v, configFile)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if strings.HasPrefix(k, "prometheus") || strings.HasPrefix(k, "Prometheus") {
 | 
							if strings.HasPrefix(k, "prometheus") || strings.HasPrefix(k, "Prometheus") {
 | 
				
			||||||
			newCollector, err := collector.NewPrometheusCollector(k, configFile, *applicationMetricsCountLimit, cont.handler, m.collectorHttpClient)
 | 
								newCollector, err := collector.NewPrometheusCollector(k, configFile, *applicationMetricsCountLimit, cont.handler, m.collectorHttpClient)
 | 
				
			||||||
@@ -968,7 +968,7 @@ func (m *manager) createContainerLocked(containerName string, watchSource watche
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	if !accept {
 | 
						if !accept {
 | 
				
			||||||
		// ignoring this container.
 | 
							// ignoring this container.
 | 
				
			||||||
		glog.V(4).Infof("ignoring container %q", containerName)
 | 
							klog.V(4).Infof("ignoring container %q", containerName)
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	collectorManager, err := collector.NewCollectorManager()
 | 
						collectorManager, err := collector.NewCollectorManager()
 | 
				
			||||||
@@ -983,11 +983,11 @@ func (m *manager) createContainerLocked(containerName string, watchSource watche
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	devicesCgroupPath, err := handler.GetCgroupPath("devices")
 | 
						devicesCgroupPath, err := handler.GetCgroupPath("devices")
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.Warningf("Error getting devices cgroup path: %v", err)
 | 
							klog.Warningf("Error getting devices cgroup path: %v", err)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		cont.nvidiaCollector, err = m.nvidiaManager.GetCollector(devicesCgroupPath)
 | 
							cont.nvidiaCollector, err = m.nvidiaManager.GetCollector(devicesCgroupPath)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			glog.V(4).Infof("GPU metrics may be unavailable/incomplete for container %q: %v", cont.info.Name, err)
 | 
								klog.V(4).Infof("GPU metrics may be unavailable/incomplete for container %q: %v", cont.info.Name, err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -996,7 +996,7 @@ func (m *manager) createContainerLocked(containerName string, watchSource watche
 | 
				
			|||||||
	collectorConfigs := collector.GetCollectorConfigs(labels)
 | 
						collectorConfigs := collector.GetCollectorConfigs(labels)
 | 
				
			||||||
	err = m.registerCollectors(collectorConfigs, cont)
 | 
						err = m.registerCollectors(collectorConfigs, cont)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.Warningf("Failed to register collectors for %q: %v", containerName, err)
 | 
							klog.Warningf("Failed to register collectors for %q: %v", containerName, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Add the container name and all its aliases. The aliases must be within the namespace of the factory.
 | 
						// Add the container name and all its aliases. The aliases must be within the namespace of the factory.
 | 
				
			||||||
@@ -1008,7 +1008,7 @@ func (m *manager) createContainerLocked(containerName string, watchSource watche
 | 
				
			|||||||
		}] = cont
 | 
							}] = cont
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	glog.V(3).Infof("Added container: %q (aliases: %v, namespace: %q)", containerName, cont.info.Aliases, cont.info.Namespace)
 | 
						klog.V(3).Infof("Added container: %q (aliases: %v, namespace: %q)", containerName, cont.info.Aliases, cont.info.Namespace)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	contSpec, err := cont.handler.GetSpec()
 | 
						contSpec, err := cont.handler.GetSpec()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -1065,7 +1065,7 @@ func (m *manager) destroyContainerLocked(containerName string) error {
 | 
				
			|||||||
			Name:      alias,
 | 
								Name:      alias,
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	glog.V(3).Infof("Destroyed container: %q (aliases: %v, namespace: %q)", containerName, cont.info.Aliases, cont.info.Namespace)
 | 
						klog.V(3).Infof("Destroyed container: %q (aliases: %v, namespace: %q)", containerName, cont.info.Aliases, cont.info.Namespace)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	contRef, err := cont.handler.ContainerReference()
 | 
						contRef, err := cont.handler.ContainerReference()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -1144,7 +1144,7 @@ func (m *manager) detectSubcontainers(containerName string) error {
 | 
				
			|||||||
	for _, cont := range added {
 | 
						for _, cont := range added {
 | 
				
			||||||
		err = m.createContainer(cont.Name, watcher.Raw)
 | 
							err = m.createContainer(cont.Name, watcher.Raw)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			glog.Errorf("Failed to create existing container: %s: %s", cont.Name, err)
 | 
								klog.Errorf("Failed to create existing container: %s: %s", cont.Name, err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1152,7 +1152,7 @@ func (m *manager) detectSubcontainers(containerName string) error {
 | 
				
			|||||||
	for _, cont := range removed {
 | 
						for _, cont := range removed {
 | 
				
			||||||
		err = m.destroyContainer(cont.Name)
 | 
							err = m.destroyContainer(cont.Name)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			glog.Errorf("Failed to destroy existing container: %s: %s", cont.Name, err)
 | 
								klog.Errorf("Failed to destroy existing container: %s: %s", cont.Name, err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1192,7 +1192,7 @@ func (self *manager) watchForNewContainers(quit chan error) error {
 | 
				
			|||||||
					err = self.destroyContainer(event.Name)
 | 
										err = self.destroyContainer(event.Name)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				if err != nil {
 | 
									if err != nil {
 | 
				
			||||||
					glog.Warningf("Failed to process watch event %+v: %v", event, err)
 | 
										klog.Warningf("Failed to process watch event %+v: %v", event, err)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			case <-quit:
 | 
								case <-quit:
 | 
				
			||||||
				var errs partialFailure
 | 
									var errs partialFailure
 | 
				
			||||||
@@ -1209,7 +1209,7 @@ func (self *manager) watchForNewContainers(quit chan error) error {
 | 
				
			|||||||
					quit <- errs
 | 
										quit <- errs
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
					quit <- nil
 | 
										quit <- nil
 | 
				
			||||||
					glog.Infof("Exiting thread watching subcontainers")
 | 
										klog.Infof("Exiting thread watching subcontainers")
 | 
				
			||||||
					return
 | 
										return
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -1219,7 +1219,7 @@ func (self *manager) watchForNewContainers(quit chan error) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (self *manager) watchForNewOoms() error {
 | 
					func (self *manager) watchForNewOoms() error {
 | 
				
			||||||
	glog.V(2).Infof("Started watching for new ooms in manager")
 | 
						klog.V(2).Infof("Started watching for new ooms in manager")
 | 
				
			||||||
	outStream := make(chan *oomparser.OomInstance, 10)
 | 
						outStream := make(chan *oomparser.OomInstance, 10)
 | 
				
			||||||
	oomLog, err := oomparser.New()
 | 
						oomLog, err := oomparser.New()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -1237,9 +1237,9 @@ func (self *manager) watchForNewOoms() error {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
			err := self.eventHandler.AddEvent(newEvent)
 | 
								err := self.eventHandler.AddEvent(newEvent)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				glog.Errorf("failed to add OOM event for %q: %v", oomInstance.ContainerName, err)
 | 
									klog.Errorf("failed to add OOM event for %q: %v", oomInstance.ContainerName, err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			glog.V(3).Infof("Created an OOM event in container %q at %v", oomInstance.ContainerName, oomInstance.TimeOfDeath)
 | 
								klog.V(3).Infof("Created an OOM event in container %q at %v", oomInstance.ContainerName, oomInstance.TimeOfDeath)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			newEvent = &info.Event{
 | 
								newEvent = &info.Event{
 | 
				
			||||||
				ContainerName: oomInstance.VictimContainerName,
 | 
									ContainerName: oomInstance.VictimContainerName,
 | 
				
			||||||
@@ -1254,7 +1254,7 @@ func (self *manager) watchForNewOoms() error {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
			err = self.eventHandler.AddEvent(newEvent)
 | 
								err = self.eventHandler.AddEvent(newEvent)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				glog.Errorf("failed to add OOM kill event for %q: %v", oomInstance.ContainerName, err)
 | 
									klog.Errorf("failed to add OOM kill event for %q: %v", oomInstance.ContainerName, err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
@@ -1285,12 +1285,12 @@ func parseEventsStoragePolicy() events.StoragePolicy {
 | 
				
			|||||||
	for _, part := range parts {
 | 
						for _, part := range parts {
 | 
				
			||||||
		items := strings.Split(part, "=")
 | 
							items := strings.Split(part, "=")
 | 
				
			||||||
		if len(items) != 2 {
 | 
							if len(items) != 2 {
 | 
				
			||||||
			glog.Warningf("Unknown event storage policy %q when parsing max age", part)
 | 
								klog.Warningf("Unknown event storage policy %q when parsing max age", part)
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		dur, err := time.ParseDuration(items[1])
 | 
							dur, err := time.ParseDuration(items[1])
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			glog.Warningf("Unable to parse event max age duration %q: %v", items[1], err)
 | 
								klog.Warningf("Unable to parse event max age duration %q: %v", items[1], err)
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if items[0] == "default" {
 | 
							if items[0] == "default" {
 | 
				
			||||||
@@ -1305,12 +1305,12 @@ func parseEventsStoragePolicy() events.StoragePolicy {
 | 
				
			|||||||
	for _, part := range parts {
 | 
						for _, part := range parts {
 | 
				
			||||||
		items := strings.Split(part, "=")
 | 
							items := strings.Split(part, "=")
 | 
				
			||||||
		if len(items) != 2 {
 | 
							if len(items) != 2 {
 | 
				
			||||||
			glog.Warningf("Unknown event storage policy %q when parsing max event limit", part)
 | 
								klog.Warningf("Unknown event storage policy %q when parsing max event limit", part)
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		val, err := strconv.Atoi(items[1])
 | 
							val, err := strconv.Atoi(items[1])
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			glog.Warningf("Unable to parse integer from %q: %v", items[1], err)
 | 
								klog.Warningf("Unable to parse integer from %q: %v", items[1], err)
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if items[0] == "default" {
 | 
							if items[0] == "default" {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/google/cadvisor/manager/watcher/raw/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/google/cadvisor/manager/watcher/raw/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -7,11 +7,11 @@ go_library(
 | 
				
			|||||||
    importpath = "github.com/google/cadvisor/manager/watcher/raw",
 | 
					    importpath = "github.com/google/cadvisor/manager/watcher/raw",
 | 
				
			||||||
    visibility = ["//visibility:public"],
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/container/common:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/container/common:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/container/libcontainer:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/container/libcontainer:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/manager/watcher:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/manager/watcher:go_default_library",
 | 
				
			||||||
        "//vendor/golang.org/x/exp/inotify:go_default_library",
 | 
					        "//vendor/github.com/sigma/go-inotify:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										12
									
								
								vendor/github.com/google/cadvisor/manager/watcher/raw/raw.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/google/cadvisor/manager/watcher/raw/raw.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -26,9 +26,9 @@ import (
 | 
				
			|||||||
	"github.com/google/cadvisor/container/common"
 | 
						"github.com/google/cadvisor/container/common"
 | 
				
			||||||
	"github.com/google/cadvisor/container/libcontainer"
 | 
						"github.com/google/cadvisor/container/libcontainer"
 | 
				
			||||||
	"github.com/google/cadvisor/manager/watcher"
 | 
						"github.com/google/cadvisor/manager/watcher"
 | 
				
			||||||
 | 
						inotify "github.com/sigma/go-inotify"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
						"k8s.io/klog"
 | 
				
			||||||
	"golang.org/x/exp/inotify"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type rawContainerWatcher struct {
 | 
					type rawContainerWatcher struct {
 | 
				
			||||||
@@ -84,10 +84,10 @@ func (self *rawContainerWatcher) Start(events chan watcher.ContainerEvent) error
 | 
				
			|||||||
			case event := <-self.watcher.Event():
 | 
								case event := <-self.watcher.Event():
 | 
				
			||||||
				err := self.processEvent(event, events)
 | 
									err := self.processEvent(event, events)
 | 
				
			||||||
				if err != nil {
 | 
									if err != nil {
 | 
				
			||||||
					glog.Warningf("Error while processing event (%+v): %v", event, err)
 | 
										klog.Warningf("Error while processing event (%+v): %v", event, err)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			case err := <-self.watcher.Error():
 | 
								case err := <-self.watcher.Error():
 | 
				
			||||||
				glog.Warningf("Error while watching %q:", "/", err)
 | 
									klog.Warningf("Error while watching %q: %v", "/", err)
 | 
				
			||||||
			case <-self.stopWatcher:
 | 
								case <-self.stopWatcher:
 | 
				
			||||||
				err := self.watcher.Close()
 | 
									err := self.watcher.Close()
 | 
				
			||||||
				if err == nil {
 | 
									if err == nil {
 | 
				
			||||||
@@ -126,7 +126,7 @@ func (self *rawContainerWatcher) watchDirectory(events chan watcher.ContainerEve
 | 
				
			|||||||
		if cleanup {
 | 
							if cleanup {
 | 
				
			||||||
			_, err := self.watcher.RemoveWatch(containerName, dir)
 | 
								_, err := self.watcher.RemoveWatch(containerName, dir)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				glog.Warningf("Failed to remove inotify watch for %q: %v", dir, err)
 | 
									klog.Warningf("Failed to remove inotify watch for %q: %v", dir, err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
@@ -143,7 +143,7 @@ func (self *rawContainerWatcher) watchDirectory(events chan watcher.ContainerEve
 | 
				
			|||||||
			subcontainerName := path.Join(containerName, entry.Name())
 | 
								subcontainerName := path.Join(containerName, entry.Name())
 | 
				
			||||||
			alreadyWatchingSubDir, err := self.watchDirectory(events, entryPath, subcontainerName)
 | 
								alreadyWatchingSubDir, err := self.watchDirectory(events, entryPath, subcontainerName)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				glog.Errorf("Failed to watch directory %q: %v", entryPath, err)
 | 
									klog.Errorf("Failed to watch directory %q: %v", entryPath, err)
 | 
				
			||||||
				if os.IsNotExist(err) {
 | 
									if os.IsNotExist(err) {
 | 
				
			||||||
					// The directory may have been removed before watching. Try to watch the other
 | 
										// The directory may have been removed before watching. Try to watch the other
 | 
				
			||||||
					// subdirectories. (https://github.com/kubernetes/kubernetes/issues/28997)
 | 
										// subdirectories. (https://github.com/kubernetes/kubernetes/issues/28997)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/google/cadvisor/manager/watcher/rkt/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/google/cadvisor/manager/watcher/rkt/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -8,10 +8,10 @@ go_library(
 | 
				
			|||||||
    visibility = ["//visibility:public"],
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//vendor/github.com/coreos/rkt/api/v1alpha:go_default_library",
 | 
					        "//vendor/github.com/coreos/rkt/api/v1alpha:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/container/rkt:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/container/rkt:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/manager/watcher:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/manager/watcher:go_default_library",
 | 
				
			||||||
        "//vendor/golang.org/x/net/context:go_default_library",
 | 
					        "//vendor/golang.org/x/net/context:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										10
									
								
								vendor/github.com/google/cadvisor/manager/watcher/rkt/rkt.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/google/cadvisor/manager/watcher/rkt/rkt.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -23,8 +23,8 @@ import (
 | 
				
			|||||||
	"github.com/google/cadvisor/manager/watcher"
 | 
						"github.com/google/cadvisor/manager/watcher"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rktapi "github.com/coreos/rkt/api/v1alpha"
 | 
						rktapi "github.com/coreos/rkt/api/v1alpha"
 | 
				
			||||||
	"github.com/golang/glog"
 | 
					 | 
				
			||||||
	"golang.org/x/net/context"
 | 
						"golang.org/x/net/context"
 | 
				
			||||||
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type rktContainerWatcher struct {
 | 
					type rktContainerWatcher struct {
 | 
				
			||||||
@@ -53,7 +53,7 @@ func (self *rktContainerWatcher) Stop() error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (self *rktContainerWatcher) detectRktContainers(events chan watcher.ContainerEvent) {
 | 
					func (self *rktContainerWatcher) detectRktContainers(events chan watcher.ContainerEvent) {
 | 
				
			||||||
	glog.V(1).Infof("Starting detectRktContainers thread")
 | 
						klog.V(1).Infof("Starting detectRktContainers thread")
 | 
				
			||||||
	ticker := time.Tick(10 * time.Second)
 | 
						ticker := time.Tick(10 * time.Second)
 | 
				
			||||||
	curpods := make(map[string]*rktapi.Pod)
 | 
						curpods := make(map[string]*rktapi.Pod)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -62,13 +62,13 @@ func (self *rktContainerWatcher) detectRktContainers(events chan watcher.Contain
 | 
				
			|||||||
		case <-ticker:
 | 
							case <-ticker:
 | 
				
			||||||
			pods, err := listRunningPods()
 | 
								pods, err := listRunningPods()
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				glog.Errorf("detectRktContainers: listRunningPods failed: %v", err)
 | 
									klog.Errorf("detectRktContainers: listRunningPods failed: %v", err)
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			curpods = self.syncRunningPods(pods, events, curpods)
 | 
								curpods = self.syncRunningPods(pods, events, curpods)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case <-self.stopWatcher:
 | 
							case <-self.stopWatcher:
 | 
				
			||||||
			glog.Infof("Exiting rktContainer Thread")
 | 
								klog.Infof("Exiting rktContainer Thread")
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -92,7 +92,7 @@ func (self *rktContainerWatcher) syncRunningPods(pods []*rktapi.Pod, events chan
 | 
				
			|||||||
	for id, pod := range curpods {
 | 
						for id, pod := range curpods {
 | 
				
			||||||
		if _, ok := newpods[id]; !ok {
 | 
							if _, ok := newpods[id]; !ok {
 | 
				
			||||||
			for _, cgroup := range podToCgroup(pod) {
 | 
								for _, cgroup := range podToCgroup(pod) {
 | 
				
			||||||
				glog.V(2).Infof("cgroup to delete = %v", cgroup)
 | 
									klog.V(2).Infof("cgroup to delete = %v", cgroup)
 | 
				
			||||||
				self.sendDestroyEvent(cgroup, events)
 | 
									self.sendDestroyEvent(cgroup, events)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/google/cadvisor/metrics/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/google/cadvisor/metrics/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -7,10 +7,10 @@ go_library(
 | 
				
			|||||||
    importpath = "github.com/google/cadvisor/metrics",
 | 
					    importpath = "github.com/google/cadvisor/metrics",
 | 
				
			||||||
    visibility = ["//visibility:public"],
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/container:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/container:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/info/v1:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/info/v1:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library",
 | 
					        "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										63
									
								
								vendor/github.com/google/cadvisor/metrics/prometheus.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										63
									
								
								vendor/github.com/google/cadvisor/metrics/prometheus.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -22,8 +22,8 @@ import (
 | 
				
			|||||||
	"github.com/google/cadvisor/container"
 | 
						"github.com/google/cadvisor/container"
 | 
				
			||||||
	info "github.com/google/cadvisor/info/v1"
 | 
						info "github.com/google/cadvisor/info/v1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
					 | 
				
			||||||
	"github.com/prometheus/client_golang/prometheus"
 | 
						"github.com/prometheus/client_golang/prometheus"
 | 
				
			||||||
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// infoProvider will usually be manager.Manager, but can be swapped out for testing.
 | 
					// infoProvider will usually be manager.Manager, but can be swapped out for testing.
 | 
				
			||||||
@@ -109,6 +109,7 @@ type PrometheusCollector struct {
 | 
				
			|||||||
	errors              prometheus.Gauge
 | 
						errors              prometheus.Gauge
 | 
				
			||||||
	containerMetrics    []containerMetric
 | 
						containerMetrics    []containerMetric
 | 
				
			||||||
	containerLabelsFunc ContainerLabelsFunc
 | 
						containerLabelsFunc ContainerLabelsFunc
 | 
				
			||||||
 | 
						includedMetrics     container.MetricSet
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewPrometheusCollector returns a new PrometheusCollector. The passed
 | 
					// NewPrometheusCollector returns a new PrometheusCollector. The passed
 | 
				
			||||||
@@ -137,6 +138,7 @@ func NewPrometheusCollector(i infoProvider, f ContainerLabelsFunc, includedMetri
 | 
				
			|||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
							includedMetrics: includedMetrics,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if includedMetrics.Has(container.CpuUsageMetrics) {
 | 
						if includedMetrics.Has(container.CpuUsageMetrics) {
 | 
				
			||||||
		c.containerMetrics = append(c.containerMetrics, []containerMetric{
 | 
							c.containerMetrics = append(c.containerMetrics, []containerMetric{
 | 
				
			||||||
@@ -336,7 +338,7 @@ func NewPrometheusCollector(i infoProvider, f ContainerLabelsFunc, includedMetri
 | 
				
			|||||||
				name:        "container_memory_failures_total",
 | 
									name:        "container_memory_failures_total",
 | 
				
			||||||
				help:        "Cumulative count of memory allocation failures.",
 | 
									help:        "Cumulative count of memory allocation failures.",
 | 
				
			||||||
				valueType:   prometheus.CounterValue,
 | 
									valueType:   prometheus.CounterValue,
 | 
				
			||||||
				extraLabels: []string{"type", "scope"},
 | 
									extraLabels: []string{"failure_type", "scope"},
 | 
				
			||||||
				getValues: func(s *info.ContainerStats) metricValues {
 | 
									getValues: func(s *info.ContainerStats) metricValues {
 | 
				
			||||||
					return metricValues{
 | 
										return metricValues{
 | 
				
			||||||
						{
 | 
											{
 | 
				
			||||||
@@ -835,6 +837,26 @@ func NewPrometheusCollector(i infoProvider, f ContainerLabelsFunc, includedMetri
 | 
				
			|||||||
			},
 | 
								},
 | 
				
			||||||
		}...)
 | 
							}...)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if includedMetrics.Has(container.ProcessMetrics) {
 | 
				
			||||||
 | 
							c.containerMetrics = append(c.containerMetrics, []containerMetric{
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									name:      "container_processes",
 | 
				
			||||||
 | 
									help:      "Number of processes running inside the container.",
 | 
				
			||||||
 | 
									valueType: prometheus.GaugeValue,
 | 
				
			||||||
 | 
									getValues: func(s *info.ContainerStats) metricValues {
 | 
				
			||||||
 | 
										return metricValues{{value: float64(s.Processes.ProcessCount)}}
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									name:      "container_file_descriptors",
 | 
				
			||||||
 | 
									help:      "Number of open file descriptors for the container.",
 | 
				
			||||||
 | 
									valueType: prometheus.GaugeValue,
 | 
				
			||||||
 | 
									getValues: func(s *info.ContainerStats) metricValues {
 | 
				
			||||||
 | 
										return metricValues{{value: float64(s.Processes.FdCount)}}
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							}...)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return c
 | 
						return c
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -917,7 +939,7 @@ func (c *PrometheusCollector) collectContainersInfo(ch chan<- prometheus.Metric)
 | 
				
			|||||||
	containers, err := c.infoProvider.SubcontainersInfo("/", &info.ContainerInfoRequest{NumStats: 1})
 | 
						containers, err := c.infoProvider.SubcontainersInfo("/", &info.ContainerInfoRequest{NumStats: 1})
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		c.errors.Set(1)
 | 
							c.errors.Set(1)
 | 
				
			||||||
		glog.Warningf("Couldn't get containers: %s", err)
 | 
							klog.Warningf("Couldn't get containers: %s", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	rawLabels := map[string]struct{}{}
 | 
						rawLabels := map[string]struct{}{}
 | 
				
			||||||
@@ -926,10 +948,11 @@ func (c *PrometheusCollector) collectContainersInfo(ch chan<- prometheus.Metric)
 | 
				
			|||||||
			rawLabels[l] = struct{}{}
 | 
								rawLabels[l] = struct{}{}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for _, container := range containers {
 | 
					
 | 
				
			||||||
 | 
						for _, cont := range containers {
 | 
				
			||||||
		values := make([]string, 0, len(rawLabels))
 | 
							values := make([]string, 0, len(rawLabels))
 | 
				
			||||||
		labels := make([]string, 0, len(rawLabels))
 | 
							labels := make([]string, 0, len(rawLabels))
 | 
				
			||||||
		containerLabels := c.containerLabelsFunc(container)
 | 
							containerLabels := c.containerLabelsFunc(cont)
 | 
				
			||||||
		for l := range rawLabels {
 | 
							for l := range rawLabels {
 | 
				
			||||||
			labels = append(labels, sanitizeLabelName(l))
 | 
								labels = append(labels, sanitizeLabelName(l))
 | 
				
			||||||
			values = append(values, containerLabels[l])
 | 
								values = append(values, containerLabels[l])
 | 
				
			||||||
@@ -937,35 +960,35 @@ func (c *PrometheusCollector) collectContainersInfo(ch chan<- prometheus.Metric)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		// Container spec
 | 
							// Container spec
 | 
				
			||||||
		desc := prometheus.NewDesc("container_start_time_seconds", "Start time of the container since unix epoch in seconds.", labels, nil)
 | 
							desc := prometheus.NewDesc("container_start_time_seconds", "Start time of the container since unix epoch in seconds.", labels, nil)
 | 
				
			||||||
		ch <- prometheus.MustNewConstMetric(desc, prometheus.GaugeValue, float64(container.Spec.CreationTime.Unix()), values...)
 | 
							ch <- prometheus.MustNewConstMetric(desc, prometheus.GaugeValue, float64(cont.Spec.CreationTime.Unix()), values...)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if container.Spec.HasCpu {
 | 
							if cont.Spec.HasCpu {
 | 
				
			||||||
			desc = prometheus.NewDesc("container_spec_cpu_period", "CPU period of the container.", labels, nil)
 | 
								desc = prometheus.NewDesc("container_spec_cpu_period", "CPU period of the container.", labels, nil)
 | 
				
			||||||
			ch <- prometheus.MustNewConstMetric(desc, prometheus.GaugeValue, float64(container.Spec.Cpu.Period), values...)
 | 
								ch <- prometheus.MustNewConstMetric(desc, prometheus.GaugeValue, float64(cont.Spec.Cpu.Period), values...)
 | 
				
			||||||
			if container.Spec.Cpu.Quota != 0 {
 | 
								if cont.Spec.Cpu.Quota != 0 {
 | 
				
			||||||
				desc = prometheus.NewDesc("container_spec_cpu_quota", "CPU quota of the container.", labels, nil)
 | 
									desc = prometheus.NewDesc("container_spec_cpu_quota", "CPU quota of the container.", labels, nil)
 | 
				
			||||||
				ch <- prometheus.MustNewConstMetric(desc, prometheus.GaugeValue, float64(container.Spec.Cpu.Quota), values...)
 | 
									ch <- prometheus.MustNewConstMetric(desc, prometheus.GaugeValue, float64(cont.Spec.Cpu.Quota), values...)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			desc := prometheus.NewDesc("container_spec_cpu_shares", "CPU share of the container.", labels, nil)
 | 
								desc := prometheus.NewDesc("container_spec_cpu_shares", "CPU share of the container.", labels, nil)
 | 
				
			||||||
			ch <- prometheus.MustNewConstMetric(desc, prometheus.GaugeValue, float64(container.Spec.Cpu.Limit), values...)
 | 
								ch <- prometheus.MustNewConstMetric(desc, prometheus.GaugeValue, float64(cont.Spec.Cpu.Limit), values...)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if container.Spec.HasMemory {
 | 
							if cont.Spec.HasMemory {
 | 
				
			||||||
			desc := prometheus.NewDesc("container_spec_memory_limit_bytes", "Memory limit for the container.", labels, nil)
 | 
								desc := prometheus.NewDesc("container_spec_memory_limit_bytes", "Memory limit for the container.", labels, nil)
 | 
				
			||||||
			ch <- prometheus.MustNewConstMetric(desc, prometheus.GaugeValue, specMemoryValue(container.Spec.Memory.Limit), values...)
 | 
								ch <- prometheus.MustNewConstMetric(desc, prometheus.GaugeValue, specMemoryValue(cont.Spec.Memory.Limit), values...)
 | 
				
			||||||
			desc = prometheus.NewDesc("container_spec_memory_swap_limit_bytes", "Memory swap limit for the container.", labels, nil)
 | 
								desc = prometheus.NewDesc("container_spec_memory_swap_limit_bytes", "Memory swap limit for the container.", labels, nil)
 | 
				
			||||||
			ch <- prometheus.MustNewConstMetric(desc, prometheus.GaugeValue, specMemoryValue(container.Spec.Memory.SwapLimit), values...)
 | 
								ch <- prometheus.MustNewConstMetric(desc, prometheus.GaugeValue, specMemoryValue(cont.Spec.Memory.SwapLimit), values...)
 | 
				
			||||||
			desc = prometheus.NewDesc("container_spec_memory_reservation_limit_bytes", "Memory reservation limit for the container.", labels, nil)
 | 
								desc = prometheus.NewDesc("container_spec_memory_reservation_limit_bytes", "Memory reservation limit for the container.", labels, nil)
 | 
				
			||||||
			ch <- prometheus.MustNewConstMetric(desc, prometheus.GaugeValue, specMemoryValue(container.Spec.Memory.Reservation), values...)
 | 
								ch <- prometheus.MustNewConstMetric(desc, prometheus.GaugeValue, specMemoryValue(cont.Spec.Memory.Reservation), values...)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Now for the actual metrics
 | 
							// Now for the actual metrics
 | 
				
			||||||
		if len(container.Stats) == 0 {
 | 
							if len(cont.Stats) == 0 {
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		stats := container.Stats[0]
 | 
							stats := cont.Stats[0]
 | 
				
			||||||
		for _, cm := range c.containerMetrics {
 | 
							for _, cm := range c.containerMetrics {
 | 
				
			||||||
			if cm.condition != nil && !cm.condition(container.Spec) {
 | 
								if cm.condition != nil && !cm.condition(cont.Spec) {
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			desc := cm.desc(labels)
 | 
								desc := cm.desc(labels)
 | 
				
			||||||
@@ -980,7 +1003,7 @@ func (c *PrometheusCollector) collectVersionInfo(ch chan<- prometheus.Metric) {
 | 
				
			|||||||
	versionInfo, err := c.infoProvider.GetVersionInfo()
 | 
						versionInfo, err := c.infoProvider.GetVersionInfo()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		c.errors.Set(1)
 | 
							c.errors.Set(1)
 | 
				
			||||||
		glog.Warningf("Couldn't get version info: %s", err)
 | 
							klog.Warningf("Couldn't get version info: %s", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	ch <- prometheus.MustNewConstMetric(versionInfoDesc, prometheus.GaugeValue, 1, []string{versionInfo.KernelVersion, versionInfo.ContainerOsVersion, versionInfo.DockerVersion, versionInfo.CadvisorVersion, versionInfo.CadvisorRevision}...)
 | 
						ch <- prometheus.MustNewConstMetric(versionInfoDesc, prometheus.GaugeValue, 1, []string{versionInfo.KernelVersion, versionInfo.ContainerOsVersion, versionInfo.DockerVersion, versionInfo.CadvisorVersion, versionInfo.CadvisorRevision}...)
 | 
				
			||||||
@@ -990,7 +1013,7 @@ func (c *PrometheusCollector) collectMachineInfo(ch chan<- prometheus.Metric) {
 | 
				
			|||||||
	machineInfo, err := c.infoProvider.GetMachineInfo()
 | 
						machineInfo, err := c.infoProvider.GetMachineInfo()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		c.errors.Set(1)
 | 
							c.errors.Set(1)
 | 
				
			||||||
		glog.Warningf("Couldn't get machine info: %s", err)
 | 
							klog.Warningf("Couldn't get machine info: %s", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	ch <- prometheus.MustNewConstMetric(machineInfoCoresDesc, prometheus.GaugeValue, float64(machineInfo.NumCores))
 | 
						ch <- prometheus.MustNewConstMetric(machineInfoCoresDesc, prometheus.GaugeValue, float64(machineInfo.NumCores))
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/google/cadvisor/utils/cloudinfo/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/google/cadvisor/utils/cloudinfo/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -16,8 +16,8 @@ go_library(
 | 
				
			|||||||
        "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library",
 | 
					        "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/aws/aws-sdk-go/aws/ec2metadata:go_default_library",
 | 
					        "//vendor/github.com/aws/aws-sdk-go/aws/ec2metadata:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/aws/aws-sdk-go/aws/session:go_default_library",
 | 
					        "//vendor/github.com/aws/aws-sdk-go/aws/session:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/info/v1:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/info/v1:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/google/cadvisor/utils/cloudinfo/gce.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/google/cadvisor/utils/cloudinfo/gce.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -21,7 +21,7 @@ import (
 | 
				
			|||||||
	info "github.com/google/cadvisor/info/v1"
 | 
						info "github.com/google/cadvisor/info/v1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"cloud.google.com/go/compute/metadata"
 | 
						"cloud.google.com/go/compute/metadata"
 | 
				
			||||||
	"github.com/golang/glog"
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
@@ -32,7 +32,7 @@ const (
 | 
				
			|||||||
func onGCE() bool {
 | 
					func onGCE() bool {
 | 
				
			||||||
	data, err := ioutil.ReadFile(gceProductName)
 | 
						data, err := ioutil.ReadFile(gceProductName)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.V(2).Infof("Error while reading product_name: %v", err)
 | 
							klog.V(2).Infof("Error while reading product_name: %v", err)
 | 
				
			||||||
		return false
 | 
							return false
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return strings.Contains(string(data), google)
 | 
						return strings.Contains(string(data), google)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/google/cadvisor/utils/cpuload/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/google/cadvisor/utils/cpuload/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -7,9 +7,9 @@ go_library(
 | 
				
			|||||||
    importpath = "github.com/google/cadvisor/utils/cpuload",
 | 
					    importpath = "github.com/google/cadvisor/utils/cpuload",
 | 
				
			||||||
    visibility = ["//visibility:public"],
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/info/v1:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/info/v1:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/utils/cpuload/netlink:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/utils/cpuload/netlink:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/google/cadvisor/utils/cpuload/cpuload.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/google/cadvisor/utils/cpuload/cpuload.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -19,8 +19,8 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	info "github.com/google/cadvisor/info/v1"
 | 
						info "github.com/google/cadvisor/info/v1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
					 | 
				
			||||||
	"github.com/google/cadvisor/utils/cpuload/netlink"
 | 
						"github.com/google/cadvisor/utils/cpuload/netlink"
 | 
				
			||||||
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type CpuLoadReader interface {
 | 
					type CpuLoadReader interface {
 | 
				
			||||||
@@ -41,6 +41,6 @@ func New() (CpuLoadReader, error) {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, fmt.Errorf("failed to create a netlink based cpuload reader: %v", err)
 | 
							return nil, fmt.Errorf("failed to create a netlink based cpuload reader: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	glog.V(4).Info("Using a netlink-based load reader")
 | 
						klog.V(4).Info("Using a netlink-based load reader")
 | 
				
			||||||
	return reader, nil
 | 
						return reader, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/google/cadvisor/utils/cpuload/netlink/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/google/cadvisor/utils/cpuload/netlink/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -13,8 +13,8 @@ go_library(
 | 
				
			|||||||
    importpath = "github.com/google/cadvisor/utils/cpuload/netlink",
 | 
					    importpath = "github.com/google/cadvisor/utils/cpuload/netlink",
 | 
				
			||||||
    visibility = ["//visibility:public"],
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/github.com/google/cadvisor/info/v1:go_default_library",
 | 
					        "//vendor/github.com/google/cadvisor/info/v1:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								vendor/github.com/google/cadvisor/utils/cpuload/netlink/reader.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/google/cadvisor/utils/cpuload/netlink/reader.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -20,7 +20,7 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	info "github.com/google/cadvisor/info/v1"
 | 
						info "github.com/google/cadvisor/info/v1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type NetlinkReader struct {
 | 
					type NetlinkReader struct {
 | 
				
			||||||
@@ -38,7 +38,7 @@ func New() (*NetlinkReader, error) {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, fmt.Errorf("failed to get netlink family id for task stats: %s", err)
 | 
							return nil, fmt.Errorf("failed to get netlink family id for task stats: %s", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	glog.V(4).Infof("Family id for taskstats: %d", id)
 | 
						klog.V(4).Infof("Family id for taskstats: %d", id)
 | 
				
			||||||
	return &NetlinkReader{
 | 
						return &NetlinkReader{
 | 
				
			||||||
		familyId: id,
 | 
							familyId: id,
 | 
				
			||||||
		conn:     conn,
 | 
							conn:     conn,
 | 
				
			||||||
@@ -75,6 +75,6 @@ func (self *NetlinkReader) GetCpuLoad(name string, path string) (info.LoadStats,
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return info.LoadStats{}, err
 | 
							return info.LoadStats{}, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	glog.V(4).Infof("Task stats for %q: %+v", path, stats)
 | 
						klog.V(4).Infof("Task stats for %q: %+v", path, stats)
 | 
				
			||||||
	return stats, nil
 | 
						return stats, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/google/cadvisor/utils/oomparser/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/google/cadvisor/utils/oomparser/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -8,7 +8,7 @@ go_library(
 | 
				
			|||||||
    visibility = ["//visibility:public"],
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//vendor/github.com/euank/go-kmsg-parser/kmsgparser:go_default_library",
 | 
					        "//vendor/github.com/euank/go-kmsg-parser/kmsgparser:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										14
									
								
								vendor/github.com/google/cadvisor/utils/oomparser/oomparser.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								vendor/github.com/google/cadvisor/utils/oomparser/oomparser.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -22,7 +22,7 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	"github.com/euank/go-kmsg-parser/kmsgparser"
 | 
						"github.com/euank/go-kmsg-parser/kmsgparser"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
@@ -107,11 +107,11 @@ func (self *OomParser) StreamOoms(outStream chan<- *OomInstance) {
 | 
				
			|||||||
			for msg := range kmsgEntries {
 | 
								for msg := range kmsgEntries {
 | 
				
			||||||
				err := getContainerName(msg.Message, oomCurrentInstance)
 | 
									err := getContainerName(msg.Message, oomCurrentInstance)
 | 
				
			||||||
				if err != nil {
 | 
									if err != nil {
 | 
				
			||||||
					glog.Errorf("%v", err)
 | 
										klog.Errorf("%v", err)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				finished, err := getProcessNamePid(msg.Message, oomCurrentInstance)
 | 
									finished, err := getProcessNamePid(msg.Message, oomCurrentInstance)
 | 
				
			||||||
				if err != nil {
 | 
									if err != nil {
 | 
				
			||||||
					glog.Errorf("%v", err)
 | 
										klog.Errorf("%v", err)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				if finished {
 | 
									if finished {
 | 
				
			||||||
					oomCurrentInstance.TimeOfDeath = msg.Timestamp
 | 
										oomCurrentInstance.TimeOfDeath = msg.Timestamp
 | 
				
			||||||
@@ -122,7 +122,7 @@ func (self *OomParser) StreamOoms(outStream chan<- *OomInstance) {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// Should not happen
 | 
						// Should not happen
 | 
				
			||||||
	glog.Errorf("exiting analyzeLines. OOM events will not be reported.")
 | 
						klog.Errorf("exiting analyzeLines. OOM events will not be reported.")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// initializes an OomParser object. Returns an OomParser object and an error.
 | 
					// initializes an OomParser object. Returns an OomParser object and an error.
 | 
				
			||||||
@@ -140,11 +140,11 @@ type glogAdapter struct{}
 | 
				
			|||||||
var _ kmsgparser.Logger = glogAdapter{}
 | 
					var _ kmsgparser.Logger = glogAdapter{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (glogAdapter) Infof(format string, args ...interface{}) {
 | 
					func (glogAdapter) Infof(format string, args ...interface{}) {
 | 
				
			||||||
	glog.V(4).Infof(format, args)
 | 
						klog.V(4).Infof(format, args...)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func (glogAdapter) Warningf(format string, args ...interface{}) {
 | 
					func (glogAdapter) Warningf(format string, args ...interface{}) {
 | 
				
			||||||
	glog.V(2).Infof(format, args)
 | 
						klog.V(2).Infof(format, args...)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func (glogAdapter) Errorf(format string, args ...interface{}) {
 | 
					func (glogAdapter) Errorf(format string, args ...interface{}) {
 | 
				
			||||||
	glog.Warningf(format, args)
 | 
						klog.Warningf(format, args...)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/google/cadvisor/zfs/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/google/cadvisor/zfs/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -7,8 +7,8 @@ go_library(
 | 
				
			|||||||
    importpath = "github.com/google/cadvisor/zfs",
 | 
					    importpath = "github.com/google/cadvisor/zfs",
 | 
				
			||||||
    visibility = ["//visibility:public"],
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/github.com/mistifyio/go-zfs:go_default_library",
 | 
					        "//vendor/github.com/mistifyio/go-zfs:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										12
									
								
								vendor/github.com/google/cadvisor/zfs/watcher.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/google/cadvisor/zfs/watcher.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -18,8 +18,8 @@ import (
 | 
				
			|||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
					 | 
				
			||||||
	zfs "github.com/mistifyio/go-zfs"
 | 
						zfs "github.com/mistifyio/go-zfs"
 | 
				
			||||||
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// zfsWatcher maintains a cache of filesystem -> usage stats for a
 | 
					// zfsWatcher maintains a cache of filesystem -> usage stats for a
 | 
				
			||||||
@@ -49,7 +49,7 @@ func NewZfsWatcher(filesystem string) (*ZfsWatcher, error) {
 | 
				
			|||||||
func (w *ZfsWatcher) Start() {
 | 
					func (w *ZfsWatcher) Start() {
 | 
				
			||||||
	err := w.Refresh()
 | 
						err := w.Refresh()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.Errorf("encountered error refreshing zfs watcher: %v", err)
 | 
							klog.Errorf("encountered error refreshing zfs watcher: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for {
 | 
						for {
 | 
				
			||||||
@@ -60,12 +60,12 @@ func (w *ZfsWatcher) Start() {
 | 
				
			|||||||
			start := time.Now()
 | 
								start := time.Now()
 | 
				
			||||||
			err = w.Refresh()
 | 
								err = w.Refresh()
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				glog.Errorf("encountered error refreshing zfs watcher: %v", err)
 | 
									klog.Errorf("encountered error refreshing zfs watcher: %v", err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// print latency for refresh
 | 
								// print latency for refresh
 | 
				
			||||||
			duration := time.Since(start)
 | 
								duration := time.Since(start)
 | 
				
			||||||
			glog.V(5).Infof("zfs(%d) took %s", start.Unix(), duration)
 | 
								klog.V(5).Infof("zfs(%d) took %s", start.Unix(), duration)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -95,12 +95,12 @@ func (w *ZfsWatcher) Refresh() error {
 | 
				
			|||||||
	newCache := make(map[string]uint64)
 | 
						newCache := make(map[string]uint64)
 | 
				
			||||||
	parent, err := zfs.GetDataset(w.filesystem)
 | 
						parent, err := zfs.GetDataset(w.filesystem)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.Errorf("encountered error getting zfs filesystem: %s: %v", w.filesystem, err)
 | 
							klog.Errorf("encountered error getting zfs filesystem: %s: %v", w.filesystem, err)
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	children, err := parent.Children(0)
 | 
						children, err := parent.Children(0)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.Errorf("encountered error getting children of zfs filesystem: %s: %v", w.filesystem, err)
 | 
							klog.Errorf("encountered error getting children of zfs filesystem: %s: %v", w.filesystem, err)
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										14
									
								
								vendor/github.com/karrick/godirwalk/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								vendor/github.com/karrick/godirwalk/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					# Binaries for programs and plugins
 | 
				
			||||||
 | 
					*.exe
 | 
				
			||||||
 | 
					*.dll
 | 
				
			||||||
 | 
					*.so
 | 
				
			||||||
 | 
					*.dylib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Test binary, build with `go test -c`
 | 
				
			||||||
 | 
					*.test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Output of the go coverage tool, specifically when used with LiteIDE
 | 
				
			||||||
 | 
					*.out
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736
 | 
				
			||||||
 | 
					.glide/
 | 
				
			||||||
							
								
								
									
										35
									
								
								vendor/github.com/karrick/godirwalk/BUILD
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								vendor/github.com/karrick/godirwalk/BUILD
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,35 @@
 | 
				
			|||||||
 | 
					load("@io_bazel_rules_go//go:def.bzl", "go_library")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					go_library(
 | 
				
			||||||
 | 
					    name = "go_default_library",
 | 
				
			||||||
 | 
					    srcs = [
 | 
				
			||||||
 | 
					        "dirent.go",
 | 
				
			||||||
 | 
					        "doc.go",
 | 
				
			||||||
 | 
					        "readdir.go",
 | 
				
			||||||
 | 
					        "readdir_unix.go",
 | 
				
			||||||
 | 
					        "readdir_windows.go",
 | 
				
			||||||
 | 
					        "walk.go",
 | 
				
			||||||
 | 
					        "withFileno.go",
 | 
				
			||||||
 | 
					        "withIno.go",
 | 
				
			||||||
 | 
					        "withNamlen.go",
 | 
				
			||||||
 | 
					        "withoutNamlen.go",
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    importmap = "k8s.io/kubernetes/vendor/github.com/karrick/godirwalk",
 | 
				
			||||||
 | 
					    importpath = "github.com/karrick/godirwalk",
 | 
				
			||||||
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
 | 
					    deps = ["//vendor/github.com/pkg/errors:go_default_library"],
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					filegroup(
 | 
				
			||||||
 | 
					    name = "package-srcs",
 | 
				
			||||||
 | 
					    srcs = glob(["**"]),
 | 
				
			||||||
 | 
					    tags = ["automanaged"],
 | 
				
			||||||
 | 
					    visibility = ["//visibility:private"],
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					filegroup(
 | 
				
			||||||
 | 
					    name = "all-srcs",
 | 
				
			||||||
 | 
					    srcs = [":package-srcs"],
 | 
				
			||||||
 | 
					    tags = ["automanaged"],
 | 
				
			||||||
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
							
								
								
									
										25
									
								
								vendor/github.com/karrick/godirwalk/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								vendor/github.com/karrick/godirwalk/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
				
			|||||||
 | 
					BSD 2-Clause License
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Copyright (c) 2017, Karrick McDermott
 | 
				
			||||||
 | 
					All rights reserved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					modification, are permitted provided that the following conditions are met:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Redistributions of source code must retain the above copyright notice, this
 | 
				
			||||||
 | 
					  list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Redistributions in binary form must reproduce the above copyright notice,
 | 
				
			||||||
 | 
					  this list of conditions and the following disclaimer in the documentation
 | 
				
			||||||
 | 
					  and/or other materials provided with the distribution.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
				
			||||||
 | 
					AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
				
			||||||
 | 
					IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
				
			||||||
 | 
					DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
 | 
				
			||||||
 | 
					FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
				
			||||||
 | 
					DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 | 
				
			||||||
 | 
					SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 | 
				
			||||||
 | 
					CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 | 
				
			||||||
 | 
					OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
				
			||||||
 | 
					OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
							
								
								
									
										208
									
								
								vendor/github.com/karrick/godirwalk/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										208
									
								
								vendor/github.com/karrick/godirwalk/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,208 @@
 | 
				
			|||||||
 | 
					# godirwalk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`godirwalk` is a library for traversing a directory tree on a file
 | 
				
			||||||
 | 
					system.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In short, why do I use this library?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. It's faster than `filepath.Walk`.
 | 
				
			||||||
 | 
					1. It's more correct on Windows than `filepath.Walk`.
 | 
				
			||||||
 | 
					1. It's more easy to use than `filepath.Walk`.
 | 
				
			||||||
 | 
					1. It's more flexible than `filepath.Walk`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Usage Example
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Additional examples are provided in the `examples/` subdirectory.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This library will normalize the provided top level directory name
 | 
				
			||||||
 | 
					based on the os-specific path separator by calling `filepath.Clean` on
 | 
				
			||||||
 | 
					its first argument. However it always provides the pathname created by
 | 
				
			||||||
 | 
					using the correct os-specific path separator when invoking the
 | 
				
			||||||
 | 
					provided callback function.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```Go
 | 
				
			||||||
 | 
					    dirname := "some/directory/root"
 | 
				
			||||||
 | 
					    err := godirwalk.Walk(dirname, &godirwalk.Options{
 | 
				
			||||||
 | 
					        Callback: func(osPathname string, de *godirwalk.Dirent) error {
 | 
				
			||||||
 | 
					            fmt.Printf("%s %s\n", de.ModeType(), osPathname)
 | 
				
			||||||
 | 
					            return nil
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        Unsorted: true, // (optional) set true for faster yet non-deterministic enumeration (see godoc)
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This library not only provides functions for traversing a file system
 | 
				
			||||||
 | 
					directory tree, but also for obtaining a list of immediate descendants
 | 
				
			||||||
 | 
					of a particular directory, typically much more quickly than using
 | 
				
			||||||
 | 
					`os.ReadDir` or `os.ReadDirnames`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Documentation is available via
 | 
				
			||||||
 | 
					[](https://godoc.org/github.com/karrick/godirwalk).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Description
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Here's why I use `godirwalk` in preference to `filepath.Walk`,
 | 
				
			||||||
 | 
					`os.ReadDir`, and `os.ReadDirnames`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### It's faster than `filepath.Walk`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					When compared against `filepath.Walk` in benchmarks, it has been
 | 
				
			||||||
 | 
					observed to run between five and ten times the speed on darwin, at
 | 
				
			||||||
 | 
					speeds comparable to the that of the unix `find` utility; about twice
 | 
				
			||||||
 | 
					the speed on linux; and about four times the speed on Windows.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					How does it obtain this performance boost? It does less work to give
 | 
				
			||||||
 | 
					you nearly the same output. This library calls the same `syscall`
 | 
				
			||||||
 | 
					functions to do the work, but it makes fewer calls, does not throw
 | 
				
			||||||
 | 
					away information that it might need, and creates less memory churn
 | 
				
			||||||
 | 
					along the way by reusing the same scratch buffer rather than
 | 
				
			||||||
 | 
					reallocating a new buffer every time it reads data from the operating
 | 
				
			||||||
 | 
					system.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					While traversing a file system directory tree, `filepath.Walk` obtains
 | 
				
			||||||
 | 
					the list of immediate descendants of a directory, and throws away the
 | 
				
			||||||
 | 
					file system node type information provided by the operating system
 | 
				
			||||||
 | 
					that comes with the node's name. Then, immediately prior to invoking
 | 
				
			||||||
 | 
					the callback function, `filepath.Walk` invokes `os.Stat` for each
 | 
				
			||||||
 | 
					node, and passes the returned `os.FileInfo` information to the
 | 
				
			||||||
 | 
					callback.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					While the `os.FileInfo` information provided by `os.Stat` is extremely
 | 
				
			||||||
 | 
					helpful--and even includes the `os.FileMode` data--providing it
 | 
				
			||||||
 | 
					requires an additional system call for each node.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Because most callbacks only care about what the node type is, this
 | 
				
			||||||
 | 
					library does not throw the type information away, but rather provides
 | 
				
			||||||
 | 
					that information to the callback function in the form of a
 | 
				
			||||||
 | 
					`os.FileMode` value. Note that the provided `os.FileMode` value that
 | 
				
			||||||
 | 
					this library provides only has the node type information, and does not
 | 
				
			||||||
 | 
					have the permission bits, sticky bits, or other information from the
 | 
				
			||||||
 | 
					file's mode. If the callback does care about a particular node's
 | 
				
			||||||
 | 
					entire `os.FileInfo` data structure, the callback can easiy invoke
 | 
				
			||||||
 | 
					`os.Stat` when needed, and only when needed.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Benchmarks
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##### macOS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```Bash
 | 
				
			||||||
 | 
					go test -bench=.
 | 
				
			||||||
 | 
					goos: darwin
 | 
				
			||||||
 | 
					goarch: amd64
 | 
				
			||||||
 | 
					pkg: github.com/karrick/godirwalk
 | 
				
			||||||
 | 
					BenchmarkFilepathWalk-8             	       1	3001274570 ns/op
 | 
				
			||||||
 | 
					BenchmarkGoDirWalk-8                	       3	 465573172 ns/op
 | 
				
			||||||
 | 
					BenchmarkFlameGraphFilepathWalk-8   	       1	6957916936 ns/op
 | 
				
			||||||
 | 
					BenchmarkFlameGraphGoDirWalk-8      	       1	4210582571 ns/op
 | 
				
			||||||
 | 
					PASS
 | 
				
			||||||
 | 
					ok  	github.com/karrick/godirwalk	16.822s
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##### Linux
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```Bash
 | 
				
			||||||
 | 
					go test -bench=.
 | 
				
			||||||
 | 
					goos: linux
 | 
				
			||||||
 | 
					goarch: amd64
 | 
				
			||||||
 | 
					pkg: github.com/karrick/godirwalk
 | 
				
			||||||
 | 
					BenchmarkFilepathWalk-12              	       1	1609189170 ns/op
 | 
				
			||||||
 | 
					BenchmarkGoDirWalk-12                 	       5	 211336628 ns/op
 | 
				
			||||||
 | 
					BenchmarkFlameGraphFilepathWalk-12    	       1	3968119932 ns/op
 | 
				
			||||||
 | 
					BenchmarkFlameGraphGoDirWalk-12       	       1	2139598998 ns/op
 | 
				
			||||||
 | 
					PASS
 | 
				
			||||||
 | 
					ok  	github.com/karrick/godirwalk	9.007s
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### It's more correct on Windows than `filepath.Walk`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I did not previously care about this either, but humor me. We all love
 | 
				
			||||||
 | 
					how we can write once and run everywhere. It is essential for the
 | 
				
			||||||
 | 
					language's adoption, growth, and success, that the software we create
 | 
				
			||||||
 | 
					can run unmodified on all architectures and operating systems
 | 
				
			||||||
 | 
					supported by Go.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					When the traversed file system has a logical loop caused by symbolic
 | 
				
			||||||
 | 
					links to directories, on unix `filepath.Walk` ignores symbolic links
 | 
				
			||||||
 | 
					and traverses the entire directory tree without error. On Windows
 | 
				
			||||||
 | 
					however, `filepath.Walk` will continue following directory symbolic
 | 
				
			||||||
 | 
					links, even though it is not supposed to, eventually causing
 | 
				
			||||||
 | 
					`filepath.Walk` to terminate early and return an error when the
 | 
				
			||||||
 | 
					pathname gets too long from concatenating endless loops of symbolic
 | 
				
			||||||
 | 
					links onto the pathname. This error comes from Windows, passes through
 | 
				
			||||||
 | 
					`filepath.Walk`, and to the upstream client running `filepath.Walk`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The takeaway is that behavior is different based on which platform
 | 
				
			||||||
 | 
					`filepath.Walk` is running. While this is clearly not intentional,
 | 
				
			||||||
 | 
					until it is fixed in the standard library, it presents a compatibility
 | 
				
			||||||
 | 
					problem.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This library correctly identifies symbolic links that point to
 | 
				
			||||||
 | 
					directories and will only follow them when `FollowSymbolicLinks` is
 | 
				
			||||||
 | 
					set to true. Behavior on Windows and other operating systems is
 | 
				
			||||||
 | 
					identical.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### It's more easy to use than `filepath.Walk`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Since this library does not invoke `os.Stat` on every file system node
 | 
				
			||||||
 | 
					it encounters, there is no possible error event for the callback
 | 
				
			||||||
 | 
					function to filter on. The third argument in the `filepath.WalkFunc`
 | 
				
			||||||
 | 
					function signature to pass the error from `os.Stat` to the callback
 | 
				
			||||||
 | 
					function is no longer necessary, and thus eliminated from signature of
 | 
				
			||||||
 | 
					the callback function from this library.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Also, `filepath.Walk` invokes the callback function with a solidus
 | 
				
			||||||
 | 
					delimited pathname regardless of the os-specific path separator. This
 | 
				
			||||||
 | 
					library invokes the callback function with the os-specific pathname
 | 
				
			||||||
 | 
					separator, obviating a call to `filepath.Clean` in the callback
 | 
				
			||||||
 | 
					function for each node prior to actually using the provided pathname.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In other words, even on Windows, `filepath.Walk` will invoke the
 | 
				
			||||||
 | 
					callback with `some/path/to/foo.txt`, requiring well written clients
 | 
				
			||||||
 | 
					to perform pathname normalization for every file prior to working with
 | 
				
			||||||
 | 
					the specified file. In truth, many clients developed on unix and not
 | 
				
			||||||
 | 
					tested on Windows neglect this subtlety, and will result in software
 | 
				
			||||||
 | 
					bugs when running on Windows. This library would invoke the callback
 | 
				
			||||||
 | 
					function with `some\path\to\foo.txt` for the same file when running on
 | 
				
			||||||
 | 
					Windows, eliminating the need to normalize the pathname by the client,
 | 
				
			||||||
 | 
					and lessen the likelyhood that a client will work on unix but not on
 | 
				
			||||||
 | 
					Windows.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### It's more flexible than `filepath.Walk`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Configurable Handling of Symbolic Links
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The default behavior of this library is to ignore symbolic links to
 | 
				
			||||||
 | 
					directories when walking a directory tree, just like `filepath.Walk`
 | 
				
			||||||
 | 
					does. However, it does invoke the callback function with each node it
 | 
				
			||||||
 | 
					finds, including symbolic links. If a particular use case exists to
 | 
				
			||||||
 | 
					follow symbolic links when traversing a directory tree, this library
 | 
				
			||||||
 | 
					can be invoked in manner to do so, by setting the
 | 
				
			||||||
 | 
					`FollowSymbolicLinks` parameter to true.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Configurable Sorting of Directory Children
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The default behavior of this library is to always sort the immediate
 | 
				
			||||||
 | 
					descendants of a directory prior to visiting each node, just like
 | 
				
			||||||
 | 
					`filepath.Walk` does. This is usually the desired behavior. However,
 | 
				
			||||||
 | 
					this does come at a performance penalty to sort the names when a
 | 
				
			||||||
 | 
					directory node has many entries. If a particular use case exists that
 | 
				
			||||||
 | 
					does not require sorting the directory's immediate descendants prior
 | 
				
			||||||
 | 
					to visiting its nodes, this library will skip the sorting step when
 | 
				
			||||||
 | 
					the `Unsorted` parameter is set to true.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Configurable Post Children Callback
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This library provides upstream code with the ability to specify a
 | 
				
			||||||
 | 
					callback to be invoked for each directory after its children are
 | 
				
			||||||
 | 
					processed. This has been used to recursively delete empty directories
 | 
				
			||||||
 | 
					after traversing the file system in a more efficient manner. See the
 | 
				
			||||||
 | 
					`examples/clean-empties` directory for an example of this usage.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Configurable Error Callback
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This library provides upstream code with the ability to specify a
 | 
				
			||||||
 | 
					callback to be invoked for errors that the operating system returns,
 | 
				
			||||||
 | 
					allowing the upstream code to determine the next course of action to
 | 
				
			||||||
 | 
					take, whether to halt walking the hierarchy, as it would do were no
 | 
				
			||||||
 | 
					error callback provided, or skip the node that caused the error. See
 | 
				
			||||||
 | 
					the `examples/walk-fast` directory for an example of this usage.
 | 
				
			||||||
							
								
								
									
										74
									
								
								vendor/github.com/karrick/godirwalk/dirent.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								vendor/github.com/karrick/godirwalk/dirent.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,74 @@
 | 
				
			|||||||
 | 
					package godirwalk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
						"path/filepath"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Dirent stores the name and file system mode type of discovered file system
 | 
				
			||||||
 | 
					// entries.
 | 
				
			||||||
 | 
					type Dirent struct {
 | 
				
			||||||
 | 
						name     string
 | 
				
			||||||
 | 
						modeType os.FileMode
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewDirent returns a newly initialized Dirent structure, or an error. This
 | 
				
			||||||
 | 
					// function does not follow symbolic links.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// This function is rarely used, as Dirent structures are provided by other
 | 
				
			||||||
 | 
					// functions in this library that read and walk directories.
 | 
				
			||||||
 | 
					func NewDirent(osPathname string) (*Dirent, error) {
 | 
				
			||||||
 | 
						fi, err := os.Lstat(osPathname)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, errors.Wrap(err, "cannot lstat")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return &Dirent{
 | 
				
			||||||
 | 
							name:     filepath.Base(osPathname),
 | 
				
			||||||
 | 
							modeType: fi.Mode() & os.ModeType,
 | 
				
			||||||
 | 
						}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Name returns the basename of the file system entry.
 | 
				
			||||||
 | 
					func (de Dirent) Name() string { return de.name }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ModeType returns the mode bits that specify the file system node type. We
 | 
				
			||||||
 | 
					// could make our own enum-like data type for encoding the file type, but Go's
 | 
				
			||||||
 | 
					// runtime already gives us architecture independent file modes, as discussed in
 | 
				
			||||||
 | 
					// `os/types.go`:
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//    Go's runtime FileMode type has same definition on all systems, so that
 | 
				
			||||||
 | 
					//    information about files can be moved from one system to another portably.
 | 
				
			||||||
 | 
					func (de Dirent) ModeType() os.FileMode { return de.modeType }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IsDir returns true if and only if the Dirent represents a file system
 | 
				
			||||||
 | 
					// directory. Note that on some operating systems, more than one file mode bit
 | 
				
			||||||
 | 
					// may be set for a node. For instance, on Windows, a symbolic link that points
 | 
				
			||||||
 | 
					// to a directory will have both the directory and the symbolic link bits set.
 | 
				
			||||||
 | 
					func (de Dirent) IsDir() bool { return de.modeType&os.ModeDir != 0 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IsRegular returns true if and only if the Dirent represents a regular
 | 
				
			||||||
 | 
					// file. That is, it ensures that no mode type bits are set.
 | 
				
			||||||
 | 
					func (de Dirent) IsRegular() bool { return de.modeType&os.ModeType == 0 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IsSymlink returns true if and only if the Dirent represents a file system
 | 
				
			||||||
 | 
					// symbolic link. Note that on some operating systems, more than one file mode
 | 
				
			||||||
 | 
					// bit may be set for a node. For instance, on Windows, a symbolic link that
 | 
				
			||||||
 | 
					// points to a directory will have both the directory and the symbolic link bits
 | 
				
			||||||
 | 
					// set.
 | 
				
			||||||
 | 
					func (de Dirent) IsSymlink() bool { return de.modeType&os.ModeSymlink != 0 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Dirents represents a slice of Dirent pointers, which are sortable by
 | 
				
			||||||
 | 
					// name. This type satisfies the `sort.Interface` interface.
 | 
				
			||||||
 | 
					type Dirents []*Dirent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Len returns the count of Dirent structures in the slice.
 | 
				
			||||||
 | 
					func (l Dirents) Len() int { return len(l) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Less returns true if and only if the Name of the element specified by the
 | 
				
			||||||
 | 
					// first index is lexicographically less than that of the second index.
 | 
				
			||||||
 | 
					func (l Dirents) Less(i, j int) bool { return l[i].name < l[j].name }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Swap exchanges the two Dirent entries specified by the two provided indexes.
 | 
				
			||||||
 | 
					func (l Dirents) Swap(i, j int) { l[i], l[j] = l[j], l[i] }
 | 
				
			||||||
							
								
								
									
										34
									
								
								vendor/github.com/karrick/godirwalk/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								vendor/github.com/karrick/godirwalk/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					Package godirwalk provides functions to read and traverse directory trees.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In short, why do I use this library?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* It's faster than `filepath.Walk`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* It's more correct on Windows than `filepath.Walk`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* It's more easy to use than `filepath.Walk`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* It's more flexible than `filepath.Walk`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					USAGE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This library will normalize the provided top level directory name based on the
 | 
				
			||||||
 | 
					os-specific path separator by calling `filepath.Clean` on its first
 | 
				
			||||||
 | 
					argument. However it always provides the pathname created by using the correct
 | 
				
			||||||
 | 
					os-specific path separator when invoking the provided callback function.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dirname := "some/directory/root"
 | 
				
			||||||
 | 
					    err := godirwalk.Walk(dirname, &godirwalk.Options{
 | 
				
			||||||
 | 
					        Callback: func(osPathname string, de *godirwalk.Dirent) error {
 | 
				
			||||||
 | 
					            fmt.Printf("%s %s\n", de.ModeType(), osPathname)
 | 
				
			||||||
 | 
					            return nil
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This library not only provides functions for traversing a file system directory
 | 
				
			||||||
 | 
					tree, but also for obtaining a list of immediate descendants of a particular
 | 
				
			||||||
 | 
					directory, typically much more quickly than using `os.ReadDir` or
 | 
				
			||||||
 | 
					`os.ReadDirnames`.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					package godirwalk
 | 
				
			||||||
							
								
								
									
										3
									
								
								vendor/github.com/karrick/godirwalk/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/karrick/godirwalk/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					module github.com/karrick/godirwalk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require github.com/pkg/errors v0.8.0
 | 
				
			||||||
							
								
								
									
										1
									
								
								vendor/github.com/karrick/godirwalk/go.sum
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/karrick/godirwalk/go.sum
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
				
			||||||
							
								
								
									
										47
									
								
								vendor/github.com/karrick/godirwalk/readdir.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								vendor/github.com/karrick/godirwalk/readdir.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,47 @@
 | 
				
			|||||||
 | 
					package godirwalk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ReadDirents returns a sortable slice of pointers to Dirent structures, each
 | 
				
			||||||
 | 
					// representing the file system name and mode type for one of the immediate
 | 
				
			||||||
 | 
					// descendant of the specified directory. If the specified directory is a
 | 
				
			||||||
 | 
					// symbolic link, it will be resolved.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// If an optional scratch buffer is provided that is at least one page of
 | 
				
			||||||
 | 
					// memory, it will be used when reading directory entries from the file system.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//    children, err := godirwalk.ReadDirents(osDirname, nil)
 | 
				
			||||||
 | 
					//    if err != nil {
 | 
				
			||||||
 | 
					//        return nil, errors.Wrap(err, "cannot get list of directory children")
 | 
				
			||||||
 | 
					//    }
 | 
				
			||||||
 | 
					//    sort.Sort(children)
 | 
				
			||||||
 | 
					//    for _, child := range children {
 | 
				
			||||||
 | 
					//        fmt.Printf("%s %s\n", child.ModeType, child.Name)
 | 
				
			||||||
 | 
					//    }
 | 
				
			||||||
 | 
					func ReadDirents(osDirname string, scratchBuffer []byte) (Dirents, error) {
 | 
				
			||||||
 | 
						return readdirents(osDirname, scratchBuffer)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ReadDirnames returns a slice of strings, representing the immediate
 | 
				
			||||||
 | 
					// descendants of the specified directory. If the specified directory is a
 | 
				
			||||||
 | 
					// symbolic link, it will be resolved.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// If an optional scratch buffer is provided that is at least one page of
 | 
				
			||||||
 | 
					// memory, it will be used when reading directory entries from the file system.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Note that this function, depending on operating system, may or may not invoke
 | 
				
			||||||
 | 
					// the ReadDirents function, in order to prepare the list of immediate
 | 
				
			||||||
 | 
					// descendants. Therefore, if your program needs both the names and the file
 | 
				
			||||||
 | 
					// system mode types of descendants, it will always be faster to invoke
 | 
				
			||||||
 | 
					// ReadDirents directly, rather than calling this function, then looping over
 | 
				
			||||||
 | 
					// the results and calling os.Stat for each child.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//    children, err := godirwalk.ReadDirnames(osDirname, nil)
 | 
				
			||||||
 | 
					//    if err != nil {
 | 
				
			||||||
 | 
					//        return nil, errors.Wrap(err, "cannot get list of directory children")
 | 
				
			||||||
 | 
					//    }
 | 
				
			||||||
 | 
					//    sort.Strings(children)
 | 
				
			||||||
 | 
					//    for _, child := range children {
 | 
				
			||||||
 | 
					//        fmt.Printf("%s\n", child)
 | 
				
			||||||
 | 
					//    }
 | 
				
			||||||
 | 
					func ReadDirnames(osDirname string, scratchBuffer []byte) ([]string, error) {
 | 
				
			||||||
 | 
						return readdirnames(osDirname, scratchBuffer)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										109
									
								
								vendor/github.com/karrick/godirwalk/readdir_unix.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								vendor/github.com/karrick/godirwalk/readdir_unix.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,109 @@
 | 
				
			|||||||
 | 
					// +build darwin freebsd linux netbsd openbsd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package godirwalk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
						"path/filepath"
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func readdirents(osDirname string, scratchBuffer []byte) (Dirents, error) {
 | 
				
			||||||
 | 
						dh, err := os.Open(osDirname)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, errors.Wrap(err, "cannot Open")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var entries Dirents
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fd := int(dh.Fd())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(scratchBuffer) < MinimumScratchBufferSize {
 | 
				
			||||||
 | 
							scratchBuffer = make([]byte, DefaultScratchBufferSize)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var de *syscall.Dirent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for {
 | 
				
			||||||
 | 
							n, err := syscall.ReadDirent(fd, scratchBuffer)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								_ = dh.Close() // ignore potential error returned by Close
 | 
				
			||||||
 | 
								return nil, errors.Wrap(err, "cannot ReadDirent")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if n <= 0 {
 | 
				
			||||||
 | 
								break // end of directory reached
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							// Loop over the bytes returned by reading the directory entries.
 | 
				
			||||||
 | 
							buf := scratchBuffer[:n]
 | 
				
			||||||
 | 
							for len(buf) > 0 {
 | 
				
			||||||
 | 
								de = (*syscall.Dirent)(unsafe.Pointer(&buf[0])) // point entry to first syscall.Dirent in buffer
 | 
				
			||||||
 | 
								buf = buf[de.Reclen:]                           // advance buffer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if inoFromDirent(de) == 0 {
 | 
				
			||||||
 | 
									continue // this item has been deleted, but not yet removed from directory
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								nameSlice := nameFromDirent(de)
 | 
				
			||||||
 | 
								namlen := len(nameSlice)
 | 
				
			||||||
 | 
								if (namlen == 0) || (namlen == 1 && nameSlice[0] == '.') || (namlen == 2 && nameSlice[0] == '.' && nameSlice[1] == '.') {
 | 
				
			||||||
 | 
									continue // skip unimportant entries
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								osChildname := string(nameSlice)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Convert syscall constant, which is in purview of OS, to a
 | 
				
			||||||
 | 
								// constant defined by Go, assumed by this project to be stable.
 | 
				
			||||||
 | 
								var mode os.FileMode
 | 
				
			||||||
 | 
								switch de.Type {
 | 
				
			||||||
 | 
								case syscall.DT_REG:
 | 
				
			||||||
 | 
									// regular file
 | 
				
			||||||
 | 
								case syscall.DT_DIR:
 | 
				
			||||||
 | 
									mode = os.ModeDir
 | 
				
			||||||
 | 
								case syscall.DT_LNK:
 | 
				
			||||||
 | 
									mode = os.ModeSymlink
 | 
				
			||||||
 | 
								case syscall.DT_CHR:
 | 
				
			||||||
 | 
									mode = os.ModeDevice | os.ModeCharDevice
 | 
				
			||||||
 | 
								case syscall.DT_BLK:
 | 
				
			||||||
 | 
									mode = os.ModeDevice
 | 
				
			||||||
 | 
								case syscall.DT_FIFO:
 | 
				
			||||||
 | 
									mode = os.ModeNamedPipe
 | 
				
			||||||
 | 
								case syscall.DT_SOCK:
 | 
				
			||||||
 | 
									mode = os.ModeSocket
 | 
				
			||||||
 | 
								default:
 | 
				
			||||||
 | 
									// If syscall returned unknown type (e.g., DT_UNKNOWN, DT_WHT),
 | 
				
			||||||
 | 
									// then resolve actual mode by getting stat.
 | 
				
			||||||
 | 
									fi, err := os.Lstat(filepath.Join(osDirname, osChildname))
 | 
				
			||||||
 | 
									if err != nil {
 | 
				
			||||||
 | 
										_ = dh.Close() // ignore potential error returned by Close
 | 
				
			||||||
 | 
										return nil, errors.Wrap(err, "cannot Stat")
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									// We only care about the bits that identify the type of a file
 | 
				
			||||||
 | 
									// system node, and can ignore append, exclusive, temporary,
 | 
				
			||||||
 | 
									// setuid, setgid, permission bits, and sticky bits, which are
 | 
				
			||||||
 | 
									// coincident to the bits that declare type of the file system
 | 
				
			||||||
 | 
									// node.
 | 
				
			||||||
 | 
									mode = fi.Mode() & os.ModeType
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								entries = append(entries, &Dirent{name: osChildname, modeType: mode})
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err = dh.Close(); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return entries, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func readdirnames(osDirname string, scratchBuffer []byte) ([]string, error) {
 | 
				
			||||||
 | 
						des, err := readdirents(osDirname, scratchBuffer)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						names := make([]string, len(des))
 | 
				
			||||||
 | 
						for i, v := range des {
 | 
				
			||||||
 | 
							names[i] = v.name
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return names, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										54
									
								
								vendor/github.com/karrick/godirwalk/readdir_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								vendor/github.com/karrick/godirwalk/readdir_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,54 @@
 | 
				
			|||||||
 | 
					package godirwalk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// The functions in this file are mere wrappers of what is already provided by
 | 
				
			||||||
 | 
					// standard library, in order to provide the same API as this library provides.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// The scratch buffer argument is ignored by this architecture.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Please send PR or link to article if you know of a more performant way of
 | 
				
			||||||
 | 
					// enumerating directory contents and mode types on Windows.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func readdirents(osDirname string, _ []byte) (Dirents, error) {
 | 
				
			||||||
 | 
						dh, err := os.Open(osDirname)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, errors.Wrap(err, "cannot Open")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fileinfos, err := dh.Readdir(0)
 | 
				
			||||||
 | 
						if er := dh.Close(); err == nil {
 | 
				
			||||||
 | 
							err = er
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, errors.Wrap(err, "cannot Readdir")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						entries := make(Dirents, len(fileinfos))
 | 
				
			||||||
 | 
						for i, info := range fileinfos {
 | 
				
			||||||
 | 
							entries[i] = &Dirent{name: info.Name(), modeType: info.Mode() & os.ModeType}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return entries, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func readdirnames(osDirname string, _ []byte) ([]string, error) {
 | 
				
			||||||
 | 
						dh, err := os.Open(osDirname)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, errors.Wrap(err, "cannot Open")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						entries, err := dh.Readdirnames(0)
 | 
				
			||||||
 | 
						if er := dh.Close(); err == nil {
 | 
				
			||||||
 | 
							err = er
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, errors.Wrap(err, "cannot Readdirnames")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return entries, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										367
									
								
								vendor/github.com/karrick/godirwalk/walk.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										367
									
								
								vendor/github.com/karrick/godirwalk/walk.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,367 @@
 | 
				
			|||||||
 | 
					package godirwalk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
						"path/filepath"
 | 
				
			||||||
 | 
						"sort"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// DefaultScratchBufferSize specifies the size of the scratch buffer that will
 | 
				
			||||||
 | 
					// be allocated by Walk, ReadDirents, or ReadDirnames when a scratch buffer is
 | 
				
			||||||
 | 
					// not provided or the scratch buffer that is provided is smaller than
 | 
				
			||||||
 | 
					// MinimumScratchBufferSize bytes. This may seem like a large value; however,
 | 
				
			||||||
 | 
					// when a program intends to enumerate large directories, having a larger
 | 
				
			||||||
 | 
					// scratch buffer results in fewer operating system calls.
 | 
				
			||||||
 | 
					const DefaultScratchBufferSize = 64 * 1024
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// MinimumScratchBufferSize specifies the minimum size of the scratch buffer
 | 
				
			||||||
 | 
					// that Walk, ReadDirents, and ReadDirnames will use when reading file entries
 | 
				
			||||||
 | 
					// from the operating system. It is initialized to the result from calling
 | 
				
			||||||
 | 
					// `os.Getpagesize()` during program startup.
 | 
				
			||||||
 | 
					var MinimumScratchBufferSize int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						MinimumScratchBufferSize = os.Getpagesize()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Options provide parameters for how the Walk function operates.
 | 
				
			||||||
 | 
					type Options struct {
 | 
				
			||||||
 | 
						// ErrorCallback specifies a function to be invoked in the case of an error
 | 
				
			||||||
 | 
						// that could potentially be ignored while walking a file system
 | 
				
			||||||
 | 
						// hierarchy. When set to nil or left as its zero-value, any error condition
 | 
				
			||||||
 | 
						// causes Walk to immediately return the error describing what took
 | 
				
			||||||
 | 
						// place. When non-nil, this user supplied function is invoked with the OS
 | 
				
			||||||
 | 
						// pathname of the file system object that caused the error along with the
 | 
				
			||||||
 | 
						// error that took place. The return value of the supplied ErrorCallback
 | 
				
			||||||
 | 
						// function determines whether the error will cause Walk to halt immediately
 | 
				
			||||||
 | 
						// as it would were no ErrorCallback value provided, or skip this file
 | 
				
			||||||
 | 
						// system node yet continue on with the remaining nodes in the file system
 | 
				
			||||||
 | 
						// hierarchy.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// ErrorCallback is invoked both for errors that are returned by the
 | 
				
			||||||
 | 
						// runtime, and for errors returned by other user supplied callback
 | 
				
			||||||
 | 
						// functions.
 | 
				
			||||||
 | 
						ErrorCallback func(string, error) ErrorAction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// FollowSymbolicLinks specifies whether Walk will follow symbolic links
 | 
				
			||||||
 | 
						// that refer to directories. When set to false or left as its zero-value,
 | 
				
			||||||
 | 
						// Walk will still invoke the callback function with symbolic link nodes,
 | 
				
			||||||
 | 
						// but if the symbolic link refers to a directory, it will not recurse on
 | 
				
			||||||
 | 
						// that directory. When set to true, Walk will recurse on symbolic links
 | 
				
			||||||
 | 
						// that refer to a directory.
 | 
				
			||||||
 | 
						FollowSymbolicLinks bool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Unsorted controls whether or not Walk will sort the immediate descendants
 | 
				
			||||||
 | 
						// of a directory by their relative names prior to visiting each of those
 | 
				
			||||||
 | 
						// entries.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// When set to false or left at its zero-value, Walk will get the list of
 | 
				
			||||||
 | 
						// immediate descendants of a particular directory, sort that list by
 | 
				
			||||||
 | 
						// lexical order of their names, and then visit each node in the list in
 | 
				
			||||||
 | 
						// sorted order. This will cause Walk to always traverse the same directory
 | 
				
			||||||
 | 
						// tree in the same order, however may be inefficient for directories with
 | 
				
			||||||
 | 
						// many immediate descendants.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// When set to true, Walk skips sorting the list of immediate descendants
 | 
				
			||||||
 | 
						// for a directory, and simply visits each node in the order the operating
 | 
				
			||||||
 | 
						// system enumerated them. This will be more fast, but with the side effect
 | 
				
			||||||
 | 
						// that the traversal order may be different from one invocation to the
 | 
				
			||||||
 | 
						// next.
 | 
				
			||||||
 | 
						Unsorted bool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Callback is a required function that Walk will invoke for every file
 | 
				
			||||||
 | 
						// system node it encounters.
 | 
				
			||||||
 | 
						Callback WalkFunc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// PostChildrenCallback is an option function that Walk will invoke for
 | 
				
			||||||
 | 
						// every file system directory it encounters after its children have been
 | 
				
			||||||
 | 
						// processed.
 | 
				
			||||||
 | 
						PostChildrenCallback WalkFunc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// ScratchBuffer is an optional byte slice to use as a scratch buffer for
 | 
				
			||||||
 | 
						// Walk to use when reading directory entries, to reduce amount of garbage
 | 
				
			||||||
 | 
						// generation. Not all architectures take advantage of the scratch
 | 
				
			||||||
 | 
						// buffer. If omitted or the provided buffer has fewer bytes than
 | 
				
			||||||
 | 
						// MinimumScratchBufferSize, then a buffer with DefaultScratchBufferSize
 | 
				
			||||||
 | 
						// bytes will be created and used once per Walk invocation.
 | 
				
			||||||
 | 
						ScratchBuffer []byte
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ErrorAction defines a set of actions the Walk function could take based on
 | 
				
			||||||
 | 
					// the occurrence of an error while walking the file system. See the
 | 
				
			||||||
 | 
					// documentation for the ErrorCallback field of the Options structure for more
 | 
				
			||||||
 | 
					// information.
 | 
				
			||||||
 | 
					type ErrorAction int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						// Halt is the ErrorAction return value when the upstream code wants to halt
 | 
				
			||||||
 | 
						// the walk process when a runtime error takes place. It matches the default
 | 
				
			||||||
 | 
						// action the Walk function would take were no ErrorCallback provided.
 | 
				
			||||||
 | 
						Halt ErrorAction = iota
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// SkipNode is the ErrorAction return value when the upstream code wants to
 | 
				
			||||||
 | 
						// ignore the runtime error for the current file system node, skip
 | 
				
			||||||
 | 
						// processing of the node that caused the error, and continue walking the
 | 
				
			||||||
 | 
						// file system hierarchy with the remaining nodes.
 | 
				
			||||||
 | 
						SkipNode
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// WalkFunc is the type of the function called for each file system node visited
 | 
				
			||||||
 | 
					// by Walk. The pathname argument will contain the argument to Walk as a prefix;
 | 
				
			||||||
 | 
					// that is, if Walk is called with "dir", which is a directory containing the
 | 
				
			||||||
 | 
					// file "a", the provided WalkFunc will be invoked with the argument "dir/a",
 | 
				
			||||||
 | 
					// using the correct os.PathSeparator for the Go Operating System architecture,
 | 
				
			||||||
 | 
					// GOOS. The directory entry argument is a pointer to a Dirent for the node,
 | 
				
			||||||
 | 
					// providing access to both the basename and the mode type of the file system
 | 
				
			||||||
 | 
					// node.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// If an error is returned by the Callback or PostChildrenCallback functions,
 | 
				
			||||||
 | 
					// and no ErrorCallback function is provided, processing stops. If an
 | 
				
			||||||
 | 
					// ErrorCallback function is provided, then it is invoked with the OS pathname
 | 
				
			||||||
 | 
					// of the node that caused the error along along with the error. The return
 | 
				
			||||||
 | 
					// value of the ErrorCallback function determines whether to halt processing, or
 | 
				
			||||||
 | 
					// skip this node and continue processing remaining file system nodes.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// The exception is when the function returns the special value
 | 
				
			||||||
 | 
					// filepath.SkipDir. If the function returns filepath.SkipDir when invoked on a
 | 
				
			||||||
 | 
					// directory, Walk skips the directory's contents entirely. If the function
 | 
				
			||||||
 | 
					// returns filepath.SkipDir when invoked on a non-directory file system node,
 | 
				
			||||||
 | 
					// Walk skips the remaining files in the containing directory. Note that any
 | 
				
			||||||
 | 
					// supplied ErrorCallback function is not invoked with filepath.SkipDir when the
 | 
				
			||||||
 | 
					// Callback or PostChildrenCallback functions return that special value.
 | 
				
			||||||
 | 
					type WalkFunc func(osPathname string, directoryEntry *Dirent) error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Walk walks the file tree rooted at the specified directory, calling the
 | 
				
			||||||
 | 
					// specified callback function for each file system node in the tree, including
 | 
				
			||||||
 | 
					// root, symbolic links, and other node types. The nodes are walked in lexical
 | 
				
			||||||
 | 
					// order, which makes the output deterministic but means that for very large
 | 
				
			||||||
 | 
					// directories this function can be inefficient.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// This function is often much faster than filepath.Walk because it does not
 | 
				
			||||||
 | 
					// invoke os.Stat for every node it encounters, but rather obtains the file
 | 
				
			||||||
 | 
					// system node type when it reads the parent directory.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// If a runtime error occurs, either from the operating system or from the
 | 
				
			||||||
 | 
					// upstream Callback or PostChildrenCallback functions, processing typically
 | 
				
			||||||
 | 
					// halts. However, when an ErrorCallback function is provided in the provided
 | 
				
			||||||
 | 
					// Options structure, that function is invoked with the error along with the OS
 | 
				
			||||||
 | 
					// pathname of the file system node that caused the error. The ErrorCallback
 | 
				
			||||||
 | 
					// function's return value determines the action that Walk will then take.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//    func main() {
 | 
				
			||||||
 | 
					//        dirname := "."
 | 
				
			||||||
 | 
					//        if len(os.Args) > 1 {
 | 
				
			||||||
 | 
					//            dirname = os.Args[1]
 | 
				
			||||||
 | 
					//        }
 | 
				
			||||||
 | 
					//        err := godirwalk.Walk(dirname, &godirwalk.Options{
 | 
				
			||||||
 | 
					//            Callback: func(osPathname string, de *godirwalk.Dirent) error {
 | 
				
			||||||
 | 
					//                fmt.Printf("%s %s\n", de.ModeType(), osPathname)
 | 
				
			||||||
 | 
					//                return nil
 | 
				
			||||||
 | 
					//            },
 | 
				
			||||||
 | 
					//            ErrorCallback: func(osPathname string, err error) godirwalk.ErrorAction {
 | 
				
			||||||
 | 
					//            	// Your program may want to log the error somehow.
 | 
				
			||||||
 | 
					//            	fmt.Fprintf(os.Stderr, "ERROR: %s\n", err)
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//            	// For the purposes of this example, a simple SkipNode will suffice,
 | 
				
			||||||
 | 
					//            	// although in reality perhaps additional logic might be called for.
 | 
				
			||||||
 | 
					//            	return godirwalk.SkipNode
 | 
				
			||||||
 | 
					//            },
 | 
				
			||||||
 | 
					//        })
 | 
				
			||||||
 | 
					//        if err != nil {
 | 
				
			||||||
 | 
					//            fmt.Fprintf(os.Stderr, "%s\n", err)
 | 
				
			||||||
 | 
					//            os.Exit(1)
 | 
				
			||||||
 | 
					//        }
 | 
				
			||||||
 | 
					//    }
 | 
				
			||||||
 | 
					func Walk(pathname string, options *Options) error {
 | 
				
			||||||
 | 
						pathname = filepath.Clean(pathname)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var fi os.FileInfo
 | 
				
			||||||
 | 
						var err error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if options.FollowSymbolicLinks {
 | 
				
			||||||
 | 
							fi, err = os.Stat(pathname)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return errors.Wrap(err, "cannot Stat")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							fi, err = os.Lstat(pathname)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return errors.Wrap(err, "cannot Lstat")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mode := fi.Mode()
 | 
				
			||||||
 | 
						if mode&os.ModeDir == 0 {
 | 
				
			||||||
 | 
							return errors.Errorf("cannot Walk non-directory: %s", pathname)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dirent := &Dirent{
 | 
				
			||||||
 | 
							name:     filepath.Base(pathname),
 | 
				
			||||||
 | 
							modeType: mode & os.ModeType,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// If ErrorCallback is nil, set to a default value that halts the walk
 | 
				
			||||||
 | 
						// process on all operating system errors. This is done to allow error
 | 
				
			||||||
 | 
						// handling to be more succinct in the walk code.
 | 
				
			||||||
 | 
						if options.ErrorCallback == nil {
 | 
				
			||||||
 | 
							options.ErrorCallback = defaultErrorCallback
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(options.ScratchBuffer) < MinimumScratchBufferSize {
 | 
				
			||||||
 | 
							options.ScratchBuffer = make([]byte, DefaultScratchBufferSize)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = walk(pathname, dirent, options)
 | 
				
			||||||
 | 
						if err == filepath.SkipDir {
 | 
				
			||||||
 | 
							return nil // silence SkipDir for top level
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// defaultErrorCallback always returns Halt because if the upstream code did not
 | 
				
			||||||
 | 
					// provide an ErrorCallback function, walking the file system hierarchy ought to
 | 
				
			||||||
 | 
					// halt upon any operating system error.
 | 
				
			||||||
 | 
					func defaultErrorCallback(_ string, _ error) ErrorAction { return Halt }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// walk recursively traverses the file system node specified by pathname and the
 | 
				
			||||||
 | 
					// Dirent.
 | 
				
			||||||
 | 
					func walk(osPathname string, dirent *Dirent, options *Options) error {
 | 
				
			||||||
 | 
						err := options.Callback(osPathname, dirent)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							if err == filepath.SkipDir {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							err = errors.Wrap(err, "Callback") // wrap potential errors returned by callback
 | 
				
			||||||
 | 
							if action := options.ErrorCallback(osPathname, err); action == SkipNode {
 | 
				
			||||||
 | 
								return nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// On some platforms, an entry can have more than one mode type bit set.
 | 
				
			||||||
 | 
						// For instance, it could have both the symlink bit and the directory bit
 | 
				
			||||||
 | 
						// set indicating it's a symlink to a directory.
 | 
				
			||||||
 | 
						if dirent.IsSymlink() {
 | 
				
			||||||
 | 
							if !options.FollowSymbolicLinks {
 | 
				
			||||||
 | 
								return nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							// Only need to Stat entry if platform did not already have os.ModeDir
 | 
				
			||||||
 | 
							// set, such as would be the case for unix like operating systems. (This
 | 
				
			||||||
 | 
							// guard eliminates extra os.Stat check on Windows.)
 | 
				
			||||||
 | 
							if !dirent.IsDir() {
 | 
				
			||||||
 | 
								referent, err := os.Readlink(osPathname)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									err = errors.Wrap(err, "cannot Readlink")
 | 
				
			||||||
 | 
									if action := options.ErrorCallback(osPathname, err); action == SkipNode {
 | 
				
			||||||
 | 
										return nil
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									return err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								var osp string
 | 
				
			||||||
 | 
								if filepath.IsAbs(referent) {
 | 
				
			||||||
 | 
									osp = referent
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									osp = filepath.Join(filepath.Dir(osPathname), referent)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								fi, err := os.Stat(osp)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									err = errors.Wrap(err, "cannot Stat")
 | 
				
			||||||
 | 
									if action := options.ErrorCallback(osp, err); action == SkipNode {
 | 
				
			||||||
 | 
										return nil
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									return err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								dirent.modeType = fi.Mode() & os.ModeType
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if !dirent.IsDir() {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// If get here, then specified pathname refers to a directory.
 | 
				
			||||||
 | 
						deChildren, err := ReadDirents(osPathname, options.ScratchBuffer)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							err = errors.Wrap(err, "cannot ReadDirents")
 | 
				
			||||||
 | 
							if action := options.ErrorCallback(osPathname, err); action == SkipNode {
 | 
				
			||||||
 | 
								return nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if !options.Unsorted {
 | 
				
			||||||
 | 
							sort.Sort(deChildren) // sort children entries unless upstream says to leave unsorted
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, deChild := range deChildren {
 | 
				
			||||||
 | 
							osChildname := filepath.Join(osPathname, deChild.name)
 | 
				
			||||||
 | 
							err = walk(osChildname, deChild, options)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								if err != filepath.SkipDir {
 | 
				
			||||||
 | 
									return err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								// If received skipdir on a directory, stop processing that
 | 
				
			||||||
 | 
								// directory, but continue to its siblings. If received skipdir on a
 | 
				
			||||||
 | 
								// non-directory, stop processing remaining siblings.
 | 
				
			||||||
 | 
								if deChild.IsSymlink() {
 | 
				
			||||||
 | 
									// Only need to Stat entry if platform did not already have
 | 
				
			||||||
 | 
									// os.ModeDir set, such as would be the case for unix like
 | 
				
			||||||
 | 
									// operating systems. (This guard eliminates extra os.Stat check
 | 
				
			||||||
 | 
									// on Windows.)
 | 
				
			||||||
 | 
									if !deChild.IsDir() {
 | 
				
			||||||
 | 
										// Resolve symbolic link referent to determine whether node
 | 
				
			||||||
 | 
										// is directory or not.
 | 
				
			||||||
 | 
										referent, err := os.Readlink(osChildname)
 | 
				
			||||||
 | 
										if err != nil {
 | 
				
			||||||
 | 
											err = errors.Wrap(err, "cannot Readlink")
 | 
				
			||||||
 | 
											if action := options.ErrorCallback(osChildname, err); action == SkipNode {
 | 
				
			||||||
 | 
												continue // with next child
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
											return err
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										var osp string
 | 
				
			||||||
 | 
										if filepath.IsAbs(referent) {
 | 
				
			||||||
 | 
											osp = referent
 | 
				
			||||||
 | 
										} else {
 | 
				
			||||||
 | 
											osp = filepath.Join(osPathname, referent)
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										fi, err := os.Stat(osp)
 | 
				
			||||||
 | 
										if err != nil {
 | 
				
			||||||
 | 
											err = errors.Wrap(err, "cannot Stat")
 | 
				
			||||||
 | 
											if action := options.ErrorCallback(osp, err); action == SkipNode {
 | 
				
			||||||
 | 
												continue // with next child
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
											return err
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										deChild.modeType = fi.Mode() & os.ModeType
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if !deChild.IsDir() {
 | 
				
			||||||
 | 
									// If not directory, return immediately, thus skipping remainder
 | 
				
			||||||
 | 
									// of siblings.
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if options.PostChildrenCallback == nil {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = options.PostChildrenCallback(osPathname, dirent)
 | 
				
			||||||
 | 
						if err == nil || err == filepath.SkipDir {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = errors.Wrap(err, "PostChildrenCallback") // wrap potential errors returned by callback
 | 
				
			||||||
 | 
						if action := options.ErrorCallback(osPathname, err); action == SkipNode {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										9
									
								
								vendor/github.com/karrick/godirwalk/withFileno.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/karrick/godirwalk/withFileno.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					// +build dragonfly freebsd openbsd netbsd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package godirwalk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "syscall"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func inoFromDirent(de *syscall.Dirent) uint64 {
 | 
				
			||||||
 | 
						return uint64(de.Fileno)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										9
									
								
								vendor/github.com/karrick/godirwalk/withIno.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/karrick/godirwalk/withIno.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					// +build darwin linux
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package godirwalk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "syscall"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func inoFromDirent(de *syscall.Dirent) uint64 {
 | 
				
			||||||
 | 
						return de.Ino
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										29
									
								
								vendor/github.com/karrick/godirwalk/withNamlen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								vendor/github.com/karrick/godirwalk/withNamlen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					// +build darwin dragonfly freebsd netbsd openbsd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package godirwalk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"reflect"
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func nameFromDirent(de *syscall.Dirent) []byte {
 | 
				
			||||||
 | 
						// Because this GOOS' syscall.Dirent provides a Namlen field that says how
 | 
				
			||||||
 | 
						// long the name is, this function does not need to search for the NULL
 | 
				
			||||||
 | 
						// byte.
 | 
				
			||||||
 | 
						ml := int(de.Namlen)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Convert syscall.Dirent.Name, which is array of int8, to []byte, by
 | 
				
			||||||
 | 
						// overwriting Cap, Len, and Data slice header fields to values from
 | 
				
			||||||
 | 
						// syscall.Dirent fields. Setting the Cap, Len, and Data field values for
 | 
				
			||||||
 | 
						// the slice header modifies what the slice header points to, and in this
 | 
				
			||||||
 | 
						// case, the name buffer.
 | 
				
			||||||
 | 
						var name []byte
 | 
				
			||||||
 | 
						sh := (*reflect.SliceHeader)(unsafe.Pointer(&name))
 | 
				
			||||||
 | 
						sh.Cap = ml
 | 
				
			||||||
 | 
						sh.Len = ml
 | 
				
			||||||
 | 
						sh.Data = uintptr(unsafe.Pointer(&de.Name[0]))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return name
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										36
									
								
								vendor/github.com/karrick/godirwalk/withoutNamlen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								vendor/github.com/karrick/godirwalk/withoutNamlen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
				
			|||||||
 | 
					// +build nacl linux solaris
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package godirwalk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"bytes"
 | 
				
			||||||
 | 
						"reflect"
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func nameFromDirent(de *syscall.Dirent) []byte {
 | 
				
			||||||
 | 
						// Because this GOOS' syscall.Dirent does not provide a field that specifies
 | 
				
			||||||
 | 
						// the name length, this function must first calculate the max possible name
 | 
				
			||||||
 | 
						// length, and then search for the NULL byte.
 | 
				
			||||||
 | 
						ml := int(uint64(de.Reclen) - uint64(unsafe.Offsetof(syscall.Dirent{}.Name)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Convert syscall.Dirent.Name, which is array of int8, to []byte, by
 | 
				
			||||||
 | 
						// overwriting Cap, Len, and Data slice header fields to values from
 | 
				
			||||||
 | 
						// syscall.Dirent fields. Setting the Cap, Len, and Data field values for
 | 
				
			||||||
 | 
						// the slice header modifies what the slice header points to, and in this
 | 
				
			||||||
 | 
						// case, the name buffer.
 | 
				
			||||||
 | 
						var name []byte
 | 
				
			||||||
 | 
						sh := (*reflect.SliceHeader)(unsafe.Pointer(&name))
 | 
				
			||||||
 | 
						sh.Cap = ml
 | 
				
			||||||
 | 
						sh.Len = ml
 | 
				
			||||||
 | 
						sh.Data = uintptr(unsafe.Pointer(&de.Name[0]))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if index := bytes.IndexByte(name, 0); index >= 0 {
 | 
				
			||||||
 | 
							// Found NULL byte; set slice's cap and len accordingly.
 | 
				
			||||||
 | 
							sh.Cap = index
 | 
				
			||||||
 | 
							sh.Len = index
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return name
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										2
									
								
								vendor/github.com/kubernetes/repo-infra/kazel/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/kubernetes/repo-infra/kazel/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -14,7 +14,7 @@ go_library(
 | 
				
			|||||||
    visibility = ["//visibility:private"],
 | 
					    visibility = ["//visibility:private"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//vendor/github.com/bazelbuild/buildtools/build:go_default_library",
 | 
					        "//vendor/github.com/bazelbuild/buildtools/build:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								vendor/github.com/kubernetes/repo-infra/kazel/config.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/kubernetes/repo-infra/kazel/config.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -28,6 +28,9 @@ type Cfg struct {
 | 
				
			|||||||
	SrcDirs []string
 | 
						SrcDirs []string
 | 
				
			||||||
	// regexps that match packages to skip
 | 
						// regexps that match packages to skip
 | 
				
			||||||
	SkippedPaths []string
 | 
						SkippedPaths []string
 | 
				
			||||||
 | 
						// regexps that match packages to skip for K8SOpenAPIGen.
 | 
				
			||||||
 | 
						// note that this skips anything matched by SkippedPaths as well.
 | 
				
			||||||
 | 
						SkippedOpenAPIGenPaths []string
 | 
				
			||||||
	// whether to add "pkg-srcs" and "all-srcs" filegroups
 | 
						// whether to add "pkg-srcs" and "all-srcs" filegroups
 | 
				
			||||||
	// note that this operates on the entire tree (not just SrcsDirs) but skips anything matching SkippedPaths
 | 
						// note that this operates on the entire tree (not just SrcsDirs) but skips anything matching SkippedPaths
 | 
				
			||||||
	AddSourcesRules bool
 | 
						AddSourcesRules bool
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/kubernetes/repo-infra/kazel/generator.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/kubernetes/repo-infra/kazel/generator.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -55,7 +55,7 @@ func (v *Vendorer) walkGenerated() error {
 | 
				
			|||||||
// findOpenAPI searches for all packages under root that request OpenAPI. It
 | 
					// findOpenAPI searches for all packages under root that request OpenAPI. It
 | 
				
			||||||
// returns the go import paths. It does not follow symlinks.
 | 
					// returns the go import paths. It does not follow symlinks.
 | 
				
			||||||
func (v *Vendorer) findOpenAPI(root string) ([]string, error) {
 | 
					func (v *Vendorer) findOpenAPI(root string) ([]string, error) {
 | 
				
			||||||
	for _, r := range v.skippedPaths {
 | 
						for _, r := range v.skippedOpenAPIPaths {
 | 
				
			||||||
		if r.MatchString(root) {
 | 
							if r.MatchString(root) {
 | 
				
			||||||
			return nil, nil
 | 
								return nil, nil
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										77
									
								
								vendor/github.com/kubernetes/repo-infra/kazel/kazel.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										77
									
								
								vendor/github.com/kubernetes/repo-infra/kazel/kazel.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -31,7 +31,8 @@ import (
 | 
				
			|||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bzl "github.com/bazelbuild/buildtools/build"
 | 
						bzl "github.com/bazelbuild/buildtools/build"
 | 
				
			||||||
	"github.com/golang/glog"
 | 
					
 | 
				
			||||||
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
@@ -51,36 +52,36 @@ func main() {
 | 
				
			|||||||
	flag.Parse()
 | 
						flag.Parse()
 | 
				
			||||||
	flag.Set("alsologtostderr", "true")
 | 
						flag.Set("alsologtostderr", "true")
 | 
				
			||||||
	if *root == "" {
 | 
						if *root == "" {
 | 
				
			||||||
		glog.Fatalf("-root argument is required")
 | 
							klog.Fatalf("-root argument is required")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if *validate {
 | 
						if *validate {
 | 
				
			||||||
		*dryRun = true
 | 
							*dryRun = true
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	v, err := newVendorer(*root, *cfgPath, *dryRun)
 | 
						v, err := newVendorer(*root, *cfgPath, *dryRun)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.Fatalf("unable to build vendorer: %v", err)
 | 
							klog.Fatalf("unable to build vendorer: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if err = os.Chdir(v.root); err != nil {
 | 
						if err = os.Chdir(v.root); err != nil {
 | 
				
			||||||
		glog.Fatalf("cannot chdir into root %q: %v", v.root, err)
 | 
							klog.Fatalf("cannot chdir into root %q: %v", v.root, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if v.cfg.ManageGoRules {
 | 
						if v.cfg.ManageGoRules {
 | 
				
			||||||
		if err = v.walkVendor(); err != nil {
 | 
							if err = v.walkVendor(); err != nil {
 | 
				
			||||||
			glog.Fatalf("err walking vendor: %v", err)
 | 
								klog.Fatalf("err walking vendor: %v", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if err = v.walkRepo(); err != nil {
 | 
							if err = v.walkRepo(); err != nil {
 | 
				
			||||||
			glog.Fatalf("err walking repo: %v", err)
 | 
								klog.Fatalf("err walking repo: %v", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if err = v.walkGenerated(); err != nil {
 | 
						if err = v.walkGenerated(); err != nil {
 | 
				
			||||||
		glog.Fatalf("err walking generated: %v", err)
 | 
							klog.Fatalf("err walking generated: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if _, err = v.walkSource("."); err != nil {
 | 
						if _, err = v.walkSource("."); err != nil {
 | 
				
			||||||
		glog.Fatalf("err walking source: %v", err)
 | 
							klog.Fatalf("err walking source: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	written := 0
 | 
						written := 0
 | 
				
			||||||
	if written, err = v.reconcileAllRules(); err != nil {
 | 
						if written, err = v.reconcileAllRules(); err != nil {
 | 
				
			||||||
		glog.Fatalf("err reconciling rules: %v", err)
 | 
							klog.Fatalf("err reconciling rules: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if *validate && written > 0 {
 | 
						if *validate && written > 0 {
 | 
				
			||||||
		fmt.Fprintf(os.Stderr, "\n%d BUILD files not up-to-date.\n", written)
 | 
							fmt.Fprintf(os.Stderr, "\n%d BUILD files not up-to-date.\n", written)
 | 
				
			||||||
@@ -90,14 +91,15 @@ func main() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Vendorer collects context, configuration, and cache while walking the tree.
 | 
					// Vendorer collects context, configuration, and cache while walking the tree.
 | 
				
			||||||
type Vendorer struct {
 | 
					type Vendorer struct {
 | 
				
			||||||
	ctx          *build.Context
 | 
						ctx                 *build.Context
 | 
				
			||||||
	icache       map[icacheKey]icacheVal
 | 
						icache              map[icacheKey]icacheVal
 | 
				
			||||||
	skippedPaths []*regexp.Regexp
 | 
						skippedPaths        []*regexp.Regexp
 | 
				
			||||||
	dryRun       bool
 | 
						skippedOpenAPIPaths []*regexp.Regexp
 | 
				
			||||||
	root         string
 | 
						dryRun              bool
 | 
				
			||||||
	cfg          *Cfg
 | 
						root                string
 | 
				
			||||||
	newRules     map[string][]*bzl.Rule // package path -> list of rules to add or update
 | 
						cfg                 *Cfg
 | 
				
			||||||
	managedAttrs []string
 | 
						newRules            map[string][]*bzl.Rule // package path -> list of rules to add or update
 | 
				
			||||||
 | 
						managedAttrs        []string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func newVendorer(root, cfgPath string, dryRun bool) (*Vendorer, error) {
 | 
					func newVendorer(root, cfgPath string, dryRun bool) (*Vendorer, error) {
 | 
				
			||||||
@@ -123,19 +125,23 @@ func newVendorer(root, cfgPath string, dryRun bool) (*Vendorer, error) {
 | 
				
			|||||||
		managedAttrs: []string{"srcs", "deps", "library"},
 | 
							managedAttrs: []string{"srcs", "deps", "library"},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, sp := range cfg.SkippedPaths {
 | 
						builtIn, err := compileSkippedPaths([]string{"^\\.git", "^bazel-*"})
 | 
				
			||||||
		r, err := regexp.Compile(sp)
 | 
						if err != nil {
 | 
				
			||||||
		if err != nil {
 | 
							return nil, err
 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		v.skippedPaths = append(v.skippedPaths, r)
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for _, builtinSkip := range []string{
 | 
					
 | 
				
			||||||
		"^\\.git",
 | 
						sp, err := compileSkippedPaths(cfg.SkippedPaths)
 | 
				
			||||||
		"^bazel-*",
 | 
						if err != nil {
 | 
				
			||||||
	} {
 | 
							return nil, err
 | 
				
			||||||
		v.skippedPaths = append(v.skippedPaths, regexp.MustCompile(builtinSkip))
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						sp = append(builtIn, sp...)
 | 
				
			||||||
 | 
						v.skippedPaths = sp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sop, err := compileSkippedPaths(cfg.SkippedOpenAPIGenPaths)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						v.skippedOpenAPIPaths = append(sop, sp...)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &v, nil
 | 
						return &v, nil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -541,7 +547,7 @@ func asExpr(e interface{}) bzl.Expr {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		return &bzl.ListExpr{List: list}
 | 
							return &bzl.ListExpr{List: list}
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		glog.Fatalf("Uh oh")
 | 
							klog.Fatalf("Uh oh")
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -782,3 +788,16 @@ func context() *build.Context {
 | 
				
			|||||||
func walk(root string, walkFn filepath.WalkFunc) error {
 | 
					func walk(root string, walkFn filepath.WalkFunc) error {
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func compileSkippedPaths(skippedPaths []string) ([]*regexp.Regexp, error) {
 | 
				
			||||||
 | 
						regexPaths := []*regexp.Regexp{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, sp := range skippedPaths {
 | 
				
			||||||
 | 
							r, err := regexp.Compile(sp)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							regexPaths = append(regexPaths, r)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return regexPaths, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										23
									
								
								vendor/github.com/sigma/go-inotify/BUILD
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								vendor/github.com/sigma/go-inotify/BUILD
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					load("@io_bazel_rules_go//go:def.bzl", "go_library")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					go_library(
 | 
				
			||||||
 | 
					    name = "go_default_library",
 | 
				
			||||||
 | 
					    srcs = ["inotify_linux.go"],
 | 
				
			||||||
 | 
					    importmap = "k8s.io/kubernetes/vendor/github.com/sigma/go-inotify",
 | 
				
			||||||
 | 
					    importpath = "github.com/sigma/go-inotify",
 | 
				
			||||||
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					filegroup(
 | 
				
			||||||
 | 
					    name = "package-srcs",
 | 
				
			||||||
 | 
					    srcs = glob(["**"]),
 | 
				
			||||||
 | 
					    tags = ["automanaged"],
 | 
				
			||||||
 | 
					    visibility = ["//visibility:private"],
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					filegroup(
 | 
				
			||||||
 | 
					    name = "all-srcs",
 | 
				
			||||||
 | 
					    srcs = [":package-srcs"],
 | 
				
			||||||
 | 
					    tags = ["automanaged"],
 | 
				
			||||||
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
							
								
								
									
										27
									
								
								vendor/github.com/sigma/go-inotify/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								vendor/github.com/sigma/go-inotify/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
				
			|||||||
 | 
					Copyright (c) 2009 The Go Authors. All rights reserved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					modification, are permitted provided that the following conditions are
 | 
				
			||||||
 | 
					met:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   * Redistributions of source code must retain the above copyright
 | 
				
			||||||
 | 
					notice, this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					   * Redistributions in binary form must reproduce the above
 | 
				
			||||||
 | 
					copyright notice, this list of conditions and the following disclaimer
 | 
				
			||||||
 | 
					in the documentation and/or other materials provided with the
 | 
				
			||||||
 | 
					distribution.
 | 
				
			||||||
 | 
					   * Neither the name of Google Inc. nor the names of its
 | 
				
			||||||
 | 
					contributors may be used to endorse or promote products derived from
 | 
				
			||||||
 | 
					this software without specific prior written permission.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
				
			||||||
 | 
					"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
				
			||||||
 | 
					LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
				
			||||||
 | 
					A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
				
			||||||
 | 
					OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
				
			||||||
 | 
					SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
				
			||||||
 | 
					LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
				
			||||||
 | 
					DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
				
			||||||
 | 
					THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
				
			||||||
 | 
					(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
				
			||||||
 | 
					OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
							
								
								
									
										22
									
								
								vendor/github.com/sigma/go-inotify/PATENTS
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								vendor/github.com/sigma/go-inotify/PATENTS
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					Additional IP Rights Grant (Patents)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"This implementation" means the copyrightable works distributed by
 | 
				
			||||||
 | 
					Google as part of the Go project.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Google hereby grants to You a perpetual, worldwide, non-exclusive,
 | 
				
			||||||
 | 
					no-charge, royalty-free, irrevocable (except as stated in this section)
 | 
				
			||||||
 | 
					patent license to make, have made, use, offer to sell, sell, import,
 | 
				
			||||||
 | 
					transfer and otherwise run, modify and propagate the contents of this
 | 
				
			||||||
 | 
					implementation of Go, where such license applies only to those patent
 | 
				
			||||||
 | 
					claims, both currently owned or controlled by Google and acquired in
 | 
				
			||||||
 | 
					the future, licensable by Google that are necessarily infringed by this
 | 
				
			||||||
 | 
					implementation of Go.  This grant does not include claims that would be
 | 
				
			||||||
 | 
					infringed only as a consequence of further modification of this
 | 
				
			||||||
 | 
					implementation.  If you or your agent or exclusive licensee institute or
 | 
				
			||||||
 | 
					order or agree to the institution of patent litigation against any
 | 
				
			||||||
 | 
					entity (including a cross-claim or counterclaim in a lawsuit) alleging
 | 
				
			||||||
 | 
					that this implementation of Go or any code incorporated within this
 | 
				
			||||||
 | 
					implementation of Go constitutes direct or contributory patent
 | 
				
			||||||
 | 
					infringement, or inducement of patent infringement, then any patent
 | 
				
			||||||
 | 
					rights granted to you under this License for this implementation of Go
 | 
				
			||||||
 | 
					shall terminate as of the date such litigation is filed.
 | 
				
			||||||
							
								
								
									
										5
									
								
								vendor/github.com/sigma/go-inotify/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/sigma/go-inotify/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					This is a fork of golang.org/x/exp/inotify before it was deleted.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Please use gopkg.in/fsnotify.v0 instead.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					For updates, see: https://fsnotify.org/
 | 
				
			||||||
							
								
								
									
										306
									
								
								vendor/github.com/sigma/go-inotify/inotify_linux.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										306
									
								
								vendor/github.com/sigma/go-inotify/inotify_linux.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,306 @@
 | 
				
			|||||||
 | 
					// Copyright 2010 The Go Authors. All rights reserved.
 | 
				
			||||||
 | 
					// Use of this source code is governed by a BSD-style
 | 
				
			||||||
 | 
					// license that can be found in the LICENSE file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					Package inotify implements a wrapper for the Linux inotify system.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Example:
 | 
				
			||||||
 | 
					    watcher, err := inotify.NewWatcher()
 | 
				
			||||||
 | 
					    if err != nil {
 | 
				
			||||||
 | 
					        log.Fatal(err)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    err = watcher.Watch("/tmp")
 | 
				
			||||||
 | 
					    if err != nil {
 | 
				
			||||||
 | 
					        log.Fatal(err)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    for {
 | 
				
			||||||
 | 
					        select {
 | 
				
			||||||
 | 
					        case ev := <-watcher.Event:
 | 
				
			||||||
 | 
					            log.Println("event:", ev)
 | 
				
			||||||
 | 
					        case err := <-watcher.Error:
 | 
				
			||||||
 | 
					            log.Println("error:", err)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					package inotify
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"errors"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
						"sync"
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Event struct {
 | 
				
			||||||
 | 
						Mask   uint32 // Mask of events
 | 
				
			||||||
 | 
						Cookie uint32 // Unique cookie associating related events (for rename(2))
 | 
				
			||||||
 | 
						Name   string // File name (optional)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type watch struct {
 | 
				
			||||||
 | 
						wd    uint32 // Watch descriptor (as returned by the inotify_add_watch() syscall)
 | 
				
			||||||
 | 
						flags uint32 // inotify flags of this watch (see inotify(7) for the list of valid flags)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Watcher struct {
 | 
				
			||||||
 | 
						mu       sync.Mutex
 | 
				
			||||||
 | 
						fd       int               // File descriptor (as returned by the inotify_init() syscall)
 | 
				
			||||||
 | 
						watches  map[string]*watch // Map of inotify watches (key: path)
 | 
				
			||||||
 | 
						paths    map[int]string    // Map of watched paths (key: watch descriptor)
 | 
				
			||||||
 | 
						Error    chan error        // Errors are sent on this channel
 | 
				
			||||||
 | 
						Event    chan *Event       // Events are returned on this channel
 | 
				
			||||||
 | 
						done     chan bool         // Channel for sending a "quit message" to the reader goroutine
 | 
				
			||||||
 | 
						isClosed bool              // Set to true when Close() is first called
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewWatcher creates and returns a new inotify instance using inotify_init(2)
 | 
				
			||||||
 | 
					func NewWatcher() (*Watcher, error) {
 | 
				
			||||||
 | 
						fd, errno := syscall.InotifyInit()
 | 
				
			||||||
 | 
						if fd == -1 {
 | 
				
			||||||
 | 
							return nil, os.NewSyscallError("inotify_init", errno)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						w := &Watcher{
 | 
				
			||||||
 | 
							fd:      fd,
 | 
				
			||||||
 | 
							watches: make(map[string]*watch),
 | 
				
			||||||
 | 
							paths:   make(map[int]string),
 | 
				
			||||||
 | 
							Event:   make(chan *Event),
 | 
				
			||||||
 | 
							Error:   make(chan error),
 | 
				
			||||||
 | 
							done:    make(chan bool, 1),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						go w.readEvents()
 | 
				
			||||||
 | 
						return w, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Close closes an inotify watcher instance
 | 
				
			||||||
 | 
					// It sends a message to the reader goroutine to quit and removes all watches
 | 
				
			||||||
 | 
					// associated with the inotify instance
 | 
				
			||||||
 | 
					func (w *Watcher) Close() error {
 | 
				
			||||||
 | 
						if w.isClosed {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						w.isClosed = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Send "quit" message to the reader goroutine
 | 
				
			||||||
 | 
						w.done <- true
 | 
				
			||||||
 | 
						for path := range w.watches {
 | 
				
			||||||
 | 
							w.RemoveWatch(path)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// AddWatch adds path to the watched file set.
 | 
				
			||||||
 | 
					// The flags are interpreted as described in inotify_add_watch(2).
 | 
				
			||||||
 | 
					func (w *Watcher) AddWatch(path string, flags uint32) error {
 | 
				
			||||||
 | 
						if w.isClosed {
 | 
				
			||||||
 | 
							return errors.New("inotify instance already closed")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						watchEntry, found := w.watches[path]
 | 
				
			||||||
 | 
						if found {
 | 
				
			||||||
 | 
							watchEntry.flags |= flags
 | 
				
			||||||
 | 
							flags |= syscall.IN_MASK_ADD
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						w.mu.Lock() // synchronize with readEvents goroutine
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wd, err := syscall.InotifyAddWatch(w.fd, path, flags)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							w.mu.Unlock()
 | 
				
			||||||
 | 
							return &os.PathError{
 | 
				
			||||||
 | 
								Op:   "inotify_add_watch",
 | 
				
			||||||
 | 
								Path: path,
 | 
				
			||||||
 | 
								Err:  err,
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if !found {
 | 
				
			||||||
 | 
							w.watches[path] = &watch{wd: uint32(wd), flags: flags}
 | 
				
			||||||
 | 
							w.paths[wd] = path
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						w.mu.Unlock()
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Watch adds path to the watched file set, watching all events.
 | 
				
			||||||
 | 
					func (w *Watcher) Watch(path string) error {
 | 
				
			||||||
 | 
						return w.AddWatch(path, IN_ALL_EVENTS)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// RemoveWatch removes path from the watched file set.
 | 
				
			||||||
 | 
					func (w *Watcher) RemoveWatch(path string) error {
 | 
				
			||||||
 | 
						watch, ok := w.watches[path]
 | 
				
			||||||
 | 
						if !ok {
 | 
				
			||||||
 | 
							return errors.New(fmt.Sprintf("can't remove non-existent inotify watch for: %s", path))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						success, errno := syscall.InotifyRmWatch(w.fd, watch.wd)
 | 
				
			||||||
 | 
						if success == -1 {
 | 
				
			||||||
 | 
							return os.NewSyscallError("inotify_rm_watch", errno)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						delete(w.watches, path)
 | 
				
			||||||
 | 
						// Locking here to protect the read from paths in readEvents.
 | 
				
			||||||
 | 
						w.mu.Lock()
 | 
				
			||||||
 | 
						delete(w.paths, int(watch.wd))
 | 
				
			||||||
 | 
						w.mu.Unlock()
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// readEvents reads from the inotify file descriptor, converts the
 | 
				
			||||||
 | 
					// received events into Event objects and sends them via the Event channel
 | 
				
			||||||
 | 
					func (w *Watcher) readEvents() {
 | 
				
			||||||
 | 
						var buf [syscall.SizeofInotifyEvent * 4096]byte
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for {
 | 
				
			||||||
 | 
							n, err := syscall.Read(w.fd, buf[:])
 | 
				
			||||||
 | 
							// See if there is a message on the "done" channel
 | 
				
			||||||
 | 
							var done bool
 | 
				
			||||||
 | 
							select {
 | 
				
			||||||
 | 
							case done = <-w.done:
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// If EOF or a "done" message is received
 | 
				
			||||||
 | 
							if n == 0 || done {
 | 
				
			||||||
 | 
								// The syscall.Close can be slow.  Close
 | 
				
			||||||
 | 
								// w.Event first.
 | 
				
			||||||
 | 
								close(w.Event)
 | 
				
			||||||
 | 
								err := syscall.Close(w.fd)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									w.Error <- os.NewSyscallError("close", err)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								close(w.Error)
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if n < 0 {
 | 
				
			||||||
 | 
								w.Error <- os.NewSyscallError("read", err)
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if n < syscall.SizeofInotifyEvent {
 | 
				
			||||||
 | 
								w.Error <- errors.New("inotify: short read in readEvents()")
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							var offset uint32 = 0
 | 
				
			||||||
 | 
							// We don't know how many events we just read into the buffer
 | 
				
			||||||
 | 
							// While the offset points to at least one whole event...
 | 
				
			||||||
 | 
							for offset <= uint32(n-syscall.SizeofInotifyEvent) {
 | 
				
			||||||
 | 
								// Point "raw" to the event in the buffer
 | 
				
			||||||
 | 
								raw := (*syscall.InotifyEvent)(unsafe.Pointer(&buf[offset]))
 | 
				
			||||||
 | 
								event := new(Event)
 | 
				
			||||||
 | 
								event.Mask = uint32(raw.Mask)
 | 
				
			||||||
 | 
								event.Cookie = uint32(raw.Cookie)
 | 
				
			||||||
 | 
								nameLen := uint32(raw.Len)
 | 
				
			||||||
 | 
								// If the event happened to the watched directory or the watched file, the kernel
 | 
				
			||||||
 | 
								// doesn't append the filename to the event, but we would like to always fill the
 | 
				
			||||||
 | 
								// the "Name" field with a valid filename. We retrieve the path of the watch from
 | 
				
			||||||
 | 
								// the "paths" map.
 | 
				
			||||||
 | 
								w.mu.Lock()
 | 
				
			||||||
 | 
								name, ok := w.paths[int(raw.Wd)]
 | 
				
			||||||
 | 
								w.mu.Unlock()
 | 
				
			||||||
 | 
								if ok {
 | 
				
			||||||
 | 
									event.Name = name
 | 
				
			||||||
 | 
									if nameLen > 0 {
 | 
				
			||||||
 | 
										// Point "bytes" at the first byte of the filename
 | 
				
			||||||
 | 
										bytes := (*[syscall.PathMax]byte)(unsafe.Pointer(&buf[offset+syscall.SizeofInotifyEvent]))
 | 
				
			||||||
 | 
										// The filename is padded with NUL bytes. TrimRight() gets rid of those.
 | 
				
			||||||
 | 
										event.Name += "/" + strings.TrimRight(string(bytes[0:nameLen]), "\000")
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									// Send the event on the events channel
 | 
				
			||||||
 | 
									w.Event <- event
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								// Move to the next event in the buffer
 | 
				
			||||||
 | 
								offset += syscall.SizeofInotifyEvent + nameLen
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// String formats the event e in the form
 | 
				
			||||||
 | 
					// "filename: 0xEventMask = IN_ACCESS|IN_ATTRIB_|..."
 | 
				
			||||||
 | 
					func (e *Event) String() string {
 | 
				
			||||||
 | 
						var events string = ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						m := e.Mask
 | 
				
			||||||
 | 
						for _, b := range eventBits {
 | 
				
			||||||
 | 
							if m&b.Value == b.Value {
 | 
				
			||||||
 | 
								m &^= b.Value
 | 
				
			||||||
 | 
								events += "|" + b.Name
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if m != 0 {
 | 
				
			||||||
 | 
							events += fmt.Sprintf("|%#x", m)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(events) > 0 {
 | 
				
			||||||
 | 
							events = " == " + events[1:]
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return fmt.Sprintf("%q: %#x%s", e.Name, e.Mask, events)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						// Options for inotify_init() are not exported
 | 
				
			||||||
 | 
						// IN_CLOEXEC    uint32 = syscall.IN_CLOEXEC
 | 
				
			||||||
 | 
						// IN_NONBLOCK   uint32 = syscall.IN_NONBLOCK
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Options for AddWatch
 | 
				
			||||||
 | 
						IN_DONT_FOLLOW uint32 = syscall.IN_DONT_FOLLOW
 | 
				
			||||||
 | 
						IN_ONESHOT     uint32 = syscall.IN_ONESHOT
 | 
				
			||||||
 | 
						IN_ONLYDIR     uint32 = syscall.IN_ONLYDIR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// The "IN_MASK_ADD" option is not exported, as AddWatch
 | 
				
			||||||
 | 
						// adds it automatically, if there is already a watch for the given path
 | 
				
			||||||
 | 
						// IN_MASK_ADD      uint32 = syscall.IN_MASK_ADD
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Events
 | 
				
			||||||
 | 
						IN_ACCESS        uint32 = syscall.IN_ACCESS
 | 
				
			||||||
 | 
						IN_ALL_EVENTS    uint32 = syscall.IN_ALL_EVENTS
 | 
				
			||||||
 | 
						IN_ATTRIB        uint32 = syscall.IN_ATTRIB
 | 
				
			||||||
 | 
						IN_CLOSE         uint32 = syscall.IN_CLOSE
 | 
				
			||||||
 | 
						IN_CLOSE_NOWRITE uint32 = syscall.IN_CLOSE_NOWRITE
 | 
				
			||||||
 | 
						IN_CLOSE_WRITE   uint32 = syscall.IN_CLOSE_WRITE
 | 
				
			||||||
 | 
						IN_CREATE        uint32 = syscall.IN_CREATE
 | 
				
			||||||
 | 
						IN_DELETE        uint32 = syscall.IN_DELETE
 | 
				
			||||||
 | 
						IN_DELETE_SELF   uint32 = syscall.IN_DELETE_SELF
 | 
				
			||||||
 | 
						IN_MODIFY        uint32 = syscall.IN_MODIFY
 | 
				
			||||||
 | 
						IN_MOVE          uint32 = syscall.IN_MOVE
 | 
				
			||||||
 | 
						IN_MOVED_FROM    uint32 = syscall.IN_MOVED_FROM
 | 
				
			||||||
 | 
						IN_MOVED_TO      uint32 = syscall.IN_MOVED_TO
 | 
				
			||||||
 | 
						IN_MOVE_SELF     uint32 = syscall.IN_MOVE_SELF
 | 
				
			||||||
 | 
						IN_OPEN          uint32 = syscall.IN_OPEN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Special events
 | 
				
			||||||
 | 
						IN_ISDIR      uint32 = syscall.IN_ISDIR
 | 
				
			||||||
 | 
						IN_IGNORED    uint32 = syscall.IN_IGNORED
 | 
				
			||||||
 | 
						IN_Q_OVERFLOW uint32 = syscall.IN_Q_OVERFLOW
 | 
				
			||||||
 | 
						IN_UNMOUNT    uint32 = syscall.IN_UNMOUNT
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var eventBits = []struct {
 | 
				
			||||||
 | 
						Value uint32
 | 
				
			||||||
 | 
						Name  string
 | 
				
			||||||
 | 
					}{
 | 
				
			||||||
 | 
						{IN_ACCESS, "IN_ACCESS"},
 | 
				
			||||||
 | 
						{IN_ATTRIB, "IN_ATTRIB"},
 | 
				
			||||||
 | 
						{IN_CLOSE, "IN_CLOSE"},
 | 
				
			||||||
 | 
						{IN_CLOSE_NOWRITE, "IN_CLOSE_NOWRITE"},
 | 
				
			||||||
 | 
						{IN_CLOSE_WRITE, "IN_CLOSE_WRITE"},
 | 
				
			||||||
 | 
						{IN_CREATE, "IN_CREATE"},
 | 
				
			||||||
 | 
						{IN_DELETE, "IN_DELETE"},
 | 
				
			||||||
 | 
						{IN_DELETE_SELF, "IN_DELETE_SELF"},
 | 
				
			||||||
 | 
						{IN_MODIFY, "IN_MODIFY"},
 | 
				
			||||||
 | 
						{IN_MOVE, "IN_MOVE"},
 | 
				
			||||||
 | 
						{IN_MOVED_FROM, "IN_MOVED_FROM"},
 | 
				
			||||||
 | 
						{IN_MOVED_TO, "IN_MOVED_TO"},
 | 
				
			||||||
 | 
						{IN_MOVE_SELF, "IN_MOVE_SELF"},
 | 
				
			||||||
 | 
						{IN_OPEN, "IN_OPEN"},
 | 
				
			||||||
 | 
						{IN_ISDIR, "IN_ISDIR"},
 | 
				
			||||||
 | 
						{IN_IGNORED, "IN_IGNORED"},
 | 
				
			||||||
 | 
						{IN_Q_OVERFLOW, "IN_Q_OVERFLOW"},
 | 
				
			||||||
 | 
						{IN_UNMOUNT, "IN_UNMOUNT"},
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										2
									
								
								vendor/k8s.io/gengo/examples/deepcopy-gen/generators/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/k8s.io/gengo/examples/deepcopy-gen/generators/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -7,12 +7,12 @@ go_library(
 | 
				
			|||||||
    importpath = "k8s.io/gengo/examples/deepcopy-gen/generators",
 | 
					    importpath = "k8s.io/gengo/examples/deepcopy-gen/generators",
 | 
				
			||||||
    visibility = ["//visibility:public"],
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/k8s.io/gengo/args:go_default_library",
 | 
					        "//vendor/k8s.io/gengo/args:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/gengo/examples/set-gen/sets:go_default_library",
 | 
					        "//vendor/k8s.io/gengo/examples/set-gen/sets:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/gengo/generator:go_default_library",
 | 
					        "//vendor/k8s.io/gengo/generator:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/gengo/namer:go_default_library",
 | 
					        "//vendor/k8s.io/gengo/namer:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/gengo/types:go_default_library",
 | 
					        "//vendor/k8s.io/gengo/types:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										60
									
								
								vendor/k8s.io/gengo/examples/deepcopy-gen/generators/deepcopy.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										60
									
								
								vendor/k8s.io/gengo/examples/deepcopy-gen/generators/deepcopy.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -29,7 +29,7 @@ import (
 | 
				
			|||||||
	"k8s.io/gengo/namer"
 | 
						"k8s.io/gengo/namer"
 | 
				
			||||||
	"k8s.io/gengo/types"
 | 
						"k8s.io/gengo/types"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CustomArgs is used tby the go2idl framework to pass args specific to this
 | 
					// CustomArgs is used tby the go2idl framework to pass args specific to this
 | 
				
			||||||
@@ -62,7 +62,7 @@ func extractTag(comments []string) *tagValue {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	// If there are multiple values, abort.
 | 
						// If there are multiple values, abort.
 | 
				
			||||||
	if len(tagVals) > 1 {
 | 
						if len(tagVals) > 1 {
 | 
				
			||||||
		glog.Fatalf("Found %d %s tags: %q", len(tagVals), tagName, tagVals)
 | 
							klog.Fatalf("Found %d %s tags: %q", len(tagVals), tagName, tagVals)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// If we got here we are returning something.
 | 
						// If we got here we are returning something.
 | 
				
			||||||
@@ -89,7 +89,7 @@ func extractTag(comments []string) *tagValue {
 | 
				
			|||||||
				tag.register = true
 | 
									tag.register = true
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			glog.Fatalf("Unsupported %s param: %q", tagName, parts[i])
 | 
								klog.Fatalf("Unsupported %s param: %q", tagName, parts[i])
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return tag
 | 
						return tag
 | 
				
			||||||
@@ -123,7 +123,7 @@ func DefaultNameSystem() string {
 | 
				
			|||||||
func Packages(context *generator.Context, arguments *args.GeneratorArgs) generator.Packages {
 | 
					func Packages(context *generator.Context, arguments *args.GeneratorArgs) generator.Packages {
 | 
				
			||||||
	boilerplate, err := arguments.LoadGoBoilerplate()
 | 
						boilerplate, err := arguments.LoadGoBoilerplate()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.Fatalf("Failed loading boilerplate: %v", err)
 | 
							klog.Fatalf("Failed loading boilerplate: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	inputs := sets.NewString(context.Inputs...)
 | 
						inputs := sets.NewString(context.Inputs...)
 | 
				
			||||||
@@ -143,7 +143,7 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for i := range inputs {
 | 
						for i := range inputs {
 | 
				
			||||||
		glog.V(5).Infof("Considering pkg %q", i)
 | 
							klog.V(5).Infof("Considering pkg %q", i)
 | 
				
			||||||
		pkg := context.Universe[i]
 | 
							pkg := context.Universe[i]
 | 
				
			||||||
		if pkg == nil {
 | 
							if pkg == nil {
 | 
				
			||||||
			// If the input had no Go files, for example.
 | 
								// If the input had no Go files, for example.
 | 
				
			||||||
@@ -156,12 +156,12 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
 | 
				
			|||||||
		if ptag != nil {
 | 
							if ptag != nil {
 | 
				
			||||||
			ptagValue = ptag.value
 | 
								ptagValue = ptag.value
 | 
				
			||||||
			if ptagValue != tagValuePackage {
 | 
								if ptagValue != tagValuePackage {
 | 
				
			||||||
				glog.Fatalf("Package %v: unsupported %s value: %q", i, tagName, ptagValue)
 | 
									klog.Fatalf("Package %v: unsupported %s value: %q", i, tagName, ptagValue)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			ptagRegister = ptag.register
 | 
								ptagRegister = ptag.register
 | 
				
			||||||
			glog.V(5).Infof("  tag.value: %q, tag.register: %t", ptagValue, ptagRegister)
 | 
								klog.V(5).Infof("  tag.value: %q, tag.register: %t", ptagValue, ptagRegister)
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			glog.V(5).Infof("  no tag")
 | 
								klog.V(5).Infof("  no tag")
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// If the pkg-scoped tag says to generate, we can skip scanning types.
 | 
							// If the pkg-scoped tag says to generate, we can skip scanning types.
 | 
				
			||||||
@@ -170,12 +170,12 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
 | 
				
			|||||||
			// If the pkg-scoped tag did not exist, scan all types for one that
 | 
								// If the pkg-scoped tag did not exist, scan all types for one that
 | 
				
			||||||
			// explicitly wants generation.
 | 
								// explicitly wants generation.
 | 
				
			||||||
			for _, t := range pkg.Types {
 | 
								for _, t := range pkg.Types {
 | 
				
			||||||
				glog.V(5).Infof("  considering type %q", t.Name.String())
 | 
									klog.V(5).Infof("  considering type %q", t.Name.String())
 | 
				
			||||||
				ttag := extractTag(t.CommentLines)
 | 
									ttag := extractTag(t.CommentLines)
 | 
				
			||||||
				if ttag != nil && ttag.value == "true" {
 | 
									if ttag != nil && ttag.value == "true" {
 | 
				
			||||||
					glog.V(5).Infof("    tag=true")
 | 
										klog.V(5).Infof("    tag=true")
 | 
				
			||||||
					if !copyableType(t) {
 | 
										if !copyableType(t) {
 | 
				
			||||||
						glog.Fatalf("Type %v requests deepcopy generation but is not copyable", t)
 | 
											klog.Fatalf("Type %v requests deepcopy generation but is not copyable", t)
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					pkgNeedsGeneration = true
 | 
										pkgNeedsGeneration = true
 | 
				
			||||||
					break
 | 
										break
 | 
				
			||||||
@@ -184,7 +184,7 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if pkgNeedsGeneration {
 | 
							if pkgNeedsGeneration {
 | 
				
			||||||
			glog.V(3).Infof("Package %q needs generation", i)
 | 
								klog.V(3).Infof("Package %q needs generation", i)
 | 
				
			||||||
			path := pkg.Path
 | 
								path := pkg.Path
 | 
				
			||||||
			// if the source path is within a /vendor/ directory (for example,
 | 
								// if the source path is within a /vendor/ directory (for example,
 | 
				
			||||||
			// k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/apis/meta/v1), allow
 | 
								// k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/apis/meta/v1), allow
 | 
				
			||||||
@@ -263,10 +263,10 @@ func (g *genDeepCopy) Filter(c *generator.Context, t *types.Type) bool {
 | 
				
			|||||||
		return false
 | 
							return false
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if !copyableType(t) {
 | 
						if !copyableType(t) {
 | 
				
			||||||
		glog.V(2).Infof("Type %v is not copyable", t)
 | 
							klog.V(2).Infof("Type %v is not copyable", t)
 | 
				
			||||||
		return false
 | 
							return false
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	glog.V(4).Infof("Type %v is copyable", t)
 | 
						klog.V(4).Infof("Type %v is copyable", t)
 | 
				
			||||||
	g.typesForInit = append(g.typesForInit, t)
 | 
						g.typesForInit = append(g.typesForInit, t)
 | 
				
			||||||
	return true
 | 
						return true
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -321,12 +321,12 @@ func deepCopyMethod(t *types.Type) (*types.Signature, error) {
 | 
				
			|||||||
	return f.Signature, nil
 | 
						return f.Signature, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// deepCopyMethodOrDie returns the signatrue of a DeepCopy method, nil or calls glog.Fatalf
 | 
					// deepCopyMethodOrDie returns the signatrue of a DeepCopy method, nil or calls klog.Fatalf
 | 
				
			||||||
// if the type does not match.
 | 
					// if the type does not match.
 | 
				
			||||||
func deepCopyMethodOrDie(t *types.Type) *types.Signature {
 | 
					func deepCopyMethodOrDie(t *types.Type) *types.Signature {
 | 
				
			||||||
	ret, err := deepCopyMethod(t)
 | 
						ret, err := deepCopyMethod(t)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.Fatal(err)
 | 
							klog.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return ret
 | 
						return ret
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -367,12 +367,12 @@ func deepCopyIntoMethod(t *types.Type) (*types.Signature, error) {
 | 
				
			|||||||
	return f.Signature, nil
 | 
						return f.Signature, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// deepCopyIntoMethodOrDie returns the signature of a DeepCopyInto() method, nil or calls glog.Fatalf
 | 
					// deepCopyIntoMethodOrDie returns the signature of a DeepCopyInto() method, nil or calls klog.Fatalf
 | 
				
			||||||
// if the type is wrong.
 | 
					// if the type is wrong.
 | 
				
			||||||
func deepCopyIntoMethodOrDie(t *types.Type) *types.Signature {
 | 
					func deepCopyIntoMethodOrDie(t *types.Type) *types.Signature {
 | 
				
			||||||
	ret, err := deepCopyIntoMethod(t)
 | 
						ret, err := deepCopyIntoMethod(t)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.Fatal(err)
 | 
							klog.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return ret
 | 
						return ret
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -465,17 +465,17 @@ func (g *genDeepCopy) needsGeneration(t *types.Type) bool {
 | 
				
			|||||||
	if tag != nil {
 | 
						if tag != nil {
 | 
				
			||||||
		tv = tag.value
 | 
							tv = tag.value
 | 
				
			||||||
		if tv != "true" && tv != "false" {
 | 
							if tv != "true" && tv != "false" {
 | 
				
			||||||
			glog.Fatalf("Type %v: unsupported %s value: %q", t, tagName, tag.value)
 | 
								klog.Fatalf("Type %v: unsupported %s value: %q", t, tagName, tag.value)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if g.allTypes && tv == "false" {
 | 
						if g.allTypes && tv == "false" {
 | 
				
			||||||
		// The whole package is being generated, but this type has opted out.
 | 
							// The whole package is being generated, but this type has opted out.
 | 
				
			||||||
		glog.V(5).Infof("Not generating for type %v because type opted out", t)
 | 
							klog.V(5).Infof("Not generating for type %v because type opted out", t)
 | 
				
			||||||
		return false
 | 
							return false
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if !g.allTypes && tv != "true" {
 | 
						if !g.allTypes && tv != "true" {
 | 
				
			||||||
		// The whole package is NOT being generated, and this type has NOT opted in.
 | 
							// The whole package is NOT being generated, and this type has NOT opted in.
 | 
				
			||||||
		glog.V(5).Infof("Not generating for type %v because type did not opt in", t)
 | 
							klog.V(5).Infof("Not generating for type %v because type did not opt in", t)
 | 
				
			||||||
		return false
 | 
							return false
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return true
 | 
						return true
 | 
				
			||||||
@@ -576,7 +576,7 @@ func (g *genDeepCopy) GenerateType(c *generator.Context, t *types.Type, w io.Wri
 | 
				
			|||||||
	if !g.needsGeneration(t) {
 | 
						if !g.needsGeneration(t) {
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	glog.V(5).Infof("Generating deepcopy function for type %v", t)
 | 
						klog.V(5).Infof("Generating deepcopy function for type %v", t)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sw := generator.NewSnippetWriter(w, c, "$", "$")
 | 
						sw := generator.NewSnippetWriter(w, c, "$", "$")
 | 
				
			||||||
	args := argsFromType(t)
 | 
						args := argsFromType(t)
 | 
				
			||||||
@@ -678,12 +678,12 @@ func (g *genDeepCopy) generateFor(t *types.Type, sw *generator.SnippetWriter) {
 | 
				
			|||||||
		f = g.doPointer
 | 
							f = g.doPointer
 | 
				
			||||||
	case types.Interface:
 | 
						case types.Interface:
 | 
				
			||||||
		// interfaces are handled in-line in the other cases
 | 
							// interfaces are handled in-line in the other cases
 | 
				
			||||||
		glog.Fatalf("Hit an interface type %v. This should never happen.", t)
 | 
							klog.Fatalf("Hit an interface type %v. This should never happen.", t)
 | 
				
			||||||
	case types.Alias:
 | 
						case types.Alias:
 | 
				
			||||||
		// can never happen because we branch on the underlying type which is never an alias
 | 
							// can never happen because we branch on the underlying type which is never an alias
 | 
				
			||||||
		glog.Fatalf("Hit an alias type %v. This should never happen.", t)
 | 
							klog.Fatalf("Hit an alias type %v. This should never happen.", t)
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		glog.Fatalf("Hit an unsupported type %v.", t)
 | 
							klog.Fatalf("Hit an unsupported type %v.", t)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	f(t, sw)
 | 
						f(t, sw)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -711,7 +711,7 @@ func (g *genDeepCopy) doMap(t *types.Type, sw *generator.SnippetWriter) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if !ut.Key.IsAssignable() {
 | 
						if !ut.Key.IsAssignable() {
 | 
				
			||||||
		glog.Fatalf("Hit an unsupported type %v.", uet)
 | 
							klog.Fatalf("Hit an unsupported type %v.", uet)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sw.Do("*out = make($.|raw$, len(*in))\n", t)
 | 
						sw.Do("*out = make($.|raw$, len(*in))\n", t)
 | 
				
			||||||
@@ -754,7 +754,7 @@ func (g *genDeepCopy) doMap(t *types.Type, sw *generator.SnippetWriter) {
 | 
				
			|||||||
	case uet.Kind == types.Struct:
 | 
						case uet.Kind == types.Struct:
 | 
				
			||||||
		sw.Do("(*out)[key] = *val.DeepCopy()\n", uet)
 | 
							sw.Do("(*out)[key] = *val.DeepCopy()\n", uet)
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		glog.Fatalf("Hit an unsupported type %v.", uet)
 | 
							klog.Fatalf("Hit an unsupported type %v.", uet)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	sw.Do("}\n", nil)
 | 
						sw.Do("}\n", nil)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -795,7 +795,7 @@ func (g *genDeepCopy) doSlice(t *types.Type, sw *generator.SnippetWriter) {
 | 
				
			|||||||
		} else if uet.Kind == types.Struct {
 | 
							} else if uet.Kind == types.Struct {
 | 
				
			||||||
			sw.Do("(*in)[i].DeepCopyInto(&(*out)[i])\n", nil)
 | 
								sw.Do("(*in)[i].DeepCopyInto(&(*out)[i])\n", nil)
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			glog.Fatalf("Hit an unsupported type %v.", uet)
 | 
								klog.Fatalf("Hit an unsupported type %v.", uet)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		sw.Do("}\n", nil)
 | 
							sw.Do("}\n", nil)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -863,7 +863,7 @@ func (g *genDeepCopy) doStruct(t *types.Type, sw *generator.SnippetWriter) {
 | 
				
			|||||||
			sw.Do(fmt.Sprintf("out.$.name$ = in.$.name$.DeepCopy%s()\n", uft.Name.Name), args)
 | 
								sw.Do(fmt.Sprintf("out.$.name$ = in.$.name$.DeepCopy%s()\n", uft.Name.Name), args)
 | 
				
			||||||
			sw.Do("}\n", nil)
 | 
								sw.Do("}\n", nil)
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			glog.Fatalf("Hit an unsupported type %v.", uft)
 | 
								klog.Fatalf("Hit an unsupported type %v.", uft)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -900,6 +900,6 @@ func (g *genDeepCopy) doPointer(t *types.Type, sw *generator.SnippetWriter) {
 | 
				
			|||||||
		sw.Do("*out = new($.Elem|raw$)\n", ut)
 | 
							sw.Do("*out = new($.Elem|raw$)\n", ut)
 | 
				
			||||||
		sw.Do("(*in).DeepCopyInto(*out)\n", nil)
 | 
							sw.Do("(*in).DeepCopyInto(*out)\n", nil)
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		glog.Fatalf("Hit an unsupported type %v.", uet)
 | 
							klog.Fatalf("Hit an unsupported type %v.", uet)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/k8s.io/gengo/examples/defaulter-gen/generators/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/k8s.io/gengo/examples/defaulter-gen/generators/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -7,11 +7,11 @@ go_library(
 | 
				
			|||||||
    importpath = "k8s.io/gengo/examples/defaulter-gen/generators",
 | 
					    importpath = "k8s.io/gengo/examples/defaulter-gen/generators",
 | 
				
			||||||
    visibility = ["//visibility:public"],
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/k8s.io/gengo/args:go_default_library",
 | 
					        "//vendor/k8s.io/gengo/args:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/gengo/generator:go_default_library",
 | 
					        "//vendor/k8s.io/gengo/generator:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/gengo/namer:go_default_library",
 | 
					        "//vendor/k8s.io/gengo/namer:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/gengo/types:go_default_library",
 | 
					        "//vendor/k8s.io/gengo/types:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										38
									
								
								vendor/k8s.io/gengo/examples/defaulter-gen/generators/defaulter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										38
									
								
								vendor/k8s.io/gengo/examples/defaulter-gen/generators/defaulter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -29,7 +29,7 @@ import (
 | 
				
			|||||||
	"k8s.io/gengo/namer"
 | 
						"k8s.io/gengo/namer"
 | 
				
			||||||
	"k8s.io/gengo/types"
 | 
						"k8s.io/gengo/types"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
						"k8s.io/klog"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CustomArgs is used tby the go2idl framework to pass args specific to this
 | 
					// CustomArgs is used tby the go2idl framework to pass args specific to this
 | 
				
			||||||
@@ -117,11 +117,11 @@ func getManualDefaultingFunctions(context *generator.Context, pkg *types.Package
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	for _, f := range pkg.Functions {
 | 
						for _, f := range pkg.Functions {
 | 
				
			||||||
		if f.Underlying == nil || f.Underlying.Kind != types.Func {
 | 
							if f.Underlying == nil || f.Underlying.Kind != types.Func {
 | 
				
			||||||
			glog.Errorf("Malformed function: %#v", f)
 | 
								klog.Errorf("Malformed function: %#v", f)
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if f.Underlying.Signature == nil {
 | 
							if f.Underlying.Signature == nil {
 | 
				
			||||||
			glog.Errorf("Function without signature: %#v", f)
 | 
								klog.Errorf("Function without signature: %#v", f)
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		signature := f.Underlying.Signature
 | 
							signature := f.Underlying.Signature
 | 
				
			||||||
@@ -156,7 +156,7 @@ func getManualDefaultingFunctions(context *generator.Context, pkg *types.Package
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
			v.base = f
 | 
								v.base = f
 | 
				
			||||||
			manualMap[key] = v
 | 
								manualMap[key] = v
 | 
				
			||||||
			glog.V(6).Infof("found base defaulter function for %s from %s", key.Name, f.Name)
 | 
								klog.V(6).Infof("found base defaulter function for %s from %s", key.Name, f.Name)
 | 
				
			||||||
		// Is one of the additional defaulters - a top level defaulter on a type that is
 | 
							// Is one of the additional defaulters - a top level defaulter on a type that is
 | 
				
			||||||
		// also invoked.
 | 
							// also invoked.
 | 
				
			||||||
		case strings.HasPrefix(f.Name.Name, buffer.String()+"_"):
 | 
							case strings.HasPrefix(f.Name.Name, buffer.String()+"_"):
 | 
				
			||||||
@@ -176,7 +176,7 @@ func getManualDefaultingFunctions(context *generator.Context, pkg *types.Package
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
			v.additional = append(v.additional, f)
 | 
								v.additional = append(v.additional, f)
 | 
				
			||||||
			manualMap[key] = v
 | 
								manualMap[key] = v
 | 
				
			||||||
			glog.V(6).Infof("found additional defaulter function for %s from %s", key.Name, f.Name)
 | 
								klog.V(6).Infof("found additional defaulter function for %s from %s", key.Name, f.Name)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		buffer.Reset()
 | 
							buffer.Reset()
 | 
				
			||||||
		sw.Do("$.inType|objectdefaultfn$", args)
 | 
							sw.Do("$.inType|objectdefaultfn$", args)
 | 
				
			||||||
@@ -189,7 +189,7 @@ func getManualDefaultingFunctions(context *generator.Context, pkg *types.Package
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
			v.object = f
 | 
								v.object = f
 | 
				
			||||||
			manualMap[key] = v
 | 
								manualMap[key] = v
 | 
				
			||||||
			glog.V(6).Infof("found object defaulter function for %s from %s", key.Name, f.Name)
 | 
								klog.V(6).Infof("found object defaulter function for %s from %s", key.Name, f.Name)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		buffer.Reset()
 | 
							buffer.Reset()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -198,7 +198,7 @@ func getManualDefaultingFunctions(context *generator.Context, pkg *types.Package
 | 
				
			|||||||
func Packages(context *generator.Context, arguments *args.GeneratorArgs) generator.Packages {
 | 
					func Packages(context *generator.Context, arguments *args.GeneratorArgs) generator.Packages {
 | 
				
			||||||
	boilerplate, err := arguments.LoadGoBoilerplate()
 | 
						boilerplate, err := arguments.LoadGoBoilerplate()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.Fatalf("Failed loading boilerplate: %v", err)
 | 
							klog.Fatalf("Failed loading boilerplate: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	packages := generator.Packages{}
 | 
						packages := generator.Packages{}
 | 
				
			||||||
@@ -214,7 +214,7 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
 | 
				
			|||||||
	// We are generating defaults only for packages that are explicitly
 | 
						// We are generating defaults only for packages that are explicitly
 | 
				
			||||||
	// passed as InputDir.
 | 
						// passed as InputDir.
 | 
				
			||||||
	for _, i := range context.Inputs {
 | 
						for _, i := range context.Inputs {
 | 
				
			||||||
		glog.V(5).Infof("considering pkg %q", i)
 | 
							klog.V(5).Infof("considering pkg %q", i)
 | 
				
			||||||
		pkg := context.Universe[i]
 | 
							pkg := context.Universe[i]
 | 
				
			||||||
		if pkg == nil {
 | 
							if pkg == nil {
 | 
				
			||||||
			// If the input had no Go files, for example.
 | 
								// If the input had no Go files, for example.
 | 
				
			||||||
@@ -248,7 +248,7 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
 | 
				
			|||||||
		shouldCreateObjectDefaulterFn := func(t *types.Type) bool {
 | 
							shouldCreateObjectDefaulterFn := func(t *types.Type) bool {
 | 
				
			||||||
			if defaults, ok := existingDefaulters[t]; ok && defaults.object != nil {
 | 
								if defaults, ok := existingDefaulters[t]; ok && defaults.object != nil {
 | 
				
			||||||
				// A default generator is defined
 | 
									// A default generator is defined
 | 
				
			||||||
				glog.V(5).Infof("  an object defaulter already exists as %s", defaults.base.Name)
 | 
									klog.V(5).Infof("  an object defaulter already exists as %s", defaults.base.Name)
 | 
				
			||||||
				return false
 | 
									return false
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			// opt-out
 | 
								// opt-out
 | 
				
			||||||
@@ -285,7 +285,7 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
 | 
				
			|||||||
			var err error
 | 
								var err error
 | 
				
			||||||
			typesPkg, err = context.AddDirectory(filepath.Join(pkg.Path, inputTags[0]))
 | 
								typesPkg, err = context.AddDirectory(filepath.Join(pkg.Path, inputTags[0]))
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				glog.Fatalf("cannot import package %s", inputTags[0])
 | 
									klog.Fatalf("cannot import package %s", inputTags[0])
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			// update context.Order to the latest context.Universe
 | 
								// update context.Order to the latest context.Universe
 | 
				
			||||||
			orderer := namer.Orderer{Namer: namer.NewPublicNamer(1)}
 | 
								orderer := namer.Orderer{Namer: namer.NewPublicNamer(1)}
 | 
				
			||||||
@@ -299,7 +299,7 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
			if namer.IsPrivateGoName(t.Name.Name) {
 | 
								if namer.IsPrivateGoName(t.Name.Name) {
 | 
				
			||||||
				// We won't be able to convert to a private type.
 | 
									// We won't be able to convert to a private type.
 | 
				
			||||||
				glog.V(5).Infof("  found a type %v, but it is a private name", t)
 | 
									klog.V(5).Infof("  found a type %v, but it is a private name", t)
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -338,7 +338,7 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
 | 
				
			|||||||
			// prune any types that were not used
 | 
								// prune any types that were not used
 | 
				
			||||||
			for t, d := range newDefaulters {
 | 
								for t, d := range newDefaulters {
 | 
				
			||||||
				if d.object == nil {
 | 
									if d.object == nil {
 | 
				
			||||||
					glog.V(6).Infof("did not generate defaulter for %s because no child defaulters were registered", t.Name)
 | 
										klog.V(6).Infof("did not generate defaulter for %s because no child defaulters were registered", t.Name)
 | 
				
			||||||
					delete(newDefaulters, t)
 | 
										delete(newDefaulters, t)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -346,7 +346,7 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if len(newDefaulters) == 0 {
 | 
							if len(newDefaulters) == 0 {
 | 
				
			||||||
			glog.V(5).Infof("no defaulters in package %s", pkg.Name)
 | 
								klog.V(5).Infof("no defaulters in package %s", pkg.Name)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		path := pkg.Path
 | 
							path := pkg.Path
 | 
				
			||||||
@@ -421,7 +421,7 @@ func (c *callTreeForType) build(t *types.Type, root bool) *callNode {
 | 
				
			|||||||
		parent.call = append(parent.call, newDefaults.object)
 | 
							parent.call = append(parent.call, newDefaults.object)
 | 
				
			||||||
		// if we will be generating the defaulter, it by definition is a covering
 | 
							// if we will be generating the defaulter, it by definition is a covering
 | 
				
			||||||
		// defaulter, so we halt recursion
 | 
							// defaulter, so we halt recursion
 | 
				
			||||||
		glog.V(6).Infof("the defaulter %s will be generated as an object defaulter", t.Name)
 | 
							klog.V(6).Infof("the defaulter %s will be generated as an object defaulter", t.Name)
 | 
				
			||||||
		return parent
 | 
							return parent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case defaults.object != nil:
 | 
						case defaults.object != nil:
 | 
				
			||||||
@@ -434,7 +434,7 @@ func (c *callTreeForType) build(t *types.Type, root bool) *callNode {
 | 
				
			|||||||
		// if the base function indicates it "covers" (it already includes defaulters)
 | 
							// if the base function indicates it "covers" (it already includes defaulters)
 | 
				
			||||||
		// we can halt recursion
 | 
							// we can halt recursion
 | 
				
			||||||
		if checkTag(defaults.base.CommentLines, "covers") {
 | 
							if checkTag(defaults.base.CommentLines, "covers") {
 | 
				
			||||||
			glog.V(6).Infof("the defaulter %s indicates it covers all sub generators", t.Name)
 | 
								klog.V(6).Infof("the defaulter %s indicates it covers all sub generators", t.Name)
 | 
				
			||||||
			return parent
 | 
								return parent
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -496,7 +496,7 @@ func (c *callTreeForType) build(t *types.Type, root bool) *callNode {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if len(parent.children) == 0 && len(parent.call) == 0 {
 | 
						if len(parent.children) == 0 && len(parent.call) == 0 {
 | 
				
			||||||
		//glog.V(6).Infof("decided type %s needs no generation", t.Name)
 | 
							//klog.V(6).Infof("decided type %s needs no generation", t.Name)
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return parent
 | 
						return parent
 | 
				
			||||||
@@ -596,11 +596,11 @@ func (g *genDefaulter) GenerateType(c *generator.Context, t *types.Type, w io.Wr
 | 
				
			|||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	glog.V(5).Infof("generating for type %v", t)
 | 
						klog.V(5).Infof("generating for type %v", t)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	callTree := newCallTreeForType(g.existingDefaulters, g.newDefaulters).build(t, true)
 | 
						callTree := newCallTreeForType(g.existingDefaulters, g.newDefaulters).build(t, true)
 | 
				
			||||||
	if callTree == nil {
 | 
						if callTree == nil {
 | 
				
			||||||
		glog.V(5).Infof("  no defaulters defined")
 | 
							klog.V(5).Infof("  no defaulters defined")
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	i := 0
 | 
						i := 0
 | 
				
			||||||
@@ -609,7 +609,7 @@ func (g *genDefaulter) GenerateType(c *generator.Context, t *types.Type, w io.Wr
 | 
				
			|||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		path := callPath(append(ancestors, current))
 | 
							path := callPath(append(ancestors, current))
 | 
				
			||||||
		glog.V(5).Infof("  %d: %s", i, path)
 | 
							klog.V(5).Infof("  %d: %s", i, path)
 | 
				
			||||||
		i++
 | 
							i++
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/k8s.io/gengo/examples/import-boss/generators/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/k8s.io/gengo/examples/import-boss/generators/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -7,11 +7,11 @@ go_library(
 | 
				
			|||||||
    importpath = "k8s.io/gengo/examples/import-boss/generators",
 | 
					    importpath = "k8s.io/gengo/examples/import-boss/generators",
 | 
				
			||||||
    visibility = ["//visibility:public"],
 | 
					    visibility = ["//visibility:public"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					 | 
				
			||||||
        "//vendor/k8s.io/gengo/args:go_default_library",
 | 
					        "//vendor/k8s.io/gengo/args:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/gengo/generator:go_default_library",
 | 
					        "//vendor/k8s.io/gengo/generator:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/gengo/namer:go_default_library",
 | 
					        "//vendor/k8s.io/gengo/namer:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/gengo/types:go_default_library",
 | 
					        "//vendor/k8s.io/gengo/types:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/klog:go_default_library",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user