serf_handler 0.1
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 +7 -0
- data/.gitignore +23 -0
- data/.travis.yml +8 -0
- data/Gemfile +11 -0
- data/LICENSE +21 -0
- data/README.md +39 -0
- data/Rakefile +26 -0
- data/lib/serf_handler.rb +57 -0
- data/serf_handler.gemspec +27 -0
- data/spec/serf_handler_spec.rb +127 -0
- data/spec/spec_helper.rb +7 -0
- metadata +71 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f17b68c3011b7a593e3139a84d8d42f1497d2c47
|
4
|
+
data.tar.gz: 6cac6c6d4fc7b3aa827a04290ea1ae00d54caaef
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 8c276d31d860b4f99ca2532bd7abe725ba1dedada3a1317aa11f0781ce35280f0ac4931ca849f3a415d47e36ba217c8c96f543cff20a5b098825daab529b2ba9
|
7
|
+
data.tar.gz: 56c44c998e2b118cc595ecc13d899b7e0a8f24ba0a17833efa72cee7e12f1fbbae84d1b338540d43c3e432e5011f9389f034b4bbb998793752d44fd7646fa6c0
|
data/.gitignore
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
.yardoc
|
6
|
+
Gemfile.lock
|
7
|
+
InstalledFiles
|
8
|
+
_yardoc
|
9
|
+
coverage
|
10
|
+
doc/
|
11
|
+
lib/bundler/man
|
12
|
+
pkg
|
13
|
+
rdoc
|
14
|
+
spec/reports
|
15
|
+
test/tmp
|
16
|
+
test/version_tmp
|
17
|
+
tmp
|
18
|
+
vendor
|
19
|
+
.DS_Store
|
20
|
+
*~
|
21
|
+
.gitignore~
|
22
|
+
*.zip
|
23
|
+
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2014 konchan
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
serf_handler
|
2
|
+
============
|
3
|
+
[](https://travis-ci.org/konchan/serf_handler)
|
4
|
+
|
5
|
+
[Serf](http://www.serfdom.io/) is a cluster orchestration framework which developed by [HashiCorp](http://www.hashicorp.com/). Serf allows you to execute your scripts when serf event occur.
|
6
|
+
You can simply extend SerfHandler and process serf events. Serf_handler is a very simple Ruby framework with no dependencies.
|
7
|
+
I have a lot in reference to [this code](https://github.com/garethr/serf-master).
|
8
|
+
|
9
|
+
### how to install
|
10
|
+
|
11
|
+
```
|
12
|
+
gem install serf_handler
|
13
|
+
```
|
14
|
+
|
15
|
+
### how to use
|
16
|
+
|
17
|
+
```sample.rb
|
18
|
+
require 'serf_handler'
|
19
|
+
|
20
|
+
class MyEventHandler
|
21
|
+
# called by SerfHandler when member-join event occur
|
22
|
+
def member_join
|
23
|
+
# write your code
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
if __FILE__ == $0
|
28
|
+
handler = SerfHandlerProxy.new
|
29
|
+
handler.register('MyRole', MyEventHandler.new)
|
30
|
+
handler.run
|
31
|
+
end
|
32
|
+
```
|
33
|
+
|
34
|
+
### Contributing
|
35
|
+
- Fork it
|
36
|
+
- Create your feature branch (```git checkout -b my-new-feature```)
|
37
|
+
- Commit your changes (```git commit -am 'Add some feature'```)
|
38
|
+
- Push to the branch (```git push origin my-new-feature```)
|
39
|
+
- Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
require 'rubygems'
|
3
|
+
require 'bundler'
|
4
|
+
require "bundler/gem_tasks"
|
5
|
+
|
6
|
+
begin
|
7
|
+
Bundler.setup(:default, :development)
|
8
|
+
rescue Bundler::BundlerError => e
|
9
|
+
$stderr.puts e.message
|
10
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
11
|
+
exit e.status_code
|
12
|
+
end
|
13
|
+
require 'rake'
|
14
|
+
|
15
|
+
require 'rspec/core'
|
16
|
+
require 'rspec/core/rake_task'
|
17
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
18
|
+
spec.pattern = FileList['spec/**/*_spec.rb']
|
19
|
+
end
|
20
|
+
|
21
|
+
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
22
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
23
|
+
spec.rcov = true
|
24
|
+
end
|
25
|
+
|
26
|
+
task :default => :spec
|
data/lib/serf_handler.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# @author katsuyuki
|
3
|
+
#
|
4
|
+
require "logger"
|
5
|
+
|
6
|
+
class SerfHandler
|
7
|
+
attr :name, :role, :event
|
8
|
+
|
9
|
+
def initialize(logger=nil)
|
10
|
+
if logger
|
11
|
+
@logger = logger
|
12
|
+
else
|
13
|
+
@logger = Logger.new(STDOUT)
|
14
|
+
@logger.level = Logger::INFO
|
15
|
+
end
|
16
|
+
@name = ENV['SERF_SELF_NAME']
|
17
|
+
@role = ENV['SERF_TAG_ROLE'] || ENV['SERF_SELF_ROLE']
|
18
|
+
@event = ENV['SERF_EVENT'] == 'user'? ENV['SERF_USER_EVENT'] : ENV['SERF_EVENT'].gsub(/-/, '_')
|
19
|
+
end
|
20
|
+
|
21
|
+
def log(msg)
|
22
|
+
@logger.info(msg)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class SerfHandlerProxy < SerfHandler
|
27
|
+
def initialize(logger=nil)
|
28
|
+
super(logger)
|
29
|
+
@handlers = {}
|
30
|
+
end
|
31
|
+
|
32
|
+
def register(role, handler)
|
33
|
+
@handlers[role] = handler
|
34
|
+
end
|
35
|
+
|
36
|
+
def get_klass()
|
37
|
+
klass = false
|
38
|
+
if @handlers.include?(@role)
|
39
|
+
klass = @handlers[@role]
|
40
|
+
elsif @handlers.include?('default')
|
41
|
+
klass = @handlers['default']
|
42
|
+
end
|
43
|
+
klass
|
44
|
+
end
|
45
|
+
|
46
|
+
def run()
|
47
|
+
unless klass = get_klass
|
48
|
+
log "no handler for role"
|
49
|
+
else
|
50
|
+
begin
|
51
|
+
klass.send @event
|
52
|
+
rescue NoMethodError => e
|
53
|
+
log "event not implemented by class"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'serf_handler'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = 'serf_handler'
|
8
|
+
gem.version = '0.1'
|
9
|
+
gem.authors = ['KONNO Katsuyuki']
|
10
|
+
gem.email = 'konno.katsuyuki@nifty.com'
|
11
|
+
gem.description = 'Serf event handlers for ruby'
|
12
|
+
gem.summary = 'Serf event handlers for ruby'
|
13
|
+
gem.homepage = 'http://github.com/konchan/serf_handler'
|
14
|
+
gem.licenses = ['MIT']
|
15
|
+
|
16
|
+
gem.rubygems_version = '2.0.14'
|
17
|
+
gem.files = `git ls-files`.split($\)
|
18
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
19
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
20
|
+
gem.require_paths = ['lib']
|
21
|
+
gem.extra_rdoc_files = [
|
22
|
+
'LICENSE',
|
23
|
+
'README.md'
|
24
|
+
]
|
25
|
+
|
26
|
+
gem.add_runtime_dependency('logger', ['>= 1.2.8'])
|
27
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "SerfHandler" do
|
4
|
+
context "Check initialize process" do
|
5
|
+
before do
|
6
|
+
ENV['SERF_SELF_NAME'] = 'local'
|
7
|
+
ENV['SERF_SELF_ROLE'] = 'web'
|
8
|
+
ENV['SERF_EVENT'] = 'member-join'
|
9
|
+
end
|
10
|
+
|
11
|
+
it "has handler name as 'local'" do
|
12
|
+
handler = SerfHandler.new
|
13
|
+
expect(handler.name).to eq('local')
|
14
|
+
end
|
15
|
+
|
16
|
+
it "has handler role as 'web'" do
|
17
|
+
handler = SerfHandler.new
|
18
|
+
expect(handler.role).to eq('web')
|
19
|
+
end
|
20
|
+
|
21
|
+
it "is set the event: 'member-join'" do
|
22
|
+
handler = SerfHandler.new
|
23
|
+
expect(handler.event).to eq('member_join')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context "Check user event processing" do
|
28
|
+
before do
|
29
|
+
ENV['SERF_SELF_NAME'] = 'local'
|
30
|
+
ENV['SERF_SELF_ROLE'] = 'web'
|
31
|
+
ENV['SERF_EVENT'] = 'user'
|
32
|
+
ENV['SERF_USER_EVENT'] = 'deploy'
|
33
|
+
end
|
34
|
+
|
35
|
+
it "has custome event: user" do
|
36
|
+
handler = SerfHandler.new
|
37
|
+
expect(handler.event).to eq('deploy')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "SerfHandlerProxy" do
|
43
|
+
context "Check Processing Tags" do
|
44
|
+
before do
|
45
|
+
ENV['SERF_SELF_NAME'] = nil
|
46
|
+
ENV['SERF_TAG_ROLE'] = 'bob'
|
47
|
+
ENV['SERF_EVENT'] = 'member-join'
|
48
|
+
end
|
49
|
+
|
50
|
+
it "has the role as bob" do
|
51
|
+
handler = SerfHandlerProxy.new
|
52
|
+
expect(handler.role).to eq('bob')
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context "Test negative cases" do
|
57
|
+
before do
|
58
|
+
ENV['SERF_TAG_ROLE'] = nil
|
59
|
+
ENV['SERF_SELF_NAME'] = nil
|
60
|
+
ENV['SERF_SELF_ROLE'] = nil
|
61
|
+
ENV['SERF_EVENT'] = 'member-join'
|
62
|
+
end
|
63
|
+
|
64
|
+
it "has no role" do
|
65
|
+
logger = double('Logger')
|
66
|
+
expect(logger).to receive(:info).with("no handler for role").and_return(true)
|
67
|
+
handler = SerfHandlerProxy.new(logger)
|
68
|
+
handler.run
|
69
|
+
end
|
70
|
+
|
71
|
+
it "has no method implemented" do
|
72
|
+
logger = double('Logger')
|
73
|
+
expect(logger).to receive(:info).with("event not implemented by class").and_return(true)
|
74
|
+
handler = SerfHandlerProxy.new(logger)
|
75
|
+
handler.register('default', SerfHandler.new)
|
76
|
+
handler.run
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context "Test custom event" do
|
81
|
+
before do
|
82
|
+
ENV['SERF_SELF_NAME'] = nil
|
83
|
+
ENV['SERF_SELF_ROLE'] = nil
|
84
|
+
ENV['SERF_EVENT'] = 'user'
|
85
|
+
ENV['SERF_USER_EVENT'] = 'implemented'
|
86
|
+
end
|
87
|
+
|
88
|
+
it "has method to process custom event" do
|
89
|
+
handler = SerfHandlerProxy.new
|
90
|
+
sample = double('SerfHandler')
|
91
|
+
expect(sample).to receive(:implemented).and_return(true)
|
92
|
+
handler.register('default', sample)
|
93
|
+
handler.run
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
context "Test standard event when role is default" do
|
98
|
+
before do
|
99
|
+
ENV['SERF_SELF_NAME'] = nil
|
100
|
+
ENV['SERF_EVENT'] = 'member-join'
|
101
|
+
end
|
102
|
+
|
103
|
+
it "has method to process member_join event" do
|
104
|
+
handler = SerfHandlerProxy.new
|
105
|
+
sample = double('SerfHandler')
|
106
|
+
expect(sample).to receive(:member_join).and_return(true)
|
107
|
+
handler.register('default', sample)
|
108
|
+
handler.run
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
context "Test standard event when role is web" do
|
113
|
+
before do
|
114
|
+
ENV['SERF_SELF_NAME'] = nil
|
115
|
+
ENV['SERF_SELF_ROLE'] = 'web'
|
116
|
+
ENV['SERF_EVENT'] = 'member-join'
|
117
|
+
end
|
118
|
+
|
119
|
+
it "has method to process member_join event" do
|
120
|
+
handler = SerfHandlerProxy.new
|
121
|
+
sample = double('SerfHandler')
|
122
|
+
expect(sample).to receive(:member_join).and_return(true)
|
123
|
+
handler.register('web', sample)
|
124
|
+
handler.run
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: serf_handler
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.1'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- KONNO Katsuyuki
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-08-02 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: logger
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.2.8
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.2.8
|
27
|
+
description: Serf event handlers for ruby
|
28
|
+
email: konno.katsuyuki@nifty.com
|
29
|
+
executables: []
|
30
|
+
extensions: []
|
31
|
+
extra_rdoc_files:
|
32
|
+
- LICENSE
|
33
|
+
- README.md
|
34
|
+
files:
|
35
|
+
- .gitignore
|
36
|
+
- .travis.yml
|
37
|
+
- Gemfile
|
38
|
+
- LICENSE
|
39
|
+
- README.md
|
40
|
+
- Rakefile
|
41
|
+
- lib/serf_handler.rb
|
42
|
+
- serf_handler.gemspec
|
43
|
+
- spec/serf_handler_spec.rb
|
44
|
+
- spec/spec_helper.rb
|
45
|
+
homepage: http://github.com/konchan/serf_handler
|
46
|
+
licenses:
|
47
|
+
- MIT
|
48
|
+
metadata: {}
|
49
|
+
post_install_message:
|
50
|
+
rdoc_options: []
|
51
|
+
require_paths:
|
52
|
+
- lib
|
53
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - '>='
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
58
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
requirements: []
|
64
|
+
rubyforge_project:
|
65
|
+
rubygems_version: 2.0.14
|
66
|
+
signing_key:
|
67
|
+
specification_version: 4
|
68
|
+
summary: Serf event handlers for ruby
|
69
|
+
test_files:
|
70
|
+
- spec/serf_handler_spec.rb
|
71
|
+
- spec/spec_helper.rb
|