config_kit 0.0.11
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 +35 -0
- data/Gemfile +11 -0
- data/Gemfile.lock +62 -0
- data/README.md +146 -0
- data/bin/ck +11 -0
- data/cluster/consul.yml +64 -0
- data/config/README.md +134 -0
- data/config/int0/int0.axle.yml +48 -0
- data/config/int0/int0.infra.yml +31 -0
- data/config/stg0/stg0.axle.yml +48 -0
- data/config/stg0/stg0.infra.yml +31 -0
- data/config_kit.gemspec +35 -0
- data/lib/config_kit.rb +20 -0
- data/lib/config_kit/cli/command.rb +77 -0
- data/lib/config_kit/cli/commands/bootstrap.rb +65 -0
- data/lib/config_kit/cli/commands/deploy.rb +48 -0
- data/lib/config_kit/cli/commands/describe.rb +41 -0
- data/lib/config_kit/cli/commands/get.rb +37 -0
- data/lib/config_kit/cli/commands/init.rb +42 -0
- data/lib/config_kit/cli/commands/rollback.rb +40 -0
- data/lib/config_kit/client.rb +203 -0
- data/lib/config_kit/config_data.rb +92 -0
- data/lib/config_kit/configuration.rb +16 -0
- data/lib/config_kit/data/loader.rb +91 -0
- data/lib/config_kit/data/loaders/file_loader.rb +68 -0
- data/lib/config_kit/data/loaders/git_loader.rb +39 -0
- data/lib/config_kit/deploy_data.rb +78 -0
- data/lib/config_kit/error.rb +3 -0
- data/lib/config_kit/ext/hash.rb +6 -0
- data/lib/config_kit/ext/slashed_hash.rb +45 -0
- data/lib/config_kit/idc_data.rb +28 -0
- data/lib/config_kit/manager.rb +104 -0
- data/lib/config_kit/tool.rb +168 -0
- data/lib/config_kit/version.rb +3 -0
- data/scripts/create_config_kit.rb +56 -0
- data/scripts/profile_to_consul.sh +9 -0
- metadata +139 -0
@@ -0,0 +1,48 @@
|
|
1
|
+
api_version: 'v1.0'
|
2
|
+
kind: 'config_kit'
|
3
|
+
axle:
|
4
|
+
version: '1.0'
|
5
|
+
namespace: 'int0'
|
6
|
+
database:
|
7
|
+
adapter: 'mysql2'
|
8
|
+
host: 'localhost'
|
9
|
+
port: 3306
|
10
|
+
username: 'laxino'
|
11
|
+
password: 'password'
|
12
|
+
database: 'g2_axle_production'
|
13
|
+
|
14
|
+
jackpot:
|
15
|
+
win_alert:
|
16
|
+
mail_recipient: 'lm.cs@laxino.com'
|
17
|
+
mail_context:
|
18
|
+
serverity: 2
|
19
|
+
guide: 'http://faq'
|
20
|
+
submit_status:
|
21
|
+
exception_mail_recipient: 'lm.cs@laxino.com'
|
22
|
+
third_party:
|
23
|
+
1003:
|
24
|
+
path: 'http://games.83suncity.local'
|
25
|
+
secret_access_key: 'akjlasdfasdfalas;sdkfajs'
|
26
|
+
stats_postfix: 'jackpotstats'
|
27
|
+
post_with_content_md5: true
|
28
|
+
snapshot_report:
|
29
|
+
mail_recipient: 'lm.cs@laxino.com'
|
30
|
+
|
31
|
+
game:
|
32
|
+
allow_test_mode: false
|
33
|
+
big_win_alert:
|
34
|
+
property_ids: '20000'
|
35
|
+
mail_context:
|
36
|
+
serverity: 2
|
37
|
+
guide: 'http://faq'
|
38
|
+
stuck_fund:
|
39
|
+
mail_recipient: 'lm.cs@laxino.com'
|
40
|
+
alert_leave_game_failures:
|
41
|
+
mail_recipient: 'lm.cs@laxino.com'
|
42
|
+
|
43
|
+
service:
|
44
|
+
self_schedule_host: 'axle.com'
|
45
|
+
|
46
|
+
alert:
|
47
|
+
mail_sender: 'info@laxino.com'
|
48
|
+
mail_receiver: 'axle_admin@laxino.com'
|
@@ -0,0 +1,31 @@
|
|
1
|
+
api_version: 'v1.0'
|
2
|
+
kind: 'config_kit'
|
3
|
+
infra:
|
4
|
+
version: '1.0'
|
5
|
+
namespace: 'int0'
|
6
|
+
service:
|
7
|
+
ams:
|
8
|
+
host: 'ams.hg-int-app01.local'
|
9
|
+
url: 'http://ams.hg-int-app01.local'
|
10
|
+
rap:
|
11
|
+
host: 'rap.hg-int-app01.local'
|
12
|
+
url: 'http://rap.hg-int-app01.local'
|
13
|
+
fams:
|
14
|
+
host: 'fams.hg-int-app01.local'
|
15
|
+
url: 'http://fams.hg-int-app01.local'
|
16
|
+
axle:
|
17
|
+
host: 'axle.hg-int-app01.local'
|
18
|
+
url: 'http://axle.hg-int-app01.local'
|
19
|
+
anms:
|
20
|
+
host: 'anms.hg-int-app01.local'
|
21
|
+
url: 'http://anms.hg-int-app01.local'
|
22
|
+
js:
|
23
|
+
host: 'job_scheduler.com'
|
24
|
+
url: 'http://job_scheduler.com'
|
25
|
+
mail_server:
|
26
|
+
host: 'moexc01.mo.laxino.com'
|
27
|
+
broker:
|
28
|
+
host: 'hq-int-femb-app01.laxino.local'
|
29
|
+
port: 61614
|
30
|
+
username: 'laxino_service'
|
31
|
+
password: 'laxino_service'
|
@@ -0,0 +1,48 @@
|
|
1
|
+
api_version: 'v1.0'
|
2
|
+
kind: 'config_kit'
|
3
|
+
axle:
|
4
|
+
version: '1.0'
|
5
|
+
namespace: 'stg0'
|
6
|
+
database:
|
7
|
+
adapter: 'mysql2'
|
8
|
+
host: 'localhost'
|
9
|
+
port: 3306
|
10
|
+
username: 'laxino'
|
11
|
+
password: 'password'
|
12
|
+
database: 'g2_axle_production'
|
13
|
+
|
14
|
+
jackpot:
|
15
|
+
win_alert:
|
16
|
+
mail_recipient: 'lm.cs@laxino.com'
|
17
|
+
mail_context:
|
18
|
+
serverity: 2
|
19
|
+
guide: 'http://faq'
|
20
|
+
submit_status:
|
21
|
+
exception_mail_recipient: 'lm.cs@laxino.com'
|
22
|
+
third_party:
|
23
|
+
1003:
|
24
|
+
path: 'http://games.83suncity.local'
|
25
|
+
secret_access_key: akjlasdfasdfalas;sdkfajs
|
26
|
+
stats_postfix: 'jackpotstats'
|
27
|
+
post_with_content_md5: true
|
28
|
+
snapshot_report:
|
29
|
+
mail_recipient: 'lm.cs@laxino.com'
|
30
|
+
|
31
|
+
game:
|
32
|
+
allow_test_mode: false
|
33
|
+
big_win_alert:
|
34
|
+
property_ids: '20000'
|
35
|
+
mail_context:
|
36
|
+
serverity: 2
|
37
|
+
guide: 'http://faq'
|
38
|
+
stuck_fund:
|
39
|
+
mail_recipient: 'lm.cs@laxino.com'
|
40
|
+
alert_leave_game_failures:
|
41
|
+
mail_recipient: 'lm.cs@laxino.com'
|
42
|
+
|
43
|
+
service:
|
44
|
+
self_schedule_host: 'axle.com'
|
45
|
+
|
46
|
+
alert:
|
47
|
+
mail_sender: 'info@laxino.com'
|
48
|
+
mail_receiver: 'axle_admin@laxino.com'
|
@@ -0,0 +1,31 @@
|
|
1
|
+
api_version: 'v1.0'
|
2
|
+
kind: 'config_kit'
|
3
|
+
infra:
|
4
|
+
version: '1.0'
|
5
|
+
namespace: 'stg0'
|
6
|
+
service:
|
7
|
+
ams:
|
8
|
+
host: 'ams.hg-int-app01.local'
|
9
|
+
url: 'http://ams.hg-int-app01.local'
|
10
|
+
rap:
|
11
|
+
host: 'rap.hg-int-app01.local'
|
12
|
+
url: 'http://rap.hg-int-app01.local'
|
13
|
+
fams:
|
14
|
+
host: 'fams.hg-int-app01.local'
|
15
|
+
url: 'http://fams.hg-int-app01.local'
|
16
|
+
axle:
|
17
|
+
host: 'axle.hg-int-app01.local'
|
18
|
+
url: 'http://axle.hg-int-app01.local'
|
19
|
+
anms:
|
20
|
+
host: 'anms.hg-int-app01.local'
|
21
|
+
url: 'http://anms.hg-int-app01.local'
|
22
|
+
js:
|
23
|
+
host: 'job_scheduler.com'
|
24
|
+
url: 'http://job_scheduler.com'
|
25
|
+
mail_server:
|
26
|
+
host: 'moexc01.mo.laxino.com'
|
27
|
+
broker:
|
28
|
+
host: 'hq-int-femb-app01.laxino.local'
|
29
|
+
port: 61614
|
30
|
+
username: 'laxino_service'
|
31
|
+
password: 'laxino_service'
|
data/config_kit.gemspec
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'config_kit/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "config_kit"
|
8
|
+
spec.version = ConfigKit::VERSION
|
9
|
+
spec.authors = ["Ben Wu"]
|
10
|
+
spec.email = ["ben.wu@laxino.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{Write a short summary, because Rubygems requires one.}
|
13
|
+
spec.description = %q{Write a longer description or delete this line.}
|
14
|
+
spec.homepage = "http://github.com/cheokman"
|
15
|
+
spec.licenses = ['MIT', 'Ruby']
|
16
|
+
|
17
|
+
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
18
|
+
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
19
|
+
if spec.respond_to?(:metadata)
|
20
|
+
spec.metadata['allowed_push_host'] = "https://rubygems.org"
|
21
|
+
else
|
22
|
+
raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
|
23
|
+
end
|
24
|
+
|
25
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
26
|
+
spec.bindir = "bin"
|
27
|
+
spec.executables = ['ck']
|
28
|
+
spec.require_paths = ["lib"]
|
29
|
+
|
30
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
31
|
+
|
32
|
+
spec.add_dependency "bundler", "~> 1.12"
|
33
|
+
spec.add_dependency "diplomat", "1.4.1"
|
34
|
+
spec.add_dependency "git", "1.3.0"
|
35
|
+
end
|
data/lib/config_kit.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'config_kit/error'
|
2
|
+
require 'config_kit/configuration'
|
3
|
+
require 'config_kit/client'
|
4
|
+
require 'config_kit/config_data'
|
5
|
+
require 'config_kit/deploy_data'
|
6
|
+
require 'config_kit/manager'
|
7
|
+
|
8
|
+
module ConfigKit
|
9
|
+
def self.config
|
10
|
+
@config ||= Configuration.new(ENV.fetch('CK_URL','http://localhost:8500'), debug: ENV.fetch('DEBUG', false))
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.logger
|
14
|
+
self.config.logger
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.logger=(log)
|
18
|
+
self.config.logger = log
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'config_kit'
|
3
|
+
require 'pp'
|
4
|
+
require 'config_kit/data/loader'
|
5
|
+
|
6
|
+
# Run the command given by the first argument. Right
|
7
|
+
# now all we have is deployments. We hope to have other
|
8
|
+
# kinds of events here later.
|
9
|
+
$LOAD_PATH << "#{File.dirname(__FILE__)}/.."
|
10
|
+
|
11
|
+
module ConfigKit
|
12
|
+
module Cli
|
13
|
+
class Command
|
14
|
+
attr_reader :leftover
|
15
|
+
class CommandFailure < StandardError
|
16
|
+
attr_reader :options
|
17
|
+
def initialize message, opt_parser=nil
|
18
|
+
super message
|
19
|
+
@options = opt_parser
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def initialize(args)
|
24
|
+
if Hash === args
|
25
|
+
args.each do |k, v|
|
26
|
+
instance_variable_set "@#{k}", v.to_s if v
|
27
|
+
end
|
28
|
+
else
|
29
|
+
|
30
|
+
@options = options do |opts|
|
31
|
+
opts.on("-h", "Show this help") { raise CommandFailure, opts.to_s }
|
32
|
+
end
|
33
|
+
raise CommandFailure, @options.to_s if args.empty?
|
34
|
+
@leftover = @options.parse(args)
|
35
|
+
end
|
36
|
+
rescue OptionParser::ParseError => e
|
37
|
+
raise CommandFailure.new(e.message, @options)
|
38
|
+
end
|
39
|
+
|
40
|
+
@commands = []
|
41
|
+
def self.inherited(subclass)
|
42
|
+
@commands << subclass
|
43
|
+
end
|
44
|
+
|
45
|
+
cmds = cmds = File.expand_path(File.join(File.dirname(__FILE__), 'commands', '*.rb'))
|
46
|
+
Dir[cmds].each { |command| require command }
|
47
|
+
|
48
|
+
def self.run
|
49
|
+
@command_names = @commands.map{ |c| c.command}
|
50
|
+
|
51
|
+
extra = []
|
52
|
+
|
53
|
+
options = ARGV.options do |opts|
|
54
|
+
script_name = File.basename($0)
|
55
|
+
opts.banner = "Usage: #{script_name} [ #{ @command_names.join(" | ")} ] [options]"
|
56
|
+
opts.separator "use '#{script_name} <command> -h' to see detailed command options"
|
57
|
+
opts
|
58
|
+
end
|
59
|
+
extra = options.order!
|
60
|
+
command = extra.shift
|
61
|
+
|
62
|
+
if command.nil?
|
63
|
+
ConfigKit.logger.error "No command provided"
|
64
|
+
STDOUT.puts options.to_s
|
65
|
+
elsif !@command_names.include?(command)
|
66
|
+
ConfigKit.logger.error "Unrecognized command: #{command}"
|
67
|
+
ConfigKit.logger.error options
|
68
|
+
else
|
69
|
+
command_class = @commands.find{ |c| c.command == command}
|
70
|
+
command_class.new(extra).run
|
71
|
+
end
|
72
|
+
rescue OptionParser::InvalidOption => e
|
73
|
+
raise CommandFailure.new(e.message)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'uri'
|
2
|
+
module ConfigKit::Cli
|
3
|
+
class Bootstrap < Command
|
4
|
+
def self.uri_parser(uri)
|
5
|
+
URI.parse(uri)
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.command; "bootstrap"; end
|
9
|
+
|
10
|
+
def initialize(args)
|
11
|
+
@uri_string = 'file:///./config'
|
12
|
+
@app = 'all'
|
13
|
+
super(args)
|
14
|
+
@uri_kls = self.class.uri_parser(@uri_string)
|
15
|
+
check_args
|
16
|
+
end
|
17
|
+
|
18
|
+
def check_args
|
19
|
+
raise ConfigKit::Cli::Command::CommandFailure.new "Wrong bootstrap source from #{@from}, pls use file or git" unless ['git', 'file'].include?(@from)
|
20
|
+
raise ConfigKit::Cli::Command::CommandFailure.new "Missmatch source from #{@from} and uri #{@uri_string}" if @from == 'file' && @uri_kls.scheme != 'file'
|
21
|
+
raise ConfigKit::Cli::Command::CommandFailure.new "Missmatch source from #{@from} and uri #{@uri_string}" if @from == 'git' && !['git', 'http', 'ssh'].include?(@uri_kls.scheme)
|
22
|
+
raise ConfigKit::Cli::Command::CommandFailure.new "Missmatch tag from #{@from} and uri #{@uri_string}" if @from == 'git' && @tag.nil?
|
23
|
+
end
|
24
|
+
|
25
|
+
def run
|
26
|
+
begin
|
27
|
+
@output = ConfigKit::Manager.bootstrap(@app, @from, @uri_kls, @tag, {})
|
28
|
+
pp @output.to_h.to_json
|
29
|
+
rescue => e
|
30
|
+
ConfigKit.logger.error "Unexpected error attempting to get config data #{@uri_string} in for #{@app.nil? ? 'all' : @app}"
|
31
|
+
ConfigKit.logger.debug "#{e}: #{e.backtrace.join("\n ")}"
|
32
|
+
raise ConfigKit::Cli::Command::CommandFailure.new(e.to_s)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
|
39
|
+
def options
|
40
|
+
OptionParser.new %Q{Usage: #{$0} #{self.class.command} [OPTIONS] ["description"] }, 40 do |opts|
|
41
|
+
opts.separator ''
|
42
|
+
opts.separator 'Specific options:'
|
43
|
+
|
44
|
+
opts.on('-g URI', '--from-git', 'Specify read config from git') do |uri_string|
|
45
|
+
@from = 'git'
|
46
|
+
@uri_string = uri_string
|
47
|
+
end
|
48
|
+
|
49
|
+
opts.on('-f URI', '--from-file', 'Specify read config from file') do |uri_string|
|
50
|
+
@from = 'file'
|
51
|
+
@uri_string = uri_string
|
52
|
+
end
|
53
|
+
|
54
|
+
opts.on('-a APP', '--app', 'Specify an app of config to create') do |app|
|
55
|
+
@app = app
|
56
|
+
end
|
57
|
+
|
58
|
+
opts.on('-t TAG', '--tag', 'Specify version tag to boostrap(if using git repository for version control)') do |tag|
|
59
|
+
@tag = tag
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module ConfigKit::Cli
|
2
|
+
class Deploy < Command
|
3
|
+
def self.command; "deploy"; end
|
4
|
+
|
5
|
+
def initialize(args)
|
6
|
+
@app = nil
|
7
|
+
@version = nil
|
8
|
+
super(args)
|
9
|
+
check_args
|
10
|
+
end
|
11
|
+
|
12
|
+
def check_args
|
13
|
+
raise ConfigKit::Cli::Command::CommandFailure.new "Missing app parameters" if @app.nil?
|
14
|
+
raise ConfigKit::Cli::Command::CommandFailure.new "Missing version parameters" if @version.nil?
|
15
|
+
end
|
16
|
+
|
17
|
+
def run
|
18
|
+
begin
|
19
|
+
ConfigKit.logger.debug "Run command #{self.class.command} with options #{@app}:#{@version}"
|
20
|
+
@output = ConfigKit::Manager.deploy(@app, @version)
|
21
|
+
pp @output.to_h.to_json
|
22
|
+
rescue ConfigKit::Cli::Command::CommandFailure
|
23
|
+
raise
|
24
|
+
rescue => e
|
25
|
+
ConfigKit.logger.error "Unexpected error attempting to get config data #{@uri} in env #{@env} for #{@app.nil? ? 'all' : @app}"
|
26
|
+
ConfigKit.logger.debug "#{e}: #{e.backtrace.join("\n ")}"
|
27
|
+
raise ConfigKit::Cli::Command::CommandFailure.new(e.to_s)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
def options
|
33
|
+
OptionParser.new %Q{Usage: #{$0} #{self.class.command} [OPTIONS] ["description"] }, 40 do |opts|
|
34
|
+
opts.separator ''
|
35
|
+
opts.separator 'Specific options:'
|
36
|
+
|
37
|
+
opts.on('-a APP', '--app', 'Specify an app of config to create(default: nil to deploy all apps)') do |app|
|
38
|
+
@app = app
|
39
|
+
end
|
40
|
+
|
41
|
+
opts.on('-v VERSION', '--version', 'Specify a version of application to describe') do |version|
|
42
|
+
@version = version[0] == 'v' ? version : "v#{version}"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module ConfigKit::Cli
|
2
|
+
class Describe < Command
|
3
|
+
def self.command; "describe"; end
|
4
|
+
|
5
|
+
def initialize(args)
|
6
|
+
@app = 'idc'
|
7
|
+
@output = nil
|
8
|
+
args << ['-a', @app] unless args.include?('-a')
|
9
|
+
super(args)
|
10
|
+
end
|
11
|
+
|
12
|
+
def run
|
13
|
+
begin
|
14
|
+
@output = ConfigKit::Manager.describe(@app, @version)
|
15
|
+
pp @output
|
16
|
+
rescue ConfigKit::Cli::Command::CommandFailure
|
17
|
+
raise
|
18
|
+
rescue => e
|
19
|
+
ConfigKit.logger.error "Unexpected error attempting to get config data #{@uri} in env #{@env} for #{@app.nil? ? 'all' : @app}"
|
20
|
+
ConfigKit.logger.debug "#{e}: #{e.backtrace.join("\n ")}"
|
21
|
+
raise ConfigKit::Cli::Command::CommandFailure.new(e.to_s)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
def options
|
27
|
+
OptionParser.new %Q{Usage: #{$0} #{self.class.command} [OPTIONS] ["description"] }, 40 do |opts|
|
28
|
+
opts.separator ''
|
29
|
+
opts.separator 'Specific options:'
|
30
|
+
|
31
|
+
opts.on('-a APP', '--app', 'Specify an application to describe') do |app|
|
32
|
+
@app = app
|
33
|
+
end
|
34
|
+
|
35
|
+
opts.on('-v VERSION', '--version', 'Specify an verion of application to describe') do |version|
|
36
|
+
@version = version
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|