nephele 0.1.13 → 0.1.14

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/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
+