shards 0.1.0 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.ruby-version +1 -0
- data/Gemfile.lock +98 -0
- data/README.md +34 -3
- data/exe/shards +5 -0
- data/lib/settings/format_methods.yaml +151 -0
- data/lib/settings/workflow.yaml +171 -0
- data/lib/shards.rb +12 -3
- data/lib/shards/base.rb +25 -0
- data/lib/shards/base_yaml_object.rb +34 -0
- data/lib/shards/client.rb +118 -0
- data/lib/shards/config.rb +54 -0
- data/lib/shards/db.rb +92 -0
- data/lib/shards/dns.rb +56 -0
- data/lib/shards/location.rb +29 -0
- data/lib/shards/meta/list.rb +15 -0
- data/lib/shards/meta/meta.rb +57 -0
- data/lib/shards/repo.rb +45 -0
- data/lib/shards/shard.rb +64 -0
- data/lib/shards/site.rb +31 -0
- data/lib/shards/stage.rb +64 -0
- data/lib/shards/version.rb +1 -1
- data/lib/shards/workflow/base.rb +177 -0
- data/lib/shards/workflow/fast_terminal.rb +58 -0
- data/lib/shards/workflow/terminal.rb +56 -0
- data/lib/shards/workflow/workflow.rb +11 -0
- data/shards.gemspec +9 -0
- data/test.env +24 -0
- metadata +153 -3
data/lib/shards.rb
CHANGED
data/lib/shards/base.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require "shards/meta/meta"
|
2
|
+
|
3
|
+
module Shards
|
4
|
+
|
5
|
+
class Base
|
6
|
+
|
7
|
+
include Shards::Meta
|
8
|
+
|
9
|
+
class << self
|
10
|
+
|
11
|
+
def method_list class_name
|
12
|
+
|
13
|
+
l=Shards::Meta::List.new
|
14
|
+
l.names class_name
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
def set_config
|
20
|
+
@config=get_config self.class.name
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "shards/base"
|
2
|
+
|
3
|
+
module Shards
|
4
|
+
|
5
|
+
class BaseYamlObject < Shards::Base
|
6
|
+
|
7
|
+
attr_reader :stage, :yaml
|
8
|
+
|
9
|
+
def initialize stage
|
10
|
+
set_config
|
11
|
+
@stage=stage
|
12
|
+
@yaml= YAML.load_file file
|
13
|
+
@output=[]
|
14
|
+
end
|
15
|
+
|
16
|
+
def dir
|
17
|
+
stage.get 'config_dir'
|
18
|
+
end
|
19
|
+
|
20
|
+
def file
|
21
|
+
file_path ENV['BASE_CONFIG_FILE']
|
22
|
+
end
|
23
|
+
|
24
|
+
def file_path file_name
|
25
|
+
File.join(ENV['ENGINEERING_ROOT_PATH'],ENV['CONFIG_FILES_ROOT_PATH'], dir ,file_name)
|
26
|
+
end
|
27
|
+
|
28
|
+
def write_yaml
|
29
|
+
File.write file, YAML.dump(yaml)
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require 'shards/workflow/workflow'
|
2
|
+
require 'thor'
|
3
|
+
require 'terminal-table'
|
4
|
+
|
5
|
+
module Shards
|
6
|
+
|
7
|
+
class Client < Thor
|
8
|
+
|
9
|
+
desc 'create LOCATION STAGE CLIENT DOMAIN', 'Fast creation interactive shards creation tool'
|
10
|
+
|
11
|
+
def create location, stage, client, domain
|
12
|
+
|
13
|
+
fast_terminal=Shards::Workflow::FastTerminal.new config
|
14
|
+
fast_terminal.params= { client: client, domain: domain, location: location, stage: stage }
|
15
|
+
fast_terminal.start
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
desc 'terminal', 'Run interactive shards creation tool in the terminal'
|
20
|
+
|
21
|
+
def terminal
|
22
|
+
t=Shards::Workflow::Terminal.new config
|
23
|
+
t.start
|
24
|
+
end
|
25
|
+
|
26
|
+
desc 'locations', 'Locations list'
|
27
|
+
|
28
|
+
def locations
|
29
|
+
|
30
|
+
rows=config.locations.each_pair.map do |k, v|
|
31
|
+
[k , v.stages.keys.join(' ') ]
|
32
|
+
end
|
33
|
+
|
34
|
+
columns %w(Locations Stages), rows
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
desc "list LOCATION STAGE", "Shard list by LOCATION and STAGE"
|
40
|
+
|
41
|
+
def list(location, stage)
|
42
|
+
|
43
|
+
s = get_stage location, stage
|
44
|
+
|
45
|
+
rows=s.shard.list.each_pair.map do |k,v|
|
46
|
+
[ k, v['database'], v['host'] ]
|
47
|
+
end
|
48
|
+
|
49
|
+
columns %w(Shard Database Host), rows
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
desc "databases LOCATION STAGE", "List databases in server by LOCATION and STAGE"
|
54
|
+
|
55
|
+
def databases(location, stage)
|
56
|
+
|
57
|
+
s = get_stage location, stage
|
58
|
+
s.shard.add_domain 'fakedomain'
|
59
|
+
db=s.shard.db
|
60
|
+
db.show
|
61
|
+
|
62
|
+
rows=db.databases_on_server.map do |v|
|
63
|
+
[ v ]
|
64
|
+
end
|
65
|
+
|
66
|
+
columns %w(Database), rows
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
desc "dns LOCATION STAGE DOMAIN", "Check if dns record is available for a domain"
|
72
|
+
|
73
|
+
def dns(location, stage, domain)
|
74
|
+
|
75
|
+
s = get_stage location, stage
|
76
|
+
s.shard.add_domain domain
|
77
|
+
dns=s.shard.dns
|
78
|
+
|
79
|
+
puts "Host: #{dns.host} , exists: #{dns.exist?}"
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
desc "sites LOCATION STAGE", "Site list by LOCATION and STAGE"
|
85
|
+
|
86
|
+
def sites(location, stage)
|
87
|
+
|
88
|
+
s = get_stage location, stage
|
89
|
+
|
90
|
+
site=Shards::Site.new s
|
91
|
+
|
92
|
+
rows=site.yaml.map do |x|
|
93
|
+
[ x['name'], x['subdomain'], x['shard'] ]
|
94
|
+
end
|
95
|
+
|
96
|
+
columns %w(Name Subdomain Shard), rows
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
private
|
101
|
+
|
102
|
+
def config
|
103
|
+
Shards::Config.new
|
104
|
+
end
|
105
|
+
|
106
|
+
def columns headings, rows
|
107
|
+
table = Terminal::Table.new headings: headings, rows: rows
|
108
|
+
puts table
|
109
|
+
end
|
110
|
+
|
111
|
+
def get_stage location, stage
|
112
|
+
l= config.locations[location]
|
113
|
+
l.stages[stage]
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'dotenv'
|
2
|
+
require 'yaml'
|
3
|
+
require 'shards/location'
|
4
|
+
require 'shards/repo'
|
5
|
+
|
6
|
+
module Shards
|
7
|
+
|
8
|
+
class Config
|
9
|
+
|
10
|
+
ENV_VARS = %w(ENGINEERING_ROOT_PATH CONFIG_FILE PROXY_SUBDOMAIN DOMAIN CONFIG_FILES_ROOT_PATH SHARDS_FILE_NAME SITES_FILE_NAME CONFIG_DIR_SUFFIX DNS_ZONE_CODE)
|
11
|
+
|
12
|
+
attr_accessor :locations, :settings_file, :repo
|
13
|
+
|
14
|
+
def initialize settings_file='settings.env', origin_file=nil
|
15
|
+
|
16
|
+
@settings_file=settings_file
|
17
|
+
|
18
|
+
Dotenv.load(settings_file)
|
19
|
+
|
20
|
+
ENV_VARS.each { |variable| validate variable }
|
21
|
+
|
22
|
+
@repo=Shards::Repo.new
|
23
|
+
|
24
|
+
@locations={}
|
25
|
+
|
26
|
+
data=YAML.load_file(origin_file || File.join(repo.root,config_file) )
|
27
|
+
|
28
|
+
add_locations data
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
def add_locations data
|
33
|
+
data['Locations'].each_pair do |name,location_data|
|
34
|
+
@locations[name]=Location.new( name, location_data)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def validate variable
|
41
|
+
raise LoadError.new "#{variable} #{message}" unless ENV.has_key?(variable)
|
42
|
+
end
|
43
|
+
|
44
|
+
def message
|
45
|
+
"not found in #{settings_file}"
|
46
|
+
end
|
47
|
+
|
48
|
+
def config_file
|
49
|
+
ENV['CONFIG_FILE']
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
data/lib/shards/db.rb
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'shards/base'
|
2
|
+
require 'net/ssh'
|
3
|
+
require 'net/scp'
|
4
|
+
|
5
|
+
module Shards
|
6
|
+
|
7
|
+
class Db < Shards::Base
|
8
|
+
|
9
|
+
include Shards::Meta
|
10
|
+
|
11
|
+
method_list('Shards::Db').each do |m|
|
12
|
+
define_method(m.to_sym) { run __method__ }
|
13
|
+
end
|
14
|
+
|
15
|
+
attr_reader :stage, :dns, :databases_on_server
|
16
|
+
|
17
|
+
def initialize stage:, dns:
|
18
|
+
set_config
|
19
|
+
@stage=stage
|
20
|
+
@dns=dns
|
21
|
+
reset_output
|
22
|
+
end
|
23
|
+
|
24
|
+
def write_file
|
25
|
+
add " "
|
26
|
+
open(file, 'w+') { |fsh|
|
27
|
+
fsh.puts output
|
28
|
+
}
|
29
|
+
reset_output
|
30
|
+
end
|
31
|
+
|
32
|
+
def create_script
|
33
|
+
init_script
|
34
|
+
creating_database
|
35
|
+
dumping_database
|
36
|
+
inserting_data
|
37
|
+
write_file
|
38
|
+
end
|
39
|
+
|
40
|
+
def create dryrun: true
|
41
|
+
if dryrun
|
42
|
+
dryrun_message
|
43
|
+
else
|
44
|
+
setting_up_database_message
|
45
|
+
print_output
|
46
|
+
create_script
|
47
|
+
upload!
|
48
|
+
ssh!
|
49
|
+
end
|
50
|
+
print_output
|
51
|
+
end
|
52
|
+
|
53
|
+
def upload!
|
54
|
+
Net::SCP.upload! proxy, proxy_user, file, file
|
55
|
+
end
|
56
|
+
|
57
|
+
def ssh!
|
58
|
+
ssh_conn do |ssh|
|
59
|
+
run_ssh ssh, chmod_file_command, chmod_file_message
|
60
|
+
run_ssh ssh, db_creation_command, db_creation_message
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def run_ssh ssh, command, message
|
65
|
+
puts message
|
66
|
+
ssh.exec! command
|
67
|
+
end
|
68
|
+
|
69
|
+
def show
|
70
|
+
ssh_conn do |ssh|
|
71
|
+
parse_databases_on_server( ssh.exec! show_command )
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def ssh_conn
|
76
|
+
Net::SSH.start(proxy, proxy_user) do |ssh|
|
77
|
+
yield ssh
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def parse_databases_on_server ssh_output
|
82
|
+
@databases_on_server=ssh_output.split("\n").reject { |x| x.include?"Warning" }
|
83
|
+
end
|
84
|
+
|
85
|
+
def exist?
|
86
|
+
show
|
87
|
+
databases_on_server.include? name
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
data/lib/shards/dns.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require "aws-sdk-route53"
|
2
|
+
require 'shards/base'
|
3
|
+
|
4
|
+
module Shards
|
5
|
+
|
6
|
+
class Dns < Shards::Base
|
7
|
+
|
8
|
+
method_list('Shards::Dns').each do |m|
|
9
|
+
define_method(m.to_sym) { run __method__ }
|
10
|
+
end
|
11
|
+
|
12
|
+
attr_reader :stage, :domain
|
13
|
+
attr_accessor :aws_route53_resp, :r53
|
14
|
+
|
15
|
+
def initialize stage:, domain:
|
16
|
+
set_config
|
17
|
+
@stage=stage
|
18
|
+
@domain=domain
|
19
|
+
reset_output
|
20
|
+
@r53 = Aws::Route53::Client.new()
|
21
|
+
end
|
22
|
+
|
23
|
+
def set dryrun: true
|
24
|
+
if dryrun
|
25
|
+
dryrun_message
|
26
|
+
else
|
27
|
+
creating_route53_message
|
28
|
+
print_output
|
29
|
+
set_aws_route53_record
|
30
|
+
end
|
31
|
+
print_output
|
32
|
+
end
|
33
|
+
|
34
|
+
def set_aws_route53_record
|
35
|
+
@aws_route53_resp = r53.change_resource_record_sets r53upsert
|
36
|
+
end
|
37
|
+
|
38
|
+
def exist?
|
39
|
+
!record_list.empty?
|
40
|
+
end
|
41
|
+
|
42
|
+
def record_list
|
43
|
+
record_sets.select { |x| x.name.include? host }
|
44
|
+
end
|
45
|
+
|
46
|
+
def record_sets
|
47
|
+
r53.list_resource_record_sets({
|
48
|
+
hosted_zone_id: zone,
|
49
|
+
start_record_name: host,
|
50
|
+
max_items: 20
|
51
|
+
}).resource_record_sets
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'shards/stage'
|
2
|
+
|
3
|
+
module Shards
|
4
|
+
|
5
|
+
class Location
|
6
|
+
|
7
|
+
attr_accessor :name, :stages
|
8
|
+
|
9
|
+
def initialize location_name, data
|
10
|
+
|
11
|
+
@name=location_name
|
12
|
+
|
13
|
+
@stages = {}
|
14
|
+
|
15
|
+
add_stages data
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def add_stages data
|
22
|
+
data['stages'].each_pair do |stage_name, stage_data|
|
23
|
+
@stages[stage_name]= Stage.new( stage_name, stage_data, name )
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|