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 +53 -0
- data/Rakefile +12 -0
- data/bin/ruby-xen +0 -0
- data/lib/ruby-xen.rb +4 -0
- data/lib/ruby-xen/domain.rb +229 -0
- data/test/test_ruby-xen.rb +0 -0
- metadata +64 -0
data/History.txt
ADDED
data/Manifest.txt
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
= ruby-xen
|
2
|
+
|
3
|
+
* FIX (url)
|
4
|
+
|
5
|
+
== DESCRIPTION:
|
6
|
+
|
7
|
+
ruby-xen is a ruby library for managing Xen virtual servers. It currently
|
8
|
+
wraps the command line tools provided by Xen (xm) as well as Steve Kemps
|
9
|
+
excellent Xen-tools [http://www.xen-tools.org/software/xen-tools/].
|
10
|
+
|
11
|
+
ruby-xen is packaged as a Rails Gem which means you can require it from
|
12
|
+
a Ruby on Rails project and make use of the classes it provides.
|
13
|
+
|
14
|
+
ruby-xen can also be used by ruby code or from irb.
|
15
|
+
|
16
|
+
== FEATURES/PROBLEMS:
|
17
|
+
|
18
|
+
* FIX (list of features or problems)
|
19
|
+
|
20
|
+
== SYNOPSIS:
|
21
|
+
|
22
|
+
FIX (code sample of usage)
|
23
|
+
|
24
|
+
== REQUIREMENTS:
|
25
|
+
|
26
|
+
xen-tools (http://www.xen-tools.org/software/xen-tools/)
|
27
|
+
|
28
|
+
== INSTALL:
|
29
|
+
|
30
|
+
sudo gem install ruby-xen
|
31
|
+
|
32
|
+
== LICENSE:
|
33
|
+
|
34
|
+
ruby-xen is licenced under the GPL. This means that you can use it in commercial
|
35
|
+
or open source applications. More details found here:
|
36
|
+
http://www.gnu.org/licenses/gpl.html
|
37
|
+
|
38
|
+
ruby-xen
|
39
|
+
Copyright (C) 2008 Mike Bailey and Nick Markfleet
|
40
|
+
|
41
|
+
This program is free software; you can redistribute it and/or
|
42
|
+
modify it under the terms of the GNU General Public License
|
43
|
+
as published by the Free Software Foundation; either version 2
|
44
|
+
of the License, or (at your option) any later version.
|
45
|
+
|
46
|
+
This program is distributed in the hope that it will be useful,
|
47
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
48
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
49
|
+
GNU General Public License for more details.
|
50
|
+
|
51
|
+
You should have received a copy of the GNU General Public License
|
52
|
+
along with this program; if not, write to the Free Software
|
53
|
+
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,229 @@
|
|
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
|
+
class Host
|
18
|
+
|
19
|
+
attr_reader :host, :machine, :total_memory, :free_memory
|
20
|
+
def initialize
|
21
|
+
result = `xm info`
|
22
|
+
result.scan(/(\S+)\s*:\s*([^\n]+)/).each do |i,j|
|
23
|
+
instance_variable_set("@#{i}", j)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
class Domain
|
31
|
+
|
32
|
+
attr_accessor :name, :image, :config, :instance
|
33
|
+
|
34
|
+
def initialize(name)
|
35
|
+
@name = name
|
36
|
+
@config = Xen::Config.find(name)
|
37
|
+
@instance = Xen::Instance.find(name)
|
38
|
+
@image = Xen::Image.find(name)
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.find(*args)
|
42
|
+
options = args.extract_options!
|
43
|
+
case args.first
|
44
|
+
when :all then Xen::Config.find(:all, options).collect { |config| Xen::Domain.new(config.name) }
|
45
|
+
when :running then Xen::Instance.find(:all, options).collect { |instance| Xen::Domain.new(instance.name) }
|
46
|
+
# Retrieve a Domain by name
|
47
|
+
else Xen::Config.find_by_name(args.first) && self.new(args.first)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def running?
|
52
|
+
@instance
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
class Config
|
59
|
+
|
60
|
+
attr_reader :name, :memory, :ip
|
61
|
+
|
62
|
+
def initialize(*args)
|
63
|
+
options = args.extract_options!
|
64
|
+
@name = args.first
|
65
|
+
@memory = options[:memory] || nil
|
66
|
+
@ip = options[:ip] || nil
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.find(*args)
|
70
|
+
options = args.extract_options!
|
71
|
+
case args.first
|
72
|
+
when :all then all
|
73
|
+
else find_by_name(args.first)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.all
|
78
|
+
result = `xen-list-images`
|
79
|
+
configs = result.scan(/Name: (\w+)\nMemory: (\w+)\nIP: (\S+)/)
|
80
|
+
configs.collect do |config|
|
81
|
+
name, memory, ip = config
|
82
|
+
new(name, :memory => memory, :ip => ip)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.find_by_name(name)
|
87
|
+
return new('Domain-0') if name == 'Domain-0'
|
88
|
+
all.detect {|config| puts config; config.name == name.to_s}
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
class Image
|
95
|
+
|
96
|
+
attr_accessor :name
|
97
|
+
|
98
|
+
def initialize(name)
|
99
|
+
@name = name
|
100
|
+
end
|
101
|
+
|
102
|
+
def self.find(name)
|
103
|
+
new name
|
104
|
+
end
|
105
|
+
|
106
|
+
def find_one(name, options)
|
107
|
+
if result = find_every(options).first
|
108
|
+
result
|
109
|
+
else
|
110
|
+
raise RecordNotFound, "Couldn't find domain with name=#{name}"
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
|
116
|
+
class Instance
|
117
|
+
|
118
|
+
attr_reader :name, :domid, :memory, :cpu_time, :vcpus, :state, :start_time
|
119
|
+
|
120
|
+
def initialize(name, options={})
|
121
|
+
@name = name
|
122
|
+
@domid = options[:domid] || nil
|
123
|
+
@memory = options[:memory] || nil
|
124
|
+
@cpu_time = options[:cpu_time] || nil
|
125
|
+
@vcpus = options[:vcpus] || nil
|
126
|
+
@state = options[:state] || nil
|
127
|
+
@start_time = options[:start_time] || nil
|
128
|
+
end
|
129
|
+
|
130
|
+
def self.find(*args)
|
131
|
+
options = args.extract_options!
|
132
|
+
case args.first
|
133
|
+
when :all then all
|
134
|
+
else find_by_name(args.first)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def self.all
|
139
|
+
result = `xm list`
|
140
|
+
# XXX check for failed command
|
141
|
+
result_array = result.split("\n")
|
142
|
+
result_array.shift
|
143
|
+
result_array.collect do |domain|
|
144
|
+
name, domid, memory, vcpus, state, cpu_time = domain.scan(/[^ ,]+/)
|
145
|
+
new(name, :domid => domid, :memory => memory, :cpu_time => cpu_time)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def self.find_by_name(name)
|
150
|
+
all.detect{|domain| domain.name == name.to_s }
|
151
|
+
end
|
152
|
+
|
153
|
+
# XXX Rails version - we need some error checking!
|
154
|
+
#
|
155
|
+
# def self.find_by_name(name, options)
|
156
|
+
# if result = find_every(options)
|
157
|
+
# result.detect{ |domain| domain.name == name }
|
158
|
+
# else
|
159
|
+
# raise RecordNotFound, "Couldn't find domain with name=#{name}"
|
160
|
+
# end
|
161
|
+
# end
|
162
|
+
|
163
|
+
# A convenience wrapper for <tt>find(:dom0)</tt>.</tt>.
|
164
|
+
def dom0(*args)
|
165
|
+
find_by_name(:dom0)
|
166
|
+
end
|
167
|
+
|
168
|
+
# This is an alias for find(:all). You can pass in all the same arguments to this method as you can
|
169
|
+
# to find(:all)
|
170
|
+
def all(*args)
|
171
|
+
find(:all, *args)
|
172
|
+
end
|
173
|
+
|
174
|
+
def uptime
|
175
|
+
start_time ? Time.now - start_time : nil
|
176
|
+
end
|
177
|
+
|
178
|
+
def running?
|
179
|
+
output = `xm list #{name}`
|
180
|
+
$? == 0 ? true : false
|
181
|
+
end
|
182
|
+
|
183
|
+
def start
|
184
|
+
output = `xm create #{name}.cfg`
|
185
|
+
$? == 0 ? true : false
|
186
|
+
end
|
187
|
+
|
188
|
+
def shutdown
|
189
|
+
output = `xm shutdown #{name}`
|
190
|
+
$? == 0 ? true : false
|
191
|
+
end
|
192
|
+
|
193
|
+
def reboot
|
194
|
+
`xm reboot #{name}`
|
195
|
+
$? == 0 ? true : false
|
196
|
+
end
|
197
|
+
|
198
|
+
def destroy
|
199
|
+
end
|
200
|
+
|
201
|
+
def pause
|
202
|
+
end
|
203
|
+
|
204
|
+
end
|
205
|
+
|
206
|
+
class Backup
|
207
|
+
end
|
208
|
+
|
209
|
+
# class XenTools
|
210
|
+
#
|
211
|
+
# def self.xen_list_images
|
212
|
+
# puts "returning list of images"
|
213
|
+
# end
|
214
|
+
#
|
215
|
+
# def xen_create_image
|
216
|
+
# puts "creating image"
|
217
|
+
# end
|
218
|
+
#
|
219
|
+
# def xen_delete_image
|
220
|
+
# puts "creating image"
|
221
|
+
# end
|
222
|
+
#
|
223
|
+
# def xen_archive_image
|
224
|
+
# puts "archiving image"
|
225
|
+
# end
|
226
|
+
#
|
227
|
+
# end
|
228
|
+
|
229
|
+
end
|
File without changes
|
metadata
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: 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 +10: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/ruby-xen/domain.rb
|
36
|
+
has_rdoc: true
|
37
|
+
homepage: http://github.com/schacon/grit
|
38
|
+
post_install_message:
|
39
|
+
rdoc_options:
|
40
|
+
- --main
|
41
|
+
- README.txt
|
42
|
+
require_paths:
|
43
|
+
- lib
|
44
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: "0"
|
49
|
+
version:
|
50
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: "0"
|
55
|
+
version:
|
56
|
+
requirements: []
|
57
|
+
|
58
|
+
rubyforge_project:
|
59
|
+
rubygems_version: 1.2.0
|
60
|
+
signing_key:
|
61
|
+
specification_version: 2
|
62
|
+
summary: Ruby library for managing Xen virtual hosts
|
63
|
+
test_files: []
|
64
|
+
|