fb-vmware 1.7.1__py3-none-any.whl → 1.8.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. fb_vmware/__init__.py +1 -1
  2. fb_vmware/app/__init__.py +285 -6
  3. fb_vmware/app/get_host_list.py +115 -100
  4. fb_vmware/app/get_network_list.py +176 -218
  5. fb_vmware/app/get_rpool_list.py +386 -0
  6. fb_vmware/app/get_storage_cluster_info.py +303 -0
  7. fb_vmware/app/get_storage_cluster_list.py +100 -107
  8. fb_vmware/app/get_storage_list.py +145 -112
  9. fb_vmware/app/get_vm_info.py +79 -17
  10. fb_vmware/app/get_vm_list.py +169 -95
  11. fb_vmware/app/search_storage.py +470 -0
  12. fb_vmware/argparse_actions.py +78 -0
  13. fb_vmware/base.py +28 -1
  14. fb_vmware/cluster.py +99 -7
  15. fb_vmware/connect.py +450 -20
  16. fb_vmware/datastore.py +195 -6
  17. fb_vmware/dc.py +19 -1
  18. fb_vmware/ds_cluster.py +215 -2
  19. fb_vmware/dvs.py +37 -1
  20. fb_vmware/errors.py +31 -10
  21. fb_vmware/host.py +40 -2
  22. fb_vmware/host_port_group.py +1 -2
  23. fb_vmware/network.py +17 -1
  24. fb_vmware/obj.py +30 -1
  25. fb_vmware/vm.py +19 -1
  26. fb_vmware/xlate.py +8 -13
  27. fb_vmware-1.8.1.data/data/share/locale/de/LC_MESSAGES/fb_vmware.mo +0 -0
  28. fb_vmware-1.8.1.data/data/share/locale/en/LC_MESSAGES/fb_vmware.mo +0 -0
  29. {fb_vmware-1.7.1.dist-info → fb_vmware-1.8.1.dist-info}/METADATA +2 -1
  30. fb_vmware-1.8.1.dist-info/RECORD +40 -0
  31. {fb_vmware-1.7.1.dist-info → fb_vmware-1.8.1.dist-info}/entry_points.txt +3 -0
  32. fb_vmware-1.7.1.data/data/share/locale/de_DE/LC_MESSAGES/fb_vmware.mo +0 -0
  33. fb_vmware-1.7.1.data/data/share/locale/en_US/LC_MESSAGES/fb_vmware.mo +0 -0
  34. fb_vmware-1.7.1.dist-info/RECORD +0 -36
  35. {fb_vmware-1.7.1.dist-info → fb_vmware-1.8.1.dist-info}/WHEEL +0 -0
  36. {fb_vmware-1.7.1.dist-info → fb_vmware-1.8.1.dist-info}/licenses/LICENSE +0 -0
fb_vmware/cluster.py CHANGED
@@ -19,12 +19,13 @@ from fb_tools.xlate import format_list
19
19
  from pyVmomi import vim
20
20
 
21
21
  # Own modules
22
+ from .errors import VSphereHandlerError
22
23
  from .errors import VSphereNameError
23
24
  from .obj import DEFAULT_OBJ_STATUS
24
25
  from .obj import VsphereObject
25
26
  from .xlate import XLATOR
26
27
 
27
- __version__ = "1.5.0"
28
+ __version__ = "1.9.2"
28
29
  LOG = logging.getLogger(__name__)
29
30
 
30
31
 
@@ -35,6 +36,8 @@ _ = XLATOR.gettext
35
36
  class VsphereCluster(VsphereObject):
36
37
  """An object for encapsulating a vSphere calculation cluster object."""
37
38
 
39
+ default_resource_pool_name = "Resources"
40
+
38
41
  # -------------------------------------------------------------------------
