Skip to content

Commit

Permalink
[proxmox] Add new plugin for Proxmox Virtualization Environment
Browse files Browse the repository at this point in the history
Signed-off-by: Drien Breton <[email protected]>
  • Loading branch information
Drien Breton authored and TurboTurtle committed Mar 9, 2024
1 parent 83a90c8 commit a4b5554
Showing 1 changed file with 101 additions and 0 deletions.
101 changes: 101 additions & 0 deletions sos/report/plugins/proxmox.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
# Copyright (C) 2024 ORNESS/Ditrit Drien Breton <[email protected]>

# This file is part of the sos project: https://github.com/sosreport/sos
#
# This copyrighted material is made available to anyone wishing to use,
# modify, copy, or redistribute it subject to the terms and conditions of
# version 2 of the GNU General Public License.
#
# See the LICENSE file in the source distribution for further information.
import json

from sos.report.plugins import Plugin, DebianPlugin, PluginOpt


class Proxmox(Plugin, DebianPlugin):
"""
This plugin will capture information about the system's
Proxmox Virtualization Environment.
It will collect information about the cluster, nodes, pools and
storage from the Proxmox API.
"""
short_desc = 'Proxmox cluster information'

plugin_name = 'proxmox'
packages = ('proxmox-ve',)

option_list = [
PluginOpt('output_formats',
desc='List of output formats to use '
'for the commands separated by ":".',
default='text',
),
]

def setup(self):
output_formats = self.get_option('output_formats').split(':')

commands = [
'cluster/resources',
'cluster/config/nodes',
'cluster/options',
'nodes/:id/status',
'nodes/:id/storage',
'nodes/:id/network',
'pools',
'storage',
'storage/:sid',
'cluster/ceph/status',
'cluster/ceph/metadata',
'cluster/ceph/flags',
]

cmd_paths = []

for command in commands:
cmd_paths.extend(self.build_cmd_paths(command))

self.add_cmd_output([
f"pvesh get {cmd} {'--noborder' if format == 'text' else ''} "
f"--output-format {format}"
for cmd in cmd_paths
for format in output_formats
])

def build_cmd_paths(self, base_path):
"""
Build command paths,
replacing dynamic attributes with data from the API
:param base_path: The base path to build from
:type base_path: str
:return: A list of paths
"""
parts = base_path.split('/')
paths = []

id_index = next((i for i, part in enumerate(parts)
if part.startswith(':')), None)

if id_index is not None:
path = "/".join(parts[:id_index])
trailing_path = "/".join(parts[id_index + 1:])

results = self.exec_cmd(f'pvesh ls {path} --output-format json')

if results["status"] == 0:
children = json.loads(results["output"])
for child in children:
paths.extend(
self.build_cmd_paths(
f"{path}/{child['name']}/{trailing_path}"
)
)

else:
paths.append('/'.join(parts))
return paths

# vim: set et ts=4 sw=4 :

0 comments on commit a4b5554

Please sign in to comment.