harmony-service 0.4.4 → 0.5.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9aee765841ab62f1baa21ec099762a81614bcf7f
4
- data.tar.gz: e175a67b0159a1f74a8ad156726052d55d38b63c
3
+ metadata.gz: 517ce4bdacc892b142714cc33993b5a9eca1ab5d
4
+ data.tar.gz: 6c38fc1b33244ea9d090fcf291bc1d2a7ed08042
5
5
  SHA512:
6
- metadata.gz: 19d56126f965e80b9992bc66a6ac78bf2eb1ce77f33dc025e272dd336b44a58602dca7ed4efe7f9ff1ea4230ec829d0c15757b5e7a3c17ddf02f5acee548008d
7
- data.tar.gz: af465a9c745b58c782c40653ed9f8f42cca48a560b1eaab056a9b0998d57e9c2ddee398ce55a75574a77eef104b2534d62d25920fdd093ed2be41750c0fcf635
6
+ metadata.gz: 75013f6bc6e4a20e38be17bcf4672e3caca1c723e8eabfd8943ba4855ab68894acb1810f29b31e19f84da7f2555d56a03bcdd2e0ad48f03b64ddb0c9def5a27b
7
+ data.tar.gz: 1c95cd487990d0d074ae08d75b19df57262574e64ebfd4cdc1d93039d2a186e97be3718d53c104afa886b69d8dfcba37808cfa24d6587062a94125086da24853
data/bin/harmony_service CHANGED
@@ -9,8 +9,12 @@ handler_class = ARGV[0]
9
9
  puts "Starting Harmony Service with handler: #{handler_class}"
10
10
  load File.expand_path(ARGV[2])
11
11
 
