Class: Lono::Sets::Status

Inherits:
Object
  • Object
show all
Extended by:
Memoist
Includes:
AwsServices, Summarize, TimeSpent
Defined in:
lib/lono/sets/status.rb,
lib/lono/sets/status/instance.rb,
lib/lono/sets/status/instances.rb

Defined Under Namespace

Classes: Instance, Instances

Constant Summary collapse

@@instances_status_waiter_started =
false

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from TimeSpent

#show_time_spent

Methods included from Utils::PrettyTime

#pretty_time

Methods included from Summarize

#summarize

Methods included from AwsServices

#cfn, #ec2, #iam, #s3, #s3_presigner, #s3_resource, #sts

Methods included from AwsServices::Helper

#rollback_complete?, #testing_update?

Methods included from AwsServices::StackSet

#find_stack_set, #stack_set_exists?

Methods included from AwsServices::Stack

#find_stack, #stack_exists?

Constructor Details

#initialize(options = {}) ⇒ Status

Returns a new instance of Status.



9
10
11
12
13
14
# File 'lib/lono/sets/status.rb', line 9

def initialize(options={})
  @options = options
  @stack, @operation_id = options[:stack], options[:operation_id]
  @shown = []
  @output = "" # for say method and specs
end

Instance Attribute Details

#operation_idObject (readonly)

Returns the value of attribute operation_id.



8
9
10
# File 'lib/lono/sets/status.rb', line 8

def operation_id
  @operation_id
end

Instance Method Details

#completed?(status) ⇒ Boolean

describe_stack_set_operation stack_set_operation.status is one of RUNNING, SUCCEEDED, FAILED, STOPPING, STOPPED

Returns:

  • (Boolean)


84
85
86
87
# File 'lib/lono/sets/status.rb', line 84

def completed?(status)
  completed_statuses = %w[SUCCEEDED FAILED STOPPED]
  completed_statuses.include?(status)
end

#display_oneObject



33
34
35
36
37
38
39
40
41
42
# File 'lib/lono/sets/status.rb', line 33

def display_one
  resp = cfn.describe_stack_set_operation(
    stack_set_name: @stack,
    operation_id: operation_id,
  )
  stack_set_operation = resp.stack_set_operation
  show_stack_set_operation(stack_set_operation)
  @shown << stack_set_operation
  resp
end

#latest_operation_idObject



103
104
105
106
107
108
109
# File 'lib/lono/sets/status.rb', line 103

def latest_operation_id
  resp = cfn.list_stack_set_operations(
    stack_set_name: @stack,
    max_results: 1,
  )
  resp.summaries.first.operation_id
end

#say(text) ⇒ Object



78
79
80
# File 'lib/lono/sets/status.rb', line 78

def say(text)
  ENV["LONO_TEST"] ? @output << "#{text}\n" : puts(text)
end

#showObject



44
45
46
47
48
49
50
# File 'lib/lono/sets/status.rb', line 44

def show
  display_one
  o = @options.merge(show_time_spent: false)
  instances_status = Lono::Sets::Instances::Status.new(o)
  instances_status.run
  summarize(operation_id)
end

#show_stack_set_operation(stack_set_operation) ⇒ Object



69
70
71
72
73
74
75
76
# File 'lib/lono/sets/status.rb', line 69

def show_stack_set_operation(stack_set_operation)
  already_shown = @shown.detect do |o|
    o[:status] == stack_set_operation[:status]
  end
  return if already_shown

  say "Stack Set Operation Status: #{stack_set_operation.status}"
end

#stack_instancesObject



111
112
113
# File 'lib/lono/sets/status.rb', line 111

def stack_instances
  Lono::Sets::Status::Instances.new(@options).stack_instances
end

#stack_set_statusObject



89
90
91
92
93
94
95
96
97
# File 'lib/lono/sets/status.rb', line 89

def stack_set_status
  resp = cfn.describe_stack_set_operation(
    stack_set_name: @stack,
    operation_id: operation_id,
  )
  # describe_stack_set_operation stack_set_operation.status is
  # status one of RUNNING, SUCCEEDED, FAILED, STOPPING, STOPPED
  resp.stack_set_operation.status
end

#start_instances_status_waiterObject



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/lono/sets/status.rb', line 53

def start_instances_status_waiter
  return if @@instances_status_waiter_started
  if stack_instances.empty?
    @@instances_status_waiter_started = true
    return
  end

  Thread.new do
    # show_time_spent because we already show it in this status class. Dont want it to show twice.
    o = @options.merge(start_on_outdated: true, show_time_spent: false)
    instances_status = Lono::Sets::Instances::Status.new(o)
    instances_status.run
  end
  @@instances_status_waiter_started = true
end

#waitObject



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/lono/sets/status.rb', line 16

def wait
  status = nil
  until completed?(status)
    resp = display_one
    stack_set_operation = resp.stack_set_operation
    status = stack_set_operation.status
    # always sleep delay even if completed to provide start_instances_status_waiter some extra time to complete
    sleep 5
    if completed?(status)
      show_time_spent(stack_set_operation)
    else
      start_instances_status_waiter
    end
  end
  status == "SUCCEEDED"
end