再起動の追加

後天性記憶不全なので控えをとりつつ作業しないと全てがどこかに飛んでいきます。とりあえず TODO を列挙。

  • Provider に reboot_vm な属性追加
  • CloudStack の API な文字列をデータに追加
  • virtual_machine なモデルにメソド追加
  • vm_operation な Controller に action を追加
  • view の操作リンクを pull down に修正

結構なんやかやとありますね。とりあえず体調微妙ながらも盛り込みに着手。

モデルへの属性追加

以下か。

$ rails g migration add_reboot_vm_to_provider

以下なカンジにして

class AddRebootVmToProvider < ActiveRecord::Migration
  def change
    add_column :providers, :reboot_vm, :string
  end
end

rake 実行。

$ bundle exec rake db:migrate
$ bundle exec rake db:test:prepare

あと、とりあえず factory.rb に以下を追加。

    reboot_vm "reboot_virtual_machine"

CloudStack 向け。development なナニは別途。
次に virtual_machine な model を云々とありますね。つーか試験書かないと。追加した属性の存在チェック。

  it { should respond_to(:reboot_vm) }

確認 OK です。これ、view にも修正必要なのか。以下を修正。

  • spec/views/providers/edit.html.erb_spec.rb
  • spec/views/providers/new.html.erb_spec.rb
  • spec/views/providers/show.html.erb_spec.rb

失敗確認して盛り込み。試験パス確認。こんどは model の試験か。ええと stub を定義して

    cloudstack.stub(:reboot_virtual_machine).and_return("reboot")

試験を追加。

  describe "self.reboot_vm" do
    before do
      @ret = VirtualMachine.reboot_vm(@conn, 1)
    end

    it "returns reboot" do
      expect(@ret).to eq("reboot")
    end
  end

本体に実装を盛り込んではいないので試験は失敗します。確認後盛り込みを。

  def self.reboot_vm(conn, id)
    @conn = conn
    @uri = URI.parse(conn.end_point)
    compute = make_compute

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

試験パス確認。て、この試験ドリブン方式ってなんつーか凄く機械的にヤッツケてしまう風で微妙かも。とは言え、ここに至るまでに色々検討してるのは事実ですが。
次は Controller に action 追加とありますね。これも試験から。action 追加ってことは routing にも影響あるのかな。Controller の試験は既存とほぼ同一なので引用略。Controller な spec をアレしてみると No route matches と出力。
なので spec/routing 方面にも試験を追加して red 確認。とりあえず reboot な経路の確保。

  resources :vm_operations, only: [ :new, :create ] do
    member do
      get :start, :stop, :reboot
    end
  end

で、Controller な実装の修正。試験パスを確認。

中断

ちょい外出。続きは追記します。

続き

帰宅後、pull down 実装をパクッて盛り込み。で、実行してみると追加した属性にアクセスできぬ。これ、attr_accessible に追加されてるかどうかな試験も必要ですねorz
以下を参考に試験追加。

つうかこれ、試験追加しても忘れる可能性は非常に高いですね。何とかならんかな。
とりあえず commit 作って push/merge して heroku 方面にも反映の方向。