Change in vdsm[master]: hooks:checkips: add checkips hook

alukiano at redhat.com alukiano at redhat.com
Fri Feb 26 22:38:55 UTC 2016


Artyom Lukianov has uploaded a new change for review.

Change subject: hooks:checkips: add checkips hook
......................................................................

hooks:checkips: add checkips hook

Give possibilty to check connectivity between host and given addresses.
Update network stats with state of addresses.

Change-Id: I53cec37310f0f1844d6fe244419fd8c10e9b7ebb
Signed-off-by: Lukianov Artyom <alukiano at redhat.com>
---
M configure.ac
M vdsm_hooks/Makefile.am
A vdsm_hooks/checkips/Makefile.am
A vdsm_hooks/checkips/README
A vdsm_hooks/checkips/after_get_stats.py
5 files changed, 177 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/02/54102/1

diff --git a/configure.ac b/configure.ac
index 51cc514..d3c5282 100644
--- a/configure.ac
+++ b/configure.ac
@@ -380,6 +380,7 @@
 	vdsm/virt/vmdevices/Makefile
 	vdsm_hooks/Makefile
 	vdsm_hooks/allocate_net/Makefile
+	vdsm_hooks/checkips/Makefile
 	vdsm_hooks/checkimages/Makefile
 	vdsm_hooks/diskunmap/Makefile
 	vdsm_hooks/ethtool_options/Makefile
diff --git a/vdsm_hooks/Makefile.am b/vdsm_hooks/Makefile.am
index d23fb1c..478fcd3 100644
--- a/vdsm_hooks/Makefile.am
+++ b/vdsm_hooks/Makefile.am
@@ -35,6 +35,7 @@
 if HOOKS
 SUBDIRS += \
 	allocate_net \
+	checkips \
 	checkimages \
 	diskunmap \
 	extnet \
diff --git a/vdsm_hooks/checkips/Makefile.am b/vdsm_hooks/checkips/Makefile.am
new file mode 100644
index 0000000..0ec1cbf
--- /dev/null
+++ b/vdsm_hooks/checkips/Makefile.am
@@ -0,0 +1,30 @@
+#
+# Copyright 2014 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+#
+# Refer to the README and COPYING files for full details of the license
+#
+#
+EXTRA_DIST = \
+	after_get_stats.py
+
+install-data-local:
+	$(MKDIR_P) $(DESTDIR)$(vdsmhooksdir)/after_get_stats
+	$(INSTALL_SCRIPT) $(srcdir)/after_get_stats.py \
+		$(DESTDIR)$(vdsmhooksdir)/after_get_stats/10_checkips
+
+uninstall-local:
+	$(RM) $(DESTDIR)$(vdsmhooksdir)/after_get_stats/10_checkips
diff --git a/vdsm_hooks/checkips/README b/vdsm_hooks/checkips/README
new file mode 100644
index 0000000..5a68b20
--- /dev/null
+++ b/vdsm_hooks/checkips/README
@@ -0,0 +1,6 @@
+check_ips vdsm hook
+=====================
+This hook check connectivity from host to given addresses
+
+This hook is useful in cases where you need to check connectivity from host to
+specific vlan, before you start vm on it.
diff --git a/vdsm_hooks/checkips/after_get_stats.py b/vdsm_hooks/checkips/after_get_stats.py
new file mode 100644
index 0000000..586718a
--- /dev/null
+++ b/vdsm_hooks/checkips/after_get_stats.py
@@ -0,0 +1,139 @@
+#!/usr/bin/env python
+#
+# Copyright 2014 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
+#
+# Refer to the README and COPYING files for full details of the license
+#
+import os
+import sys
+import socket
+import hooking
+import traceback
+
+CHECK_IPS = 'checkips'
+HELP_ARG = "-h"
+TEST_ARG = "-t"
+HELP_TEXT = """usage: %(prog)s [%(help)s] [%(test)s]
+
+Check connectivity from host to specific address via ping
+
+optional arguments:
+  %(help)s  show this help message and exit
+  %(test)s  run a dry test for the hook
+""" % {
+    'help': HELP_ARG,
+    'test': TEST_ARG,
+    'prog': sys.argv[0]
+}
+
+
+def _parse_addresses():
+    return [address for address in os.environ[CHECK_IPS].split(',')]
+
+
+def _is_ipv4_address(address):
+    try:
+        socket.inet_pton(socket.AF_INET, address)
+    except socket.error:  # not a valid address
+        return False
+    return True
+
+
+def _is_address_connective(address):
+    ping = 'ping' if _is_ipv4_address(address) else 'ping6'
+    command = [ping, '-c', '1', address]
+    rc, out, err = hooking.execCmd(command, raw=True)
+    return False if rc else True
+
+
+def allocate_given_address(stats_json):
+    addresses = _parse_addresses()
+    network = stats_json['network']
+    sample_time = network.itervalues().next()['sampleTime']
+    for address in addresses:
+        state = 'up' if _is_address_connective(address) else 'down'
+        network[address] = {
+            'name': address,
+            'rx': '0',
+            'rxErrors': '0',
+            'rxRate': '0.0',
+            'sampleTime': sample_time,
+            'speed': '1000',
+            'state': state,
+            'tx': '0',
+            'txDropped': '0',
+            'txErrors': '0',
+            'txRate': '0.0'
+        }
+
+
+def test():
+    os.environ[CHECK_IPS] = '127.0.0.1,::1,test.test'
+    test_stats = {}
+    network = {
+        'eno1': {
+            'name': 'eno1',
+            'rx': '66167953505',
+            'rxDropped': '2454',
+            'rxErrors': '0',
+            'rxRate': '0.1',
+            'sampleTime': 1456488197.897933,
+            'speed': '10000',
+            'state': 'up',
+            'tx': '3583097015',
+            'txDropped': '0',
+            'txErrors': '0',
+            'txRate': '0.0'
+        },
+    }
+    test_stats['network'] = network
+    allocate_given_address(test_stats)
+    expected_states = {
+        '127.0.0.1': 'up',
+        '::1': 'up',
+        'test.test': 'down'
+    }
+    for interface, state in expected_states.iteritems():
+        test_msg = 'pass'
+        if test_stats['network'][interface]['state'] != state:
+            test_msg = 'fail'
+        print(
+            'test %s: interface %s has state %s' %
+            (test_msg, interface, state)
+        )
+
+
+def main():
+    stats_json = hooking.read_json()
+    allocate_given_address(stats_json)
+    hooking.write_json(stats_json)
+
+
+if __name__ == '__main__':
+    if HELP_ARG in sys.argv:
+        hooking.exit_hook(HELP_TEXT)
+
+    try:
+        if TEST_ARG in sys.argv:
+            test()
+        else:
+            main()
+    except:
+        hooking.exit_hook(
+            'check ips hook: [unexpected error]: %s\n' %
+            traceback.format_exc()
+        )


-- 
To view, visit https://gerrit.ovirt.org/54102
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I53cec37310f0f1844d6fe244419fd8c10e9b7ebb
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Artyom Lukianov <alukiano at redhat.com>


More information about the vdsm-patches mailing list