summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarryl L. Pierce <dpierce@redhat.com>2009-03-03 10:39:43 -0500
committerDarryl L. Pierce <dpierce@redhat.com>2009-03-05 16:37:07 -0500
commit88eaff25762cb5b2b10352fa8c299104eda8f784 (patch)
treec42a1f78c78d0462af95c5028f81d977c1e1599f
parentdbcfc5a2f0d191001cd8000a543e41eddefd20f7 (diff)
downloadcobbler-88eaff25762cb5b2b10352fa8c299104eda8f784.tar.gz
cobbler-88eaff25762cb5b2b10352fa8c299104eda8f784.tar.xz
cobbler-88eaff25762cb5b2b10352fa8c299104eda8f784.zip
Adds support for the XMLRPC changes for Cobbler 1.5.
Some additional features added as a result is the ability to debug a connection. If Base.debug is set to true then all communication between the client and server is sent to stdout. Also fixed the list_systems.rb example to show the image on which a system is based if it's not based on a profile. And some minor cleanup to those particular source modules.
-rw-r--r--contrib/ruby/Rakefile2
-rwxr-xr-xcontrib/ruby/examples/check_version.rb62
-rwxr-xr-xcontrib/ruby/examples/create_system.rb50
-rwxr-xr-xcontrib/ruby/examples/list_systems.rb36
-rw-r--r--contrib/ruby/lib/cobbler.rb16
-rw-r--r--contrib/ruby/lib/cobbler/base.rb39
-rw-r--r--contrib/ruby/lib/cobbler/system.rb58
-rw-r--r--contrib/ruby/test/test_base.rb50
-rw-r--r--contrib/ruby/test/test_system.rb4
9 files changed, 202 insertions, 115 deletions
diff --git a/contrib/ruby/Rakefile b/contrib/ruby/Rakefile
index 7828c0ad..722749cb 100644
--- a/contrib/ruby/Rakefile
+++ b/contrib/ruby/Rakefile
@@ -22,7 +22,7 @@ require 'rake/testtask'
require 'rake/gempackagetask'
PKG_NAME='rubygem-cobbler'
-PKG_VERSION='0.1.3'
+PKG_VERSION='0.1.9'
PKG_FILES=FileList[
'Rakefile', 'README', 'ChangeLog', 'COPYING', 'NEWS', 'TODO',
'lib/**/*.rb',
diff --git a/contrib/ruby/examples/check_version.rb b/contrib/ruby/examples/check_version.rb
new file mode 100755
index 00000000..1d5653e5
--- /dev/null
+++ b/contrib/ruby/examples/check_version.rb
@@ -0,0 +1,62 @@
+#!/usr/bin/ruby -w
+#
+# create_system.rb - example of using rubygem-cobbler to create a system.
+#
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce@redhat.com>
+#
+# This file is part of rubygem-cobbler.
+#
+# rubygem-cobbleris free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published
+# by the Free Software Foundation, either version 2.1 of the License, or
+# (at your option) any later version.
+#
+# rubygem-cobbler 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 rubygem-cobbler. If not, see <http://www.gnu.org/licenses/>.
+#
+
+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'
+
+include Cobbler
+
+opts = GetoptLong.new(
+ ['--hostname', '-s', GetoptLong::REQUIRED_ARGUMENT ],
+ ['--help', '-h', GetoptLong::NO_ARGUMENT])
+
+hostname = nil
+
+def usage
+ puts "Usage: #{$0} --hostname hostname\n"
+ exit
+end
+
+opts.each do |opt, arg|
+ case opt
+ when '--hostname' then hostname = arg
+ when '--help' then usage
+ end
+end
+
+if hostname
+ Base.hostname = hostname
+ version = Base.remote_version
+ if version
+ puts "Remote version: #{version}"
+ else
+ puts "Unable to determine version."
+ end
+else
+ usage
+end
diff --git a/contrib/ruby/examples/create_system.rb b/contrib/ruby/examples/create_system.rb
index dd938fe1..b2d2138a 100755
--- a/contrib/ruby/examples/create_system.rb
+++ b/contrib/ruby/examples/create_system.rb
@@ -1,14 +1,14 @@
-#!/usr/bin/ruby -w
+#!/usr/bin/ruby -w
#
# create_system.rb - example of using rubygem-cobbler to create a system.
-#
+#
# Copyright (C) 2008 Red Hat, Inc.
# Written by Darryl L. Pierce <dpierce@redhat.com>
#
# This file is part of rubygem-cobbler.
#
# rubygem-cobbleris free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published
+# it under the terms of the GNU Lesser General Public License as published
# by the Free Software Foundation, either version 2.1 of the License, or
# (at your option) any later version.
#
@@ -20,7 +20,7 @@
# You should have received a copy of the GNU General Public License
# along with rubygem-cobbler. If not, see <http://www.gnu.org/licenses/>.
#
-
+
base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
$LOAD_PATH << File.join(base, "lib")
$LOAD_PATH << File.join(base, "examples")
@@ -31,41 +31,49 @@ require 'cobbler'
include Cobbler
-opts = GetoptLong.new(
- ['--hostname', '-s', GetoptLong::REQUIRED_ARGUMENT ],
- ['--name', '-n', GetoptLong::REQUIRED_ARGUMENT ],
- ['--profile', '-f', GetoptLong::REQUIRED_ARGUMENT ],
- ['--username', '-u', GetoptLong::REQUIRED_ARGUMENT ],
- ['--password', '-p', GetoptLong::REQUIRED_ARGUMENT ],
- ['--help', '-h', GetoptLong::NO_ARGUMENT]
-)
+opts = GetoptLong.new(['--hostname', '-s', GetoptLong::REQUIRED_ARGUMENT ],
+ ['--name', '-n', GetoptLong::REQUIRED_ARGUMENT ],
+ ['--profile', '-f', GetoptLong::REQUIRED_ARGUMENT ],
+ ['--image', '-i', GetoptLong::REQUIRED_ARGUMENT ],
+ ['--username', '-u', GetoptLong::REQUIRED_ARGUMENT ],
+ ['--password', '-p', GetoptLong::REQUIRED_ARGUMENT ],
+ ['--help', '-h', GetoptLong::NO_ARGUMENT],
+ ['--debug', '-d', GetoptLong::NO_ARGUMENT])
-name = profile = hostname = username = password = nil
+name = profile = image = hostname = username = password = debug = nil
def usage
- puts "Usage: #{$0} --name system-name --profile profile-name [--hostname hostname] [--username username] [--password password]\n"
+ puts "Usage: #{$0} --name system-name [--profile profile-name | --image image-name ] [--hostname hostname] [--username username] [--password password]\n"
exit
end
-
+
opts.each do |opt, arg|
case opt
when '--hostname' then hostname = arg
when '--name' then name = arg
when '--profile' then profile = arg
+ when '--image' then image = arg
when '--username' then username = arg
when '--password' then password = arg
when '--help' then usage
+ when '--debug' then debug = true
end
end
-if name && profile
-
+if (profile && image)
+ puts "\nYou must specify either a profile or an image, but not both.\n\n"
+ usage
+end
+
+if name && (profile || image)
System.hostname = hostname if hostname
System.username = username if username
System.password = password if password
-
- system = System.new('name' => name,'profile' => profile)
-
+ System.debug = true if debug
+
+ system = System.new('name' => name,'profile' => profile) if profile
+ system = System.new('name' => name,'image' => image) if image
+
system.interfaces=[NetworkInterface.new({'mac_address' => '00:11:22:33:44:55:66:77'})]
puts "Saving a new system with name #{system.name} based on the profile #{system.profile}."
@@ -78,4 +86,4 @@ if name && profile
end
else
usage
-end \ No newline at end of file
+end
diff --git a/contrib/ruby/examples/list_systems.rb b/contrib/ruby/examples/list_systems.rb
index 61afe800..4474905a 100755
--- a/contrib/ruby/examples/list_systems.rb
+++ b/contrib/ruby/examples/list_systems.rb
@@ -1,14 +1,14 @@
-#!/usr/bin/ruby
+#!/usr/bin/ruby
#
# list_systems.rb - example of using rubygem-cobbler to list system.
-#
-# Copyright (C) 2008 Red Hat, Inc.
+#
+# Copyright (C) 2008, 2009, Red Hat, Inc.
# Written by Darryl L. Pierce <dpierce@redhat.com>
#
# This file is part of rubygem-cobbler.
#
# rubygem-cobbleris free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published
+# it under the terms of the GNU Lesser General Public License as published
# by the Free Software Foundation, either version 2.1 of the License, or
# (at your option) any later version.
#
@@ -20,7 +20,7 @@
# You should have received a copy of the GNU General Public License
# along with rubygem-cobbler. If not, see <http://www.gnu.org/licenses/>.
#
-
+
base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
$LOAD_PATH << File.join(base, "lib")
$LOAD_PATH << File.join(base, "examples")
@@ -31,14 +31,14 @@ require 'cobbler'
include Cobbler
-opts = GetoptLong.new(
- ['--hostname', '-s', GetoptLong::REQUIRED_ARGUMENT ],
- ['--details', '-d', GetoptLong::NO_ARGUMENT ],
- ['--help', '-h', GetoptLong::NO_ARGUMENT ]
-)
+opts = GetoptLong.new(['--hostname', '-s', GetoptLong::REQUIRED_ARGUMENT ],
+ ['--details', '-v', GetoptLong::NO_ARGUMENT ],
+ ['--help', '-h', GetoptLong::NO_ARGUMENT ],
+ ['--debug', '-d', GetoptLong::NO_ARGUMENT ])
hostname = nil
details = false
+debug = false
def usage
puts "Usage: #{$0} [--hostname hostname] [--details]\n"
@@ -50,18 +50,20 @@ opts.each do |opt, arg|
when '--hostname' then hostname = arg
when '--details' then details = true
when '--help' then usage
+ when '--debug' then debug = true
end
end
Base.hostname = hostname if hostname
-
+Base.debug = debug if debug
+
puts "Results:"
-System.find do |system|
- puts "\"#{system.name}\" is based on \"#{system.profile}\"."
-
+System.find do |system|
+ puts "\"#{system.name}\" is based on the \"#{system.profile}\" profile." unless system.profile.empty?
+ puts "\"#{system.name}\" is based on the \"#{system.image}\" image." unless system.image.empty?
+
if details
puts "\tOwner: #{system.owners}"
- system.interfaces.each_pair { |id,nic| puts "\tNIC[#{id}]: #{nic.mac_address}"}
- end
+ system.interfaces.each_pair { |id,nic| puts "\tNIC[#{id}]: #{nic.mac_address}"}
+ end
end
-
diff --git a/contrib/ruby/lib/cobbler.rb b/contrib/ruby/lib/cobbler.rb
index e4fe0c57..28556e54 100644
--- a/contrib/ruby/lib/cobbler.rb
+++ b/contrib/ruby/lib/cobbler.rb
@@ -1,7 +1,7 @@
#
# cobbler.rb - Cobbler module declaration.
-#
-# Copyright (C) 2008 Red Hat, Inc.
+#
+# Copyright (C) 2008,2009 Red Hat, Inc.
# Written by Darryl L. Pierce <dpierce@redhat.com>
#
# This file is part of rubygem-cobbler.
@@ -19,23 +19,23 @@
# You should have received a copy of the GNU General Public License
# along with rubygem-cobbler. If not, see <http://www.gnu.org/licenses/>.
#
-
+
require 'cobbler/base'
require 'cobbler/distro'
require 'cobbler/image'
require 'cobbler/network_interface'
require 'cobbler/profile'
require 'cobbler/system'
-
-module Cobbler
+
+module Cobbler
config = (ENV['COBBLER_YML'] || File.expand_path("config/cobbler.yml"))
-
+
yml = YAML::load(File.open(config)) if File.exist?(config)
-
+
if yml
Base.hostname = yml['hostname']
Base.username = yml['username']
Base.password = yml['password']
end
-
+
end
diff --git a/contrib/ruby/lib/cobbler/base.rb b/contrib/ruby/lib/cobbler/base.rb
index ff5f565a..df84ac11 100644
--- a/contrib/ruby/lib/cobbler/base.rb
+++ b/contrib/ruby/lib/cobbler/base.rb
@@ -1,7 +1,6 @@
-
# base.rb
#
-# Copyright (C) 2008 Red Hat, Inc.
+# Copyright (C) 2008,2009 Red Hat, Inc.
# Written by Darryl L. Pierce <dpierce@redhat.com>
#
# This file is part of rubygem-cobbler.
@@ -67,6 +66,7 @@ module Cobbler
@@hostname = nil
@@connection = nil
@@auth_token = nil
+ @@debug = false
attr_accessor :definitions
@@ -95,16 +95,43 @@ module Cobbler
@@password = password
end
+ # Enables debugging of communications.
+ #
+ def self.debug=(debug)
+ @@debug = debug
+ end
+
# Sets the connection. This method is only needed during unit testing.
#
def self.connection=(connection)
@@connection = connection
end
+ # Returns the version for the remote cobbler instance.
+ #
+ def self.remote_version
+ connect(false) unless @@connection
+ @@version ||= make_call("version")
+ end
+
# Returns a connection to the Cobbler server.
#
def self.connect(writable)
- @@connection || XMLRPC::Client.new2("http://#{@@hostname}/cobbler_api#{writable ? '_rw' : ''}")
+ puts "Connection: writable=#{writable}" if @@debug
+ @@connection ||= XMLRPC::Client.new2("http://#{@@hostname}/cobbler_api")
+
+ # in pre-1.5 versions, a separate path was used for writable calls
+ # TODO: remove this code in 1.6 (dlp)
+ version = remote_version
+ puts "Remote version: #{version}" if @@debug
+ if writable &&
+ version < 1.5 &&
+ !(@@connection.instance_variable_get('@path') =~ /rw$/)
+ puts "Older version detected: connecting to R/W endpoint" if @@debug
+ @@connection = XMLRPC::Client.new2("http://#{@@hostname}/cobbler_api_rw")
+ end
+
+ return @@connection
end
# Establishes a connection with the Cobbler system.
@@ -124,7 +151,10 @@ module Cobbler
def self.make_call(*args)
raise Exception.new('No connection established.') unless @@connection
- @@connection.call(*args)
+ puts "Remote call: #{args.first}" if @@debug
+ result = @@connection.call(*args)
+ puts "Result: #{result}\n" if @@debug
+ return result
end
# Ends a transaction and disconnects.
@@ -132,6 +162,7 @@ module Cobbler
def self.end_transaction
@@connection = nil
@@auth_token = nil
+ @@version = nil
end
class << self
diff --git a/contrib/ruby/lib/cobbler/system.rb b/contrib/ruby/lib/cobbler/system.rb
index 398f9934..5751ede1 100644
--- a/contrib/ruby/lib/cobbler/system.rb
+++ b/contrib/ruby/lib/cobbler/system.rb
@@ -1,13 +1,13 @@
#
-# system.rb
-#
-# Copyright (C) 2008 Red Hat, Inc.
+# system.rb
+#
+# Copyright (C) 2008, 2009, Red Hat, Inc.
# Written by Darryl L. Pierce <dpierce@redhat.com>
#
# This file is part of rubygem-cobbler.
#
# rubygem-cobbleris free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published
+# it under the terms of the GNU Lesser General Public License as published
# by the Free Software Foundation, either version 2.1 of the License, or
# (at your option) any later version.
#
@@ -19,17 +19,17 @@
# You should have received a copy of the GNU General Public License
# along with rubygem-cobbler. If not, see <http://www.gnu.org/licenses/>.
#
-
+
module Cobbler
-
+
# +System+ represents a system within Cobbler.
#
class System < Base
-
- cobbler_lifecycle :find_all => 'get_systems',
- :find_one => 'get_system',
+
+ cobbler_lifecycle :find_all => 'get_systems',
+ :find_one => 'get_system',
:remove => 'remove_system'
-
+
cobbler_field :name
cobbler_field :parent
cobbler_field :profile
@@ -47,48 +47,48 @@ module Cobbler
cobbler_field :virt_path
cobbler_field :virt_ram
cobbler_field :virt_type
- cobbler_field :virt_bridge
+ cobbler_field :virt_bridge
def initialize(definitions = nil)
super(definitions)
end
-
+
# Saves this instance.
#
def save
Base.begin_transaction(true)
-
- token = Base.login
-
+
+ token = Base.login
+
raise Exception.new('Update failed prior to saving') unless Base.make_call('update')
-
+
sysid = Base.make_call('new_system',token)
-
+
Base.make_call('modify_system',sysid,'name', name, token)
Base.make_call('modify_system',sysid,'profile',profile,token) if profile
Base.make_call('modify_system',sysid,'image', image, token) if image
-
+
if @interfaces
count = 0
@interfaces.each do |interface|
-
- values = interface.bundle_for_saving(count)
-
- unless values.empty?
- Base.make_call('modify_system',sysid,'modify-interface',values,token)
+
+ values = interface.bundle_for_saving(count)
+
+ unless values.empty?
+ Base.make_call('modify_system',sysid,'modify-interface',values,token)
count = count + 1
end
-
+
end
end
-
+
Base.make_call('save_system',sysid,token)
-
- Base.end_transaction
+
+ Base.end_transaction
end
-
+
private
-
+
# Creates a new instance of +System+ from a result received from Cobbler.
#
def self.create(attrs)
diff --git a/contrib/ruby/test/test_base.rb b/contrib/ruby/test/test_base.rb
index 36d0eacf..83b767d3 100644
--- a/contrib/ruby/test/test_base.rb
+++ b/contrib/ruby/test/test_base.rb
@@ -1,13 +1,13 @@
#
# test_system.rb - Unit tests.
-#
-# Copyright (C) 2008 Red Hat, Inc.
+#
+# Copyright (C) 2008, 2009, Red Hat, Inc.
# Written by Darryl L. Pierce <dpierce@redhat.com>
#
# This file is part of rubygem-cobbler.
#
# rubygem-cobbleris free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published
+# it under the terms of the GNU Lesser General Public License as published
# by the Free Software Foundation, either version 2.1 of the License, or
# (at your option) any later version.
#
@@ -19,7 +19,7 @@
# You should have received a copy of the GNU General Public License
# along with rubygem-cobbler. If not, see <http://www.gnu.org/licenses/>.
#
-
+
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
require 'test/unit'
@@ -31,72 +31,52 @@ module Cobbler
def setup
@connection = flexmock('connection')
Base.connection = @connection
- Base.hostname = "localhost"
+ Base.hostname = "localhost"
@username = 'dpierce'
@password = 'farkle'
Base.username = @username
Base.password = @password
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.connect(true), 'Should have created a new connection.'
- Base.connection = nil
-
- assert Base.connect(false), 'Should have created a new connection.'
- end
-
- # Ensures that setting a mock connection works (for unit tests).
- #
- def test_connect
- assert_same @connection, Base.connect(true), 'Got the wrong connection object.'
- assert_same @connection, Base.connect(false), 'Got the wrong connection object.'
- end
-
# Ensures that beginning a transaction results in creating a connection.
#
def test_begin_transaction
assert_same @connection, Base.begin_transaction, 'Did not create a connection.'
end
-
+
# Ensures that a login submits the username and password to the Cobbler server.
#
def test_login
@connection.should_receive(:call).with('login',@username, @password).once.returns(true)
-
+
Base.login
end
-
+
# Ensures that, if no connection exists, making a call throws an exception.
#
def test_make_call_without_connection
Base.connection = nil
-
+
assert_raises(Exception) {Base.make_call('test')}
end
-
+
# Ensures that making a call actually sends the data.
#
def test_make_call
@connection.should_receive(:call).with('test').once.returns('farkle')
-
+
result = Base.make_call('test')
-
+
assert_equal result, 'farkle', 'Did not get the expected result.'
end
-
+
# Ensures that ending a transaction closes the connection.
#
def test_end_transaction
Base.end_transaction
-
+
# we can't just call Base.connect since that will create a new object,
- # so we'll try to send data and, if that raises an exception, we'll
+ # so we'll try to send data and, if that raises an exception, we'll
# know indirectly that the connection object is gone.
assert_raises(Exception) {Base.make_call}
end
diff --git a/contrib/ruby/test/test_system.rb b/contrib/ruby/test/test_system.rb
index a7856bf5..727ea7ec 100644
--- a/contrib/ruby/test/test_system.rb
+++ b/contrib/ruby/test/test_system.rb
@@ -117,6 +117,7 @@ module Cobbler
#
def test_save_and_update_fails
@connection.should_receive(:call).with('login',@username,@password).once.returns(@auth_token)
+ @connection.should_receive(:call).with('version').once.returns("1.5")
@connection.should_receive(:call).with('update').once.returns{ false }
system = System.new('name' => @system_name, 'profile' => @profile_name)
@@ -128,6 +129,7 @@ module Cobbler
#
def test_save_with_profile
@connection.should_receive(:call).with('login',@username,@password).once.returns(@auth_token)
+ @connection.should_receive(:call).with('version').once.returns("1.5")
@connection.should_receive(:call).with('update').once.returns { true }
@connection.should_receive(:call).with('new_system',@auth_token).once.returns(@system_id)
@connection.should_receive(:call).with('modify_system',@system_id,'name',@system_name,@auth_token).once.returns(true)
@@ -159,6 +161,7 @@ module Cobbler
#
def test_save_with_new_nics
@connection.should_receive(:call).with('login',@username,@password).once.returns(@auth_token)
+ @connection.should_receive(:call).with('version').once.returns("1.5")
@connection.should_receive(:call).with('update').once.returns { true }
@connection.should_receive(:call).with('new_system',@auth_token).once.returns(@system_id)
@connection.should_receive(:call).with('modify_system',@system_id,'name',@system_name,@auth_token).once.returns(true)
@@ -177,6 +180,7 @@ module Cobbler
#
def test_remove_system
@connection.should_receive(:call).with('login',@username,@password).once.returns(@auth_token)
+ @connection.should_receive(:call).with('version').once.returns("1.5")
@connection.should_receive(:call).with('remove_system',@system_name,@auth_token).once.returns(true)
system = System.new('name' => @system_name, 'profile' => @profile_name)