rouster 0.5 → 0.7

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 (55) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -1
  3. data/.reek +63 -0
  4. data/.travis.yml +11 -0
  5. data/Gemfile +17 -0
  6. data/Gemfile.lock +102 -0
  7. data/README.md +233 -7
  8. data/Rakefile +52 -34
  9. data/Vagrantfile +26 -8
  10. data/examples/aws.rb +85 -0
  11. data/examples/openstack.rb +61 -0
  12. data/examples/passthrough.rb +71 -0
  13. data/lib/rouster.rb +380 -262
  14. data/lib/rouster/deltas.rb +470 -138
  15. data/lib/rouster/puppet.rb +155 -26
  16. data/lib/rouster/testing.rb +205 -46
  17. data/lib/rouster/tests.rb +40 -11
  18. data/lib/rouster/vagrant.rb +311 -0
  19. data/path_helper.rb +3 -4
  20. data/plugins/aws.rb +347 -0
  21. data/plugins/openstack.rb +136 -0
  22. data/test/basic.rb +4 -1
  23. data/test/functional/deltas/test_get_crontab.rb +64 -2
  24. data/test/functional/deltas/test_get_groups.rb +74 -2
  25. data/test/functional/deltas/test_get_os.rb +68 -0
  26. data/test/functional/deltas/test_get_packages.rb +73 -6
  27. data/test/functional/deltas/test_get_ports.rb +26 -1
  28. data/test/functional/deltas/test_get_services.rb +43 -5
  29. data/test/functional/deltas/test_get_users.rb +35 -2
  30. data/test/functional/puppet/test_facter.rb +41 -1
  31. data/test/functional/test_caching.rb +2 -2
  32. data/test/functional/test_inspect.rb +1 -1
  33. data/test/functional/test_is_file.rb +17 -1
  34. data/test/functional/test_is_in_file.rb +40 -0
  35. data/test/functional/test_new.rb +233 -22
  36. data/test/functional/test_passthroughs.rb +94 -0
  37. data/test/functional/test_put.rb +2 -2
  38. data/test/functional/test_validate_file.rb +104 -3
  39. data/test/puppet/test_apply.rb +8 -6
  40. data/test/unit/puppet/resources/puppet_run_with_failed_exec +59 -0
  41. data/test/unit/puppet/resources/puppet_run_with_successful_exec +61 -0
  42. data/test/unit/puppet/test_get_puppet_star.rb +27 -4
  43. data/test/unit/puppet/test_puppet_parsing.rb +44 -0
  44. data/test/unit/test_new.rb +88 -0
  45. data/test/unit/test_parse_ls_string.rb +67 -0
  46. data/test/unit/testing/resources/osx-launchd +285 -0
  47. data/test/unit/testing/resources/rhel-systemd +46 -0
  48. data/test/unit/testing/resources/rhel-systemv +41 -0
  49. data/test/unit/testing/resources/rhel-upstart +20 -0
  50. data/test/unit/testing/test_get_services.rb +178 -0
  51. data/test/unit/testing/test_validate_cron.rb +78 -0
  52. data/test/unit/testing/test_validate_package.rb +36 -10
  53. data/test/unit/testing/test_validate_port.rb +5 -0
  54. metadata +42 -21
  55. data/test/puppet/test_roles.rb +0 -186
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ddfb8d54a1eb8670b64d6638c81866bc49764af6
4
- data.tar.gz: 3b4f207c05540dc6daa16cfe29d46948b8ff3aab
3
+ metadata.gz: b6badce99c05cdd7080ee400746d3c2b73a550cf
4
+ data.tar.gz: b776da73cf962263b7a9d2c0ee9fedef736d926d
5
5
  SHA512:
