rabbitmq-definition 0.1.0

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 (71) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.rspec +2 -0
  4. data/Gemfile +4 -0
  5. data/Gemfile.lock +181 -0
  6. data/README.md +57 -0
  7. data/lib/rabbitmq-definition.rb +46 -0
  8. data/lib/rabbitmq_definition/command.rb +28 -0
  9. data/lib/rabbitmq_definition/create.rb +35 -0
  10. data/lib/rabbitmq_definition/drop.rb +36 -0
  11. data/lib/rabbitmq_definition/dump.rb +41 -0
  12. data/lib/rabbitmq_definition/engine.rb +7 -0
  13. data/lib/rabbitmq_definition/file_definition.rb +54 -0
  14. data/lib/rabbitmq_definition/load.rb +14 -0
  15. data/lib/rabbitmq_definition/logger.rb +19 -0
  16. data/lib/rabbitmq_definition/rabbitmq-definition.rake +21 -0
  17. data/lib/rabbitmq_definition/version.rb +5 -0
  18. data/rabbitmq-definition.gemspec +34 -0
  19. data/spec/dummy/README.rdoc +28 -0
  20. data/spec/dummy/Rakefile +6 -0
  21. data/spec/dummy/app/assets/images/.keep +0 -0
  22. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  23. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  24. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  25. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  26. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  27. data/spec/dummy/app/mailers/.keep +0 -0
  28. data/spec/dummy/app/models/.keep +0 -0
  29. data/spec/dummy/app/models/activity.rb +2 -0
  30. data/spec/dummy/app/models/concerns/.keep +0 -0
  31. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  32. data/spec/dummy/config.ru +4 -0
  33. data/spec/dummy/config/application.rb +24 -0
  34. data/spec/dummy/config/boot.rb +5 -0
  35. data/spec/dummy/config/database.yml +20 -0
  36. data/spec/dummy/config/environment.rb +5 -0
  37. data/spec/dummy/config/environments/development.rb +26 -0
  38. data/spec/dummy/config/environments/production.rb +80 -0
  39. data/spec/dummy/config/environments/test.rb +36 -0
  40. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  41. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  42. data/spec/dummy/config/initializers/inflections.rb +16 -0
  43. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  44. data/spec/dummy/config/initializers/secret_token.rb +12 -0
  45. data/spec/dummy/config/initializers/session_store.rb +3 -0
  46. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  47. data/spec/dummy/config/locales/en.yml +23 -0
  48. data/spec/dummy/config/routes.rb +56 -0
  49. data/spec/dummy/db/migrate/20131203172849_create_activities.rb +9 -0
  50. data/spec/dummy/db/rabbitmq_definition.json +43 -0
  51. data/spec/dummy/db/schema.rb +26 -0
  52. data/spec/dummy/lib/assets/.keep +0 -0
  53. data/spec/dummy/log/.keep +0 -0
  54. data/spec/dummy/log/development.log +0 -0
  55. data/spec/dummy/public/404.html +58 -0
  56. data/spec/dummy/public/422.html +58 -0
  57. data/spec/dummy/public/500.html +57 -0
  58. data/spec/dummy/public/favicon.ico +0 -0
  59. data/spec/fixtures/create.json +18 -0
  60. data/spec/fixtures/example1.json +41 -0
  61. data/spec/helpers/listing_helper.rb +23 -0
  62. data/spec/helpers/matchers.rb +29 -0
  63. data/spec/integration/rabbitmq_definition_spec.rb +101 -0
  64. data/spec/rabbitmq_definition/command_spec.rb +23 -0
  65. data/spec/rabbitmq_definition/create_spec.rb +60 -0
  66. data/spec/rabbitmq_definition/drop_spec.rb +74 -0
  67. data/spec/rabbitmq_definition/dump_spec.rb +147 -0
  68. data/spec/rabbitmq_definition/load_spec.rb +40 -0
  69. data/spec/rabbitmq_definition_spec.rb +39 -0
  70. data/spec/spec_helper.rb +25 -0
  71. metadata +347 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4a5b69f6d3566cbe892e1e312ec964d419dc54f4
