vagrant-niftycloud 0.1.0.dev

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. data/.gitignore +18 -0
  2. data/CHANGELOG.md +1 -0
  3. data/Gemfile +10 -0
  4. data/LICENSE +8 -0
  5. data/README.md +256 -0
  6. data/Rakefile +21 -0
  7. data/dummy.box +0 -0
  8. data/example_box/README.md +13 -0
  9. data/example_box/metadata.json +3 -0
  10. data/lib/vagrant-niftycloud.rb +18 -0
  11. data/lib/vagrant-niftycloud/action.rb +178 -0
  12. data/lib/vagrant-niftycloud/action/connect_niftycloud.rb +56 -0
  13. data/lib/vagrant-niftycloud/action/is_created.rb +18 -0
  14. data/lib/vagrant-niftycloud/action/message_already_created.rb +16 -0
  15. data/lib/vagrant-niftycloud/action/message_not_created.rb +16 -0
  16. data/lib/vagrant-niftycloud/action/message_will_not_destroy.rb +16 -0
  17. data/lib/vagrant-niftycloud/action/read_ssh_info.rb +52 -0
  18. data/lib/vagrant-niftycloud/action/read_state.rb +56 -0
  19. data/lib/vagrant-niftycloud/action/resume_instance.rb +56 -0
  20. data/lib/vagrant-niftycloud/action/run_instance.rb +131 -0
  21. data/lib/vagrant-niftycloud/action/suspend_instance.rb +56 -0
  22. data/lib/vagrant-niftycloud/action/sync_folders.rb +67 -0
  23. data/lib/vagrant-niftycloud/action/terminate_instance.rb +61 -0
  24. data/lib/vagrant-niftycloud/action/timed_provision.rb +21 -0
  25. data/lib/vagrant-niftycloud/config.rb +210 -0
  26. data/lib/vagrant-niftycloud/errors.rb +35 -0
  27. data/lib/vagrant-niftycloud/plugin.rb +73 -0
  28. data/lib/vagrant-niftycloud/provider.rb +50 -0
  29. data/lib/vagrant-niftycloud/util/timer.rb +17 -0
  30. data/lib/vagrant-niftycloud/version.rb +5 -0
  31. data/locales/en.yml +91 -0
  32. data/spec/vagrant-niftycloud/config_spec.rb +154 -0
  33. data/vagrant-niftycloud.gemspec +57 -0
  34. metadata +157 -0
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ # Development
2
+ .rbenv-gemsets
3
+ .rbenv-version
4
+
5
+ # OS-specific
6
+ .DS_Store
7
+
8
+ # Bundler/Rubygems
9
+ *.gem
10
+ .bundle
11
+ pkg/*
12
+ tags
13
+ Gemfile.lock
14
+
15
+ # Vagrant
16
+ .vagrant
17
+ Vagrantfile
18
+ !example_box/Vagrantfile
data/CHANGELOG.md ADDED
@@ -0,0 +1 @@
1
+ * Initial release.
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ group :development do
6
+ # We depend on Vagrant for development, but we don't add it as a
7
+ # gem dependency because we expect to be installed within the
8
+ # Vagrant environment itself using `vagrant plugin`.
9
+ #gem "vagrant", :git => "git://github.com/mitchellh/vagrant.git"
10
+ end
data/LICENSE ADDED
@@ -0,0 +1,8 @@
1
+ The MIT License (MIT)
2
+ Copyright (c) 2013 Satoshi Akama
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
5
+
6
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
7
+
8
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,256 @@
1
+ # Vagrant NiftyCloud Provider
2
+
3
+ `開発中!まだ動作しません!!`
4
+
5
+ [Vagrant](http://www.vagrantup.com) 1.2以降のバージョンで[ニフティクラウド](http://cloud.nifty.com/)
6
+ を操作するためのprovider機能を追加するプラグインです。
7
+
8
+ Vagrantでニフティクラウド上のサーバインスタンスの制御や[Chef](http://www.opscode.com/chef/)や[Puppet](https://puppetlabs.com/) 等を使ったサーバのprovisioningが可能となります。
9
+
10
+ Chef以外の動作確認は行なっていませんが、プラグインで行なっているのはSSH実行可能な状態にすることとrsyncによるファイル転送だけなので、Vagrantでサポートされているものであれば動作するのではないかと思います。
11
+
12
+ **注意:** このプラグインはVagrant 1.2以降に対応しています。
13
+
14
+ ## 機能
15
+
16
+ * ニフティクラウド上のサーバインスタンスの起動
17
+ * Vagrantから起動したインスタンスへのSSH
18
+ * Chef/Puppet等を使用したインスタンスのprovisioning
19
+ * `rsync`を使用したcookbook等の転送
20
+
21
+ ## Quick Start
22
+
23
+ ### プラグインのインストール
24
+
25
+ まずVagrant 1.2以降をインストールして下さい。
26
+
27
+ vagrant upを実行する前に通常のVagrant使用時と同じようにboxファイルをVagrantに追加する必要があります。
28
+
29
+ 自分でboxファイルを作成するかこちらで用意しているboxファイルを使用して、任意の名前でダミーのboxを追加して下さい。
30
+
31
+ ```
32
+ $ git clone https://github.com/sakama/vagrant-niftycloud.git
33
+ $ cd vagrant-niftycloud
34
+ $ bundle install
35
+ $ bundle exec rake build
36
+ $ vagrant plugin install pkg/vagrant-niftycloud-0.1.0.dev.gem
37
+ $ vagrant box add dummy https://github.com/sakama/vagrant-niftycloud/raw/master/dummy.box
38
+ ...
39
+ ```
40
+
41
+ ### OSイメージの作成
42
+
43
+ Vagrant自体の仕様により、以下の制約があります。
44
+
45
+ * サーバに接続するvagrantユーザがパスワードなしでsudo実行できる必要がある (rootユーザではprovisioning実行に失敗します)
46
+ * sudoがttyなしで実行できる必要がある
47
+ * サーバに接続する際のSSH秘密鍵はパスフレーズが空で設定されている必要がある(rsyncでのファイル同期に失敗します)
48
+
49
+ 以上の理由により、`ニフティクラウド公式のOSイメージでは動作しません`
50
+
51
+ 上記条件をクリアしたサーバイメージをプライベートイメージ等で用意する必要があります。
52
+
53
+ OSイメージ作成の手順は以下のようになります。
54
+
55
+ ```
56
+ ## rootで実行
57
+ # groupadd vagrant
58
+ # useradd vagrant -g vagrant -G wheel
59
+ # passwd vagrant
60
+
61
+ # su - vagrant
62
+ ## vagrantユーザで実行
63
+ $ ssh-keygen -t rsa
64
+ $ mv id_rsa.pub authorized_keys(id_rsaをローカルに保存する=接続する際のSSH秘密鍵となる)
65
+
66
+ ## rootで実行
67
+ # visudo
68
+ # Defaults specificationをコメントアウト
69
+ # 最終行に以下を追加
70
+ # vagrant ALL=(ALL) NOPASSWD: ALL
71
+ ```
72
+
73
+ 作成したイメージのimage_idをVagrantfile内で指定する必要があります。
74
+
75
+ image_idについては[ニフティクラウドSDK for Ruby](http://cloud.nifty.com/api/sdk/#ruby)や[ニフティクラウド CLI](http://cloud.nifty.com/api/cli/) 等を使うと確認可能です。
76
+
77
+ ### Vagrantfileの作成
78
+
79
+ Vagrantfileを以下のような内容で作成します。
80
+
81
+ Vagrantfileの`config.vm.provider`ブロックで各種パラメータを指定して下さい。
82
+
83
+ ```
84
+ Vagrant.configure("2") do |config|
85
+ config.vm.box = "dummy"
86
+
87
+ config.vm.provider :niftycloud do |niftycloud, override|
88
+ niftycloud.access_key_id = ENV["NIFTY_CLOUD_ACCESS_KEY"] || "<Your Access Key ID>"
89
+ niftycloud.secret_access_key = ENV["NIFTY_CLOUD_SECRET_KEY"] || "<Your Secret Access Key>"
90
+
91
+ niftycloud.image_id = "26"
92
+ niftycloud.key_name = "<YOUR SSH KEY NAME>"
93
+ override.ssh.username = "vagrant"
94
+ override.ssh.private_key_path = "PATH TO YOUR PRIVATE KEY"
95
+ end
96
+ end
97
+ ```
98
+
99
+ 以上の手順で`vagrant up`コマンドのproviderオプションに`niftycloud`を指定できるようになります。
100
+
101
+ ### コマンド
102
+
103
+ ```
104
+
105
+ # サーバ立ちあげ、provisioningの実行
106
+ $ vagrant up --provider=niftycloud
107
+
108
+ # 立ち上げたサーバへのprovisioningの実行
109
+ $ vagrant provision
110
+
111
+ # サーバの一時停止
112
+ $ vagrant halt
113
+
114
+ # サーバの一時停止(haltと同じ)
115
+ $ vagrant suspend
116
+
117
+ # 停止中のサーバの起動
118
+ $ vagrant resume
119
+
120
+ # サーバの破棄
121
+ $ vagrant destroy
122
+
123
+ ```
124
+
125
+
126
+ SSH接続やcookbook等を使ったサーバのprovisioningに失敗する場合、以下のような理由が考えられます。
127
+
128
+ * SSHオプションが正しくない
129
+ * SSHオプションに正しい秘密鍵が指定されていない
130
+ * SSH秘密鍵のパーミッションが正しくない
131
+ * vagrantユーザによるパスワード無しでのsudo実行が不可となっている
132
+ * sudoがttyなしで実行不可となっている
133
+ * ニフティクラウドのFirewallルールによりSSH接続が遮断されている
134
+
135
+ 共通設定についてはboxファイル中に含めることもできます。
136
+
137
+ こちらで用意している"dummy"boxファイルにはデフォルトオプションは指定されていません。
138
+
139
+
140
+ ## Box Format
141
+
142
+ 自分でboxファイルを作成したい場合[examble_box](https://github.com/sakama/vagrant-niftycloud/tree/master/example_box)を参考にして下さい。
143
+
144
+ こちらのディレクトリにはboxの作成方法についてのドキュメントも置いてあります。
145
+
146
+ boxフォーマットには`metadata.json`が必要です。
147
+
148
+ このjsonファイル中に指定された値は`Vagrantfile` と同様に、providerとしてniftycloudを指定した場合のデフォルト値として扱われます。
149
+
150
+
151
+ ## 設定
152
+
153
+ 以下の様なパラメータに対応しています。
154
+
155
+
156
+ * `access_key_id` - ニフティクラウドのAccessKey。[コントロールパネルから取得した値](http://cloud.nifty.com/help/status/api_key.htm)を指定して下さい。
157
+ * `image_id` - サーバ立ち上げ時に指定するimage_id。ニフティクラウド公式のOSイメージでは動作しません。
158
+ * `key_name` - サーバ接続時に使用するSSHキー名。[コントロールパネルで設定した値](http://cloud.nifty.com/help/netsec/ssh_key.htm)を指定して下さい。
159
+ * `zone` - ニフティクラウドのゾーン。例)"east-12"
160
+ * `instance_ready_timeout` - インスタンス起動実行からタイムアウトとなるまでの秒数。デフォルトは300秒です。
161
+ * `instance_type` - サーバタイプ。例)"small2"。指定がない場合のデフォルト値は"mini"です。
162
+ * `secret_access_key` - ニフティクラウドAPI経由でアクセスするためのSecretAccessKey。[コントロールパネルから取得した値](http://cloud.nifty.com/help/status/api_key.htm)を指定して下さい。
163
+ * `firewall` - Firewall名。
164
+
165
+ 上記のパラメータはVagrantfile中で以下のように設定することができます。
166
+
167
+
168
+ ```
169
+ Vagrant.configure("2") do |config|
170
+ # ... other stuff
171
+
172
+ config.vm.provider :niftycloud do |niftycloud, override|
173
+ niftycloud.access_key_id = ENV["NIFTY_CLOUD_ACCESS_KEY"] || "foo"
174
+ niftycloud.secret_access_key = ENV["NIFTY_CLOUD_SECRET_KEY"] || "bar"
175
+ end
176
+ end
177
+ ```
178
+
179
+ トップレベルの設定に加えて、リージョン/ゾーン特有の設定値を使用したい場合にはVagrantfile中で`zone_config`を使用することもできます。
180
+
181
+ 記述は以下のようになります。
182
+
183
+
184
+ ```
185
+ Vagrant.configure("2") do |config|
186
+ # ... other stuff
187
+
188
+ config.vm.provider :niftycloud do |niftycloud, override|
189
+ niftycloud.access_key_id = "foo"
190
+ niftycloud.secret_access_key = "bar"
191
+ niftycloud.zone = "east-12"
192
+ niftycloud.key_name = "vagrantkey"
193
+ niftycloud.firewall = "test"
194
+ override.ssh.username = "vagrant"
195
+ override.ssh.private_key_path = "/path/to/private_key.pem"
196
+
197
+ # シンプルな書き方
198
+ niftycloud.zone_config "east-12", :image_id => 26
199
+
200
+ # より多くの設定を上書きしたい場合
201
+ niftycloud.zone_config "east-13" do |zone|
202
+ zone.image_id = 21
203
+ zone.instance_type = small
204
+ zone.key_name = "vagrantkey2"
205
+ end
206
+ end
207
+ end
208
+ ```
209
+
210
+ zone_configブロックでリージョン/ゾーン特有の設定を指定した場合、そのリージョン/ゾーンでサーバインスタンスを立ち上げる際にはトップレベルの設定値を上書きします。
211
+
212
+ 指定していない設定項目についてはトップレベルの設定値を継承します。
213
+
214
+
215
+ ## VagrantのNetwork機能への対応
216
+
217
+
218
+ Vagrantの`config.vm.network`で設定可能なネットワーク機能については、`vagrant-niftycloud`ではサポートしていません。
219
+
220
+ ## フォルダの同期
221
+
222
+ フォルダの同期についてはshell、chef、puppetといったVagrantのprovisionersを動作させるための最低限のサポートとなります。
223
+
224
+ `vagrant up`、`vagrant reload`、`vagrant provision`コマンドが実行された場合、
225
+ このプラグインは`rsync`を使用しSSH経由でローカル→リモートサーバへの単方向同期を行います。
226
+
227
+
228
+ ## 開発
229
+
230
+ `vagrant-niftycloud`プラグインをこのレポジトリからgit cloneした後、[Bundler](http://gembundler.com) を使用して必要なgem等のインストールを行なって下さい。
231
+
232
+ ```
233
+ $ bundle
234
+ ```
235
+
236
+ 上記コマンド実行後、以下のコマンドにより`rake`を使用したユニットテストを実行することができます。
237
+
238
+ ```
239
+ $ bundle exec rake
240
+ ```
241
+
242
+ ユニットテストが通った場合、プラグインを動作させる準備が整います。
243
+
244
+ プラグインをVagrant実行環境にインストールしなくても以下の操作で実行することが可能です。
245
+
246
+ * トップレベルディレクトリに`Vagrantfile` を作成する(gitignoreしています)
247
+ * bundle execコマンドにより実行
248
+
249
+
250
+ ```
251
+ $ bundle exec vagrant up --provider=niftycloud
252
+ ```
253
+
254
+ ## ライセンス
255
+
256
+ [vagrant-aws](https://github.com/mitchellh/vagrant-aws) をベースに NIFTY Cloud 向けに修正を加えたものです。 オリジナルに準じて MITライセンス を適用します。
data/Rakefile ADDED
@@ -0,0 +1,21 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'rspec/core/rake_task'
4
+
5
+ # Immediately sync all stdout so that tools like buildbot can
6
+ # immediately load in the output.
7
+ $stdout.sync = true
8
+ $stderr.sync = true
9
+
10
+ # Change to the directory of this file.
11
+ Dir.chdir(File.expand_path("../", __FILE__))
12
+
13
+ # This installs the tasks that help with gem creation and
14
+ # publishing.
15
+ Bundler::GemHelper.install_tasks
16
+
17
+ # Install the `spec` task so that we can run tests.
18
+ RSpec::Core::RakeTask.new
19
+
20
+ # Default task is to run the unit tests
21
+ task :default => "spec"
data/dummy.box ADDED
Binary file
@@ -0,0 +1,13 @@
1
+ # Vagrant NiftyCloud Example Box
2
+
3
+ Vagrant providers each require a custom provider-specific box format.
4
+ This folder shows the example contents of a box for the `niftycloud` provider.
5
+ To turn this into a box:
6
+
7
+ ```
8
+ $ tar cvzf niftycloud.box ./metadata.json ./Vagrantfile
9
+ ```
10
+
11
+ This box works by using Vagrant's built-in Vagrantfile merging to setup
12
+ defaults for NiftyCloud. These defaults can easily be overwritten by higher-level
13
+ Vagrantfiles (such as project root Vagrantfiles).
@@ -0,0 +1,3 @@
1
+ {
2
+ "provider": "niftycloud"
3
+ }
@@ -0,0 +1,18 @@
1
+ require "pathname"
2
+
3
+ require "vagrant-niftycloud/plugin"
4
+
5
+ module VagrantPlugins
6
+ module NiftyCloud
7
+ lib_path = Pathname.new(File.expand_path("../vagrant-niftycloud", __FILE__))
8
+ autoload :Action, lib_path.join("action")
9
+ autoload :Errors, lib_path.join("errors")
10
+
11
+ # This returns the path to the source of this plugin.
12
+ #
13
+ # @return [Pathname]
14
+ def self.source_root
15
+ @source_root ||= Pathname.new(File.expand_path("../../", __FILE__))
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,178 @@
1
+ require "pathname"
2
+
3
+ require "vagrant/action/builder"
4
+
5
+ module VagrantPlugins
6
+ module NiftyCloud
7
+ module Action
8
+ # Include the built-in modules so we can use them as top-level things.
9
+ include Vagrant::Action::Builtin
10
+
11
+ # This action is called to terminate the remote machine.
12
+ def self.action_destroy
13
+ Vagrant::Action::Builder.new.tap do |b|
14
+ b.use Call, DestroyConfirm do |env, b2|
15
+ if env[:result]
16
+ b2.use ConfigValidate
17
+ b2.use ConnectNiftyCloud
18
+ b2.use TerminateInstance
19
+ else
20
+ b2.use MessageWillNotDestroy
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ # This action is called when `vagrant provision` is called.
27
+ def self.action_provision
28
+ Vagrant::Action::Builder.new.tap do |b|
29
+ b.use ConfigValidate
30
+ b.use Call, IsCreated do |env, b2|
31
+ if !env[:result]
32
+ b2.use MessageNotCreated
33
+ next
34
+ end
35
+
36
+ b2.use Provision
37
+ b2.use SyncFolders
38
+ end
39
+ end
40
+ end
41
+
42
+ # This action is called to read the SSH info of the machine. The
43
+ # resulting state is expected to be put into the `:machine_ssh_info`
44
+ # key.
45
+ def self.action_read_ssh_info
46
+ Vagrant::Action::Builder.new.tap do |b|
47
+ b.use ConfigValidate
48
+ b.use ConnectNiftyCloud
49
+ b.use ReadSSHInfo
50
+ end
51
+ end
52
+
53
+ # This action is called to read the state of the machine. The
54
+ # resulting state is expected to be put into the `:machine_state_id`
55
+ # key.
56
+ def self.action_read_state
57
+ Vagrant::Action::Builder.new.tap do |b|
58
+ b.use ConfigValidate
59
+ b.use ConnectNiftyCloud
60
+ b.use ReadState
61
+ end
62
+ end
63
+
64
+ # This action is called to SSH into the machine.
65
+ def self.action_ssh
66
+ Vagrant::Action::Builder.new.tap do |b|
67
+ b.use ConfigValidate
68
+ b.use Call, IsCreated do |env, b2|
69
+ if !env[:result]
70
+ b2.use MessageNotCreated
71
+ next
72
+ end
73
+
74
+ b2.use SSHExec
75
+ end
76
+ end
77
+ end
78
+
79
+ def self.action_ssh_run
80
+ Vagrant::Action::Builder.new.tap do |b|
81
+ b.use ConfigValidate
82
+ b.use Call, IsCreated do |env, b2|
83
+ if !env[:result]
84
+ b2.use MessageNotCreated
85
+ next
86
+ end
87
+
88
+ b2.use SSHRun
89
+ end
90
+ end
91
+ end
92
+
93
+ # This action is called to bring the box up from nothing.
94
+ def self.action_up
95
+ Vagrant::Action::Builder.new.tap do |b|
96
+ b.use HandleBoxUrl
97
+ b.use ConfigValidate
98
+ b.use ConnectNiftyCloud
99
+ b.use Call, IsCreated do |env, b2|
100
+ if env[:result]
101
+ b2.use MessageAlreadyCreated
102
+ next
103
+ end
104
+
105
+ b2.use TimedProvision
106
+ b2.use SyncFolders
107
+ b2.use RunInstance
108
+ end
109
+ end
110
+ end
111
+
112
+ # This action is called to suspend the remote machine.
113
+ def self.action_suspend
114
+ Vagrant::Action::Builder.new.tap do |b|
115
+ b.use Call, IsCreated do |env, b2|
116
+ if env[:result]
117
+ b2.use ConfigValidate
118
+ b2.use ConnectNiftyCloud
119
+ b2.use SuspendInstance
120
+ else
121
+ b2.use MessageNotCreated
122
+ next
123
+ end
124
+ end
125
+ end
126
+ end
127
+
128
+ # This action is called to halt the remote machine.
129
+ def self.action_halt
130
+ Vagrant::Action::Builder.new.tap do |b|
131
+ b.use Call, IsCreated do |env, b2|
132
+ if env[:result]
133
+ b2.use ConfigValidate
134
+ b2.use ConnectNiftyCloud
135
+ b2.use SuspendInstance
136
+ else
137
+ b2.use MessageNotCreated
138
+ next
139
+ end
140
+ end
141
+ end
142
+ end
143
+
144
+ # This action is called to resume the remote machine.
145
+ def self.action_resume
146
+ Vagrant::Action::Builder.new.tap do |b|
147
+ b.use Call, IsCreated do |env, b2|
148
+ if env[:result]
149
+ b2.use ConfigValidate
150
+ b2.use ConnectNiftyCloud
151
+ b2.use ResumeInstance
152
+ else
153
+ b2.use MessageNotCreated
154
+ next
155
+ end
156
+ end
157
+ end
158
+ end
159
+
160
+ # The autoload farm
161
+ action_root = Pathname.new(File.expand_path("../action", __FILE__))
162
+ autoload :ConnectNiftyCloud, action_root.join("connect_niftycloud")
163
+ autoload :IsCreated, action_root.join("is_created")
164
+ autoload :MessageAlreadyCreated, action_root.join("message_already_created")
165
+ autoload :MessageNotCreated, action_root.join("message_not_created")
166
+ autoload :MessageWillNotDestroy, action_root.join("message_will_not_destroy")
167
+ autoload :ReadSSHInfo, action_root.join("read_ssh_info")
168
+ autoload :ReadState, action_root.join("read_state")
169
+ autoload :RunInstance, action_root.join("run_instance")
170
+ autoload :SyncFolders, action_root.join("sync_folders")
171
+ autoload :TimedProvision, action_root.join("timed_provision")
172
+ autoload :TerminateInstance, action_root.join("terminate_instance")
173
+ autoload :SuspendInstance, action_root.join("suspend_instance")
174
+ autoload :HaltInstance, action_root.join("suspend_instance")
175
+ autoload :ResumeInstance, action_root.join("resume_instance")
176
+ end
177
+ end
178
+ end