Class: Tengine::ResourceEc2::DummyConnection

Inherits:
Object
  • Object
show all
Defined in:
lib/tengine/resource_ec2/dummy_connection.rb

Overview

EC2に実際には接続しないであたかも接続しているかのように見せるためのダミーです。

環境変数EC2_DUMMYがtrueの場合に、RightAws::Ec2の代わりにこのクラスからインスタンスが生成されます。起動してから環境変数EC2_DUMMY_INTERVALで指定された秒数が経過したインスタンス(のダミー)はちゃんとrunningになるようになっています。

10/08/19 13:06:41

akimatter: モックはtestでしか使えません。

10/08/19 13:08:47

akimatter: developmentでは、RightAws::Ec2のインスタンスの代わりのダミー(一般的にはモックって言うけど、specのモックと区別して敢えてダミーします)を使うようにするべきかも。

10/08/19 13:09:19

akimatter: ただし、developmentでもダミーではなくEC2にちゃんと繋ぎたい場合もあるので、

10/08/19 13:09:41

akimatter: 環境変数か何かの設定でこれらの動作が変わる方が良いかと思います。

Constant Summary collapse

STATIC_ATTRS =
{
  :aws_reservation_id=>"r-71a46435",
  :aws_owner=>"000000000888",
  :aws_ramdisk_id=>"ari-c12e7f84",
  :aws_product_codes=>[],
  :monitoring_state=>"disabled",
  :aws_instance_type=>"m1.small",
  :root_device_type=>"instance-store",
  :aws_reason=>"",
  :aws_kernel_id=>"aki-773c6d32",
  :aws_availability_zone=>"us-west-1a"
}
@@last_instance_index =
0

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(access_key, secret_access_key, options = {}) ⇒ DummyConnection

Returns a new instance of DummyConnection.



32
33
34
35
# File 'lib/tengine/resource_ec2/dummy_connection.rb', line 32

def initialize(access_key, secret_access_key, options = {})
  @access_key, @secret_access_key = access_key, secret_access_key
  @options = options || {}
end

Class Method Details

.instancesObject

クラス変数で生成しているインスタンスを保持したいところですが、それだとdevelopmentモードでクラスがロードされる度に保持している内容がクリアされてしまうのでNGでした。他に影響を与えないように実装する手段が他に思いつかなかったので、グローバル変数を使います。cattr_accessor :instances @@instances = {}



21
22
23
# File 'lib/tengine/resource_ec2/dummy_connection.rb', line 21

def self.instances
  $ec2_dummy_instances ||= {}
end

.instances=(value) ⇒ Object



24
25
26
# File 'lib/tengine/resource_ec2/dummy_connection.rb', line 24

def self.instances=(value)
  $ec2_dummy_instances = value
end

Instance Method Details

#describe_availability_zones(*args) ⇒ Object



117
118
119
120
121
122
123
124
# File 'lib/tengine/resource_ec2/dummy_connection.rb', line 117

def describe_availability_zones(*args)
  [
    {:region_name=>"us-east-1", :zone_name=>"us-east-1a", :zone_state=>"available"},
    {:region_name=>"us-east-1", :zone_name=>"us-east-1b", :zone_state=>"available"},
    {:region_name=>"us-east-1", :zone_name=>"us-east-1c", :zone_state=>"available"},
    {:region_name=>"us-east-1", :zone_name=>"us-east-1d", :zone_state=>"available"}
  ]
end

#describe_images(*args) ⇒ Object



130
131
132
# File 'lib/tengine/resource_ec2/dummy_connection.rb', line 130

def describe_images(*args)
  []
end

#describe_images_by_owner(*args) ⇒ Object



126
127
128
# File 'lib/tengine/resource_ec2/dummy_connection.rb', line 126

def describe_images_by_owner(*args)
  []
end

#describe_instances(instance_ids = []) ⇒ Object



80
81
82
83
84
85
86
87
# File 'lib/tengine/resource_ec2/dummy_connection.rb', line 80

def describe_instances(instance_ids = [])
  update_instances
  if instance_ids.empty?
    instances.values.sort_by{|hash| hash[:aws_instance_id]}
  else
    instance_ids.map{|id| instances[id]}
  end
end

#instancesObject



28
29
30
# File 'lib/tengine/resource_ec2/dummy_connection.rb', line 28

def instances
  self.class.instances
end

#launch_instances(image_id, options) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/tengine/resource_ec2/dummy_connection.rb', line 50

def launch_instances(image_id, options)
  launch_time = Time.zone.now
  count = options.delete(:min_count) || 1
  options.delete(:max_count) # :max_countは無視
  idx = 0
  result = []
  count.times do
    instance_index = (self.class.last_instance_index += 1)
    instanceid = "i-DMY%05d" % instance_index
    instance_hash = {
      :aws_instance_id => instanceid,
      :aws_image_id => image_id,
      :state_reason_code=>"pending",
      :ssh_key_name => options[:key_name],
      :aws_groups => options[:group_ids],
      :state_reason_message=>"pending",
      :aws_state_code=>0,
      :dns_name=>"",
      :private_dns_name => "",
      :aws_launch_time => launch_time.iso8601,
      :aws_state => "pending",
      :ami_launch_index => idx.to_s,
    }.update(STATIC_ATTRS.dup)
    idx += 1
    result << instance_hash
    instances[instanceid] = instance_hash
  end
  result
end

#terminate_instances(instance_ids) ⇒ Object



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/tengine/resource_ec2/dummy_connection.rb', line 89

def terminate_instances(instance_ids)
  update_instances
  instance_ids.each do |instance_id|
    update_status_running(instance_id) # 停止する前に一度はrunningにしておく
    hash = instances[instance_id]
    hash.update(
      :state_reason_code=>"Client.UserInitiatedShutdown",
      :state_reason_message=>"Client.UserInitiatedShutdown: User initiated shutdown",
      :aws_state_code=>48,
      :dns_name=>"",
      :private_dns_name=>"",
      :aws_state=>"terminated"
      )
    hash.delete(:ip_address)
    hash.delete(:private_ip_address)
  end
  instance_ids.map do |instance_id|
    {
      :aws_prev_state_name => "running",
      :aws_instance_id => instance_id,
      :aws_current_state_code => 32,
      :aws_current_state_name => "shutting-down",
      :aws_prev_state_code => 16
    }
  end
end