Class: Elasticsearch::Drain::AutoScaling

Inherits:
Object
  • Object
show all
Includes:
Util
Defined in:
lib/elasticsearch/drain/autoscaling.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Util

#to_thor, #wait_until

Constructor Details

#initialize(asg, region) ⇒ AutoScaling

Returns a new instance of AutoScaling.



14
15
16
17
18
19
# File 'lib/elasticsearch/drain/autoscaling.rb', line 14

def initialize(asg, region)
  @asg = asg
  @region = region
  @instances = nil
  @instance_ids = nil
end

Instance Attribute Details

#asgObject (readonly)

EC2 AutoScaling Group name



8
9
10
# File 'lib/elasticsearch/drain/autoscaling.rb', line 8

def asg
  @asg
end

#regionObject (readonly)

AWS region



12
13
14
# File 'lib/elasticsearch/drain/autoscaling.rb', line 12

def region
  @region
end

Instance Method Details

#asg_clientObject



21
22
23
# File 'lib/elasticsearch/drain/autoscaling.rb', line 21

def asg_client
  Aws::AutoScaling::Client.new(region: region)
end

#describe_autoscaling_groupStruct

Describe an AutoScaling Group

Returns:

  • (Struct)

    AutoScaling Group



58
59
60
61
62
63
# File 'lib/elasticsearch/drain/autoscaling.rb', line 58

def describe_autoscaling_group
  groups = asg_client.describe_auto_scaling_groups(
    auto_scaling_group_names: [asg]
  )
  groups.auto_scaling_groups.first
end

#describe_instancesArray<Aws::EC2::Types::Instance>

Get instances in an AutoScaling Group

Returns:

  • (Array<Aws::EC2::Types::Instance>)

    EC2 Instance objects



44
45
46
47
48
49
50
51
52
53
# File 'lib/elasticsearch/drain/autoscaling.rb', line 44

def describe_instances
  instances = []
  find_instances_in_asg if @instance_ids.nil?
  return [] if @instance_ids.empty?
  ec2_client.describe_instances(instance_ids: @instance_ids).each do |page|
    instances << page.reservations.map(&:instances)
  end
  instances.flatten!
  @instances = instances
end

#desired_capacityInteger

Gets the DesiredCapacity of an AutoScalingGroup

Returns:

  • (Integer)

    Value of DesiredCapacity of an AutoScalingGroup



111
112
113
114
# File 'lib/elasticsearch/drain/autoscaling.rb', line 111

def desired_capacity
  group = describe_autoscaling_group
  group.desired_capacity
end

#detach_instance(instance_id) ⇒ Object



116
117
118
119
120
121
122
123
124
125
126
# File 'lib/elasticsearch/drain/autoscaling.rb', line 116

def detach_instance(instance_id)
  current_desired_capacity = desired_capacity
  asg_client.detach_instances(
    instance_ids: [instance_id],
    auto_scaling_group_name: asg,
    should_decrement_desired_capacity: true
  )
  wait_until(current_desired_capacity - 1) do
    desired_capacity
  end
end

#ec2_clientObject



25
26
27
# File 'lib/elasticsearch/drain/autoscaling.rb', line 25

def ec2_client
  Aws::EC2::Client.new(region: region)
end

#find_instances_in_asgObject



29
30
31
32
33
34
35
36
37
38
39
# File 'lib/elasticsearch/drain/autoscaling.rb', line 29

def find_instances_in_asg
  instances = []
  asg_client.describe_auto_scaling_instances.each do |page|
    instances << page.auto_scaling_instances.map do |i|
      i.instance_id if i.auto_scaling_group_name == asg
    end
  end
  instances.flatten!
  instances.compact!
  @instance_ids = instances
end

#find_private_ipsObject



65
66
67
68
69
70
71
# File 'lib/elasticsearch/drain/autoscaling.rb', line 65

def find_private_ips
  instances = describe_instances.clone
  return [] if instances.nil?
  instances.map!(&:private_ip_address)
  instances.flatten!
  instances
end

#instance(ipaddress) ⇒ Object



78
79
80
81
82
83
84
# File 'lib/elasticsearch/drain/autoscaling.rb', line 78

def instance(ipaddress)
  describe_instances if @instances.nil?
  instances = @instances.clone
  instance = instances.find { |i| i.private_ip_address == ipaddress }
  fail Errors::NodeNotFound if instance.nil?
  instance
end

#instancesObject



73
74
75
76
# File 'lib/elasticsearch/drain/autoscaling.rb', line 73

def instances
  find_instances_in_asg
  find_private_ips
end

#min_sizeInteger

Gets the MinSize of an AutoScalingGroup

Returns:

  • (Integer)

    Value of MinSize of an AutoScalingGroup



103
104
105
106
# File 'lib/elasticsearch/drain/autoscaling.rb', line 103

def min_size
  group = describe_autoscaling_group
  group.min_size
end

#min_size=(count = 0) ⇒ Struct

Sets the MinSize of an AutoScalingGroup

Parameters:

  • [FixNum] (Hash)

    a customizable set of options

Returns:

  • (Struct)

    Empty response from the sdk



90
91
92
93
94
95
96
97
98
# File 'lib/elasticsearch/drain/autoscaling.rb', line 90

def min_size=(count = 0)
  asg_client.update_auto_scaling_group(
    auto_scaling_group_name: asg,
    min_size: count
  )
  wait_until(count) do
    min_size
  end
end