12
+ # load env secrets
13
+ Harmony::Service::Utils::Secrets.load
14
+
15
+ abort "ENV['ampq_address'] must be defined." unless ENV['ampq_address']
12
16
  opts = {
13
- amqp: ENV['ampq_address'] || 'amqp://localhost:5672',
17
+ amqp: ENV['ampq_address'],
14
18
  vhost: ENV['ampq_vhost'] || '/',
15
19
  exchange: 'sneakers',
16
20
  exchange_type: :direct,
@@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.add_dependency "oj", '~> 2.17.4'
22
22
  spec.add_dependency 'redis', '~> 3.3', '>= 3.3.3'
23
23
  spec.add_dependency 'hashdiff', '~> 0.3.4'
24
+ spec.add_dependency 'sekrets'
24
25
 
25
26
  spec.add_development_dependency "bundler", "~> 1.10"
26
27
  spec.add_development_dependency "rake", "~> 10.0"
@@ -10,6 +10,9 @@ require 'harmony/service/error_response'
10
10
  require 'harmony/service/attribute_names_request'
11
11
  require 'harmony/service/attribute_names_response'
12
12
 
13
+ require 'harmony/service/oauth_token_request'
14
+ require 'harmony/service/oauth_token_response'
15
+
13
16
  require 'harmony/service/calculator/request'
14
17
  require 'harmony/service/calculator/response'
15
18
 
@@ -31,5 +34,6 @@ require 'harmony/service/notification/app_response'
31
34
 
32
35
  require 'harmony/service/utils/diff'
33
36
  require 'harmony/service/utils/storage'
37
+ require 'harmony/service/utils/secrets'
34
38
 
35
39
 
@@ -0,0 +1,3 @@
1
+ class Harmony::Service::OauthTokenRequest < Harmony::Service::Request
2
+ attr_accessor :auth_code
3
+ end
@@ -0,0 +1,2 @@
1
+ class Harmony::Service::OauthTokenResponse < Harmony::Service::Response
2
+ end
@@ -0,0 +1,19 @@
1
+ require 'rake'
2
+ require 'optparse'
3
+
4
+ namespace :harmony do
5
+ desc 'Write initial secrets to encrypted file.'
6
+ task :write_secrets do |t, args|
7
+ abort "ENV['SEKRETS_KEY'] must be set." unless ENV['SEKRETS_KEY']
8
+ abort "ENV['QUEUE_NAME'] must be set." unless ENV['QUEUE_NAME']
9
+ abort "ENV['STAGING_AMPQ_URL'] must be set." unless ENV['STAGING_AMPQ_URL']
10
+ abort "ENV['PRODUCTION_AMPQ_URL'] must be set." unless ENV['PRODUCTION_AMPQ_URL']
11
+
12
+ secrets = {
13
+ development: {harmony_queue: ENV['QUEUE_NAME'], ampq_address: ENV['STAGING_AMPQ_URL'], ampq_vhost: 'harmony-staging-queue'},
14
+ staging: {harmony_queue: ENV['QUEUE_NAME'], ampq_address: ENV['STAGING_AMPQ_URL'], ampq_vhost: 'harmony-staging-queue'},
15
+ production: {harmony_queue: ENV['QUEUE_NAME'], ampq_address: ENV['PRODUCTION_AMPQ_URL'], ampq_vhost: 'harmony'}
16
+ }
17
+ `ruby -r yaml -e'puts(#{secrets}.to_yaml)' | sekrets write config/settings.yml.enc --key #{ENV['SEKRETS_KEY']}`
18
+ end
19
+ end
@@ -1,4 +1,4 @@
1
1
  class Harmony::Service::Response < Harmony::Service::Message
2
-
2
+ attr_accessor :refresh_token, :access_token
3
3
  end
4
4
 
@@ -9,69 +9,66 @@ module Harmony
9
9
  class RpcService
10
10
  include Sneakers::Worker
11
11
  from_queue ENV['harmony_queue'], timeout_job_after: 10, threads: 1
12
-
13
- def work_with_params(message, delivery_info, metadata)
14
- begin
15
- logger.debug "Request: #{message}"
16
- request = Oj.load(message)
17
- request_class = request.class
18
- response_classes = request_response_mapping[request_class]
19
- raise "Unacceptable request class: #{request_class}" if response_classes.nil?
20
-
21
- result = new_handler.work_with_request(request)
22
- raise "Unacceptable response class: #{result.class}" unless response_classes.include?(result.class)
23
-
24
- send_response(result, metadata)
25
- ack!
26
- rescue StandardError => error
27
- logger.error error.message
28
- logger.error error.backtrace.join("\n")
29
-
30
- error_response = ErrorResponse.new message: error.message, exception: error
31
- send_response(error_response, metadata)
32
- reject!
33
- end
12
+
13
+ def work_with_params(message, _delivery_info, metadata)
14
+ logger.debug "Request: #{message}"
15
+ request = Oj.load(message)
16
+ request_class = request.class
17
+ response_classes = request_response_mapping[request_class]
18
+ raise "Unacceptable request class: #{request_class}" if response_classes.nil?
19
+
20
+ result = new_handler.work_with_request(request)
21
+ raise "Unacceptable response class: #{result.class}" unless response_classes.include?(result.class)
22
+
23
+ send_response(result, metadata)
24
+ ack!
25
+ rescue StandardError => error
26
+ logger.error error.message
27
+ logger.error error.backtrace.join("\n")
28
+
29
+ error_response = ErrorResponse.new message: error.message, exception: error
30
+ send_response(error_response, metadata)
31
+ reject!
34
32
  end
35
-
33
+
36
34
  def stop
37
35
  super
38
- #reply_to_exchange.close # not working
36
+ # reply_to_exchange.close # not working
39
37
  reply_to_connection.close
40
38
  end
41
-
39
+
42
40
  def reply_to_connection
43
41
  @reply_to_connection ||= create_reply_to_connection
44
42
  end
45
-
43
+
46
44
  def create_reply_to_connection
47
45
  opts = Sneakers::CONFIG
48
- conn = Bunny.new(opts[:amqp], :vhost => opts[:vhost], :heartbeat => opts[:heartbeat], :logger => Sneakers::logger)
46
+ conn = Bunny.new(opts[:amqp], vhost: opts[:vhost], heartbeat: opts[:heartbeat], logger: Sneakers.logger)
49
47
  conn.start
50
48
  conn
51
49
  end
52
-
50
+
53
51
  def reply_to_exchange
54
52
  @reply_to_queue ||= create_reply_to_exchange
55
53
  end
56
-
54
+
57
55
  def create_reply_to_exchange
58
56
  ch = reply_to_connection.create_channel
59
- ch.exchange(AMQ::Protocol::EMPTY_STRING, :auto_delete => true)
57
+ ch.exchange(AMQ::Protocol::EMPTY_STRING, auto_delete: true)
60
58
  end
61
-
62
-
59
+
63
60
  private
61
+
64
62
  def send_response(result, metadata)
65
63
  json = Oj.dump(result)
66
64
  logger.debug "Response: #{json}"
67
65
  send_response_json(json, metadata.reply_to, metadata.correlation_id)
68
66
  end
69
-
67
+
70
68
  def send_response_json(json, routing_key, correlation_id)
71
- reply_to_exchange.publish(json, :routing_key => routing_key, :correlation_id => correlation_id)
69
+ reply_to_exchange.publish(json, routing_key: routing_key, correlation_id: correlation_id)
72
70
  end
73
-
74
-
71
+
75
72
  def request_response_mapping
76
73
  {
77
74
  Calculator::Request => [Calculator::Response],
@@ -82,19 +79,20 @@ module Harmony
82
79
  Form::GetRequest => [Form::GetResponse],
83
80
  Flow::EndedRequest => [Response],
84
81
  Notification::Request => [Notification::AppResponse, Response],
85
- AttributeNamesRequest => [AttributeNamesResponse]
82
+ AttributeNamesRequest => [AttributeNamesResponse],
83
+ OauthTokenRequest => [OauthTokenResponse]
86
84
  }
87
85
  end
88
-
86
+
89
87
  def new_handler
90
88
  handler_class = Sneakers::CONFIG[:handler_class]
91
- raise "No handler specified" if handler_class.nil?
92
-
89
+ raise 'No handler specified' if handler_class.nil?
90
+
93
91
  handler = Object.const_get(handler_class).new
94
92
  raise "Unable to create handler: #{handler_class}" if handler.nil?
95
-
93
+
96
94
  handler
97
95
  end
98
96
  end
99
97
  end
100
- end
98
+ end
@@ -0,0 +1,13 @@
1
+ require 'sekrets'
2
+
3
+ class Harmony::Service::Utils::Secrets
4
+
5
+ def self.load
6
+ env = ENV['HARMONY_ENV']
7
+ abort "ENV['HARMONY_ENV'] must be set." unless env
8
+
9
+ secrets = Sekrets.settings_for('./config/settings.yml.enc')[env]
10
+ secrets.each_pair{|k,v| ENV[k] = v.to_s }
11
+ end
12
+
13
+ end
@@ -1,6 +1,6 @@
1
1
  module Harmony
2
2
  module Service
3
- VERSION = "0.4.4"
3
+ VERSION = "0.5.0"
4
4
  end
5
5
  end
6
6
 
@@ -86,6 +86,13 @@ describe Harmony::Service::RpcService do
86
86
  it { expect(subject).to have_received(:send_response_json).with("{\"^o\":\"Harmony::Service::AttributeNamesResponse\",\"options\":{}}", "harmony.trello", "abc123") }
87
87
  it { expect(subject).to have_received(:ack!) }
88
88
  end
89
+
90
+ context "oauth_token" do
91
+ let(:request) { Harmony::Service::OauthTokenRequest.new }
92
+ let(:response) { Harmony::Service::OauthTokenResponse.new}
93
+ it { expect(subject).to have_received(:send_response_json).with("{\"^o\":\"Harmony::Service::OauthTokenResponse\"}", "harmony.trello", "abc123") }
94
+ it { expect(subject).to have_received(:ack!) }
95
+ end
89
96
 
90
97
  context "exception" do
91
98
  let(:handler) do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: harmony-service
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.4
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Brooke-Smith
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-03 00:00:00.000000000 Z
11
+ date: 2017-10-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sneakers
@@ -86,6 +86,20 @@ dependencies:
86
86
  - - "~>"
87
87
  - !ruby/object:Gem::Version
88
88
  version: 0.3.4
89
+ - !ruby/object:Gem::Dependency
90
+ name: sekrets
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :runtime
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
89
103
  - !ruby/object:Gem::Dependency
90
104
  name: bundler
91
105
  requirement: !ruby/object:Gem::Requirement
@@ -166,10 +180,14 @@ files:
166
180
  - lib/harmony/service/message.rb
167
181
  - lib/harmony/service/notification/app_response.rb
168
182
  - lib/harmony/service/notification/request.rb
183
+ - lib/harmony/service/oauth_token_request.rb
184
+ - lib/harmony/service/oauth_token_response.rb
185
+ - lib/harmony/service/rake_tasks.rb
169
186
  - lib/harmony/service/request.rb
170
187
  - lib/harmony/service/response.rb
171
188
  - lib/harmony/service/rpc_service.rb
172
189
  - lib/harmony/service/utils/diff.rb
190
+ - lib/harmony/service/utils/secrets.rb
173
191
  - lib/harmony/service/utils/storage.rb
174
192
  - lib/harmony/service/version.rb
175
193
  - spec/harmony/service/rpc_service_spec.rb
@@ -196,7 +214,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
196
214
  version: '0'
197
215
  requirements: []
198
216
  rubyforge_project:
199
- rubygems_version: 2.6.10
217
+ rubygems_version: 2.6.14
200
218
  signing_key:
201
219
  specification_version: 4
202
220
  summary: Gem which helps you to build Harmony services