prima-twig 0.23.2 → 0.24.0

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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/bin/twig-feature +214 -11
  3. data/lib/prima_twig.rb +2 -1
  4. metadata +16 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1103e958bce7596f85d39a27300d118ae55e42e2
4
- data.tar.gz: d83a0de45976468aeb21cc1bb6c9509ce41e97f7
3
+ metadata.gz: 3cdb68fcab4e2545accf55a97e9727cc9afb43b5
4
+ data.tar.gz: a3ac16212ed2ea647d1fa56e33dc66ef89ccb616
5
5
  SHA512:
6
- metadata.gz: 1cb03a8d26ca23440dbf6b20d3e8cf450d0b298c0ccd2274dd4abb70dd898e3f2eeed7c70c5a939623d37b30eb597f612613828fdb31d502e77ca191af0e0384
7
- data.tar.gz: 7da4f4f1c6e6383dbc7c312e8c9b62599179e03b13f6d8a778c284750bc8ef67704a44a8da719d70a6614781058784c05e3a9a8eb9dba2baa39f06d95f0aa757
6
+ metadata.gz: 16b7da2afb3f16a1c6b934dcb76c64a61ff545b5ebac08695bbc3648fb715d615a7c3757c2e4e2cfd54e00d2fea8d012f379283e56021d6768f9a3dacff3cdba
7
+ data.tar.gz: 395805863bb009fbd464f032eb17b96728a5082aff89b80d48e0582ce95932290bcc8290f3e45819d960afb0ab87f047a79e7be28df874d09232e17dc97b0f82
data/bin/twig-feature CHANGED
@@ -47,6 +47,14 @@ class Release
47
47
  deploy_shutdown!
48
48
  elsif "update" == args[1]
49
49
  deploy_update!
50
+ elsif "aggregator" == args[1]
51
+ if args[2] and "enable" == args[2]
52
+ deploy_aggregator_enable!
53
+ elsif args[2] and "disable" == args[2]
54
+ deploy_aggregator_disable!
55
+ else
56
+ stop_for_wrong_args()
57
+ end
50
58
  else
51
59
  if args[1]
52
60
  select_branches(args[1])
@@ -57,10 +65,14 @@ class Release
57
65
  end
58
66
  end
59
67
  else
60
- stop_if true, [:wrong_args, ['start', 'finish', 'deploy', 'deploy stop', 'deploy update']]
68
+ stop_for_wrong_args()
61
69
  end
62
70
  end
63
71
 
72
+ def stop_for_wrong_args
73
+ stop_if true, [:wrong_args, ['start', 'finish', 'deploy', 'deploy project_name', 'deploy stop', 'deploy update', 'deploy aggregator enable', 'deploy aggregator disable']]
74
+ end
75
+
64
76
  def start_feature!
65
77
  branch_name = @prima.clean_branch_name(ask('Inserisci il nome del branch (puoi omettere feature/): '.cyan))
66
78
  stop_unless branch_name.length > 0, 'Devi inserire il nome del branch'
@@ -73,6 +85,159 @@ class Release
73
85
  exec_step "git checkout -b " + branch_name
74
86
  end
75
87
 
