mamiya 0.0.1.alpha20 → 0.0.1.alpha21

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e7ed13e8778df9ab9ce99e885013120a638a2bb6
4
- data.tar.gz: 4d85eca80055453cc3aac803a6dc5c0d232d2d38
3
+ metadata.gz: 4a0a40c67ec9701a56d9d5454ed090bca4f8c7c4
4
+ data.tar.gz: c6989472920d7302838ca131b425b62715383809
5
5
  SHA512:
6
- metadata.gz: efef0fb46485a44362ae151ad79eaf6baec6ade4877bf02588b802fe553e1b2115408fda4fbf5628c77ba2d141391bfc1742341d43bfea3d76b6a2a9ee51fa58
7
- data.tar.gz: c8dc1424d06eda65ce392f5d8e3acd3fa7f667c0d29c1bb6993a3cad27e099c5da2ffa97b3b573fdab045e957c060edbabdc200d1cbb1ae60d3297404f669f2f
6
+ metadata.gz: 60cfeb34db85ab130c792c28723e91518f2367a6bf29ff9221b7b969fa956c8fb2dfd12f69e0b44143081619ac346862270ab6c46b6afb4d343cb1fe2c7ac815
7
+ data.tar.gz: fc6c115392f4dca0acd05aa5c4708d796a29086b4c8863a65432a82206c397829b065d063bc909a98adb5bf09d70cb6b3bbf08cd5fc9218735d55f50dc0eb62c
data/README.md CHANGED
@@ -36,6 +36,12 @@ TODO: Write usage instructions here
36
36
 
37
37
  ## Upgrade Notes
38
38
 
39
+ ### 0.0.1.alpha21
40
+
41
+ #### Configuration now written in Ruby
42
+
43
+ You should rewrite your configuration yaml in Ruby. See examples/config.rb for example.
44
+
39
45
  ### 0.0.1.alpha20
40
46
 
41
47
  _tl;dr_ Don't mix alpha19 and alpha20.
data/example/Procfile ADDED
@@ -0,0 +1,2 @@
1
+ master: bundle exec env MAMIYA_SYNC_OUT=1 mamiya master -d --serf bind=0.0.0.0:7760,rpc_addr=127.0.0.1:17760,node=${HOSTNAME}_${PORT}
2
+ agent: bundle exec env MAMIYA_SYNC_OUT=1 sh -c 'sleep 2; mamiya agent -d --serf bind=0.0.0.0:$PORT,rpc_addr=127.0.0.1:1$PORT,join=127.0.0.1:7760,node=${HOSTNAME}_${PORT}'
data/example/config.rb ADDED
@@ -0,0 +1,9 @@
1
+ set :storage, {
2
+ type: :s3,
3
+ bucket: ENV["MAMIYA_S3_BUCKET"] || ENV["S3_BUCKET"] || raise("specify your S3 bucket via $MAMIYA_S3_BUCKET or $S3_BUCKET"),
4
+ region: ENV["AWS_REGION"] || 'ap-northeast-1',
5
+ }
6
+
7
+ set :packages_dir, "#{File.dirname(__FILE__)}/dst"
8
+ set :keep_packages, 3
9
+ set :fetch_sleep, 2
data/example/deploy.rb ADDED
@@ -0,0 +1,34 @@
1
+ require 'digest/sha1'
2
+ require 'fileutils'
3
+ require 'pathname'
4
+
5
+ set :application, 'myapp'
6
+ #set :repository, '...'
7
+
8
+ #set :package_under, 'dir'
9
+ set :exclude_from_package, ['tmp', 'log', 'spec', '.sass-cache']
10
+ set :dereference_symlinks, true
11
+
12
+ # http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?revision=45360&view=revision
13
+ set :build_to, "#{File.dirname(__FILE__)}/pkg"
14
+ set :deploy_to, "..."
15
+
16
+ set :bundle_without, [:development, :test]
17
+ set :bundle_dir, "#{deploy_to}/shared/bundle"
18
+
19
+ #use :git, exclude_git_clean_targets: true
20
+
21
+ prepare_build("bundle install") do
22
+ run "bundle", "install"
23
+ end
24
+
25
+ build("include assets and .bundle") do
26
+ exclude_from_package.reject! { |_| _ == 'public/assets/' }
27
+ exclude_from_package.reject! { |_| _ == '.bundle/' }
28
+ end
29
+
30
+ build("assets compile") do
31
+ run "bundle", "exec", "rake", "assets:precompile"
32
+ end
33
+
34
+
data/lib/mamiya/agent.rb CHANGED
@@ -76,15 +76,15 @@ module Mamiya
76
76
 