4
+ data.tar.gz: 1ccdad0c6b305f9dcbf568f72309ee7017bf4963
5
+ SHA512:
6
+ metadata.gz: 6d92e50075d452a393ec82ffe38fef987b530406217166c752dece0f8fc49ca25624d7aac83e0cbd4861a41987a49f201d89606ca5a16a7cb33da0c647fc9a9e
7
+ data.tar.gz: 1bd7fe5b7b6a88f865301c49301c6e792a93bf571ac8938cd1d8945b55e69f888c131c3c523748b420437eb4e1d01220146139f60af412f886e9fc92df3fc7d8
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ coverage/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gemspec
4
+
data/Gemfile.lock ADDED
@@ -0,0 +1,181 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ rabbitmq-definition (0.1.0)
5
+ colorize (~> 0.7)
6
+ highline (~> 1.7)
7
+ json (~> 1.8)
8
+ rabbitmq_http_api_client (>= 1.6)
9
+ rails (~> 4.0)
10
+ rake (~> 10.4)
11
+
12
+ GEM
13
+ remote: http://rubygems.org/
14
+ specs:
15
+ actionmailer (4.1.6)
16
+ actionpack (= 4.1.6)
17
+ actionview (= 4.1.6)
18
+ mail (~> 2.5, >= 2.5.4)
19
+ actionpack (4.1.6)
20
+ actionview (= 4.1.6)
21
+ activesupport (= 4.1.6)
22
+ rack (~> 1.5.2)
23
+ rack-test (~> 0.6.2)
24
+ actionview (4.1.6)
25
+ activesupport (= 4.1.6)
26
+ builder (~> 3.1)
27
+ erubis (~> 2.7.0)
28
+ activemodel (4.1.6)
29
+ activesupport (= 4.1.6)
30
+ builder (~> 3.1)
31
+ activerecord (4.1.6)
32
+ activemodel (= 4.1.6)
33
+ activesupport (= 4.1.6)
34
+ arel (~> 5.0.0)
35
+ activesupport (4.1.6)
36
+ i18n (~> 0.6, >= 0.6.9)
37
+ json (~> 1.7, >= 1.7.7)
38
+ minitest (~> 5.1)
39
+ thread_safe (~> 0.1)
40
+ tzinfo (~> 1.1)
41
+ addressable (2.3.6)
42
+ arel (5.0.1.20140414130214)
43
+ builder (3.2.2)
44
+ byebug (2.7.0)
45
+ columnize (~> 0.3)
46
+ debugger-linecache (~> 1.2)
47
+ codeclimate-test-reporter (0.3.0)
48
+ simplecov (>= 0.7.1, < 1.0.0)
49
+ coderay (1.1.0)
50
+ colorize (0.7.5)
51
+ columnize (0.8.9)
52
+ coveralls (0.8.0)
53
+ multi_json (~> 1.10)
54
+ rest-client (>= 1.6.8, < 2)
55
+ simplecov (~> 0.9.1)
56
+ term-ansicolor (~> 1.3)
57
+ thor (~> 0.19.1)
58
+ crack (0.4.2)
59
+ safe_yaml (~> 1.0.0)
60
+ debugger-linecache (1.2.0)
61
+ diff-lcs (1.2.5)
62
+ docile (1.1.5)
63
+ domain_name (0.5.23)
64
+ unf (>= 0.0.5, < 1.0.0)
65
+ effin_utf8 (1.0)
66
+ erubis (2.7.0)
67
+ faraday (0.9.1)
68
+ multipart-post (>= 1.2, < 3)
69
+ faraday_middleware (0.9.1)
70
+ faraday (>= 0.7.4, < 0.10)
71
+ hashie (3.4.1)
72
+ highline (1.7.1)
73
+ http-cookie (1.0.2)
74
+ domain_name (~> 0.5)
75
+ i18n (0.6.11)
76
+ json (1.8.2)
77
+ mail (2.6.3)
78
+ mime-types (>= 1.16, < 3)
79
+ method_source (0.8.2)
80
+ mime-types (2.4.3)
81
+ minitest (5.5.0)
82
+ multi_json (1.11.0)
83
+ multipart-post (2.0.0)
84
+ netrc (0.10.3)
85
+ pry (0.9.12.6)
86
+ coderay (~> 1.0)
87
+ method_source (~> 0.8)
88
+ slop (~> 3.4)
89
+ pry-byebug (1.3.2)
90
+ byebug (~> 2.7)
91
+ pry (~> 0.9.12)
92
+ rabbitmq_http_api_client (1.6.0)
93
+ effin_utf8 (~> 1.0.0)
94
+ faraday (~> 0.9.0)
95
+ faraday_middleware (~> 0.9.0)
96
+ hashie (~> 3.2)
97
+ multi_json (~> 1.9)
98
+ rack (1.5.2)
99
+ rack-test (0.6.2)
100
+ rack (>= 1.0)
101
+ rails (4.1.6)
102
+ actionmailer (= 4.1.6)
103
+ actionpack (= 4.1.6)
104
+ actionview (= 4.1.6)
105
+ activemodel (= 4.1.6)
106
+ activerecord (= 4.1.6)
107
+ activesupport (= 4.1.6)
108
+ bundler (>= 1.3.0, < 2.0)
109
+ railties (= 4.1.6)
110
+ sprockets-rails (~> 2.0)
111
+ railties (4.1.6)
112
+ actionpack (= 4.1.6)
113
+ activesupport (= 4.1.6)
114
+ rake (>= 0.8.7)
115
+ thor (>= 0.18.1, < 2.0)
116
+ rake (10.4.2)
117
+ rest-client (1.8.0)
118
+ http-cookie (>= 1.0.2, < 2.0)
119
+ mime-types (>= 1.16, < 3.0)
120
+ netrc (~> 0.7)
121
+ rspec (3.2.0)
122
+ rspec-core (~> 3.2.0)
123
+ rspec-expectations (~> 3.2.0)
124
+ rspec-mocks (~> 3.2.0)
125
+ rspec-core (3.2.2)
126
+ rspec-support (~> 3.2.0)
127
+ rspec-expectations (3.2.0)
128
+ diff-lcs (>= 1.2.0, < 2.0)
129
+ rspec-support (~> 3.2.0)
130
+ rspec-mocks (3.2.1)
131
+ diff-lcs (>= 1.2.0, < 2.0)
132
+ rspec-support (~> 3.2.0)
133
+ rspec-rails (3.2.1)
134
+ actionpack (>= 3.0, < 4.3)
135
+ activesupport (>= 3.0, < 4.3)
136
+ railties (>= 3.0, < 4.3)
137
+ rspec-core (~> 3.2.0)
138
+ rspec-expectations (~> 3.2.0)
139
+ rspec-mocks (~> 3.2.0)
140
+ rspec-support (~> 3.2.0)
141
+ rspec-support (3.2.2)
142
+ safe_yaml (1.0.4)
143
+ simplecov (0.9.2)
144
+ docile (~> 1.1.0)
145
+ multi_json (~> 1.0)
146
+ simplecov-html (~> 0.9.0)
147
+ simplecov-html (0.9.0)
148
+ slop (3.6.0)
149
+ sprockets (3.0.0)
150
+ rack (~> 1.0)
151
+ sprockets-rails (2.2.4)
152
+ actionpack (>= 3.0)
153
+ activesupport (>= 3.0)
154
+ sprockets (>= 2.8, < 4.0)
155
+ term-ansicolor (1.3.0)
156
+ tins (~> 1.0)
157
+ thor (0.19.1)
158
+ thread_safe (0.3.4)
159
+ timecop (0.5.0)
160
+ tins (1.3.5)
161
+ tzinfo (1.2.2)
162
+ thread_safe (~> 0.1)
163
+ unf (0.1.4)
164
+ unf_ext
165
+ unf_ext (0.0.6)
166
+ webmock (1.20.4)
167
+ addressable (>= 2.3.6)
168
+ crack (>= 0.3.2)
169
+
170
+ PLATFORMS
171
+ ruby
172
+
173
+ DEPENDENCIES
174
+ codeclimate-test-reporter (~> 0.3)
175
+ coveralls (~> 0.8)
176
+ pry-byebug (~> 1.3)
177
+ rabbitmq-definition!
178
+ rspec (~> 3.2)
179
+ rspec-rails (~> 3.2)
180
+ timecop (= 0.5)
181
+ webmock (~> 1.20)
data/README.md ADDED
@@ -0,0 +1,57 @@
1
+ # Introduction
2
+
3
+ Manage RabbitMQ structure of your virtual hosts. Similary to ActiveRecord schema.rb or structure.sql that dumps the current database schema, rabbitmq-schema will dump a ```db/rabbitmq_structure.json``` timestamped file with the representation of the virtual hosts, queues, exchanges, bindings, users and permissions.
4
+
5
+ ## Installation
6
+
7
+ Include this to your development/test Gemfile:
8
+
9
+ ```ruby
10
+ gem 'rabbitmq-schema'
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ Make sure you set an environment variable for the rabbitmq api (you can add the /api path or leave it out):
16
+ ```
17
+ RABBITMQ_MANAGEMENT_URL=http://guest:guest@localhost:15672
18
+ ```
19
+
20
+ ### Create definition
21
+
22
+ Create a new vhost and definition for your application. It will create the vhosts of your choice and add permissions to the user in the environment variable to those vhosts.
23
+ ```ruby
24
+ bundle exec rake rabbitmq:create # It will ask you what vhosts to create the definition with
25
+ # or
26
+ bundle exec rake rabbitmq:create[/hats] # It will directly create a vhost named '/hats'
27
+ ```
28
+
29
+ ### Drop definition
30
+
31
+ Drop the vhosts in from your RabbitMQ instance and remove the file:
32
+ ```ruby
33
+ bundle exec rake rabbitmq:drop
34
+ ```
35
+
36
+ ### Dump definition
37
+ Dump the definition of the vhosts in your RabbitMQ instance into definition file:
38
+ ```ruby
39
+ bundle exec rake rabbitmq:dump # To dump the vhosts specificed in the existing definition file
40
+ # or
41
+ bundle exec rake rabbitmq:dump[/hats] # To dump the specified vhost in a new definition few
42
+ ```
43
+
44
+ ### Load definition
45
+ Load the vhosts definition from your definition file into your RabbitMQ instance:
46
+ ```ruby
47
+ bundle exec rake rabbitmq:load
48
+ ```
49
+
50
+ ### TODO
51
+
52
+ - [ ] Make it Rails independent
53
+ - [ ] There's a few uses of Hash#except.
54
+ - [ ] There's a few uses of Hash#with_indifferent_access.
55
+ - [ ] The Engine class should only be loaded when Rails is present.
56
+ - [ ] User should be able to indicate the file path for the structure.
57
+ - [ ] Rails dependency should be removed from gemspec.
@@ -0,0 +1,46 @@
1
+ require 'json'
2
+ require 'rake'
3
+ require 'uri'
4
+ require 'colorize'
5
+ require 'highline/import'
6
+ require 'rabbitmq/http/client'
7
+ require 'rabbitmq_definition/logger'
8
+ require 'rabbitmq_definition/file_definition'
9
+ require 'rabbitmq_definition/command'
10
+ require 'rabbitmq_definition/create'
11
+ require 'rabbitmq_definition/drop'
12
+ require 'rabbitmq_definition/load'
13
+ require 'rabbitmq_definition/dump'
14
+ require 'rabbitmq_definition/engine'
15
+
16
+ module RabbitMQ::Definition
17
+ def self.create(vhosts)
18
+ RabbitMQ::Definition::Create.run(client, verbose, vhosts)
19
+ end
20
+
21
+ def self.drop
22
+ RabbitMQ::Definition::Drop.run(client, verbose)
23
+ end
24
+
25
+ def self.dump(vhosts = nil)
26
+ RabbitMQ::Definition::Dump.run(client, verbose, vhosts)
27
+ end
28
+
29
+ def self.load
30
+ RabbitMQ::Definition::Load.run(client, verbose)
31
+ end
32
+
33
+ private
34
+
35
+ def self.client
36
+ RabbitMQ::HTTP::Client.new(rabbitmq_management_url)
37
+ end
38
+
39
+ def self.rabbitmq_management_url
40
+ ENV['RABBITMQ_MANAGEMENT_URL']
41
+ end
42
+
43
+ def self.verbose
44
+ Rake.verbose == true
45
+ end
46
+ end
@@ -0,0 +1,28 @@
1
+ module RabbitMQ::Definition
2
+ class Command
3
+ attr_accessor :client, :verbose
4
+
5
+ def self.run(*args)
6
+ new(*args).execute
7
+ end
8
+
9
+ def initialize(client, verbose)
10
+ @client = client
11
+ @verbose = !!verbose
12
+ end
13
+
14
+ def execute
15
+ raise NotImplementedError
16
+ end
17
+
18
+ protected
19
+
20
+ def uri_endpoint
21
+ @uri_endpoint ||= URI.parse(client.endpoint)
22
+ end
23
+
24
+ def user
25
+ @uri ||= uri_endpoint.user
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,35 @@
1
+ module RabbitMQ::Definition
2
+ class Create < Command
3
+ def initialize(client, verbose, vhosts)
4
+ super(client, verbose)
5
+ @vhosts = (vhosts || []).compact
6
+ if @vhosts.empty?
7
+ @vhosts = ask("-> What vhosts do you want to create? (comma separated list)".yellow, lambda { |str| str.split(/,\s*/) })
8
+ end
9
+ end
10
+
11
+ def execute
12
+ if FileDefinition.exists?
13
+ Logger.error "Definition file already exists in #{FileDefinition.file_path}"
14
+ else
15
+ @vhosts.each do |vhost|
16
+ Logger.progress "Creating vhost '#{vhost}'" if verbose
17
+ client.create_vhost(vhost)
18
+ Logger.progress "Adding permissions for '#{user}' to vhost '#{vhost}'" if verbose
19
+ client.update_permissions_of(vhost, user, all_permissions)
20
+ end
21
+ Dump.run(client, false, @vhosts)
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def all_permissions
28
+ {
29
+ :configure => ".*",
30
+ :write => ".*",
31
+ :read => ".*"
32
+ }
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,36 @@
1
+ module RabbitMQ::Definition
2
+ class Drop < Command
3
+ def execute
4
+ if !FileDefinition.exists?
5
+ Logger.error "No definition with vhosts exists"
6
+ else
7
+ if !agree("This will delete vhosts (#{vhost_names.join(',')}), continue? y/n".yellow)
8
+ Logger.error "Aborted by user"
9
+ else
10
+ delete_vhosts
11
+ Logger.progress "Removing definition..."
12
+ definition.destroy
13
+ Logger.success "Done"
14
+ end
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def definition
21
+ @definition ||= FileDefinition.read
22
+ end
23
+
24
+ def vhost_names
25
+ @vhost_names ||= definition.vhosts.map { |vhost| vhost['name'] }
26
+ end
27
+
28
+ def delete_vhosts
29
+ vhost_names.each do |vhost|
30
+ Logger.progress "Deleting vhost '#{vhost}'..." if verbose
31
+ client.delete_vhost(vhost)
32
+ end
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,41 @@
1
+ module RabbitMQ::Definition
2
+ class Dump < Command
3
+ def initialize(client, verbose, vhosts = nil)
4
+ super(client, verbose)
5
+ @vhosts = vhosts || FileDefinition.read.vhosts.map { |vhost| vhost['name'] }
6
+ end
7
+
8
+ def execute
9
+ FileDefinition.new(filtered_list_definition).tap do |definition|
10
+ Logger.info definition.to_json if verbose
11
+ Logger.progress "Saving definition..."
12
+ definition.save
13
+ Logger.success "Done"
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def filtered_list_definition
20
+ client.list_definitions.reduce({}) do |result, (key, value)|
21
+ if key.to_s == "vhosts"
22
+ value = @vhosts.map {|name| {'name' => name} }
23
+ elsif value.is_a?(Array)
24
+ value = filter_vhost_items(value)
25
+ end
26
+ result[key] = value
27
+ result
28
+ end
29
+ end
30
+
31
+ def filter_vhost_items(items)
32
+ items.reduce([]) do |array, item|
33
+ if !item.has_key?("vhost") || @vhosts.include?(item["vhost"])
34
+ array.push(item)
35
+ end
36
+ array
37
+ end
38
+ end
39
+
40
+ end
41
+ end