diff options
| author | Matthew Hicks <mhicks@mhicks-host.usersys.redhat.com> | 2008-06-18 08:59:11 -0400 |
|---|---|---|
| committer | Matthew Hicks <mhicks@mhicks-host.usersys.redhat.com> | 2008-06-18 08:59:11 -0400 |
| commit | 5deac47b9722e0186e71f4c17afe03e88491e42e (patch) | |
| tree | cf717e99c1e3bbb6fc4fe3a07114696d2692f49b /func | |
| parent | 706f05deb34103db710d19c718dd7946cf0ab367 (diff) | |
| download | tools-5deac47b9722e0186e71f4c17afe03e88491e42e.tar.gz tools-5deac47b9722e0186e71f4c17afe03e88491e42e.tar.xz tools-5deac47b9722e0186e71f4c17afe03e88491e42e.zip | |
Adding a find-resource script to func
Fixing a file handle leak during virt install
Diffstat (limited to 'func')
| -rw-r--r-- | func/patches/0004-Adding-a-find_resources-script-to-look-across-minion.patch | 157 | ||||
| -rw-r--r-- | func/patches/0005-Closing-file-descriptors-during-the-virt-install-to.patch | 25 |
2 files changed, 182 insertions, 0 deletions
diff --git a/func/patches/0004-Adding-a-find_resources-script-to-look-across-minion.patch b/func/patches/0004-Adding-a-find_resources-script-to-look-across-minion.patch new file mode 100644 index 0000000..586c8c5 --- /dev/null +++ b/func/patches/0004-Adding-a-find_resources-script-to-look-across-minion.patch @@ -0,0 +1,157 @@ +From d5e3864f6965af63b3a735debc0fe0097b3b9b4d Mon Sep 17 00:00:00 2001 +From: Matthew Hicks <mhicks@mhicks-host.usersys.redhat.com> +Date: Tue, 17 Jun 2008 16:23:22 -0400 +Subject: [PATCH] Adding a find_resources script to look across minions + for enough RAM and disk space to run a 'virt install' (koan) + +- Requires the storage.py module for LVM functionality +- Requires the freemem functionality enhancement to the virt.py module +- Only allows Domain-0 shrink to 512M to keep it stable +-- Technically, Domain-0 can be shrunk to 256M which is in + accordance with how the freemem module reports available memory +--- + func/overlord/find_resources.py | 113 +++++++++++++++++++++++++++++++++++++++ + scripts/find-resources | 11 ++++ + 2 files changed, 124 insertions(+), 0 deletions(-) + create mode 100755 func/overlord/find_resources.py + create mode 100755 scripts/find-resources + +diff --git a/func/overlord/find_resources.py b/func/overlord/find_resources.py +new file mode 100755 +index 0000000..c4e30bd +--- /dev/null ++++ b/func/overlord/find_resources.py +@@ -0,0 +1,113 @@ ++## ++## Func cloud availability application. ++## Given machine requirements, returns the best ++## location in the cloud to run koan. ++## Depends on the storage and virt modules. ++## ++## Copyright 2008, Red Hat, Inc ++## Matt Hicks <mhicks@redhat.com> ++## +AUTHORS ++## ++## This software may be freely redistributed under the terms of the GNU ++## general public license. ++## ++## 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., 675 Mass Ave, Cambridge, MA 02139, USA. ++## ++ ++import os.path ++import optparse ++import sys ++import random ++import func.overlord.client as func_client ++import func.utils as utils ++ ++class FindResources(object): ++ ++ def __init__(self): ++ pass ++ ++ def run(self,args): ++ ++ p = optparse.OptionParser() ++ p.add_option("-v", "--verbose", ++ dest="verbose", ++ action="store_true", ++ help="provide extra output") ++ p.add_option("-s", "--server-spec", ++ dest="server_spec", ++ default="*", ++ help="run against specific servers, default: '*'") ++ p.add_option("-m", "--memory", ++ dest="memory", ++ default="512", ++ help="the memory requirements in megabytes, default: '512'") ++ p.add_option("-d", "--disk", ++ dest="disk", ++ default="20", ++ help="the disk storage requirements in gigabytes, default: '20'") ++ ++ (options, args) = p.parse_args(args) ++ self.options = options ++ ++ # convert the memory and storage to integers for later comparisons ++ memory = int(options.memory) ++ storage = int(options.disk) ++ ++ # see what hosts have enough RAM ++ avail_hosts = {} ++ host_freemem = func_client.Client(options.server_spec).virt.freemem() ++ for (host, freemem) in host_freemem.iteritems(): ++ if utils.is_error(freemem): ++ print "-- connection refused: %s" % host ++ continue ++ ++ # Take an additional 256M off the freemem to keep ++ # Domain-0 stable (shrinking it to 256M can cause ++ # it to crash under load) ++ if (freemem-256) >= memory: ++ avail_hosts[host] = {'memory': freemem} ++ ++ # figure out which of these machines have enough storage ++ for avail_host in avail_hosts.keys(): ++ # see what hosts have the required storage ++ host_volume_groups = func_client.Client(avail_host).storage.vgs() ++ ++ for (host, vol_groups) in host_volume_groups.iteritems(): ++ if utils.is_error(vol_groups): ++ print "-- connection refused: %s" % host ++ continue ++ ++ avail_vol_groups = [] ++ for vol_group, attrs in vol_groups.iteritems(): ++ free_space = int(float(attrs['free'][:-1])) ++ if free_space >= storage: ++ avail_vol_groups.append((vol_group, free_space)) ++ ++ if len(avail_vol_groups) > 0: ++ avail_hosts[host]['space'] = dict(avail_vol_groups) ++ else: ++ avail_hosts.pop(host) ++ ++ # Default the dest_host to nothing ++ dest_host = None ++ ++ if len(avail_hosts) > 0: ++ # Find the host that is the closest memory match ++ for (host, attrs) in avail_hosts.iteritems(): ++ # Use a random volume group ++ vol_group = random.choice(attrs['space'].keys()) ++ ++ if not dest_host: ++ dest_host = [host, vol_group, attrs['memory']] ++ else: ++ if attrs['memory'] < dest_host[2]: ++ # Use the better match ++ dest_host = [host, vol_group, attrs['memory']] ++ ++ return dest_host ++ ++if __name__ == "__main__": ++ inv = FindResources() ++ inv.run(sys.argv) +diff --git a/scripts/find-resources b/scripts/find-resources +new file mode 100755 +index 0000000..043793b +--- /dev/null ++++ b/scripts/find-resources +@@ -0,0 +1,11 @@ ++#!/usr/bin/python ++ ++import sys ++import distutils.sysconfig ++import func.overlord.find_resources as find_resources ++ ++find_res = find_resources.FindResources() ++avail_host = find_res.run(sys.argv) ++ ++if avail_host: ++ print "%s:%s" % (avail_host[0], avail_host[1]) +-- +1.5.3.6 + diff --git a/func/patches/0005-Closing-file-descriptors-during-the-virt-install-to.patch b/func/patches/0005-Closing-file-descriptors-during-the-virt-install-to.patch new file mode 100644 index 0000000..83fbc4f --- /dev/null +++ b/func/patches/0005-Closing-file-descriptors-during-the-virt-install-to.patch @@ -0,0 +1,25 @@ +From 46cdb0b777bc7c594d67e94b8e291392c9222a08 Mon Sep 17 00:00:00 2001 +From: Matthew Hicks <mhicks@mhicks-host.usersys.redhat.com> +Date: Tue, 17 Jun 2008 22:35:14 -0400 +Subject: [PATCH] Closing file descriptors during the virt install to avoid leaking them + +--- + func/minion/modules/virt.py | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/func/minion/modules/virt.py b/func/minion/modules/virt.py +index 40ae274..c4b718a 100644 +--- a/func/minion/modules/virt.py ++++ b/func/minion/modules/virt.py +@@ -236,7 +236,7 @@ class Virt(func_module.FuncModule): + if virt_path: + koan_args.append("--virt-path=%s" % virt_path) + +- rc = sub_process.call(koan_args,shell=False) ++ rc = sub_process.call(koan_args,shell=False,close_fds=True) + if rc == 0: + return 0 + else: +-- +1.5.3.6 + |