77
77
  ##
78
78
  # Returns agent status. Used for HTTP API and `serf query` inspection.
79
- def status
79
+ def status(packages: true)
80
+ # When changing signature, don't forget to change samely of Master#status too
80
81
  {}.tap do |s|
81
- s[:master] = false
82
82
  s[:name] = serf.name
83
83
  s[:version] = Mamiya::VERSION
84
84
 
85
85
  s[:queues] = task_queue.status
86
86
 
87
- s[:packages] = self.existing_packages
87
+ s[:packages] = self.existing_packages if packages
88
88
  end
89
89
  end
90
90
 
@@ -135,7 +135,11 @@ module Mamiya
135
135
  end
136
136
 
137
137
  serf.respond('mamiya:status') do |event|
138
- self.status.to_json
138
+ self.status(packages: false).to_json
139
+ end
140
+
141
+ serf.respond('mamiya:packages') do |event|
142
+ self.existing_packages.to_json
139
143
  end
140
144
  end
141
145
  end
@@ -28,14 +28,17 @@ module Mamiya
28
28
  end
29
29
 
30
30
  def execute
31
+ @logger.info "Task started: #{task.inspect}"
31
32
  before
32
33
  run
33
34
  rescue Exception => error
34
35
  @error = error
35
36
  raise if raise_error?
36
37
  errored
38
+ @logger.error "Encountered error: #{error.inspect}\n\t#{error.backtrace.join("\n\t")}"
37
39
  ensure
38
40
  after
41
+ @logger.info "Task finished"
39
42
  end
40
43
 
41
44
  def before
@@ -1,3 +1,5 @@
1
+ require 'fileutils'
2
+
1
3
  require 'mamiya/agent/tasks/notifyable'
2
4
  require 'mamiya/steps/fetch'
3
5
  require 'mamiya/storages/abstract'
@@ -7,10 +9,12 @@ module Mamiya
7
9
  module Tasks
8
10
  class Fetch < Notifyable
9
11
  def run
10
- logger.info "Fetching #{application}/#{package}"
11
-
12
+ prepare_destination
12
13
  take_interval
14
+
15
+ logger.info "Fetching #{application}/#{package}"
13
16
  step.run!
17
+
14
18
  order_cleaning
15
19
  rescue Mamiya::Storages::Abstract::AlreadyFetched
16
20
  logger.info "It has already fetched; skipping."
@@ -26,6 +30,13 @@ module Mamiya
26
30
  rand(wait)
27
31
  end
28
32
 
33
+ def prepare_destination
34
+ unless File.exist?(destination)
35
+ @logger.info "Creating #{destination}"
36
+ FileUtils.mkdir_p(destination)
37
+ end
38
+ end
39
+
29
40
  def order_cleaning
30
41
  task_queue.enqueue(:clean, {})
31
42
  end
data/lib/mamiya/cli.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require 'mamiya'
2
2
 
3
- require 'mamiya/config'
3
+ require 'mamiya/configuration'
4
4
  require 'mamiya/script'
5
5
  require 'mamiya/logger'
6
6
 
@@ -227,15 +227,15 @@ module Mamiya
227
227
 
228
228
  def config(dont_raise_error = false)
229
229
  return @config if @config
230
- path = [options[:config], './mamiya.yml', './config.yml'].compact.find { |_| File.exists?(_) }
230
+ path = [options[:config], './mamiya.conf.rb', './config.rb'].compact.find { |_| File.exists?(_) }
231
231
 
232
232
  if path
233
233
  logger.debug "Using configuration: #{path}"
234
- @config = Mamiya::Config.load(File.expand_path(path))
234
+ @config = Mamiya::Configuration.new.load!(File.expand_path(path))
235
235
  else
236
236
  logger.debug "Couldn't find configuration file"
237
237
  return nil if dont_raise_error
238
- fatal! "Configuration File not found (try --config(-C) option or place it at ./mamiya.yml or ./config.yml)"
238
+ fatal! "Configuration File not found (try --config(-C) option or place it at ./config.rb)"
239
239
  end
240
240
  end
241
241
 
@@ -0,0 +1,29 @@
1
+ require 'mamiya/dsl'
2
+ require 'mamiya/storages'
3
+
4
+ require 'shellwords'
5
+
6
+ module Mamiya
7
+ class Configuration < DSL
8
+ # common
9
+ set_default :serf, {}
10
+ set_default :storage, {}
11
+ set_default :show_backtrace_in_fatal, true
12
+
13
+ set_default :application, nil
14
+
15
+ # agent
16
+ set_default :packages_dir, nil
17
+ set_default :fetch_sleep, 12
18
+ set_default :keep_packages, 3
19
+
20
+ # master
21
+ set_default :master, {monitor: {refresh_interval: nil}} # TODO: don't nest
22
+ set_default :web, {port: 7761, bind: '0.0.0.0', environment: :development} # TODO: IPv6
23
+
24
+ def storage_class
25
+ Storages.find(self[:storage][:type])
26
+ end
27
+ end
28
+ end
29
+
data/lib/mamiya/dsl.rb CHANGED
@@ -28,7 +28,7 @@ module Mamiya
28
28
  k = name.to_sym
29
29
  return if self.instance_methods.include?(k)
30
30
 
31
- define_method(k) { @variables[k] || self.class.defaults[k] }
31
+ define_method(k) { self[k] }
32
32
  end
33
33
 
34
34
  ##
@@ -154,6 +154,12 @@ module Mamiya
154
154
  set(k, value)
155
155
  end
156
156
 
157
+ ##
158
+ # (DSL) Retrieve value for key +key+. Value can be set using DSL#set .
159
+ def [](key)
160
+ @variables[key] || self.class.defaults[key]
161
+ end
162
+
157
163
  ##
158
164
  # (DSL) Define task named +name+ with given block.
159
165
  def task(name, &block)
data/lib/mamiya/master.rb CHANGED
@@ -52,7 +52,7 @@ module Mamiya
52
52
  ).keys
53
53
  end
54
54
 
55
- def status
55
+ def status(packages: false)
56
56
  {name: serf.name, master: true}
57
57
  end
58
58
 
@@ -14,6 +14,7 @@ module Mamiya
14
14
  include AgentMonitorHandlers
15
15
 
16
16
  STATUS_QUERY = 'mamiya:status'.freeze
17
+ PACKAGES_QUERY = 'mamiya:packages'.freeze
17
18
  DEFAULT_INTERVAL = 60
18
19
 
19
20
  def initialize(master, raise_exception: false)
@@ -99,8 +100,12 @@ module Mamiya
99
100
  end
100
101
 
