summaryrefslogtreecommitdiffstats
path: root/func
diff options
context:
space:
mode:
authorMatthew Hicks <mhicks@mhicks-host.usersys.redhat.com>2008-06-18 08:59:11 -0400
committerMatthew Hicks <mhicks@mhicks-host.usersys.redhat.com>2008-06-18 08:59:11 -0400
commit5deac47b9722e0186e71f4c17afe03e88491e42e (patch)
treecf717e99c1e3bbb6fc4fe3a07114696d2692f49b /func
parent706f05deb34103db710d19c718dd7946cf0ab367 (diff)
downloadtools-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.patch157
-rw-r--r--func/patches/0005-Closing-file-descriptors-during-the-virt-install-to.patch25
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
+