populus 0.0.1 → 0.0.3
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 +4 -4
- data/README.md +25 -9
- data/examples/echo.popl +8 -2
- data/examples/multi-event.popl +29 -0
- data/examples/remote_host.popl +19 -0
- data/lib/populus/accepter.rb +13 -1
- data/lib/populus/configuration.rb +35 -0
- data/lib/populus/dsl.rb +27 -7
- data/lib/populus/helpers/slack.rb +10 -0
- data/lib/populus/helpers.rb +19 -0
- data/lib/populus/node.rb +24 -0
- data/lib/populus/remote_runner.rb +19 -0
- data/lib/populus/version.rb +1 -1
- data/lib/populus.rb +8 -5
- data/populus.gemspec +2 -1
- metadata +25 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e1b404b1feb1d96fc1de40bb3806a202f8f2eb37
|
4
|
+
data.tar.gz: 1cf98167ae0480f6003f10026b9307c04f58b774
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: afc2e559d6b522b0c9773fe429183fa167d71b8051b44bcbd186673a31a00473bc3a7f67beae154d4f68612cc23d15c6a31aee5d4b958d0dcf9aeb01aa12cddf
|
7
|
+
data.tar.gz: 76ae2b3f08db7cfa45b27edbd37d1e5be19dfa8fd133a6ff23096a80aec385e4419fab212460cc6e9eee271902cd410cad9975d9a5b2093053007697d1ec26f4
|
data/README.md
CHANGED
@@ -23,24 +23,40 @@ Or install it yourself as:
|
|
23
23
|
### Usages below are just a draft
|
24
24
|
|
25
25
|
```ruby
|
26
|
-
Populus.
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
26
|
+
Populus.config do
|
27
|
+
set :slack_webhook, "https://hooks.slack.com/services/XXXXXX"
|
28
|
+
end
|
29
|
+
|
30
|
+
Populus.watch :event, name: "echo" do
|
31
|
+
cond {|data| data.any?{|d| d.has_key?('Payload')} }
|
32
|
+
runs do |data|
|
33
|
+
event = data.find{|d| d.has_key?('Payload')}
|
34
|
+
Populus.logger.info "From populus!!!"
|
35
|
+
Populus.logger.info Base64.decode64(event['Payload'])
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
Populus.watch :event, name: "slack" do
|
40
|
+
cond {|data| data.any?{|d| d.has_key?('Payload')} }
|
41
|
+
runs do |data|
|
42
|
+
event = data.first
|
43
|
+
|
44
|
+
notify_to_slack("Hello!!!\nConsul event payload:\n>>> `#{event.inspect}`", channel: '#test', username: "Populus")
|
31
45
|
end
|
32
46
|
end
|
33
47
|
```
|
34
48
|
|
35
49
|
```bash
|
36
|
-
|
50
|
+
bundle exec populus watch sample.popl
|
37
51
|
```
|
38
52
|
|
39
53
|
### TODOs
|
40
54
|
|
41
|
-
* Deployment switching by node name
|
42
|
-
* Condition phrase against JSON
|
43
|
-
* Local/remote execution by specinfra
|
55
|
+
* [ ] Deployment switching by node name
|
56
|
+
* [x] Condition phrase against JSON
|
57
|
+
* [ ] Local/remote execution by specinfra
|
58
|
+
* [ ] More helpers
|
59
|
+
* [ ] Omnibusify
|
44
60
|
|
45
61
|
## Contributing
|
46
62
|
|
data/examples/echo.popl
CHANGED
@@ -1,11 +1,17 @@
|
|
1
1
|
# -*- mode: ruby -*-
|
2
2
|
require 'base64'
|
3
3
|
|
4
|
+
Populus.config do
|
5
|
+
set :slack_webhook, "https://hooks.slack.com/services/XXXXXX"
|
6
|
+
end
|
7
|
+
|
4
8
|
Populus.watch :event, name: "sample" do
|
5
|
-
|
6
|
-
|
9
|
+
cond {|data| data.any?{|d| d.has_key?('Payload')} }
|
10
|
+
runs do |data|
|
7
11
|
event = data.find{|d| d.has_key?('Payload')}
|
8
12
|
Populus.logger.info "From populus!!!"
|
9
13
|
Populus.logger.info Base64.decode64(event['Payload'])
|
14
|
+
|
15
|
+
notify_to_slack("Hello!!!\nConsul event payload:\n>>> `#{event.inspect}`", channel: '#bot_test', username: "Populus")
|
10
16
|
end
|
11
17
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- mode: ruby -*-
|
2
|
+
require 'base64'
|
3
|
+
|
4
|
+
Populus.watch :event, name: "test001" do
|
5
|
+
cond {|data| data.any?{|d| d.has_key?('Payload')} }
|
6
|
+
runs do |data|
|
7
|
+
event = data.find{|d| d.has_key?('Payload')}
|
8
|
+
Populus.logger.info "From populus!!! this is test001"
|
9
|
+
Populus.logger.info Base64.decode64(event['Payload'])
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
Populus.watch :event, name: "test002" do
|
14
|
+
cond {|data| data.any?{|d| d.has_key?('Payload')} }
|
15
|
+
runs do |data|
|
16
|
+
event = data.find{|d| d.has_key?('Payload')}
|
17
|
+
Populus.logger.info "From populus!!! this is test002"
|
18
|
+
Populus.logger.info Base64.decode64(event['Payload'])
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
Populus.watch :event, name: "test003" do
|
23
|
+
cond {|data| data.any?{|d| d.has_key?('Payload')} }
|
24
|
+
runs do |data|
|
25
|
+
event = data.find{|d| d.has_key?('Payload')}
|
26
|
+
Populus.logger.info "From populus!!! this is test003"
|
27
|
+
Populus.logger.info Base64.decode64(event['Payload'])
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# -*- mode: ruby -*-
|
2
|
+
Populus.config do
|
3
|
+
set :ssh_options, {
|
4
|
+
user: 'operator',
|
5
|
+
keys: '~/.ssh/sample.pem'
|
6
|
+
}
|
7
|
+
end
|
8
|
+
|
9
|
+
Populus.node 'web001.example.jp'
|
10
|
+
|
11
|
+
Populus.watch :event, name: "run-command" do
|
12
|
+
cond {|_| true }
|
13
|
+
runs do |data|
|
14
|
+
on 'web001.example.jp' do
|
15
|
+
execute "uptime"
|
16
|
+
execute "whoami"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/populus/accepter.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'populus/remote_runner'
|
2
|
+
require 'populus/node'
|
3
|
+
|
1
4
|
module Populus
|
2
5
|
class Accepter
|
3
6
|
# TODO: validators
|
@@ -20,13 +23,22 @@ module Populus
|
|
20
23
|
def accept(data)
|
21
24
|
if condition[data]
|
22
25
|
Populus.logger.debug "Condition judged true: #{data.inspect}"
|
23
|
-
runner
|
26
|
+
instance_exec(data, &runner)
|
24
27
|
return true
|
25
28
|
else
|
26
29
|
Populus.logger.debug "Condition judged false: #{data.inspect}"
|
27
30
|
return false
|
28
31
|
end
|
29
32
|
end
|
33
|
+
|
34
|
+
def on(hostname, &run_it)
|
35
|
+
be = Node.registory[hostname]
|
36
|
+
if be
|
37
|
+
RemoteRunner.new(be, &run_it)
|
38
|
+
else
|
39
|
+
Populus.logger.warn "Not found host: #{hostname}. Skip."
|
40
|
+
end
|
41
|
+
end
|
30
42
|
end
|
31
43
|
|
32
44
|
class Event < Base
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'populus'
|
2
|
+
|
3
|
+
module Populus
|
4
|
+
class Configuration
|
5
|
+
def initialize
|
6
|
+
@pool = {}
|
7
|
+
end
|
8
|
+
|
9
|
+
def set(key, value)
|
10
|
+
true_value = case value
|
11
|
+
when Proc
|
12
|
+
value
|
13
|
+
else
|
14
|
+
lambda { value }
|
15
|
+
end
|
16
|
+
self.define_singleton_method key do
|
17
|
+
@pool[key] || (
|
18
|
+
@pool[key] = true_value.call
|
19
|
+
)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def method_missing(meth, *args)
|
24
|
+
raise NameError, "Populus::Configuration value #{meth} is not yet defined"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.config(&config_block)
|
29
|
+
@_config ||= Configuration.new
|
30
|
+
if block_given?
|
31
|
+
@_config.instance_eval(&config_block)
|
32
|
+
end
|
33
|
+
@_config
|
34
|
+
end
|
35
|
+
end
|
data/lib/populus/dsl.rb
CHANGED
@@ -1,25 +1,37 @@
|
|
1
1
|
require 'populus/pool'
|
2
|
+
require 'populus/node'
|
2
3
|
require 'populus/accepter'
|
3
4
|
|
4
5
|
module Populus
|
5
6
|
|
7
|
+
# Populus.node 'web001.exapmle.jp', 'web002.exapmle.jp'
|
8
|
+
#
|
6
9
|
# Populus.watch :event, name: "sample" do
|
7
|
-
#
|
8
|
-
#
|
10
|
+
# cond {|data| data.has_key?('Payload') }
|
11
|
+
# runs do |data|
|
9
12
|
# Populus.logger.info Base64.decode(data['Payload'])
|
10
13
|
# end
|
11
14
|
# end
|
15
|
+
#
|
16
|
+
# Populus.watch :event, name: "sample2" do
|
17
|
+
# cond {|data| data.has_key?('Payload') }
|
18
|
+
# runs do |data|
|
19
|
+
# on 'web001.exapmle.jp' do
|
20
|
+
# execute 'whoami'
|
21
|
+
# end
|
22
|
+
# end
|
23
|
+
# end
|
12
24
|
module DSL
|
13
25
|
class DSLContext
|
14
26
|
def initialize(wrap_obj)
|
15
27
|
@wrap_obj = wrap_obj
|
16
28
|
end
|
17
29
|
|
18
|
-
def
|
30
|
+
def cond(&do_foobar)
|
19
31
|
@wrap_obj.condition = do_foobar
|
20
32
|
end
|
21
33
|
|
22
|
-
def
|
34
|
+
def runs(&do_foobar)
|
23
35
|
@wrap_obj.runner = do_foobar
|
24
36
|
end
|
25
37
|
end
|
@@ -30,9 +42,10 @@ module Populus
|
|
30
42
|
Pool.register_object accepter
|
31
43
|
end
|
32
44
|
|
33
|
-
def
|
34
|
-
|
35
|
-
|
45
|
+
def node(*nodes)
|
46
|
+
nodes.each do |node|
|
47
|
+
Node.register_host(node)
|
48
|
+
end
|
36
49
|
end
|
37
50
|
|
38
51
|
def eval_setting(path)
|
@@ -41,6 +54,13 @@ module Populus
|
|
41
54
|
STDERR.puts "Invalid setting format! #{path}", "error is:", e.class, e.message, e.backtrace
|
42
55
|
exit 1
|
43
56
|
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def find_accepter(type)
|
61
|
+
const = type.gsub(/(^.|_.)/) {|c| c.tr('_', '').upcase }
|
62
|
+
Accepter.const_get(const)
|
63
|
+
end
|
44
64
|
end
|
45
65
|
|
46
66
|
extend DSL
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'populus/helpers'
|
2
|
+
require 'slack-notifier'
|
3
|
+
|
4
|
+
Populus::Helpers.define_helper :notify_to_slack do |message, options={}|
|
5
|
+
notifier = Slack::Notifier.new Populus.config.slack_webhook
|
6
|
+
notifier.channel = options[:channel] if options[:channel]
|
7
|
+
notifier.username = options[:username] if options[:username]
|
8
|
+
|
9
|
+
notifier.ping message
|
10
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'populus/accepter'
|
2
|
+
|
3
|
+
module Populus
|
4
|
+
module Helpers
|
5
|
+
extend self
|
6
|
+
|
7
|
+
def define_helper(name, &block)
|
8
|
+
m = Module.new do
|
9
|
+
define_method(name, &block)
|
10
|
+
end
|
11
|
+
Populus.logger.info "Register helper: #{name}"
|
12
|
+
Accepter::Base.send :include, m
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
Dir.glob("#{File.dirname __FILE__}/helpers/*.rb").each do |helper|
|
18
|
+
require helper
|
19
|
+
end
|
data/lib/populus/node.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'specinfra'
|
2
|
+
|
3
|
+
module Populus
|
4
|
+
class Node
|
5
|
+
class << self
|
6
|
+
def registory
|
7
|
+
@nodes ||= {}
|
8
|
+
end
|
9
|
+
|
10
|
+
def register_host(hostname)
|
11
|
+
registory[hostname] = gen_host(hostname)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
def gen_host(hostname)
|
16
|
+
return Specinfra::Backend::Ssh.new(
|
17
|
+
host: hostname,
|
18
|
+
ssh_options: Populus.config.ssh_options,
|
19
|
+
request_pty: true
|
20
|
+
)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'specinfra'
|
2
|
+
|
3
|
+
module Populus
|
4
|
+
class RemoteRunner
|
5
|
+
def initialize(backend, &run_it)
|
6
|
+
@backend = backend
|
7
|
+
instance_exec(&run_it)
|
8
|
+
end
|
9
|
+
|
10
|
+
def execute(*command)
|
11
|
+
Populus.logger.info("Running command: %s" % command.inspect)
|
12
|
+
|
13
|
+
res = @backend.run_command(command.join(" "))
|
14
|
+
Populus.logger.debug("stdout:\n%s" % res.stdout)
|
15
|
+
Populus.logger.debug("stderr:\n%s" % res.stderr)
|
16
|
+
Populus.logger.info("Command exited: %d" % res.exit_status)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/populus/version.rb
CHANGED
data/lib/populus.rb
CHANGED
@@ -1,12 +1,7 @@
|
|
1
1
|
module Populus; end
|
2
2
|
|
3
3
|
require "logger"
|
4
|
-
require "populus/pool"
|
5
|
-
require "populus/dsl"
|
6
|
-
require "populus/daemon"
|
7
|
-
require "populus/watch_thread"
|
8
4
|
require "populus/default_logger"
|
9
|
-
require "populus/version"
|
10
5
|
|
11
6
|
module Populus
|
12
7
|
class << self
|
@@ -16,3 +11,11 @@ module Populus
|
|
16
11
|
self.consul_bin = 'consul' # default to count on $PATH
|
17
12
|
self.logger = Populus::DefaultLogger
|
18
13
|
end
|
14
|
+
|
15
|
+
require "populus/pool"
|
16
|
+
require "populus/helpers"
|
17
|
+
require "populus/configuration"
|
18
|
+
require "populus/dsl"
|
19
|
+
require "populus/daemon"
|
20
|
+
require "populus/watch_thread"
|
21
|
+
require "populus/version"
|
data/populus.gemspec
CHANGED
@@ -14,12 +14,13 @@ Gem::Specification.new do |spec|
|
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
16
|
spec.files = `git ls-files -z`.split("\x0")
|
17
|
-
spec.executables = spec.files.grep(%r{^
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
21
|
spec.add_dependency "specinfra"
|
22
22
|
spec.add_dependency "colorize"
|
23
|
+
spec.add_dependency "slack-notifier"
|
23
24
|
|
24
25
|
spec.add_development_dependency "bundler", "~> 1.7"
|
25
26
|
spec.add_development_dependency "rake", ">= 10.0"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: populus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Uchio, KONDO
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04-
|
11
|
+
date: 2015-04-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: specinfra
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: slack-notifier
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: bundler
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -69,7 +83,8 @@ dependencies:
|
|
69
83
|
description: Consul event definition DSL
|
70
84
|
email:
|
71
85
|
- udzura@udzura.jp
|
72
|
-
executables:
|
86
|
+
executables:
|
87
|
+
- populus
|
73
88
|
extensions: []
|
74
89
|
extra_rdoc_files: []
|
75
90
|
files:
|
@@ -81,12 +96,19 @@ files:
|
|
81
96
|
- Rakefile
|
82
97
|
- bin/populus
|
83
98
|
- examples/echo.popl
|
99
|
+
- examples/multi-event.popl
|
100
|
+
- examples/remote_host.popl
|
84
101
|
- lib/populus.rb
|
85
102
|
- lib/populus/accepter.rb
|
103
|
+
- lib/populus/configuration.rb
|
86
104
|
- lib/populus/daemon.rb
|
87
105
|
- lib/populus/default_logger.rb
|
88
106
|
- lib/populus/dsl.rb
|
107
|
+
- lib/populus/helpers.rb
|
108
|
+
- lib/populus/helpers/slack.rb
|
109
|
+
- lib/populus/node.rb
|
89
110
|
- lib/populus/pool.rb
|
111
|
+
- lib/populus/remote_runner.rb
|
90
112
|
- lib/populus/version.rb
|
91
113
|
- lib/populus/watch_thread.rb
|
92
114
|
- populus.gemspec
|