[Ovirt-devel] [PATCH 5/5] Sample code that shows how to use the API
Scott Seago
sseago at redhat.com
Thu Aug 7 20:51:55 UTC 2008
David Lutterkort wrote:
> ---
> wui/client/bin/ovirt-cli | 104 ++++++++++++++++++++++++++++++++++++++++++++++
> wui/client/lib/ovirt.rb | 63 ++++++++++++++++++++++++++++
> 2 files changed, 167 insertions(+), 0 deletions(-)
> create mode 100755 wui/client/bin/ovirt-cli
> create mode 100644 wui/client/lib/ovirt.rb
>
> diff --git a/wui/client/bin/ovirt-cli b/wui/client/bin/ovirt-cli
> new file mode 100755
> index 0000000..cfb4697
> --- /dev/null
> +++ b/wui/client/bin/ovirt-cli
> @@ -0,0 +1,104 @@
> +#! /usr/bin/ruby
> +
> +# This is not really a CLI, it's just an example how
> +# the API can be used for a variety of tasks
> +# Eventually, this needs to be replaced by the real CLI
> +
> +# Run this on any machine that has activeresource installed. Since there is
> +# no support for authentication yet, you need to connect to Mongrel
> +# directly (and therefore expose port 3000 on the OVirt Server to the wider
> +# network)
> +
> +require 'pp'
> +require 'rubygems'
> +require 'activeresource'
> +require 'optparse'
> +
> +require 'ovirt'
> +
> +def move_random_host(hosts, pool)
> + host = hosts[rand(hosts.size)]
> + puts "Move #{host.hostname} to #{pool.name}"
> + pool.hosts << host
> + pool.save
> +end
> +
> +def element_path(obj)
> + "[#{obj.class.element_path(obj.id)}]"
> +end
> +
> +def print_pool(pool)
> + puts "\n\nPool #{pool.name}: #{pool.hosts.size} hosts, #{pool.storage_pools.size} storage pools #{element_path(pool)} "
> + puts "=" * 75
> + pool.hosts.each do |h|
> + printf "%-36s %s\n", h.hostname, element_path(h)
> + end
> + pool.storage_pools.each do |sp|
> + type = sp.nfs? ? "NFS" : "iSCSI"
> + printf "%-5s %-30s %s\n", type, sp.label, element_path(sp)
> + end
> + puts "-" * 75
> +end
> +
> +# Plumbing so we can find the OVirt server
> +# "http://ovirt.watzmann.net:3000/ovirt/rest"
> +OVirt::Base.site = ENV["OVIRT_SERVER"]
> +opts = OptionParser.new("ovirt-cli GLOBAL_OPTS")
> +opts.separator(" Run some things against an OVirt server")
> +opts.separator("")
> +opts.separator "Global options:"
> +opts.on("-s", "--server=URL", "The OVirt server. Since there is no auth\n" +
> + "#{" "*37}yet, must be the mongrel server port.\n" +
> + "#{" "*37}Overrides env var OVIRT_SERVER") do |val|
> + OVirt::Base.site = val
> +end
> +
> +opts.order(ARGV)
> +
> +unless OVirt::Base.site
> + $stderr.puts <<EOF
> +You must specify the OVirt server to connect to, either with the
> +--server option or through the OVIRT_SERVER environment variable
> +EOF
> + exit 1
> +end
> +
> +# Get a single host by name
> +host = OVirt::Host.find_by_hostname("node3.priv.ovirt.org")
> +puts "#{host.uuid} has id #{host.id}"
> +
> +# What's in the default pool
> +defpool = OVirt::HardwarePool.default_pool
> +print_pool(defpool)
> +
> +# Create a new hardware pool
> +mypool = OVirt::HardwarePool.find_by_path("/default/mypool")
> +unless mypool
> + puts "Create mypool"
> + mypool = OVirt::HardwarePool.create( { :parent_id => defpool.id,
> + :name => "mypool" } )
> +end
> +
> +# Move some hosts around
> +puts
> +if defpool.hosts.size > 1
> + move_random_host(defpool.hosts, mypool)
> +elsif mypool.hosts.size > 0
> + move_random_host(mypool.hosts, defpool)
> +end
> +
> +# Delete all storage pools for mypool and add a new one
> +mypool.storage_pools.each do |sp|
> + puts "Delete storage pool #{sp.id}"
> + sp.destroy
> +end
> +
> +storage_pool = OVirt::StoragePool.create( { :storage_type => "NFS",
> + :hardware_pool_id => mypool.id,
> + :ip_addr => "192.168.122.50",
> + :export_path => "/exports/pool1" } )
> +puts "Created storage pool #{storage_pool.id}"
> +
> +# For some reason, mypool.reload doesn't work here
> +mypool = OVirt::HardwarePool.find_by_path("/default/mypool")
> +print_pool(mypool)
> diff --git a/wui/client/lib/ovirt.rb b/wui/client/lib/ovirt.rb
> new file mode 100644
> index 0000000..48739f4
> --- /dev/null
> +++ b/wui/client/lib/ovirt.rb
> @@ -0,0 +1,63 @@
> +require 'pp'
> +require 'rubygems'
> +require 'activeresource'
> +
> +module OVirt
> + class Base < ActiveResource::Base ; end
> +
> + class HardwarePool < Base
> + def self.find_by_path(path)
> + find(:first, :params => { :path => path })
> + end
> +
> + def self.default_pool
> + find(:first, :params => { :path => "/default" })
> + end
> + end
> +
>
We shouldn't rely on the fact that the default pool is named 'default'.
This is probably an issue with Pool.find_by_path as well. Although an
admin can't delete the default pool, he can rename it.
Pool.get_default_pool will return the right pool regardless of its name
though.
More information about the ovirt-devel
mailing list