mbailey-ruby-xen 0.0.2 → 0.0.3

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 CHANGED
@@ -1,3 +1,8 @@
1
+ === 0.0.3 / 2008-09-21
2
+
3
+ * fleshed out :backup class
4
+ * Xen::Commands are now easily called by backgroundjob (bj)
5
+
1
6
  === 0.0.2 / 2008-09-11
2
7
 
3
8
  * Broke out classes into separate files
data/Manifest.txt CHANGED
@@ -8,9 +8,11 @@ test/test_ruby-xen.rb
8
8
  lib/ruby-xen/domain.rb
9
9
  lib/xen/backup.rb
10
10
  lib/xen/command.rb
11
- lib/xen/config.rb
12
- lib/xen/slice.rb
11
+ lib/xen/config_file.rb
13
12
  lib/xen/host.rb
14
- lib/xen/image.rb
15
13
  lib/xen/instance.rb
16
- lib/templates/domu.cfg.erb
14
+ lib/xen/lvm.rb
15
+ lib/xen/slice.rb
16
+ lib/xen/xen_tools_conf.rb
17
+ lib/templates/domu.cfg.erb
18
+ lib/templates/xen-tools.conf.erb
data/README.rdoc CHANGED
@@ -1,6 +1,4 @@
1
- = ruby-xen
2
-
3
- # Warning! Not ready yet - project started Sep 2008
1
+ = ruby-xen (born sep 2008 - still immature!)
4
2
 
5
3
  http://github.com/mbailey/ruby-xen
6
4
 
data/lib/ruby-xen.rb CHANGED
@@ -1,3 +1,36 @@
1
+ class ValidationFailed < StandardError; end
2
+
3
+
4
+ module Xen
5
+ # General configuration for ruby-xen
6
+
7
+ # Location of Xen config files
8
+ XEN_DOMU_CONFIG_DIR = '/etc/xen'
9
+ # XEN_DOMU_CONFIG_DIR = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '/spec/fixtures/xen_domu_configs'))
10
+
11
+ # We don't want out library to hit Xen too often (premature optimization perhaps?)
12
+ # so we keep information about Xen instances in an object. Specify how long before
13
+ # the object expires.
14
+ INSTANCE_OBJECT_LIFETIME = 5 # seconds
15
+
16
+ # General location for config file templates
17
+ TEMPLATE_DIR = File.expand_path(File.dirname(__FILE__) + '/../lib/templates')
18
+
19
+ # Extension for Xen domU config files
20
+ CONFIG_FILE_EXTENSION = '.cfg'
21
+
22
+ # Directory for backups of system images
23
+ BACKUP_DIR='/var/xen_images'
24
+
25
+ # File extension for backups
26
+ BACKUP_FILE_EXT = '.tar'
27
+
28
+ TEMPLATES_BASE = File.join(File.dirname(__FILE__), 'templates')
29
+
30
+ XEN_TOOLS_CONFIG_FILE = '/etc/xen-tools/xen-tools.conf'
31
+
32
+ end
33
+
1
34
  class Array #:nodoc:
2
35
  # Extracts options from a set of arguments. Removes and returns the last
3
36
  # element in the array if it's a hash, otherwise returns a blank hash.
@@ -13,21 +46,44 @@ class Array #:nodoc:
13
46
  end
14
47
  end
15
48
 
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
- TEMPLATE_DIR = File.expand_path(File.dirname(__FILE__) + '/../lib/templates')
49
+ class Hash #:nodoc:
50
+ # Converts a Hash into an array of key=val formatted strings
51
+ #
52
+ # puts { :nics => 2, :vcpus => 1, :memory => 64, :dhcp => true }.to_args
53
+ #
54
+ # produces:
55
+ #
56
+ # ["--memory=64", "--nics=2", "--vcpus=1", "--dhcp"]
57
+ def to_args
58
+ collect{|k,v| (v.to_s == 'true') ? "--#{k.to_s}" : "--#{k.to_s}=#{v}"}
59
+ end
60
+ end
61
+
62
+ class String
27
63
 
