serverspecでコマンド結果でテストを分岐させる

小ネタです。
Oracle系のテストを書く上でsqlplusでSQL叩きまくってshould matchというテストを書くつもりですが、SQL叩くためにはインスタンスが上がってなければいけない。
もし、インスタンスが動いてない状態でsqlplus叩いてもまあ、普通にエラーになるだけなのですが無駄に叩くのも気持ち悪いので、できればテストの最初でインスタンス稼動チェックをして分岐させたい。
ということで、backend.run_commandでコマンド実行結果を受けて分岐させようという感じで試したメモです。

参考

http://qiita.com/doima_/items/e5ad8baa83642d07005a
※backend.run_commandについては全然知らなかったため、大変参考になりました。感謝。

とりあえずできたもの
describe command('su - grid -c "srvctl config database"') do
  its(:stdout) { should match /#{property[:oraclesid]}/ }
end

ps_smon = backend.run_command("ps -ef | grep ora_smon | grep -v grep | awk '{ print $NF }'")
if ps_smon.stdout == "ora_smon_#{property[:oraclesid]}\n" then
  describe command('su - oracle -c "sqlplus -s / as sysdba <<EOF
set lin 1000
set pages 0
set trims on
set tab off
select NAME||\',\'||VALUE line from v\\\\\\$parameter2 order by num ;
exit
EOF
"') do
    its(:stdout) { should match /processes,1000/ }
  end
end
ちょっとはまったところ
  • backend.run_command の結果を文字列比較する場合、改行に気をつけておきましょう。
  • ps_smon.stdoutの箇所はps_smon[:stdout] でも動きますが、command_result.rbにある「CommandResult#[] is obsolete~」な警告がでます。
  • SQLはファイル化するか悩みどころなのですが、シェル側のヒアドキュメントの場合はruby分とシェル分でこんなエスケープでとりあえず動きました。「v\\\\\\$parameter2」