[Ovirt-devel] [PATCH] Ruby interface for Cobbler XML-RPC APIs.

Darryl L. Pierce dpierce at redhat.com
Thu Jul 31 21:25:32 UTC 2008


The interface is stored in a module named Cobbler.
Examples for using the interface are stored in ./examples.

Still looking for some feedback from anybody with some experience with Ruby.
I'm now working on the save functionality. I'm playing with having each child
class declare a saving script and passing it to the cobbler_save_method code
generator. I'd like some input from anybody on that path.

Looking forward to some input. :)

Signed-off-by: Darryl L. Pierce <dpierce at redhat.com>
---
 ruby/rubygem-cobbler/Rakefile                      |   30 ++++
 ruby/rubygem-cobbler/cobbler.gemspec               |   37 +++++
 ruby/rubygem-cobbler/examples/create_system.rb     |   52 +++++++
 ruby/rubygem-cobbler/examples/has_profile.rb       |   66 +++++++++
 ruby/rubygem-cobbler/examples/has_system.rb        |   67 +++++++++
 ruby/rubygem-cobbler/examples/list_distros.rb      |   48 ++++++
 ruby/rubygem-cobbler/examples/list_profiles.rb     |   63 ++++++++
 ruby/rubygem-cobbler/examples/list_systems.rb      |   63 ++++++++
 ruby/rubygem-cobbler/examples/remove_system.rb     |   43 ++++++
 ruby/rubygem-cobbler/lib/cobbler.rb                |   25 ++++
 ruby/rubygem-cobbler/lib/cobbler/base.rb           |  150 ++++++++++++++++++++
 ruby/rubygem-cobbler/lib/cobbler/distro.rb         |   52 +++++++
 ruby/rubygem-cobbler/lib/cobbler/profile.rb        |   60 ++++++++
 ruby/rubygem-cobbler/lib/cobbler/system.rb         |   62 ++++++++
 .../nbproject/private/private.properties           |    4 +
 ruby/rubygem-cobbler/nbproject/project.properties  |   12 ++
 ruby/rubygem-cobbler/nbproject/project.xml         |   17 +++
 ruby/rubygem-cobbler/test/test_base.rb             |   51 +++++++
 ruby/rubygem-cobbler/test/test_profile.rb          |   83 +++++++++++
 19 files changed, 985 insertions(+), 0 deletions(-)
 create mode 100644 ruby/rubygem-cobbler/README
 create mode 100644 ruby/rubygem-cobbler/Rakefile
 create mode 100644 ruby/rubygem-cobbler/cobbler.gemspec
 create mode 100755 ruby/rubygem-cobbler/examples/create_system.rb
 create mode 100755 ruby/rubygem-cobbler/examples/has_profile.rb
 create mode 100755 ruby/rubygem-cobbler/examples/has_system.rb
 create mode 100755 ruby/rubygem-cobbler/examples/list_distros.rb
 create mode 100755 ruby/rubygem-cobbler/examples/list_profiles.rb
 create mode 100755 ruby/rubygem-cobbler/examples/list_systems.rb
 create mode 100755 ruby/rubygem-cobbler/examples/remove_system.rb
 create mode 100644 ruby/rubygem-cobbler/lib/cobbler.rb
 create mode 100644 ruby/rubygem-cobbler/lib/cobbler/base.rb
 create mode 100644 ruby/rubygem-cobbler/lib/cobbler/distro.rb
 create mode 100644 ruby/rubygem-cobbler/lib/cobbler/profile.rb
 create mode 100644 ruby/rubygem-cobbler/lib/cobbler/system.rb
 create mode 100644 ruby/rubygem-cobbler/nbproject/private/private.properties
 create mode 100644 ruby/rubygem-cobbler/nbproject/project.properties
 create mode 100644 ruby/rubygem-cobbler/nbproject/project.xml
 create mode 100755 ruby/rubygem-cobbler/test/test_base.rb
 create mode 100644 ruby/rubygem-cobbler/test/test_profile.rb

