shards 1.1.3 → 1.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +2 -1
- data/lib/settings/format_methods.yaml +31 -19
- data/lib/settings/workflows/base.yaml +60 -0
- data/lib/settings/workflows/delete_by_terminal.yaml +45 -0
- data/lib/settings/workflows/fast_terminal.yaml +24 -0
- data/lib/settings/workflows/terminal.yaml +48 -0
- data/lib/shards/base.rb +7 -0
- data/lib/shards/client.rb +52 -10
- data/lib/shards/db.rb +19 -2
- data/lib/shards/dns.rb +16 -8
- data/lib/shards/shard.rb +29 -2
- data/lib/shards/site.rb +27 -2
- data/lib/shards/version.rb +1 -1
- data/lib/shards/workflow/base.rb +62 -9
- data/lib/shards/workflow/delete_by_terminal.rb +83 -0
- data/lib/shards/workflow/fast_terminal.rb +0 -12
- data/lib/shards/workflow/workflow.rb +1 -0
- metadata +7 -3
- data/lib/settings/workflow.yaml +0 -126
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8100a8736331fe754ed67615e90de445c142cf90
|
4
|
+
data.tar.gz: 3f9e7a44454e6265f2cb9a6298d5b562a7811e66
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e34b61bc072e0c729f27a2519c2fed429bee35b5acaf029325c73ed4e13efcaee6669945fbb34f1b91b150fd56a9dc8d854a33d931b028c88edd4946c2c34c6
|
7
|
+
data.tar.gz: 83ab8355643ea330fe5d59dbd70686a42711ff4a165942a1c07fe35b39a763f3f9aa1e4aa7c706b7aec36e010eb74bbc6e49b8c29d25c61cb398c8dba710abc2
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -46,7 +46,8 @@ PROXY_USER=proxy_username
|
|
46
46
|
TEST=true #only for test.env delete this var in settings.env
|
47
47
|
CONFIG_REPLACE={ 'prod' => 'web' }
|
48
48
|
LIVE_BRANCH=shards_test # set this var to use in test.env or to change the default value 'v5'
|
49
|
-
|
49
|
+
WORKFLOW_YAML_PATH=path/to/your/workflows/ # you could overwrite yaml files using the same name in the defined path.
|
50
|
+
|
50
51
|
# You could overwrite methods using this metaprograming way ading your on your_file.yaml
|
51
52
|
# Then add this var:
|
52
53
|
# FORMAT_METHODS_FILE=your/path/to/your_file.yaml
|
@@ -3,14 +3,38 @@ Shards::Dns:
|
|
3
3
|
name: (domain + stage.get('domain_suffix')).downcase.gsub('_','-')
|
4
4
|
zone: ENV['DNS_ZONE_CODE']
|
5
5
|
target: stage.route53
|
6
|
-
r53upsert:
|
6
|
+
r53upsert: |
|
7
|
+
@action='UPSERT'
|
8
|
+
@begin_comment='Adding'
|
9
|
+
r53_operation
|
10
|
+
|
11
|
+
host: name + '.' + ENV['DOMAIN']
|
12
|
+
dryrun_message: |
|
13
|
+
add "##### DNS Dryrun #####"
|
14
|
+
add "CNAME: #{host}"
|
15
|
+
add "Target: #{target}"
|
16
|
+
add "ZoneID: #{zone}"
|
17
|
+
add " "
|
18
|
+
creating_route53_message: |
|
19
|
+
add "##### Setting Up DNS"
|
20
|
+
add "Creating Route53 entry for #{host} as a CNAME to #{target}"
|
21
|
+
add " "
|
22
|
+
aws_route53_record_message: |
|
23
|
+
add "Route53 Response"
|
24
|
+
add aws_route53_resp.to_h
|
25
|
+
r53delete: |
|
26
|
+
@action='DELETE'
|
27
|
+
@begin_comment='Deleting'
|
28
|
+
r53_operation
|
29
|
+
|
30
|
+
r53_operation: |
|
7
31
|
{
|
8
32
|
change_batch: {
|
9
33
|
changes: [
|
10
34
|
{
|
11
|
-
action:
|
35
|
+
action: action,
|
12
36
|
resource_record_set: {
|
13
|
-
name:
|
37
|
+
name: host_param,
|
14
38
|
resource_records: [
|
15
39
|
{
|
16
40
|
value: target
|
@@ -21,25 +45,11 @@ Shards::Dns:
|
|
21
45
|
},
|
22
46
|
},
|
23
47
|
],
|
24
|
-
comment: "
|
48
|
+
comment: "#{begin_comment} record #{host_param} to #{target}"
|
25
49
|
},
|
26
50
|
hosted_zone_id: "#{zone}"
|
27
51
|
}
|
28
52
|
|
29
|
-
host: name + '.' + ENV['DOMAIN']
|
30
|
-
dryrun_message: |
|
31
|
-
add "##### DNS Dryrun #####"
|
32
|
-
add "CNAME: #{host}"
|
33
|
-
add "Target: #{target}"
|
34
|
-
add "ZoneID: #{zone}"
|
35
|
-
add " "
|
36
|
-
creating_route53_message: |
|
37
|
-
add "##### Setting Up DNS"
|
38
|
-
add "Creating Route53 entry for #{host} as a CNAME to #{target}"
|
39
|
-
add " "
|
40
|
-
aws_route53_record_message: |
|
41
|
-
add "Route53 Response"
|
42
|
-
add aws_route53_resp.to_h
|
43
53
|
|
44
54
|
Shards::Db:
|
45
55
|
name: |
|
@@ -63,7 +73,7 @@ Shards::Db:
|
|
63
73
|
inserting_data: |
|
64
74
|
add "echo \"# Inserting data from #{net} into #{name}\""
|
65
75
|
add "#{conn} #{name} < #{sql_dump_file}"
|
66
|
-
|
76
|
+
default_connection: |
|
67
77
|
"mysql #{conn_usr_pass} -h#{server}"
|
68
78
|
dump: |
|
69
79
|
"mysqldump #{conn_usr_pass} -h#{net_server}"
|
@@ -94,6 +104,8 @@ Shards::Db:
|
|
94
104
|
{ 'host' => server , 'adapter' => adapter, 'reconnect' => reconnect , 'username' => user , 'password' => password , 'database' => name }
|
95
105
|
show_command: |
|
96
106
|
conn + ' -N -B -e "show databases"'
|
107
|
+
drop_command: |
|
108
|
+
conn + '-v -v -e "DROP DATABASE ' + database_to_drop + '"'
|
97
109
|
|
98
110
|
|
99
111
|
Shards::Site:
|
@@ -0,0 +1,60 @@
|
|
1
|
+
---
|
2
|
+
# these steps are shared
|
3
|
+
shared_steps:
|
4
|
+
|
5
|
+
check_shard_presence_in_shards:
|
6
|
+
wrong_message: The shard %s exists in shards.
|
7
|
+
correct: check_database_presence_in_server
|
8
|
+
wrong: finish
|
9
|
+
|
10
|
+
check_database_presence_in_server:
|
11
|
+
wrong_message: The database %s exists in server %s.
|
12
|
+
correct: check_domain_dns_presence
|
13
|
+
wrong: finish
|
14
|
+
|
15
|
+
check_domain_dns_presence:
|
16
|
+
wrong_message: There is already a record for the host %s.
|
17
|
+
correct: check_domain_presence_in_sites
|
18
|
+
wrong: finish
|
19
|
+
|
20
|
+
check_domain_presence_in_sites:
|
21
|
+
wrong_message: The domain %s is already present in sites.
|
22
|
+
correct: write_yaml_files
|
23
|
+
wrong: finish
|
24
|
+
|
25
|
+
write_yaml_files:
|
26
|
+
question: Type Y to confirm the changes
|
27
|
+
wrong_message: Undo changes
|
28
|
+
correct: create_database
|
29
|
+
wrong: clean_repo_and_exit
|
30
|
+
|
31
|
+
validate_location:
|
32
|
+
correct: validate_stage
|
33
|
+
wrong_message: Location %s does not exist.
|
34
|
+
wrong: clean_repo_and_exit
|
35
|
+
|
36
|
+
create_database:
|
37
|
+
message: The database %s has been successfully created in %s.
|
38
|
+
wrong_message: Error. Couldn't create the database %s in %s.
|
39
|
+
correct: commit_changes
|
40
|
+
wrong: clean_repo_and_exit
|
41
|
+
|
42
|
+
commit_changes:
|
43
|
+
message: The changes has been committed and pushed to the remote repository.
|
44
|
+
wrong_message: We had an issue to commit and push the changes.
|
45
|
+
correct: dns_upsert
|
46
|
+
wrong: finish
|
47
|
+
|
48
|
+
dns_upsert:
|
49
|
+
message: The dns record with the host %s has been succesfully created.
|
50
|
+
wrong_message: Error. Could not register the host %s as a dns record.
|
51
|
+
correct: finish
|
52
|
+
wrong: finish
|
53
|
+
|
54
|
+
clean_repo_and_exit:
|
55
|
+
wrong_message: Cuould not clean the repository.
|
56
|
+
correct: finish
|
57
|
+
|
58
|
+
finish:
|
59
|
+
correct: final_step
|
60
|
+
|
@@ -0,0 +1,45 @@
|
|
1
|
+
---
|
2
|
+
# see shared_steps in base.yaml to find the steps not defined in a workflow
|
3
|
+
|
4
|
+
delete_by_terminal:
|
5
|
+
|
6
|
+
validate_stage:
|
7
|
+
correct: validate_subdomain
|
8
|
+
wrong_message: Stage %s does not exist.
|
9
|
+
wrong: finish
|
10
|
+
|
11
|
+
validate_subdomain:
|
12
|
+
correct: delete_record
|
13
|
+
wrong_message: Host %s has not a recordset to target %s.
|
14
|
+
wrong: finish
|
15
|
+
|
16
|
+
delete_record:
|
17
|
+
message: Record %s deleted in target %s
|
18
|
+
correct: delete_site_and_shard
|
19
|
+
wrong: finish
|
20
|
+
wrong_message: Could not delete the record %s.
|
21
|
+
|
22
|
+
delete_site_and_shard:
|
23
|
+
correct: write_yaml_files
|
24
|
+
wrong: clean_repo_and_exit
|
25
|
+
wrong_message: Could not delete site or shard.\n %s.
|
26
|
+
|
27
|
+
write_yaml_files:
|
28
|
+
question: Type Y to confirm the changes
|
29
|
+
wrong_message: Undo changes
|
30
|
+
correct: commit_changes
|
31
|
+
wrong: clean_repo_and_exit
|
32
|
+
|
33
|
+
commit_changes:
|
34
|
+
message: The changes has been committed and pushed to the remote repository.
|
35
|
+
wrong_message: We had an issue to commit and push the changes.
|
36
|
+
correct: delete_database
|
37
|
+
wrong: finish
|
38
|
+
|
39
|
+
delete_database:
|
40
|
+
wrong_message: The database %s could not be deleted in host %s.
|
41
|
+
message: Database %s was deleted in host %s.
|
42
|
+
correct: finish
|
43
|
+
wrong: finish
|
44
|
+
|
45
|
+
start: validate_location
|
@@ -0,0 +1,24 @@
|
|
1
|
+
---
|
2
|
+
# see shared_steps in base.yaml to find the steps not defined in a workflow
|
3
|
+
|
4
|
+
fast_terminal:
|
5
|
+
|
6
|
+
validate_client:
|
7
|
+
correct: validate_domain
|
8
|
+
wrong: clean_repo_and_exit
|
9
|
+
wrong_message: The client name %s.
|
10
|
+
min_size: 2
|
11
|
+
|
12
|
+
validate_domain:
|
13
|
+
correct: validate_location
|
14
|
+
wrong: clean_repo_and_exit
|
15
|
+
wrong_message: The domain %s.
|
16
|
+
min_size: 3
|
17
|
+
regex: ^[a-zA-Z0-9_]*$
|
18
|
+
|
19
|
+
validate_stage:
|
20
|
+
correct: check_shard_presence_in_shards
|
21
|
+
wrong_message: Stage %s does not exist.
|
22
|
+
wrong: clean_repo_and_exit
|
23
|
+
|
24
|
+
start: validate_client
|
@@ -0,0 +1,48 @@
|
|
1
|
+
---
|
2
|
+
# see shared_steps in base.yaml to find the steps not defined in a workflow
|
3
|
+
terminal:
|
4
|
+
|
5
|
+
ask_client:
|
6
|
+
question: Type the client name, please.
|
7
|
+
wrong_message: The client name %s.
|
8
|
+
correct: ask_location
|
9
|
+
wrong: ask_for_repeat
|
10
|
+
min_size: 2
|
11
|
+
|
12
|
+
ask_location:
|
13
|
+
question: Type the location mumber, please.
|
14
|
+
wrong_message: The location %s is not in the list.
|
15
|
+
correct: ask_stage
|
16
|
+
wrong: ask_for_repeat
|
17
|
+
|
18
|
+
ask_stage:
|
19
|
+
question: Type stage number, please.
|
20
|
+
wrong_message: The stage %s is not in the list.
|
21
|
+
correct: ask_domain
|
22
|
+
wrong: ask_for_repeat
|
23
|
+
|
24
|
+
ask_domain:
|
25
|
+
question: Type the domain name, please.
|
26
|
+
wrong_message: The domain name %s.
|
27
|
+
correct: check_shard_presence_in_shards
|
28
|
+
wrong: ask_for_repeat
|
29
|
+
min_size: 3
|
30
|
+
regex: ^[a-zA-Z0-9_]*$
|
31
|
+
|
32
|
+
ask_for_exit_and_restart:
|
33
|
+
question: Type 'r' to restart the process, another key to finish.
|
34
|
+
wrong_message: Process Interrupted.
|
35
|
+
correct: ask_location
|
36
|
+
wrong: finish
|
37
|
+
|
38
|
+
ask_for_repeat:
|
39
|
+
question: Wrong answer, type 'r' to repeat the step, another key to finish.
|
40
|
+
correct: repeat_previous_method
|
41
|
+
wrong_message: Process Interrupted. Cleanning the repo and exit.
|
42
|
+
wrong: finish
|
43
|
+
|
44
|
+
repeat_previous_method:
|
45
|
+
correct: repeat_previous_method
|
46
|
+
wrong: finish
|
47
|
+
|
48
|
+
start: ask_client
|
data/lib/shards/base.rb
CHANGED
@@ -6,6 +6,8 @@ module Shards
|
|
6
6
|
|
7
7
|
include Shards::Meta
|
8
8
|
|
9
|
+
attr_writer :subdomain_param
|
10
|
+
|
9
11
|
class << self
|
10
12
|
|
11
13
|
def method_list class_name
|
@@ -20,6 +22,11 @@ module Shards
|
|
20
22
|
@config=get_config self.class.name
|
21
23
|
end
|
22
24
|
|
25
|
+
def subdomain_param
|
26
|
+
@subdomain_param + '.' + ENV['DOMAIN'] unless @subdomain_param.nil?
|
27
|
+
end
|
28
|
+
|
29
|
+
|
23
30
|
end
|
24
31
|
end
|
25
32
|
|
data/lib/shards/client.rb
CHANGED
@@ -16,6 +16,16 @@ module Shards
|
|
16
16
|
|
17
17
|
end
|
18
18
|
|
19
|
+
desc 'delete LOCATION STAGE SUBDOMAIN', 'Fast deletion tool. To delete dns record, shard, site and database.'
|
20
|
+
|
21
|
+
def delete location, stage, subdomain
|
22
|
+
|
23
|
+
terminal=Shards::Workflow::DeleteByTerminal.new config
|
24
|
+
terminal.params= { subdomain: subdomain, location: location, stage: stage }
|
25
|
+
terminal.start
|
26
|
+
|
27
|
+
end
|
28
|
+
|
19
29
|
desc 'terminal', 'Run interactive shards creation tool in the terminal'
|
20
30
|
|
21
31
|
def terminal
|
@@ -72,11 +82,40 @@ module Shards
|
|
72
82
|
|
73
83
|
def dns(location, stage, domain)
|
74
84
|
|
75
|
-
|
76
|
-
|
77
|
-
|
85
|
+
d = get_dns location, stage, domain
|
86
|
+
|
87
|
+
puts "Host: #{d.host} , exists: #{d.exist?}"
|
78
88
|
|
79
|
-
|
89
|
+
end
|
90
|
+
|
91
|
+
desc "subdomain_dns LOCATION STAGE SUBDOMAIN", "Check if dns record is available for a subdomain"
|
92
|
+
|
93
|
+
def subdomain_dns(location, stage, subdomain)
|
94
|
+
|
95
|
+
d = get_dns location, stage
|
96
|
+
|
97
|
+
d.subdomain_param=subdomain
|
98
|
+
|
99
|
+
puts "Subdomain: #{subdomain} , exists: #{d.exist?}"
|
100
|
+
|
101
|
+
end
|
102
|
+
|
103
|
+
desc "delete_subdomain_record LOCATION STAGE SUBDOMAIN", "Delete subdomain dns record"
|
104
|
+
|
105
|
+
def delete_subdomain_record(location, stage, subdomain)
|
106
|
+
|
107
|
+
d = get_dns location, stage
|
108
|
+
|
109
|
+
d.subdomain_param=subdomain
|
110
|
+
|
111
|
+
exist=d.exist?
|
112
|
+
|
113
|
+
puts "Subdomain: #{subdomain} , exists: #{exist}"
|
114
|
+
|
115
|
+
if exist
|
116
|
+
d.delete
|
117
|
+
puts "Host: #{d.host_param} deleted!"
|
118
|
+
end
|
80
119
|
|
81
120
|
end
|
82
121
|
|
@@ -84,14 +123,12 @@ module Shards
|
|
84
123
|
|
85
124
|
def add_dns_record(location, stage, domain)
|
86
125
|
|
87
|
-
|
88
|
-
s.shard.add_domain domain
|
89
|
-
dns=s.shard.dns
|
126
|
+
d = get_dns location, stage, domain
|
90
127
|
|
91
|
-
if
|
92
|
-
puts "There is already a record for the host %s " %
|
128
|
+
if d.exist?
|
129
|
+
puts "There is already a record for the host %s " % d.host
|
93
130
|
else
|
94
|
-
|
131
|
+
d.set dryrun: false
|
95
132
|
end
|
96
133
|
|
97
134
|
end
|
@@ -128,6 +165,11 @@ module Shards
|
|
128
165
|
l.stages[stage]
|
129
166
|
end
|
130
167
|
|
168
|
+
def get_dns location, stage, domain=nil
|
169
|
+
s = get_stage location, stage
|
170
|
+
Shards::Dns.new stage: s, domain: domain
|
171
|
+
end
|
172
|
+
|
131
173
|
end
|
132
174
|
|
133
175
|
end
|
data/lib/shards/db.rb
CHANGED
@@ -12,7 +12,9 @@ module Shards
|
|
12
12
|
define_method(m.to_sym) { run __method__ }
|
13
13
|
end
|
14
14
|
|
15
|
+
attr_accessor :database_to_drop
|
15
16
|
attr_reader :stage, :dns, :databases_on_server
|
17
|
+
attr_writer :conn
|
16
18
|
|
17
19
|
def initialize stage:, dns:
|
18
20
|
set_config
|
@@ -82,9 +84,24 @@ module Shards
|
|
82
84
|
@databases_on_server=ssh_output.split("\n").reject { |x| x.include?"Warning" }
|
83
85
|
end
|
84
86
|
|
85
|
-
def exist?
|
87
|
+
def exist? searched=nil
|
88
|
+
searched||=name
|
86
89
|
show
|
87
|
-
databases_on_server.include?
|
90
|
+
databases_on_server.include? searched
|
91
|
+
end
|
92
|
+
|
93
|
+
def conn
|
94
|
+
@conn || default_connection
|
95
|
+
end
|
96
|
+
|
97
|
+
def drop
|
98
|
+
|
99
|
+
raise "database_to_drop is nil" if database_to_drop.nil?
|
100
|
+
|
101
|
+
ssh_conn do |ssh|
|
102
|
+
add(ssh.exec! drop_command)
|
103
|
+
end
|
104
|
+
|
88
105
|
end
|
89
106
|
|
90
107
|
end
|
data/lib/shards/dns.rb
CHANGED
@@ -9,13 +9,13 @@ module Shards
|
|
9
9
|
define_method(m.to_sym) { run __method__ }
|
10
10
|
end
|
11
11
|
|
12
|
-
attr_reader :stage, :domain
|
12
|
+
attr_reader :stage, :domain, :action, :begin_comment
|
13
13
|
attr_accessor :aws_route53_resp, :r53
|
14
14
|
|
15
|
-
def initialize stage:, domain:
|
15
|
+
def initialize stage:, domain: nil
|
16
16
|
set_config
|
17
17
|
@stage=stage
|
18
|
-
@domain=domain.downcase
|
18
|
+
@domain=domain.downcase if domain
|
19
19
|
reset_output
|
20
20
|
@r53 = Aws::Route53::Client.new()
|
21
21
|
end
|
@@ -35,22 +35,30 @@ module Shards
|
|
35
35
|
@aws_route53_resp = r53.change_resource_record_sets r53upsert
|
36
36
|
end
|
37
37
|
|
38
|
+
def delete
|
39
|
+
@aws_route53_resp = r53.change_resource_record_sets r53delete
|
40
|
+
end
|
41
|
+
|
38
42
|
def exist?
|
39
|
-
!record_list.empty?
|
43
|
+
!record_list(host_param).empty?
|
40
44
|
end
|
41
45
|
|
42
|
-
def record_list
|
43
|
-
record_sets.select { |x| x.name.include?
|
46
|
+
def record_list host_param
|
47
|
+
record_sets(host_param).select { |x| x.name.include? host_param }
|
44
48
|
end
|
45
49
|
|
46
|
-
def record_sets
|
50
|
+
def record_sets host_param
|
47
51
|
r53.list_resource_record_sets({
|
48
52
|
hosted_zone_id: zone,
|
49
|
-
start_record_name:
|
53
|
+
start_record_name: host_param,
|
50
54
|
max_items: 20
|
51
55
|
}).resource_record_sets
|
52
56
|
end
|
53
57
|
|
58
|
+
def host_param
|
59
|
+
subdomain_param || host
|
60
|
+
end
|
61
|
+
|
54
62
|
end
|
55
63
|
end
|
56
64
|
|
data/lib/shards/shard.rb
CHANGED
@@ -8,7 +8,8 @@ module Shards
|
|
8
8
|
define_method(m.to_sym) { run __method__ }
|
9
9
|
end
|
10
10
|
|
11
|
-
attr_accessor :domain, :db, :dns
|
11
|
+
attr_accessor :domain, :db, :dns, :database
|
12
|
+
attr_writer :name_param
|
12
13
|
|
13
14
|
def shard_list_key
|
14
15
|
ENV['SHARD_LIST_KEY_ROOT_PATH'].split.map do |k|
|
@@ -55,8 +56,34 @@ module Shards
|
|
55
56
|
write_yaml
|
56
57
|
end
|
57
58
|
|
59
|
+
def name_param
|
60
|
+
@name_param || name
|
61
|
+
end
|
62
|
+
|
58
63
|
def exist?
|
59
|
-
list.keys.include?
|
64
|
+
list.keys.include? name_param
|
65
|
+
end
|
66
|
+
|
67
|
+
def delete
|
68
|
+
raise "#{name_param} doesn't exist" unless exist?
|
69
|
+
@database=list[name_param]
|
70
|
+
delete_in_yaml
|
71
|
+
write_yaml
|
72
|
+
end
|
73
|
+
|
74
|
+
def delete_in_yaml
|
75
|
+
list_to_delete=list.clone
|
76
|
+
list_to_delete.delete name_param
|
77
|
+
eval "@yaml#{shard_list_key.to_s}=list_to_delete"
|
78
|
+
end
|
79
|
+
|
80
|
+
def by_database
|
81
|
+
raise "database is nil" if database.nil?
|
82
|
+
list.select { |k,v| v['database']==database['database'] }
|
83
|
+
end
|
84
|
+
|
85
|
+
def count_by_database
|
86
|
+
by_database.keys.count
|
60
87
|
end
|
61
88
|
|
62
89
|
end
|
data/lib/shards/site.rb
CHANGED
@@ -4,7 +4,7 @@ module Shards
|
|
4
4
|
|
5
5
|
class Site < BaseYamlObject
|
6
6
|
|
7
|
-
attr_accessor :client
|
7
|
+
attr_accessor :client, :shard
|
8
8
|
|
9
9
|
method_list('Shards::Site').each do |m|
|
10
10
|
define_method(m.to_sym) { run __method__ }
|
@@ -22,8 +22,33 @@ module Shards
|
|
22
22
|
|
23
23
|
end
|
24
24
|
|
25
|
+
def domain_param
|
26
|
+
subdomain_param || domain
|
27
|
+
end
|
28
|
+
|
25
29
|
def exist?
|
26
|
-
!
|
30
|
+
!select_by_domain.empty?
|
31
|
+
end
|
32
|
+
|
33
|
+
def select_by_domain
|
34
|
+
yaml.select { |x| x['domain']==domain_param }
|
35
|
+
end
|
36
|
+
|
37
|
+
def reject_by_domain
|
38
|
+
yaml.reject { |x| x['domain']==domain_param }
|
39
|
+
end
|
40
|
+
|
41
|
+
def select_by_shard
|
42
|
+
yaml.select { |x| x['shard']==shard }
|
43
|
+
end
|
44
|
+
|
45
|
+
def delete
|
46
|
+
site_to_delete = select_by_domain
|
47
|
+
raise "there are more than one site with this domain" if site_to_delete.count > 1
|
48
|
+
raise "there are not a site with this domain" if site_to_delete.count < 1
|
49
|
+
@shard=site_to_delete.first['shard']
|
50
|
+
@yaml=reject_by_domain
|
51
|
+
write_yaml
|
27
52
|
end
|
28
53
|
|
29
54
|
end
|
data/lib/shards/version.rb
CHANGED
data/lib/shards/workflow/base.rb
CHANGED
@@ -6,27 +6,68 @@ module Shards
|
|
6
6
|
|
7
7
|
class Base
|
8
8
|
|
9
|
-
attr_accessor :
|
9
|
+
attr_accessor :config, :flow, :pointer, :step, :answer, :pointer_history, :client, :location, :stage, :domain, :site, :params
|
10
|
+
|
11
|
+
attr_writer :wf
|
12
|
+
|
10
13
|
|
11
14
|
def initialize config
|
12
15
|
@config=config
|
13
16
|
config.repo.clean
|
14
|
-
@yaml= YAML.load_file file
|
15
17
|
@pointer_history = []
|
16
18
|
end
|
17
19
|
|
20
|
+
def yaml
|
21
|
+
@yaml||= YAML.load_file file
|
22
|
+
end
|
23
|
+
|
18
24
|
def file
|
19
|
-
|
25
|
+
get_file "#{wf}.yaml"
|
26
|
+
end
|
27
|
+
|
28
|
+
def shared_file
|
29
|
+
get_file 'base.yaml'
|
30
|
+
end
|
31
|
+
|
32
|
+
def shared_steps
|
33
|
+
YAML.load_file(shared_file)['shared_steps']
|
34
|
+
end
|
35
|
+
|
36
|
+
def get_file fname
|
37
|
+
|
38
|
+
f=File.join path, fname
|
39
|
+
|
40
|
+
f=File.join default_path, fname unless File.exist? f
|
41
|
+
|
42
|
+
f
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
def path
|
47
|
+
ENV['WORKFLOW_YAML_PATH'] || default_path
|
48
|
+
end
|
49
|
+
|
50
|
+
def default_path
|
51
|
+
File.join Shards.root_path, %w(lib settings workflows)
|
20
52
|
end
|
21
53
|
|
22
|
-
def
|
23
|
-
|
54
|
+
def wf
|
55
|
+
@wf || decamelize( self.class.name.split('::').last )
|
24
56
|
end
|
25
57
|
|
26
|
-
def
|
27
|
-
|
28
|
-
|
29
|
-
|
58
|
+
def decamelize camelcase
|
59
|
+
camelcase.
|
60
|
+
gsub(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2').
|
61
|
+
gsub(/([a-z]+)([A-Z\d])/, '\1_\2').
|
62
|
+
gsub(/([A-Z]{2,})(\d+)/i, '\1_\2').
|
63
|
+
gsub(/(\d+)([a-z])/i, '\1_\2').
|
64
|
+
gsub(/(.+?)\&(.+?)/, '\1_&_\2').
|
65
|
+
gsub(/\s/, '_').downcase
|
66
|
+
end
|
67
|
+
|
68
|
+
def start
|
69
|
+
@flow=shared_steps.merge yaml[wf]
|
70
|
+
@pointer=yaml['start']
|
30
71
|
run_step
|
31
72
|
end
|
32
73
|
|
@@ -174,6 +215,18 @@ module Shards
|
|
174
215
|
raise step['wrong_message'] if answer.strip.downcase!='r'
|
175
216
|
end
|
176
217
|
|
218
|
+
def validate_location
|
219
|
+
loc=params[:location]
|
220
|
+
raise_wrong_text loc unless config.locations.keys.include? loc
|
221
|
+
@location=config.locations[loc]
|
222
|
+
end
|
223
|
+
|
224
|
+
def validate_stage
|
225
|
+
st=params[:stage]
|
226
|
+
raise_wrong_text st unless location.stages.keys.include? st
|
227
|
+
@stage=location.stages[st]
|
228
|
+
end
|
229
|
+
|
177
230
|
end
|
178
231
|
|
179
232
|
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require_relative './base.rb'
|
2
|
+
|
3
|
+
module Shards
|
4
|
+
|
5
|
+
module Workflow
|
6
|
+
|
7
|
+
class DeleteByTerminal < Shards::Workflow::Base
|
8
|
+
|
9
|
+
attr_accessor :dns, :db, :db_conn
|
10
|
+
|
11
|
+
def validate_subdomain
|
12
|
+
@dns=Shards::Dns.new stage: stage
|
13
|
+
dns.subdomain_param=params[:subdomain]
|
14
|
+
raise_wrong_text [dns.host_param, dns.target] unless dns.exist?
|
15
|
+
end
|
16
|
+
|
17
|
+
def delete_record
|
18
|
+
dns.delete
|
19
|
+
message_params= [dns.host_param, dns.target]
|
20
|
+
raise_wrong_text message_params if dns.exist?
|
21
|
+
puts step['message'] % message_params
|
22
|
+
end
|
23
|
+
|
24
|
+
def delete_site_and_shard
|
25
|
+
site=Shards::Site.new stage
|
26
|
+
site.subdomain_param=params[:subdomain]
|
27
|
+
site.delete
|
28
|
+
|
29
|
+
shard=Shards::Shard.new stage
|
30
|
+
@shard_name= site.shard
|
31
|
+
shard.name_param = @shard_name
|
32
|
+
shard.delete
|
33
|
+
|
34
|
+
@db_conn=shard.database
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
def write_yaml_files
|
39
|
+
puts config.repo.diff
|
40
|
+
ask_question
|
41
|
+
raise step['wrong_message'] if answer.strip.downcase!='y'
|
42
|
+
end
|
43
|
+
|
44
|
+
def commit_changes
|
45
|
+
config.repo.message = "Deleted site: #{params[:subdomain]} and shard: #{@shard_name} in #{location.name}"
|
46
|
+
config.repo.autocommit
|
47
|
+
puts step['message']
|
48
|
+
puts config.repo.message
|
49
|
+
end
|
50
|
+
|
51
|
+
def delete_database
|
52
|
+
@db=Shards::Db.new stage: stage, dns: dns
|
53
|
+
message_params= [db_name, db_host]
|
54
|
+
raise "Database %s does not exist in %s." % message_params unless db_exist?
|
55
|
+
|
56
|
+
db.database_to_drop=db_name
|
57
|
+
db.conn="mysql -u#{db_conn['username']} -p#{db_conn['password']} -h#{db_host} "
|
58
|
+
db.drop
|
59
|
+
|
60
|
+
raise_wrong_text message_params if db_exist?
|
61
|
+
puts step['message'] % message_params
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def db_exist?
|
68
|
+
db.exist? db_conn['database']
|
69
|
+
end
|
70
|
+
|
71
|
+
def db_name
|
72
|
+
db_conn['database']
|
73
|
+
end
|
74
|
+
|
75
|
+
def db_host
|
76
|
+
db_conn['host']
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
@@ -16,18 +16,6 @@ module Shards
|
|
16
16
|
|
17
17
|
end
|
18
18
|
|
19
|
-
def validate_location
|
20
|
-
loc=params[:location]
|
21
|
-
raise_wrong_text loc unless config.locations.keys.include? loc
|
22
|
-
@location=config.locations[loc]
|
23
|
-
end
|
24
|
-
|
25
|
-
def validate_stage
|
26
|
-
st=params[:stage]
|
27
|
-
raise_wrong_text st unless location.stages.keys.include? st
|
28
|
-
@stage=location.stages[st]
|
29
|
-
end
|
30
|
-
|
31
19
|
def validate_domain
|
32
20
|
|
33
21
|
domain_name=params[:domain]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shards
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Diego PL
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-08-
|
11
|
+
date: 2018-08-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -201,7 +201,10 @@ files:
|
|
201
201
|
- bin/setup
|
202
202
|
- exe/shards
|
203
203
|
- lib/settings/format_methods.yaml
|
204
|
-
- lib/settings/
|
204
|
+
- lib/settings/workflows/base.yaml
|
205
|
+
- lib/settings/workflows/delete_by_terminal.yaml
|
206
|
+
- lib/settings/workflows/fast_terminal.yaml
|
207
|
+
- lib/settings/workflows/terminal.yaml
|
205
208
|
- lib/shards.rb
|
206
209
|
- lib/shards/base.rb
|
207
210
|
- lib/shards/base_yaml_object.rb
|
@@ -218,6 +221,7 @@ files:
|
|
218
221
|
- lib/shards/stage.rb
|
219
222
|
- lib/shards/version.rb
|
220
223
|
- lib/shards/workflow/base.rb
|
224
|
+
- lib/shards/workflow/delete_by_terminal.rb
|
221
225
|
- lib/shards/workflow/fast_terminal.rb
|
222
226
|
- lib/shards/workflow/terminal.rb
|
223
227
|
- lib/shards/workflow/workflow.rb
|
data/lib/settings/workflow.yaml
DELETED
@@ -1,126 +0,0 @@
|
|
1
|
-
---
|
2
|
-
# see shared_steps to find the steps not defined in a workflow
|
3
|
-
terminal:
|
4
|
-
|
5
|
-
ask_client:
|
6
|
-
question: Type the client name, please.
|
7
|
-
wrong_message: The client name %s.
|
8
|
-
correct: ask_location
|
9
|
-
wrong: ask_for_repeat
|
10
|
-
min_size: 2
|
11
|
-
|
12
|
-
ask_location:
|
13
|
-
question: Type the location mumber, please.
|
14
|
-
wrong_message: The location %s is not in the list.
|
15
|
-
correct: ask_stage
|
16
|
-
wrong: ask_for_repeat
|
17
|
-
|
18
|
-
ask_stage:
|
19
|
-
question: Type stage number, please.
|
20
|
-
wrong_message: The stage %s is not in the list.
|
21
|
-
correct: ask_domain
|
22
|
-
wrong: ask_for_repeat
|
23
|
-
|
24
|
-
ask_domain:
|
25
|
-
question: Type the domain name, please.
|
26
|
-
wrong_message: The domain name %s.
|
27
|
-
correct: check_shard_presence_in_shards
|
28
|
-
wrong: ask_for_repeat
|
29
|
-
min_size: 3
|
30
|
-
regex: ^[a-zA-Z0-9_]*$
|
31
|
-
|
32
|
-
ask_for_exit_and_restart:
|
33
|
-
question: Type 'r' to restart the process, another key to finish.
|
34
|
-
wrong_message: Process Interrupted.
|
35
|
-
correct: ask_location
|
36
|
-
wrong: finish
|
37
|
-
|
38
|
-
ask_for_repeat:
|
39
|
-
question: Wrong answer, type 'r' to repeat the step, another key to finish.
|
40
|
-
correct: repeat_previous_method
|
41
|
-
wrong_message: Process Interrupted. Cleanning the repo and exit.
|
42
|
-
wrong: finish
|
43
|
-
|
44
|
-
repeat_previous_method:
|
45
|
-
correct: repeat_previous_method
|
46
|
-
wrong: finish
|
47
|
-
|
48
|
-
|
49
|
-
fastterminal:
|
50
|
-
|
51
|
-
validate_client:
|
52
|
-
correct: validate_domain
|
53
|
-
wrong: clean_repo_and_exit
|
54
|
-
wrong_message: The client name %s.
|
55
|
-
min_size: 2
|
56
|
-
|
57
|
-
validate_domain:
|
58
|
-
correct: validate_location
|
59
|
-
wrong: clean_repo_and_exit
|
60
|
-
wrong_message: The domain %s.
|
61
|
-
min_size: 3
|
62
|
-
regex: ^[a-zA-Z0-9_]*$
|
63
|
-
|
64
|
-
validate_location:
|
65
|
-
correct: validate_stage
|
66
|
-
wrong_message: Location %s does not exist.
|
67
|
-
wrong: clean_repo_and_exit
|
68
|
-
|
69
|
-
validate_stage:
|
70
|
-
correct: check_shard_presence_in_shards
|
71
|
-
wrong_message: Stage %s does not exist.
|
72
|
-
wrong: clean_repo_and_exit
|
73
|
-
|
74
|
-
shared_steps:
|
75
|
-
|
76
|
-
check_shard_presence_in_shards:
|
77
|
-
wrong_message: The shard %s exists in shards.
|
78
|
-
correct: check_database_presence_in_server
|
79
|
-
wrong: finish
|
80
|
-
|
81
|
-
check_database_presence_in_server:
|
82
|
-
wrong_message: The database %s exists in server %s.
|
83
|
-
correct: check_domain_dns_presence
|
84
|
-
wrong: finish
|
85
|
-
|
86
|
-
check_domain_dns_presence:
|
87
|
-
wrong_message: There is already a record for the host %s.
|
88
|
-
correct: check_domain_presence_in_sites
|
89
|
-
wrong: finish
|
90
|
-
|
91
|
-
check_domain_presence_in_sites:
|
92
|
-
wrong_message: The domain %s is already present in sites.
|
93
|
-
correct: write_yaml_files
|
94
|
-
wrong: finish
|
95
|
-
|
96
|
-
write_yaml_files:
|
97
|
-
question: Type Y to confirm the changes
|
98
|
-
wrong_message: Undo changes
|
99
|
-
correct: create_database
|
100
|
-
wrong: clean_repo_and_exit
|
101
|
-
|
102
|
-
create_database:
|
103
|
-
message: The database %s has been successfully created in %s.
|
104
|
-
wrong_message: Error. Couldn't create the database %s in %s.
|
105
|
-
correct: commit_changes
|
106
|
-
wrong: clean_repo_and_exit
|
107
|
-
|
108
|
-
commit_changes:
|
109
|
-
message: The changes has been committed and pushed to the remote repository.
|
110
|
-
wrong_message: We had an issue to commit and push the changes.
|
111
|
-
correct: dns_upsert
|
112
|
-
wrong: finish
|
113
|
-
|
114
|
-
dns_upsert:
|
115
|
-
message: The dns record with the host %s has been succesfully created.
|
116
|
-
wrong_message: Error. Could not register the host %s as a dns record.
|
117
|
-
correct: finish
|
118
|
-
wrong: finish
|
119
|
-
|
120
|
-
clean_repo_and_exit:
|
121
|
-
wrong_message: Cuould not clean the repository.
|
122
|
-
correct: finish
|
123
|
-
|
124
|
-
finish:
|
125
|
-
correct: final_step
|
126
|
-
|