nephele 0.1.13 → 0.1.14

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -4,15 +4,16 @@ gem 'rake'
4
4
  gem 'cloudservers', '~>0.4'
5
5
  gem 'awesome_print'
6
6
  gem 'optitron'
7
+ gem 'sexp_processor', '~>3.0.5'
7
8
 
8
9
  group :development do
9
10
  gem 'wirble'
10
11
  gem 'shoulda'
11
12
  gem 'mocha'
12
13
  gem 'autotest'
14
+ gem 'ZenTest', '~>4.4.1'
13
15
  gem 'autotest-fsevent'
14
16
  gem 'autotest-growl'
15
- gem 'bundler'
16
- gem 'jeweler', '~>1.5.2'
17
+ gem 'jeweler'
17
18
  end
18
19
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.13
1
+ 0.1.14
data/bin/neph CHANGED
@@ -18,6 +18,7 @@ class Nephele::Runner < Optitron::CLI
18
18
  class_opt 'personality', 'comma-separated tuple of contents,targetfile to be placed at startup', :type => :string
19
19
  class_opt 'bootstrap', "optional bootstrapper URI, defaults to #{JODELL_CHEF_BOOTSTRAPPER}", :type => :string
20
20
  class_opt 'recipe', 'run this recipe after bootstrapping', :type => :string
21
+ class_opt 'branch', 'Use this branch of a bootstrapper git repo', :type => :string
21
22
  class_opt 'vpn-credential-file', 'specify a vpnpass file to seed the target vm', :type => :string
22
23
  class_opt 'prestrap', 'Executes a command or the contents of a file on a VM prior to bootstrapping', :type => :string
23
24
 
@@ -50,7 +51,7 @@ class Nephele::Runner < Optitron::CLI
50
51
  personality[vpnfile] = '/root/.vpnpass'
51
52
  end
52
53
  (params['count'] || 1).to_i.times do |i|
53
- @node = service.create \
54
+ @node = service.build_and_wait \
54
55
  :name => name + "#{params['count'] ? i + 1 : ''}",
55
56
  :image => Nephele::Rackspace.image_lookup(image),
56
57
  :flavor => flavor,
@@ -60,6 +61,7 @@ class Nephele::Runner < Optitron::CLI
60
61
 
61
62
  desc 'Save an image of the node'
62
63
  def save(nodename, savename)
64
+ puts "Saving #{nodename} -> #{savename}"
63
65
  service.server_objs.find { |s| s.name == nodename }.create_image savename
64
66
  end
65
67
 
@@ -100,16 +102,21 @@ class Nephele::Runner < Optitron::CLI
100
102
  node_run "curl -L #{bootstrap} > boot && chmod +x boot && ./boot #{params['cookbooks'] || ''}"
101
103
  # This is inaccurate. Prestrapping is just for changing chef-solo's verbosity.
102
104
  #
103
- recipe_cmd = [
104
- "#{params['prestrap'] ? prestrap_cmd + ' && ' : ''}",
105
- "cd -P /var/chef/cookbooks && (bundle check || bundle install) && git fetch && git pull && rake run[#{params['recipe']}]"
106
- ].join
107
- node_run recipe_cmd if params['recipe']
105
+ if params['recipe']
106
+ recipe_cmd = params['prestrap'] ? prestrap_cmd + ' && ' : ''
107
+ recipe_cmd += [
108
+ "cd -P /var/chef/cookbooks && git fetch && git reset --hard HEAD && git clean -fd",
109
+ "git checkout -f #{params['branch'] || 'master'} && git pull -q",
110
+ "(bundle check || bundle install) && bundle exec rake run[#{params['recipe']}]"
111
+ ] * ' && '
112
+ node_run recipe_cmd
113
+ end
108
114
  end
109
115
 
110
116
  def node_run(cmd)