diff --git a/ruby/rubygem-cobbler/README b/ruby/rubygem-cobbler/README
new file mode 100644
index 0000000..e69de29
diff --git a/ruby/rubygem-cobbler/Rakefile b/ruby/rubygem-cobbler/Rakefile
new file mode 100644
index 0000000..448a67e
--- /dev/null
+++ b/ruby/rubygem-cobbler/Rakefile
@@ -0,0 +1,30 @@
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# 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., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.  A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+require 'rake'
+require 'rake/clean'
+require 'rake/testtask'
+require 'rake/gempackagetask'
+
+GEM_VERSION="1.0"
+
+Rake::TestTask.new do |task|
+  task.libs << 'test'
+  task.test_files = Dir.glob( 'test/test*.rb' )
+  task.verbose = true
+end
diff --git a/ruby/rubygem-cobbler/cobbler.gemspec b/ruby/rubygem-cobbler/cobbler.gemspec
new file mode 100644
index 0000000..5057300
--- /dev/null
+++ b/ruby/rubygem-cobbler/cobbler.gemspec
@@ -0,0 +1,37 @@
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# 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., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.  A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+ 
+require 'rubygems'
+
+spec = Gem::Specification.new do |s|
+  s.name = 'Cobbler'
+  s.version = '0.0.1'
+  s.author = 'Darryl L. Pierce'
+  s.email = 'dpierce at redhat.com'
+  s.homepage = 'http://cobbler.et.redhat.com/'
+  s.platform = Gem::Platform::RUBY
+  s.summary = 'An interface for interacting with a Cobbler server.'
+  s.files = ["lib/cobbler.rb", "lib/cobbler/system.rb"]
+  s.require_path =  "."
+  s.autorequire = "cobbler"
+end
+
+if $0 == __FILE__
+  Gem::manage_gems
+  Gem::Builder.new(spec).build
+end
\ No newline at end of file
diff --git a/ruby/rubygem-cobbler/examples/create_system.rb b/ruby/rubygem-cobbler/examples/create_system.rb
new file mode 100755
index 0000000..ead6609
--- /dev/null
+++ b/ruby/rubygem-cobbler/examples/create_system.rb
@@ -0,0 +1,52 @@
+#!/usr/bin/ruby -W0
+#
+# create_system.rb - example of using rubygem-cobbler to create a system.
+# 
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# 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., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.  A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+ 
+base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
+$LOAD_PATH << File.join(base, "lib")
+$LOAD_PATH << File.join(base, "examples")
+
+require 'cobbler'
+
+if ARGV.empty? || ARGV.size < 6
+  puts "Usage: #{$0} hostname system-name profile-name mac-address username password"
+  exit 1
+end
+
+hostname     = ARGV[0]
+system_name  = ARGV[1]
+profile_name = ARGV[2]
+mac_address  = ARGV[3]
+username     = ARGV[4]
+password     = ARGV[5]
+
+puts "Attempting to create a new system named #{system_name} based on profile #{profile_name}"
+
+system = Cobbler::System.new(hostname)
+system.username = username
+system.password = password
+
+unless system.has_profile?(profile_name)
+  puts "No such profile: #{profile_name}"
+  exit 1
+end
+
+system.create_system(system_name,profile_name,mac_address)
diff --git a/ruby/rubygem-cobbler/examples/has_profile.rb b/ruby/rubygem-cobbler/examples/has_profile.rb
new file mode 100755
index 0000000..1c5c920
--- /dev/null
+++ b/ruby/rubygem-cobbler/examples/has_profile.rb
@@ -0,0 +1,66 @@
+#!/usr/bin/ruby -W0
+#
+# has_profile.rb - example of using rubygem-cobbler to chekc if a profile exists.
+# 
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# 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., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.  A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+ 
+base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
+$LOAD_PATH << File.join(base, "lib")
+$LOAD_PATH << File.join(base, "examples")
+
+require 'getoptlong'
+
+require 'cobbler/base'
+require 'cobbler/profile'
+
+include Cobbler
+
+opts = GetoptLong.new(
+  ["--server",  "-s", GetoptLong::REQUIRED_ARGUMENT ],
+  ["--profile", "-p", GetoptLong::REQUIRED_ARGUMENT ],
+  ["--help",    "-h", GetoptLong::NO_ARGUMENT]
+)
+
+ at hostname = nil
+ at profile  = nil
+
+opts.each do |opt, arg|
+  case opt
+  when '--server'  then @hostname = arg
+  when '--profile' then @profile  = arg
+  when '--help'    then 
+    puts "Usage: #{$0} --server hostname --profile profile-name\n"
+  end
+end
+
+SystemExit.new('No hostname specified.') unless @hostname
+
+if @hostname
+  Base.hostname = @hostname
+  
+  puts "Finding any profile that matches \"#{@profile}\""
+    
+  result = Profile.find_by_name(@profile)
+  
+  if result
+    puts "#{result.name} exists, and is owned by #{result.owners}."
+  else
+    puts "No such profile: #{@profile}"
+  end
+end
\ No newline at end of file
diff --git a/ruby/rubygem-cobbler/examples/has_system.rb b/ruby/rubygem-cobbler/examples/has_system.rb
new file mode 100755
index 0000000..529e94b
--- /dev/null
+++ b/ruby/rubygem-cobbler/examples/has_system.rb
@@ -0,0 +1,67 @@
+#!/usr/bin/ruby -W0
+#
+# has_system.rb - example of using rubygem-cobbler to check if a system exists.
+# 
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# 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., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.  A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+ 
+base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
+$LOAD_PATH << File.join(base, "lib")
+$LOAD_PATH << File.join(base, "examples")
+
+require 'getoptlong'
+
+require 'cobbler/base'
+require 'cobbler/system'
+
+include Cobbler
+
+opts = GetoptLong.new(
+  ["--server",  "-s", GetoptLong::REQUIRED_ARGUMENT ],
+  ["--system",  "-t", GetoptLong::REQUIRED_ARGUMENT ],
+  ["--help",    "-h", GetoptLong::NO_ARGUMENT]
+)
+
+ at hostname = nil
+ at system  = nil
+ at find_all = true
+
+opts.each do |opt, arg|
+  case opt
+  when '--server'  then @hostname = arg
+  when '--system'  then @system  = arg
+  when '--help'    then 
+    puts "Usage: #{$0} --server hostname --system system-name\n"
+  end
+end
+
+SystemExit.new('No hostname specified.') unless @hostname
+
+if @hostname
+  Base.hostname = @hostname
+  
+  puts "Finding any system that matches \"#{@system}\""
+    
+  result = System.find_by_name(@system)
+  
+  if result
+    puts "#{result.name} exists, and is owned by #{result.owners}."
+  else
+    puts "No such system: #{@system}"
+  end
+end
\ No newline at end of file
diff --git a/ruby/rubygem-cobbler/examples/list_distros.rb b/ruby/rubygem-cobbler/examples/list_distros.rb
new file mode 100755
index 0000000..be99ef8
--- /dev/null
+++ b/ruby/rubygem-cobbler/examples/list_distros.rb
@@ -0,0 +1,48 @@
+#!/usr/bin/ruby -W0
+# list_distros.rb - example of using rubygem-cobbler to list distros.
+# 
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# 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., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.  A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+ 
+base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
+$LOAD_PATH << File.join(base, "lib")
+$LOAD_PATH << File.join(base, "examples")
+
+require 'cobbler'
+
+if ARGV.empty?
+  puts "Usage: #{$0} hostname"
+  exit 1
+end
+
+hostname = ARGV[0]
+
+puts "Connecting to #{hostname}"
+
+system = Cobbler::System.new(hostname)
+
+system.distros.each do |distro|
+  puts "[Distro: #{distro['name']}]"
+  
+  distro.keys.each do |key|
+    puts "#{key}: #{distro[key]}" unless key == 'name'
+  end
+  
+  puts "\n"
+end
+
diff --git a/ruby/rubygem-cobbler/examples/list_profiles.rb b/ruby/rubygem-cobbler/examples/list_profiles.rb
new file mode 100755
index 0000000..620a2c6
--- /dev/null
+++ b/ruby/rubygem-cobbler/examples/list_profiles.rb
@@ -0,0 +1,63 @@
+#!/usr/bin/ruby -W0
+#
+# list_profiles.rb - example of using rubygem-cobbler to list profiles.
+# 
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# 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., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.  A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+ 
+base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
+$LOAD_PATH << File.join(base, "lib")
+$LOAD_PATH << File.join(base, "examples")
+
+require 'getoptlong'
+
+require 'cobbler/base'
+require 'cobbler/profile'
+
+include Cobbler
+
+opts = GetoptLong.new(
+  ["--server", "-s", GetoptLong::REQUIRED_ARGUMENT ],
+  ["--help",   "-h", GetoptLong::NO_ARGUMENT]
+)
+
+ at hostname
+
+opts.each do |opt, arg|
+  case opt
+  when '--server' then @hostname = arg
+  when '--help'   then 
+    puts "Usage: #{$0} --server hostname\n"
+  end
+end
+
+if @hostname
+  Base.hostname = @hostname
+  
+  profiles = Profile.find
+  
+  if profiles.empty?
+    puts "No profiles found." 
+  else
+    puts "Found #{profiles.size} profiles."
+    
+    profiles.each do |profile|
+      puts "#{profile.name} is based on #{profile.distro}."
+    end  
+  end
+end
\ No newline at end of file
diff --git a/ruby/rubygem-cobbler/examples/list_systems.rb b/ruby/rubygem-cobbler/examples/list_systems.rb
new file mode 100755
index 0000000..3304378
--- /dev/null
+++ b/ruby/rubygem-cobbler/examples/list_systems.rb
@@ -0,0 +1,63 @@
+#!/usr/bin/ruby -W0
+#
+# list_systems.rb - example of using rubygem-cobbler to list system.
+# 
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# 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., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.  A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+ 
+base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
+$LOAD_PATH << File.join(base, "lib")
+$LOAD_PATH << File.join(base, "examples")
+
+require 'getoptlong'
+
+require 'cobbler/base'
+require 'cobbler/system'
+
+include Cobbler
+
+opts = GetoptLong.new(
+  ["--server", "-s", GetoptLong::REQUIRED_ARGUMENT ],
+  ["--help",   "-h", GetoptLong::NO_ARGUMENT]
+)
+
+ at hostname
+
+opts.each do |opt, arg|
+  case opt
+  when '--server' then @hostname = arg
+  when '--help'   then 
+    puts "Usage: #{$0} --server hostname\n"
+  end
+end
+
+if @hostname
+  Base.hostname = @hostname
+  
+  systems = System.find
+  
+  if systems.empty?
+    puts "No systems found." 
+  else
+    puts "Found #{systems.size} profiles."
+    
+    systems.each do |system|
+      puts "#{system.name} is based on #{system.profile}."
+    end  
+  end
+end
\ No newline at end of file
diff --git a/ruby/rubygem-cobbler/examples/remove_system.rb b/ruby/rubygem-cobbler/examples/remove_system.rb
new file mode 100755
index 0000000..21e77bf
--- /dev/null
+++ b/ruby/rubygem-cobbler/examples/remove_system.rb
@@ -0,0 +1,43 @@
+#!/usr/bin/ruby -W0
+#
+# remove_system.rb - example of using rubygem-cobbler to remove a system.
+# 
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# 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., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.  A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+ 
+base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
+$LOAD_PATH << File.join(base, "lib")
+$LOAD_PATH << File.join(base, "examples")
+
+require 'cobbler'
+
+if ARGV.empty? || ARGV.size < 4
+  puts "Usage: #{$0} hostname system-name username password"
+  exit 1
+end
+
+hostname     = ARGV[0]
+system_name  = ARGV[1]
+username     = ARGV[2]
+password     = ARGV[3]
+
+system = Cobbler::System.new(hostname)
+system.username = username
+system.password = password
+
+system.remove_system(system_name)
\ No newline at end of file
diff --git a/ruby/rubygem-cobbler/lib/cobbler.rb b/ruby/rubygem-cobbler/lib/cobbler.rb
new file mode 100644
index 0000000..df78813
--- /dev/null
+++ b/ruby/rubygem-cobbler/lib/cobbler.rb
@@ -0,0 +1,25 @@
+# cobbler.rb - Cobbler module declaration.
+# 
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# 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., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.  A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+require 'cobbler/system'
+ 
+module Cobbler
+    
+end
diff --git a/ruby/rubygem-cobbler/lib/cobbler/base.rb b/ruby/rubygem-cobbler/lib/cobbler/base.rb
new file mode 100644
index 0000000..fdd696d
--- /dev/null
+++ b/ruby/rubygem-cobbler/lib/cobbler/base.rb
@@ -0,0 +1,150 @@
+# base.rb
+# 
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# 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., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.  A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+ 
+require 'xmlrpc/client'
+require 'pp'
+
+module Cobbler
+  include XMLRPC
+  
+  # +Base+ represents a remote Cobbler server.
+  # 
+  # Child classes can define fields that will be retrieved from Cobbler by 
+  # using the +cobbler_field+ method. For example:
+  # 
+  #   class Farkle < Base
+  #       cobbler_field :name, findable => 'get_farkle'
+  #       cobbler_field :owner
+  #   end
+  #   
+  # declares a class named Farkle that contains two fields. The first, "name",
+  # will be one that is searchable on Cobbler; i.e., a method named "find_by_name"
+  # will be generated and will use the "get_farkle" remote method to retrieve
+  # that instance from Cobbler. 
+  # 
+  # The second field, "owner", will simply be a field named Farkle.owner that 
+  # returns a character string.
+  #
+  # +Base+ provides some common functionality for all child classes:
+  #
+  #  
+  class Base
+    
+    @@connection = nil
+    @@hostname   = nil
+    
+    @attrs 
+
+    def attributes(name)
+      return @attrs ? @attrs[name] : nil
+    end
+    
+    # Makes a remote call to the Cobbler server.
+    #
+    def self.make_call(*args)
+      conn = connection(false)
+      
+      conn.call(*args)
+    end
+    
+    def self.connection=(connection)
+      @@connection = connection
+    end
+    
+    def self.connection(writable = false)
+      result = @@connection
+      
+      unless result
+        result = XMLRPC::Client.new2("http://#{@@hostname}/cobbler_api#{writable ? '_rw' : ''}")
+      end
+      
+      return result
+    end
+    
+    def self.hostname=(hostname)
+      @@hostname = hostname
+    end
+ 
+    class << self
+      # Allows the class to define the means by which it is saved.
+      # 
+      def cobbler_save_method(script)
+        module_eval <<-"end;"        
+          def save
+            begin_transaction(true)
+            #{script}
+            end_transaction
+          end
+        end;
+      end
+      
+      # Creates a complete finder method
+      # 
+      def cobbler_find_all(method_name)
+        module_eval <<-"end;"
+          def self.find
+            records = make_call('#{method_name}')
+
+            result = Array.new
+
+            if records
+              records.each { |record| result << create(record) }
+            end
+
+            return result
+          end
+        end;
+      end
+      
+      # Allows for dynamically declaring fields that will come from
+      # Cobbler.
+      #
+      def cobbler_field(field,*args) # :nodoc:
+        
+        if args
+          for arg in args
+            for key in arg.keys
+              case key 
+              when :findable then      
+              
+                module_eval <<-"end;"
+                  def self.find_by_#{field.to_s}(name,&block)
+                    properties = make_call('#{arg[key]}',name)
+
+                    return create(properties) if properties && !properties.empty?
+
+                    return nil
+                  end
+                end;
+              
+              end        
+            end    
+          end        
+
+          module_eval <<-"end;"
+            def #{field.to_s}(&block)
+              return attributes('#{field.to_s}')
+            end
+          end;
+        end
+      end
+    end   
+  end
+end
\ No newline at end of file
diff --git a/ruby/rubygem-cobbler/lib/cobbler/distro.rb b/ruby/rubygem-cobbler/lib/cobbler/distro.rb
new file mode 100644
index 0000000..6294ce1
--- /dev/null
+++ b/ruby/rubygem-cobbler/lib/cobbler/distro.rb
@@ -0,0 +1,52 @@
+# distro.rb 
+# 
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# 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., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.  A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+# +Distro+ represents a single distrobution.
+#
+module Cobbler
+  
+  # +Distro+ represents a single distrobution within Cobbler.
+  #
+  class Distro < Base
+    cobbler_field :name, :findable => 'get_distro'
+    cobbler_field :owners
+    cobbler_field :kernel
+    cobbler_field :breed
+    cobbler_field :depth
+    cobbler_field :arch
+    cobbler_field :initrd
+    cobbler_field :source_repos
+    cobbler_field :kernel_options
+    cobbler_field :parent
+    cobbler_field :ks_meta
+    
+    def initialize(attrs)
+      @attrs = attrs
+    end
+    
+    private
+    
+    # Creates a new instance of +Profile+ from a result received from Cobbler.
+    #
+    def self.create(attrs)
+      Profile.new(attrs)
+    end
+  end
+end
diff --git a/ruby/rubygem-cobbler/lib/cobbler/profile.rb b/ruby/rubygem-cobbler/lib/cobbler/profile.rb
new file mode 100644
index 0000000..66a304c
--- /dev/null
+++ b/ruby/rubygem-cobbler/lib/cobbler/profile.rb
@@ -0,0 +1,60 @@
+# profile.rb 
+# 
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# 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., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.  A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+# +Profile+ represents a single profile.
+#
+module Cobbler
+  
+  # +Profile+ represents a single profile within Cobbler.
+  #
+  class Profile < Base
+    cobbler_find_all 'get_profiles'
+    
+    cobbler_field :name, :findable => 'get_profile'
+    cobbler_field :parent
+    cobbler_field :owners
+    cobbler_field :dhcp_tag
+    cobbler_field :depth
+    cobbler_field :virt_file_size
+    cobbler_field :virt_path
+    cobbler_field :virt_type
+    cobbler_field :repos
+    cobbler_field :distro
+    cobbler_field :server
+    cobbler_field :virt_bridge
+    cobbler_field :virt_ram
+    cobbler_field :kernel_options
+    cobbler_field :virt_cpus
+    cobbler_field :ks_meta
+    cobbler_field :kickstart
+    
+    def initialize(attrs)
+      @attrs = attrs
+    end
+    
+    private
+    
+    # Creates a new instance of +Profile+ from a result received from Cobbler.
+    #
+    def self.create(attrs)
+      Profile.new(attrs)
+    end
+  end
+end
diff --git a/ruby/rubygem-cobbler/lib/cobbler/system.rb b/ruby/rubygem-cobbler/lib/cobbler/system.rb
new file mode 100644
index 0000000..a02a6f3
--- /dev/null
+++ b/ruby/rubygem-cobbler/lib/cobbler/system.rb
@@ -0,0 +1,62 @@
+# system.rb 
+# 
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# 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., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.  A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+module Cobbler
+  
+  # +System+ represents a system within Cobbler.
+  #
+  class System < Base
+    
+    cobbler_save_method <<-"SCRIPT"
+      puts "WOO!"
+    SCRIPT
+    
+    cobbler_find_all 'get_systems'
+    cobbler_field :name, :findable => 'get_system'
+    cobbler_field :parent
+    cobbler_field :profile
+    cobbler_field :depth
+    cobbler_field :kernel_options
+    cobbler_field :kickstart
+    cobbler_field :ks_meta
+    cobbler_field :netboot_enabled
+    cobbler_field :owners
+    cobbler_field :server
+    cobbler_field :virt_cpus
+    cobbler_field :virt_file_size
+    cobbler_field :virt_path
+    cobbler_field :virt_ram
+    cobbler_field :virt_type
+    cobbler_field :virt_bridge
+    cobbler_field :interfaces
+
+    def initialize(attrs)
+      @attrs = attrs
+    end
+    
+    private
+    
+    # Creates a new instance of +System+ from a result received from Cobbler.
+    #
+    def self.create(attrs)
+      System.new(attrs)
+    end
+  end
+end
diff --git a/ruby/rubygem-cobbler/nbproject/private/private.properties b/ruby/rubygem-cobbler/nbproject/private/private.properties
new file mode 100644
index 0000000..45c547d
--- /dev/null
+++ b/ruby/rubygem-cobbler/nbproject/private/private.properties
@@ -0,0 +1,4 @@
+file.reference.ruby-rubygem-cobbler=/home/mcpierce/Programming/cobbler/ruby/rubygem-cobbler
+file.reference.rubygem-cobbler-lib=/home/mcpierce/Programming/cobbler/ruby/rubygem-cobbler/lib
+file.reference.rubygem-cobbler-test=/home/mcpierce/Programming/cobbler/ruby/rubygem-cobbler/test
+platform.active=Ruby
diff --git a/ruby/rubygem-cobbler/nbproject/project.properties b/ruby/rubygem-cobbler/nbproject/project.properties
new file mode 100644
index 0000000..f5ba218
--- /dev/null
+++ b/ruby/rubygem-cobbler/nbproject/project.properties
@@ -0,0 +1,12 @@
+file.reference.ruby-rubygem-cobbler=.
+file.reference.rubygem-cobbler-lib=lib
+file.reference.rubygem-cobbler-test=test
+javac.classpath=
+main.file=
+platform.active=Ruby
+ruby.includejava=false
+source.encoding=UTF-8
+src.dir=${file.reference.rubygem-cobbler-lib}
+src.docs.dir=docs
+src.examples.dir=examples
+test.src.dir=${file.reference.rubygem-cobbler-test}
diff --git a/ruby/rubygem-cobbler/nbproject/project.xml b/ruby/rubygem-cobbler/nbproject/project.xml
new file mode 100644
index 0000000..532bfe6
--- /dev/null
+++ b/ruby/rubygem-cobbler/nbproject/project.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.ruby.rubyproject</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/ruby-project/1">
+            <name>rubygem-cobbler</name>
+            <source-roots>
+                <root id="src.examples.dir"/>
+                <root id="src.docs.dir"/>
+                <root id="src.dir"/>
+            </source-roots>
+            <test-roots>
+                <root id="test.src.dir"/>
+            </test-roots>
+        </data>
+    </configuration>
+</project>
diff --git a/ruby/rubygem-cobbler/test/test_base.rb b/ruby/rubygem-cobbler/test/test_base.rb
new file mode 100755
index 0000000..4370af3
--- /dev/null
+++ b/ruby/rubygem-cobbler/test/test_base.rb
@@ -0,0 +1,51 @@
+# test_system.rb - Unit tests.
+# 
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# 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., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.  A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+ 
+
+$:.unshift File.join(File.dirname(__FILE__),'..','lib')
+
+require 'test/unit'
+require 'flexmock/test_unit'
+require 'cobbler/base'
+
+module Cobbler
+  class TestBase < Test::Unit::TestCase
+    def setup
+      @connection = flexmock('connection')
+      Base.connection = @connection
+      Base.hostname   = "localhost"
+    end
+    
+    # Ensures that the default behavior for the base is to create a connection
+    # if one wasn't set.
+    #
+    def test_connection_without_mock
+      Base.connection = nil
+      
+      assert Base.connection, 'Should have created a new connection.'
+    end
+
+    # Ensures that setting a mock connection works (for unit tests).
+    #
+    def test_connection
+      assert_same @connection, Base.connection
+    end
+  end
+end
diff --git a/ruby/rubygem-cobbler/test/test_profile.rb b/ruby/rubygem-cobbler/test/test_profile.rb
new file mode 100644
index 0000000..01a8184
--- /dev/null
+++ b/ruby/rubygem-cobbler/test/test_profile.rb
@@ -0,0 +1,83 @@
+# test_profile.rb - Tests the Profile class.
+# 
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# 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., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.  A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+ 
+
+$:.unshift File.join(File.dirname(__FILE__),'..','lib')
+
+require 'test/unit'
+require 'flexmock/test_unit'
+require 'cobbler/base'
+require 'cobbler/profile'
+
+module Cobbler
+  class TestProfile < Test::Unit::TestCase
+    def setup
+      @connection = flexmock('connection')
+      Base.connection = @connection
+      Base.hostname   = "localhost"
+      
+      @profiles = Array.new
+      @profiles[0] = Hash.new
+      @profiles[0]['profile']         = 'Fedora-9-i386'
+      @profiles[0]['distro']          = 'Fedora-9-i386'
+      @profiles[0]['dhcp tag']        = 'default'
+      @profiles[0]['kernel options']  = {}
+      @profiles[0]['kickstart']       = '/etc/cobbler/sample_end.ks'
+      @profiles[0]['ks metadata']     = {}
+      @profiles[0]['owners']          = ['admin']
+      @profiles[0]['repos']           = []
+      @profiles[0]['server']          = '<<inherit>>'
+      @profiles[0]['virt bridge']     = 'xenbr0'
+      @profiles[0]['virt cpus']       = '1'
+      @profiles[0]['virt file size']  = '5'
+      @profiles[0]['virt path']       = ''
+      @profiles[0]['virt ram']        = '512'
+      @profiles[0]['virt type']       = 'xenpv'
+      
+      @profiles[1] = Hash.new
+      @profiles[1]['profile']         = 'Fedora-9-x86_64'
+      @profiles[1]['distro']          = 'Fedora-9-x86_64'
+      @profiles[1]['dhcp tag']        = 'default'
+      @profiles[1]['kernel options']  = {}
+      @profiles[1]['kickstart']       = '/etc/cobbler/sample_end.ks'
+      @profiles[1]['ks metadata']     = {}
+      @profiles[1]['owners']          = ['admin']
+      @profiles[1]['repos']           = []
+      @profiles[1]['server']          = '<<inherit>>'
+      @profiles[1]['virt bridge']     = 'xenbr0'
+      @profiles[1]['virt cpus']       = '1'
+      @profiles[1]['virt file size']  = '5'
+      @profiles[1]['virt path']       = ''
+      @profiles[1]['virt ram']        = '512'
+      @profiles[1]['virt type']       = 'xenpv'
+    end
+
+    # Ensures that an attempt to find all of a profile works as expected.
+    #
+    def test_find
+      @connection.should_receive(:call).with('get_profiles').once.returns(@profiles)
+
+      result = Profile.find
+
+      assert result, 'Expected a result set.'
+      assert_equal 2, result.size, 'Did not receive the right number of results'
+    end
+  end
+end
-- 
1.5.5.1




More information about the ovirt-devel mailing list