[PATCH v2 1/5] Add is_installed method
by Jiri Prochazka
This method is used for detecting if program is present in $PATH
Signed-off-by: Jiri Prochazka <jprochaz(a)redhat.com>
---
lnst/Common/Utils.py | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/lnst/Common/Utils.py b/lnst/Common/Utils.py
index c283b99..41958c8 100644
--- a/lnst/Common/Utils.py
+++ b/lnst/Common/Utils.py
@@ -263,3 +263,15 @@ def std_deviation(values):
s1 += val
s2 += val**2
return (math.sqrt(len(values)*s2 - s1**2))/len(values)
+
+def is_installed(program):
+ """
+ Returns True if program is detected by which, False otherwise
+ """
+ cmd = "which %s" % program
+ try:
+ subprocess.check_call(cmd, shell=True, stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ return True
+ except subprocess.CalledProcessError:
+ return False
--
2.4.3
8 years, 7 months
[PATCH 1/2] Return driver info in get_devices method
by Jiri Prochazka
Signed-off-by: Jiri Prochazka <jprochaz(a)redhat.com>
---
lnst/Slave/NetTestSlave.py | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/lnst/Slave/NetTestSlave.py b/lnst/Slave/NetTestSlave.py
index a37fe78..c9d1697 100644
--- a/lnst/Slave/NetTestSlave.py
+++ b/lnst/Slave/NetTestSlave.py
@@ -135,7 +135,9 @@ class SlaveMethods:
result = {}
for device in devices:
if device._ifi_type == 1 and device._state == 'DOWN':
- result[device._if_index] = {'name' : device._name, 'hwaddr' : device._hwaddr}
+ result[device._if_index] = {'name' : device._name,
+ 'hwaddr' : device._hwaddr,
+ 'driver' : device._driver}
return result
def get_devices_by_devname(self, devname):
--
2.4.3
8 years, 7 months
[PATCH 1/3] Add deprecated decorator
by Jiri Prochazka
This decorator prints warning message each time decorated function
is called. Warning message contains name of the called method and
name of the class in which the method belongs.
For using the decorator, just add @deprecated before method definition
Signed-off-by: Jiri Prochazka <jprochaz(a)redhat.com>
---
lnst/Common/Utils.py | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/lnst/Common/Utils.py b/lnst/Common/Utils.py
index c283b99..b42fc86 100644
--- a/lnst/Common/Utils.py
+++ b/lnst/Common/Utils.py
@@ -9,6 +9,7 @@ published by the Free Software Foundation; see COPYING for details.
__autor__ = """
jzupka(a)redhat.com (Jiri Zupka)
"""
+import functools
import logging
import time
import re
@@ -263,3 +264,17 @@ def std_deviation(values):
s1 += val
s2 += val**2
return (math.sqrt(len(values)*s2 - s1**2))/len(values)
+
+def deprecated(func):
+ """
+ Decorator which marks the method as deprecated - meaning when used,
+ it logs warning message with name of the method and class it belongs to
+ """
+
+ @functools.wraps(func)
+ def log(self, *args, **kwargs):
+ logging.warning("Function %s from class %s is deprecated, please, "\
+ "check documentation for up-to-date method"
+ % (func.__name__, self.__class__.__name__))
+ return func(self, *args, **kwargs)
+ return log
--
2.4.3
8 years, 7 months
[PATCH 1/2] Rename InterfaceAPI method get_ip_addr to get_ip, but keep the old one as alias
by Jiri Prochazka
Signed-off-by: Jiri Prochazka <jprochaz(a)redhat.com>
---
lnst/Controller/Task.py | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/lnst/Controller/Task.py b/lnst/Controller/Task.py
index 0d437f3..4d0908d 100644
--- a/lnst/Controller/Task.py
+++ b/lnst/Controller/Task.py
@@ -355,12 +355,18 @@ class InterfaceAPI(object):
def get_hwaddr(self):
return VolatileValue(self._if.get_hwaddr)
- def get_ip_addr(self, ip_index):
+ def get_ip(self, ip_index):
return VolatileValue(self._if.get_address, ip_index)
- def get_ip_addrs(self):
+ def get_ips(self):
return VolatileValue(self._if.get_addresses)
+ def get_ip_addr(self, ip_index):
+ return self.get_ip(ip_index)
+
+ def get_ip_addrs(self):
+ return self.get_ips()
+
def get_ip_prefix(self, ip_index):
return VolatileValue(self._if.get_prefix, ip_index)
--
2.4.3
8 years, 7 months
[PATCH 1/3] Add is_installed method
by Jiri Prochazka
This method is used for detecting if program is present in $PATH
Signed-off-by: Jiri Prochazka <jprochaz(a)redhat.com>
---
lnst/Common/Utils.py | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/lnst/Common/Utils.py b/lnst/Common/Utils.py
index c283b99..d198b6f 100644
--- a/lnst/Common/Utils.py
+++ b/lnst/Common/Utils.py
@@ -263,3 +263,16 @@ def std_deviation(values):
s1 += val
s2 += val**2
return (math.sqrt(len(values)*s2 - s1**2))/len(values)
+
+def is_installed(program):
+ """
+ Returns True if program is detected by which, False otherwise
+ """
+ cmd = "which %s" % program
+ process = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ output = process.communicate()[0]
+ if process.returncode == 0:
+ return True
+ else:
+ return False
--
2.4.3
8 years, 7 months
[PATCH 1/3] recipes: add mtu settings to phase1 virt tests
by Jan Tluka
To use different MTU than default value of 1500 bytes in phase1 virtual
tests a user can specify other value by overriding mtu alias.
Signed-off-by: Jan Tluka <jtluka(a)redhat.com>
---
...tual_bridge_2_vlans_over_active_backup_bond.xml | 1 +
.../phase1/virtual_bridge_2_vlans_over_bond.py | 23 ++++++++++++++++++++++
.../phase1/virtual_bridge_vlan_in_guest.py | 11 +++++++++++
.../phase1/virtual_bridge_vlan_in_guest.xml | 1 +
.../phase1/virtual_bridge_vlan_in_host.py | 12 +++++++++++
.../phase1/virtual_bridge_vlan_in_host.xml | 1 +
6 files changed, 49 insertions(+)
diff --git a/recipes/regression_tests/phase1/virtual_bridge_2_vlans_over_active_backup_bond.xml b/recipes/regression_tests/phase1/virtual_bridge_2_vlans_over_active_backup_bond.xml
index 18f8cf5..d11d88a 100644
--- a/recipes/regression_tests/phase1/virtual_bridge_2_vlans_over_active_backup_bond.xml
+++ b/recipes/regression_tests/phase1/virtual_bridge_2_vlans_over_active_backup_bond.xml
@@ -2,6 +2,7 @@
<define>
<alias name="ipv" value="both" />
<alias name="netperf_duration" value="60" />
+ <alias name="mtu" value="1500" />
<alias name="mapping_file" value="virtual_bridge_2_vlans_over_active_backup_bond.mapping" />
</define>
<network>
diff --git a/recipes/regression_tests/phase1/virtual_bridge_2_vlans_over_bond.py b/recipes/regression_tests/phase1/virtual_bridge_2_vlans_over_bond.py
index 87cfd08..74f78e4 100644
--- a/recipes/regression_tests/phase1/virtual_bridge_2_vlans_over_bond.py
+++ b/recipes/regression_tests/phase1/virtual_bridge_2_vlans_over_bond.py
@@ -47,6 +47,7 @@ offloads = ["gso", "gro", "tso"]
ipv = ctl.get_alias("ipv")
netperf_duration = ctl.get_alias("netperf_duration")
+mtu = ctl.get_alias("mtu")
ping_mod = ctl.get_module("IcmpPing",
options={
@@ -170,6 +171,28 @@ ping_mod6_bad2 = ctl.get_module("Icmp6Ping",
"interval" : 0.1
})
+# configure mtu
+h1.get_interface("bond").set_mtu(mtu)
+h1.get_interface("tap1").set_mtu(mtu)
+h1.get_interface("tap2").set_mtu(mtu)
+h1.get_interface("vlan10").set_mtu(mtu)
+h1.get_interface("vlan20").set_mtu(mtu)
+h1.get_interface("br1").set_mtu(mtu)
+h1.get_interface("br2").set_mtu(mtu)
+
+h2.get_interface("bond").set_mtu(mtu)
+h2.get_interface("tap1").set_mtu(mtu)
+h2.get_interface("tap2").set_mtu(mtu)
+h2.get_interface("vlan10").set_mtu(mtu)
+h2.get_interface("vlan20").set_mtu(mtu)
+h2.get_interface("br1").set_mtu(mtu)
+h2.get_interface("br2").set_mtu(mtu)
+
+g1.get_interface("guestnic").set_mtu(mtu)
+g2.get_interface("guestnic").set_mtu(mtu)
+g3.get_interface("guestnic").set_mtu(mtu)
+g4.get_interface("guestnic").set_mtu(mtu)
+
ctl.wait(15)
for offload in offloads:
diff --git a/recipes/regression_tests/phase1/virtual_bridge_vlan_in_guest.py b/recipes/regression_tests/phase1/virtual_bridge_vlan_in_guest.py
index 4766980..135e8bb 100644
--- a/recipes/regression_tests/phase1/virtual_bridge_vlan_in_guest.py
+++ b/recipes/regression_tests/phase1/virtual_bridge_vlan_in_guest.py
@@ -41,6 +41,7 @@ offloads = ["gso", "gro", "tso"]
ipv = ctl.get_alias("ipv")
netperf_duration = ctl.get_alias("netperf_duration")
+mtu = ctl.get_alias("mtu")
ping_mod = ctl.get_module("IcmpPing",
options={
@@ -117,6 +118,16 @@ netperf_cli_udp6 = ctl.get_module("Netperf",
"-i 5 -L %s -6" % h2.get_ip("vlan10", 1)
})
+# configure mtu
+h1.get_interface("nic").set_mtu(mtu)
+h1.get_interface("tap").set_mtu(mtu)
+h1.get_interface("br").set_mtu(mtu)
+
+g1.get_interface("guestnic").set_mtu(mtu)
+g1.get_interface("vlan10").set_mtu(mtu)
+
+h2.get_interface("nic").set_mtu(mtu)
+
ctl.wait(15)
for offload in offloads:
diff --git a/recipes/regression_tests/phase1/virtual_bridge_vlan_in_guest.xml b/recipes/regression_tests/phase1/virtual_bridge_vlan_in_guest.xml
index a980bfb..0e11fbf 100644
--- a/recipes/regression_tests/phase1/virtual_bridge_vlan_in_guest.xml
+++ b/recipes/regression_tests/phase1/virtual_bridge_vlan_in_guest.xml
@@ -2,6 +2,7 @@
<define>
<alias name="ipv" value="both" />
<alias name="netperf_duration" value="60" />
+ <alias name="mtu" value="1500" />
<alias name="mapping_file" value="virtual_bridge_vlan_in_guest.mapping" />
</define>
<network>
diff --git a/recipes/regression_tests/phase1/virtual_bridge_vlan_in_host.py b/recipes/regression_tests/phase1/virtual_bridge_vlan_in_host.py
index cb708ca..62fd95d 100644
--- a/recipes/regression_tests/phase1/virtual_bridge_vlan_in_host.py
+++ b/recipes/regression_tests/phase1/virtual_bridge_vlan_in_host.py
@@ -41,6 +41,7 @@ offloads = ["gso", "gro", "tso"]
ipv = ctl.get_alias("ipv")
netperf_duration = ctl.get_alias("netperf_duration")
+mtu = ctl.get_alias("mtu")
ping_mod = ctl.get_module("IcmpPing",
options={
@@ -117,6 +118,17 @@ netperf_cli_udp6 = ctl.get_module("Netperf",
"-i 5 -L %s -6" % h2.get_ip("vlan10", 1)
})
+# configure mtu
+h1.get_interface("nic").set_mtu(mtu)
+h1.get_interface("tap").set_mtu(mtu)
+h1.get_interface("vlan10").set_mtu(mtu)
+h1.get_interface("br").set_mtu(mtu)
+
+g1.get_interface("guestnic").set_mtu(mtu)
+
+h2.get_interface("nic").set_mtu(mtu)
+h2.get_interface("vlan10").set_mtu(mtu)
+
ctl.wait(15)
for offload in offloads:
diff --git a/recipes/regression_tests/phase1/virtual_bridge_vlan_in_host.xml b/recipes/regression_tests/phase1/virtual_bridge_vlan_in_host.xml
index fe79146..138ad6d 100644
--- a/recipes/regression_tests/phase1/virtual_bridge_vlan_in_host.xml
+++ b/recipes/regression_tests/phase1/virtual_bridge_vlan_in_host.xml
@@ -2,6 +2,7 @@
<define>
<alias name="ipv" value="both" />
<alias name="netperf_duration" value="60" />
+ <alias name="mtu" value="1500" />
<alias name="mapping_file" value="virtual_bridge_vlan_in_host.mapping" />
</define>
<network>
--
2.1.0
8 years, 7 months
[PATCH] regression_tests: fix generate_hash ignore list
by Ondrej Lichtner
From: Ondrej Lichtner <olichtne(a)redhat.com>
When generating the hash of a result we were supposed to ignore the
parameters "kernel_release" and "redhat_release", instead we were
ignoring "kernel-release" and "redhat-release". This patch fixes the
issue.
In case of virtual tests I also added two more regex-es that ignore the
hostname and mac addresses of the guest machines as these will almost
certainly be different between runs since we always generate new guests.
Signed-off-by: Ondrej Lichtner <olichtne(a)redhat.com>
---
recipes/regression_tests/phase1/3_vlans.py | 16 +++++------
.../regression_tests/phase1/3_vlans_over_bond.py | 16 +++++------
recipes/regression_tests/phase1/bonding_test.py | 16 +++++------
.../phase1/virtual_bridge_2_vlans_over_bond.py | 24 ++++++++++------
.../phase1/virtual_bridge_vlan_in_guest.py | 24 ++++++++++------
.../phase1/virtual_bridge_vlan_in_host.py | 24 ++++++++++------
.../regression_tests/phase2/3_vlans_over_team.py | 16 +++++------
recipes/regression_tests/phase2/team_test.py | 32 +++++++++++-----------
...l_ovs_bridge_2_vlans_over_active_backup_bond.py | 16 +++++------
.../phase2/virtual_ovs_bridge_vlan_in_guest.py | 16 +++++------
.../phase2/virtual_ovs_bridge_vlan_in_host.py | 16 +++++------
11 files changed, 120 insertions(+), 96 deletions(-)
diff --git a/recipes/regression_tests/phase1/3_vlans.py b/recipes/regression_tests/phase1/3_vlans.py
index 0109ba0..158816f 100644
--- a/recipes/regression_tests/phase1/3_vlans.py
+++ b/recipes/regression_tests/phase1/3_vlans.py
@@ -152,8 +152,8 @@ for vlan1 in vlans:
result_tcp.set_parameter('netperf_client_on_vlan', vlan2)
if product_name is not None:
result_tcp.set_tag(product_name)
- res_hash = result_tcp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_tcp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_tcp.set_tag(res_hash)
baseline = None
@@ -175,8 +175,8 @@ for vlan1 in vlans:
result_udp.set_parameter('netperf_client_on_vlan', vlan2)
if product_name is not None:
result_udp.set_tag(product_name)
- res_hash = result_udp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_udp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_udp.set_tag(res_hash)
baseline = None
@@ -235,8 +235,8 @@ for vlan1 in vlans:
result_tcp.set_parameter('netperf_client_on_vlan', vlan2)
if product_name is not None:
result_tcp.set_tag(product_name)
- res_hash = result_tcp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_tcp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_tcp.set_tag(res_hash)
baseline = None
@@ -258,8 +258,8 @@ for vlan1 in vlans:
result_udp.set_parameter('netperf_client_on_vlan', vlan2)
if product_name is not None:
result_udp.set_tag(product_name)
- res_hash = result_udp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_udp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_udp.set_tag(res_hash)
baseline = None
diff --git a/recipes/regression_tests/phase1/3_vlans_over_bond.py b/recipes/regression_tests/phase1/3_vlans_over_bond.py
index 4dae207..372c689 100644
--- a/recipes/regression_tests/phase1/3_vlans_over_bond.py
+++ b/recipes/regression_tests/phase1/3_vlans_over_bond.py
@@ -154,8 +154,8 @@ for vlan1 in vlans:
result_tcp.set_parameter('netperf_client_on_vlan', vlan2)
if product_name is not None:
result_tcp.set_tag(product_name)
- res_hash = result_tcp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_tcp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_tcp.set_tag(res_hash)
baseline = None
@@ -177,8 +177,8 @@ for vlan1 in vlans:
result_udp.set_parameter('netperf_client_on_vlan', vlan2)
if product_name is not None:
result_udp.set_tag(product_name)
- res_hash = result_udp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_udp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_udp.set_tag(res_hash)
baseline = None
@@ -237,8 +237,8 @@ for vlan1 in vlans:
result_tcp.set_parameter('netperf_client_on_vlan', vlan2)
if product_name is not None:
result_tcp.set_tag(product_name)
- res_hash = result_tcp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_tcp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_tcp.set_tag(res_hash)
baseline = None
@@ -260,8 +260,8 @@ for vlan1 in vlans:
result_udp.set_parameter('netperf_client_on_vlan', vlan2)
if product_name is not None:
result_udp.set_tag(product_name)
- res_hash = result_udp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_udp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_udp.set_tag(res_hash)
baseline = None
diff --git a/recipes/regression_tests/phase1/bonding_test.py b/recipes/regression_tests/phase1/bonding_test.py
index e59d830..5c4777b 100644
--- a/recipes/regression_tests/phase1/bonding_test.py
+++ b/recipes/regression_tests/phase1/bonding_test.py
@@ -138,8 +138,8 @@ for offload in offloads:
result_tcp.set_parameter(offload, state)
if product_name is not None:
result_tcp.set_tag(product_name)
- res_hash = result_tcp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_tcp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_tcp.set_tag(res_hash)
baseline = None
@@ -158,8 +158,8 @@ for offload in offloads:
result_udp.set_parameter(offload, state)
if product_name is not None:
result_udp.set_tag(product_name)
- res_hash = result_udp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_udp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_udp.set_tag(res_hash)
baseline = None
@@ -213,8 +213,8 @@ for offload in offloads:
result_tcp.set_parameter(offload, state)
if product_name is not None:
result_tcp.set_tag(product_name)
- res_hash = result_tcp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_tcp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_tcp.set_tag(res_hash)
baseline = None
@@ -234,8 +234,8 @@ for offload in offloads:
result_udp.set_parameter(offload, state)
if product_name is not None:
result_udp.set_tag(product_name)
- res_hash = result_udp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_udp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_udp.set_tag(res_hash)
baseline = None
diff --git a/recipes/regression_tests/phase1/virtual_bridge_2_vlans_over_bond.py b/recipes/regression_tests/phase1/virtual_bridge_2_vlans_over_bond.py
index 69e0605..87cfd08 100644
--- a/recipes/regression_tests/phase1/virtual_bridge_2_vlans_over_bond.py
+++ b/recipes/regression_tests/phase1/virtual_bridge_2_vlans_over_bond.py
@@ -204,8 +204,10 @@ for offload in offloads:
result_tcp.set_parameter(offload, state)
if product_name is not None:
result_tcp.set_tag(product_name)
- res_hash = result_tcp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_tcp.generate_hash(['kernel_release',
+ 'redhat_release',
+ r'guest\d+\.hostname',
+ r'guest\d+\..*hwaddr'])
result_tcp.set_tag(res_hash)
baseline = None
@@ -224,8 +226,10 @@ for offload in offloads:
result_udp.set_parameter(offload, state)
if product_name is not None:
result_udp.set_tag(product_name)
- res_hash = result_udp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_udp.generate_hash(['kernel_release',
+ 'redhat_release',
+ r'guest\d+\.hostname',
+ r'guest\d+\..*hwaddr'])
result_udp.set_tag(res_hash)
baseline = None
@@ -282,8 +286,10 @@ for offload in offloads:
result_tcp.set_parameter(offload, state)
if product_name is not None:
result_tcp.set_tag(product_name)
- res_hash = result_tcp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_tcp.generate_hash(['kernel_release',
+ 'redhat_release',
+ r'guest\d+\.hostname',
+ r'guest\d+\..*hwaddr'])
result_tcp.set_tag(res_hash)
baseline = None
@@ -303,8 +309,10 @@ for offload in offloads:
result_udp.set_parameter(offload, state)
if product_name is not None:
result_udp.set_tag(product_name)
- res_hash = result_udp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_udp.generate_hash(['kernel_release',
+ 'redhat_release',
+ r'guest\d+\.hostname',
+ r'guest\d+\..*hwaddr'])
result_udp.set_tag(res_hash)
baseline = None
diff --git a/recipes/regression_tests/phase1/virtual_bridge_vlan_in_guest.py b/recipes/regression_tests/phase1/virtual_bridge_vlan_in_guest.py
index e7ef089..4766980 100644
--- a/recipes/regression_tests/phase1/virtual_bridge_vlan_in_guest.py
+++ b/recipes/regression_tests/phase1/virtual_bridge_vlan_in_guest.py
@@ -139,8 +139,10 @@ for offload in offloads:
result_tcp.set_parameter(offload, state)
if product_name is not None:
result_tcp.set_tag(product_name)
- res_hash = result_tcp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_tcp.generate_hash(['kernel_release',
+ 'redhat_release',
+ r'guest\d+\.hostname',
+ r'guest\d+\..*hwaddr'])
result_tcp.set_tag(res_hash)
baseline = None
@@ -159,8 +161,10 @@ for offload in offloads:
result_udp.set_parameter(offload, state)
if product_name is not None:
result_udp.set_tag(product_name)
- res_hash = result_udp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_udp.generate_hash(['kernel_release',
+ 'redhat_release',
+ r'guest\d+\.hostname',
+ r'guest\d+\..*hwaddr'])
result_udp.set_tag(res_hash)
baseline = None
@@ -215,8 +219,10 @@ for offload in offloads:
result_tcp.set_parameter(offload, state)
if product_name is not None:
result_tcp.set_tag(product_name)
- res_hash = result_tcp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_tcp.generate_hash(['kernel_release',
+ 'redhat_release',
+ r'guest\d+\.hostname',
+ r'guest\d+\..*hwaddr'])
result_tcp.set_tag(res_hash)
baseline = None
@@ -236,8 +242,10 @@ for offload in offloads:
result_udp.set_parameter(offload, state)
if product_name is not None:
result_udp.set_tag(product_name)
- res_hash = result_udp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_udp.generate_hash(['kernel_release',
+ 'redhat_release',
+ r'guest\d+\.hostname',
+ r'guest\d+\..*hwaddr'])
result_udp.set_tag(res_hash)
baseline = None
diff --git a/recipes/regression_tests/phase1/virtual_bridge_vlan_in_host.py b/recipes/regression_tests/phase1/virtual_bridge_vlan_in_host.py
index d32b1e0..cb708ca 100644
--- a/recipes/regression_tests/phase1/virtual_bridge_vlan_in_host.py
+++ b/recipes/regression_tests/phase1/virtual_bridge_vlan_in_host.py
@@ -138,8 +138,10 @@ for offload in offloads:
result_tcp.set_parameter(offload, state)
if product_name is not None:
result_tcp.set_tag(product_name)
- res_hash = result_tcp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_tcp.generate_hash(['kernel_release',
+ 'redhat_release',
+ r'guest\d+\.hostname',
+ r'guest\d+\..*hwaddr'])
result_tcp.set_tag(res_hash)
baseline = None
@@ -158,8 +160,10 @@ for offload in offloads:
result_udp.set_parameter(offload, state)
if product_name is not None:
result_udp.set_tag(product_name)
- res_hash = result_udp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_udp.generate_hash(['kernel_release',
+ 'redhat_release',
+ r'guest\d+\.hostname',
+ r'guest\d+\..*hwaddr'])
result_udp.set_tag(res_hash)
baseline = None
@@ -213,8 +217,10 @@ for offload in offloads:
result_tcp.set_parameter(offload, state)
if product_name is not None:
result_tcp.set_tag(product_name)
- res_hash = result_tcp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_tcp.generate_hash(['kernel_release',
+ 'redhat_release',
+ r'guest\d+\.hostname',
+ r'guest\d+\..*hwaddr'])
result_tcp.set_tag(res_hash)
baseline = None
@@ -234,8 +240,10 @@ for offload in offloads:
result_udp.set_parameter(offload, state)
if product_name is not None:
result_udp.set_tag(product_name)
- res_hash = result_udp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_udp.generate_hash(['kernel_release',
+ 'redhat_release',
+ r'guest\d+\.hostname',
+ r'guest\d+\..*hwaddr'])
result_udp.set_tag(res_hash)
baseline = None
diff --git a/recipes/regression_tests/phase2/3_vlans_over_team.py b/recipes/regression_tests/phase2/3_vlans_over_team.py
index 86c59b0..a6dbd49 100644
--- a/recipes/regression_tests/phase2/3_vlans_over_team.py
+++ b/recipes/regression_tests/phase2/3_vlans_over_team.py
@@ -156,8 +156,8 @@ for vlan1 in vlans:
result_tcp.set_parameter('netperf_client_on_vlan', vlan2)
if product_name is not None:
result_tcp.set_tag(product_name)
- res_hash = result_tcp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_tcp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_tcp.set_tag(res_hash)
baseline = None
@@ -179,8 +179,8 @@ for vlan1 in vlans:
result_udp.set_parameter('netperf_client_on_vlan', vlan2)
if product_name is not None:
result_udp.set_tag(product_name)
- res_hash = result_udp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_udp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_udp.set_tag(res_hash)
baseline = None
@@ -237,8 +237,8 @@ for vlan1 in vlans:
result_tcp.set_parameter('netperf_client_on_vlan', vlan2)
if product_name is not None:
result_tcp.set_tag(product_name)
- res_hash = result_tcp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_tcp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_tcp.set_tag(res_hash)
baseline = None
@@ -260,8 +260,8 @@ for vlan1 in vlans:
result_udp.set_parameter('netperf_client_on_vlan', vlan2)
if product_name is not None:
result_udp.set_tag(product_name)
- res_hash = result_udp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_udp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_udp.set_tag(res_hash)
baseline = None
diff --git a/recipes/regression_tests/phase2/team_test.py b/recipes/regression_tests/phase2/team_test.py
index 0ecc25c..95dcfd8 100644
--- a/recipes/regression_tests/phase2/team_test.py
+++ b/recipes/regression_tests/phase2/team_test.py
@@ -141,8 +141,8 @@ for offload in offloads:
result_tcp.set_parameter('netperf_client', "testmachine2")
if product_name is not None:
result_tcp.set_tag(product_name)
- res_hash = result_tcp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_tcp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_tcp.set_tag(res_hash)
baseline = None
@@ -164,8 +164,8 @@ for offload in offloads:
result_udp.set_parameter('netperf_client', "testmachine2")
if product_name is not None:
result_udp.set_tag(product_name)
- res_hash = result_udp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_udp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_udp.set_tag(res_hash)
baseline = None
@@ -221,8 +221,8 @@ for offload in offloads:
result_tcp.set_parameter('netperf_client', "testmachine2")
if product_name is not None:
result_tcp.set_tag(product_name)
- res_hash = result_tcp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_tcp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_tcp.set_tag(res_hash)
baseline = None
@@ -244,8 +244,8 @@ for offload in offloads:
result_udp.set_parameter('netperf_client', "testmachine2")
if product_name is not None:
result_udp.set_tag(product_name)
- res_hash = result_udp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_udp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_udp.set_tag(res_hash)
baseline = None
@@ -330,8 +330,8 @@ for offload in offloads:
result_tcp.set_parameter('netperf_client', "testmachine1")
if product_name is not None:
result_tcp.set_tag(product_name)
- res_hash = result_tcp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_tcp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_tcp.set_tag(res_hash)
baseline = None
@@ -353,8 +353,8 @@ for offload in offloads:
result_udp.set_parameter('netperf_client', "testmachine1")
if product_name is not None:
result_udp.set_tag(product_name)
- res_hash = result_udp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_udp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_udp.set_tag(res_hash)
baseline = None
@@ -410,8 +410,8 @@ for offload in offloads:
result_tcp.set_parameter('netperf_client', "testmachine1")
if product_name is not None:
result_tcp.set_tag(product_name)
- res_hash = result_tcp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_tcp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_tcp.set_tag(res_hash)
baseline = None
@@ -433,8 +433,8 @@ for offload in offloads:
result_udp.set_parameter('netperf_client', "testmachine1")
if product_name is not None:
result_udp.set_tag(product_name)
- res_hash = result_udp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_udp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_udp.set_tag(res_hash)
baseline = None
diff --git a/recipes/regression_tests/phase2/virtual_ovs_bridge_2_vlans_over_active_backup_bond.py b/recipes/regression_tests/phase2/virtual_ovs_bridge_2_vlans_over_active_backup_bond.py
index a35d446..833e19e 100644
--- a/recipes/regression_tests/phase2/virtual_ovs_bridge_2_vlans_over_active_backup_bond.py
+++ b/recipes/regression_tests/phase2/virtual_ovs_bridge_2_vlans_over_active_backup_bond.py
@@ -206,8 +206,8 @@ for offload in offloads:
result_tcp.set_parameter(offload, state)
if product_name is not None:
result_tcp.set_tag(product_name)
- res_hash = result_tcp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_tcp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_tcp.set_tag(res_hash)
baseline = None
@@ -226,8 +226,8 @@ for offload in offloads:
result_udp.set_parameter(offload, state)
if product_name is not None:
result_udp.set_tag(product_name)
- res_hash = result_udp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_udp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_udp.set_tag(res_hash)
baseline = None
@@ -284,8 +284,8 @@ for offload in offloads:
result_tcp.set_parameter(offload, state)
if product_name is not None:
result_tcp.set_tag(product_name)
- res_hash = result_tcp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_tcp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_tcp.set_tag(res_hash)
baseline = None
@@ -305,8 +305,8 @@ for offload in offloads:
result_udp.set_parameter(offload, state)
if product_name is not None:
result_udp.set_tag(product_name)
- res_hash = result_udp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_udp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_udp.set_tag(res_hash)
baseline = None
diff --git a/recipes/regression_tests/phase2/virtual_ovs_bridge_vlan_in_guest.py b/recipes/regression_tests/phase2/virtual_ovs_bridge_vlan_in_guest.py
index 89c3469..fc1f015 100644
--- a/recipes/regression_tests/phase2/virtual_ovs_bridge_vlan_in_guest.py
+++ b/recipes/regression_tests/phase2/virtual_ovs_bridge_vlan_in_guest.py
@@ -138,8 +138,8 @@ for offload in offloads:
result_tcp.set_parameter(offload, state)
if product_name is not None:
result_tcp.set_tag(product_name)
- res_hash = result_tcp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_tcp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_tcp.set_tag(res_hash)
baseline = None
@@ -158,8 +158,8 @@ for offload in offloads:
result_udp.set_parameter(offload, state)
if product_name is not None:
result_udp.set_tag(product_name)
- res_hash = result_udp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_udp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_udp.set_tag(res_hash)
baseline = None
@@ -214,8 +214,8 @@ for offload in offloads:
result_tcp.set_parameter(offload, state)
if product_name is not None:
result_tcp.set_tag(product_name)
- res_hash = result_tcp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_tcp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_tcp.set_tag(res_hash)
baseline = None
@@ -235,8 +235,8 @@ for offload in offloads:
result_udp.set_parameter(offload, state)
if product_name is not None:
result_udp.set_tag(product_name)
- res_hash = result_udp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_udp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_udp.set_tag(res_hash)
baseline = None
diff --git a/recipes/regression_tests/phase2/virtual_ovs_bridge_vlan_in_host.py b/recipes/regression_tests/phase2/virtual_ovs_bridge_vlan_in_host.py
index d15f2be..5a6ec5f 100644
--- a/recipes/regression_tests/phase2/virtual_ovs_bridge_vlan_in_host.py
+++ b/recipes/regression_tests/phase2/virtual_ovs_bridge_vlan_in_host.py
@@ -137,8 +137,8 @@ for offload in offloads:
result_tcp.set_parameter(offload, state)
if product_name is not None:
result_tcp.set_tag(product_name)
- res_hash = result_tcp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_tcp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_tcp.set_tag(res_hash)
baseline = None
@@ -157,8 +157,8 @@ for offload in offloads:
result_udp.set_parameter(offload, state)
if product_name is not None:
result_udp.set_tag(product_name)
- res_hash = result_udp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_udp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_udp.set_tag(res_hash)
baseline = None
@@ -212,8 +212,8 @@ for offload in offloads:
result_tcp.set_parameter(offload, state)
if product_name is not None:
result_tcp.set_tag(product_name)
- res_hash = result_tcp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_tcp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_tcp.set_tag(res_hash)
baseline = None
@@ -233,8 +233,8 @@ for offload in offloads:
result_udp.set_parameter(offload, state)
if product_name is not None:
result_udp.set_tag(product_name)
- res_hash = result_udp.generate_hash(['kernel-release',
- 'redhat-release'])
+ res_hash = result_udp.generate_hash(['kernel_release',
+ 'redhat_release'])
result_udp.set_tag(res_hash)
baseline = None
--
2.5.0
8 years, 7 months
[PATCH 1/5] Remove get_ip() method from HostAPI
by Jiri Prochazka
This method is redundant, since we have the same method from InterfaceAPI
Signed-off-by: Jiri Prochazka <jprochaz(a)redhat.com>
---
lnst/Controller/Task.py | 16 ----------------
1 file changed, 16 deletions(-)
diff --git a/lnst/Controller/Task.py b/lnst/Controller/Task.py
index 0d437f3..fdf4a0e 100644
--- a/lnst/Controller/Task.py
+++ b/lnst/Controller/Task.py
@@ -285,22 +285,6 @@ class HostAPI(object):
iface = self._interfaces[interface_id]
return iface.get_hwaddr()
- def get_ip(self, interface_id, addr_number=0):
- """
- Returns an IP address of the interface.
-
- :param interface_id: which interface
- :type interface_id: string
-
- :param interface_id: which address
- :type interface_id: int
-
- :return: IP address (e.g., 192.168.1.10).
- :rtype: str
- """
- iface = self._interfaces[interface_id]
- return iface.get_ip_addr(addr_number)
-
def get_prefix(self, interface_id, addr_number=0):
"""
Returns an IP address prefix (netmask)
--
2.4.3
8 years, 7 months
[PATCH v2] Refactorization of LNST Pool Wizard
by Jiri Prochazka
Removed MessageDispatcherLite.py
lnst-pool-wizard
+ Make pep8 compliant
+ Print error messages on stderr
+ Changes correspoding with Wizard.py refactorization
+ Remove blank line in help
Wizard.py
+ Make pep8 compliant
+ Most of the methods reworked to be more clean and readable
+ Setup for implementation of support for virtual machines
+ Removed WizardException
Closes #129
Signed-off-by: Jiri Prochazka <jprochaz(a)redhat.com>
---
lnst-pool-wizard | 55 ++--
lnst/Controller/MessageDispatcherLite.py | 66 -----
lnst/Controller/Wizard.py | 423 +++++++++++++++++++++----------
3 files changed, 331 insertions(+), 213 deletions(-)
delete mode 100644 lnst/Controller/MessageDispatcherLite.py
diff --git a/lnst-pool-wizard b/lnst-pool-wizard
index c788688..d7ad506 100755
--- a/lnst-pool-wizard
+++ b/lnst-pool-wizard
@@ -17,48 +17,67 @@ import getopt
RETVAL_PASS = 0
RETVAL_ERR = 1
-def help(retval = 0):
+
+def help(retval=0):
print "Usage:\n"\
" lnst-pool-wizard [mode] [hostname[:port]]\n"\
"\n"\
"Modes:\n"\
- " -h, --help display this help text and exit\n"\
- " -i, --interactive start wizard in interactive mode (this "\
- "is default mode)\n"\
- " -n, --noninteractive start wizard in noninteractive mode\n"\
+ " -h, --help display this help text and exit\n"\
+ " -p, --pool_dir <directory> set the pool dir (works both in) "\
+ "interactive and noninteractive mode\n"\
+ " -i, --interactive start wizard in interactive mode (this "\
+ "is default mode)\n"\
+ " -n, --noninteractive start wizard in noninteractive mode\n"\
"Examples:\n"\
" lnst-pool-wizard --interactive\n"\
" lnst-pool-wizard --noninteractive 192.168.122.2\n"\
- " lnst-pool-wizard -n 192.168.122.2:8888 192.168.122.3:9999 192.168.122.4\n"
+ " lnst-pool-wizard -n 192.168.122.2:8888 192.168.122.4\n"\
+ " lnst-pool-wizard -p \".pool/\" -n 192.168.1.1:8877 192.168.122.4"
sys.exit(retval)
def main():
try:
opts, args = getopt.getopt(
- sys.argv[1:],
- "hin",
- ["help", "interactive", "noninteractive"]
+ sys.argv[1:],
+ "hinp:",
+ ["help", "interactive", "noninteractive", "pool_dir="]
)
except getopt.GetoptError as err:
- print str(err)
+ sys.stderr.write(str(err))
help(RETVAL_ERR)
- wizard = Wizard()
- for opt, arg in opts:
+
+ pool_dir= None
+ mode = "interactive"
+
+ for opt, arg in opts:
if opt in ("-h", "--help"):
help()
elif opt in ("-i", "--interactive"):
- wizard.interactive()
- sys.exit(RETVAL_PASS)
+ mode = "interactive"
elif opt in ("-n", "--noninteractive"):
if not args:
- print "No hostname entered!"
+ sys.stderr.write("No hostnames entered\n")
return RETVAL_ERR
- wizard.noninteractive(args)
- sys.exit(RETVAL_PASS)
+ else:
+ hostlist = args
+ mode = "noninteractive"
+ elif opt in ("-p", "--pool_dir"):
+ if not arg:
+ sys.stderr.write("No pool directory specified\n")
+ else:
+ pool_dir = arg
else:
help(RETVAL_ERR)
- wizard.interactive()
+
+ w = Wizard()
+
+ if mode == "noninteractive":
+ w.noninteractive(hostlist, pool_dir)
+ else:
+ w.interactive(pool_dir)
+
sys.exit(RETVAL_PASS)
diff --git a/lnst/Controller/MessageDispatcherLite.py b/lnst/Controller/MessageDispatcherLite.py
deleted file mode 100644
index 2973763..0000000
--- a/lnst/Controller/MessageDispatcherLite.py
+++ /dev/null
@@ -1,66 +0,0 @@
-"""
-This module defines MessageDispatcherLite class which is derived from
-lnst.NetTestController.MessageDispatcher.
-
-Copyright 2011 Red Hat, Inc.
-Licensed under the GNU General Public License, version 2 as
-published by the Free Software Foundation; see COPYING for details.
-"""
-
-__author__ = """
-jpirko(a)redhat.com (Jiri Pirko)
-"""
-
-from lnst.Common.ConnectionHandler import send_data
-from lnst.Common.ConnectionHandler import ConnectionHandler
-from lnst.Controller.NetTestController import NetTestError
-
-class MessageDispatcherLite(ConnectionHandler):
- def __init__(self):
- super(MessageDispatcherLite, self).__init__()
-
- def add_slave(self, machine, connection):
- self.add_connection(1, connection)
-
- def send_message(self, machine_id, data):
- soc = self.get_connection(1)
-
- if send_data(soc, data) == False:
- msg = "Connection error from slave %s" % str(1)
- raise NetTestError(msg)
-
- def wait_for_result(self, machine_id):
- wait = True
- while wait:
- connected_slaves = self._connection_mapping.keys()
-
- messages = self.check_connections()
-
- remaining_slaves = self._connection_mapping.keys()
-
- for msg in messages:
- if msg[1]["type"] == "result" and msg[0] == 1:
- wait = False
- result = msg[1]["result"]
- else:
- self._process_message(msg)
-
- if connected_slaves != remaining_slaves:
- disconnected_slaves = set(connected_slaves) -\
- set(remaining_slaves)
- msg = "Slaves " + str(list(disconnected_slaves)) + \
- " disconnected from the controller."
- raise NetTestError(msg)
-
- return result
-
- def _process_message(self, message):
- if message[1]["type"] == "log":
- pass
- else:
- msg = "Unknown message type: %s" % message[1]["type"]
- raise NetTestError(msg)
-
- def disconnect_slave(self, machine_id):
- soc = self.get_connection(machine_id)
- self.remove_connection(soc)
diff --git a/lnst/Controller/Wizard.py b/lnst/Controller/Wizard.py
index c38aae5..96ee641 100644
--- a/lnst/Controller/Wizard.py
+++ b/lnst/Controller/Wizard.py
@@ -1,7 +1,7 @@
"""
-Wizard class for creating machine pool .xml files
+Wizard class for creating slave machine config files
-Copyright 2014 Red Hat Inc.
+Copyright 2015 Red Hat Inc.
Licensed under the GNU General Public Licence, version 2 as
published by the Free Software Foundation; see COPYING for details.
"""
@@ -9,150 +9,196 @@ published by the Free Software Foundation; see COPYING for details.
__author__ = """
jprochaz(a)redhat.com (Jiri Prochazka)
"""
+
import socket
import sys
+import time
import os
-from lnst.Controller.Machine import Machine
-from lnst.Controller.MessageDispatcherLite import MessageDispatcherLite
-from lnst.Common.NetUtils import test_tcp_connection
from lnst.Common.Utils import mkdir_p
from lnst.Common.Config import DefaultRPCPort
+from lnst.Common.ConnectionHandler import send_data, recv_data
from xml.dom.minidom import getDOMImplementation
+DefaultPoolDir = os.path.expanduser("~/.lnst/pool/")
+PATH_IS_DIR_ACCESSIBLE = 0
+PATH_IS_DIR_NOT_ACCESSIBLE = 1
+PATH_DOES_NOT_EXIST = 2
+PATH_NOT_DIR = 3
+
+
class Wizard:
- def __init__(self):
- self._msg_dispatcher = MessageDispatcherLite()
- self._pool_dir = os.path.expanduser("~/.lnst/pool")
- def interactive(self):
+ def interactive(self, pool_dir=None):
+ """ Starts Wizard in an interactive mode
+ @param pool_dir Path to pool directory (optional)
"""
- Starts Wizard in interactive mode. Wizard requests hostname and port
- from user, tests connectivity to entered host, then he tries to connect
- and configure slave on host machine, and finally he requests list of
- ethernet interfaces in state DOWN. Then he writes them into .xml file
- named by user. User can choose which interfaces should be added to the
- .xml file.
- """
-
- pool_dir = raw_input("Enter path to pool directory "\
- "(default: ~/.lnst/pool): ")
- if pool_dir != "":
- self._pool_dir = os.path.expanduser(pool_dir)
- print "Pool directory set to %s" % self._pool_dir
+ if pool_dir is None:
+ pool_dir = self._query_pool_dir()
+ else:
+ rv = self._check_path(pool_dir)
+ if rv == PATH_IS_DIR_ACCESSIBLE:
+ print("Pool directory set to '%s'" % pool_dir)
+ elif rv == PATH_DOES_NOT_EXIST:
+ sys.stderr.write("Path '%s' does not exist\n" % pool_dir)
+ pool_dir = self._query_pool_dir()
+ elif rv == PATH_NOT_DIR:
+ sys.stderr.write("Path '%s' exists but is not a directory\n"
+ % pool_dir)
+ pool_dir = self._query_pool_dir()
+ elif rv == PATH_IS_DIR_NOT_ACCESSIBLE:
+ sys.stderr.write("Directory '%s' is not writable\n" % pool_dir)
+ pool_dir = self._query_pool_dir()
while True:
- while True:
- hostname = raw_input("Enter hostname: ")
- try:
- # Tests if hostname is translatable into IP address
- socket.gethostbyname(hostname)
- break
- except:
- sys.stderr.write("Hostname is not translatable into valid"\
- " IP address.\n")
+ hostname = self._query_hostname()
+ port = self._query_port()
+
+ sock = self._get_connection(hostname, port)
+ if sock is None:
+ if self._query_continuation():
continue
- while True:
- port = raw_input("Enter port(default: 9999): ")
- if port == "":
- port = DefaultRPCPort
- try:
- port = int(port)
+ else:
break
- except:
- sys.stderr.write("Invalid port.")
- continue
- msg = self._get_suitable_interfaces(socket.gethostbyname(hostname),\
- port)
- if msg:
- self._write_to_xml(msg, hostname, port, "interactive")
- next_machine = raw_input("Do you want to add another machine? "\
- "[Y/n]: ")
- if next_machine.lower() == 'y' or next_machine == "":
+
+ machine_interfaces = self._get_machine_interfaces(sock)
+ sock.close()
+
+ if machine_interfaces == {}:
+ sys.stderr.write("No suitable interfaces found on the host "
+ "'%s:%s'\n" % (hostname, port))
+ elif machine_interfaces is not None:
+ filename = self._query_filename(hostname)
+ self._create_xml(machine_interfaces, hostname,
+ port, pool_dir, filename, "interactive")
+ if self._query_continuation():
continue
else:
break
- return
- def noninteractive(self, hostlist):
- """
- Starts Wizard in noninteractive mode. Wizard gets list of hosts and
- ports as arguments. He tries to connect and get info about suitable
- interfaces for each of the hosts. Noninteractive mode does not prompt
- user about anything, it automatically adds all suitable interfaces into
- .xml file named the same as the hostname of the selected machine.
+ def noninteractive(self, hostlist, pool_dir):
+ """ Starts Wizard in noninteractive mode
+ @param hostlist List of hosts (mandatory)
+ @param pool_dir Path to pool_directory (optional)
"""
- self._mode = "noninteractive"
+ if pool_dir is None:
+ pool_dir = DefaultPoolDir
+
+ rv = self._check_path(pool_dir)
+ if rv == PATH_IS_DIR_ACCESSIBLE:
+ print("Pool directory set to '%s'" % pool_dir)
+ elif rv == PATH_DOES_NOT_EXIST:
+ sys.stderr.write("Path '%s' does not exist\n" % pool_dir)
+ pool_dir = self._create_dir(pool_dir)
+ if pool_dir is None:
+ sys.stderr.write("Pool wizard aborted\n")
+ return
+ elif rv == PATH_NOT_DIR:
+ sys.stderr.write("Path '%s' exists but is not a directory\n"
+ % pool_dir)
+ sys.stderr.write("Pool wizard aborted\n")
+ return
+ elif rv == PATH_IS_DIR_NOT_ACCESSIBLE:
+ sys.stderr.write("Directory '%s' is not writable\n" % pool_dir)
+ sys.stderr.write("Pool wizard aborted\n")
+ return
+
for host in hostlist:
- # Checks if port was entered along with hostname
+ print("Processing host '%s'" % host)
+ # Check if port was entered along with hostname
if host.find(":") != -1:
- hostname = host.split(':')[0]
- try:
- port = int(host.split(':')[1])
- except:
- port = DefaultRPCPort
+ hostname = host.split(":")[0]
+ if hostname == "":
+ msg = "'%s' does not contain valid hostname\n" % host
+ sys.stderr.write(msg)
+ sys.stderr.write("Skipping host '%s'\n" % host)
+ continue
+ try:
+ port = int(host.split(":")[1])
+ except:
+ port = DefaultRPCPort
+ msg = "Invalid port entered, "\
+ "using '%s' instead\n" % port
+ sys.stderr.write(msg)
else:
hostname = host
port = DefaultRPCPort
- msg = self._get_suitable_interfaces(hostname, port)
- if not msg:
+
+ if not self._check_hostname(hostname):
+ sys.stderr.write("Hostname '%s' is not translatable into a "
+ "valid IP address\n" % hostname)
+ sys.stderr.write("Skipping host '%s'\n" % host)
continue
- self._write_to_xml(msg, hostname, port, "noninteractive")
- def _get_suitable_interfaces(self, hostname, port):
- """
- Calls all functions, which are used by both interactive and
- noninteractive mode to get list of suitable interfaces. The list is
- saved to variable msg.
- """
- if not test_tcp_connection(hostname, port):
- sys.stderr.write("Host destination '%s:%s' unreachable.\n"
- % (hostname, port))
- return False
- if not self._connect_and_configure_machine(hostname, port):
- return False
- msg = self._get_device_ifcs(hostname, port)
- self._msg_dispatcher.disconnect_slave(1)
- return msg
+ sock = self._get_connection(hostname, port)
+ if sock is None:
+ sys.stderr.write("Skipping host '%s'\n" % host)
+ continue
- def _get_device_ifcs(self, hostname, port):
- """
- Sends RPC call request to Slave to call function get_devices, which
- returns list of ethernet devices which are in state DOWN.
- """
- msg = self._machine._rpc_call("get_devices")
- if msg == {}:
- sys.stderr.write("No suitable interfaces found on the slave "\
- "'%s:%s'.\n" % (hostname, port))
- return False
- return msg
+ machine_interfaces = self._get_machine_interfaces(sock)
+ sock.close()
- def _connect_and_configure_machine(self, hostname, port):
- """
- Connects to Slave and configures it
+ if machine_interfaces is {}:
+ sys.stderr.write("No suitable interfaces found on the host "
+ "'%s:%s'\n" % (hostname, port))
+ continue
+ elif machine_interfaces is None:
+ continue
+ else:
+ filename = hostname + ".xml"
+ self._create_xml(machine_interfaces, hostname,
+ port, pool_dir, filename, "noninteractive")
+
+ def _check_hostname(self, hostname):
+ """ Checks hostnames translatibility
+ @param hostname Hostname which is checked whether it's valid
+ @return True if valid hostname was entered, False otherwise
"""
try:
- self._machine = Machine(1, hostname, None, port)
- self._machine.set_rpc(self._msg_dispatcher)
- self._machine.configure("MachinePoolWizard")
+ # Test if hostname is translatable into IP address
+ socket.gethostbyname(hostname)
return True
except:
- sys.stderr.write("Remote machine '%s:%s' configuration failed!\n"
- % (hostname, port))
- self._msg_dispatcher.disconnect_slave(1)
return False
- def _write_to_xml(self, msg, hostname, port, mode):
+ def _check_path(self, pool_dir):
+ """ Checks if path exists, is dir and is accessible by user
+ @param pool_dir Path to checked directory
+ @return True if user can write in entered directory, False otherwise
"""
- Used for writing desired output into .xml file. In interactive mode,
- user is prompted for every interface, in noninteractive mode all
- interfaces are automatically added to the .xml file.
+ if not os.path.exists(pool_dir):
+ return PATH_DOES_NOT_EXIST
+ if os.path.isdir(pool_dir):
+ if os.access(pool_dir, os.W_OK):
+ return PATH_IS_DIR_ACCESSIBLE
+ else:
+ return PATH_IS_DIR_NOT_ACCESSIBLE
+ else:
+ return PATH_NOT_DIR
+
+ def _create_dir(self, pool_dir):
+ """ Creates specified directory
+ @param pool_dir Directory to be created
+ @return Path to dir which was created, None if no directory was created
+ """
+ try:
+ mkdir_p(pool_dir)
+ print("Dir '%s' has been created" % pool_dir)
+ return pool_dir
+ except:
+ sys.stderr.write("Failed creating dir")
+ return None
+
+ def _create_xml(self, machine_interfaces, hostname,
+ port, pool_dir, filename, mode):
+ """ Creates slave machine XML file
+ @param machine_interfaces Dictionary with machine's interfaces
+ @param hostname Hostname of the machine
+ @param port Port on which LNST listens on the machine
+ @param pool_dir Path to directory where XML file will be created
+ @param filename Name of the XML file
+ @param mode Mode in which wizard was started
"""
- if mode == "interactive":
- output_file = raw_input("Enter the name of the output .xml file "\
- "(without .xml, default is hostname.xml): ")
- if mode == "noninteractive" or output_file == "":
- output_file = hostname
impl = getDOMImplementation()
doc = impl.createDocument(None, "slavemachine", None)
@@ -166,42 +212,161 @@ class Wizard:
interfaces_el = doc.createElement("interfaces")
top_el.appendChild(interfaces_el)
- devices_added = 0
- for interface in msg.itervalues():
- if mode == 'interactive':
+ interfaces_added = 0
+ for iface in machine_interfaces.itervalues():
+ if mode == "interactive":
answer = raw_input("Do you want to add interface '%s' (%s) "
- "to the recipe? [Y/n]" % (interface['name'],
- interface['hwaddr']))
- if mode == "noninteractive" or answer.lower() == 'y'\
+ "to the recipe? [Y/n]: " % (iface["name"],
+ iface["hwaddr"]))
+ if mode == "noninteractive" or answer.lower() == "y"\
or answer == "":
- devices_added += 1
+ interfaces_added += 1
eth_el = doc.createElement("eth")
- eth_el.setAttribute("id", interface['name'])
+ eth_el.setAttribute("id", iface["name"])
eth_el.setAttribute("label", "default_network")
interfaces_el.appendChild(eth_el)
params_el = doc.createElement("params")
eth_el.appendChild(params_el)
param_el = doc.createElement("param")
param_el.setAttribute("name", "hwaddr")
- param_el.setAttribute("value", interface['hwaddr'])
+ param_el.setAttribute("value", iface["hwaddr"])
params_el.appendChild(param_el)
- if devices_added == 0:
- sys.stderr.write("You didn't add any interface, no file '%s.xml' "\
- "will be created!\n" % output_file)
+ if interfaces_added == 0:
+ sys.stderr.write("You didn't add any interface, no file "
+ "'%s' will be created\n" % filename)
return
- mkdir_p(self._pool_dir)
try:
- f = open(self._pool_dir + "/" + output_file + ".xml", 'w')
+ f = open(pool_dir + "/" + filename, "w")
f.write(doc.toprettyxml())
f.close()
except:
- sys.stderr.write("File '%s.xml' could not be opened "\
- "or data written." % output_file+"\n")
- raise WizardException()
+ msg = "File '%s/%s' could not be opened or data written\n"\
+ % (pool_dir, filename)
+ sys.stderr.write(msg)
+ return
+
+ print("File '%s' successfuly created" % filename)
+
+ def _get_connection(self, hostname, port):
+ """ Connects to machine
+ @param hostname Hostname of the machine
+ @param port Port of the machine
+ @return Connected socket if connection was successful, None otherwise
+ """
+ try:
+ sock = socket.create_connection((hostname, port))
+ return sock
+ except socket.error:
+ sys.stderr.write("Connection to remote host '%s:%s' failed\n"
+ % (hostname, port))
+ return None
+
+ def _get_machine_interfaces(self, sock):
+ """ Gets machine interfaces via RPC call
+ @param sock Socket used for connecting to machine
+ @return Dictionary with machine interfaces or None if RPC call fails
+ """
+ msg = {"type": "command", "method_name": "get_devices", "args": {}}
+ if not send_data(sock, msg):
+ sys.stderr.write("Could not send request to slave machine\n")
+ return None
+
+ while True:
+ data = recv_data(sock)
+ if data["type"] == "result":
+ return data["result"]
+
+ def _query_continuation(self):
+ """ Queries user for adding next machine
+ @return True if user wants to add another machine, False otherwise
+ """
+ answer = raw_input("Do you want to add another machine? [Y/n]: ")
+ if answer.lower() == "y" or answer == "":
+ return True
+ else:
+ return False
+
+ def _query_dir_creation(self, pool_dir):
+ """ Queries user for creating specified directory
+ @return True if user wants to create the directory, False otherwise
+ """
+ answer = raw_input("Create dir '%s'? [Y/n]: " % pool_dir)
+ if answer.lower() == 'y' or answer == "":
+ return True
+ else:
+ return False
+
+ def _query_filename(self, hostname):
+ """ Queries user for name of the file
+ @hostname Hostname of the machine which is used as default filename
+ @return Name of the file with .xml extension
+ """
+ output_file = raw_input("Enter the name of the output .xml file "
+ "(without .xml, default is '%s.xml'): "
+ % hostname)
+ if output_file == "":
+ return hostname + ".xml"
+ else:
+ return output_file + ".xml"
+
+ def _query_hostname(self):
+ """ Queries user for hostname
+ @return Valid (is translatable to an IP address) hostname
+ """
+ while True:
+ hostname = raw_input("Enter hostname: ")
+ if hostname == "":
+ sys.stderr.write("No hostname entered\n")
+ continue
+ if self._check_hostname(hostname):
+ return hostname
+ else:
+ sys.stderr.write("Hostname '%s' is not translatable into a "
+ "valid IP address\n" % hostname)
- print "File '%s.xml' successfuly created." % output_file
+ def _query_pool_dir(self):
+ """ Queries user for pool directory
+ @return Valid (is writable by user) path to directory
+ """
+ while True:
+ pool_dir = raw_input("Enter path to a pool directory "
+ "(default: '%s'): " % DefaultPoolDir)
+ if pool_dir == "":
+ pool_dir = DefaultPoolDir
+
+ pool_dir = os.path.expanduser(pool_dir)
+ rv = self._check_path(pool_dir)
+ if rv == PATH_IS_DIR_ACCESSIBLE:
+ print("Pool directory set to '%s'" % pool_dir)
+ return pool_dir
+ elif rv == PATH_DOES_NOT_EXIST:
+ sys.stderr.write("Path '%s' does not exist\n"
+ % pool_dir)
+ if self._query_dir_creation(pool_dir):
+ created_dir = self._create_dir(pool_dir)
+ if created_dir is not None:
+ return created_dir
-class WizardException(Exception):
- pass
+ elif rv == PATH_NOT_DIR:
+ sys.stderr.write("Path '%s' exists but is not a directory\n"
+ % pool_dir)
+ elif rv == PATH_IS_DIR_NOT_ACCESSIBLE:
+ sys.stderr.write("Directory '%s' is not writable\n"
+ % pool_dir)
+
+ def _query_port(self):
+ """ Queries user for port
+ @return Integer representing port
+ """
+ while True:
+ port = raw_input("Enter port (default: %d): " % DefaultRPCPort)
+ if port == "":
+ return DefaultRPCPort
+ else:
+ try:
+ port = int(port)
+ return port
+ except:
+ sys.stderr.write("Invalid port entered\n")
--
2.4.3
8 years, 7 months
[PATCH v3 1/5] Slave: add get_device_by_params to InterfaceManager
by Jan Tluka
Method get_device_by_params searches for device that matches provided
parameters.
Signed-off-by: Jan Tluka <jtluka(a)redhat.com>
---
lnst/Slave/InterfaceManager.py | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/lnst/Slave/InterfaceManager.py b/lnst/Slave/InterfaceManager.py
index 09f3be9..439ced4 100644
--- a/lnst/Slave/InterfaceManager.py
+++ b/lnst/Slave/InterfaceManager.py
@@ -157,6 +157,21 @@ class InterfaceManager(object):
return dev
return None
+ def get_device_by_params(self, params):
+ matched = None
+ for dev in self._devices.values():
+ matched = dev
+ dev_data = dev.get_if_data()
+ for key, value in params.iteritems():
+ if key not in dev_data or dev_data[key] != value:
+ matched = None
+ break
+
+ if matched:
+ break
+
+ return matched
+
def deconfigure_all(self):
for dev in self._devices.itervalues():
dev.clear_configuration()
--
2.1.0
8 years, 7 months