xenrec 0.1.1 → 0.1.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.
Files changed (6) hide show
  1. data/README.rdoc +7 -0
  2. data/Rakefile +2 -0
  3. data/VERSION +1 -1
  4. data/lib/xenrec.rb +90 -15
  5. data/xenrec.gemspec +8 -2
  6. metadata +22 -2
data/README.rdoc CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  Capistrano recipe for targeting XenServer Hosts, to create and remove VMs
4
4
 
5
+ == Sample deploy.rb
6
+ role :xen, "myXenHost"
7
+ set :user, "root"
8
+
9
+ set :xen_storage_uuid, "3ec9e184-08ab-bdf1-e542-42040e4ee506"
10
+ set :xen_template_uuid, "ec61c6b2-8641-a870-b284-1cca4c891392"
11
+
5
12
  == Note on Patches/Pull Requests
6
13
 
7
14
  * Fork the project.
data/Rakefile CHANGED
@@ -13,6 +13,8 @@ begin
13
13
  gem.add_development_dependency "rspec"
14
14
  gem.add_development_dependency "yard"
15
15
  gem.add_development_dependency "cucumber"
16
+ gem.add_dependency('capistrano', '>= 2.5.9')
17
+ gem.add_dependency('capistrano-ext', '>= 1.2.1')
16
18
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
17
19
  end
18
20
  Jeweler::GemcutterTasks.new
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.1.3
data/lib/xenrec.rb CHANGED
@@ -1,18 +1,36 @@
1
1
  Capistrano::Configuration.instance(:must_exist).load do
2
2
  namespace :xenrec do
3
-
4
- desc "Create a Xen VM"
5
- task :create, :roles => :xen do
3
+ namespace :sr do
4
+ desc "List Storage Nodes"
5
+ task :list, :roles => :xen do
6
6
  get_command_line
7
-
8
- run "xe vm-install template=\"#{xen_template_uuid}\" new-name-label=\"#{xen_vm_name}\" sr_uuid=\"#{xen_storage_uuid}\""
9
- run "xe vm-start vm=\"#{xen_vm_name}\""
7
+ output = capture "xe sr-list"
8
+ puts(output)
9
+ end
10
+ end
11
+
12
+ namespace :template do
13
+ desc "List Templates"
14
+ task :list, :roles => :xen do
15
+ get_command_line
16
+ output = capture "xe template-list"
17
+ puts(output)
18
+ end
19
+ end
20
+
21
+ namespace :vm do
22
+ desc "Install a Xen VM"
23
+ task :install, :roles => :xen do
24
+ get_command_line
25
+ command = "xe vm-install template=\"#{xen_template_uuid}\" new-name-label=\"#{xen_vm_name}\""
26
+ command << " sr-uuid=#{xen_storage_uuid}" if defined? xen_storage_uuid
27
+ run command
10
28
  end
11
29
 
12
30
  desc "Shutdown a Xen VM"
13
31
  task :shutdown, :roles => :xen do
14
32
  get_command_line
15
- run "xe vm-shutdown force=#{xen_use_force} vm=\"#{xen_vm_name}\""
33
+ run "xe vm-shutdown --multiple force=#{xen_use_force} vm=\"#{xen_vm_name}\""
16
34
  end
17
35
 
18
36
  desc "Start a Xen VM"
@@ -21,25 +39,82 @@ Capistrano::Configuration.instance(:must_exist).load do
21
39
  run "xe vm-start force=#{xen_use_force} vm=\"#{xen_vm_name}\""
22
40
  end
23
41
 
42
+ desc "List Virtual Machines"
43
+ task :list, :roles => :xen do
44
+ get_command_line
45
+ output = capture "xe vm-list"
46
+ puts(output)
47
+ end
48
+
49
+ desc "Search for IP on a Xen VM. You may want to re-run this until one is returned if you just rebooted or started a vm"
50
+ task :find_ip, :roles => :xen do
51
+ get_command_line
52
+ uuid = find_uuid_by_name_label(xen_vm_name)
53
+ ip = nil;
54
+
55
+ do_until xen_retries, xen_wait do |count|
56
+ begin
57
+ ip = find_ip_by_uuid(uuid)
58
+ rescue
59
+ end
60
+ end
61
+ puts ip
62
+ ip
63
+ end
64
+
65
+ desc "Reboot a Xen VM"
66
+ task :reboot, :roles => :xen do
67
+ get_command_line
68
+ run "xe vm-reboot force=#{xen_use_force} vm=\"#{xen_vm_name}\""
69
+ end
70
+
24
71
  desc "Uninstall a Xen VM and all its singular dependencies"
25
72
  task :uninstall, :roles => :xen do
26
73
  begin
27
- xenrec.shutdown
74
+ xenrec.vm.shutdown
28
75
  rescue
29
76
  end
