1 package org.metricshub.vcenter;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 import com.vmware.vim25.HostServiceTicket;
24 import com.vmware.vim25.InvalidLogin;
25 import com.vmware.vim25.mo.Datacenter;
26 import com.vmware.vim25.mo.Folder;
27 import com.vmware.vim25.mo.HostSystem;
28 import com.vmware.vim25.mo.InventoryNavigator;
29 import com.vmware.vim25.mo.ManagedEntity;
30 import com.vmware.vim25.mo.ServiceInstance;
31 import java.net.InetAddress;
32 import java.net.URL;
33 import java.util.Arrays;
34 import java.util.List;
35 import java.util.function.Consumer;
36 import java.util.function.Supplier;
37 import java.util.stream.Collectors;
38
39
40
41
42 public final class VCenterClient {
43
44 private static final String ENTITY_HOST_SYSTEM = "HostSystem";
45 private static final String ENTITY_DATA_CENTER = "Datacenter";
46
47 private static Supplier<Boolean> isDebugEnabled;
48 private static Consumer<String> debug;
49
50
51
52
53 private VCenterClient() {}
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 public static void setDebug(final Supplier<Boolean> isDebugEnabledMethod, final Consumer<String> debugMethod) {
72 isDebugEnabled = isDebugEnabledMethod;
73 debug = debugMethod;
74 }
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93 public static String requestCertificate(
94 final String vCenterName,
95 final String username,
96 final String password,
97 final String hostname
98 ) throws InvalidLogin, Exception {
99 ServiceInstance serviceInstance = null;
100
101 try {
102
103 URL vCenterURL = new URL("https://" + vCenterName + "/sdk");
104 debug.accept("Connecting to " + vCenterURL.toString() + "...");
105 serviceInstance = new ServiceInstance(vCenterURL, username, password, true);
106
107
108
109 HostSystem hostSystem = getHostSystemManagedEntity(serviceInstance, hostname);
110
111 if (hostSystem == null) {
112 throw new Exception("Unable to find host " + hostname + " in VCenter " + vCenterName);
113 } else {
114 HostServiceTicket ticket = hostSystem.acquireCimServicesTicket();
115 return ticket.getSessionId();
116 }
117 } finally {
118 if (serviceInstance != null) {
119 serviceInstance.getServerConnection().logout();
120 }
121 }
122 }
123
124
125
126
127
128
129
130
131 private static HostSystem getHostSystemManagedEntity(final ServiceInstance serviceInstance, final String systemName)
132 throws Exception {
133
134 String entityName;
135 String shortEntityName;
136 ManagedEntity[] managedEntities;
137
138
139 Folder rootFolder = serviceInstance.getRootFolder();
140 if (rootFolder == null) {
141 throw new Exception("Couldn't get the root folder");
142 }
143
144
145
146 InventoryNavigator inventoryNavigator = new InventoryNavigator(rootFolder);
147 managedEntities = inventoryNavigator.searchManagedEntities(ENTITY_HOST_SYSTEM);
148 if (managedEntities != null) {
149
150 for (ManagedEntity managedEntity : managedEntities) {
151 entityName = managedEntity.getName();
152 if (systemName.equalsIgnoreCase(entityName)) {
153
154 return (HostSystem) managedEntity;
155 }
156 }
157
158
159 if (systemName.indexOf('.') == -1) {
160
161 for (ManagedEntity managedEntity : managedEntities) {
162 entityName = managedEntity.getName();
163 int dotIndex = entityName.indexOf('.');
164 if (dotIndex > 1) {
165 shortEntityName = entityName.substring(0, dotIndex);
166 if (systemName.equalsIgnoreCase(shortEntityName)) {
167
168 return (HostSystem) managedEntity;
169 }
170 }
171 }
172 }
173
174
175 if (isDebugEnabled.get()) {
176 String managedEntitiesString = "";
177 for (ManagedEntity managedEntity : managedEntities) {
178 managedEntitiesString = managedEntitiesString + " - " + managedEntity.getName() + "\n";
179 }
180 StringBuilder entityList = new StringBuilder();
181 for (ManagedEntity managedEntity : managedEntities) {
182 entityList.append(" - ").append(managedEntity.getName()).append("\n");
183 }
184 debug.accept(
185 "VCenterClient: Couldn't find host " +
186 systemName +
187 " in the list of managed entities in VCenter " +
188 serviceInstance.getServerConnection().getUrl().getHost() +
189 ":\n" +
190 entityList
191 );
192 debug.accept("VCenterClient: Will now try with the IP address of " + systemName);
193 }
194 }
195
196
197 managedEntities = inventoryNavigator.searchManagedEntities(ENTITY_DATA_CENTER);
198 if (null == managedEntities || managedEntities.length == 0) {
199 throw new Exception("No Datacenter-type managed entity");
200 }
201
202
203 InetAddress[] hostIPaddresses;
204 try {
205 hostIPaddresses = InetAddress.getAllByName(systemName);
206 } catch (Exception e) {
207 throw new Exception("Couldn't resolve " + systemName + " into a valid IP address");
208 }
209
210
211 for (ManagedEntity datacenterEntity : managedEntities) {
212
213 for (InetAddress hostIPaddress : hostIPaddresses) {
214
215 ManagedEntity[] managedEntitiesInDatacenter = serviceInstance
216 .getSearchIndex()
217 .findAllByIp((Datacenter) datacenterEntity, hostIPaddress.getHostAddress(), false);
218
219
220 if (managedEntitiesInDatacenter != null && managedEntitiesInDatacenter.length != 0) {
221 return (HostSystem) managedEntitiesInDatacenter[0];
222 }
223 }
224 }
225
226 return null;
227 }
228
229
230
231
232
233
234
235
236
237
238 public static List<String> getAllHostSystemManagedEntities(
239 final String vCenterName,
240 final String username,
241 final String password
242 ) throws Exception {
243 ServiceInstance serviceInstance = null;
244
245 try {
246
247 URL vCenterURL = new URL("https://" + vCenterName + "/sdk");
248 debug.accept("Connecting to " + vCenterURL.toString() + "...");
249 serviceInstance = new ServiceInstance(vCenterURL, username, password, true);
250
251
252 Folder rootFolder = serviceInstance.getRootFolder();
253 if (rootFolder == null) {
254 throw new Exception("Couldn't get the root folder");
255 }
256
257
258 InventoryNavigator inventoryNavigator = new InventoryNavigator(rootFolder);
259
260
261 return Arrays
262 .stream(inventoryNavigator.searchManagedEntities(ENTITY_HOST_SYSTEM))
263 .map(ManagedEntity::getName)
264 .collect(Collectors.toList());
265 } finally {
266 if (serviceInstance != null) {
267 serviceInstance.getServerConnection().logout();
268 }
269 }
270 }
271 }