88
+ def deploy_aggregator_disable!
89
+ output "Disable aggregator"
90
+
91
+ output "Recupero le informazioni relative al puntamento dei record DNS..."
92
+ cloudflare = Rubyflare.connect_with(@prima.config['cloudflare_email'], @prima.config['cloudflare_apikey'])
93
+ dns_records = cloudflare.get("zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records", {"per_page": 100, "type": "CNAME", "content": get_alb_host(@stack_name_alb)})
94
+ stop_if dns_records.body[:result].empty?, "I record DNS degli aggregatori non stanno puntando ad un QA".red
95
+
96
+ output "Recupero le informazioni sui QA attivi..."
97
+ stack_list, envs = get_stacks()
98
+
99
+ env_hash = nil
100
+ unless envs.empty?
101
+ env_hash = envs.detect do |key, tags|
102
+ aggregator_enabled = tags.detect do |tag|
103
+ tag.key === "hostname_pattern_priority" and tag.value === "1"
104
+ end.is_a?(Aws::CloudFormation::Types::Tag)
105
+ aggregator_enabled
106
+ end[0]
107
+ change_hostname_priority(env_hash, hostname_pattern_priority())
108
+ dns_to_staging()
109
+ else
110
+ output "Nessun QA trovato".red
111
+ exit
112
+ end
113
+
114
+ output "Finito!".green
115
+ end
116
+
117
+ def deploy_aggregator_enable!
118
+ output "Enable aggregator"
119
+
120
+ output "Recupero le informazioni relative al puntamento dei record DNS..."
121
+ cloudflare = Rubyflare.connect_with(@prima.config['cloudflare_email'], @prima.config['cloudflare_apikey'])
122
+ dns_records = cloudflare.get("zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records", {"per_page": 100, "type": "CNAME", "content": "staging.prima.it"})
123
+ stop_if dns_records.body[:result].empty?, "I record DNS degli aggregatori stanno gia' puntando ad un QA".red
124
+
125
+ output "Recupero le informazioni sui QA attivi..."
126
+ stack_list, envs = get_stacks()
127
+
128
+ env_hash = nil
129
+ unless envs.empty?
130
+ env_hash = choose do |menu|
131
+ menu.prompt = "Scegli il QA al quale vuoi far puntare gli ambienti di staging dei comparatori: ".cyan
132
+ menu.shell = true
133
+ envs.each do |key, env|
134
+ title = ""
135
+ env.each do |e|
136
+ title << "\n#{e.key.upcase}: #{e.value}"
137
+ end
138
+ msg = "#{@prima.reduce_size(title, 1000)}".light_blue
139
+ menu.choice(msg) { key }
140
+ end
141
+ end
142
+ else
143
+ output "Nessun QA trovato".red
144
+ exit
145
+ end
146
+
147
+ change_hostname_priority(env_hash, "1")
148
+
149
+ dns_records.body[:result].each do |dns|
150
+ if dns[:name] =~ /^\w+\-\w+\-staging\.prima\.it$/
151
+ output "Changing #{dns[:name]} DNS record"
152
+ cloudflare.put("zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records/#{dns[:id]}", {"type": "CNAME", "name": dns[:name], "content": get_alb_host(@stack_name_alb), "proxied": true, "ttl": 1})
153
+ end
154
+ end
155
+
156
+ output "Finito!".green
157
+ end
158
+
159
+ def change_hostname_priority(env_hash, hostname_pattern_priority)
160
+ cluster_stack_name = "ecs-cluster-#{env_hash}"
161
+ tags = get_stack_tags(cluster_stack_name).map do |tag|
162
+ if tag.key === "hostname_pattern_priority"
163
+ {
164
+ key: "hostname_pattern_priority",
165
+ value: hostname_pattern_priority
166
+ }
167
+ else
168
+ tag
169
+ end
170
+ end
171
+
172
+ stack_list.each do |stack|
173
+ if stack.stack_name.match(/#{env_hash}$/)
174
+ stack_name = stack.stack_name
175
+ begin
176
+ @cf.update_stack({
177
+ stack_name: stack_name,
178
+ tags: tags,
179
+ parameters: get_stack_parameters(stack_name),
180
+ template_body: get_stack_template(stack_name),
181
+ capabilities: ["CAPABILITY_IAM"]
182
+ })
183
+ rescue Aws::CloudFormation::Errors::ValidationError => e
184
+ raise e
185
+ else
186
+ output "L'update dello stack #{stack_name} è stato avviato".green
187
+ end
188
+ end
189
+ end
190
+
191
+ stack_list.each do |stack|
192
+ if stack.stack_name.match(/#{env_hash}$/)
193
+ wait_for_stack_ready(stack.stack_name) unless stack_ready?(stack.stack_name)
194
+ end
195
+ end
196
+
197
+ stack_name_web = "ecs-task-web-#{env_hash}"
198
+ parameters = get_stack_parameters(stack_name_web).map do |param|
199
+ if param.parameter_key === "HostnamePatternPriority"
200
+ {
201
+ parameter_key: "HostnamePatternPriority",
202
+ parameter_value: hostname_pattern_priority
203
+ }
204
+ elsif param.parameter_key === "HostnamePatternAggregatorPriority"
205
+ {
206
+ parameter_key: "HostnamePatternAggregatorPriority",
207
+ parameter_value: (hostname_pattern_priority.to_i + 1).to_s
208
+ }
209
+ else
210
+ param
211
+ end
212
+ end
213
+
214
+ begin
215
+ @cf.update_stack({
216
+ stack_name: stack_name_web,
217
+ template_body: get_stack_template(stack_name_web),
218
+ parameters: parameters,
219
+ capabilities: ["CAPABILITY_IAM"]
220
+ })
221
+ rescue Aws::CloudFormation::Errors::ValidationError => e
222
+ raise e
223
+ else
224
+ output "L'update dello stack #{stack_name_web} è stato avviato".green
225
+ end
226
+ wait_for_stack_ready(stack_name_web) unless stack_ready?(stack_name_web)
227
+ end
228
+
229
+ def dns_to_staging
230
+ output "Recupero le informazioni relative al puntamento dei record DNS..."
231
+ cloudflare = Rubyflare.connect_with(@prima.config['cloudflare_email'], @prima.config['cloudflare_apikey'])
232
+ dns_records = cloudflare.get("zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records", {"per_page": 100, "type": "CNAME", "content": get_alb_host(@stack_name_alb)})
233
+ dns_records.body[:result].each do |dns|
234
+ if dns[:name] =~ /^\w+\-\w+\-staging\.prima\.it$/
235
+ output "Changing #{dns[:name]} DNS record"
236
+ cloudflare.put("zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records/#{dns[:id]}", {"type": "CNAME", "name": dns[:name], "content": "staging.prima.it", "proxied": true, "ttl": 1})
237
+ end
238
+ end
239
+ end
240
+
76
241
  def finish_feature!
77
242
  current_branch_name = @prima.twig.current_branch_name
78
243
  stop_unless (current_branch_name =~ /^feature\//), "Non sei su un branch di feature, non posso mergiare nulla"
@@ -127,6 +292,15 @@ class Release
127
292
  end
128
293
  end
129
294
 
295
+ cluster_stack_name = "ecs-cluster-#{env_hash}"
296
+ aggregator_enabled = get_stack_tags(cluster_stack_name).detect do |tag|
297
+ tag.key === "hostname_pattern_priority" and tag.value === "1"
298
+ end.is_a?(Aws::CloudFormation::Types::Tag)
299
+
300
+ if aggregator_enabled
301
+ dns_to_staging()
302
+ end
303
+
130
304
  # Se non ha finito di cancellare le altre non si puo' cancellare il cluster
131
305
  output "Attendo 60 secondi per poter eliminare il cluster ECS"
132
306
  sleep 60
@@ -163,7 +337,9 @@ class Release
163
337
  end
164
338
 
165
339
  envs[env_hash].each do |env|
166
- @projects[env.key] = select_branch_to_deploy(env.key, env.value)
340
+ unless ['hostname_pattern_priority'].include? env.key
341
+ @projects[env.key] = select_branch_to_deploy(env.key, env.value)
342
+ end
167
343
  end
168
344
 
169
345
  deploy_feature!
@@ -177,7 +353,7 @@ class Release
177
353
 
178
354
  deploy_id = Digest::MD5.hexdigest(@projects["prima"][:name] + @projects["backoffice"][:name] + @projects["urania"][:name] + @projects["ermes"][:name] + @projects["bburago"][:name] + @projects["hal9000"][:name] + @projects["fidaty"][:name])
179
355
  @dns_record_identifier = deploy_id
180
-
356
+ hostname_pattern_priority = hostname_pattern_priority()
181
357
  tags = [
182
358
  {
183
359
  key: "prima",
@@ -206,10 +382,22 @@ class Release
206
382
  {
207
383
  key: "fidaty",
208
384
  value: @projects["fidaty"][:name]
385
+ },
386
+ {
387
+ key: "hostname_pattern_priority",
388
+ value: hostname_pattern_priority
209
389
  }
210
390
  ]
211
391
 
212
392
  cluster_stack_name = "ecs-cluster-qa-#{deploy_id}"
393
+
394
+ if stack_exists?(cluster_stack_name)
395
+ tags = get_stack_tags(cluster_stack_name)
396
+ hostname_pattern_priority = tags.detect do |tag|
397
+ tag.key === "hostname_pattern_priority"
398
+ end.value
399
+ end
400
+
213
401
  create_cluster_stack(cluster_stack_name, tags) unless stack_exists?(cluster_stack_name)
214
402
  wait_for_stack_ready(cluster_stack_name) unless stack_ready?(cluster_stack_name)
215
403
 
@@ -282,11 +470,11 @@ class Release
282
470
  },
283
471
  {
284
472
  parameter_key: "HostnamePatternPriority",
285
- parameter_value: hostname_pattern_priority()
473
+ parameter_value: hostname_pattern_priority
286
474
  },
287
475
  {
288
476
  parameter_key: "HostnamePatternAggregatorPriority",
289
- parameter_value: hostname_pattern_priority()
477
+ parameter_value: (hostname_pattern_priority.to_i + 1).to_s
290
478
  }
291
479
  ]
292
480
  if stack_exists?(stack_name_web)
@@ -350,7 +538,7 @@ class Release
350
538
  },
351
539
  {
352
540
  parameter_key: "HostnamePatternPriority",
353
- parameter_value: hostname_pattern_priority()
541
+ parameter_value: hostname_pattern_priority
354
542
  }
355
543
  ]
