stacksondeck 0.0.1 → 1.0.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 +4 -4
- data/.gitignore +2 -0
- data/Gemfile +1 -0
- data/Rakefile +1 -1
- data/Readme.md +29 -3
- data/VERSION +1 -1
- data/lib/stacksondeck/app.rb +141 -0
- data/lib/stacksondeck/main.rb +72 -5
- data/lib/stacksondeck/metadata.rb +1 -1
- data/lib/stacksondeck/mjolnir.rb +77 -0
- data/stacksondeck.gemspec +4 -0
- metadata +62 -5
- data/lib/stacksondeck/helpers.rb +0 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eaba33fcc27c4639f0795e308e59f00e995b3220
|
4
|
+
data.tar.gz: ba4961ed10eac27f86da17fbe529982006fdafff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 06056d91ffa4d8204c12a25ac40de9f95e33719b1ee78fe74b4f6b660aa035e01f72313b8bcbb5e4d30011210896983757368a7270e86913c865b9182b7812e9
|
7
|
+
data.tar.gz: 1a0ac276bd06bfc68599a7a4ccae1aec1d5fdb14c37c0a6631b1a93d3f117ccfafc5348c16c25a3ac8435e8e13572bad70aa87ea1426727f15aac2886d02bee2
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/Rakefile
CHANGED
data/Readme.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
# Stacks
|
1
|
+
# Stacks on Deck 
|
2
2
|
|
3
|
-
|
3
|
+
Stupid simple Chef-Rundeck integration.
|
4
4
|
|
5
5
|
|
6
6
|
## Usage
|
@@ -9,6 +9,32 @@ Helpful stuff for OpenStack.
|
|
9
9
|
Commands:
|
10
10
|
sod art # View the application art
|
11
11
|
sod help [COMMAND] # Describe available commands or one specific command
|
12
|
+
sod server # Start application web server
|
12
13
|
sod version # Echo the application version
|
13
14
|
|
14
|
-
|
15
|
+
You're most likely inteterested in `server`:
|
16
|
+
|
17
|
+
$ sod help server
|
18
|
+
Usage:
|
19
|
+
sod server
|
20
|
+
|
21
|
+
Options:
|
22
|
+
-b, [--bind=BIND] # Set Sinatra interface
|
23
|
+
# Default: 0.0.0.0
|
24
|
+
-p, [--port=N] # Set Sinatra port
|
25
|
+
# Default: 4567
|
26
|
+
-e, [--environment=ENVIRONMENT] # Set Sinatra environment
|
27
|
+
# Default: development
|
28
|
+
-c, [--config=CONFIG] # Location of Chef configuration
|
29
|
+
# Default: /etc/chef/knife.rb
|
30
|
+
-d, [--database=DATABASE] # Location of state database
|
31
|
+
# Default: /etc/sod.db
|
32
|
+
-u, [--username=USERNAME] # Username value for Rundeck node
|
33
|
+
# Default: ${job.username}
|
34
|
+
-r, [--refresh=N] # Refresh interval in seconds
|
35
|
+
# Default: 900
|
36
|
+
-l, [--log=LOG] # Log to file instead of STDOUT
|
37
|
+
-v, [--debug], [--no-debug] # Enable DEBUG-level logging
|
38
|
+
-z, [--trace], [--no-trace] # Enable TRACE-level logging
|
39
|
+
|
40
|
+
Start application web server
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0
|
1
|
+
1.0.0
|
@@ -0,0 +1,141 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'thread'
|
3
|
+
require 'json'
|
4
|
+
require 'yaml'
|
5
|
+
|
6
|
+
require 'ridley'
|
7
|
+
require 'daybreak'
|
8
|
+
require 'sinatra/base'
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
module StacksOnDeck
|
13
|
+
class App < Sinatra::Application
|
14
|
+
|
15
|
+
def self.run!
|
16
|
+
open!
|
17
|
+
at_exit { close! }
|
18
|
+
Thread.new do
|
19
|
+
loop do
|
20
|
+
refresh!
|
21
|
+
sleep settings.refresh
|
22
|
+
end
|
23
|
+
end
|
24
|
+
super
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
get '/' do
|
29
|
+
content_type :yaml
|
30
|
+
@@db_dump
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
|
38
|
+
def self.log ; settings.log end
|
39
|
+
|
40
|
+
def log ; settings.log end
|
41
|
+
|
42
|
+
|
43
|
+
def self.db_copy
|
44
|
+
@@db.lock do
|
45
|
+
@@db.map { |_,v| v }
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
def self.open!
|
51
|
+
reopen!
|
52
|
+
log.debug event: 'open!', db: settings.database
|
53
|
+
@@db_dump = YAML.dump db_copy
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
def self.reopen!
|
58
|
+
old_db = @@db if defined? @@db
|
59
|
+
@@db = Daybreak::DB.new settings.database
|
60
|
+
old_db.close if old_db
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
def self.close!
|
65
|
+
log.debug event: 'close!', db: settings.database
|
66
|
+
@@db.close
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
def self.refresh!
|
71
|
+
log.debug event: 'refresh!', config: settings.config
|
72
|
+
|
73
|
+
started = Time.now
|
74
|
+
|
75
|
+
ridley = Ridley.from_chef_config settings.config
|
76
|
+
|
77
|
+
chef_server_url = ridley.server_url
|
78
|
+
|
79
|
+
nodes = ridley.partial_search :node, 'name:*', %w[
|
80
|
+
name
|
81
|
+
hostname
|
82
|
+
fqdn
|
83
|
+
roles
|
84
|
+
chef_environment
|
85
|
+
tags
|
86
|
+
kernel.machine
|
87
|
+
platform_version
|
88
|
+
platform_family
|
89
|
+
platform
|
90
|
+
]
|
91
|
+
|
92
|
+
node_resources = {}
|
93
|
+
|
94
|
+
nodes.each do |n|
|
95
|
+
name = n.name
|
96
|
+
n = n.automatic
|
97
|
+
username = settings.username
|
98
|
+
remoteUrl = File.join chef_server_url, 'nodes', name
|
99
|
+
editUrl = File.join remoteUrl, 'edit'
|
100
|
+
|
101
|
+
tags = n.tags || []
|
102
|
+
tags += n.roles || []
|
103
|
+
tags << n.chef_environment
|
104
|
+
tags.compact!
|
105
|
+
|
106
|
+
node_resources[name] = {
|
107
|
+
'nodename' => name,
|
108
|
+
'hostname' => n.hostname,
|
109
|
+
'description' => n.fqdn,
|
110
|
+
'osArch' => n.kernel.machine,
|
111
|
+
'osVersion' => n.platform_version,
|
112
|
+
'osFamily' => n.platform_family,
|
113
|
+
'osName' => n.platform,
|
114
|
+
'username' => username,
|
115
|
+
'remoteUrl' => remoteUrl,
|
116
|
+
'editUrl' => editUrl,
|
117
|
+
'tags' => tags
|
118
|
+
}
|
119
|
+
end
|
120
|
+
|
121
|
+
@@db.lock do
|
122
|
+
@@db.clear
|
123
|
+
@@db.update! node_resources
|
124
|
+
end
|
125
|
+
|
126
|
+
reopen!
|
127
|
+
|
128
|
+
@@db_dump = YAML.dump node_resources.values
|
129
|
+
|
130
|
+
log.debug event: 'refreshed!', elapsed: (Time.now - started)
|
131
|
+
|
132
|
+
return node_resources
|
133
|
+
|
134
|
+
|
135
|
+
rescue Celluloid::Task::TerminatedError
|
136
|
+
# nop
|
137
|
+
end
|
138
|
+
|
139
|
+
|
140
|
+
end
|
141
|
+
end
|
data/lib/stacksondeck/main.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
1
|
+
require 'logger'
|
2
|
+
require 'rack'
|
3
3
|
|
4
|
-
require_relative '
|
4
|
+
require_relative 'app'
|
5
|
+
require_relative 'mjolnir'
|
5
6
|
require_relative 'metadata'
|
6
7
|
|
7
8
|
|
8
9
|
module StacksOnDeck
|
9
10
|
|
10
11
|
# StacksOnDeck's entrypoint.
|
11
|
-
class Main <
|
12
|
-
include StacksOnDeck::Helpers
|
12
|
+
class Main < Mjolnir
|
13
13
|
|
14
14
|
|
15
15
|
desc 'version', 'Echo the application version'
|
@@ -23,5 +23,72 @@ module StacksOnDeck
|
|
23
23
|
puts "\n%s\n" % ART
|
24
24
|
end
|
25
25
|
|
26
|
+
|
27
|
+
desc 'server', 'Start application web server'
|
28
|
+
option :bind, \
|
29
|
+
type: :string,
|
30
|
+
aliases: %w[ -b ],
|
31
|
+
desc: 'Set Sinatra interface',
|
32
|
+
default: '0.0.0.0'
|
33
|
+
option :port, \
|
34
|
+
type: :numeric,
|
35
|
+
aliases: %w[ -p ],
|
36
|
+
desc: 'Set Sinatra port',
|
37
|
+
default: 4567
|
38
|
+
option :environment, \
|
39
|
+
type: :string,
|
40
|
+
aliases: %w[ -e ],
|
41
|
+
desc: 'Set Sinatra environment',
|
42
|
+
default: 'development'
|
43
|
+
option :config, \
|
44
|
+
type: :string,
|
45
|
+
aliases: %w[ -c ],
|
46
|
+
desc: 'Location of Chef configuration',
|
47
|
+
default: '/etc/chef/knife.rb'
|
48
|
+
option :database, \
|
49
|
+
type: :string,
|
50
|
+
aliases: %w[ -d ],
|
51
|
+
desc: 'Location of state database',
|
52
|
+
default: '/etc/sod.db'
|
53
|
+
option :username, \
|
54
|
+
type: :string,
|
55
|
+
aliases: %w[ -u ],
|
56
|
+
desc: 'Username value for Rundeck node',
|
57
|
+
default: '${job.username}'
|
58
|
+
option :refresh, \
|
59
|
+
type: :numeric,
|
60
|
+
aliases: %w[ -r ],
|
61
|
+
desc: 'Refresh interval in seconds',
|
62
|
+
default: 900
|
63
|
+
include_common_options
|
64
|
+
def server
|
65
|
+
App.set :log, log
|
66
|
+
App.set :bind, options.bind
|
67
|
+
App.set :port, options.port
|
68
|
+
App.set :config, options.config
|
69
|
+
App.set :refresh, options.refresh
|
70
|
+
App.set :database, options.database
|
71
|
+
App.set :username, options.username
|
72
|
+
App.set :environment, options.environment
|
73
|
+
|
74
|
+
if options.debug?
|
75
|
+
App.set :raise_errors, true
|
76
|
+
App.set :dump_errors, true
|
77
|
+
App.set :show_exceptions, true
|
78
|
+
App.set :logging, ::Logger::DEBUG
|
79
|
+
end
|
80
|
+
|
81
|
+
Celluloid.logger = nil
|
82
|
+
Thread.abort_on_exception = false
|
83
|
+
|
84
|
+
if options.trace?
|
85
|
+
Celluloid.logger = log
|
86
|
+
Thread.abort_on_exception = true
|
87
|
+
end
|
88
|
+
|
89
|
+
log.debug event: 'server starting', options: options
|
90
|
+
App.run!
|
91
|
+
end
|
92
|
+
|
26
93
|
end
|
27
94
|
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'slog'
|
2
|
+
require 'thor'
|
3
|
+
|
4
|
+
|
5
|
+
module StacksOnDeck
|
6
|
+
|
7
|
+
# Thor's hammer! Like Thor with better logging
|
8
|
+
class Mjolnir < Thor
|
9
|
+
|
10
|
+
# Common options for Thor commands
|
11
|
+
COMMON_OPTIONS = {
|
12
|
+
log: {
|
13
|
+
type: :string,
|
14
|
+
aliases: %w[ -l ],
|
15
|
+
desc: 'Log to file instead of STDOUT',
|
16
|
+
default: ENV['SOD_LOG'] || nil
|
17
|
+
},
|
18
|
+
debug: {
|
19
|
+
type: :boolean,
|
20
|
+
aliases: %w[ -v ],
|
21
|
+
desc: 'Enable DEBUG-level logging',
|
22
|
+
default: ENV['SOD_DEBUG'] || false
|
23
|
+
},
|
24
|
+
trace: {
|
25
|
+
type: :boolean,
|
26
|
+
aliases: %w[ -z ],
|
27
|
+
desc: 'Enable TRACE-level logging',
|
28
|
+
default: ENV['SOD_TRACE'] || false
|
29
|
+
}
|
30
|
+
}
|
31
|
+
|
32
|
+
# Decorate Thor commands with the options above
|
33
|
+
def self.include_common_options
|
34
|
+
COMMON_OPTIONS.each do |name, spec|
|
35
|
+
option name, spec
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
no_commands do
|
41
|
+
|
42
|
+
# Return a connection to the given OpenStack service
|
43
|
+
def os service
|
44
|
+
@os ||= {}
|
45
|
+
return @os[service] if @os.has_key? service
|
46
|
+
@os[service] = OpenStack::Connection.create \
|
47
|
+
auth_url: options.auth_url,
|
48
|
+
auth_method: options.auth_method,
|
49
|
+
authtenant_id: options.auth_tenant,
|
50
|
+
username: options.auth_user,
|
51
|
+
api_key: options.auth_pass,
|
52
|
+
service_type: service
|
53
|
+
log.trace \
|
54
|
+
event: 'OpenStack connection',
|
55
|
+
service: service
|
56
|
+
return @os[service]
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
# Construct a Logger given the command-line options
|
61
|
+
def log
|
62
|
+
return @logger if defined? @logger
|
63
|
+
level = :info
|
64
|
+
level = :debug if options.debug?
|
65
|
+
level = :trace if options.trace?
|
66
|
+
device = options.log || $stderr
|
67
|
+
pretty = device.tty? rescue false
|
68
|
+
@logger = Slog.new \
|
69
|
+
out: device,
|
70
|
+
level: level,
|
71
|
+
colorize: pretty,
|
72
|
+
prettify: pretty
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
data/stacksondeck.gemspec
CHANGED
@@ -15,6 +15,10 @@ Gem::Specification.new do |s|
|
|
15
15
|
|
16
16
|
s.add_runtime_dependency 'thor', '~> 0'
|
17
17
|
s.add_runtime_dependency 'slog', '~> 1'
|
18
|
+
s.add_runtime_dependency 'hashie', '~> 2'
|
19
|
+
s.add_runtime_dependency 'sinatra', '~> 1.4'
|
20
|
+
s.add_runtime_dependency 'daybreak', '~> 0.3'
|
21
|
+
s.add_runtime_dependency 'ridley', '~> 4.1'
|
18
22
|
|
19
23
|
s.files = `git ls-files`.split("\n")
|
20
24
|
s.test_files = `git ls-files -- test/*`.split("\n")
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stacksondeck
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sean Clemmer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-03-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -38,7 +38,63 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1'
|
41
|
-
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: hashie
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: sinatra
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.4'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.4'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: daybreak
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0.3'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0.3'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: ridley
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '4.1'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '4.1'
|
97
|
+
description: Stupid simple Chef-Rundeck integration.
|
42
98
|
email: sczizzo@gmail.com
|
43
99
|
executables:
|
44
100
|
- sod
|
@@ -53,9 +109,10 @@ files:
|
|
53
109
|
- VERSION
|
54
110
|
- bin/sod
|
55
111
|
- lib/stacksondeck.rb
|
56
|
-
- lib/stacksondeck/
|
112
|
+
- lib/stacksondeck/app.rb
|
57
113
|
- lib/stacksondeck/main.rb
|
58
114
|
- lib/stacksondeck/metadata.rb
|
115
|
+
- lib/stacksondeck/mjolnir.rb
|
59
116
|
- stacksondeck.gemspec
|
60
117
|
- test/test_stacksondeck.rb
|
61
118
|
homepage: https://github.com/sczizzo/stacksondeck
|
@@ -81,6 +138,6 @@ rubyforge_project:
|
|
81
138
|
rubygems_version: 2.2.2
|
82
139
|
signing_key:
|
83
140
|
specification_version: 4
|
84
|
-
summary:
|
141
|
+
summary: Stupid simple Chef-Rundeck integration
|
85
142
|
test_files:
|
86
143
|
- test/test_stacksondeck.rb
|
data/lib/stacksondeck/helpers.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
require 'thor/util'
|
2
|
-
require 'thor/actions'
|
3
|
-
|
4
|
-
|
5
|
-
module StacksOnDeck
|
6
|
-
|
7
|
-
# Mixins for StacksOnDeck's Thor subclasses.
|
8
|
-
module Helpers
|
9
|
-
|
10
|
-
# Save the canonical implementation of "puts"
|
11
|
-
alias_method :old_puts, :puts
|
12
|
-
|
13
|
-
# Monkeypatch puts to support Thor::Shell::Color.
|
14
|
-
def puts *args
|
15
|
-
return old_puts if args.empty?
|
16
|
-
old_puts shell.set_color(*args)
|
17
|
-
end
|
18
|
-
|
19
|
-
|
20
|
-
# Shortcut for Thor::Util.
|
21
|
-
def util ; Thor::Util end
|
22
|
-
|
23
|
-
|
24
|
-
# Shortcut for Thor::Actions.
|
25
|
-
def actions ; Thor::Actions end
|
26
|
-
|
27
|
-
end
|
28
|
-
end
|