tengine_resource 0.5.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. data/.document +5 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +30 -0
  4. data/Gemfile.lock +106 -0
  5. data/README.rdoc +20 -0
  6. data/Rakefile +42 -0
  7. data/VERSION +1 -0
  8. data/bin/tengine_resource_watchd +8 -0
  9. data/config/.gitignore +2 -0
  10. data/config/watchd.yml.erb.example +52 -0
  11. data/lib/tengine/resource.rb +29 -0
  12. data/lib/tengine/resource/config.rb +6 -0
  13. data/lib/tengine/resource/config/resource.rb +194 -0
  14. data/lib/tengine/resource/credential.rb +156 -0
  15. data/lib/tengine/resource/credential/ec2.rb +5 -0
  16. data/lib/tengine/resource/credential/ec2/dummy.rb +148 -0
  17. data/lib/tengine/resource/credential/ec2/launch_options.rb +179 -0
  18. data/lib/tengine/resource/drivers/resource_control_driver.rb +58 -0
  19. data/lib/tengine/resource/net_ssh.rb +134 -0
  20. data/lib/tengine/resource/observer.rb +25 -0
  21. data/lib/tengine/resource/physical_server.rb +7 -0
  22. data/lib/tengine/resource/provider.rb +82 -0
  23. data/lib/tengine/resource/provider/ec2.rb +187 -0
  24. data/lib/tengine/resource/provider/wakame.rb +615 -0
  25. data/lib/tengine/resource/server.rb +62 -0
  26. data/lib/tengine/resource/virtual_server.rb +62 -0
  27. data/lib/tengine/resource/virtual_server_image.rb +34 -0
  28. data/lib/tengine/resource/virtual_server_type.rb +21 -0
  29. data/lib/tengine/resource/watcher.rb +121 -0
  30. data/lib/tengine_resource.rb +4 -0
  31. data/spec/fixtures/goku_at_ec2_ap_northeast.rb +177 -0
  32. data/spec/mongoid.yml +35 -0
  33. data/spec/spec_helper.rb +40 -0
  34. data/spec/support/ec2.rb +129 -0
  35. data/spec/support/mongo_index_key_log.rb +91 -0
  36. data/spec/tengine/resource/bugfix/watcher_for_wakame_spec.rb +232 -0
  37. data/spec/tengine/resource/credential_spec.rb +205 -0
  38. data/spec/tengine/resource/drivers/resource_control_driver_spec.rb +84 -0
  39. data/spec/tengine/resource/net_ssh_spec.rb +148 -0
  40. data/spec/tengine/resource/physical_server_spec.rb +47 -0
  41. data/spec/tengine/resource/provider/ec2_spec.rb +473 -0
  42. data/spec/tengine/resource/provider/test_files/describe_host_nodes.json +22 -0
  43. data/spec/tengine/resource/provider/test_files/describe_images.json +23 -0
  44. data/spec/tengine/resource/provider/test_files/describe_instance_specs.json +23 -0
  45. data/spec/tengine/resource/provider/test_files/describe_instances.json +56 -0
  46. data/spec/tengine/resource/provider/test_files/run_instances.json +30 -0
  47. data/spec/tengine/resource/provider/test_files/terminate_instances.json +3 -0
  48. data/spec/tengine/resource/provider/wakame/00_describe_host_nodes_0_physical_servers.json +8 -0
  49. data/spec/tengine/resource/provider/wakame/01_describe_host_nodes_10_physical_servers.json +139 -0
  50. data/spec/tengine/resource/provider/wakame/02_describe_host_nodes_60_physical_servers.json +795 -0
  51. data/spec/tengine/resource/provider/wakame/10_describe_instances_0_virtual_servers.json +8 -0
  52. data/spec/tengine/resource/provider/wakame/11_describe_instances_10_virtual_servers.json +469 -0
  53. data/spec/tengine/resource/provider/wakame/12_describe_instances_after_run_instances.json +280 -0
  54. data/spec/tengine/resource/provider/wakame/13_describe_instances_after_terminate_instances.json +279 -0
  55. data/spec/tengine/resource/provider/wakame/20_describe_images_0_virtual_server_images.json +8 -0
  56. data/spec/tengine/resource/provider/wakame/21_describe_images_5_virtual_server_images.json +84 -0
  57. data/spec/tengine/resource/provider/wakame/22_describe_images_60_virtual_server_images.json +856 -0
  58. data/spec/tengine/resource/provider/wakame/30_describe_instance_specs_0_virtual_server_specs.json +8 -0
  59. data/spec/tengine/resource/provider/wakame/31_describe_instance_specs_4_virtual_server_specs.json +66 -0
  60. data/spec/tengine/resource/provider/wakame/40_run_instances_0_virtual_servers.json +1 -0
  61. data/spec/tengine/resource/provider/wakame/41_run_instances_1_virtual_servers.json +22 -0
  62. data/spec/tengine/resource/provider/wakame/42_run_instances_5_virtual_servers.json +106 -0
  63. data/spec/tengine/resource/provider/wakame/50_terminate_instances_0_virtual_servers.json +1 -0
  64. data/spec/tengine/resource/provider/wakame/51_terminate_instances_3_virtual_servers.json +5 -0
  65. data/spec/tengine/resource/provider/wakame/sync_physical_servers_spec.rb +114 -0
  66. data/spec/tengine/resource/provider/wakame/sync_virtual_server_images_spec.rb +116 -0
  67. data/spec/tengine/resource/provider/wakame/sync_virtual_server_types_spec.rb +116 -0
  68. data/spec/tengine/resource/provider/wakame/sync_virtual_servers_spec.rb +216 -0
  69. data/spec/tengine/resource/provider/wakame_api_spec.rb +319 -0
  70. data/spec/tengine/resource/provider/wakame_spec.rb +339 -0
  71. data/spec/tengine/resource/provider_spec.rb +252 -0
  72. data/spec/tengine/resource/server_spec.rb +195 -0
  73. data/spec/tengine/resource/test_files/.gitignore +6 -0
  74. data/spec/tengine/resource/test_files/00_describe_host_nodes_0_physical_servers.json +8 -0
  75. data/spec/tengine/resource/test_files/01_describe_host_nodes_10_physical_servers.json +139 -0
  76. data/spec/tengine/resource/test_files/02_describe_host_nodes_60_physical_servers.json +795 -0
  77. data/spec/tengine/resource/test_files/10_describe_instances_0_virtual_servers.json +8 -0
  78. data/spec/tengine/resource/test_files/11_describe_instances_10_virtual_servers.json +469 -0
  79. data/spec/tengine/resource/test_files/12_describe_instances_after_run_instances.json +280 -0
  80. data/spec/tengine/resource/test_files/13_describe_instances_after_terminate_instances.json +279 -0
  81. data/spec/tengine/resource/test_files/14_describe_instances_after_run_1_instance.json +55 -0
  82. data/spec/tengine/resource/test_files/20_describe_images_0_virtual_server_images.json +8 -0
  83. data/spec/tengine/resource/test_files/21_describe_images_5_virtual_server_images.json +84 -0
  84. data/spec/tengine/resource/test_files/22_describe_images_60_virtual_server_images.json +856 -0
  85. data/spec/tengine/resource/test_files/30_describe_instance_specs_0_virtual_server_specs.json +8 -0
  86. data/spec/tengine/resource/test_files/31_describe_instance_specs_4_virtual_server_specs.json +66 -0
  87. data/spec/tengine/resource/test_files/40_run_instances_0_virtual_servers.json +1 -0
  88. data/spec/tengine/resource/test_files/41_run_instances_1_virtual_servers.json +22 -0
  89. data/spec/tengine/resource/test_files/42_run_instances_5_virtual_servers.json +106 -0
  90. data/spec/tengine/resource/test_files/43_run_instances_1_virtual_servers_without_aws_availability_zone.json +22 -0
  91. data/spec/tengine/resource/test_files/50_terminate_instances_0_virtual_servers.json +1 -0
  92. data/spec/tengine/resource/test_files/51_terminate_instances_3_virtual_servers.json +5 -0
  93. data/spec/tengine/resource/virtual_server_image_spec.rb +94 -0
  94. data/spec/tengine/resource/virtual_server_spec.rb +116 -0
  95. data/spec/tengine/resource/virtual_server_type_spec.rb +4 -0
  96. data/spec/tengine/resource/watcher_spec.rb +1026 -0
  97. data/spec/tengine_resource_spec.rb +5 -0
  98. data/tengine_resource.gemspec +171 -0
  99. data/tmp/log/.gitignore +1 -0
  100. metadata +286 -0
