Module: PrimaAwsClient

Defined in:
lib/prima_aws_client.rb

Instance Method Summary collapse

Instance Method Details

#appscaling_clientObject



17
18
19
# File 'lib/prima_aws_client.rb', line 17

def appscaling_client
  @appscaling ||= Aws::ApplicationAutoScaling::Client.new
end

#artifact_exists?(bucket, path) ⇒ Boolean

Returns:

  • (Boolean)


227
228
229
230
231
232
233
234
# File 'lib/prima_aws_client.rb', line 227

def artifact_exists?(bucket, path)
  resp = s3_client.list_objects(
    bucket: bucket,
    max_keys: 1,
    prefix: path
  )
  !resp.contents.empty?
end

#asg_clientObject



13
14
15
# File 'lib/prima_aws_client.rb', line 13

def asg_client
  @asg ||= Aws::AutoScaling::Client.new
end

#cf_clientObject



9
10
11
# File 'lib/prima_aws_client.rb', line 9

def cf_client
  @cf ||= Aws::CloudFormation::Client.new
end

#create_stack(stack_name, stack_body, parameters = [], tags = [], role = nil) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/prima_aws_client.rb', line 43

def create_stack(stack_name, stack_body, parameters = [], tags = [], role = nil)
  cf_args = {
    stack_name: stack_name,
    template_body: stack_body,
    parameters: parameters,
    tags: tags,
    capabilities: ['CAPABILITY_IAM'],
    on_failure: 'ROLLBACK'
  }

  if role != nil then
    cf_args.merge!(role_arn: role)
  end

  begin
    cf_client.create_stack(cf_args)
  rescue Aws::CloudFormation::Errors::Throttling, Aws::CloudFormation::Errors::LimitExcedeedException => e
    output 'Throttling, retrying in 15 seconds'.red
    sleep 15
    create_stack(stack_name, stack_body, parameters = [], tags = [])
  else
    output "La creazione dello stack #{stack_name} è stata avviata".green
  end
end

#delete_stack(stack_name) ⇒ Object



135
136
137
138
139
140
141
142
143
144
145
# File 'lib/prima_aws_client.rb', line 135

def delete_stack(stack_name)
  begin
    cf_client.delete_stack(stack_name: stack_name)
  rescue Aws::CloudFormation::Errors::Throttling => e
    output 'Throttling, retrying in 15 seconds'.red
    sleep 15
    delete_stack(stack_name)
  else
    output "Stack #{stack_name} spenta con successo\n".green
  end
end

#get_autoscaling_capacity(asg_name) ⇒ Object



267
268
269
270
# File 'lib/prima_aws_client.rb', line 267

def get_autoscaling_capacity(asg_name)
  resp = asg_client.describe_auto_scaling_groups(auto_scaling_group_names: [asg_name])
  resp.auto_scaling_groups[0].desired_capacity
end

#get_spotfleet_capacity(fleet_arn) ⇒ Object



272
273
274
275
# File 'lib/prima_aws_client.rb', line 272

def get_spotfleet_capacity(fleet_arn)
  resp = appscaling_client.describe_scalable_targets(service_namespace: 'ec2', resource_ids: ["spot-fleet-request/#{fleet_arn}"])
  resp.scalable_targets[0].min_capacity
end

#get_stack_outputs(name) ⇒ Object



188
189
190
191
192
193
194
195
196
197
198
# File 'lib/prima_aws_client.rb', line 188

def get_stack_outputs(name)
  begin
    resp = cf_client.describe_stacks(stack_name: name)
  rescue Aws::CloudFormation::Errors::Throttling => e
    output 'Throttling, retrying in 15 seconds'.red
    sleep 15
    get_stack_outputs(name)
  else
    resp.stacks[0].outputs
  end
end

#get_stack_parameters(name) ⇒ Object



176
177
178
179
180
181
182
183
184
185
186
# File 'lib/prima_aws_client.rb', line 176

def get_stack_parameters(name)
  begin
    resp = cf_client.describe_stacks(stack_name: name)
  rescue Aws::CloudFormation::Errors::Throttling => e
    output 'Throttling, retrying in 15 seconds'.red
    sleep 15
    get_stack_parameters(name)
  else
    resp.stacks[0].parameters
  end