28
- # Extension for Xen domU config files
29
- CONFIG_FILE_EXTENSION = '.cfg'
64
+ # Convert string to megabytes
65
+ def to_megabytes
66
+ gigabytes = /(gb|gig|gigabytes?)/i
67
+ megabytes = /(mb|meg|megabytes?)/i
68
+ kilobytes = /(kb|kilobytes?)/i
69
+ bytes = /bytes?/i
70
+
71
+ if index(gigabytes)
72
+ return sub(gigabytes,'').to_i * 1024
73
+ elsif index(megabytes)
74
+ return sub(megabytes,'').to_i
75
+ elsif index(kilobytes)
76
+ return sub(kilobytes,'').to_i / 1024
77
+ elsif index(bytes)
78
+ return sub(bytes,'').to_i / (1024*1024)
79
+ else
80
+ return self.to_i
81
+ end
82
+ end
30
83
 
84
+ end
85
+
86
+ module Xen
31
87
  # DRY up some classes (children of Slice) with some module funkiness.
32
88
  module Parentable
33
89
  # Returns the parent Slice object (d) for a sub-object.
@@ -39,7 +95,7 @@ module Xen
39
95
  # i.object_id == s.instance.object_id # true
40
96
  #
41
97
  def slice
42
- d = Xen::Slice.new(name)
98
+ d = Xen::Slice.new(:name => name)
43
99
  # Insert the current object into the newly created Slice's attributes
44
100
  d.instance_variable_set("@#{self.class.to_s.sub('Xen::','').downcase}", self)
45
101
  d
@@ -47,10 +103,28 @@ module Xen
47
103
  end
48
104
  end
49
105
 
106
+ class String
107
+ def underscorize
108
+ self.sub("-", "__")
109
+ end
110
+ def ununderscorize
111
+ self.sub("__", "-")
112
+ end
113
+ end
114
+
115
+ # We want to use Rails's stringify_keys
116
+ require "active_support/core_ext/hash/keys"
117
+ require "active_support/core_ext/hash/reverse_merge"
118
+ class Hash #:nodoc:
119
+ include ActiveSupport::CoreExtensions::Hash::Keys
120
+ include ActiveSupport::CoreExtensions::Hash::ReverseMerge
121
+ end
122
+
50
123
  require "#{File.dirname(__FILE__)}/xen/backup"
51
124
  require "#{File.dirname(__FILE__)}/xen/command"
52
- require "#{File.dirname(__FILE__)}/xen/config"
53
- require "#{File.dirname(__FILE__)}/xen/slice"
125
+ require "#{File.dirname(__FILE__)}/xen/config_file"
54
126
  require "#{File.dirname(__FILE__)}/xen/host"
55
- require "#{File.dirname(__FILE__)}/xen/image"
56
- require "#{File.dirname(__FILE__)}/xen/instance"
127
+ require "#{File.dirname(__FILE__)}/xen/instance"
128
+ require "#{File.dirname(__FILE__)}/xen/slice"
129
+ require "#{File.dirname(__FILE__)}/xen/xen_tools_conf"
130
+ require "#{File.dirname(__FILE__)}/xen/lvm"
@@ -37,4 +37,4 @@ on_poweroff = '<%= on_poweroff %>'
37
37
  on_reboot = '<%= on_reboot %>'
38
38
  on_crash = '<%= on_crash %>'
39
39
 