111
- puts "Running #{cmd}" if ENV['verbose']
112
- system %[time ssh -o "StrictHostKeyChecking=no" -A root@#{@node.addresses[:public]} "#{cmd}"]
117
+ node_cmd = %[time ssh -o "StrictHostKeyChecking=no" -A root@#{@node.addresses[:public].first} "#{cmd}"]
118
+ puts "Running #{node_cmd}" if ENV['verbose']
119
+ system node_cmd
113
120
  end
114
121
 
115
122
  def prestrap_cmd
@@ -18,6 +18,7 @@ class Nephele::Runner < Optitron::CLI
18
18
  class_opt 'personality', 'comma-separated tuple of contents,targetfile to be placed at startup', :type => :string
19
19
  class_opt 'bootstrap', "optional bootstrapper URI, defaults to #{JODELL_CHEF_BOOTSTRAPPER}", :type => :string
20
20
  class_opt 'recipe', 'run this recipe after bootstrapping', :type => :string
21
+ class_opt 'branch', 'Use this branch of a bootstrapper git repo', :type => :string
21
22
  class_opt 'vpn-credential-file', 'specify a vpnpass file to seed the target vm', :type => :string
22
23
  class_opt 'prestrap', 'Executes a command or the contents of a file on a VM prior to bootstrapping', :type => :string
23
24
 
@@ -50,7 +51,7 @@ class Nephele::Runner < Optitron::CLI
50
51
  personality[vpnfile] = '/root/.vpnpass'
51
52
  end
52
53
  (params['count'] || 1).to_i.times do |i|
53
- @node = service.create \
54
+ @node = service.build_and_wait \
54
55
  :name => name + "#{params['count'] ? i + 1 : ''}",
55
56
  :image => Nephele::Rackspace.image_lookup(image),
56
57
  :flavor => flavor,
@@ -60,6 +61,7 @@ class Nephele::Runner < Optitron::CLI
60
61
 
61
62
  desc 'Save an image of the node'
62
63
  def save(nodename, savename)
64
+ puts "Saving #{nodename} -> #{savename}"
63
65
  service.server_objs.find { |s| s.name == nodename }.create_image savename
64
66
  end
65
67
 
@@ -100,16 +102,21 @@ class Nephele::Runner < Optitron::CLI
100
102
  node_run "curl -L #{bootstrap} > boot && chmod +x boot && ./boot #{params['cookbooks'] || ''}"
101
103
  # This is inaccurate. Prestrapping is just for changing chef-solo's verbosity.
102
104
  #
103
- recipe_cmd = [
104
- "#{params['prestrap'] ? prestrap_cmd + ' && ' : ''}",
105
- "cd -P /var/chef/cookbooks && (bundle check || bundle install) && git fetch && git pull && rake run[#{params['recipe']}]"
106
- ].join
107
- node_run recipe_cmd if params['recipe']
105
+ if params['recipe']
106
+ recipe_cmd = params['prestrap'] ? prestrap_cmd + ' && ' : ''
107
+ recipe_cmd += [
108
+ "cd -P /var/chef/cookbooks && git fetch && git reset --hard HEAD && git clean -fd",
109
+ "git checkout -f #{params['branch'] || 'master'} && git pull -q",
110
+ "(bundle check || bundle install) && bundle exec rake run[#{params['recipe']}]"
111
+ ] * ' && '
112
+ node_run recipe_cmd
113
+ end
108
114
  end
109
115
 
110
116
  def node_run(cmd)
111
- puts "Running #{cmd}" if ENV['verbose']
112
- system %[time ssh -o "StrictHostKeyChecking=no" -A root@#{@node.addresses[:public]} "#{cmd}"]
117
+ node_cmd = %[time ssh -o "StrictHostKeyChecking=no" -A root@#{@node.addresses[:public].first} "#{cmd}"]
118
+ puts "Running #{node_cmd}" if ENV['verbose']
119
+ system node_cmd
113
120
  end
114
121
 
115
122
  def prestrap_cmd
@@ -1,10 +1,13 @@
1
1
  require 'tempfile'
2
+ require 'net/http'
2
3
 
3
4
  class Nephele::Rackspace < Nephele::Base
4
5
  attr_reader :nodes
6
+ attr_accessor :timeout
5
7
 
6
8
  def initialize(opts = {})
7
9
  super
10
+ @timeout = opts[:timeout] || 180
8
11
  populate!
9
12
  end
10
13
 
@@ -33,11 +36,26 @@ class Nephele::Rackspace < Nephele::Base
33
36
  :imageId => images_id_for_name(opts[:image]),
34
37
  :flavorId => flavors_id_for_name(opts[:flavor]),
35
38
  :personality => opts[:personality] || ''
36
- puts "Server pass: #{rack_node.adminPass}, ip #{rack_node.addresses[:public]}"
39
+ puts "Server pass: #{rack_node.adminPass}, ip #{rack_node.addresses[:public].first}"
37
40
  register!(rack_node)
38
41
  rack_node
39
42
  end
40
43
 
44
+ def build_and_wait(opts)
45
+ rack_node = create(opts)
46
+ t1 = Time.now
47
+ begin
48
+ Timeout::timeout(@timeout) do
49
+ sleep 2 while rack_node.refresh && rack_node.status != 'ACTIVE'
50
+ sleep 2 while !(TCPSocket.new(rack_node.addresses[:public].first, 22) rescue nil)
51
+ end
52
+ rescue Timeout::Error
53
+ puts "Server creation timed out after #{@timeout} seconds!"
54
+ end
55
+ puts "#{rack_node.status}: #{Time.now - t1}" if ENV['verbose']
56
+ rack_node
57
+ end
58
+
41
59
  def destroy(opts)
42
60
  id = servers_id_for_name(opts[:name])
43
61
  CloudServers::Server.new(conn, id).delete!
@@ -70,7 +88,7 @@ class Nephele::Rackspace < Nephele::Base
70
88
  s.status.ljust(max_status),
71
89
  s.progress.to_s.ljust(max_progress),
72
90
  s.flavor.name.ljust(10),
73
- "#{s.addresses[:public]}\n"
91
+ "#{s.addresses[:public].first}\n"
74
92
  ] * ' '
75
93
  end
76
94
  header + info
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{nephele}
8
- s.version = "0.1.13"
8
+ s.version = "0.1.14"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Jeffrey O'Dell"]
12
- s.date = %q{2011-06-27}
12
+ s.date = %q{2011-10-19}
13
13
  s.description = %q{Light administration utility for popular cloud services}
14
14
  s.email = %q{jeffrey.odell@gmail.com}
15
15
  s.executables = ["neph", "nephele"]
@@ -40,10 +40,6 @@ Gem::Specification.new do |s|
40
40
  s.require_paths = ["lib"]
41
41
  s.rubygems_version = %q{1.6.1}
42
42
  s.summary = %q{Light administration utility for popular cloud services}
43
- s.test_files = [
44
- "test/helper.rb",
45
- "test/tc_base.rb"
46
- ]
47
43
 
48
44
  if s.respond_to? :specification_version then
49
45
  s.specification_version = 3
@@ -53,41 +49,44 @@ Gem::Specification.new do |s|
53
49
  s.add_runtime_dependency(%q<cloudservers>, ["~> 0.4"])
54
50
  s.add_runtime_dependency(%q<awesome_print>, [">= 0"])
55
51
  s.add_runtime_dependency(%q<optitron>, [">= 0"])
52
+ s.add_runtime_dependency(%q<sexp_processor>, ["~> 3.0.5"])
56
53
  s.add_development_dependency(%q<wirble>, [">= 0"])
57
54
  s.add_development_dependency(%q<shoulda>, [">= 0"])
58
55
  s.add_development_dependency(%q<mocha>, [">= 0"])
59
56
  s.add_development_dependency(%q<autotest>, [">= 0"])
57
+ s.add_development_dependency(%q<ZenTest>, ["~> 4.4.1"])
60
58
  s.add_development_dependency(%q<autotest-fsevent>, [">= 0"])
61
59
  s.add_development_dependency(%q<autotest-growl>, [">= 0"])
62
- s.add_development_dependency(%q<bundler>, [">= 0"])
63
- s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
60
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
64
61
  else
65
62
  s.add_dependency(%q<rake>, [">= 0"])
66
63
  s.add_dependency(%q<cloudservers>, ["~> 0.4"])
67
64
  s.add_dependency(%q<awesome_print>, [">= 0"])
68
65
  s.add_dependency(%q<optitron>, [">= 0"])
66
+ s.add_dependency(%q<sexp_processor>, ["~> 3.0.5"])
69
67
  s.add_dependency(%q<wirble>, [">= 0"])
70
68
  s.add_dependency(%q<shoulda>, [">= 0"])
71
69
  s.add_dependency(%q<mocha>, [">= 0"])
72
70
  s.add_dependency(%q<autotest>, [">= 0"])
71
+ s.add_dependency(%q<ZenTest>, ["~> 4.4.1"])
73
72
  s.add_dependency(%q<autotest-fsevent>, [">= 0"])
74
73
  s.add_dependency(%q<autotest-growl>, [">= 0"])
75
- s.add_dependency(%q<bundler>, [">= 0"])
76
- s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
74
+ s.add_dependency(%q<jeweler>, [">= 0"])
77
75
  end
78
76
  else
79
77
  s.add_dependency(%q<rake>, [">= 0"])
80
78
  s.add_dependency(%q<cloudservers>, ["~> 0.4"])
81
79
  s.add_dependency(%q<awesome_print>, [">= 0"])
82
80
  s.add_dependency(%q<optitron>, [">= 0"])
81
+ s.add_dependency(%q<sexp_processor>, ["~> 3.0.5"])
83
82
  s.add_dependency(%q<wirble>, [">= 0"])
84
83
  s.add_dependency(%q<shoulda>, [">= 0"])
85
84
  s.add_dependency(%q<mocha>, [">= 0"])
86
85
  s.add_dependency(%q<autotest>, [">= 0"])
86
+ s.add_dependency(%q<ZenTest>, ["~> 4.4.1"])
87
87
  s.add_dependency(%q<autotest-fsevent>, [">= 0"])
88
88
  s.add_dependency(%q<autotest-growl>, [">= 0"])
89
- s.add_dependency(%q<bundler>, [">= 0"])
90
- s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
89
+ s.add_dependency(%q<jeweler>, [">= 0"])
91
90
  end
92
91
  end
93
92
 
metadata CHANGED
@@ -1,13 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nephele
3
3
  version: !ruby/object:Gem::Version
4
- hash: 1
5
4
  prerelease:
6
- segments:
7
- - 0
8
- - 1
9
- - 13
10
- version: 0.1.13
5
+ version: 0.1.14
11
6
  platform: ruby
12
7
  authors:
13
8
  - Jeffrey O'Dell
@@ -15,180 +10,152 @@ autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
12
 
18
- date: 2011-06-27 00:00:00 -05:00
13
+ date: 2011-10-19 00:00:00 -05:00
19
14
  default_executable:
20
15
  dependencies:
21
16
  - !ruby/object:Gem::Dependency
22
- version_requirements: &id001 !ruby/object:Gem::Requirement
17
+ name: rake
18
+ requirement: &id001 !ruby/object:Gem::Requirement
23
19
  none: false
24
20
  requirements:
25
21
  - - ">="
26
22
  - !ruby/object:Gem::Version
27
- hash: 3
28
- segments:
29
- - 0
30
23
  version: "0"
31
- prerelease: false
32
24
  type: :runtime
33
- requirement: *id001
34
- name: rake
25
+ prerelease: false
26
+ version_requirements: *id001
35
27
  - !ruby/object:Gem::Dependency
36
- version_requirements: &id002 !ruby/object:Gem::Requirement
28
+ name: cloudservers
29
+ requirement: &id002 !ruby/object:Gem::Requirement
37
30
  none: false
38
31
  requirements:
39
32
  - - ~>
40
33
  - !ruby/object:Gem::Version
41
- hash: 3
42
- segments:
43
- - 0
44
- - 4
45
34
  version: "0.4"
46
- prerelease: false
47
35
  type: :runtime
48
- requirement: *id002
49
- name: cloudservers
36
+ prerelease: false
37
+ version_requirements: *id002
50
38
  - !ruby/object:Gem::Dependency
51
- version_requirements: &id003 !ruby/object:Gem::Requirement
39
+ name: awesome_print
40
+ requirement: &id003 !ruby/object:Gem::Requirement
52
41
  none: false
53
42
  requirements:
54
43
  - - ">="
55
44
  - !ruby/object:Gem::Version
56
- hash: 3
57
- segments:
58
- - 0
59
45
  version: "0"
60
- prerelease: false
61
46
  type: :runtime
62
- requirement: *id003
63
- name: awesome_print
47
+ prerelease: false
48
+ version_requirements: *id003
64
49
  - !ruby/object:Gem::Dependency
65
- version_requirements: &id004 !ruby/object:Gem::Requirement
50
+ name: optitron
51
+ requirement: &id004 !ruby/object:Gem::Requirement
66
52
  none: false
67
53
  requirements:
68
54
  - - ">="
69
55
  - !ruby/object:Gem::Version
70
- hash: 3
71
- segments:
72
- - 0
73
56
  version: "0"
74
- prerelease: false
75
57
  type: :runtime
76
- requirement: *id004
77
- name: optitron
58
+ prerelease: false
59
+ version_requirements: *id004
78
60
  - !ruby/object:Gem::Dependency
79
- version_requirements: &id005 !ruby/object:Gem::Requirement
61
+ name: sexp_processor
62
+ requirement: &id005 !ruby/object:Gem::Requirement
80
63
  none: false
81
64
  requirements:
82
- - - ">="
65
+ - - ~>
83
66
  - !ruby/object:Gem::Version
84
- hash: 3
85
- segments:
86
- - 0
87
- version: "0"
67
+ version: 3.0.5
68
+ type: :runtime
88
69
  prerelease: false
89
- type: :development
90
- requirement: *id005
91
- name: wirble
70
+ version_requirements: *id005
92
71
  - !ruby/object:Gem::Dependency
93
- version_requirements: &id006 !ruby/object:Gem::Requirement
72
+ name: wirble
73
+ requirement: &id006 !ruby/object:Gem::Requirement
94
74
  none: false
95
75
  requirements:
96
76
  - - ">="
97
77
  - !ruby/object:Gem::Version
98
- hash: 3
99
- segments:
100
- - 0
101
78
  version: "0"
102
- prerelease: false
103
79
  type: :development
104
- requirement: *id006
105
- name: shoulda
80
+ prerelease: false
81
+ version_requirements: *id006
106
82
  - !ruby/object:Gem::Dependency
107
- version_requirements: &id007 !ruby/object:Gem::Requirement
83
+ name: shoulda
84
+ requirement: &id007 !ruby/object:Gem::Requirement
108
85
  none: false
109
86
  requirements:
110
87
  - - ">="
111
88
  - !ruby/object:Gem::Version
112
- hash: 3
113
- segments:
114
- - 0
115
89
  version: "0"
116
- prerelease: false
117
90
  type: :development
118
- requirement: *id007
119
- name: mocha
91
+ prerelease: false
92
+ version_requirements: *id007
120
93
  - !ruby/object:Gem::Dependency
121
- version_requirements: &id008 !ruby/object:Gem::Requirement
94
+ name: mocha
95
+ requirement: &id008 !ruby/object:Gem::Requirement
122
96
  none: false
123
97
  requirements:
124
98
  - - ">="
125
99
  - !ruby/object:Gem::Version
126
- hash: 3
127
- segments:
128
- - 0
129
100
  version: "0"
130
- prerelease: false
131
101
  type: :development
132
- requirement: *id008
133
- name: autotest
102
+ prerelease: false
103
+ version_requirements: *id008
134
104
  - !ruby/object:Gem::Dependency
135
- version_requirements: &id009 !ruby/object:Gem::Requirement
105
+ name: autotest
106
+ requirement: &id009 !ruby/object:Gem::Requirement
136
107
  none: false
137
108
  requirements:
138
109
  - - ">="
139
110
  - !ruby/object:Gem::Version
140
- hash: 3
141
- segments:
142
- - 0
143
111
  version: "0"
112
+ type: :development
144
113
  prerelease: false
114
+ version_requirements: *id009
115
+ - !ruby/object:Gem::Dependency
116
+ name: ZenTest
117
+ requirement: &id010 !ruby/object:Gem::Requirement
118
+ none: false
119
+ requirements:
120
+ - - ~>
121
+ - !ruby/object:Gem::Version
122
+ version: 4.4.1
145
123
  type: :development
146
- requirement: *id009
147
- name: autotest-fsevent
124
+ prerelease: false
125
+ version_requirements: *id010
148
126
  - !ruby/object:Gem::Dependency
149
- version_requirements: &id010 !ruby/object:Gem::Requirement
127
+ name: autotest-fsevent
128
+ requirement: &id011 !ruby/object:Gem::Requirement
150
129
  none: false
151
130
  requirements:
152
131
  - - ">="
153
132
  - !ruby/object:Gem::Version
154
- hash: 3
155
- segments:
156
- - 0
157
133
  version: "0"
158
- prerelease: false
159
134
  type: :development
160
- requirement: *id010
161
- name: autotest-growl
135
+ prerelease: false
136
+ version_requirements: *id011
162
137
  - !ruby/object:Gem::Dependency
163
- version_requirements: &id011 !ruby/object:Gem::Requirement
138
+ name: autotest-growl
139
+ requirement: &id012 !ruby/object:Gem::Requirement
164
140
  none: false
165
141
  requirements:
166
142
  - - ">="
167
143
  - !ruby/object:Gem::Version
168
- hash: 3
169
- segments:
170
- - 0
171
144
  version: "0"
172
- prerelease: false
173
145
  type: :development
174
- requirement: *id011
175
- name: bundler
146
+ prerelease: false
147
+ version_requirements: *id012
176
148
  - !ruby/object:Gem::Dependency
177
- version_requirements: &id012 !ruby/object:Gem::Requirement
149
+ name: jeweler
150
+ requirement: &id013 !ruby/object:Gem::Requirement
178
151
  none: false
179
152
  requirements:
180
- - - ~>
153
+ - - ">="
181
154
  - !ruby/object:Gem::Version
182
- hash: 7
183
- segments:
184
- - 1
185
- - 5
186
- - 2
187
- version: 1.5.2
188
- prerelease: false
155
+ version: "0"
189
156
  type: :development
190
- requirement: *id012
191
- name: jeweler
157
+ prerelease: false
158
+ version_requirements: *id013
192
159
  description: Light administration utility for popular cloud services
193
160
  email: jeffrey.odell@gmail.com
194
161
  executables:
@@ -231,7 +198,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
231
198
  requirements:
232
199
  - - ">="
233
200
  - !ruby/object:Gem::Version
234
- hash: 3
201
+ hash: 565433683656449259
235
202
  segments:
236
203
  - 0
237
204
  version: "0"
@@ -240,9 +207,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
240
207
  requirements:
241
208
  - - ">="
242
209
  - !ruby/object:Gem::Version
243
- hash: 3
244
- segments:
245
- - 0
246
210
  version: "0"
247
211
  requirements: []
248
212
 
@@ -251,6 +215,5 @@ rubygems_version: 1.6.1
251
215
  signing_key:
252
216
  specification_version: 3
253
217
  summary: Light administration utility for popular cloud services
254
- test_files:
255
- - test/helper.rb
256
- - test/tc_base.rb
218
+ test_files: []
219
+