vagrant-iijgp 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. data/.gitignore +17 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.ja.md +106 -0
  5. data/README.md +109 -0
  6. data/Rakefile +1 -0
  7. data/dummy.box +0 -0
  8. data/example_box/README.md +10 -0
  9. data/example_box/Vagrantfile +9 -0
  10. data/example_box/metadata.json +1 -0
  11. data/lib/vagrant-iijgp/action/boot.rb +28 -0
  12. data/lib/vagrant-iijgp/action/check_running.rb +19 -0
  13. data/lib/vagrant-iijgp/action/create_vm.rb +59 -0
  14. data/lib/vagrant-iijgp/action/destroy.rb +27 -0
  15. data/lib/vagrant-iijgp/action/is_created.rb +16 -0
  16. data/lib/vagrant-iijgp/action/is_stopped.rb +16 -0
  17. data/lib/vagrant-iijgp/action/message_already_running.rb +16 -0
  18. data/lib/vagrant-iijgp/action/message_invalid_status.rb +16 -0
  19. data/lib/vagrant-iijgp/action/message_not_created.rb +16 -0
  20. data/lib/vagrant-iijgp/action/message_will_not_destroy.rb +17 -0
  21. data/lib/vagrant-iijgp/action/prepare_iijapi.rb +38 -0
  22. data/lib/vagrant-iijgp/action/read_ssh_info.rb +27 -0
  23. data/lib/vagrant-iijgp/action/read_state.rb +41 -0
  24. data/lib/vagrant-iijgp/action/set_label.rb +25 -0
  25. data/lib/vagrant-iijgp/action/stop_virtual_machine.rb +31 -0
  26. data/lib/vagrant-iijgp/action/sync_folders.rb +96 -0
  27. data/lib/vagrant-iijgp/action/vagrant_tweaks.rb +22 -0
  28. data/lib/vagrant-iijgp/action.rb +182 -0
  29. data/lib/vagrant-iijgp/config.rb +78 -0
  30. data/lib/vagrant-iijgp/errors.rb +19 -0
  31. data/lib/vagrant-iijgp/plugin.rb +53 -0
  32. data/lib/vagrant-iijgp/provider.rb +45 -0
  33. data/lib/vagrant-iijgp/version.rb +5 -0
  34. data/lib/vagrant-iijgp.rb +18 -0
  35. data/locales/en.yml +70 -0
  36. data/sample/Vagrantfile +38 -0
  37. data/vagrant-iijgp.gemspec +28 -0
  38. metadata +179 -0
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in vagrant-iijgp.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Takahiro HIMURA
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.ja.md ADDED
@@ -0,0 +1,106 @@
1
+ # Vagrant IIJ GIO Provider
2
+
3
+ これは [Vagrant](http://www.vagrantup.com) 1.3+ に IIJ GIO ホスティングパッケージサービスの
4
+ 仮想サーバを操作する機能を追加する provider です。
5
+
6
+ ## Features
7
+
8
+ - IIJ GIO ホスティングパッケージサービスの仮想マシンを起動することができます
9
+ - 仮想サーバに SSH ログインができます
10
+ - Chef による仮想サーバの provisioning ができます
11
+ - `rsync` を用いた synced folder をサポートしています
12
+ - IIJ CentOS イメージに対して、いくつかの調整を行ないます
13
+ - root ユーザに対する sudo の `Default requiretty` 設定を無効化します
14
+
15
+ ## Usage
16
+
17
+ 通常の Vagrant 1.1+ 以降のプラグインの導入方法と同様にインストールできます。
18
+ インストール後は、`iijgp` provider を指定して `vagrant up` してください。
19
+ 以下に例を示します
20
+
21
+ ~~~~ {.shell}
22
+ $ vagrant plugin install vagrant-iijgp
23
+ ...
24
+ $ vagrant up --provider=iijgp
25
+ ...
26
+ ~~~~
27
+
28
+ 上記を実行する前に、iijgp 用の Vagrant box を入手しておく必要があります。
29
+
30
+ ## Quick Start
31
+
32
+ プラグインを(前述の通り)インストールした後、
33
+ 手っ取り早く始めるには、ダミーの IIJGP box を使い、
34
+ 詳しいパラメータは `config.vm.provider` ブロックに都度指定する方法があります。
35
+ まず、はじめにダミーの box を任意の名前で追加します:
36
+
37
+ ~~~~ {.shell}
38
+ $ vagrant box add dummy https://...
39
+ ....
40
+ ~~~~
41
+
42
+ 次に、Vagrantfile を以下のように作成し、必要な情報を埋めてください。
43
+
44
+ ~~~~ {.ruby}
45
+ Vagrant.configure("2") do |config|
46
+ config.vm.box = "dummy"
47
+
48
+ config.vm.provider :iijgp do |iijgp, override|
49
+ iijgp.access_key = "YOUR ACCESS KEY"
50
+ iijgp.secret_key = "YOUR SECRET KEY"
51
+ iijgp.gp_service_code = "gpXXXXXXXX"
52
+ iijgp.ssh_public_key = "YOUR PUBLIC SSH KEY"
53
+
54
+ override.ssh.username = "root"
55
+ override.ssh.private_key_path = "#{ENV['HOME']}/.ssh/id_rsa"
56
+ end
57
+
58
+ config.vm.define "vm1" do |c|
59
+ c.vm.provider :iijgp do |iijgp|
60
+ iijgp.gc_service_code = "gcXXXXXXXX"
61
+ end
62
+ end
63
+ end
64
+ ~~~~
65
+
66
+ そして `vagrant up --provider=iijgp vm1` を実行してください。
67
+
68
+ これは、既に GP "gpXXXXXXXX" 内に作成済みの "gcXXXXXXXX" を起動します。
69
+ また、SSH 用の情報が正しく Vagrantfile に設定されていれば、
70
+ SSH と provisioning が行なわれます。
71
+
72
+ もし、あなたが iijgp provider をデフォルトで利用したい場合、
73
+ 以下のようにシェルを設定することで、`vagrant up` だけで iijgp provider が利用できます。
74
+ ~~~~ {.shell}
75
+ export VAGRANT_DEFAULT_PROVIDER=iijgp
76
+ ~~~~
77
+
78
+ ## Box Format
79
+
80
+ 全ての Vagrant provider は、それ用にカスタムの box を導入する必要があります。
81
+ box の例は example_box/ ディレクトリにあります。
82
+
83
+ ## Configuration
84
+
85
+ IIJ GIP provider 固有の設定は以下の通りとなります:
86
+
87
+ - 必須パラメータ
88
+ - `access_key` - IIJ API にアクセスするためのアクセスキー
89
+ - `secret_key` - IIJ API にアクセスするためのシークレット
90
+ - `gp_service_code` - 仮想サーバを実行する gp サービスコード
91
+ - `ssh_public_key` - 仮想サーバにアクセスするための SSH 公開鍵の内容。
92
+ この設定は、仮想サーバを最初に起動する際のみ利用されます。
93
+ もし、SSH キーの設定を変更したい場合、仮想サーバの初期化をするか、
94
+ 手動で ImportRootSshPublicKey API を実行する必要があります。
95
+ - 任意
96
+ - `label` - 仮想サーバのラベル。もし設定が無い場合には vagrant の vm name が利用されます
97
+ - `virtual_machine_type` - 仮想サーバの品目。この設定は新規に仮想サーバを契約する場合のみ必要です
98
+ - `os` - OS の種類。Chef provisioner を利用する場合、CentOS6 のイメージを指定する必要があります
99
+
100
+ ## Contributing
101
+
102
+ 1. Fork it
103
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
104
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
105
+ 4. Push to the branch (`git push origin my-new-feature`)
106
+ 5. Create new Pull Request
data/README.md ADDED
@@ -0,0 +1,109 @@
1
+ # Vagrant IIJ GIO Provider
2
+
3
+ This is a [Vagrant](http://www.vagrantup.com) 1.3+ plugin that adds a IIJGP provider to Vagrant,
4
+ allowing Vagrant to control and provision VMs in IIJ GIO Hosting package service.
5
+
6
+ ## Features
7
+
8
+ - Boot Virtual Machines in IIJ GIO Hosting package service
9
+ - SSH into the VMs.
10
+ - Provision the VMs with the Chef provisioner.
11
+ - Supports synced folder via `rsync`.
12
+ - Do some tweaks for IIJ CentOS VM
13
+ - disabling `Default requiretty` sudo settings for the root user.
14
+
15
+ ## Usage
16
+
17
+ Install using standard Vagrant 1.1+ plugin installation methods.
18
+ After installing, `vagrant up` and specify the `iijgp` provider.
19
+ An example shown below.
20
+
21
+ ~~~~ {.shell}
22
+ $ vagrant plugin install vagrant-iijgp
23
+ ...
24
+ $ vagrant up --provider=iijgp
25
+ ...
26
+ ~~~~
27
+
28
+ Of course prior to doing this, you'll need to obtain a iijgp-compatible box file for Vagrant.
29
+
30
+ ## Quick Start
31
+
32
+ After installing the plugin (instructions above),
33
+ the quickest way to get started is to actually use a dummy IIJGP box
34
+ and specify all the details manually within a `config.vm.provider` block.
35
+ So first, add the dummy box using any name you want:
36
+
37
+ ~~~~ {.shell}
38
+ $ vagrant box add dummy https://github.com/iij/vagrant-iijgp/raw/master/dummy.box
39
+ ....
40
+ ~~~~
41
+
42
+ And then make a Vagrantfile that looks like the following,
43
+ filling in your informathion where necessary.
44
+
45
+ ~~~~ {.ruby}
46
+ Vagrant.configure("2") do |config|
47
+ config.vm.box = "dummy"
48
+
49
+ config.vm.provider :iijgp do |iijgp, override|
50
+ iijgp.access_key = "YOUR ACCESS KEY"
51
+ iijgp.secret_key = "YOUR SECRET KEY"
52
+ iijgp.gp_service_code = "gpXXXXXXXX"
53
+ iijgp.ssh_public_key = "YOUR PUBLIC SSH KEY"
54
+
55
+ override.ssh.username = "root"
56
+ override.ssh.private_key_path = "#{ENV['HOME']}/.ssh/id_rsa"
57
+ end
58
+
59
+ config.vm.define "vm1" do |c|
60
+ c.vm.provider :iijgp do |iijgp|
61
+ iijgp.gc_service_code = "gcXXXXXXXX"
62
+ end
63
+ end
64
+ end
65
+ ~~~~
66
+
67
+ And then run `vagrant up --provider=iijgp vm1`.
68
+
69
+ This will start the VM which is already created and specified with
70
+ the service code "gcXXXXXXXX" in GP "gpXXXXXXXX".
71
+ And if your SSH information was filled in properly,
72
+ SSH and provisioning will work as well.
73
+
74
+ If you always use iijgp provider as default, please set it in your shell setting:
75
+ ~~~~ {.shell}
76
+ export VAGRANT_DEFAULT_PROVIDER=iijgp
77
+ ~~~~
78
+ then you can simply run `vagrant up` with iijgp provider.
79
+
80
+ ## Box Format
81
+
82
+ Every provider in Vagrant must introduce a custom box format.
83
+ This provider introduce `iijgp` boxes.
84
+ You can view an example box in the example_box/ directory.
85
+
86
+ ## Configuration
87
+
88
+ There are some provider specific configuration option to control IIJ GIO VMs:
89
+
90
+ - mandatory parameters
91
+ - `access_key` - The access key for manipulating IIJ API.
92
+ - `secret_key` - The secret key for manipulating IIJ API.
93
+ - `gp_service_code` - The gp service code to launch the VMs.
94
+ - `ssh_public_key` - The SSH public key content to accessing IIJ VMs.
95
+ This is used only for the first start up of the VM.
96
+ If you intend to change the SSH key, you should initialize virtual machine.
97
+ (Or, call ImportRootSshPublicKey API manually...)
98
+ - optional parameters
99
+ - `label` - The label for the VM. If it is missing, the vagrant VM name will be used.
100
+ - `virtual_machine_type` - The type of virtual machine. This setting is only required if you want to add a new VM contract.
101
+ - `os` - The operating system. If you intend to use Chef provisioner, you need to use a kind of CentOS6 images.
102
+
103
+ ## Contributing
104
+
105
+ 1. Fork it
106
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
107
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
108
+ 4. Push to the branch (`git push origin my-new-feature`)
109
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/dummy.box ADDED
Binary file
@@ -0,0 +1,10 @@
1
+ # Vagrant IIJGP 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 `iijgp` provider.
5
+
6
+ To turn this into a box file:
7
+
8
+ ~~~~
9
+ $ fakeroot tar cvzf dummy.box ./metadata.json ./Vagrantfile
10
+ ~~~~
@@ -0,0 +1,9 @@
1
+ # -*- mode: ruby; coding: utf-8 -*-
2
+ # vi: set ft=ruby :
3
+
4
+ Vagrant.configure("2") do |config|
5
+ config.vm.provider :iijgp do |iijgp|
6
+ iijgp.virtual_machine_type = "V10"
7
+ iijgp.os = "CentOS6_64_U"
8
+ end
9
+ end
@@ -0,0 +1 @@
1
+ { "provider": "iijgp" }
@@ -0,0 +1,28 @@
1
+ module VagrantPlugins
2
+ module ProviderIijGp
3
+ module Action
4
+ class Boot
5
+ def initialize(app, env)
6
+ @app = app
7
+ @logger = Log4r::Logger.new("vagrant_iijgp::action::boot")
8
+ end
9
+
10
+ def call(env)
11
+ @env = env
12
+
13
+ env[:ui].info I18n.t("vagrant.actions.vm.boot.booting")
14
+ gp = env[:machine].provider_config.gp_service_code
15
+ gc = env[:machine].id
16
+
17
+ vm = env[:iijapi].gp(gp).gc(gc)
18
+ vm.start
19
+
20
+ env[:ui].info I18n.t("vagrant_iijgp.wait_for_start")
21
+ vm.wait_for_start { env[:ui].info "-- current_status: #{vm.status}" }
22
+
23
+ @app.call(env)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,19 @@
1
+ module VagrantPlugins
2
+ module ProviderIijGp
3
+ module Action
4
+ class CheckRunning
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ if env[:machine].state.id != :running
11
+ raise Vagrant::Errors::VMNotRunningError
12
+ end
13
+
14
+ @app.call(env)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,59 @@
1
+ module VagrantPlugins
2
+ module ProviderIijGp
3
+ module Action
4
+ class CreateVM
5
+ def initialize(app, env)
6
+ @app = app
7
+ @logger = Log4r::Logger.new("vagrant_iijgp::action::create_vm")
8
+ end
9
+
10
+ def call(env)
11
+ @env = env
12
+
13
+ config = env[:machine].provider_config
14
+ gp = config.gp_service_code
15
+
16
+ if env[:machine].id.nil?
17
+ opts = {
18
+ "VirtualMachineType" => config.virtual_machine_type,
19
+ "OS" => config.os,
20
+ "ContractNum" => "1"
21
+ }
22
+ env[:ui].info "-- AddVirtualMachines option: #{opts}"
23
+
24
+ res = env[:iijapi].gp(gp).add_virtual_machines(opts)
25
+ env[:ui].info "-- AddVirtualMachines response: #{res}"
26
+ env[:machine].id = res['GcServiceCodeList'].first
27
+ end
28
+
29
+ gc = env[:machine].id
30
+ vm = env[:iijapi].gp(gp).gc(gc)
31
+
32
+ retry_left = config.api_max_retry_count
33
+ begin
34
+ vm.wait_while(proc { vm.contract_status! == "InPreparation" }) do
35
+ env[:ui].info "-- contract status: #{vm.contract_status}"
36
+ end
37
+ rescue IIJ::Sakagura::Core::Error::APIError => e
38
+ env[:ui].warn "Failed to fetch the status of contract: #{e.inspect}"
39
+ retry_left -= 1
40
+ if retry_left > 0
41
+ sleep config.api_retry_wait
42
+ retry
43
+ else
44
+ raise
45
+ end
46
+ end
47
+
48
+ env[:ui].info I18n.t("vagrant_iijgp.import_root_ssh_public_key")
49
+ vm.import_ssh_public_key(config.ssh_public_key)
50
+
51
+ env[:ui].info I18n.t("vagrant_iijgp.wait_for_configured")
52
+ vm.wait_while(proc { vm.status! == "Configuring" }) { env[:ui].info "-- current_status: #{vm.status}" }
53
+
54
+ @app.call(env)
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,27 @@
1
+ module VagrantPlugins
2
+ module ProviderIijGp
3
+ module Action
4
+ class Destroy
5
+ def initialize(app, env)
6
+ @app = app
7
+ @logger = Log4r::Logger.new("vagrant_iijgp::action::destroy")
8
+ end
9
+
10
+ def call(env)
11
+ env[:ui].info I18n.t("vagrant_iijgp.initialize_vm")
12
+
13
+ gp = env[:machine].provider_config.gp_service_code
14
+ gc = env[:machine].id
15
+
16
+ vm = env[:iijapi].gp(gp).gc(gc)
17
+ vm.initialize_vm
18
+
19
+ env[:ui].info I18n.t("vagrant_iijgp.wait_for_stop")
20
+ vm.wait_while(proc { vm.status! == "Initializing" }) { env[:ui].info "-- current_status: #{vm.status}" }
21
+
22
+ @app.call(env)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,16 @@
1
+ module VagrantPlugins
2
+ module ProviderIijGp
3
+ module Action
4
+ class IsCreated
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ env[:result] = env[:machine].state.id != :not_created
11
+ @app.call(env)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module VagrantPlugins
2
+ module ProviderIijGp
3
+ module Action
4
+ class IsStopped
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ env[:result] = env[:machine].state.id == :stopped
11
+ @app.call(env)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module VagrantPlugins
2
+ module ProviderIijGp
3
+ module Action
4
+ class MessageAlreadyRunning
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ env[:ui].info I18n.t("vagrant_iijgp.vm_already_running", :name => env[:machine].name)
11
+ @app.call(env)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module VagrantPlugins
2
+ module ProviderIijGp
3
+ module Action
4
+ class MessageInvalidStatus
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ env[:ui].info I18n.t("vagrant_iijgp.invalid_status", :name => env[:machine].name, :state => env[:machine_state])
11
+ @app.call(env)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module VagrantPlugins
2
+ module ProviderIijGp
3
+ module Action
4
+ class MessageNotCreated
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ env[:ui].info I18n.t("vagrant_iijgp.vm_not_created", :name => env[:machine].name)
11
+ @app.call(env)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ module VagrantPlugins
2
+ module ProviderIijGp
3
+ module Action
4
+ class MessageWillNotDestroy
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ env[:ui].info I18n.t("vagrant.commands.destroy.will_not_destroy",
11
+ :name => env[:machine].name)
12
+ @app.call(env)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,38 @@
1
+ require 'iij/sakagura'
2
+
3
+ module VagrantPlugins
4
+ module ProviderIijGp
5
+ module Action
6
+ class PrepareIIJAPI
7
+ def initialize(app, env)
8
+ @app = app
9
+ @logger = Log4r::Logger.new("vagrant_iijgp::action::prepare_iijapi")
10
+ end
11
+
12
+ def call(env)
13
+ config = env[:machine].provider_config
14
+
15
+ # use the existing gc contract.
16
+ if config.gc_service_code
17
+ if env[:machine].id.nil?
18
+ # first time `vagrant up`
19
+ env[:machine].id = config.gc_service_code
20
+ elsif config.gc_service_code != env[:machine].id
21
+ raise Errors::MismatchServiceCode, :provider_config => config.gc_service_code, :machine_id => env[:machine].id
22
+ end
23
+ end
24
+
25
+ opts = {
26
+ :access_key => config.access_key,
27
+ :secret_key => config.secret_key
28
+ }
29
+ opts[:endpoint] = config.endpoint if config.endpoint
30
+
31
+ env[:iijapi] = IIJ::Sakagura::GP::Client.new(opts)
32
+
33
+ @app.call(env)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,27 @@
1
+ module VagrantPlugins
2
+ module ProviderIijGp
3
+ module Action
4
+ class ReadSSHInfo
5
+ def initialize(app, env)
6
+ @app = app
7
+ @logger = Log4r::Logger.new("vagrant_iijgp::action::read_ssh_info")
8
+ end
9
+
10
+ def call(env)
11
+ env[:machine_ssh_info] = read_ssh_info(env[:iijapi], env[:machine])
12
+
13
+ @app.call(env)
14
+ end
15
+
16
+ def read_ssh_info(cli, machine)
17
+ vm = cli.gp(machine.provider_config.gp_service_code).gc(machine.id)
18
+
19
+ {
20
+ :host => vm.info['GlobalAddress']['IPv4Address'],
21
+ :port => 22
22
+ }
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,41 @@
1
+ module VagrantPlugins
2
+ module ProviderIijGp
3
+ module Action
4
+ class ReadState
5
+ def initialize(app, env)
6
+ @app = app
7
+ @logger = Log4r::Logger.new("vagrant_iijgp::action::read_state")
8
+ end
9
+
10
+ def to_snake_sym(str)
11
+ str.gsub(/[A-Z]/) {|s| "_#{s.downcase}" }.sub(/^_/, '').to_sym
12
+ end
13
+
14
+ def call(env)
15
+ env[:machine_state] = read_state(env)
16
+ @app.call(env)
17
+ end
18
+
19
+ def read_state(env)
20
+ machine = env[:machine]
21
+ return :not_created if machine.id.nil?
22
+
23
+ vm = env[:iijapi].gp(machine.provider_config.gp_service_code).gc(machine.id)
24
+ if contract_status = vm.contract_status
25
+ if contract_status == "InService"
26
+ return to_snake_sym(vm.status)
27
+ elsif contract_status == "InPreparation"
28
+ return :in_preparation
29
+ else
30
+ machine.id = nil
31
+ return :not_created
32
+ end
33
+ else
34
+ machine.id = nil
35
+ return :not_created
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,25 @@
1
+ module VagrantPlugins
2
+ module ProviderIijGp
3
+ module Action
4
+ class SetLabel
5
+ def initialize(app, env)
6
+ @app = app
7
+ @logger = Log4r::Logger.new("vagrant_iijgp::action::set_label")
8
+ end
9
+
10
+ def call(env)
11
+ gp = env[:machine].provider_config.gp_service_code
12
+ gc = env[:machine].id
13
+
14
+ vm = env[:iijapi].gp(gp).gc(gc)
15
+ label = env[:machine].provider_config.label || env[:machine].name.to_s || Time.now.strftime('%F %T')
16
+
17
+ @logger.info("Setting the label of the VM [#{gp}/#{gc}]: #{label}")
18
+ vm.label = label
19
+
20
+ @app.call(env)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end