2015-03-23 Mon

[別の年の同じ日: 2006 2007 2008 2010 2011 2013

Serverspec で zfs allow のテストをしたい はてぶ

ということで、いろいろと考えている。

まずは、どうテストを書けるといいのかが決まらない。

すでにある Serverspec の resource type を参考にすると、
こんな感じに書けるのがよさそう。

describe zfs('rpool/export/home/foo') do
  it { should be_allowed('create,mount,snapshot').to_user('foo') }
  it { should be_allowed('create,mount,snapshot').to_group('staff') }
  it { should be_allowed_at_create_time('destroy') }
end


または its 形式にして、こんな感じ。

its(:user_permission) { should include('foo' => 'create,mount,snapshot' ) }
its(:group_permission) { should include('staff' => 'create,mount,snapshot' ) }
its(:create_time_permission) { should eq 'destroy' }


'create,mount,snapshot' などの permission 部分を文字列にしてしまうと、

describe zfs('rpool/export/home/foo') do
  it { should_not be_allowed('rollback,hold').to_user('foo') }
end


のようなテストができないし、permission の順番も問題になるので、
配列にした方がいいかもしれない。
完全一致のテストでよければ文字列でよい。

次に、zfs allow の出力の問題。

手元で適当に zfs allow で permission を設定してみた後の zfs allow の出力は以下。

tonaka@x230% zfs allow tank/test20150321/test_01/a
---- Permissions on tank/test20150321/test_01/a ----------------------
Local permissions:
        user tonaka destroy,rollback,snapshot
---- Permissions on tank/test20150321/test_01 ------------------------
Create time permissions:
        rollback
Local permissions:
        user tonaka destroy
Local+Descendent permissions:
        user tonaka snapshot
---- Permissions on tank/test20150321 --------------------------------
Create time permissions:
        destroy,snapshot
Local+Descendent permissions:
        user tonaka create,mount
        group staff create,mount


各 zfs の path に対して何が allow されたかが出力されて、
上からの継承分を含めて何が allow されているかは出力されない。

そのため、ある zfs の path の上からの継承分を含めた allow をテストしたい場合は
parse してごにょごにょして求める必要がある。

ある zfs の path の上からの継承分を含めた allow をテストするのではなく、
ある zfs の path に対して zfs allow が実行されているかをテストするなら、
その path の 'Create time permissions' と 'Local+Descendent permissions' を
確認すればよい。

どっちにするか?って話になると、両方できた方がよいということになってしまうが、
『ある zfs の path に対して zfs allow が実行されているかをテストする』の方が、
テストに失敗した時に何をすればいいのかわかりやすい分よい気がする。

別にまとめた方がいいけど、zfs allow で表示される permission の種類は以下。

- Create time permissions:
  zfs allow -c で許可された permission。
  その zfs の下位の zfs を create すると、この permission がつく。
- Local+Descendent permissions:
  zfs allow で許可された permission。
- Local permissions:
  zfs が create された際に Create time permissions でついた permission

Serverspec で zfs の property のテストに its(:property) が使えるようになった はてぶ

pull request が merge されて Serverspec 2.11.0 から
zfs の property のテストが以下のように書けるようになった。

describe zfs('rpool') do
  its(:property) { should include( 'mountpoint' => '/rpool', 'atime' => 'on' ) }
end


この場合、テスト対象の zfs である rpool に対して

zfs get -Hp -o property,value all rpool


を実行して、その結果を { 'property' => 'value' } な hash に詰めるので、

- have_property のように property の数だけ zfs command を叩かなくてよい
- rspec の hash 用 matcher が使える

といったあたりがメリット。

Referrer (Inside):
[2015-03-24-1] Serverspec で service の property のテストに its(:property) が使えるようになった