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
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'shards/meta/list'
|
2
|
+
|
3
|
+
module Shards
|
4
|
+
|
5
|
+
module Meta
|
6
|
+
|
7
|
+
attr_reader :config
|
8
|
+
|
9
|
+
def get_config class_name
|
10
|
+
yaml_file[class_name]
|
11
|
+
end
|
12
|
+
|
13
|
+
def run var
|
14
|
+
eval( config[var.to_s] )
|
15
|
+
end
|
16
|
+
|
17
|
+
def yaml_file
|
18
|
+
ENV['FORMAT_METHODS_FILE'].nil? ? default_yaml : default_yaml.merge(custom_yaml)
|
19
|
+
end
|
20
|
+
|
21
|
+
def default_yaml
|
22
|
+
YAML.load_file File.join(Shards::LIB_PATH,'settings','format_methods.yaml')
|
23
|
+
end
|
24
|
+
|
25
|
+
def custom_yaml
|
26
|
+
YAML.load_file ENV['FORMAT_METHODS_FILE']
|
27
|
+
end
|
28
|
+
|
29
|
+
def add text
|
30
|
+
@output << text
|
31
|
+
end
|
32
|
+
|
33
|
+
def output
|
34
|
+
@output.join("\n")
|
35
|
+
end
|
36
|
+
|
37
|
+
def print_output
|
38
|
+
puts output unless test_env?
|
39
|
+
reset_output
|
40
|
+
end
|
41
|
+
|
42
|
+
def reset_output
|
43
|
+
@output=[' ']
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_env?
|
47
|
+
ENV['TEST'] || false
|
48
|
+
end
|
49
|
+
|
50
|
+
def method_list class_name
|
51
|
+
get_config(class_name).keys
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
data/lib/shards/repo.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require "git"
|
2
|
+
|
3
|
+
module Shards
|
4
|
+
|
5
|
+
class Repo
|
6
|
+
|
7
|
+
@@times = 0
|
8
|
+
attr_accessor :git, :client, :root
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@root=ENV['ENGINEERING_ROOT_PATH']
|
12
|
+
@git=Git.open root
|
13
|
+
clean if @@times<1
|
14
|
+
end
|
15
|
+
|
16
|
+
def live_branch
|
17
|
+
ENV['LIVE_BRANCH'] || 'v5'
|
18
|
+
end
|
19
|
+
|
20
|
+
def clean
|
21
|
+
@@times+=1
|
22
|
+
git.reset_hard
|
23
|
+
git.clean(force: true, d: true)
|
24
|
+
git.branch(live_branch).checkout
|
25
|
+
git.pull('origin',live_branch)
|
26
|
+
end
|
27
|
+
|
28
|
+
def autocommit
|
29
|
+
git.add all: true
|
30
|
+
git.commit message
|
31
|
+
git.push 'origin', live_branch
|
32
|
+
end
|
33
|
+
|
34
|
+
def message
|
35
|
+
"[AUTOCOMMIT] Added shard for #{client}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def diff
|
39
|
+
git.add all: true
|
40
|
+
git.diff
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
data/lib/shards/shard.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'shards/base_yaml_object'
|
2
|
+
|
3
|
+
module Shards
|
4
|
+
|
5
|
+
class Shard < BaseYamlObject
|
6
|
+
|
7
|
+
method_list('Shards::Shard').each do |m|
|
8
|
+
define_method(m.to_sym) { run __method__ }
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_accessor :domain, :db, :dns
|
12
|
+
|
13
|
+
def shard_list_key
|
14
|
+
ENV['SHARD_LIST_KEY_ROOT_PATH'].split.map do |k|
|
15
|
+
"['#{k}']"
|
16
|
+
end.join
|
17
|
+
end
|
18
|
+
|
19
|
+
def rest
|
20
|
+
@rest||=clean_basename
|
21
|
+
end
|
22
|
+
|
23
|
+
def clean_basename
|
24
|
+
shard_rest=list.clone
|
25
|
+
shard_rest.delete(basename)
|
26
|
+
shard_rest
|
27
|
+
end
|
28
|
+
|
29
|
+
def add_domain domain
|
30
|
+
@domain=domain
|
31
|
+
@dns=Shards::Dns.new stage: stage, domain: domain
|
32
|
+
@db=Shards::Db.new stage: stage, dns: dns
|
33
|
+
end
|
34
|
+
|
35
|
+
def connection
|
36
|
+
{ name => db.connection }
|
37
|
+
end
|
38
|
+
|
39
|
+
def add_connection
|
40
|
+
rest.merge! connection
|
41
|
+
@rest=@rest.sort.to_h
|
42
|
+
end
|
43
|
+
|
44
|
+
def merged_connection
|
45
|
+
base.merge rest
|
46
|
+
end
|
47
|
+
|
48
|
+
def update_yaml
|
49
|
+
eval "@yaml#{shard_list_key.to_s}=merged_connection"
|
50
|
+
end
|
51
|
+
|
52
|
+
def write_domain
|
53
|
+
add_connection
|
54
|
+
update_yaml
|
55
|
+
write_yaml
|
56
|
+
end
|
57
|
+
|
58
|
+
def exist?
|
59
|
+
list.keys.include? name
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
data/lib/shards/site.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'shards/base_yaml_object'
|
2
|
+
|
3
|
+
module Shards
|
4
|
+
|
5
|
+
class Site < BaseYamlObject
|
6
|
+
|
7
|
+
attr_accessor :client
|
8
|
+
|
9
|
+
method_list('Shards::Site').each do |m|
|
10
|
+
define_method(m.to_sym) { run __method__ }
|
11
|
+
end
|
12
|
+
|
13
|
+
def add_site dryrun: false
|
14
|
+
|
15
|
+
add_data
|
16
|
+
|
17
|
+
if dryrun
|
18
|
+
add_site_message
|
19
|
+
else
|
20
|
+
write_yaml
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
def exist?
|
26
|
+
!yaml.select { |x| x['domain']==domain }.empty?
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
data/lib/shards/stage.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'shards/shard'
|
2
|
+
require 'shards/site'
|
3
|
+
require 'shards/db'
|
4
|
+
require 'shards/dns'
|
5
|
+
require 'shards/base'
|
6
|
+
|
7
|
+
module Shards
|
8
|
+
|
9
|
+
class Stage < Shards::Base
|
10
|
+
|
11
|
+
include Shards::Meta
|
12
|
+
|
13
|
+
method_list('Shards::Stage').each do |m|
|
14
|
+
define_method(m.to_sym) { run __method__ }
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_accessor :name, :location_name, :shard
|
18
|
+
|
19
|
+
def initialize name, data, location_name
|
20
|
+
|
21
|
+
set_config
|
22
|
+
@name=name
|
23
|
+
@location_name=location_name
|
24
|
+
@variables = data
|
25
|
+
@output=[]
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
def shard
|
30
|
+
@shard||=Shards::Shard.new self
|
31
|
+
@shard
|
32
|
+
end
|
33
|
+
|
34
|
+
def add_domain domain, dryrun: false
|
35
|
+
|
36
|
+
shard.add_domain domain
|
37
|
+
|
38
|
+
if dryrun
|
39
|
+
add_domain_message
|
40
|
+
else
|
41
|
+
shard.write_domain
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
def get var_name
|
47
|
+
@variables.has_key?(var_name) ? @variables[var_name] : send(var_name)
|
48
|
+
end
|
49
|
+
|
50
|
+
def config_name
|
51
|
+
config_replace[name] || name
|
52
|
+
end
|
53
|
+
|
54
|
+
def config_replace
|
55
|
+
ENV['CONFIG_REPLACE'] ? eval(ENV['CONFIG_REPLACE']) : {}
|
56
|
+
end
|
57
|
+
|
58
|
+
def vars
|
59
|
+
@variables.keys
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
data/lib/shards/version.rb
CHANGED
@@ -0,0 +1,177 @@
|
|
1
|
+
require 'shards/config'
|
2
|
+
|
3
|
+
module Shards
|
4
|
+
|
5
|
+
module Workflow
|
6
|
+
|
7
|
+
class Base
|
8
|
+
|
9
|
+
attr_accessor :yaml, :config, :flow, :pointer, :step, :answer, :pointer_history
|
10
|
+
|
11
|
+
def initialize config
|
12
|
+
@config=config
|
13
|
+
config.repo.clean
|
14
|
+
@yaml= YAML.load_file file
|
15
|
+
@pointer_history = []
|
16
|
+
end
|
17
|
+
|
18
|
+
def file
|
19
|
+
ENV['WORKFLOW_YAML_FILE'] || default_file
|
20
|
+
end
|
21
|
+
|
22
|
+
def default_file
|
23
|
+
File.join Shards.root_path, %w(lib settings workflow.yaml)
|
24
|
+
end
|
25
|
+
|
26
|
+
def start wf=nil
|
27
|
+
wf||=self.class.name.split('::').last.downcase
|
28
|
+
@flow=yaml[wf]
|
29
|
+
@pointer=flow.keys.first
|
30
|
+
run_step
|
31
|
+
end
|
32
|
+
|
33
|
+
def run_step
|
34
|
+
|
35
|
+
@step=flow[pointer]
|
36
|
+
@pointer_history << pointer
|
37
|
+
@answer=nil
|
38
|
+
|
39
|
+
begin
|
40
|
+
send pointer
|
41
|
+
@pointer=step['correct']
|
42
|
+
rescue => e
|
43
|
+
puts e.message
|
44
|
+
@pointer=step['wrong']
|
45
|
+
end
|
46
|
+
|
47
|
+
@step=flow[pointer]
|
48
|
+
|
49
|
+
run_step if @step['correct']!='finish'
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
def ask_question
|
54
|
+
puts step['question']
|
55
|
+
@answer=$stdin.gets.chomp
|
56
|
+
end
|
57
|
+
|
58
|
+
def format_options title, array
|
59
|
+
puts title
|
60
|
+
puts
|
61
|
+
array.each_index.map do |k|
|
62
|
+
puts "\t#{k}) #{array[k]}"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def ask_for_exit
|
67
|
+
exit
|
68
|
+
end
|
69
|
+
|
70
|
+
def choose_one title, array
|
71
|
+
format_options(title, array)
|
72
|
+
ask_question
|
73
|
+
validate_in_index answer, array
|
74
|
+
end
|
75
|
+
|
76
|
+
def validate_min_size text, min
|
77
|
+
condition= text.size < min
|
78
|
+
wrong_text= "'%s' is shorter than '%d' characters" % [text, min]
|
79
|
+
validation condition, wrong_text
|
80
|
+
end
|
81
|
+
|
82
|
+
def validate_regex text, regex
|
83
|
+
condition= text !~ /#{regex}/
|
84
|
+
wrong_text = "'%s' has a wrong format" % text
|
85
|
+
validation condition, wrong_text
|
86
|
+
end
|
87
|
+
|
88
|
+
def validate_in_index text, array
|
89
|
+
condition= array.at(text.to_i).nil?
|
90
|
+
wrong_text = text
|
91
|
+
validation condition, wrong_text
|
92
|
+
end
|
93
|
+
|
94
|
+
def validation condition, wrong_text
|
95
|
+
raise_wrong_text wrong_text if condition
|
96
|
+
end
|
97
|
+
|
98
|
+
def raise_wrong_text wrong_text
|
99
|
+
raise @step['wrong_message'] % wrong_text
|
100
|
+
end
|
101
|
+
|
102
|
+
def previous_pointer
|
103
|
+
@pointer_history.at(-2)
|
104
|
+
end
|
105
|
+
|
106
|
+
def ask_for_repeat
|
107
|
+
ask_question
|
108
|
+
if answer.strip.downcase!='r'
|
109
|
+
config.repo.clean
|
110
|
+
raise step['wrong_message']
|
111
|
+
end
|
112
|
+
@pointer=previous_pointer
|
113
|
+
run_step
|
114
|
+
|
115
|
+
end
|
116
|
+
|
117
|
+
def check_shard_presence_in_shards
|
118
|
+
stage.add_domain domain, dryrun: true
|
119
|
+
raise_wrong_text stage.shard.name if stage.shard.exist?
|
120
|
+
end
|
121
|
+
|
122
|
+
def check_database_presence_in_server
|
123
|
+
raise_wrong_text [stage.shard.db.name,stage.shard.db.server] if stage.shard.db.exist?
|
124
|
+
end
|
125
|
+
|
126
|
+
def check_domain_dns_presence
|
127
|
+
raise_wrong_text stage.shard.dns.host if stage.shard.dns.exist?
|
128
|
+
end
|
129
|
+
|
130
|
+
def check_domain_presence_in_sites
|
131
|
+
@site = Shards::Site.new stage
|
132
|
+
site.client = client
|
133
|
+
raise_wrong_text site.domain if site.exist?
|
134
|
+
end
|
135
|
+
|
136
|
+
def write_yaml_files
|
137
|
+
stage.add_domain domain
|
138
|
+
site.add_site
|
139
|
+
puts config.repo.diff
|
140
|
+
ask_question
|
141
|
+
raise step['wrong_message'] if answer.strip.downcase!='y'
|
142
|
+
end
|
143
|
+
|
144
|
+
def commit_changes
|
145
|
+
puts config.repo.autocommit
|
146
|
+
end
|
147
|
+
|
148
|
+
def create_database
|
149
|
+
stage.shard.db.create
|
150
|
+
message_params= [stage.shard.db.name, stage.shard.db.server]
|
151
|
+
raise_wrong_text message_params unless stage.shard.db.exist?
|
152
|
+
puts step['message'] % message_params
|
153
|
+
end
|
154
|
+
|
155
|
+
def clean_repo_and_exit
|
156
|
+
puts config.repo.clean
|
157
|
+
end
|
158
|
+
|
159
|
+
def dns_upsert
|
160
|
+
stage.shard.dns.r53upsert
|
161
|
+
raise_wrong_text host unless stage.shard.dns.exist?
|
162
|
+
puts step['message'] % host
|
163
|
+
end
|
164
|
+
|
165
|
+
def host
|
166
|
+
stage.shard.dns.host
|
167
|
+
end
|
168
|
+
|
169
|
+
def ask_for_exit_and_restart
|
170
|
+
ask_question
|
171
|
+
raise step['wrong_message'] if answer.strip.downcase!='r'
|
172
|
+
end
|
173
|
+
|
174
|
+
end
|
175
|
+
|
176
|
+
end
|
177
|
+
end
|