39
42
  def __init__(
40
43
  self,
@@ -43,9 +46,11 @@ class VsphereCluster(VsphereObject):
43
46
  version=__version__,
44
47
  base_dir=None,
45
48
  initialized=None,
49
+ vsphere=None,
46
50
  dc_name=None,
47
51
  name=None,
48
52
  status=DEFAULT_OBJ_STATUS,
53
+ resource_pool_name=None,
49
54
  cpu_cores=0,
50
55
  cpu_threads=0,
51
56
  config_status=DEFAULT_OBJ_STATUS,
@@ -80,7 +85,9 @@ class VsphereCluster(VsphereObject):
80
85
  self._mem_mb_effective = None
81
86
  self._mem_total = None
82
87
  self._standalone = False
88
+ self._vsphere = None
83
89
  self._dc_name = None
90
+ self._resource_pool_name = self.default_resource_pool_name
84
91
  self.networks = []
85
92
  self.datastores = []
86
93
  self.resource_pool = None
@@ -98,6 +105,8 @@ class VsphereCluster(VsphereObject):
98
105
  )
99
106
 
100
107
  self.dc_name = dc_name
108
+ if vsphere is not None:
109
+ self.vsphere = vsphere
101
110
  self.cpu_cores = cpu_cores
102
111
  self.cpu_threads = cpu_threads
103
112
  self.hosts_effective = hosts_effective
@@ -106,9 +115,31 @@ class VsphereCluster(VsphereObject):
106
115
  self.mem_total = mem_total
107
116
  self.standalone = standalone
108
117
 
118
+ if resource_pool_name is not None and str(resource_pool_name).strip() != "":
119
+ self._resource_pool_name = str(resource_pool_name).strip()
120
+
109
121
  if initialized is not None:
110
122
  self.initialized = initialized
111
123
 
124
+ # -----------------------------------------------------------
125
+ @property
126
+ def vsphere(self):
127
+ """Return the name of the vSphere from configuration of the cluster."""
128
+ return self._vsphere
129
+
130
+ @vsphere.setter
131
+ def vsphere(self, value):
132
+ if value is None:
133
+ self._vsphere = None
134
+ return
135
+
136
+ val = str(value).strip()
137
+ if val == "":
138
+ msg = _("The name of the vSphere may not be empty.")
139
+ raise VSphereHandlerError(msg)
140
+
141
+ self._vsphere = val
142
+
112
143
  # -----------------------------------------------------------
113
144
  @property
114
145
  def dc_name(self):
@@ -128,11 +159,17 @@ class VsphereCluster(VsphereObject):
128
159
 
129
160
  self._dc_name = val
130
161
 
162
+ # -----------------------------------------------------------
163
+ @property
164
+ def base_resource_pool_name(self):
165
+ """Return the base name of the default resource pool of this cluster."""
166
+ return self._resource_pool_name
167
+
131
168
  # -----------------------------------------------------------
132
169
  @property
133
170
  def resource_pool_name(self):
134
171
  """Return the name of the default resource pool of this cluster."""
135
- return self.name + "/Resources"
172
+ return f"{self.name}/{self.base_resource_pool_name}"
136
173
 
137
174
  # -----------------------------------------------------------
138
175
  @property
@@ -264,6 +301,35 @@ class VsphereCluster(VsphereObject):
264
301
  def standalone(self, value):
265
302
  self._standalone = to_bool(value)
266
303
 
304
+ # -----------------------------------------------------------
305
+ def get_pyvmomi_obj(self, service_instance):
306
+ """Return the appropriate PyVMomi object for the current object."""
307
+ obj = None
308
+ if not self.name:
309
+ return None
310
+
311
+ content = service_instance.RetrieveContent()
312
+ container = content.viewManager.CreateContainerView(
313
+ content.rootFolder, vim.ClusterComputeResource, True
314
+ )
315
+ for c in container.view:
316
+ if c.name == self.name:
317
+ obj = c
318
+ break
319
+
320
+ if obj is not None:
321
+ return obj
322
+
323
+ content = service_instance.RetrieveContent()
324
+ container = content.viewManager.CreateContainerView(
325
+ content.rootFolder, vim.ComputeResource, True
326
+ )
327
+ for c in container.view:
328
+ if c.name == self.name:
329
+ obj = c
330
+ break
331
+ return obj
332
+
267
333
  # -------------------------------------------------------------------------