101
102
  @commit_lock.synchronize {
102
- response = @master.serf.query(STATUS_QUERY, '', **kwargs)
103
- response["Responses"].each do |name, json|
103
+ status_query_th = Thread.new { @master.serf.query(STATUS_QUERY, '', **kwargs) }
104
+ packages_query_th = Thread.new { @master.serf.query(PACKAGES_QUERY, '', **kwargs) }
105
+ status_response = status_query_th.value
106
+ packages_response = packages_query_th.value
107
+
108
+ status_response["Responses"].each do |name, json|
104
109
  begin
105
110
  new_statuses[name] = JSON.parse(json)
106
111
  rescue JSON::ParserError => e
@@ -110,6 +115,23 @@ module Mamiya
110
115
  end
111
116
  end
112
117
 
118
+ packages_response["Responses"].each do |name, json|
119
+ next unless new_statuses[name]
120
+
121
+ begin
122
+ new_statuses[name]['packages'] = JSON.parse(json)
123
+ rescue JSON::ParserError => e
124
+ logger.warn "Failed to parse packages from #{name}: #{e.message}"
125
+ next
126
+ end
127
+ end
128
+
129
+ (new_statuses.keys - packages_response["Responses"].keys).each do |name|
130
+ if @statuses[name] && @statuses[name]['packages']
131
+ new_statuses[name]['packages'] = @statuses[name]['packages']
132
+ end
133
+ end
134
+
113
135
  new_failed_agents = new_failed_agents.to_a
114
136
 
115
137
  (new_agents.keys - @agents.keys).join(", ").tap do |agents|
@@ -29,7 +29,7 @@ module Mamiya
29
29
 
30
30
  def task__finish(status, payload, event)
31
31
  task = payload['task']
32
- logger.error "#{status['name']} finished task #{task['task']}: #{payload['error']}"
32
+ logger.info "#{status['name']} has finished task #{task['task'].inspect}"
33
33
 
34
34
  task__finalize(status, payload, event)
35
35
 
@@ -41,7 +41,7 @@ module Mamiya
41
41
 
42
42
  def task__error(status, payload, event)
43
43
  task = payload['task']
44
- logger.error "#{status['name']} failed task #{task['task']}: #{payload['error']}"
44
+ logger.error "#{status['name']} has failed task #{task['task'].inspect}: #{payload['error']}"
45
45
 
46
46
  task__finalize(status, payload, event)
47
47
 
@@ -1,11 +1,10 @@
1
- require 'mamiya/config'
2
1
  require 'mamiya/script'
3
2
  require 'mamiya/logger'
4
3
 
5
4
  module Mamiya
6
5
  module Steps
7
6
  class Abstract
8
- def initialize(script: Mamiya::Script.new, config: Mamiya::Config.new, logger: Mamiya::Logger.new, **options)
7
+ def initialize(script: Mamiya::Script.new, config: Mamiya::Configuration.new, logger: Mamiya::Logger.new, **options)
9
8
  @script, @config, @options = script, config, options
10
9
  @logger = logger[self.class.name.sub(/^Mamiya::Steps::/,'')]
11
10
  end
@@ -1,3 +1,3 @@
1
1
  module Mamiya
2
- VERSION = "0.0.1.alpha20"
2
+ VERSION = "0.0.1.alpha21"
3
3
  end
@@ -1,11 +1,19 @@
1
1
  require 'spec_helper'
2
+ require 'tmpdir'
2
3
 
3
4
  require 'mamiya/agent/tasks/fetch'
4
5
  require 'mamiya/agent/tasks/notifyable'
5
6
  require 'mamiya/steps/fetch'
6
7
 
7
8
  describe Mamiya::Agent::Tasks::Fetch do
8
- let(:config) { {packages_dir: File::NULL} }
9
+ let!(:tmpdir) { Dir.mktmpdir("mamiya-agent-tasks-fetch-spec") }
10
+ after { FileUtils.remove_entry_secure tmpdir }
11
+
12
+ let(:destination) { File.join(tmpdir, 'destination') }
13
+ let(:app_destination) { File.join(destination, 'myapp') }
14
+
15
+ let(:config) { {packages_dir: destination} }
16
+
9
17
  let(:agent) { double('agent', config: config) }
10
18
  let(:task_queue) { double('task_queue', enqueue: nil) }
11
19
 
@@ -21,10 +29,12 @@ describe Mamiya::Agent::Tasks::Fetch do
21
29
 
22
30
  describe "#execute" do
23
31
  before do
32
+ FileUtils.mkdir_p(app_destination)
33
+
24
34
  allow(Mamiya::Steps::Fetch).to receive(:new).with(
25
35
  application: 'myapp',
26
36
  package: 'mypkg',
27
- destination: File.join(File::NULL, 'myapp'),
37
+ destination: app_destination,
28
38
  config: config,
29
39
  ).and_return(step)
30
40
 
@@ -43,6 +53,21 @@ describe Mamiya::Agent::Tasks::Fetch do
43
53
  task.execute
44
54
  end
45
55
 
56
+ context "when destination directory not exists" do
57
+ before do
58
+ FileUtils.remove_entry_secure(destination)
59
+ end
60
+ it "creates directory" do
61
+ allow(step).to receive(:run!) do
62
+ expect(Pathname.new(app_destination)).to be_exist
63
+ end
64
+
65
+ task.execute
66
+
67
+ expect(Pathname.new(app_destination)).to be_exist
68
+ end
69
+ end
70
+
46
71
  context "when already fetched" do
47
72
  it "does nothing" do
48
73
  allow(step).to receive(:run!).and_raise(Mamiya::Storages::Abstract::AlreadyFetched)
data/spec/agent_spec.rb CHANGED
@@ -117,6 +117,10 @@ describe Mamiya::Agent do
117
117
 
118
118
  subject(:status) { agent.status }
119
119
 
120
+ it "doesn't include master=true" do
121
+ expect(status[:master]).to be_nil
122
+ end
123
+
120
124
  it "includes version identifier" do
121
125
  expect(status[:version]).to eq Mamiya::VERSION
122
126
  end
@@ -129,6 +133,14 @@ describe Mamiya::Agent do
129
133
  expect(status[:packages]).to eq agent.existing_packages
130
134
  end
131
135
 
136
+ context "with packages=false" do
137
+ subject(:status) { agent.status(packages: false) }
138
+
139
+ it "doesn't include existing packages" do
140
+ expect(status.has_key?(:packages)).to be_false
141
+ end
142
+ end
143
+
132
144
  describe "(task queue)" do
133
145
  it "includes task_queue" do
134
146
  expect(status[:queues]).to eq({a: {working: nil, queue: []}})
@@ -166,11 +178,18 @@ describe Mamiya::Agent do
166
178
 
167
179
  describe "query responder" do
168
180
  it "responds to 'mamiya:status'" do
169
- allow(agent).to receive(:status).and_return("my" => "status")
181
+ allow(agent).to receive(:status).with(packages: false).and_return("my" => "status")
170
182
 
171
183
  response = serf.trigger_query('mamiya:status', '')
172
184
  expect(JSON.parse(response)).to eq("my" => "status")
173
185
  end
186
+
187
+ it "responds to 'mamiya:packages'" do
188
+ allow(agent).to receive(:existing_packages).and_return(%w(pkg1 pkg2))
189
+
190
+ response = serf.trigger_query('mamiya:packages', '')
191
+ expect(JSON.parse(response)).to eq(%w(pkg1 pkg2))
192
+ end
174
193
  end
175
194
 
176
195
  describe "event handler" do
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+ require 'tmpdir'
3
+
4
+ require 'mamiya/dsl'
5
+ require 'mamiya/storages'
6
+
7
+ require 'mamiya/configuration'
8
+
9
+ describe Mamiya::Configuration do
10
+ subject(:config) { described_class.new }
11
+
12
+ it "inherits Mamiya::DSL" do
13
+ expect(described_class.ancestors).to include(Mamiya::DSL)
14
+ end
15
+
16
+ describe "#storage_class" do
17
+ before do
18
+ config.evaluate! do
19
+ set :storage, type: :foobar, conf: :iguration
20
+ end
21
+ end
22
+
23
+ let(:klass) { Class.new }
24
+
25
+ before do
26
+ allow(Mamiya::Storages).to receive(:find).with(:foobar).and_return(klass)
27
+ end
28
+
29
+ subject(:storage_class) { config.storage_class }
30
+
31
+ it "finds class using Storages.find" do
32
+ expect(storage_class).to eq klass
33
+ end
34
+ end
35
+ end
data/spec/dsl_spec.rb CHANGED
@@ -95,8 +95,10 @@ describe Mamiya::DSL do
95
95
  expect{ dsl.foo }.to raise_error
96
96
  dsl.set :foo, 100
97
97
  expect(dsl.foo).to eq 100
98
+ expect(dsl[:foo]).to eq 100
98
99
  dsl.set :foo, 200
99
100
  expect(dsl.foo).to eq 200
101
+ expect(dsl[:foo]).to eq 200
100
102
  end
101
103
  end
102
104
 
@@ -104,6 +106,7 @@ describe Mamiya::DSL do
104
106
  it "sets variable" do
105
107
  dsl.set_default :foo, 100
106
108
  expect(dsl.foo).to eq 100
109
+ expect(dsl[:foo]).to eq 100
107
110
  end
108
111
 
109
112
  context "when already assigned" do
@@ -111,6 +114,7 @@ describe Mamiya::DSL do
111
114
  dsl.set :foo, 100
112
115
  dsl.set_default :foo, 200
113
116
  expect(dsl.foo).to eq 100
117
+ expect(dsl[:foo]).to eq 100
114
118
  end
115
119
  end
116
120
  end
@@ -16,16 +16,35 @@ describe Mamiya::Master::AgentMonitor do
16
16
  described_class.new(master)
17
17
  end
18
18
 
19
- describe "#refresh" do
20
- let(:query_response) do
21
- {
22
- "Acks" => ['a'],
23
- "Responses" => {
24
- 'a' => {"foo" => "bar"}.to_json,
25
- },
26
- }
19
+ def stub_serf_queries(expected_payload: '', expected_kwargs: {})
20
+ allow(serf).to receive(:query) do |query, payload, kwargs={}|
21
+ expect(payload).to eq expected_payload
22
+ expect(kwargs).to eq expected_kwargs
23
+ expect(%w(mamiya:status mamiya:packages)).to include(query)
24
+
25
+ {'mamiya:status' => status_query_response, 'mamiya:packages' => packages_query_response}[query]
27
26
  end
27
+ end
28
+
29
+ let(:status_query_response) do
30
+ {
31
+ "Acks" => ['a'],
32
+ "Responses" => {
33
+ 'a' => {"foo" => "bar", 'packages' => ['pkg1']}.to_json,
34
+ },
35
+ }
36
+ end
37
+
38
+ let(:packages_query_response) do
39
+ {
40
+ "Acks" => ['a'],
41
+ "Responses" => {
42
+ 'a' => ['pkg1','pkg2'].to_json,
43
+ },
44
+ }
45
+ end
28
46
 
47
+ describe "#refresh" do
29
48
  let(:members) do
30
49
  [
31
50
  {
@@ -38,7 +57,7 @@ describe Mamiya::Master::AgentMonitor do
38
57
  end
39
58
 
40
59
  before do
41
- allow(serf).to receive(:query).with('mamiya:status', '', {}).and_return(query_response)
60
+ stub_serf_queries()
42
61
  allow(serf).to receive(:members).and_return(members)
43
62
  end
44
63
 
@@ -46,8 +65,49 @@ describe Mamiya::Master::AgentMonitor do
46
65
  expect {
47
66
  agent_monitor.refresh
48
67
  }.to change {
49
- agent_monitor.statuses["a"]
50
- }.to("foo" => "bar")
68
+ agent_monitor.statuses["a"] && agent_monitor.statuses["a"]['foo']
69
+ }.to('bar')
70
+ end
71
+
72
+ it "updates status .packages by packages query" do
73
+ expect {
74
+ agent_monitor.refresh
75
+ }.to change {
76
+ agent_monitor.statuses["a"] && agent_monitor.statuses["a"]['packages']
77
+ }.to(%w(pkg1 pkg2))
78
+ end
79
+
80
+ context "when packages query unavailable, but available in status query" do
81
+ let(:packages_query_response) do
82
+ {
83
+ "Acks" => ['a'],
84
+ "Responses" => {
85
+ },
86
+ }
87
+ end
88
+
89
+ it "updates status .packages from status" do
90
+ expect {
91
+ agent_monitor.refresh
92
+ }.to change {
93
+ agent_monitor.statuses["a"] && agent_monitor.statuses["a"]['packages']
94
+ }.to(%w(pkg1))
95
+ end
96
+ end
97
+
98
+ context "when failed to retrieve package list, but it was available previously in packages query" do
99
+ before do
100
+ agent_monitor.refresh
101
+ packages_query_response['Responses'] = {}
102
+ end
103
+
104
+ it "keeps previous list" do
105
+ expect {
106
+ agent_monitor.refresh
107
+ }.not_to change {
108
+ agent_monitor.statuses["a"]['packages']
109
+ }
110
+ end
51
111
  end
52
112
 
53
113
  it "updates #agents" do
@@ -80,7 +140,7 @@ describe Mamiya::Master::AgentMonitor do
80
140
  end
81
141
 
82
142
  context "when some agent returned invalid status" do
83
- let(:query_response) do
143
+ let(:status_query_response) do
84
144
  {
85
145
  "Acks" => ['a'],
86
146
  "Responses" => {
@@ -99,15 +159,15 @@ describe Mamiya::Master::AgentMonitor do
99
159
  end
100
160
 
101
161
  context "with argument" do
102
- it "passes args to serf query" do
103
- expect(serf).to receive(:query).with('mamiya:status', '', node: 'foo').and_return(query_response)
162
+ it "passes args to serf query", pending: 'stub_serf_queries cannot handle kwarg' do
163
+ stub_serf_queries(expected_kwargs: {node: 'foo'})
104
164
  agent_monitor.refresh(node: 'foo')
105
165
  end
106
166
  end
107
167
  end
108
168
 
109
169
  describe "(commiting events)" do
110
- let(:query_response) do
170
+ let(:status_query_response) do
111
171
  {
112
172
  "Acks" => ['a'],
113
173
  "Responses" => {
@@ -116,6 +176,14 @@ describe Mamiya::Master::AgentMonitor do
116
176
  }
117
177
  end
118
178
 
179
+ let(:packages_query_response) do
180
+ {
181
+ "Acks" => ['a'],
182
+ "Responses" => {
183
+ },
184
+ }
185
+ end
186
+
119
187
  let(:members) do
120
188
  [
121
189
  {
@@ -142,7 +210,7 @@ describe Mamiya::Master::AgentMonitor do
142
210
  end
143
211
 
144
212
  before do
145
- allow(serf).to receive(:query).with('mamiya:status', '', {}).and_return(query_response)
213
+ stub_serf_queries()
146
214
  allow(serf).to receive(:members).and_return(members)
147
215
 
148
216
  agent_monitor.refresh
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mamiya
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.alpha20
4
+ version: 0.0.1.alpha21
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shota Fukumori (sora_h)
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-26 00:00:00.000000000 Z
11
+ date: 2014-08-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -171,6 +171,9 @@ files:
171
171
  - docs/sequences/deploy.png
172
172
  - docs/sequences/deploy.uml
173
173
  - example.rb
174
+ - example/Procfile
175
+ - example/config.rb
176
+ - example/deploy.rb
174
177
  - lib/mamiya.rb
175
178
  - lib/mamiya/agent.rb
176
179
  - lib/mamiya/agent/actions.rb
@@ -183,7 +186,7 @@ files:
183
186
  - lib/mamiya/agent/tasks/notifyable.rb
184
187
  - lib/mamiya/cli.rb
185
188
  - lib/mamiya/cli/client.rb
186
- - lib/mamiya/config.rb
189
+ - lib/mamiya/configuration.rb
187
190
  - lib/mamiya/dsl.rb
188
191
  - lib/mamiya/helpers/git.rb
189
192
  - lib/mamiya/logger.rb
@@ -215,7 +218,7 @@ files:
215
218
  - spec/agent/tasks/fetch_spec.rb
216
219
  - spec/agent/tasks/notifyable_spec.rb
217
220
  - spec/agent_spec.rb
218
- - spec/config_spec.rb
221
+ - spec/configuration_spec.rb
219
222
  - spec/dsl_spec.rb
220
223
  - spec/fixtures/dsl_test_load.rb
221
224
  - spec/fixtures/dsl_test_use.rb
@@ -274,7 +277,7 @@ test_files:
274
277
  - spec/agent/tasks/fetch_spec.rb
275
278
  - spec/agent/tasks/notifyable_spec.rb
276
279
  - spec/agent_spec.rb
277
- - spec/config_spec.rb
280
+ - spec/configuration_spec.rb
278
281
  - spec/dsl_spec.rb
279
282
  - spec/fixtures/dsl_test_load.rb
280
283
  - spec/fixtures/dsl_test_use.rb
data/lib/mamiya/config.rb DELETED
@@ -1,57 +0,0 @@
1
- require 'yaml'
2
- require 'mamiya/storages'
3
-
4
- module Mamiya
5
- class Config
6
- def self.load(file)
7
- self.new YAML.load(ERB.new(File.read(file)).result(binding))
8
- end
9
-
10
- def initialize(config_hash = {})
11
- @config = symbolize_keys_in(config_hash)
12
- end
13
-
14
- def [](key)
15
- @config[key]
16
- end
17
-
18
- def []=(key, value)
19
- @config[key] = value
20
- end
21
-
22
- def storage_class
23
- self[:storage] && Storages.find(self[:storage][:type])
24
- end
25
-
26
- def deploy_to_for_app(app)
27
- # TODO: test
28
- app = app.to_sym
29
-
30
- if self[:apps] && self[:applications][app]
31
- Pathname.new(self[:applications][app][:deploy_to])
32
- end
33
- end
34
-
35
- def releases_path_for_app(app)
36
- # TODO: test
37
- deploy_to_for_app(app).join('releases')
38
- end
39
-
40
- private
41
-
42
- def symbolize_keys_in(hash)
43
- Hash[hash.map { |k, v|
44
- case v
45
- when Hash
46
- v = symbolize_keys_in(v)
47
- when Array
48
- if v.find { |_| _.kind_of?(Hash) }
49
- v = v.map { |_| _.kind_of?(Hash) ? symbolize_keys_in(_) : _ }
50
- end
51
- end
52
-
53
- [k.to_sym, v]
54
- }]
55
- end
56
- end
57
- end
data/spec/config_spec.rb DELETED
@@ -1,50 +0,0 @@
1
- require 'spec_helper'
2
- require 'mamiya/storages'
3
-
4
- require 'mamiya/config'
5
-
6
- describe Mamiya::Config do
7
- let(:source) do
8
- {
9
- "test" => {
10
- "a" => ["b" => {"c" => {"d" => "e"}}]
11
- },
12
- :test2 => :hello
13
- }
14
- end
15
- subject(:config) { described_class.new(source) }
16
-
17
- describe ".load" do
18
- let(:fixture_path) { File.join(__dir__, 'fixtures', 'test.yml') }
19
-
20
- subject(:config) { described_class.load(fixture_path) }
21
-
22
- it { should be_a(described_class) }
23
-
24
- it "loads configuration from file" do
25
- expect(config[:a][:e]).to eq "f"
26
- end
27
- end
28
-
29
- it "symbolizes keys" do
30
- expect(config[:test][:a][0][:b][:c][:d]).to eq "e"
31
- expect(config[:test2]).to eq :hello
32
- end
33
-
34
- describe "#storage_class" do
35
- let(:source) do
36
- {storage: {type: :foobar, conf: :iguration}}
37
- end
38
- let(:klass) { Class.new }
39
-
40
- before do
41
- allow(Mamiya::Storages).to receive(:find).with(:foobar).and_return(klass)
42
- end
43
-
44
- subject(:storage_class) { config.storage_class }
45
-
46
- it "finds class using Storages.find" do
47
- expect(storage_class).to eq klass
48
- end
49
- end
50
- end