356
544
  if stack_exists?(stack_name_urania)
@@ -414,7 +602,7 @@ class Release
414
602
  },
415
603
  {
416
604
  parameter_key: "HostnamePatternPriority",
417
- parameter_value: hostname_pattern_priority()
605
+ parameter_value: hostname_pattern_priority
418
606
  }
419
607
  ]
420
608
  if stack_exists?(stack_name_bburago)
@@ -455,7 +643,7 @@ class Release
455
643
  },
456
644
  {
457
645
  parameter_key: "HostnamePatternPriority",
458
- parameter_value: hostname_pattern_priority()
646
+ parameter_value: hostname_pattern_priority
459
647
  }
460
648
  ]
461
649
  if stack_exists?(stack_name_hal9000)
@@ -496,7 +684,7 @@ class Release
496
684
  },
497
685
  {
498
686
  parameter_key: "HostnamePatternPriority",
499
- parameter_value: hostname_pattern_priority()
687
+ parameter_value: hostname_pattern_priority
500
688
  }
501
689
  ]
502
690
  if stack_exists?(stack_name_fidaty)
@@ -535,7 +723,7 @@ class Release
535
723
  },
536
724
  {
537
725
  parameter_key: "HostnamePatternPriority",
538
- parameter_value: hostname_pattern_priority()
726
+ parameter_value: (hostname_pattern_priority.to_i + 10).to_s
539
727
  }
