From 3f9a161f94556607740b80daaec56e71df885eaf Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Wed, 10 Jul 2024 20:28:14 +0200
Subject: [PATCH] update project

---
 README.md                                     |   2 +-
 mkp/vsphere_topo-0.0.2-20240709.mkp           | Bin 0 -> 6635 bytes
 .../vsphere_topo/agent_based/packages.py      |  12 +++++-
 .../vsphere_topo/graphing/packages.py         |  33 ++++++++++++++++
 .../vsphere_topo/rulesets/packages.py         |  36 ++++++++++++++++--
 source/packages/vsphere_topo                  |   5 ++-
 6 files changed, 80 insertions(+), 8 deletions(-)
 create mode 100644 mkp/vsphere_topo-0.0.2-20240709.mkp
 create mode 100644 source/cmk_addons_plugins/vsphere_topo/graphing/packages.py

diff --git a/README.md b/README.md
index f8cd3a6..d130b9e 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-[PACKAGE]: ../../raw/master/mkp/vsphere_topo-0.0.1-20240709.mkp "vsphere_topo-0.0.1-20240709.mkp"
+[PACKAGE]: ../../raw/master/mkp/vsphere_topo-0.0.2-20240709.mkp "vsphere_topo-0.0.2-20240709.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.2-20240709.mkp b/mkp/vsphere_topo-0.0.2-20240709.mkp
new file mode 100644
index 0000000000000000000000000000000000000000..3838a14893cefc61b7f47762264fbea7a866e184
GIT binary patch
literal 6635
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

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 912b4c4..401aa8f 100644
--- a/source/cmk_addons_plugins/vsphere_topo/agent_based/packages.py
+++ b/source/cmk_addons_plugins/vsphere_topo/agent_based/packages.py
@@ -8,6 +8,8 @@
 # Date  : 2024-07-05
 # File  : vsphere_topo/agent_based/packages.py
 
+# 2024-07-10: added time taken as metric
+
 from collections.abc import Mapping, Sequence
 from time import time_ns
 from typing import Any