data/spec/mongoid.yml ADDED
@@ -0,0 +1,35 @@
1
+ defaults: &defaults
2
+ # mongoid defaults for configurable settings
3
+ # autocreate_indexes: false
4
+ # allow_dynamic_fields: true
5
+ # include_root_in_json: false
6
+ # parameterize_keys: true
7
+ persist_in_safe_mode: true
8
+ # raise_not_found_error: true
9
+ # reconnect_time: 3
10
+ logger: false
11
+
12
+ development:
13
+ <<: *defaults
14
+ host: localhost
15
+ database: tengine_resource_development
16
+
17
+ test:
18
+ <<: *defaults
19
+ host: localhost
20
+ database: tengine_resource_test
21
+ autocreate_indexes: true
22
+
23
+ # set these environment variables on your prod server
24
+ production:
25
+ <<: *defaults
26
+ host: <%= ENV['MONGOID_HOST'] %>
27
+ port: <%= ENV['MONGOID_PORT'] %>
28
+ username: <%= ENV['MONGOID_USERNAME'] %>
29
+ password: <%= ENV['MONGOID_PASSWORD'] %>
30
+ database: <%= ENV['MONGOID_DATABASE'] %>
31
+ # slaves:
32
+ # - host: slave1.local
33
+ # port: 27018
34
+ # - host: slave2.local
35
+ # port: 27019
@@ -0,0 +1,40 @@
1
+ # -*- coding: utf-8 -*-
2
+ ENV["RACK_ENV"] ||= "test" # Mongoid.load!で参照しています
3
+
4
+ require 'simplecov'
5
+ SimpleCov.start if ENV["COVERAGE"]
6
+
7
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
8
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
9
+ require 'rspec'
10
+ # require 'factory_girl'
11
+
12
+ require 'tengine_resource'
13
+ require 'mongoid'
14
+ Mongoid.load!(File.expand_path('mongoid.yml', File.dirname(__FILE__)))
15
+ Mongoid.database.connection.drop_database(Mongoid.database.name)
16
+
17
+ # Requires supporting files with custom matchers and macros, etc,
18
+ # in ./support/ and its subdirectories.
19
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
20
+
21
+ # Requires fixtures files in ./fixtures/ and its subdirectories.
22
+ Dir["#{File.dirname(__FILE__)}/fixtures/**/*.rb"].each {|f| require f}
23
+
24
+ Tengine::Core::MethodTraceable.disabled = true
25
+ require 'logger'
26
+ log_path = File.expand_path("../tmp/log/test.log", File.dirname(__FILE__))
27
+ Tengine.logger = Logger.new(log_path)
28
+ Tengine.logger.level = Logger::DEBUG
29
+ Tengine::Core.stdout_logger = Logger.new(log_path)
30
+ Tengine::Core.stdout_logger.level = Logger::DEBUG
31
+ Tengine::Core.stderr_logger = Logger.new(log_path)
32
+ Tengine::Core.stderr_logger.level = Logger::DEBUG
33
+
34
+ Tengine::Core::Kernel.event_exception_reporter = :raise_all
35
+
36
+ RSpec.configure do |config|
37
+ # config.include Factory::Syntax::Methods
38
+ end
39
+
40
+ # Dir["#{File.expand_path('factories', File.dirname(__FILE__))}/**/*.rb"].each {|f| require f}
@@ -0,0 +1,129 @@
1
+ # -*- coding: utf-8 -*-
2
+ def setup_ec2_images
3
+ klass = Tengine::Resource::VirtualServerImage
4
+ Tengine::Resource::VirtualServerImage.delete_all
5
+ result = [
6
+ # us-west-1
7
+ klass.create!(:name => "ami-10101010mysql", :provided_id => "ami-10101000", :description => "MySQL server"), # *1 同じAMI ID
8
+ klass.create!(:name => "ami-10101010rails", :provided_id => "ami-10101000", :description => "Rails App Server"), # *1 同じAMI ID
9
+ klass.create!(:name => "ami-10102000" , :provided_id => "ami-10102000", :description => "Nginx Server"),
10
+ # us-west-2
11
+ klass.create!(:name => "ami-10103000" , :provided_id => "ami-10103000", :description => "APP1 servers"),
12
+ klass.create!(:name => "ami-10104000" , :provided_id => "ami-10104000", :description => "APP2 servers"),
13
+ ]
14
+ end
15
+
16
+
17
+ def setup_ec2_stub(images = setup_ec2_images)
18
+ mock_ec2 = mock(:ec2)
19
+ mock_ec2.stub!(:describe_regions).and_return([
20
+ "eu-west-1", "us-east-1", "us-west-1", "ap-southeast-1"
21
+ ])
22
+ mock_ec2.stub!(:describe_availability_zones).and_return([
23
+ {:region_name=>"us-west-1", :zone_name=>"us-west-1a", :zone_state=>"available"},
24
+ {:region_name=>"us-west-1", :zone_name=>"us-west-1b", :zone_state=>"available"},
25
+ ])
26
+ mock_ec2.stub!(:describe_key_pairs).and_return([
27
+ {:aws_key_name=>"goku" , :aws_fingerprint=>"7c:89:2f:c9:4a:1c:02:65:1b:14:dc:a5:c9:a0:da:fb:46:08:4a:97"},
28
+ {:aws_key_name=>"dev" , :aws_fingerprint=>"7c:89:2f:c9:4a:1c:02:65:1b:14:dc:a5:c9:a0:da:fb:46:08:4a:98"},
29
+ {:aws_key_name=>"default", :aws_fingerprint=>"7c:89:2f:c9:4a:1c:02:65:1b:14:dc:a5:c9:a0:da:fb:46:08:4a:99"},
30
+ ])
31
+ mock_ec2.stub!(:describe_security_groups).and_return([
32
+ { :aws_owner=>"892601002221", :aws_group_name=>"default", :aws_description=>"default group",
33
+ :aws_perms=>[{:owner=>"892601002221", :group=>"default"}, {:from_port=>"22", :to_port=>"22", :cidr_ips=>"0.0.0.0/0", :protocol=>"tcp"}]},
34
+ { :aws_owner=>"892601002221", :aws_group_name=>"hadoop-dev", :aws_description=>"for developmewnt with hadoop",
35
+ :aws_perms=>[{:from_port=>"80", :to_port=>"80", :cidr_ips=>"0.0.0.0/0", :protocol=>"tcp"}]},
36
+ { :aws_owner=>"892601002221", :aws_group_name=>"ruby-dev", :aws_description=>"for developmewnt with ruby",
37
+ :aws_perms=>[{:from_port=>"80", :to_port=>"80", :cidr_ips=>"0.0.0.0/0", :protocol=>"tcp"}]},
38
+ ])
39
+ mock_ec2.stub!(:describe_images).
40
+ with(images.map(&:provided_id).uniq).
41
+ and_return([
42
+ {
43
+ :aws_id=>images[0].provided_id, # "ami-012b7a44",
44
+ :aws_architecture=>"i386", :root_device_type=>"instance-store",
45
+ :aws_kernel_id=>"aki-f70657b2", :aws_ramdisk_id=>"ari-ff0657ba",
46
+ :root_device_name=>"/dev/sda5",
47
+ :aws_location=>"zeus-technology-us-west-1/zeus-load-balancer-60r2-v2-100tps-100mbps-32bit.manifest.xml",
48
+ :aws_image_type=>"machine", :aws_state=>"available",
49
+ :aws_owner=>"106430830294", :aws_is_public=>true,
50
+ :aws_product_codes=>["F6F58AC9"]
51
+ },
52
+ {
53
+ :aws_id=>images[2].provided_id, # "ami-05530240",
54
+ :aws_architecture=>"x86_64", :root_device_type=>"ebs",
55
+ :aws_kernel_id=>"aki-6f3c6d2a", :aws_ramdisk_id=>"ari-693c6d2c",
56
+ :root_device_name=>"/dev/sda1",
57
+ :aws_location=>"063491364108/ubuntu-8.04.3-hardy-server-amd64-20091130",
58
+ :aws_image_type=>"machine",
59
+ :description=>"Ubuntu 8.04.3 Hardy server amd64 20091130", :aws_state=>"available",
60
+ :aws_owner=>"063491364108", :aws_is_public=>true,
61
+ :block_device_mappings=>[{:ebs_volume_size=>15, :ebs_delete_on_termination=>true, :device_name=>"/dev/sda1", :ebs_snapshot_id=>"snap-ea54fb82"}],
62
+ :name=>"ubuntu-8.04.3-hardy-server-amd64-20091130"
63
+ }
64
+ ])
65
+
66
+ mock_ec2.stub!(:describe_images_by_owner).with("amazon").and_return([
67
+ # kernels = conn.describe_images_by_owner('amazon').select{|i| i[:aws_image_type] == "kernel"}
68
+ # kernels.select{|k| h[:aws_architecture] == "i386"} の中から抜粋
69
+ {:root_device_type=>"instance-store", :aws_location=>"ec2-paid-ibm-images-us-west-1/vmlinuz-2.6.16.60-0.29-xenpae.i386.manifest.xml", :aws_image_type=>"kernel", :aws_state=>"available", :aws_owner=>"470254534024", :aws_is_public=>true, :image_owner_alias=>"amazon", :aws_id=>"aki-00000000", :aws_architecture=>"i386"},
70
+ {:root_device_type=>"instance-store", :aws_location=>"ec2-paid-ibm-images-us-west-1/vmlinuz-2.6.16.60-0.29-xenpae.i386.manifest.xml", :aws_image_type=>"kernel", :aws_state=>"available", :aws_owner=>"470254534024", :aws_is_public=>true, :image_owner_alias=>"amazon", :aws_id=>"aki-11111111", :aws_architecture=>"i386"},
71
+ # kernels.select{|k| h[:aws_architecture] == "x86_64"} の中から抜粋
72
+ {:root_device_type=>"instance-store", :aws_location=>"ec2-public-images-us-west-1/ec2-vmlinuz-2.6.21.7-2.fc8xen.x86_64.manifest.xml", :aws_image_type=>"kernel", :aws_state=>"available", :aws_owner=>"206029621532", :aws_is_public=>true, :image_owner_alias=>"amazon", :aws_id=>"aki-22222222", :aws_architecture=>"x86_64"},
73
+ {:root_device_type=>"instance-store", :aws_location=>"ec2-public-images-us-west-1/pv-grub-hd0-V1.01-x86_64.gz.manifest.xml" , :aws_image_type=>"kernel", :aws_state=>"available", :aws_owner=>"206029621532", :aws_is_public=>true, :image_owner_alias=>"amazon", :aws_id=>"aki-33333333", :aws_architecture=>"x86_64"},
74
+
75
+ # ramdisks = conn.describe_images_by_owner('amazon').select{|i| i[:aws_image_type] == "ramdisk"}
76
+ # ramdisks.select{|k| h[:aws_architecture] == "i386"} の中から抜粋
77
+ {:root_device_type=>"instance-store", :aws_location=>"ec2-paid-ibm-images-us-west-1/initrd-2.6.16.60-0.29-xenpae.i386.manifest.xml", :aws_image_type=>"ramdisk", :aws_state=>"available", :aws_owner=>"470254534024", :aws_is_public=>true, :image_owner_alias=>"amazon", :aws_id=>"ari-00000000", :aws_architecture=>"i386"},
78
+ {:root_device_type=>"instance-store", :aws_location=>"ec2-paid-ibm-images-us-west-1/initrd-2.6.16.60-0.29-xenpae.i386.manifest.xml", :aws_image_type=>"ramdisk", :aws_state=>"available", :aws_owner=>"470254534024", :aws_is_public=>true, :image_owner_alias=>"amazon", :aws_id=>"ari-11111111", :aws_architecture=>"i386"},
79
+ # ramdisks.select{|k| h[:aws_architecture] == "x86_64"} の中から抜粋
80
+ {:root_device_type=>"instance-store", :aws_location=>"ec2-public-images-us-west-1/ec2-initrd-2.6.21.7-2.fc8xen.x86_64.manifest.xml" , :aws_image_type=>"ramdisk", :aws_state=>"available", :aws_owner=>"206029621532", :aws_is_public=>true, :image_owner_alias=>"amazon", :aws_id=>"ari-22222222", :aws_architecture=>"x86_64"},
81
+ {:root_device_type=>"instance-store", :aws_location=>"ec2-public-images-us-west-1/initrd-2.6.21.7-2.ec2.v1.1.fc8xen-x86_64-lvm-rootVG-rootFS.manifest.xml", :aws_image_type=>"ramdisk", :aws_state=>"available", :aws_owner=>"206029621532", :aws_is_public=>true, :name=>"initrd-2.6.21.7-2.ec2.v1.1.fc8xen-x86_64-lvm-rootVG-rootFS", :image_owner_alias=>"amazon", :aws_id=>"ari-33333333", :aws_architecture=>"x86_64"},
82
+ ])
83
+
84
+ # http://rightscale.rubyforge.org/right_aws_gem_doc/classes/RightAws/Ec2.html#M000285
85
+ mock_ec2.stub!(:run_instances).with("ami-e444444d", 1, 1, ["my_awesome_group"], "my_awesome_key", "", nil, "m1.small", "aki-9905e0f0", "ari-8605e0ef", "us-east-1b", nil).and_return([
86
+ {
87
+ :aws_image_id => "ami-e444444d",
88
+ :aws_reason => "",
89
+ :aws_state_code => "0",
90
+ :aws_owner => "000000000888",
91
+ :aws_instance_id => "i-123f1234",
92
+ :aws_reservation_id => "r-aabbccdd",
93
+ :aws_state => "pending",
94
+ :dns_name => "",
95
+ :ssh_key_name => "my_awesome_key",
96
+ :aws_groups => ["my_awesome_group"],
97
+ :private_dns_name => "",
98
+ :aws_instance_type => "m1.small",
99
+ :aws_launch_time => "2008-1-1T00:00:00.000Z",
100
+ :aws_ramdisk_id => "ari-8605e0ef",
101
+ :aws_kernel_id => "aki-9905e0f0",
102
+ :ami_launch_index => "0",
103
+ :aws_availability_zone => "us-east-1b",
104
+ }
105
+ ])
106
+
107
+ # http://rightscale.rubyforge.org/right_aws_gem_doc/classes/RightAws/Ec2.html#M000287
108
+ mock_ec2.stub!(:terminate_instances).with(['i-f222222d','i-f222222e']).and_return(
109
+ [{:aws_shutdown_state => "shutting-down",
110
+ :aws_instance_id => "i-f222222d",
111
+ :aws_shutdown_state_code => 32,
112
+ :aws_prev_state => "running",
113
+ :aws_prev_state_code => 16},
114
+ {:aws_shutdown_state => "shutting-down",
115
+ :aws_instance_id => "i-f222222e",
116
+ :aws_shutdown_state_code => 32,
117
+ :aws_prev_state => "running",
118
+ :aws_prev_state_code => 16}]
119
+ )
120
+ mock_ec2.stub!(:terminate_instances).with(['i-f222222d']).and_return(
121
+ [{:aws_shutdown_state => "shutting-down",
122
+ :aws_instance_id => "i-f222222d",
123
+ :aws_shutdown_state_code => 32,
124
+ :aws_prev_state => "running",
125
+ :aws_prev_state_code => 16},]
126
+ )
127
+
128
+ mock_ec2
129
+ end
@@ -0,0 +1,91 @@
1
+ # -*- coding: utf-8 -*-
2
+ # 使い方
3
+ # テスト実行時に 環境変数MONGO_INDEX_KEY_LOGにログの出力先のファイル名を指定しておくと、
4
+ # そこにmongoに対してどんな検索条件やソート、ヒントなどをどのように指定しているのかを出力できます
5
+ #
6
+ # この出力された結果のファイルに対して sort と uniq をかけることにより、どんなインデックスを
7
+ # 作れば良いのか判断する材料となります。
8
+ #
9
+ # export MONGO_INDEX_KEY_LOG=$HOME/tmp/mongo_index_key.log
10
+ # cd tenigne_core && rake spec
11
+ # cd tenigne_resource && rake spec
12
+ # cd tenigne_job && rake spec
13
+ # cd tenigne_console && rake spec
14
+ # cd $HOME/tmp
15
+ # cat mongo_index_key.log | sort | uniq > mongo_index_key_summary.log
16
+ #
17
+ # これで $HOME/tmp/mongo_index_key_summary.log にどのようなキーが使われているのかがまとめられます
18
+ #
19
+ if ENV['MONGO_INDEX_KEY_LOG']
20
+ file_path = File.expand_path(ENV['MONGO_INDEX_KEY_LOG'])
21
+ STDOUT.puts("MONGO_INDEX_KEY_LOG enable logging key infomation for index to #{file_path}")
22
+
23
+ Mongo::Collection.class_eval do
24
+ def index_key_log_file
25
+ unless defined?(@@index_key_log_file)
26
+ file_path = File.expand_path(ENV['MONGO_INDEX_KEY_LOG'])
27
+ @@index_key_log_file = File.open(file_path, "a")
28
+ end
29
+ @@index_key_log_file
30
+ end
31
+
32
+ def find_with_index_key_log(selector={}, opts={}, &block)
33
+ result = find_without_index_key_log(selector, opts, &block)
34
+ index_key_log_file.puts("#{self.name}.find({#{_hash_keys_(selector)}}, {#{_hash_keys_(opts.dup)}}): #{_explain_summary_(result.explain)}")
35
+ result
36
+ end
37
+ alias_method :find_without_index_key_log, :find
38
+ alias_method :find, :find_with_index_key_log
39
+
40
+
41
+ def find_and_modify_with_index_key_log(opts={}, &block)
42
+ o = opts.dup
43
+ query = o.delete(:query)
44
+ index_key_log_file.puts("#{self.name}.find_and_modify({#{_hash_keys_(query)}}, {#{_hash_keys_(o)}})")
45
+ find_and_modify_without_index_key_log(opts, &block)
46
+ end
47
+ alias_method :find_and_modify_without_index_key_log, :find_and_modify
48
+ alias_method :find_and_modify, :find_and_modify_with_index_key_log
49
+
50
+ def _hash_keys_(hash)
51
+ res = []
52
+ [:sort, :hint, :limit].each do |key|
53
+ if value = hash.delete(key)
54
+ res << "#{key.inspect} => #{value.inspect}"
55
+ end
56
+ end
57
+ res += hash.keys.map(&:inspect)
58
+ res.join(',')
59
+ end
60
+
61
+ def _explain_summary_(hash)
62
+ case cursor = hash['cursor']
63
+ when /^BtreeCursor/ then
64
+ res = []
65
+ %w[cursor].each do |key|
66
+ if value = hash.delete(key)
67
+ res << "#{key.inspect} => #{value.inspect}"
68
+ end
69
+ end
70
+ res += hash.keys.map(&:inspect)
71
+ "{" << res.join(',') << "}"
72
+ else
73
+ res = []
74
+ res << "'cursor' => #{hash.delete('cursor').inspect}"
75
+ {"nscanned" => 1, "nscannedObjects" => 1, "n" => 1, "millis" => 0, "nYields"=>0, "nChunkSkips"=>0 }.each do |key, border|
76
+ if value = hash.delete(key)
77
+ if value > border
78
+ res << "#{key.inspect} => '>#{border.inspect}'"
79
+ else
80
+ res << "#{key.inspect} => #{value.inspect}"
81
+ end
82
+ end
83
+ end
84
+ res += hash.keys.map(&:inspect)
85
+ "{" << res.join(',') << "}"
86
+ end
87
+ end
88
+
89
+ end
90
+
91
+ end
@@ -0,0 +1,232 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+ require 'eventmachine'
4
+ require 'amqp'
5
+ require 'tengine/mq/suite'
6
+ require 'apis/wakame'
7
+ require 'controllers/controller'
8
+
9
+ describe Tengine::Resource::Provider::Wakame do
10
+
11
+ before :all do
12
+ class Tengine::Resource::VirtualServerType
13
+ def destroy; $stdout.puts "invoked"; super; end
14
+ end
15
+ class Tengine::Resource::VirtualServerImage
16
+ def destroy; $stdout.puts "invoked"; super; end
17
+ end
18
+ class Tengine::Resource::PhysicalServer
19
+ def destroy; $stdout.puts "invoked"; super; end
20
+ end
21
+ class Tengine::Resource::VirtualServer
22
+ def destroy; $stdout.puts "invoked"; super; end
23
+ end
24
+ end
25
+
26
+ after :all do
27
+ Tengine::Resource::VirtualServerType.class_eval { remove_method :destroy }
28
+ Tengine::Resource::VirtualServerImage.class_eval { remove_method :destroy }
29
+ Tengine::Resource::PhysicalServer.class_eval { remove_method :destroy }
30
+ Tengine::Resource::VirtualServer.class_eval { remove_method :destroy }
31
+ end
32
+
33
+ before do
34
+ Tengine::Resource::Provider.delete_all
35
+ @provider_wakame = Tengine::Resource::Provider::Wakame.create!({
36
+ :name => "wakame-vdc",
37
+ :description => "",
38
+ :properties => {
39
+ :key_name => "ssh-xxxxx"
40
+ },
41
+ :polling_interval => 5,
42
+ :connection_settings => {
43
+ :account => "tama_account1",
44
+ :ec2_host => "10.10.10.10",
45
+ :ec2_port => 80,
46
+ :ec2_protocol => "https",
47
+ :wakame_host => "192.168.0.10",
48
+ :wakame_port => 8080,
49
+ :wakame_protocol => "http",
50
+ },
51
+ })
52
+ Tengine::Resource::VirtualServerType.delete_all
53
+ @virtual_server_type_wakame = @provider_wakame.virtual_server_types.create!({
54
+ :provided_id => "is-demospec",
55
+ :caption => "is-demospec",
56
+ :cpu_cores => 2,
57
+ :memory_size => 512,
58
+ :properties => {
59
+ :arch => "x86_64",
60
+ :hypervisor => "kvm",
61
+ :account_id => "a-shpoolxx",
62
+ :vifs => "--- \neth0: \n :bandwidth: 100000\n :index: 0\n",
63
+ :quota_weight => "1.0",
64
+ :drives => "--- \nephemeral1: \n :type: :local\n :size: 100\n :index: 0\n",
65
+ :created_at => "2011-10-28T02:58:57Z",
66
+ :updated_at => "2011-10-28T02:58:57Z",
67
+ }
68
+ })
69
+ Tengine::Resource::VirtualServerImage.delete_all
70
+ @virtual_server_image_wakame = @provider_wakame.virtual_server_images.create!({
71
+ :name => "vimage",
72
+ :description => "",
73
+ :provided_id => "wmi-lucid6",
74
+ :provided_description => "ubuntu-10.04_with-metadata_kvm_i386.raw volume",
75
+ })
76
+ Tengine::Resource::PhysicalServer.delete_all
77
+ @physical_server_wakame = @provider_wakame.physical_servers.create!({
78
+ :name => "demohost",
79
+ :description => "",
80
+ :provided_id => "hp-demohost",
81
+ :status => "online",
82
+ :addresses => {},
83
+ :address_order => [],
84
+ :cpu_cores => 100,
85
+ :memory_size => 400000,
86
+ :properties => {
87
+ :uuid => "hp-demohost",
88
+ :account_id => "a-shpoolxx",
89
+ :arch => "x86_64",
90
+ :hypervisor => "kvm",
91
+ :created_at => "2011-10-18T03:53:24Z",
92
+ :updated_at => "2011-10-18T03:53:24Z",
93
+ }
94
+ })
95
+ Tengine::Resource::VirtualServer.delete_all
96
+ @provider_wakame.virtual_servers.create!({
97
+ :name => "vhost",
98
+ :description => "",
99
+ :provided_id => "i-jria301q",
100
+ :provided_image_id => "wmi-lucid5",
101
+ :provided_type_id => "is-demospec",
102
+ :host_server => @physical_server_wakame,
103
+ :status => "running",
104
+ :addresses => {
105
+ "private_ip_address" => "192.168.2.188",
106
+ "nw-data" => "192.168.2.188",
107
+ },
108
+ :address_order => ["private_ip_address"],
109
+ :properties => {
110
+ :aws_kernel_id => "",
111
+ :aws_launch_time => "2011-10-18T06:51:16Z",
112
+ :tags => {},
113
+ :aws_reservation_id => "",
114
+ :aws_owner => "a-shpoolxx",
115
+ :instance_lifecycle => "",
116
+ :block_device_mappings => [{
117
+ :ebs_volume_id => "",
118
+ :ebs_status => "",
119
+ :ebs_attach_time => "",
120
+ :ebs_delete_on_termination => false,
121
+ :device_name => ""
122
+ }],
123
+ :ami_launch_index => "",
124
+ :root_device_name => "",
125
+ :aws_ramdisk_id => "",
126
+ :aws_availability_zone => "hp-demohost",
127
+ :aws_groups => nil,
128
+ :spot_instance_request_id => "",
129
+ :ssh_key_name => nil,
130
+ :virtualization_type => "",
131
+ :placement_group_name => "",
132
+ :requester_id => "",
133
+ :aws_product_codes => [],
134
+ :client_token => "",
135
+ :architecture => "x86_64",
136
+ :aws_state_code => 0,
137
+ :root_device_type => "",
138
+ :monitoring_state => "",
139
+ :aws_reason => ""
140
+ }
141
+ })
142
+
143
+ @tama_controller_factory = mock(::Tama::Controllers::ControllerFactory.allocate)
144
+ ::Tama::Controllers::ControllerFactory.
145
+ stub(:create_controller).
146
+ with("tama_account1", "10.10.10.10", 80, "https", "192.168.0.10", 8080, "http").
147
+ and_return(@tama_controller_factory)
148
+ end
149
+
150
+ describe :sync_virtual_server_types do
151
+ it "削除の通知は一度しか行われない" do
152
+ @tama_controller_factory.stub(:describe_instance_specs).with([]).and_return([])
153
+
154
+ # 一度も呼び出されない
155
+ @provider_wakame.should_not_receive(:dirrefential_update_virtual_server_type_hashs)
156
+ @provider_wakame.should_not_receive(:create_virtual_server_type_hashs)
157
+ # 一度だけ呼び出される
158
+ $stdout.should_receive(:puts).with("invoked").once
159
+
160
+ 3.times do
161
+ @provider_wakame.virtual_server_type_watch
162
+ end
163
+ end
164
+ end
165
+
166
+ describe :sync_virtual_server_images do
167
+ # bug [大量にTengine::Resource::VirtualServer.destroyed.tengine_resource_watchdという種別名イベントが登録されつづけている]
168
+ it "削除の通知は一度しか行われない" do
169
+ @tama_controller_factory.stub(:describe_instances).with([]).and_return([])
170
+
171
+ # 一度も呼び出されない
172
+ @provider_wakame.should_not_receive(:dirrefential_update_virtual_server_hashs)
173
+ @provider_wakame.should_not_receive(:create_virtual_server_hashs)
174
+ # 一度だけ呼び出される
175
+ $stdout.should_receive(:puts).with("invoked").once
176
+
177
+ 3.times do
178
+ @provider_wakame.virtual_server_watch
179
+ end
180
+ end
181
+ end
182
+
183
+ describe :sync_virtual_server_images do
184
+ it "削除の通知は一度しか行われない" do
185
+ @tama_controller_factory.stub(:describe_images).with([]).and_return([])
186
+
187
+ # 一度も呼び出されない
188
+ @provider_wakame.should_not_receive(:dirrefential_update_virtual_server_image_hashs)
189
+ @provider_wakame.should_not_receive(:create_virtual_server_image_hashs)
190
+ # 一度だけ呼び出される
191
+ $stdout.should_receive(:puts).with("invoked").once
192
+
193
+ 3.times do
194
+ @provider_wakame.virtual_server_image_watch
195
+ end
196
+ end
197
+ end
198
+
199
+ describe :sync_virtual_servers do
200
+ # bug [大量にTengine::Resource::VirtualServer.destroyed.tengine_resource_watchdという種別名イベントが登録されつづけている]
201
+ it "削除の通知は一度しか行われない" do
202
+ @tama_controller_factory.stub(:describe_instances).with([]).and_return([])
203
+
204
+ # 一度も呼び出されない
205
+ @provider_wakame.should_not_receive(:dirrefential_update_virtual_server_hashs)
206
+ @provider_wakame.should_not_receive(:create_virtual_server_hashs)
207
+ # 一度だけ呼び出される
208
+ $stdout.should_receive(:puts).with("invoked").once
209
+
210
+ 3.times do
211
+ @provider_wakame.virtual_server_watch
212
+ end
213
+ end
214
+ end
215
+
216
+ describe :sync_physical_servers do
217
+ it "削除の通知は一度しか行われない" do
218
+ @tama_controller_factory.stub(:describe_host_nodes).with([]).and_return([])
219
+
220
+ # 一度も呼び出されない
221
+ @provider_wakame.should_not_receive(:dirrefential_update_physical_server_hashs)
222
+ @provider_wakame.should_not_receive(:create_physical_server_hashs)
223
+ # 一度だけ呼び出される
224
+ $stdout.should_receive(:puts).with("invoked").once
225
+
226
+ 3.times do
227
+ @provider_wakame.physical_server_watch
228
+ end
229
+ end
230
+ end
231
+
232
+ end