540
728
  ]
541
729
  if stack_exists?(stack_name_backoffice)
@@ -1040,6 +1228,21 @@ class Release
1040
1228
  output "\nStack #{stack_name} pronto!\n".green
1041
1229
  end
1042
1230
 
1231
+ def get_stack_tags(name)
1232
+ resp = @cf.describe_stacks({stack_name: name})
1233
+ resp.stacks[0].tags
1234
+ end
1235
+
1236
+ def get_stack_parameters(name)
1237
+ resp = @cf.describe_stacks({stack_name: name})
1238
+ resp.stacks[0].parameters
1239
+ end
1240
+
1241
+ def get_stack_template(name)
1242
+ resp = @cf.get_template({stack_name: name})
1243
+ resp.template_body
1244
+ end
1245
+
1043
1246
  def stack_list
1044
1247
  resp = @cf.describe_stacks
1045
1248
  stacks = resp.stacks
@@ -1249,7 +1452,7 @@ class Release
1249
1452
  def is_branch_compatible_with_current_twig_version?(project)
1250
1453
  case
1251
1454
  when project == 'prima'
1252
- File.readlines("app/cloudformation/tasks/web.yml").grep(/ApplicationLoadBalancerHttpListenerRule/).size > 0
1455
+ File.readlines("app/cloudformation/tasks/web.yml").grep(/HostnamePatternAggregatorPriority/).size > 0
1253
1456
  when project == 'urania'
1254
1457
  File.readlines("deploy/deploy").grep(/HOSTNAME_PATTERN/).size > 0
1255
1458
  when project == 'backoffice'
data/lib/prima_twig.rb CHANGED
@@ -5,6 +5,7 @@ require 'yaml'
5
5
  require 'rugged'
6
6
  require 'highline/import'
7
7
  require 'aws-sdk'
8
+ require 'rubyflare'
8
9
 
9
10
  class Prima
10
11
  LABEL_REVIEW='review'
@@ -12,7 +13,7 @@ class Prima
12
13
  LABEL_HOTFIX='hotfix'
13
14
  LABEL_NEXT_RELEASE='next release'
14
15
  LABEL_IN_STAGING='in staging'
15
- CONFIG_KEYS=['github', 'mandrill', 'sparkpost']
16
+ CONFIG_KEYS=['github', 'mandrill', 'sparkpost', 'cloudflare_email', 'cloudflare_apikey']
16
17
  attr_reader :gh, :twig, :config, :rugged, :aws
17
18
 
18
19
  def initialize
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prima-twig
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.23.2
4
+ version: 0.24.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matteo Giachino
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2017-06-07 00:00:00.000000000 Z
15
+ date: 2017-06-15 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: twig
@@ -140,6 +140,20 @@ dependencies:
140
140
  - - "~>"
141
141
  - !ruby/object:Gem::Version
142
142
  version: '2.6'
143
+ - !ruby/object:Gem::Dependency
144
+ name: rubyflare
145
+ requirement: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ type: :runtime
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
143
157
  description: Our tools to manage git and github
144
158
  email: matteo.giachino@prima.it
145
159
  executables: