Skip to content

Commit

Permalink
Updated check_openvswitch to use Interface table json
Browse files Browse the repository at this point in the history
  • Loading branch information
Drew Freiberger committed Apr 23, 2021
1 parent b60df86 commit 76d7842
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 15 deletions.
2 changes: 1 addition & 1 deletion charmhelpers/contrib/charmsupport/nrpe.py
Original file line number Diff line number Diff line change
Expand Up @@ -528,7 +528,7 @@ def enable_sudo_for_openvswitch_checks():
sudoers_dir = "/etc/sudoers.d"
sudoers_mode = 0o100440
ovs_sudoers_file = "99-check_openvswitch"
ovs_sudoers_entry = "nagios ALL=(root) NOPASSWD: /usr/bin/ovs-vsctl show"
ovs_sudoers_entry = "nagios ALL=(root) NOPASSWD: /usr/bin/ovs-vsctl --format=json list Interface"
dest = os.path.join(sudoers_dir, ovs_sudoers_file)
try:
with open(dest, "w") as sudoer_file:
Expand Down
33 changes: 19 additions & 14 deletions charmhelpers/contrib/openstack/files/check_openvswitch.py
Original file line number Diff line number Diff line change
@@ -1,39 +1,44 @@
#!/usr/bin/env python3
# -*- coding: us-ascii -*-
"""Check for issues with NVME hardware devices."""
"""Check for OVS interface errors."""

import argparse
import re
import json
import subprocess
import sys

# dependence on nagios_plugin3 being installed by charm-nrpe
from nagios_plugin3 import CriticalError, UnknownError, try_check


def parse_ovs_status():
"""Check for errors in 'ovs-vsctl show' output."""
try:
cmd = ["/usr/bin/sudo", "/usr/bin/ovs-vsctl", "show"]
cmd = ["/usr/bin/sudo", "/usr/bin/ovs-vsctl", "--format=json", "list", "Interface"]
ovs_output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
raise UnknownError(
"UNKNOWN: Failed to query ovs: {}".format(
e.output.decode(errors="ignore").rstrip()
)
)
ovs_interfaces = json.loads(ovs_output.decode(errors="ignore"))
ovs_interface_errors = []
for i in ovs_interfaces["data"]:
# OVSDB internal data is formatted per RFC 7047 5.1
iface = dict(zip(ovs_interfaces["headings"], i))
error = iface["error"]
if isinstance(error, list) and len(error) == 2 and error[0] == "set":
# deserialize the set data into csv string elements
error = ",".join(error[1])
if error:
ovs_interface_errors.append("Error on iface {}: {}".format(iface["name"], error))

ovs_vsctl_show_errors = []
ovs_error_re = re.compile(r"^.*error: (?P<message>.+)$", re.I)
for line in ovs_output.decode(errors="ignore").splitlines():
m = ovs_error_re.match(line)
if m:
ovs_vsctl_show_errors.append(m.group("message"))

if ovs_vsctl_show_errors:
numerrs = len(ovs_vsctl_show_errors)
if ovs_interface_errors:
numerrs = len(ovs_interface_errors)
raise CriticalError(
"CRITICAL: Found {} error(s) in ovs-vsctl show: "
"{}".format(numerrs, ", ".join(ovs_vsctl_show_errors))
"CRITICAL: Found {} error(s) in OVSDB: "
"{}".format(numerrs, ", ".join(ovs_interface_errors))
)

print("OK: no errors found in openvswitch")
Expand Down

0 comments on commit 76d7842

Please sign in to comment.