30
- run "xe vm-uninstall force=#{xen_use_force} vm=\"#{xen_vm_name}\""
31
- end
32
-
33
-
34
- def get_command_line
35
- set(:xen_vm_name, ENV["VM_NAME"]) if ENV["VM_NAME"]
77
+ run "xe vm-uninstall --multiple force=#{xen_use_force} vm=\"#{xen_vm_name}\""
36
78
  end
79
+ end
80
+ end
37
81
 
38
82
  set :xen_use_force, "true"
39
- set :xen_storage_uuid, lambda { Capistrano::CLI.ui.ask('Enter storage UUID')}
83
+ set :xen_retries, 20
84
+ set :xen_wait, 2
40
85
  set :xen_template_uuid, lambda { Capistrano::CLI.ui.ask('Enter template name or UUID')}
41
86
  set :xen_vm_name, lambda { Capistrano::CLI.ui.ask('Enter name for new VM')}
42
87
 
88
+ def get_command_line
89
+ set(:xen_vm_name, ENV["VM_NAME"]) if ENV["VM_NAME"]
90
+ end
91
+
92
+ def do_until (repeat = 1, delay = 1, &block)
93
+ timed_out = true
94
+ repeat.times do |count|
95
+ if yield count
96
+ timed_out = false
97
+ break
98
+ end
99
+ sleep delay
100
+ end
101
+ timed_out
102
+ end
103
+
104
+ def find_uuid_by_name_label(name_label)
105
+ # This is quite dodgy, it's based entirely on a single example from our XenServer 5.5 host
106
+ matches = capture("xe vm-list name-label=\"#{name_label}\"").match(/^\s*uuid.*?:\s*(.*)\s*$/)
107
+ return matches[1] unless matches.nil? || matches[1].nil?
108
+ raise "could not find uuid for vm: #{name_label}"
109
+ end
110
+
111
+ def find_ip_by_uuid(uuid)
112
+ # This is quite dodgy, it's based entirely on a single example from our XenServer 5.5 host
113
+ matches = capture("xe vm-param-list uuid=#{uuid}").match(/^\s*networks.*?:.*?:\s*(.*)\s*$/)
114
+ return matches[1] unless matches.nil? || matches[1].nil?
115
+ raise "could not find ip for vm: #{uuid}"
116
+
43
117
  end
118
+
44
119
  end
45
120
 
data/xenrec.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{xenrec}
8
- s.version = "0.1.1"
8
+ s.version = "0.1.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Rasheed Abdul-Aziz"]
12
- s.date = %q{2009-10-16}
12
+ s.date = %q{2009-10-27}
13
13
  s.description = %q{Capistrano recipes that allow you to control a XenServer Host, for adding and removing VM's on the fly.}
14
14
  s.email = %q{rasheed@visfleet.com}
15
15
  s.extra_rdoc_files = [
@@ -49,14 +49,20 @@ Gem::Specification.new do |s|
49
49
  s.add_development_dependency(%q<rspec>, [">= 0"])
50
50
  s.add_development_dependency(%q<yard>, [">= 0"])
51
51
  s.add_development_dependency(%q<cucumber>, [">= 0"])
52
+ s.add_runtime_dependency(%q<capistrano>, [">= 2.5.9"])
53
+ s.add_runtime_dependency(%q<capistrano-ext>, [">= 1.2.1"])
52
54
  else
53
55
  s.add_dependency(%q<rspec>, [">= 0"])
54
56
  s.add_dependency(%q<yard>, [">= 0"])
55
57
  s.add_dependency(%q<cucumber>, [">= 0"])
58
+ s.add_dependency(%q<capistrano>, [">= 2.5.9"])
59
+ s.add_dependency(%q<capistrano-ext>, [">= 1.2.1"])
56
60
  end
57
61
  else
58
62
  s.add_dependency(%q<rspec>, [">= 0"])
59
63
  s.add_dependency(%q<yard>, [">= 0"])
60
64
  s.add_dependency(%q<cucumber>, [">= 0"])
65
+ s.add_dependency(%q<capistrano>, [">= 2.5.9"])
66
+ s.add_dependency(%q<capistrano-ext>, [">= 1.2.1"])
61
67
  end
62
68
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xenrec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rasheed Abdul-Aziz
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-10-16 00:00:00 +13:00
12
+ date: 2009-10-27 00:00:00 +13:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -42,6 +42,26 @@ dependencies:
42
42
  - !ruby/object:Gem::Version
43
43
  version: "0"
44
44
  version:
45
+ - !ruby/object:Gem::Dependency
46
+ name: capistrano
47
+ type: :runtime
48
+ version_requirement:
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 2.5.9
54
+ version:
55
+ - !ruby/object:Gem::Dependency
56
+ name: capistrano-ext
57
+ type: :runtime
58
+ version_requirement:
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: 1.2.1
64
+ version:
45
65
  description: Capistrano recipes that allow you to control a XenServer Host, for adding and removing VM's on the fly.
46
66
  email: rasheed@visfleet.com
47
67
  executables: []