時間取れたので検討してみるなど

某所の Issue、reboot の実装。

  • Controller に reboot って action 追加
  • Model から Fog のメソド呼び出すメソド追加
  • View の修正

なのかどうか。特に View は拡張入るはずなので pulldown menu にしておきたい方向。つうことはとりあえず試験の追加について検討なのかな。

色々見てて

今更ですが、Fog て provider 毎で提供するメソドが異なるんですね。つーことは今 Model で発行してるメソドがそのまま使えないケイスもあり得るのか。これって Ruby だとどうやって抽象化できるんかいな。

色々見てみるに例えば cloudstack な Fog::Compute の start_virtual_machine だと以下な実装になってて

        def start_virtual_machine(options={})
          options.merge!(
            'command' => 'startVirtualMachine'
          )

          request(options)
        end

呼び出している request は cloudstack な Fog::Compute の request を呼び出しています。この方式が標準化されているのであれば嬉しいんですがどうなんだ。
てか、Ruby って文字列をシンボルにできて、send を使えば良いのか。こっちの修正から手を付けた方が良さげ。

引数の渡しかたとかも provider 毎で微妙に違うな。やっぱ send 一発では無理か。とはいえとりあえず現状対応しているソレが動く形で実装を変えてみるしかなさげ。

と、いふことで

こちらのリファクタリングな Issue 発行して対応する方向。

  • Provider の respond_to な試験を追加して失敗確認
  • Provider の migrate を用意して bundle exec
  • Model 修正
  • 試験確認
  • vm_operation なモデルの修正 (send を使う形)
  • メソドなデータは valid なものを用意して vm_operation なモデルの試験実行

これで Issue の対応は OK なのか。
つうか、provider 毎に戻りも違うはずだからこれも吸収してあげないと駄目な気がしてきました。困ったな。とは言えとりあえずこのまま進めてみます。

実装

とりあえず以下な試験を追加。

  it { should respond_to(:create_vm) }
  it { should respond_to(:start_vm) }
  it { should respond_to(:stop_vm) }

試験は当然失敗。で、以下なのか。

$ rails g migration add_create_vm_and_start_vm_and_stop_vm_to_provider
      invoke  active_record
      create    db/migrate/20131010112756_add_create_vm_and_start_vm_and_stop_vm_to_provider.rb

で、出力されたソレを以下に。

class AddCreateVmAndStartVmAndStopVmToProvider < ActiveRecord::Migration
  def change
    add_column :providers, :create_vm, :string
    add_column :providers, :start_vm, :string
    add_column :providers, :stop_vm, :string
  end
end

で、bundle exec なのか。

$ bundle exec rake db:migrate

で、試験を再度、なのか。とその前に以下。

$ bundle exec rake db:test:prepare

試験パス確認。で最後に vm_operation な model を修正なのか。

その前に

factories.rb 修正ですね。以下。

  factory :provider do
    name "CloudStack"
    create_vm "deploy_virtual_machine"
    start_vm "start_virtual_machine"
    stop_vm "stop_virtual_machine"
  end

で、model の実装を以下なカンジにして

    compute.send(conn.stop_vm.to_sym, {'id' => id})

どうなるか。失敗。provider.rb 方面に attr_accessible なソレを追加して

  attr_accessible :name, :create_vm, :start_vm, :stop_vm

リトライ。つうか以下でした。

    compute.send(conn.provider.stop_vm.to_sym, {'id' => id})

試験パス。commit 作って後始末します。今日はこれで終わり。

別途

戻りの抽象化の検討をしなければならないですが今日はもう終わりなのかどうか。検討して備忘なメモを追記するかもしれません。

追記

providers な Controller 方面にていくつか追加。編集できないとアレなので。