Module: OpsworksRollingDeploy::ElbMethods

Included in:
Services::DeployService
Defined in:
lib/opsworks_rolling_deploy/elb_methods.rb

Constant Summary collapse

ELB_STATUS_INSERVICE =
"InService"
ELB_STATUS_OUTOFSERVICE =
"OutOfService"

Instance Method Summary collapse

Instance Method Details

#add_into_pools(_stack, instance, pools) ⇒ Object



26
27
28
29
30
31
32
33
34
35
# File 'lib/opsworks_rolling_deploy/elb_methods.rb', line 26

def add_into_pools(_stack, instance, pools)
  pools.each do |elb|
    info 'Instance', instance.hostname, instance.ec2_instance_id, "Adding back to pool #{elb.elastic_load_balancer_name}"
    register_instances_with_load_balancer(elb, instance.ec2_instance_id) unless pretend?        
  end

  pools.each do |elb|
    wait_status(elb, instance.ec2_instance_id, ELB_STATUS_INSERVICE)
  end unless pretend?
end

#deregister_instances_from_load_balancer(elb, instance_id) ⇒ Object



37
38
39
40
41
42
43
44
# File 'lib/opsworks_rolling_deploy/elb_methods.rb', line 37

def deregister_instances_from_load_balancer(elb, instance_id)
  elb_client(elb.region).deregister_instances_from_load_balancer({
    load_balancer_name: elb.elastic_load_balancer_name,
      instances: [ # required
        { instance_id:  instance_id }
      ]
      })
end

#get_elb_status(elb, instance_id) ⇒ Object



55
56
57
58
59
60
# File 'lib/opsworks_rolling_deploy/elb_methods.rb', line 55

def get_elb_status(elb, instance_id)
  elb_client(elb.region).describe_instance_health({
    load_balancer_name: elb.elastic_load_balancer_name,
    instances: [ {instance_id: instance_id} ] 
    }).instance_states.last.state
end

#pools_of_instance(_stack, instance) ⇒ Object



6
7
8
9
10
# File 'lib/opsworks_rolling_deploy/elb_methods.rb', line 6

def pools_of_instance(_stack, instance)
  ops_client.describe_elastic_load_balancers({
    layer_ids: instance.layer_ids,
    }).elastic_load_balancers
end

#register_instances_with_load_balancer(elb, instance_id) ⇒ Object



46
47
48
49
50
51
52
53
# File 'lib/opsworks_rolling_deploy/elb_methods.rb', line 46

def register_instances_with_load_balancer(elb, instance_id)
  elb_client(elb.region).register_instances_with_load_balancer({
    load_balancer_name: elb.elastic_load_balancer_name,
      instances: [ # required
        { instance_id:  instance_id }
      ]
      })
end

#remove_from_pools(stack, _app, instance) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/opsworks_rolling_deploy/elb_methods.rb', line 12

def remove_from_pools(stack, _app, instance)
  # XXX I did not figure out how to filter instances running the app 
  pools = pools_of_instance(stack, instance).each do |elb|
    info 'Instance', instance.hostname, instance.ec2_instance_id, "Remove from pool #{elb.elastic_load_balancer_name}"
    deregister_instances_from_load_balancer(elb, instance.ec2_instance_id) unless pretend?        
  end

  pools.each do |elb|
    wait_status(elb, instance.ec2_instance_id, ELB_STATUS_OUTOFSERVICE)
  end unless pretend?

  pools
end

#wait_status(elb, instance_id, status) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/opsworks_rolling_deploy/elb_methods.rb', line 62

def wait_status(elb, instance_id, status)
  $stdout.write get_elb_status(elb, instance_id)
  100.times do
    $stdout.write '.'
    instance_status = get_elb_status(elb, instance_id)
    if instance_status == status
      puts instance_status
      return true 
    end
    sleep 5
  end
  fail "Time out while waiting status"
end