既存のchef cookbookをtest-kitchen対応させていく。

# test-kitchenかぁ...

[test-kitchen](https://github.com/test-kitchen/test-kitchen)、
最近見ないうちに、色々と機能が追加されていた。

[version 1.0.0が正式にリリース](http://rubygems.org/gems/test-kitchen)された。
せっかくなので使ってみた。

# test-kitchenとは

cookbookって世にあるじゃないですか。[chef](http://www.opscode.com/chef/)というツールで使う
ミドルウェアインストールのためのレシピ。
で、そのレシピがきちんと動作するのか────インストールできるのか？
そしてインストールした後きちんと動作するのか？というのを確認するため、
[opscode](http://www.opscode.com/)が作ってるツールです。

# 必須なソフトウェア

- [Vagrant](http://www.vagrantup.com/)
- [Ruby](https://www.ruby-lang.org/)

# 既存のchef cookbookを対応させていく

今回はたまたま対応準備を進めていた、
[aiming-cookbooks](https://github.com/aiming-cookbooks)以下にある[chef-td-agent cookbook](https://github.com/aiming-cookbooks/chef-td-agent)(TD様のリポジトリからforkしました)を使う。

# test-kitchenの環境整備

## Gemfileを用意する

Gemfileを用意して、test-kitchen、Berkshelf、それとserverspecをインストールする。

```rb:Gemfile
source 'https://rubygems.org/'

gem 'test-kitchen'
gem 'berkshelf'
gem 'serverspec'
```

## 必要なパッケージをインストール

おなじみのコマンド。

```
bundle ex ins --path vendor/bundle
```

## kitchen init を実行する

```
bundle ex kitchen init
```

以上のコマンドを実行すると、Gemfileに```kitchen-vagrant```パッケージが追記されるので、
改めて```bundle ex install```を行う。

### kitchen-vagrant をインストール

```
bundle ex ins
```

## Gemfileを整える

```:development``` グループ に各gemパッケージをまとめたいので
以下のようにGemfileを整える。

```rb:Gemfile
source 'https://rubygems.org/'

group :development do
  gem 'test-kitchen'
  gem 'berkshelf'
  gem 'kitchen-vagrant'
  gem 'serverspec'
end
```

## Berksfileの準備

```chef-td-agent``` パッケージは、```yum``` や ```apt``` などのcookbookを必要とする。
opscodeから落とさないといけない。

```chef-td-agent``` パッケージの metadata.rb に必要となるcookbook一覧が書いてある。
このmetadata.rbに書かれているパッケージを利用するため、
[Berkshelf](http://berkshelf.com/)を利用する。

Berksfileを使えば、まるでgem installのごとくcookbookがインストールできる。
今回は以下のような形で、Berksfileを書く。

```rb:Berksfile
site :opscode

metadata
```

これだけ。

# .kitchen.ymlの編集

今回テストしたいレシピは```td-agent::default```。で
アーキテクチャは```Ubuntu``` と ```CentOS``` なのでデフォルトの```.kitchen.yml``` をちょっとだけ変更しておく。

```yaml:.kitchen.yml
---
driver:
  name: vagrant

provisioner:
  name: chef_solo

platforms:
  - name: ubuntu-12.04
  - name: centos-6.4

suites:
  - name: default
    run_list:
      - td-agent::default
    attributes:
```

# まずはtest-kitchenを使ってテスト

以下のコマンドを使えばテストできる

```
bundle ex kitchen test
```

これでcookbookのインストールは終わり。
無事cookbookが実行されればそれでおしまい！

![スクリーンショット 2013-12-04 14.44.55.png](https://qiita-image-store.s3.amazonaws.com/0/3985/b4426d94-15ee-abde-170a-7767d8a004a6.png)

# だけどこれだけだとすげー不安

... インストールされたcookbook、そういえばserviceとして```td-agent```が登録され、
起動されるようになってる。

けど、本当に...?

という不安を解消するため、[serverspec](http://serverspec.org/) を合わせて利用する。

# serverspec

test-kitchen、便利すぎる。serverspecに対応している(!)。
以下の形でspec fileを用意する。
カレントディレクトリはcookbookのルートである、とする。

```
mkdir -p test/integration/default/serverspec
cd test/integration/default/serverspec
touch td-agent_spec.rb
```

## td-agent_spec.rbの内容

[test-kitchenのドキュメント、サーバーテストの例](http://kitchen.ci/docs/getting-started/writing-server-test)にならって、td-agentがサービスとして動いているのか？
というテストだけ書いてみる。

```rb:td-agnet_spec.rb
# -*- coding:utf-8 -*-

require 'serverspec'
require 'pathname'

include Serverspec::Helper::Exec
include Serverspec::Helper::DetectOS

RSpec.configure do |c|
  c.before :all do
    c.os = backend(Serverspec::Commands::Base).check_os
    c.path = '/sbin:/usr/bin'
  end
end

describe "td-agent daemon" do
  it "has a running service of td-agent" do
    expect(service("td-agent")).to be_running
  end
end
```

# これだけだとまずい

sudoでserverspecが動くようにしなければいけない。
[busser](https://github.com/test-kitchen/busser)というgemを利用してserverspecを動かしている。
そのままだと```/var/run/td-agent/td-agent.pid``` にアクセスすることができない。
td-agentユーザー以外はアクセス出来ないような設定になっているからだ。

td-agentがサービスとして動作しているか確認するためには、
sudoの状態でserverspecを実行する必要がある。

```.kitchen.yml``` に以下の形でsudoが有効になるようにする。
([デフォルトだと無効になってる...](https://github.com/test-kitchen/test-kitchen/blob/master/lib/kitchen/busser.rb#L51))

**2013/12/5追記**

busserのsudoフラグについて、[trueに戻す変更コミットが行われた](https://github.com/test-kitchen/test-kitchen/commit/e7a7e4b7294fa3e4dbd02f25ce5b8522c59310a7)。


```yaml:.kitchen.yml
---
driver:
  name: vagrant

provisioner:
  name: chef_solo

platforms:
  - name: ubuntu-12.04
  - name: centos-6.4

suites:
  - name: default
    run_list:
      - td-agent::default
    attributes:

busser:
  sudo: true
```

改めて、```bundle ex kitchen test``` を実行する。
すると、serverspecが走ってテストされることが確認できる。

![スクリーンショット 2013-12-04 14.49.25.png](https://qiita-image-store.s3.amazonaws.com/0/3985/68504a48-bca8-c02e-5433-1e8f69dd7500.png)

# 今後どうするのか

test-kitchenでchef cookbookのテスト、及びcookbookにより
構築されたサーバーの状態がテストできるようになった。

今後はCIに乗せてテストをしていきたい。

世の中、どんどん未来になっていっている。