end

#get_stack_tags(name) ⇒ Object



164
165
166
167
168
169
170
171
172
173
174
# File 'lib/prima_aws_client.rb', line 164

def get_stack_tags(name)
  begin
    resp = cf_client.describe_stacks(stack_name: name)
  rescue Aws::CloudFormation::Errors::Throttling => e
    output 'Throttling, retrying in 15 seconds'.red
    sleep 15
    get_stack_tags(name)
  else
    resp.stacks[0].tags
  end
end

#get_stack_template(name) ⇒ Object



200
201
202
203
204
205
206
207
208
209
210
211
# File 'lib/prima_aws_client.rb', line 200

def get_stack_template(name)
  begin
    resp = cf_client.get_template(stack_name: name)
  rescue Aws::CloudFormation::Errors::Throttling => e
    output 'Throttling, retrying in 15 seconds'.red
    sleep 15
    get_stack_template(name)
  else
    resp.template_body
  end

end

#list_import_stacks(export_name) ⇒ Object



247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
# File 'lib/prima_aws_client.rb', line 247

def list_import_stacks(export_name)
  stacks = []
  next_token = ''
  loop do
    print '.'.yellow; STDOUT.flush
    options = next_token != '' ? { export_name: export_name, next_token: next_token } : {export_name: export_name}
    begin
      resp = cf_client.list_imports(options)
    rescue Aws::CloudFormation::Errors::Throttling => e
      output 'Throttling, retrying in 15 seconds'.red
      sleep 15
      resp = cf_client.list_imports(options)
    end
    stacks += resp.imports
    break unless resp.next_token
    next_token = resp.next_token
  end
  stacks
end

#s3_clientObject



5
6
7
# File 'lib/prima_aws_client.rb', line 5

def s3_client
  @s3 ||= Aws::S3::Client.new
end

#stack_exists?(stack_name) ⇒ Boolean

Returns:

  • (Boolean)


120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/prima_aws_client.rb', line 120

def stack_exists?(stack_name)
  begin
    cf_client.describe_stacks(stack_name: stack_name)
  rescue Aws::CloudFormation::Errors::Throttling => e
    output 'Throttling, retrying in 15 seconds'.red
    sleep 15
    stack_exists?(stack_name)
  rescue Aws::CloudFormation::Errors::ValidationError => e
    return false if e.message.include? 'does not exist'
    raise e
  else
    true
  end
end

#stack_listObject



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/prima_aws_client.rb', line 21

def stack_list
  stacks = []
  next_token = ''
  loop do
    print '.'.yellow; STDOUT.flush
    options = next_token != '' ? { next_token: next_token } : {}
    begin
      resp = cf_client.describe_stacks(options)
    rescue Aws::CloudFormation::Errors::Throttling => e
      output 'Throttling, retrying in 15 seconds'.red
      sleep 15
      resp = cf_client.describe_stacks(options)
    end
    stacks += resp.stacks
    break unless resp.next_token
    next_token = resp.next_token
  end
  puts '.'.yellow; STDOUT.flush
  stacks.keep_if { |stack| stack.stack_name.include? '-qa-' }
  stacks
end

#stack_ready?(stack_name, failed_statuses = ['CREATE_FAILED', 'ROLLBACK_IN_PROGRESS', 'ROLLBACK_FAILED', 'DELETE_IN_PROGRESS', 'DELETE_FAILED', 'DELETE_COMPLETE', 'UPDATE_ROLLBACK_FAILED', 'UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS']) ⇒ Boolean

Returns:

  • (Boolean)


213
214
215
216
217
218
219
220
221
222
223
224
225
# File 'lib/prima_aws_client.rb', line 213

def stack_ready?(stack_name, failed_statuses = ['CREATE_FAILED', 'ROLLBACK_IN_PROGRESS', 'ROLLBACK_FAILED', 'DELETE_IN_PROGRESS', 'DELETE_FAILED', 'DELETE_COMPLETE', 'UPDATE_ROLLBACK_FAILED', 'UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS'])
  begin
    resp = cf_client.describe_stacks(
      stack_name: stack_name
    )
    stack_status = resp.stacks[0].stack_status
  rescue Aws::CloudFormation::Errors::Throttling => e
    print 'Throttling'.red; STDOUT.flush
    return false
  end
  raise "The stack #{stack_name} errored out" if failed_statuses.include? stack_status
  ['CREATE_COMPLETE', 'UPDATE_COMPLETE', 'UPDATE_ROLLBACK_COMPLETE', 'ROLLBACK_COMPLETE'].include? stack_status
