From f66525d589445510ac69c5ea2d138279ff7dcb49 Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Fri, 12 Jul 2024 19:04:03 +0200
Subject: [PATCH] update project

---
 README.md                                     |   2 +-
 mkp/vsphere_topo-0.0.4-20240712.mkp           | Bin 0 -> 7262 bytes
 .../vsphere_topo/agent_based/packages.py      | 147 +++++++++---------
 .../vsphere_topo/lib/utils.py                 |   4 +-
 .../vsphere_topo/rulesets/packages.py         |   7 +-
 source/packages/vsphere_topo                  |   2 +-
 6 files changed, 80 insertions(+), 82 deletions(-)
 create mode 100644 mkp/vsphere_topo-0.0.4-20240712.mkp

diff --git a/README.md b/README.md
index 53f352c..6a57f29 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-[PACKAGE]: ../../raw/master/mkp/vsphere_topo-0.0.3-20240711.mkp "vsphere_topo-0.0.3-20240711.mkp"
+[PACKAGE]: ../../raw/master/mkp/vsphere_topo-0.0.4-20240712.mkp "vsphere_topo-0.0.4-20240712.mkp"
 # vSphere Topology Visualization
 
 This plugin uses the data from the _VMware ESX via vSphere_ spezial agent to create a topolofy of the vSphere environment.
diff --git a/mkp/vsphere_topo-0.0.4-20240712.mkp b/mkp/vsphere_topo-0.0.4-20240712.mkp
new file mode 100644
index 0000000000000000000000000000000000000000..8dbbc8f77a28d3d96f7fc565767ea841b18b7207
GIT binary patch
literal 7262
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
R=#%n7yJ~PkhBShN^gmXi1x^3}

literal 0
HcmV?d00001

diff --git a/source/cmk_addons_plugins/vsphere_topo/agent_based/packages.py b/source/cmk_addons_plugins/vsphere_topo/agent_based/packages.py
index 8c70ca9..63fc3de 100644
--- a/source/cmk_addons_plugins/vsphere_topo/agent_based/packages.py
+++ b/source/cmk_addons_plugins/vsphere_topo/agent_based/packages.py
@@ -14,6 +14,7 @@
 #             -> obsoletes 'Add dummy topologies'
 #             added vCenter twice (once as vCenter once as vM) with different object IDs
 #             -> obsoletes 'Don\'t add vCenter as VM'
+# 2024-07-12: added support for Queried host is a host system
 
 from collections.abc import Mapping, Sequence
 from pathlib import Path
@@ -124,86 +125,86 @@ def check_vsphere_topo(
     objects = {}
     connections = []
 
-    raw_vsphere_host: str = host_name().strip()
-    add_host(
-        host=raw_vsphere_host,
-        obj_id_prefix='vc',
-        # icon='icon_topic_hosts',
-        icon=get_emblem(ICON_VCENTER, params.get(PARAM_VCENTER)),
-    )
-    vsphere_host = f'vc{raw_vsphere_host}'
-
-    __clusters = {
-        'HA': {
-            'datacenter': 'datacenter-21',
-            'hostsystems': 'esxi01, esxi02',
-            'vms': 'vmname01, vmname02, vmname03'
+    if section_esx_vsphere_clusters is not None:
+        __clusters = {
+            'HA': {
+                'datacenter': 'datacenter-21',
+                'hostsystems': 'esxi01, esxi02',
+                'vms': 'vmname01, vmname02, vmname03'
+            }
         }
-    }
 
-    if section_esx_vsphere_clusters is None:
-        yield Result(
-            state=State.UNKNOWN,
-            summary='Found no vSphere data centers/clusters. This service needs the "VMware ESX via vSphere" '
-                    'option "Type of query" set to "Queried host is vCenter"'
+        raw_vsphere_host: str = host_name().strip()
+        add_host(
+            host=raw_vsphere_host,
+            obj_id_prefix='vc',
+            icon=get_emblem(ICON_VCENTER, params.get(PARAM_VCENTER)),
         )
-        return
-
-    for cluster in section_esx_vsphere_clusters:
-        data_center: str = section_esx_vsphere_clusters[cluster]['datacenter'].strip()
-        if objects.get(data_center) is None:
+        vsphere_host = f'vc{raw_vsphere_host}'
+
+        for cluster in section_esx_vsphere_clusters:
+            data_center: str = section_esx_vsphere_clusters[cluster]['datacenter'].strip()
+            if objects.get(data_center) is None:
+                add_host(
+                    host=data_center,
+                    emblem=get_emblem(EMBLEM_DATA_CENTER, params.get(PARAM_DATA_CENTER)),
+                    link2core=False,
+                )
+                add_connection(data_center, vsphere_host)
             add_host(
-                host=data_center,
-                emblem=get_emblem(EMBLEM_DATA_CENTER, params.get(PARAM_DATA_CENTER)),
-                link2core=False,
+                host=cluster,
+                emblem=get_emblem(EMBLEM_CLUSTER, params.get(PARAM_CLUSTER)),
+                link2core=False
             )
-            add_connection(data_center, vsphere_host)
-        add_host(
-            host=cluster,
-            emblem=get_emblem(EMBLEM_CLUSTER, params.get(PARAM_CLUSTER)),
-            link2core=False
+            add_connection(cluster, data_center)
+
+            host_systems: Sequence[str] = section_esx_vsphere_clusters[cluster].get('hostsystems', '').split(',')
+            for host_system in host_systems:
+                esx_name: str = adjust_name(host_system, params.get(PARAM_HOST_SYSTEMS, {}))
+                add_host(host=esx_name)
+                add_connection(cluster, esx_name)
+        yield Result(
+            state=State.OK,
+            notice='VMware ESX via vSphere agent type of query: Queried host is the vCenter'
+        )
+    else:  # assuming the query type is ESXi host
+        raw_vsphere_host: str = host_name().strip()
+        add_host(host=raw_vsphere_host)
+        vsphere_host = raw_vsphere_host
+        yield Result(
+            state=State.OK,
+            notice='VMware ESX via vSphere agent type of query: Queried host is a host system'
         )
-        add_connection(cluster, data_center)
-
-        host_systems: Sequence[str] = section_esx_vsphere_clusters[cluster].get('hostsystems', '').split(',')
-        for host_system in host_systems:
-            esx_name: str = adjust_name(host_system, params.get(PARAM_HOST_SYSTEMS, {}))
-            add_host(host=esx_name)
-            add_connection(cluster, esx_name)
-
-    __VMs = [
-        {
-            'vm_name': 'vmname01',
-            'hostsystem': 'esxi01',
-            'powerstate': 'poweredOff',
-            'guest_os': 'Microsoft Windows Server 2008 R2 (64-bit)',
-            'compatibility': 'vmx-10',
-            'uuid': '420354bd-bee0-88d5-053c-d4f424106b0f'
-        },
-        {
-            'vm_name': 'vmname02',
-            'hostsystem': 'esxi02',
-            'powerstate': 'poweredOn',
-            'guest_os': 'Microsoft Windows Server 2019 (64-bit)',
-            'compatibility': 'vmx-19',
-            'uuid': '422eba9f-0327-2da0-b546-f5a5e5dfdb68'
-        },
-        {
-            'vm_name': 'vmname03',
-            'hostsystem': 'esxi01',
-            'powerstate': 'poweredOn',
-            'guest_os': 'Other 3.x or later Linux (64-bit)',
-            'compatibility': 'vmx-11',
-            'uuid': '422e3863-b7de-dc55-74f8-6dc9c159b36d'
-        }
-    ]
 
     if section_esx_vsphere_virtual_machines is not None:
+        __VMs = [
+            {
+                'vm_name': 'vmname01',
+                'hostsystem': 'esxi01',
+                'powerstate': 'poweredOff',
+                'guest_os': 'Microsoft Windows Server 2008 R2 (64-bit)',
+                'compatibility': 'vmx-10',
+                'uuid': '420354bd-bee0-88d5-053c-d4f424106b0f'
+            },
+            {
+                'vm_name': 'vmname02',
+                'hostsystem': 'esxi02',
+                'powerstate': 'poweredOn',
+                'guest_os': 'Microsoft Windows Server 2019 (64-bit)',
+                'compatibility': 'vmx-19',
+                'uuid': '422eba9f-0327-2da0-b546-f5a5e5dfdb68'
+            },
+            {
+                'vm_name': 'vmname03',
+                'hostsystem': 'esxi01',
+                'powerstate': 'poweredOn',
+                'guest_os': 'Other 3.x or later Linux (64-bit)',
+                'compatibility': 'vmx-11',
+                'uuid': '422e3863-b7de-dc55-74f8-6dc9c159b36d'
+            }
+        ]
         for vm in section_esx_vsphere_virtual_machines:
             vm_name: str = adjust_name(vm['vm_name'], params.get(PARAM_VM_NAMES, {}))
-
-            # if params.get(PARAM_DONT_ADD_VC_AS_VM) is True and vm_name.lower() == vsphere_host.lower():
-            #     continue
             host_system: str = adjust_name(vm['hostsystem'], params.get(PARAM_HOST_SYSTEMS, {}))
             add_host(host=vm_name)
             add_connection(vm_name, host_system)
@@ -256,8 +257,6 @@ def check_vsphere_topo(
     if (vm_to_data_stores := ls_connection.query(query=query)) is not None:
         for vm, data_stores in vm_to_data_stores:
             vm_name: str = adjust_name(vm, params.get(PARAM_VM_NAMES, {}))
-            # if params.get(PARAM_DONT_ADD_VC_AS_VM) is True and vm_name.lower() == vsphere_host.lower():
-            #     continue
             if vm_name in objects:
                 data_stores = data_stores.split(',')
                 for data_store in data_stores:
@@ -274,7 +273,6 @@ def check_vsphere_topo(
         'version': 1,
         'name': 'vSphere',
         'objects': dict(sorted(objects.items())),
-        # 'objects': objects,
         'connections': connections,
     }
 
@@ -282,7 +280,7 @@ def check_vsphere_topo(
 
     # workaround for backend is only picking up topologies from default folder
     path: str = f'{OMD_ROOT}/var/check_mk/topology/data/default'
-    if Path(path).exists():
+    if Path(path).exists() and not Path(f'{path}/data_vsphere.json').exists():  # don't overwrite existing topology
         dummy_topology = {'version': 1, 'name': 'vSphere', 'objects': {}, 'connections': []}
         save_data_to_file(
             data=dummy_topology,
@@ -294,6 +292,7 @@ def check_vsphere_topo(
     for topology in get_topologies():
         data_sets.append({'version': 1, 'name': topology, 'objects': {}, 'connections': []})
     # end workaround
+
     data_sets.append(data_set_vsphere)
 
     path: str = f'{OMD_ROOT}/var/check_mk/topology/data/{raw_vsphere_host}'
diff --git a/source/cmk_addons_plugins/vsphere_topo/lib/utils.py b/source/cmk_addons_plugins/vsphere_topo/lib/utils.py
index 2e8ca1d..c377dca 100644
--- a/source/cmk_addons_plugins/vsphere_topo/lib/utils.py
+++ b/source/cmk_addons_plugins/vsphere_topo/lib/utils.py
@@ -39,8 +39,8 @@ PARAM_NO_CHANGE: Final[str] = 'no_change'
 PARAM_NO_EMBLEM: Final[str] = 'no_emblem'
 PARAM_PREFIX: Final[str] = 'prefix'
 PARAM_UPPER: Final[str] = 'upper'
-PARAM_VM_NAMES: Final[str] = 'vm_names'
 PARAM_VCENTER: Final[str] = 'vcenter_icon'
+PARAM_VM_NAMES: Final[str] = 'vm_names'
 
 PICTURE_TYPE_EMBLEM: Final[str] = 'emblem'
 PICTURE_TYPE_ICON: Final[str] = 'icon'
@@ -127,10 +127,10 @@ def get_topologies() -> Sequence[str | None]:
         json_loads(Path(file).read_text()).get('name') is not None
     ]
 
+
 #
 #  live status
 #
-
 class LiveStatusConnection(object):
     def __init__(self):
         self.sites: SiteConfigurations = SiteConfigurations({})
diff --git a/source/cmk_addons_plugins/vsphere_topo/rulesets/packages.py b/source/cmk_addons_plugins/vsphere_topo/rulesets/packages.py
index bcbb4e5..974e6e0 100644
--- a/source/cmk_addons_plugins/vsphere_topo/rulesets/packages.py
+++ b/source/cmk_addons_plugins/vsphere_topo/rulesets/packages.py
@@ -22,13 +22,13 @@ from cmk.rulesets.v1.form_specs import (
     SingleChoiceElement,
     String,
 )
-
 from cmk.rulesets.v1.form_specs.validators import LengthInRange
 from cmk.rulesets.v1.rule_specs import CheckParameters, HostCondition, Topic
 from cmk_addons.plugins.vsphere_topo.lib.utils import (
     EMBLEM_CLUSTER,
     EMBLEM_DATA_CENTER,
     EMBLEM_DATA_STORE,
+    ICON_VCENTER,
     PARAM_ADD_DUMMY_TOPOLOGIES,
     PARAM_CHANGE_CASE,
     PARAM_CLUSTER,
@@ -46,12 +46,11 @@ from cmk_addons.plugins.vsphere_topo.lib.utils import (
     PARAM_NO_EMBLEM,
     PARAM_PREFIX,
     PARAM_UPPER,
-    PARAM_VM_NAMES,
-    RULE_SET_NAME_VSPHERE_TOPO,
     PARAM_VCENTER,
-    ICON_VCENTER,
+    PARAM_VM_NAMES,
     PICTURE_TYPE_EMBLEM,
     PICTURE_TYPE_ICON,
+    RULE_SET_NAME_VSPHERE_TOPO,
 )
 
 adjust_names_elements: Mapping[str, DictElement] = {
diff --git a/source/packages/vsphere_topo b/source/packages/vsphere_topo
index d748247..b417aa7 100644
--- a/source/packages/vsphere_topo
+++ b/source/packages/vsphere_topo
@@ -12,7 +12,7 @@
                                   'vsphere_topo/graphing/packages.py']},
  'name': 'vsphere_topo',
  'title': 'vSphere Topologie',
- 'version': '0.0.3-20240711',
+ 'version': '0.0.4-20240712',
  'version.min_required': '2.3.0b1',
  'version.packaged': 'cmk-mkp-tool 0.2.0',
  'version.usable_until': '2.4.0b1'}
-- 
GitLab