40
- extra = '<%= extra %>'
40
+ extra = '<%= extra %>'
@@ -0,0 +1,289 @@
1
+ <%
2
+ # This is like a Rails Helper and belongs somewhere else
3
+ def comment_if_blank(attribute)
4
+ instance_variable_get('@'+ attribute.to_s) ? '' : '# '
5
+ end
6
+
7
+ def render_config(name, default)
8
+ "#{comment_if_blank(name)}#{name.to_s.ununderscorize} = #{instance_variable_get('@'+ name.to_s) || default}"
9
+ end
10
+ %>
11
+ ##
12
+ # /etc/xen-tools/xen-tools.conf
13
+ ##
14
+ #
15
+ # This is the global configuration file for the scripts included
16
+ # within the xen-tools package.
17
+ #
18
+ # For more details please see:
19
+ #
20
+ # http://xen-tools.org/
21
+ #
22
+ ##
23
+
24
+
25
+ ##
26
+ #
27
+ # File Format
28
+ # -----------
29
+ #
30
+ # Anything following a '#' character is ignored as a comment.
31
+ #
32
+ # Otherwise the format of this file "key = value". The value of
33
+ # any keys in this file may be constructed via the output of a command.
34
+ #
35
+ # For example:
36
+ #
37
+ # kernel = /boot/vmlinuz-`uname -r`
38
+ #
39
+ ##
40
+
41
+
42
+
43
+ #
44
+ ##
45
+ # Output directory for storing loopback images.
46
+ #
47
+ # If you choose to use loopback images, which are simple to manage but
48
+ # slower than LVM partitions, then specify a directory here and uncomment
49
+ # the line.
50
+ #
51
+ # New instances will be stored in subdirectories named after their
52
+ # hostnames.
53
+ #
54
+ ##
55
+ <%= render_config :dir, '/home/xen' %>
56
+ #
57
+
58
+ #
59
+ ##
60
+ #
61
+ # If you don't wish to use loopback images then you may specify an
62
+ # LVM volume group here instead
63
+ #
64
+ ##
65
+ <%= render_config :lvm, 'skx-vg' %>
66
+
67
+
68
+ #
69
+ ##
70
+ #
71
+ # Installation method.
72
+ #
73
+ # There are four distinct methods which you may to install a new copy
74
+ # of Linux to use in your Xen guest domain:
75
+ #
76
+ # - Installation via the debootstrap command.
77
+ # - Installation via the rpmstrap command.
78
+ # - Installation via the rinse command.
79
+ # - Installation by copying a directory containing a previous installation.
80
+ # - Installation by untarring a previously archived image.
81
+ #
82
+ # NOTE That if you use the "untar", or "copy" options you should ensure
83
+ # that the image you're left with matches the 'dist' setting later in
84
+ # this file.
85
+ #
86
+ #
87
+ ##
88
+ #
89
+ #
90
+ # install-method = [ debootstrap | rinse | rpmstrap | copy | tar ]
91
+ #
92
+ #
93
+ <%= render_config :install__method, 'debootstrap' %>
94
+ #
95
+ # If you're using the "copy", or "tar" installation methods you must
96
+ # need to specify the source location to copy from, or the source
97
+ # .tar file to unpack.
98
+ #
99
+ # You may specify that with a line such as:
100
+ #
101
+ # install-source = /path/to/copy
102
+ # install-source = /some/path/img.tar
103
+ #
104
+ #
105
+ <%= render_config :install__source, '/some/path/img.tar' %>
106
+
107
+ #
108
+ ##
109
+ # Command definitions.
110
+ ##
111
+ #
112
+ # The "rinse", and "rpmstrap" commands are hardwired into
113
+ # the script, but if you wish to modify the commands which are executed
114
+ # when installing new systems by a "copy", "debootstrap", or "tar" method
115
+ # you can do so here:
116
+ #
117
+ # (This allows you to install from a .tar.bz file, rather than a plain
118
+ # tar file, use cdebootstrap, etc.)
119
+ #
120
+ # install-method=copy:
121
+ <%= render_config :copy__cmd, '/bin/cp -a $src/* $dest' %>
122
+ #
123
+ # install-method=debootstrap:
124
+ <%= render_config :debootstrap__cmd, '/usr/sbin/debootstrap' %>
125
+ #
126
+ # install-method=tar:
127
+ <%= render_config :tar__cmd, '/bin/tar --numeric-owner -xvf $src' %>
128
+ #
129
+ #
130
+
131
+
132
+
133
+ #
134
+ ##
135
+ # Disk and Sizing options.
136
+ ##
137
+ #
138
+ <%= render_config :size, '4Gb' %> # Disk image size.
139
+ <%= render_config :memory, '128Mb' %> # Memory size.
140
+ <%= render_config :swap, '256Mb' %> # Swap size.
141
+ <%= render_config :noswap, '1' %> # Don't use swap at all for the new system.
142
+ <%= render_config :fs, 'ext3' %> # Use the EXT3 filesystem for the disk image.
143
+ <%= render_config :dist, 'etch' %> # Default distribution to install.
144
+ <%= render_config :image, 'sparse' %> # Specify sparse vs. full disk images.
145
+
146
+ #
147
+ # Currently supported and tested distributions include:
148
+ #
149
+ # via Debootstrap:
150
+ #
151
+ # Debian:
152
+ # sid, sarge, etch, lenny.
153
+ #
154
+ # Ubuntu:
155
+ # edgy, feisty, dapper.
156
+ #
157
+ # via Rinse:
158
+ # centos-4, centos-5.
159
+ # fedora-core-4, fedora-core-5, fedora-core-6, fedora-core-7
160
+ #
161
+ #
162
+
163
+
164
+
165
+ ##
166
+ # Networking setup values.
167
+ ##
168
+
169
+ #
170
+ # Uncomment and adjust these network settings if you wish to give your
171
+ # new instances static IP addresses.
172
+ #
173
+ <%= render_config :gateway, '192.168.1.1' %>
174
+ <%= render_config :netmask, '255.255.255.0' %>
175
+ <%= render_config :broadcast, '192.168.1.255' %>
176
+ #
177
+ # Uncomment this if you wish the images to use DHCP
178
+ #
179
+ <%= render_config :dhcp, 1 %>
180
+
181
+
182
+ ##
183
+ # Misc options
184
+ ##
185
+
186
+ #
187
+ # Uncomment the following line if you wish to disable the caching
188
+ # of downloaded .deb files when using debootstrap to install images.
189
+ #
190
+ <%= render_config :cache, 'no' %>
191
+ #
192
+
193
+ #
194
+ # Uncomment the following line if you wish to interactively setup
195
+ # a new root password for images.
196
+ #
197
+ <%= render_config :passwd, 1 %>
198
+
199
+ #
200
+ # If you'd like all accounts on your host system which are not present
201
+ # on the guest system to be copied over then uncomment the following line.
202
+ #
203
+ <%= render_config :accounts, 1 %>
204
+ #
205
+
206
+ #
207
+ # Default kernel and ramdisk to use for the virtual servers
208
+ #
209
+ <%= render_config :kernel, '/boot/vmlinuz-`uname -r`' %>
210
+ <%= render_config :initrd, '/boot/initrd.img-`uname -r`' %>
211
+
212
+ #
213
+ # The architecture to use when using debootstrap, rinse, or rpmstrap.
214
+ #
215
+ # This is most useful on 64 bit host machines, for other systems it
216
+ # doesn't need to be used.
217
+ #
218
+ <%= render_config :arch, '[i386|amd64]' %>
219
+ #
220
+
221
+ #
222
+ # The default mirror for debootstrap to install Debian-derived distributions
223
+ #
224
+ # mirror = http://ftp.us.debian.org/debian/
225
+
226
+ #
227
+ # A mirror suitable for use when installing the Dapper release of Ubuntu.
228
+ #
229
+ # mirror = http://archive.ubuntu.com/ubuntu/
230
+
231
+ <%= render_config :mirror, 'http://archive.ubuntu.com/ubuntu/' %>
232
+
233
+
234
+ #
235
+ # If you like you could use per-distribution mirrors, which will
236
+ # be more useful if you're working in an environment where you want
237
+ # to regularly use multiple distributions:
238
+ #
239
+ # mirror_sid=http://ftp.us.debian.org/debian
240
+ # mirror_sarge=http://ftp.us.debian.org/debian
241
+ # mirror_etch=http://ftp.us.debian.org/debian
242
+ # mirror_dapper=http://archive.ubuntu.com/ubuntu
243
+ # mirror_edgy=http://archive.ubuntu.com/ubuntu
244
+ # mirror_feisty=http://archive.ubuntu.com/ubuntu
245
+ # mirror_gutsy=http://archive.ubuntu.com/ubuntu
246
+
247
+
248
+ #
249
+ # Filesystem options for the different filesystems we support.
250
+ #
251
+ <%= render_config :ext3_options, 'noatime,nodiratime,errors=remount-ro' %>
252
+ <%= render_config :ext2_options, 'noatime,nodiratime,errors=remount-ro' %>
253
+ <%= render_config :xfs_options, 'defaults' %>
254
+ <%= render_config :reiser_options, 'defaults' %>
255
+
256
+ #
257
+ # Uncomment if you wish newly created images to boot once they've been
258
+ # created.
259
+ #
260
+ <%= render_config :boot, '1' %>
261
+
262
+
263
+ #
264
+ # If you're using a newer version of the Xen guest kernel you will
265
+ # need to make sure that you use 'xvc0' for the guest serial device,
266
+ # and 'xvdX' instead of 'sdX' for serial devices.
267
+ #
268
+ # You may specify the things to use here:
269
+ #
270
+ # serial_device = tty1 #default
271
+ # serial_device = xvc0
272
+ #
273
+ # disk_device = sda #default
274
+ # disk_device = xvda
275
+ #
276
+
277
+
278
+ #
279
+ # Here we specify the output directory which the Xen configuration
280
+ # files will be written to, and the suffix to give them.
281
+ #
282
+ # Historically xen-tools have created configuration files in /etc/xen,
283
+ # and given each file the name $hostname.cfg. If you want to change
284
+ # that behaviour you may do so here.
285
+ #
286
+ #
287
+ <%= render_config :output, '/etc/xen' %>
288
+ <%= render_config :extension, '.cfg' %>
289
+ #