end

#update_stack(stack_name, template_body, parameters = [], tags = [], role = nil) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/prima_aws_client.rb', line 68

def update_stack(stack_name, template_body, parameters = [], tags = [], role = nil)
  cf_args = {
    stack_name: stack_name,
    template_body: template_body,
    parameters: parameters,
    tags: tags,
    capabilities: ['CAPABILITY_IAM']
  }

  if role != nil then
    cf_args.merge!(role_arn: role)
  end

  begin
    cf_client.update_stack(cf_args)
  rescue Aws::CloudFormation::Errors::Throttling => e
    output 'Throttling, retrying in 15 seconds'.red
    sleep 15
    update_stack(stack_name, template_body, parameters = [], tags = [])
  rescue Aws::CloudFormation::Errors::ValidationError => e
    raise e
  else
    output "L'update dello stack #{stack_name} è stato avviato".green
  end
end

#update_stack_url(stack_name, template_url, parameters = [], tags = [], role = nil) ⇒ Object



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/prima_aws_client.rb', line 94

def update_stack_url(stack_name, template_url, parameters = [], tags = [], role = nil)
  cf_args = {
    stack_name: stack_name,
    template_url: template_url,
    parameters: parameters,
    tags: tags,
    capabilities: ['CAPABILITY_IAM']
  }

  if role != nil then
    cf_args.merge!(role_arn: role)
  end

  begin
    cf_client.update_stack(cf_args)
  rescue Aws::CloudFormation::Errors::Throttling => e
    output 'Throttling, retrying in 15 seconds'.red
    sleep 15
    update_stack_url(stack_name, template_url, parameters = [], tags = [])
  rescue Aws::CloudFormation::Errors::ValidationError => e
    raise e
  else
    output "L'update dello stack #{stack_name} è stato avviato".green
  end
end

#upload_artifact(source_path, destination_path, bucket_name_override = nil) ⇒ Object



236
237
238
239
240
241
242
243
244
245
# File 'lib/prima_aws_client.rb', line 236

def upload_artifact(source_path, destination_path, bucket_name_override=nil)
  output "Upload dell'artifact in corso (#{(File.size(source_path).to_f / 2**20).round(2)} MiB)\n".yellow
  s3 = Aws::S3::Resource.new
  s3_bucket = if !bucket_name_override.nil? then bucket_name_override else @s3_bucket end
  puts s3_bucket
  obj = s3.bucket(s3_bucket).object(destination_path)
  obj.upload_file(source_path)

  output "#{s3_bucket}/#{destination_path} uploadato con successo!\n".green
end

#wait_for_stack_ready(stack_name, failed_statuses = ['CREATE_FAILED', 'ROLLBACK_IN_PROGRESS', 'ROLLBACK_FAILED', 'DELETE_IN_PROGRESS', 'DELETE_FAILED', 'DELETE_COMPLETE', 'UPDATE_ROLLBACK_FAILED', 'UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS']) ⇒ Object



147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# File 'lib/prima_aws_client.rb', line 147

def wait_for_stack_ready(stack_name, failed_statuses = ['CREATE_FAILED', 'ROLLBACK_IN_PROGRESS', 'ROLLBACK_FAILED', 'DELETE_IN_PROGRESS', 'DELETE_FAILED', 'DELETE_COMPLETE', 'UPDATE_ROLLBACK_FAILED', 'UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS'])
  ready = false
  sleep_seconds = 13
  output "Attendo che lo stack #{stack_name} finisca di essere inizializzato...\n".yellow
  while !ready
    ready = true if stack_ready?(stack_name, failed_statuses)
    seconds_elapsed = 0
    loop do
      break if seconds_elapsed >= sleep_seconds
      print '.'.yellow; STDOUT.flush
      sleep 1
      seconds_elapsed += 1
    end
  end
  output "\nStack #{stack_name} pronto!\n".green
end