- 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@xxxxxxxxxx> +## +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 --------------050105050603070203070104-- _______________________________________________ Func-list mailing list Func-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/func-list