Module: Jets::AwsServices::StackStatus

Included in:
Jets::AwsServices
Defined in:
lib/jets/aws_services/stack_status.rb

Instance Method Summary collapse

Instance Method Details

#lookup(outputs, key) ⇒ Object

Lookup output value. Used in Jets::Resource::ApiGateway::RestApi::* andJets::Commands::Url



54
55
56
57
# File 'lib/jets/aws_services/stack_status.rb', line 54

def lookup(outputs, key)
  out = outputs.find { |o| o.output_key == key }
  out&.output_value
end

#stack_exists?(stack_name) ⇒ Boolean



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/jets/aws_services/stack_status.rb', line 3

def stack_exists?(stack_name)
  return false if ENV['TEST']

  exist = nil
  begin
    # When the stack does not exist an exception is raised. Example:
    # Aws::CloudFormation::Errors::ValidationError: Stack with id blah does not exist
    resp = cfn.describe_stacks(stack_name: stack_name)
    exist = true
  rescue Aws::CloudFormation::Errors::ValidationError => e
    if e.message =~ /does not exist/
      exist = false
    elsif e.message.include?("'stackName' failed to satisfy constraint")
      # Example of e.message when describe_stack with invalid stack name
      # "1 validation error detected: Value 'instance_and_route53' at 'stackName' failed to satisfy constraint: Member must satisfy regular expression pattern: [a-zA-Z][-a-zA-Z0-9]*|arn:[-a-zA-Z0-9:/._+]*"
      puts "Invalid stack name: #{stack_name}"
      puts "Full error message: #{e.message}"
      exit 1
    else
      raise # re-raise exception  because unsure what other errors can happen
    end
  end
  exist
end

#stack_in_progress?(stack_name) ⇒ Boolean

All CloudFormation states listed here: docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-describing-stacks.html

Returns resp so we can use it to grab data about the stack without calling api again.



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/jets/aws_services/stack_status.rb', line 31

def stack_in_progress?(stack_name)
  return true if !stack_exists?(stack_name)

  # Assumes stack exists
  resp = cfn.describe_stacks(stack_name: stack_name)
  status = resp.stacks[0].stack_status
  if status =~ /_IN_PROGRESS$/
    puts "The '#{stack_name}' stack status is #{status}. " \
         "Please wait until the stack is ready and try again.".color(:red)
    exit 0
  elsif resp.stacks[0].outputs.empty? && status != 'ROLLBACK_COMPLETE'
    # This Happens when the miminal stack fails at the very beginning.
    # There is no s3 bucket at all.  User should delete the stack.
    puts "The minimal stack failed to create. Please delete the stack first and try again. " \
    "You can delete the CloudFormation stack or use the `jets delete` command"
    exit 0
  else
    true
  end
end