mbailey-ruby-xen 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +4 -0
- data/Manifest.txt +8 -0
- data/README.rdoc +66 -0
- data/Rakefile +12 -0
- data/bin/ruby-xen +0 -0
- data/lib/ruby-xen.rb +50 -0
- data/lib/xen/backup.rb +3 -0
- data/lib/xen/command.rb +8 -0
- data/lib/xen/config.rb +52 -0
- data/lib/xen/domain.rb +47 -0
- data/lib/xen/host.rb +10 -0
- data/lib/xen/image.rb +12 -0
- data/lib/xen/instance.rb +84 -0
- data/test/test_ruby-xen.rb +0 -0
- metadata +70 -0
data/History.txt
ADDED
data/Manifest.txt
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
= ruby-xen
|
2
|
+
|
3
|
+
# Warning! Not ready yet - project started Sep 2008
|
4
|
+
|
5
|
+
http://github.com/mbailey/ruby-xen
|
6
|
+
|
7
|
+
|
8
|
+
== DESCRIPTION:
|
9
|
+
|
10
|
+
ruby-xen is a ruby library for managing Xen virtual servers. It currently
|
11
|
+
wraps the command line tools provided by Xen (xm) as well as Steve Kemps
|
12
|
+
excellent Xen-tools [http://www.xen-tools.org/software/xen-tools/].
|
13
|
+
|
14
|
+
ruby-xen is packaged as a Rails Gem which means you can require it from
|
15
|
+
a Ruby on Rails project and make use of the classes it provides.
|
16
|
+
|
17
|
+
ruby-xen can also be used by ruby code or from irb.
|
18
|
+
|
19
|
+
== FEATURES/PROBLEMS:
|
20
|
+
|
21
|
+
* FIX (list of features or problems)
|
22
|
+
|
23
|
+
== SYNOPSIS:
|
24
|
+
|
25
|
+
require 'rubygems'
|
26
|
+
require 'ruby-xen'
|
27
|
+
|
28
|
+
|
29
|
+
domain = Xen::Domain.find(:example)
|
30
|
+
domain.running? # true
|
31
|
+
domain.stop
|
32
|
+
domain.running? # false
|
33
|
+
domain.start
|
34
|
+
domain.running? # true
|
35
|
+
|
36
|
+
== REQUIREMENTS:
|
37
|
+
|
38
|
+
ruby-xen must be run as root as it uses Xen's 'xm' command.
|
39
|
+
xen-tools must be installed (http://www.xen-tools.org/software/xen-tools/)
|
40
|
+
|
41
|
+
== INSTALL:
|
42
|
+
|
43
|
+
sudo gem install ruby-xen
|
44
|
+
|
45
|
+
== LICENSE:
|
46
|
+
|
47
|
+
ruby-xen is licenced under the GPL. This means that you can use it in commercial
|
48
|
+
or open source applications. More details found here:
|
49
|
+
http://www.gnu.org/licenses/gpl.html
|
50
|
+
|
51
|
+
ruby-xen
|
52
|
+
Copyright (C) 2008 Mike Bailey and Nick Markfleet
|
53
|
+
|
54
|
+
This program is free software; you can redistribute it and/or
|
55
|
+
modify it under the terms of the GNU General Public License
|
56
|
+
as published by the Free Software Foundation; either version 2
|
57
|
+
of the License, or (at your option) any later version.
|
58
|
+
|
59
|
+
This program is distributed in the hope that it will be useful,
|
60
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
61
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
62
|
+
GNU General Public License for more details.
|
63
|
+
|
64
|
+
You should have received a copy of the GNU General Public License
|
65
|
+
along with this program; if not, write to the Free Software
|
66
|
+
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
data/Rakefile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'hoe'
|
5
|
+
require './lib/ruby-xen.rb'
|
6
|
+
|
7
|
+
Hoe.new('ruby-xen', RubyXen::VERSION) do |p|
|
8
|
+
# p.rubyforge_name = 'ruby-xenx' # if different than lowercase project name
|
9
|
+
p.developer('Mike Bailey', 'mike@bailey.net.au')
|
10
|
+
end
|
11
|
+
|
12
|
+
# vim: syntax=Ruby
|
data/bin/ruby-xen
ADDED
File without changes
|
data/lib/ruby-xen.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
class Array #:nodoc:
|
2
|
+
# Extracts options from a set of arguments. Removes and returns the last
|
3
|
+
# element in the array if it's a hash, otherwise returns a blank hash.
|
4
|
+
#
|
5
|
+
# def options(*args)
|
6
|
+
# args.extract_options!
|
7
|
+
# end
|
8
|
+
#
|
9
|
+
# options(1, 2) # => {}
|
10
|
+
# options(1, 2, :a => :b) # => {:a=>:b}
|
11
|
+
def extract_options!
|
12
|
+
last.is_a?(::Hash) ? pop : {}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
module Xen
|
17
|
+
# Location of Xen config files
|
18
|
+
XEN_DOMU_CONFIG_DIR = '/etc/xen'
|
19
|
+
# XEN_DOMU_CONFIG_DIR = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '/spec/fixtures/xen_domu_configs'))
|
20
|
+
|
21
|
+
# We don't want out library to hit Xen too often (premature optimization perhaps?)
|
22
|
+
# so we keep information about Xen instances in an object. Specify how long before
|
23
|
+
# the object expires.
|
24
|
+
INSTANCE_OBJECT_LIFETIME = 1
|
25
|
+
|
26
|
+
# DRY up some classes (children of Domain) with some module funkiness.
|
27
|
+
module Parentable
|
28
|
+
# Returns the parent Domain object (d) for a sub-object.
|
29
|
+
# We ensure d.instance.object_id == self.object_id
|
30
|
+
#
|
31
|
+
# ==== Example
|
32
|
+
# i = Xen::Instance.all[2]
|
33
|
+
# d = i.domain
|
34
|
+
# # i.object_id == d.instance.object_id
|
35
|
+
#
|
36
|
+
def domain
|
37
|
+
d = Xen::Domain.new(name)
|
38
|
+
d.instance_variable_set("@#{self.class.to_s.sub('Xen::','').downcase}", self)
|
39
|
+
d
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
require "#{File.dirname(__FILE__)}/xen/backup"
|
45
|
+
require "#{File.dirname(__FILE__)}/xen/command"
|
46
|
+
require "#{File.dirname(__FILE__)}/xen/config"
|
47
|
+
require "#{File.dirname(__FILE__)}/xen/domain"
|
48
|
+
require "#{File.dirname(__FILE__)}/xen/host"
|
49
|
+
require "#{File.dirname(__FILE__)}/xen/image"
|
50
|
+
require "#{File.dirname(__FILE__)}/xen/instance"
|
data/lib/xen/backup.rb
ADDED
data/lib/xen/command.rb
ADDED
data/lib/xen/config.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
# The Xen config files on disk
|
2
|
+
class Xen::Config
|
3
|
+
include Xen::Parentable
|
4
|
+
attr_accessor :name, :kernel, :ramdisk, :memory, :root, :disk, :vif, :on_poweroff, :on_reboot, :on_crash, :extra
|
5
|
+
|
6
|
+
def initialize(*args)
|
7
|
+
options = args.extract_options!
|
8
|
+
@name = args.first
|
9
|
+
@kernel = options[:kernel]
|
10
|
+
@ramdisk = options[:ramdisk]
|
11
|
+
@memory = options[:memory]
|
12
|
+
@root = options[:root]
|
13
|
+
@disk = options[:disk]
|
14
|
+
@vif = options[:vif]
|
15
|
+
@on_poweroff = options[:on_poweroff]
|
16
|
+
@on_reboot = options[:on_reboot]
|
17
|
+
@on_crash = options[:on_crash]
|
18
|
+
@extra = options[:extra]
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.find(*args)
|
22
|
+
options = args.extract_options!
|
23
|
+
case args.first
|
24
|
+
when :all then all
|
25
|
+
else find_by_name(args.first)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.all
|
30
|
+
config_files = Dir.glob("#{Xen::XEN_DOMU_CONFIG_DIR}/*.cfg")
|
31
|
+
config_files.collect do |filename|
|
32
|
+
create_from_config_file(File.read(filename))
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.find_by_name(name)
|
37
|
+
return new('Domain-0') if name == 'Domain-0'
|
38
|
+
filename = "#{Xen::XEN_DOMU_CONFIG_DIR}/#{name}.cfg"
|
39
|
+
create_from_config_file(File.read(filename))
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.create_from_config_file(config)
|
43
|
+
name, kernel, ramdisk, memory, root, disk, vif, on_poweroff, on_reboot, on_crash, extra = nil
|
44
|
+
eval(config)
|
45
|
+
new(name, :disk => disk, :kernel => kernel, :ramdisk => ramdisk, :memory => memory, :root => root, :disk => disk, :vif => vif, :on_poweroff => on_poweroff, :on_reboot => on_reboot, :on_crash => on_crash, :extra => extra)
|
46
|
+
end
|
47
|
+
|
48
|
+
def save
|
49
|
+
puts "I saved the config!"
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
data/lib/xen/domain.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
class Xen::Domain
|
2
|
+
attr_accessor :name, :image, :config
|
3
|
+
|
4
|
+
def initialize(name)
|
5
|
+
@name = name
|
6
|
+
@config = Xen::Config.find(name)
|
7
|
+
@instance = Xen::Instance.find(name)
|
8
|
+
@image = Xen::Image.find(name)
|
9
|
+
end
|
10
|
+
|
11
|
+
def instance
|
12
|
+
if @instance && @instance.object_expires > Time.now
|
13
|
+
@instance
|
14
|
+
else
|
15
|
+
@instance = Xen::Instance.find(@name)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.find(*args)
|
20
|
+
options = args.extract_options!
|
21
|
+
case args.first
|
22
|
+
when :all then Xen::Config.find(:all, options).collect { |config| config.domain }
|
23
|
+
when :running then Xen::Instance.find(:all, options).collect { |instance| instance.domain }
|
24
|
+
# Retrieve a Domain by name
|
25
|
+
else Xen::Config.find_by_name(args.first) && self.new(args.first)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def all(options={})
|
30
|
+
self.find(:all, options)
|
31
|
+
end
|
32
|
+
|
33
|
+
def running?
|
34
|
+
self.instance ? true : false
|
35
|
+
end
|
36
|
+
|
37
|
+
def start
|
38
|
+
Xen::Instance.create(@name)
|
39
|
+
@instance = Xen::Instance.find(@name)
|
40
|
+
end
|
41
|
+
|
42
|
+
def stop
|
43
|
+
Xen::Instance.shutdown(@name)
|
44
|
+
@instance = Xen::Instance.find(@name)
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
data/lib/xen/host.rb
ADDED
data/lib/xen/image.rb
ADDED
data/lib/xen/instance.rb
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
class Xen::Instance
|
2
|
+
include Xen::Parentable
|
3
|
+
attr_reader :name, :domid, :memory, :cpu_time, :vcpus, :state, :start_time, :object_expires
|
4
|
+
|
5
|
+
def initialize(name, options={})
|
6
|
+
@name = name
|
7
|
+
@domid = options[:domid]
|
8
|
+
@memory = options[:memory]
|
9
|
+
@cpu_time = options[:cpu_time]
|
10
|
+
@vcpus = options[:vcpus]
|
11
|
+
@state = options[:state]
|
12
|
+
@start_time = options[:start_time]
|
13
|
+
@object_expires = Time.now + Xen::INSTANCE_OBJECT_LIFETIME
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.find(*args)
|
17
|
+
options = args.extract_options!
|
18
|
+
case args.first
|
19
|
+
when :all then all
|
20
|
+
else find_by_name(args.first)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.all
|
25
|
+
result = Xen::Command.xm_list
|
26
|
+
# XXX check for failed command
|
27
|
+
result_array = result.split("\n")
|
28
|
+
result_array.shift
|
29
|
+
result_array.collect do |domain|
|
30
|
+
name, domid, memory, vcpus, state, cpu_time = domain.scan(/[^ ,]+/)
|
31
|
+
new(name, :domid => domid, :memory => memory, :cpu_time => cpu_time)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.find_by_name(name)
|
36
|
+
all.detect{|domain| domain.name == name.to_s }
|
37
|
+
end
|
38
|
+
|
39
|
+
# XXX Rails version - we need some error checking!
|
40
|
+
#
|
41
|
+
# def self.find_by_name(name, options)
|
42
|
+
# if result = find_every(options)
|
43
|
+
# result.detect{ |domain| domain.name == name }
|
44
|
+
# else
|
45
|
+
# raise RecordNotFound, "Couldn't find domain with name=#{name}"
|
46
|
+
# end
|
47
|
+
# end
|
48
|
+
|
49
|
+
def self.create(name)
|
50
|
+
output = `xm create #{name}.cfg`
|
51
|
+
$? == 0 ? true : false
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.shutdown(name)
|
55
|
+
output = `xm shutdown #{name}`
|
56
|
+
$? == 0 ? true : false
|
57
|
+
end
|
58
|
+
|
59
|
+
# A convenience wrapper for <tt>find(:dom0)</tt>.</tt>.
|
60
|
+
def self.dom0(*args)
|
61
|
+
find_by_name(:dom0)
|
62
|
+
end
|
63
|
+
|
64
|
+
def uptime
|
65
|
+
start_time ? Time.now - start_time : nil
|
66
|
+
end
|
67
|
+
|
68
|
+
def running?
|
69
|
+
output = `xm list #{name}`
|
70
|
+
$? == 0 ? true : false
|
71
|
+
end
|
72
|
+
|
73
|
+
def reboot
|
74
|
+
`xm reboot #{name}`
|
75
|
+
$? == 0 ? true : false
|
76
|
+
end
|
77
|
+
|
78
|
+
def destroy
|
79
|
+
end
|
80
|
+
|
81
|
+
def pause
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
File without changes
|
metadata
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mbailey-ruby-xen
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Mike Bailey
|
8
|
+
- Nick Marfleet
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2008-09-08 00:00:00 -07:00
|
14
|
+
default_executable:
|
15
|
+
dependencies: []
|
16
|
+
|
17
|
+
description: ruby-xen allows you to manage Xen virtual servers via Ruby. It currently wraps the command line tools provided by Xen (xm) as well as Steve Kemps excellent Xen-tools (http://www.xen-tools.org/software/xen-tools/).
|
18
|
+
email: mike@bailey.net.au
|
19
|
+
executables: []
|
20
|
+
|
21
|
+
extensions: []
|
22
|
+
|
23
|
+
extra_rdoc_files:
|
24
|
+
- History.txt
|
25
|
+
- Manifest.txt
|
26
|
+
- README.rdoc
|
27
|
+
files:
|
28
|
+
- History.txt
|
29
|
+
- Manifest.txt
|
30
|
+
- README.rdoc
|
31
|
+
- Rakefile
|
32
|
+
- bin/ruby-xen
|
33
|
+
- lib/ruby-xen.rb
|
34
|
+
- test/test_ruby-xen.rb
|
35
|
+
- lib/xen/backup.rb
|
36
|
+
- lib/xen/command.rb
|
37
|
+
- lib/xen/config.rb
|
38
|
+
- lib/xen/domain.rb
|
39
|
+
- lib/xen/host.rb
|
40
|
+
- lib/xen/image.rb
|
41
|
+
- lib/xen/instance.rb
|
42
|
+
has_rdoc: true
|
43
|
+
homepage: http://github.com/schacon/grit
|
44
|
+
post_install_message:
|
45
|
+
rdoc_options:
|
46
|
+
- --main
|
47
|
+
- README.rdoc
|
48
|
+
require_paths:
|
49
|
+
- lib
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: "0"
|
55
|
+
version:
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: "0"
|
61
|
+
version:
|
62
|
+
requirements: []
|
63
|
+
|
64
|
+
rubyforge_project:
|
65
|
+
rubygems_version: 1.2.0
|
66
|
+
signing_key:
|
67
|
+
specification_version: 2
|
68
|
+
summary: Ruby library for managing Xen virtual hosts
|
69
|
+
test_files: []
|
70
|
+
|