@@ -19,6 +21,8 @@ from cmk.agent_based.v2 import (
     Result,
     Service,
     State,
+    check_levels,
+    render,
 )
 from cmk.base.check_api import host_name
 from cmk_addons.plugins.vsphere_topo.lib.utils import (
@@ -273,7 +277,13 @@ def check_vsphere_topo(
     yield Result(state=State.OK, summary=f'Objects: {len(objects)}')
     yield Result(state=State.OK, summary=f'Connections: {len(connections)}')
     yield Result(state=State.OK, notice=f'Written to: {path}/{file}')
-    yield Result(state=State.OK, summary=f'Time taken: {((time_ns() - start_time) / 1e9):.2}/s')
+    yield from check_levels(
+        value=(time_ns() - start_time) / 1e9,
+        label='Time taken',
+        metric_name='vsphere_topo_time_taken',
+        boundaries=(0, None),
+        render_func=render.timespan,
+    )
 
 
 check_plugin_vsphere_topo = CheckPlugin(
diff --git a/source/cmk_addons_plugins/vsphere_topo/graphing/packages.py b/source/cmk_addons_plugins/vsphere_topo/graphing/packages.py
new file mode 100644
index 0000000..036cc60
--- /dev/null
+++ b/source/cmk_addons_plugins/vsphere_topo/graphing/packages.py
@@ -0,0 +1,33 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# License: GNU General Public License v2
+#
+# Author: thl-cmk[at]outlook[dot]com
+# URL   : https://thl-cmk.hopto.org
+# Date  : 2024-07-10
+# File  : vsphere_topo/graphing/packages.py
+
+from cmk.graphing.v1 import Title
+from cmk.graphing.v1.graphs import Graph
+from cmk.graphing.v1.metrics import Color, Metric, Unit, TimeNotation, AutoPrecision
+from cmk.graphing.v1.perfometers import Closed, FocusRange, Open, Perfometer
+
+metric_vsphere_topo_time_taken = Metric(
+    name='vsphere_topo_time_taken',
+    title=Title('Time taken'),
+    unit=Unit(TimeNotation(), AutoPrecision(4)),
+    color=Color.BLUE,
+)
+
+graph_vsphere_topo_time_taken = Graph(
+    name='vsphere_topo_time_taken',
+    title=Title('Time taken'),
+    compound_lines=['vsphere_topo_time_taken'],
+)
+
+perfometer_vsphere_topo_time_taken = Perfometer(
+    name='vsphere_topo_time_taken',
+    focus_range=FocusRange(Closed(0), Open(1)),
+    segments=['vsphere_topo_time_taken']
+)
diff --git a/source/cmk_addons_plugins/vsphere_topo/rulesets/packages.py b/source/cmk_addons_plugins/vsphere_topo/rulesets/packages.py
index 2133a73..800fdae 100644
--- a/source/cmk_addons_plugins/vsphere_topo/rulesets/packages.py
+++ b/source/cmk_addons_plugins/vsphere_topo/rulesets/packages.py
@@ -10,7 +10,7 @@
 
 from collections.abc import Mapping, Sequence
 
-from cmk.rulesets.v1 import Label, Title
+from cmk.rulesets.v1 import Help, Label, Title
 from cmk.rulesets.v1.form_specs import (
     CascadingSingleChoice,
     CascadingSingleChoiceElement,
@@ -118,42 +118,70 @@ def _parameter_form() -> Dictionary:
                 parameter_form=CascadingSingleChoice(
                     title=Title('Cluster emblem'),
                     elements=get_emblem_element(EMBLEM_CLUSTER),
-                    prefill=DefaultValue(PARAM_DEFAULT_EMBLEM)
+                    prefill=DefaultValue(PARAM_DEFAULT_EMBLEM),
+                    help_text=Help(
+                        'Here you can change the picture for the cluster. If you use the built-in icons prefix '
+                        'the name with "icon_"'
+                    ),
                 )),
             PARAM_DATA_CENTER: DictElement(
                 parameter_form=CascadingSingleChoice(
                     title=Title('Datacenter emblem'),
                     elements=get_emblem_element(EMBLEM_DATA_CENTER),
-                    prefill=DefaultValue(PARAM_DEFAULT_EMBLEM)
+                    prefill=DefaultValue(PARAM_DEFAULT_EMBLEM),
+                    help_text=Help(
+                        'Here you can change the picture for the datacenter. If you use the built-in icons prefix '
+                        'the name with "icon_"'
+                    ),
                 )),
             PARAM_DATA_STORE: DictElement(
                 parameter_form=CascadingSingleChoice(
                     title=Title('Datastore emblem'),
                     elements=get_emblem_element(EMBLEM_DATA_STORE),
-                    prefill=DefaultValue(PARAM_DEFAULT_EMBLEM)
+                    prefill=DefaultValue(PARAM_DEFAULT_EMBLEM),
+                    help_text=Help(
+                        'Here you can change the picture for the datastore. If you use the built-in icons prefix '
+                        'the name with "icon_"'
+                    ),
                 )),
             PARAM_DATA_STORE_AS_SERVICE: DictElement(
                 parameter_form=FixedValue(
                     title=Title('Add data store service'),
                     label=Label('enabled'),
+                    help_text=Help(
+                        'This option adds the datastore services from the vCenter object to the topology. '
+                        'Pro: more insight. Con: cluttered topology.'
+                    ),
                     value=True
                 )),
             PARAM_MAKE_DEFAULT: DictElement(
                 parameter_form=FixedValue(
                     title=Title('Make default'),
                     label=Label('This will be the default topology'),
+                    help_text=Help(
+                        'Makes the vSphere topology the default topology. If there no default topology, the vSphere '
+                        'topology becomes always the default.'
+                    ),
                     value=True
                 )),
             PARAM_DONT_ADD_VC_AS_VM: DictElement(
                 parameter_form=FixedValue(
                     title=Title('Don\'t add vCenter as VM'),
                     label=Label('The vCenter will not be added as VM'),
+                    help_text=Help(
+                        'Use this option if the vCenter is also a VM within the managed datacenter.'
+                        'This will create a clearer topology, but you lose the info where the vCenter is running.'
+                    ),
                     value=True
                 )),
             PARAM_ADD_DUMMY_TOPOLOGIES: DictElement(
                 parameter_form=FixedValue(
                     title=Title('Add dummy topologies'),
                     label=Label('Adds empty CDP, LLDP, L3v4 and STATIC topology'),
+                    help_text=Help(
+                        'Use this option if you are also using the NVDCT. This is a workaround, as the backend '
+                        'only picks up layers that are present in the default topology folder.'
+                    ),
                     value=True
                 )),
         }
diff --git a/source/packages/vsphere_topo b/source/packages/vsphere_topo
index 62492c4..142ae81 100644
--- a/source/packages/vsphere_topo
+++ b/source/packages/vsphere_topo
@@ -8,10 +8,11 @@
  'download_url': 'https://thl-cmk.hopto.org',
  'files': {'cmk_addons_plugins': ['vsphere_topo/agent_based/packages.py',
                                   'vsphere_topo/rulesets/packages.py',
-                                  'vsphere_topo/lib/utils.py']},
+                                  'vsphere_topo/lib/utils.py',
+                                  'vsphere_topo/graphing/packages.py']},
  'name': 'vsphere_topo',
  'title': 'vSphere Topologie',
- 'version': '0.0.1-20240709',
+ 'version': '0.0.2-20240709',
  'version.min_required': '2.3.0b1',
  'version.packaged': 'cmk-mkp-tool 0.2.0',
  'version.usable_until': '2.4.0b1'}
-- 
GitLab