config_kit 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- 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
|