268
334
  def as_dict(self, short=True):
269
335
  """
@@ -277,7 +343,9 @@ class VsphereCluster(VsphereObject):
277
343
  """
278
344
  res = super(VsphereCluster, self).as_dict(short=short)
279
345
 
346
+ res["vsphere"] = self.vsphere
280
347
  res["dc_name"] = self.dc_name
348
+ res["base_resource_pool_name"] = self.base_resource_pool_name
281
349
  res["resource_pool_name"] = self.resource_pool_name
282
350
  res["resource_pool_var"] = self.resource_pool_var
283
351
  res["cpu_cores"] = self.cpu_cores
@@ -310,7 +378,9 @@ class VsphereCluster(VsphereObject):
310
378
  base_dir=self.base_dir,
311
379
  initialized=self.initialized,
312
380
  name=self.name,
381
+ vsphere=self.vsphere,
313
382
  dc_name=self.dc_name,
383
+ resource_pool_name=self.base_resource_pool_name,
314
384
  standalone=self.standalone,
315
385
  status=self.status,
316
386
  cpu_cores=self.cpu_cores,
@@ -330,9 +400,10 @@ class VsphereCluster(VsphereObject):
330
400
  if not isinstance(other, VsphereCluster):
331
401
  return False
332
402
 
403
+ if self.vsphere != other.vsphere:
404
+ return False
333
405
  if self.dc_name != other.dc_name:
334
406
  return False
335
-
336
407
  if self.name != other.name:
337
408
  return False
338
409
 
@@ -341,7 +412,14 @@ class VsphereCluster(VsphereObject):
341
412
  # -------------------------------------------------------------------------
342
413
  @classmethod
343
414
  def from_summary(
344
- cls, data, dc_name=None, appname=None, verbose=0, base_dir=None, test_mode=False
415
+ cls,
416
+ data,
417
+ vsphere=None,
418
+ dc_name=None,
419
+ appname=None,
420
+ verbose=0,
421
+ base_dir=None,
422
+ test_mode=False,
345
423
  ):
346
424
  """Create a new VsphereCluster object based on the appropriate data from pyvomi."""
347
425
  if test_mode:
@@ -358,7 +436,9 @@ class VsphereCluster(VsphereObject):
358
436
  "verbose": verbose,
359
437
  "base_dir": base_dir,
360
438
  "initialized": True,
439
+ "vsphere": vsphere,
361
440
  "dc_name": dc_name,
441
+ "resource_pool_name": cls.default_resource_pool_name,
362
442
  "name": data.name,
363
443
  "status": data.overallStatus,
364
444
  "config_status": data.configStatus,
@@ -368,10 +448,22 @@ class VsphereCluster(VsphereObject):
368
448
  "hosts_total": data.summary.numHosts,
369
449
  "mem_mb_effective": data.summary.effectiveMemory,
370
450
  "mem_total": data.summary.totalMemory,
371
- "standalone": False,
451
+ "standalone": True,
372
452
  }
373
- if isinstance(data, vim.ComputeResource):
374
- params["standalone"] = True
453
+ if isinstance(data, vim.ClusterComputeResource):
454
+ params["standalone"] = False
455
+
456
+ if hasattr(data, "resourcePool"):
457
+ rname = data.resourcePool.summary.name
458
+ if verbose > 0:
459
+ LOG.debug(f"Name of resource pool of {data.name!r}: {rname!r}")
460
+ params["resource_pool_name"] = rname
461
+ else:
462
+ msg = _(
463
+ "Could not access to resource pool of compute resource {cc!r} in vSphere {vs!r}, "
464
+ "datacenter {dc!r}."
465
+ ).format(cc=data.name, vs=vsphere, dc=dc_name)
466
+ LOG.warn(msg)
375
467
 
376
468
  if verbose > 2:
377
469
  LOG.debug(_("Creating {} object from:").format(cls.__name__) + "\n" + pp(params))