Class: Tengine::ResourceEc2::DummyConnection
- Inherits:
-
Object
- Object
- Tengine::ResourceEc2::DummyConnection
- 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
-
.instances ⇒ Object
クラス変数で生成しているインスタンスを保持したいところですが、 それだとdevelopmentモードでクラスがロードされる度に保持している内容がクリア されてしまうのでNGでした。 他に影響を与えないように実装する手段が他に思いつかなかったので、グローバル変数を使います。 cattr_accessor :instances @@instances = {}.
- .instances=(value) ⇒ Object
Instance Method Summary collapse
- #describe_availability_zones(*args) ⇒ Object
- #describe_images(*args) ⇒ Object
- #describe_images_by_owner(*args) ⇒ Object
- #describe_instances(instance_ids = []) ⇒ Object
-
#initialize(access_key, secret_access_key, options = {}) ⇒ DummyConnection
constructor
A new instance of DummyConnection.
- #instances ⇒ Object
- #launch_instances(image_id, options) ⇒ Object
- #terminate_instances(instance_ids) ⇒ Object
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, = {}) @access_key, @secret_access_key = access_key, secret_access_key = || {} end |
Class Method Details
.instances ⇒ Object
クラス変数で生成しているインスタンスを保持したいところですが、それだと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 |
#instances ⇒ Object
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, ) launch_time = Time.zone.now count = .delete(:min_count) || 1 .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 => [:key_name], :aws_groups => [: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 |