From: Lucas Meneghel Rodrigues <lmr@redhat.com>
To: Michael Goldish <mgoldish@redhat.com>
Cc: autotest@test.kernel.org, kvm@vger.kernel.org
Subject: Re: [KVM-AUTOTEST PATCH 3/7] [RFC] KVM test: remove all code related to the old MAC address pool method
Date: Tue, 26 Oct 2010 10:56:24 -0200 [thread overview]
Message-ID: <1288097784.2673.2.camel@freedom> (raw)
In-Reply-To: <1287918070-4579-3-git-send-email-mgoldish@redhat.com>
On Sun, 2010-10-24 at 13:01 +0200, Michael Goldish wrote:
> This patch removes all code related to the old manual method
> (address_pools.cfg).
>
> Note that now running in TAP mode requires an external DHCP server that accepts
> *any* MAC address, because MAC addresses are randomly generated and cannot be
> manually configured.
Yes, this patch looks good. I don't think there are much DHCP servers
that do not accept any MAC address. It might be good to document this
information on the wiki though.
> Signed-off-by: Michael Goldish <mgoldish@redhat.com>
> ---
> client/tests/kvm/kvm_utils.py | 159 --------------------
> client/tests/kvm/kvm_vm.py | 34 ++---
> client/tests/kvm/tests/physical_resources_check.py | 11 +-
> client/tests/kvm/tests/stress_boot.py | 3 -
> client/tests/kvm/tests_base.cfg.sample | 2 -
> 5 files changed, 16 insertions(+), 193 deletions(-)
>
> diff --git a/client/tests/kvm/kvm_utils.py b/client/tests/kvm/kvm_utils.py
> index 778637d..f749f8d 100644
> --- a/client/tests/kvm/kvm_utils.py
> +++ b/client/tests/kvm/kvm_utils.py
> @@ -203,165 +203,6 @@ def get_mac_address(vm_instance, nic_index):
> return mac
>
>
> -def mac_str_to_int(addr):
> - """
> - Convert MAC address string to integer.
> -
> - @param addr: String representing the MAC address.
> - """
> - return sum(int(s, 16) * 256 ** i
> - for i, s in enumerate(reversed(addr.split(":"))))
> -
> -
> -def mac_int_to_str(addr):
> - """
> - Convert MAC address integer to string.
> -
> - @param addr: Integer representing the MAC address.
> - """
> - return ":".join("%02x" % (addr >> 8 * i & 0xFF)
> - for i in reversed(range(6)))
> -
> -
> -def ip_str_to_int(addr):
> - """
> - Convert IP address string to integer.
> -
> - @param addr: String representing the IP address.
> - """
> - return sum(int(s) * 256 ** i
> - for i, s in enumerate(reversed(addr.split("."))))
> -
> -
> -def ip_int_to_str(addr):
> - """
> - Convert IP address integer to string.
> -
> - @param addr: Integer representing the IP address.
> - """
> - return ".".join(str(addr >> 8 * i & 0xFF)
> - for i in reversed(range(4)))
> -
> -
> -def offset_mac(base, offset):
> - """
> - Add offset to a given MAC address.
> -
> - @param base: String representing a MAC address.
> - @param offset: Offset to add to base (integer)
> - @return: A string representing the offset MAC address.
> - """
> - return mac_int_to_str(mac_str_to_int(base) + offset)
> -
> -
> -def offset_ip(base, offset):
> - """
> - Add offset to a given IP address.
> -
> - @param base: String representing an IP address.
> - @param offset: Offset to add to base (integer)
> - @return: A string representing the offset IP address.
> - """
> - return ip_int_to_str(ip_str_to_int(base) + offset)
> -
> -
> -def get_mac_ip_pair_from_dict(dict):
> - """
> - Fetch a MAC-IP address pair from dict and return it.
> -
> - The parameters in dict are expected to conform to a certain syntax.
> - Typical usage may be:
> -
> - address_ranges = r1 r2 r3
> -
> - address_range_base_mac_r1 = 55:44:33:22:11:00
> - address_range_base_ip_r1 = 10.0.0.0
> - address_range_size_r1 = 16
> -
> - address_range_base_mac_r2 = 55:44:33:22:11:40
> - address_range_base_ip_r2 = 10.0.0.60
> - address_range_size_r2 = 25
> -
> - address_range_base_mac_r3 = 55:44:33:22:12:10
> - address_range_base_ip_r3 = 10.0.1.20
> - address_range_size_r3 = 230
> -
> - address_index = 0
> -
> - All parameters except address_index specify a MAC-IP address pool. The
> - pool consists of several MAC-IP address ranges.
> - address_index specified the index of the desired MAC-IP pair from the pool.
> -
> - @param dict: The dictionary from which to fetch the addresses.
> - """
> - index = int(dict.get("address_index", 0))
> - for mac_range_name in get_sub_dict_names(dict, "address_ranges"):
> - mac_range_params = get_sub_dict(dict, mac_range_name)
> - mac_base = mac_range_params.get("address_range_base_mac")
> - ip_base = mac_range_params.get("address_range_base_ip")
> - size = int(mac_range_params.get("address_range_size", 1))
> - if index < size:
> - return (mac_base and offset_mac(mac_base, index),
> - ip_base and offset_ip(ip_base, index))
> - index -= size
> - return (None, None)
> -
> -
> -def get_sub_pool(dict, piece, num_pieces):
> - """
> - Split a MAC-IP pool and return a single requested piece.
> -
> - For example, get_sub_pool(dict, 0, 3) will split the pool in 3 pieces and
> - return a dict representing the first piece.
> -
> - @param dict: A dict that contains pool parameters.
> - @param piece: The index of the requested piece. Should range from 0 to
> - num_pieces - 1.
> - @param num_pieces: The total number of pieces.
> - @return: A copy of dict, modified to describe the requested sub-pool.
> - """
> - range_dicts = [get_sub_dict(dict, name) for name in
> - get_sub_dict_names(dict, "address_ranges")]
> - if not range_dicts:
> - return dict
> - ranges = [[d.get("address_range_base_mac"),
> - d.get("address_range_base_ip"),
> - int(d.get("address_range_size", 1))] for d in range_dicts]
> - total_size = sum(r[2] for r in ranges)
> - base = total_size * piece / num_pieces
> - size = total_size * (piece + 1) / num_pieces - base
> -
> - # Find base of current sub-pool
> - for i in range(len(ranges)):
> - r = ranges[i]
> - if base < r[2]:
> - r[0] = r[0] and offset_mac(r[0], base)
> - r[1] = r[1] and offset_ip(r[1], base)
> - r[2] -= base
> - break
> - base -= r[2]
> -
> - # Collect ranges up to end of current sub-pool
> - new_ranges = []
> - for i in range(i, len(ranges)):
> - r = ranges[i]
> - new_ranges.append(r)
> - if size <= r[2]:
> - r[2] = size
> - break
> - size -= r[2]
> -
> - # Write new dict
> - new_dict = dict.copy()
> - new_dict["address_ranges"] = " ".join("r%d" % i for i in
> - range(len(new_ranges)))
> - for i in range(len(new_ranges)):
> - new_dict["address_range_base_mac_r%d" % i] = new_ranges[i][0]
> - new_dict["address_range_base_ip_r%d" % i] = new_ranges[i][1]
> - new_dict["address_range_size_r%d" % i] = new_ranges[i][2]
> - return new_dict
> -
> -
> def verify_ip_address_ownership(ip, macs, timeout=10.0):
> """
> Use arping and the ARP cache to make sure a given IP address belongs to one
> diff --git a/client/tests/kvm/kvm_vm.py b/client/tests/kvm/kvm_vm.py
> index f3e803b..2db916f 100755
> --- a/client/tests/kvm/kvm_vm.py
> +++ b/client/tests/kvm/kvm_vm.py
> @@ -920,21 +920,18 @@ class VM:
> logging.debug("MAC address unavailable")
> return None
> mac = mac.lower()
> - ip = None
> -
> - if not ip or nic_params.get("always_use_tcpdump") == "yes":
> - # Get the IP address from the cache
> - ip = self.address_cache.get(mac)
> - if not ip:
> - logging.debug("Could not find IP address for MAC address: "
> - "%s" % mac)
> - return None
> - # Make sure the IP address is assigned to this guest
> - macs = [self.get_mac_address(i) for i in range(len(nics))]
> - if not kvm_utils.verify_ip_address_ownership(ip, macs):
> - logging.debug("Could not verify MAC-IP address mapping: "
> - "%s ---> %s" % (mac, ip))
> - return None
> + # Get the IP address from the cache
> + ip = self.address_cache.get(mac)
> + if not ip:
> + logging.debug("Could not find IP address for MAC address: %s" %
> + mac)
> + return None
> + # Make sure the IP address is assigned to this guest
> + macs = [self.get_mac_address(i) for i in range(len(nics))]
> + if not kvm_utils.verify_ip_address_ownership(ip, macs):
> + logging.debug("Could not verify MAC-IP address mapping: "
> + "%s ---> %s" % (mac, ip))
> + return None
> return ip
> else:
> return "localhost"
> @@ -985,12 +982,7 @@ class VM:
>
> @param nic_index: Index of the NIC
> """
> - nic_name = kvm_utils.get_sub_dict_names(self.params, "nics")[nic_index]
> - nic_params = kvm_utils.get_sub_dict(self.params, nic_name)
> - if nic_params.get("address_index"):
> - return kvm_utils.get_mac_ip_pair_from_dict(nic_params)[0]
> - else:
> - return kvm_utils.get_mac_address(self.instance, nic_index)
> + return kvm_utils.get_mac_address(self.instance, nic_index)
>
>
> def free_mac_address(self, nic_index=0):
> diff --git a/client/tests/kvm/tests/physical_resources_check.py b/client/tests/kvm/tests/physical_resources_check.py
> index 6c8e154..682c7b2 100644
> --- a/client/tests/kvm/tests/physical_resources_check.py
> +++ b/client/tests/kvm/tests/physical_resources_check.py
> @@ -123,14 +123,9 @@ def run_physical_resources_check(test, params, env):
> found_mac_addresses = re.findall("macaddr=(\S+)", o)
> logging.debug("Found MAC adresses: %s" % found_mac_addresses)
>
> - nic_index = 0
> - for nic_name in kvm_utils.get_sub_dict_names(params, "nics"):
> - nic_params = kvm_utils.get_sub_dict(params, nic_name)
> - if "address_index" in nic_params:
> - mac, ip = kvm_utils.get_mac_ip_pair_from_dict(nic_params)
> - else:
> - mac = vm.get_mac_address(nic_index)
> - nic_index += 1
> + num_nics = len(kvm_utils.get_sub_dict_names(params, "nics"))
> + for nic_index in range(num_nics):
> + mac = vm.get_mac_address(nic_index)
> if not string.lower(mac) in found_mac_addresses:
> n_fail += 1
> logging.error("MAC address mismatch:")
> diff --git a/client/tests/kvm/tests/stress_boot.py b/client/tests/kvm/tests/stress_boot.py
> index 0d3ed07..b7916b4 100644
> --- a/client/tests/kvm/tests/stress_boot.py
> +++ b/client/tests/kvm/tests/stress_boot.py
> @@ -28,7 +28,6 @@ def run_stress_boot(tests, params, env):
>
> num = 2
> sessions = [session]
> - address_index = int(params.get("clone_address_index_base", 10))
>
> # boot the VMs
> while num <= int(params.get("max_vms")):
> @@ -36,7 +35,6 @@ def run_stress_boot(tests, params, env):
> # clone vm according to the first one
> vm_name = "vm" + str(num)
> vm_params = vm.get_params().copy()
> - vm_params["address_index"] = str(address_index)
> curr_vm = vm.clone(vm_name, vm_params)
> kvm_utils.env_register_vm(env, vm_name, curr_vm)
> logging.info("Booting guest #%d" % num)
> @@ -56,7 +54,6 @@ def run_stress_boot(tests, params, env):
> if se.get_command_status(params.get("alive_test_cmd")) != 0:
> raise error.TestFail("Session #%d is not responsive" % i)
> num += 1
> - address_index += 1
>
> except (error.TestFail, OSError):
> for se in sessions:
> diff --git a/client/tests/kvm/tests_base.cfg.sample b/client/tests/kvm/tests_base.cfg.sample
> index 769d750..5bca544 100644
> --- a/client/tests/kvm/tests_base.cfg.sample
> +++ b/client/tests/kvm/tests_base.cfg.sample
> @@ -54,7 +54,6 @@ guest_port_remote_shell = 22
> nic_mode = user
> #nic_mode = tap
> nic_script = scripts/qemu-ifup
> -#address_index = 0
> run_tcpdump = yes
>
> # Misc
> @@ -274,7 +273,6 @@ variants:
> type = stress_boot
> max_vms = 5
> alive_test_cmd = uname -a
> - clone_address_index_base = 10
> login_timeout = 240
> kill_vm = yes
> kill_vm_vm1 = no
prev parent reply other threads:[~2010-10-26 12:56 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-10-24 11:01 [KVM-AUTOTEST PATCH 1/7] KVM test: simplify MAC address management Michael Goldish
2010-10-24 11:01 ` [KVM-AUTOTEST PATCH 2/7] KVM test: VM.get_address(): fix handling of multiple NICs Michael Goldish
2010-10-24 11:01 ` [KVM-AUTOTEST PATCH 3/7] [RFC] KVM test: remove all code related to the old MAC address pool method Michael Goldish
2010-10-24 11:01 ` [KVM-AUTOTEST PATCH 4/7] KVM test: get_ifname(): use self.instance instead of self.vnc_port Michael Goldish
2010-10-24 11:01 ` [KVM-AUTOTEST PATCH 5/7] KVM test: kvm_monitor.py: replace MonitorSendError with MonitorSocketError Michael Goldish
2010-10-24 11:01 ` [KVM-AUTOTEST PATCH 6/7] KVM test: refactor migration code Michael Goldish
2010-10-24 11:01 ` [KVM-AUTOTEST PATCH 7/7] [RFC] KVM test: migrate_cancel: allow for alternative spellings of 'cancelled' Michael Goldish
2010-10-26 13:08 ` Lucas Meneghel Rodrigues
2010-10-26 12:56 ` Lucas Meneghel Rodrigues [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1288097784.2673.2.camel@freedom \
--to=lmr@redhat.com \
--cc=autotest@test.kernel.org \
--cc=kvm@vger.kernel.org \
--cc=mgoldish@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox