-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhost_stats.py
More file actions
170 lines (143 loc) · 5.99 KB
/
host_stats.py
File metadata and controls
170 lines (143 loc) · 5.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#!/usr/bin/env python
#Script usage:
##python2.7 host_stats.py –s 10.100.100.12 –o 443 –u root –p Lab@2019#$
import pyVmomi
import argparse
import atexit
import itertools
from pyVmomi import vim, vmodl
from pyVim.connect import SmartConnectNoSSL, Disconnect
import humanize
MBFACTOR = float(1 << 20)
printVM = False
printDatastore = True
printHost = True
def dump(obj):
for attr in dir(obj):
print("obj.%s = %s" % (attr, getattr(obj, attr)))
def GetArgs():
parser = argparse.ArgumentParser(
description='Process args for retrieving all the Virtual Machines')
parser.add_argument('-s', '--host', required=True, action='store',
help='Remote host to connect to')
parser.add_argument('-o', '--port', type=int, default=443, action='store',
help='Port to connect on')
parser.add_argument('-u', '--user', required=True, action='store',
help='User name to use when connecting to host')
parser.add_argument('-p', '--password', required=False, action='store',
help='Password to use when connecting to host')
args = parser.parse_args()
return args
def printHostInformation(host):
try:
summary = host.summary
stats = summary.quickStats
hardware = host.hardware
cpuUsage = stats.overallCpuUsage
memoryCapacity = hardware.memorySize
memoryCapacityInMB = hardware.memorySize/MBFACTOR
memoryUsage = stats.overallMemoryUsage
freeMemoryPercentage = 100 - (
(float(memoryUsage) / memoryCapacityInMB) * 100
)
print("--------------------------------------------------")
print("Host name: ", host.name)
# dump(host)
print("Host CPU usage: ", cpuUsage)
print("Host memory capacity: ", humanize.naturalsize(memoryCapacity,
binary=True))
print("Host memory usage: ", memoryUsage / 1024, "GiB")
print("Free memory percentage: " + str(freeMemoryPercentage) + "%")
print("--------------------------------------------------")
except Exception as error:
print("Unable to access information for host: ", host.name)
print(error)
pass
def printComputeResourceInformation(computeResource):
try:
hostList = computeResource.host
print("##################################################")
print("Compute resource name: ", computeResource.name)
print("##################################################")
for host in hostList:
printHostInformation(host)
except Exception as error:
print("Unable to access information for compute resource: ",
computeResource.name)
print(error)
pass
def printDatastoreInformation(datastore):
try:
summary = datastore.summary
capacity = summary.capacity
freeSpace = summary.freeSpace
uncommittedSpace = summary.uncommitted
freeSpacePercentage = (float(freeSpace) / capacity) * 100
print("##################################################")
print("Datastore name: ", summary.name)
print("Capacity: ", humanize.naturalsize(capacity, binary=True))
if uncommittedSpace is not None:
provisionedSpace = (capacity - freeSpace) + uncommittedSpace
print("Provisioned space: ", humanize.naturalsize(provisionedSpace,
binary=True))
print("Free space: ", humanize.naturalsize(freeSpace, binary=True))
print("Free space percentage: " + str(freeSpacePercentage) + "%")
print("##################################################")
except Exception as error:
print("Unable to access summary for datastore: ", datastore.name)
print(error)
pass
def printVmInformation(virtual_machine, depth=1):
maxdepth = 10
if hasattr(virtual_machine, 'childEntity'):
if depth > maxdepth:
return
vmList = virtual_machine.childEntity
for c in vmList:
printVmInformation(c, depth + 1)
return
try:
summary = virtual_machine.summary
print("##################################################")
print("Name : ", summary.name)
print("MoRef : ", summary.vm)
print("State : ", summary.runtime.powerState)
print("##################################################")
except Exception as error:
print("Unable to access summary for VM: ", virtual_machine.name)
print(error)
pass
def main():
args = GetArgs()
# try:
si = SmartConnectNoSSL(host=args.host, user=args.user,
pwd=args.password, port=int(args.port))
atexit.register(Disconnect, si)
content = si.RetrieveContent()
for datacenter in content.rootFolder.childEntity:
print("##################################################")
print("##################################################")
print("### datacenter : " + datacenter.name)
print("##################################################")
if printVM:
if hasattr(datacenter.vmFolder, 'childEntity'):
vmFolder = datacenter.vmFolder
vmList = vmFolder.childEntity
for vm in vmList:
printVmInformation(vm)
if printDatastore:
datastores = datacenter.datastore
for ds in datastores:
printDatastoreInformation(ds)
if printHost:
if hasattr(datacenter.hostFolder, 'childEntity'):
hostFolder = datacenter.hostFolder
computeResourceList = hostFolder.childEntity
for computeResource in computeResourceList:
printComputeResourceInformation(computeResource)
# except Exception as error:
# print("Caught vmodl fault : " + error.msg)
# return -1
return 0
if __name__ == "__main__":
main()