xenrec 0.1.1 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
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: []