6
- metadata.gz: 2878c4b222c5ff88a77db0a88ae5102752f6fcdb31fe7613cdba71f8c51b4228db33f0e4a9c34aa62e184f43e0b183fb66cb5574843673c009d12d32f18b35f5
7
- data.tar.gz: 910cd5e1519e3de2f0c759799a04d8dce487e97d8c29f456061a75cf63e9cbae97023ecd8feeb5e047165d1f22c5e80be88f6be61fa9ddfd7d3d233108292415
6
+ metadata.gz: fc0b36efffe024aa6f50bc2e4ca27aaa8be09224019b4fcd7a15e02a1be28b91b33e0050043879d34e63121a61832176d0fe81acfa0f849f80e0a67c4f03ef37
7
+ data.tar.gz: dfe3b1e7d14c1a9aae10a86eaa26f876c411999152deeb4d220dc4dc685c5706f915f8fb9dfeb4790b73d800e1f8823468d5f5f567de7d5df2208ea55ff96bd7
data/.gitignore CHANGED
@@ -3,4 +3,7 @@ doc/*
3
3
  *.box
4
4
  *.swp
5
5
  *tmp*
6
- *.gem
6
+ *.gem
7
+ .rakeTasks
8
+ *raiden*
9
+ .project
data/.reek ADDED
@@ -0,0 +1,63 @@
1
+ ---
2
+
3
+ Attribute:
4
+ enabled: false
5
+
6
+ # so judgy.. and without context
7
+ BooleanParameter:
8
+ enabled: false
9
+
10
+ ControlParameter:
11
+ enabled: false
12
+
13
+ DataClump:
14
+ min_clump_size: 4
15
+
16
+ DuplicateMethodCall:
17
+ enabled: false
18
+
19
+ # this is not a real thing
20
+ FeatureEnvy:
21
+ enabled: false
22
+
23
+ # this should have understanding of non-required parameters
24
+ LongParameterList:
25
+ max_params: 5
26
+
27
+ NestedIterators:
28
+ max_allowed_nesting: 3
29
+
30
+ # you don't know my life
31
+ NilCheck:
32
+ enabled: false
33
+
34
+ # more lacking context judgement - when _would_ you be ok with '!' ?
35
+ PrimaDonnaMethod:
36
+ enabled: false
37
+
38
+ # this feels a bit arbitrary.. maybe would make more sense if was an average
39
+ TooManyStatements:
40
+ max_statements: 30
41
+
42
+ # see above
43
+ TooManyInstanceVariables:
44
+ max_instance_variables: 20
45
+
46
+ # see above
47
+ TooManyMethods:
48
+ max_methods: 20
49
+
50
+ # i don't name my exceptions specifically. that doesn't make me a bad person.
51
+ UncommunicativeVariableName:
52
+ accept: /^[a|b|e|f|g|h|i|j|k|l|m|p|r|s|u|v]$/
53
+
54
+ # or my comparators in ~sort() functions
55
+ ## https://github.com/troessner/reek/issues/886
56
+ UncommunicativeParameterName:
57
+ accept:
58
+ - a
59
+ - b
60
+
61
+ # got dinged for using class variables.. how else would you use self.startup?
62
+ exclude_paths:
63
+ - test/
@@ -0,0 +1,11 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - 2.0.0
5
+
6
+ notifications:
7
+ email: false
8
+
9
+ bundler_args: --without test --jobs 3 --retry 3
10
+ script: bundle exec rake test:unit build
11
+
data/Gemfile ADDED
@@ -0,0 +1,17 @@
1
+ ruby '2.0.0'
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gem 'json'
6
+ gem 'log4r', '~> 1.1.9'
7
+ gem 'net-scp'
8
+ gem 'net-ssh'
9
+ gem 'rake', '= 10.4.2'
10
+
11
+ group :development do
12
+ gem 'test-unit', '~> 3.0.0'
13
+ gem 'reek', '= 3.10.2'
14
+ end
15
+
16
+ gem 'fog', '= 1.24.0', :groups => [:aws, :openstack]
17
+
@@ -0,0 +1,102 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ ast (2.3.0)
5
+ axiom-types (0.1.1)
6
+ descendants_tracker (~> 0.0.4)
7
+ ice_nine (~> 0.11.0)
8
+ thread_safe (~> 0.3, >= 0.3.1)
9
+ builder (3.2.2)
10
+ codeclimate-engine-rb (0.3.1)
11
+ virtus (~> 1.0)
12
+ coercible (1.0.0)
13
+ descendants_tracker (~> 0.0.1)
14
+ descendants_tracker (0.0.4)
15
+ thread_safe (~> 0.3, >= 0.3.1)
16
+ equalizer (0.0.11)
17
+ excon (0.40.0)
18
+ fog (1.24.0)
19
+ fog-brightbox
20
+ fog-core (~> 1.23)
21
+ fog-json
22
+ fog-radosgw (>= 0.0.2)
23
+ fog-sakuracloud (>= 0.0.4)
24
+ fog-softlayer
25
+ ipaddress (~> 0.5)
26
+ nokogiri (~> 1.5, >= 1.5.11)
27
+ fog-brightbox (0.5.1)
28
+ fog-core (~> 1.22)
29
+ fog-json
30
+ inflecto
31
+ fog-core (1.24.0)
32
+ builder
33
+ excon (~> 0.38)
34
+ formatador (~> 0.2)
35
+ mime-types
36
+ net-scp (~> 1.1)
37
+ net-ssh (>= 2.1.3)
38
+ fog-json (1.0.0)
39
+ multi_json (~> 1.0)
40
+ fog-radosgw (0.0.3)
41
+ fog-core (>= 1.21.0)
42
+ fog-json
43
+ fog-xml (>= 0.0.1)
44
+ fog-sakuracloud (0.1.1)
45
+ fog-core
46
+ fog-json
47
+ fog-softlayer (0.3.20)
48
+ fog-core
49
+ fog-json
50
+ fog-xml (0.1.0)
51
+ fog-core
52
+ nokogiri (~> 1.5, >= 1.5.11)
53
+ formatador (0.2.5)
54
+ ice_nine (0.11.2)
55
+ inflecto (0.0.2)
56
+ ipaddress (0.8.0)
57
+ json (1.8.1)
58
+ log4r (1.1.10)
59
+ mime-types (2.4.1)
60
+ mini_portile (0.6.0)
61
+ multi_json (1.10.1)
62
+ net-scp (1.2.1)
63
+ net-ssh (>= 2.6.5)
64
+ net-ssh (2.9.1)
65
+ nokogiri (1.6.3.1)
66
+ mini_portile (= 0.6.0)
67
+ parser (2.3.3.0)
68
+ ast (~> 2.2)
69
+ power_assert (0.1.4)
70
+ rainbow (2.1.0)
71
+ rake (10.4.2)
72
+ reek (3.10.2)
73
+ codeclimate-engine-rb (~> 0.3.1)
74
+ parser (~> 2.3, >= 2.3.0.6)
75
+ rainbow (~> 2.0)
76
+ test-unit (3.0.2)
77
+ power_assert
78
+ thread_safe (0.3.5)
79
+ virtus (1.0.5)
80
+ axiom-types (~> 0.1)
81
+ coercible (~> 1.0)
82
+ descendants_tracker (~> 0.0, >= 0.0.3)
83
+ equalizer (~> 0.0, >= 0.0.9)
84
+
85
+ PLATFORMS
86
+ ruby
87
+
88
+ DEPENDENCIES
89
+ fog (= 1.24.0)
90
+ json
91
+ log4r (~> 1.1.9)
92
+ net-scp
93
+ net-ssh
94
+ rake (= 10.4.2)
95
+ reek (= 3.10.2)
96
+ test-unit (~> 3.0.0)
97
+
98
+ RUBY VERSION
99
+ ruby 2.0.0p648
100
+
101
+ BUNDLED WITH
102
+ 1.13.6
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  Rouster
2
2
  ======
3
3
 
4
+ [![build status](https://travis-ci.org/chorankates/rouster.svg)](https://travis-ci.org/chorankates/rouster) [![Gem Version](https://badge.fury.io/rb/rouster.svg)](https://rubygems.org/gems/rouster)
5
+
4
6
  ```rb
5
7
  Rouster.is_a?('abstraction layer for controlling Vagrant virtual machines')
6
8
  => true
@@ -24,12 +26,29 @@ The first implementation of Rouster was in Perl, called [Salesforce::Vagrant](ht
24
26
 
25
27
  * [Ruby](http://rubylang.org), version 2.0+ (best attempt made to support 1.8.7 and 1.9.3 as well)
26
28
  * [Vagrant](http://vagrantup.com), version 1.0.5+
27
-
28
- Note: Vagrant itself requires VirtualBox or VMWare Fusion (1.0.3+)
29
+ * Gems
30
+ * json
31
+ * log4r
32
+ * net-scp
33
+ * net-ssh
34
+ * fog (only if using AWS or OpenStack)
29
35
 
30
36
  Note: Rouster should work exactly the same on Windows as it does on \*nix and OSX (minus rouster/deltas.rb functionality, at least currently),
31
37
  but no real testing has been done to confirm this. Please file issues as appropriate.
32
38
 
39
+ ### From-source local usage (latest)
40
+
41
+ ```sh
42
+ git clone https://github.com/chorankates/rouster.git
43
+ cd rouster
44
+ bundle install # use :aws to pull in fog
45
+ ...
46
+ irb(main):001:0> require './path_helper.rb'
47
+ => true
48
+ irb(main):002:0> require 'rouster'
49
+ => true
50
+ ```
51
+
33
52
  ### From-source installation (latest)
34
53
 
35
54
  ```sh
@@ -37,13 +56,13 @@ git clone https://github.com/chorankates/rouster.git
37
56
  cd rouster
38
57
  rake buildgem
39
58
  gem install rouster-<version>.gem
59
+ ...
60
+ irb(main):001:0> require 'rouster'
61
+ => true
40
62
  ```
41
63
 
42
64
  ### pre-built gem installation (stable)
43
65
 
44
- [RubyGems](http://rubygems.org/gems/rouster)
45
- [![Gem Version](https://badge.fury.io/rb/rouster.png)](http://badge.fury.io/rb/rouster)
46
-
47
66
  ```sh
48
67
  gem install rouster
49
68
  ```
@@ -127,6 +146,89 @@ app.get('/tmp/foo')
127
146
  app.destroy()
128
147
  ```
129
148
 
149
+ ### advanced instantiation (passthroughs!)
150
+
151
+ detailed options in ```examples/passthrough.rb```, ```examples/aws.rb``` and ```examples/openstack.rb```
152
+
153
+ since Rouster only requires an SSH connection to control a machine, why stop at Vagrant?
154
+
155
+ ```rb
156
+ require 'rouster'
157
+ require 'rouster/plugins/aws'
158
+ require 'rouster/plugins/openstack'
159
+
160
+ # control the machine rouster itself is running on
161
+ local = Rouster.new(:name => 'local', :passthrough => { :type => :local } }
162
+
163
+ # control a remote machine
164
+ remote = Rouster.new(
165
+ :name => 'remote',
166
+ :passthrough => {
167
+ :type => :remote,
168
+ :host => 'foo.bar.com',
169
+ :user => 'keanu',
170
+ :key => '/path/to/private/key',
171
+ }
172
+
173
+ :sudo => true, # false by default, enabling requires that sshd is not enforcing 'requiretty'
174
+ )
175
+
176
+ # control a running EC2 instance
177
+ aws_already_running = Rouster.new(
178
+ :name => 'cloudy',
179
+ :passthrough => {
180
+ :type => :aws,
181
+ :instance => 'your-instance-id',
182
+ :keypair => 'your-keypair-name',
183
+ }
184
+ )
185
+
186
+ # start and control an EC2 instance
187
+ aws_start_me_up = Rouster.new(
188
+ :name => 'bgates',
189
+ :passthrough => {
190
+ :type => :aws,
191
+ :ami => 'your-ami-id',
192
+ :security_groups => 'your-security-groups',
193
+ :key_id => 'your-aws-key-id', # defaults to ${AWS_ACCESS_KEY_ID}
194
+ :secret_key => 'your-aws-secret-key', # defaults to ${AWS_SECRET_ACCESS_KEY}
195
+ }
196
+ )
197
+
198
+ # create a remote OpenStack instance
199
+ ostack = Rouster.new(
200
+ :name => 'ostack-testing',
201
+ :passthrough => {
202
+ :type => :openstack,
203
+ :openstack_auth_url => 'http://hostname.domain.com:5000/v2.0/tokens',
204
+ :openstack_username => 'some_console_user',
205
+ :openstack_tenant => 'tenant_id',
206
+ :user => 'some_ssh_userid',
207
+ :keypair => 'keypair_name',
208
+ :image_ref => 'c0340afb-577d-4db6-1234-aebdd6d1838f',
209
+ :flavor_ref => '547d9af5-096c-44a3-1234-7d23162556b8',
210
+ :openstack_api_key => 'some_api_key',
211
+ :key => '/path/to/private/key.pem',
212
+ },
213
+ :sudo => true, # false by default, enabling requires that sshd is not enforcing 'requiretty'
214
+ )
215
+
216
+ # control a running OpenStack instance
217
+ openstack_already_running = Rouster.new(
218
+ :name => 'ostack-copy',
219
+ :passthrough => {
220
+ :type => :openstack,
221
+ :openstack_auth_url => 'http://hostname.domain.com:5000/v2.0/tokens',
222
+ :openstack_username => 'some_console_user',
223
+ :openstack_tenant => 'tenant_id',
224
+ :user => 'ssh_user',
225
+ :keypair => 'keypair_name',
226
+ :instance => 'your-instance-id',
227
+ },
228
+ )
229
+
230
+ ```
231
+
130
232
  ### functional puppet test
131
233
 
132
234
  ```rb
@@ -170,6 +272,130 @@ end
170
272
  ## Base Methods
171
273
 
172
274
  ```rb
173
- irb(main):003:0> (Rouster.new(:name => 'app').methods - Object.methods).sort
174
- => [:_run, :_vm, :check_key_permissions, :connect_ssh_tunnel, :deltas, :destroy, :dir, :exitcode, :facter, :facts, :file, :generate_unique_mac, :get, :get_catalog, :get_groups, :get_output, :get_packages, :get_ports, :get_puppet_errors, :get_puppet_notices, :get_services, :get_ssh_info, :get_users, :is_available_via_ssh?, :is_dir?, :is_executable?, :is_file?, :is_group?, :is_in_file?, :is_in_path?, :is_package?, :is_passthrough?, :is_port_active?, :is_port_open?, :is_process_running?, :is_readable?, :is_service?, :is_service_running?, :is_user?, :is_user_in_group?, :is_writeable?, :log, :os_type, :output, :parse_catalog, :parse_ls_string, :passthrough, :put, :rebuild, :remove_existing_certs, :restart, :run, :run_puppet, :sshkey, :status, :sudo, :suspend, :traverse_up, :up, :uses_sudo?, :vagrantfile, :verbosity]
275
+ irb(main):001:0> require './path_helper.rb'
276
+ => true
277
+ irb(main):002:0> require 'rouster'
278
+ => true
279
+ irb(main):003:0> pp (Rouster.new(:name => 'app').methods - Object.methods).sort
280
+ => [
281
+ [:_run,
282
+ :cache,
283
+ :cache_timeout,
284
+ :check_key_permissions,
285
+ :connect_ssh_tunnel,
286
+ :deltas,
287
+ :destroy,
288
+ :dir,
289
+ :dirs,
290
+ :disconnect_ssh_tunnel,
291
+ :exitcode,
292
+ :facts,
293
+ :facts=,
294
+ :file,
295
+ :files,
296
+ :generate_unique_mac,
297
+ :get,
298
+ :get_crontab,
299
+ :get_groups,
300
+ :get_output,
301
+ :get_packages,
302
+ :get_ports,
303
+ :get_services,
304
+ :get_ssh_info,
305
+ :get_users,
306
+ :halt,
307
+ :is_available_via_ssh?,
308
+ :is_dir?,
309
+ :is_executable?,
310
+ :is_file?,
311
+ :is_group?,
312
+ :is_in_file?,
313
+ :is_in_path?,
314
+ :is_package?,
315
+ :is_passthrough?,
316
+ :is_port_active?,
317
+ :is_port_open?,
318
+ :is_process_running?,
319
+ :is_readable?,
320
+ :is_service?,
321
+ :is_service_running?,
322
+ :is_symlink?,
323
+ :is_user?,
324
+ :is_user_in_group?,
325
+ :is_vagrant_running?,
326
+ :is_writeable?,
327
+ :logger,
328
+ :os_type,
329
+ :output,
330
+ :package,
331
+ :parse_ls_string,
332
+ :passthrough,
333
+ :put,
334
+ :rebuild,
335
+ :restart,
336
+ :retries,
337
+ :run,
338
+ :sandbox_available?,
339
+ :sandbox_commit,
340
+ :sandbox_off,
341
+ :sandbox_on,
342
+ :sandbox_rollback,
343
+ :sshkey,
344
+ :status,
345
+ :suspend,
346
+ :traverse_up,
347
+ :unittest,
348
+ :up,
349
+ :uses_sudo?,
350
+ :vagrant,
351
+ :vagrantbinary,
352
+ :vagrantfile]
353
+ ]
354
+ ```
355
+
356
+ ## AWS methods
357
+ ```rb
358
+ irb(main):001:0> require './path_helper.rb'
359
+ => true
360
+ irb(main):002:0> require 'rouster'
361
+ => true
362
+ irb(main):003:0> require 'rouster/plugins/aws'
363
+ => true
364
+ irb(main):004:0> pp (Rouster.new(:name => 'aws', :passthrough => { :type => :aws }).methods - Object.methods).sort
365
+ => [
366
+ ...
367
+ :aws_bootstrap,
368
+ :aws_connect,
369
+ :aws_connect_to_elb,
370
+ :aws_describe_instance,
371
+ :aws_destroy,
372
+ :aws_get_ami,
373
+ :aws_get_hostname,
374
+ :aws_get_instance,
375
+ :aws_get_ip,
376
+ :aws_get_metadata,
377
+ :aws_get_url,
378
+ :aws_get_userdata,
379
+ :aws_status,
380
+ :ec2,
381
+ :elb,
382
+ :elb_connect,
383
+ :find_ssh_elb,
384
+ :instance_data,
385
+ ...
386
+ ]
387
+ ```
388
+
389
+ ## Openstack methods
390
+
391
+ ```rb
392
+ [
393
+ :ostack_connect,
394
+ :ostack_describe_instance,
395
+ :ostack_destroy,
396
+ :ostack_get_instance_id,
397
+ :ostack_get_ip,
398
+ :ostack_status,
399
+ :ostack_up
400
+ ]
175
401
  ```