# Kitchen::Nodes A Test Kitchen Provisioner that generates searchable Nodes. The nodes provisioner extends the `chef-zero` provisioner along with all of its functionality and configuration. `chef-zero` can support chef searches by querying against node data stored in json files inside of the kitchen `nodes` folder. The `kitchen-nodes` plugin automatically generates a node file when a test instance is provisioned by test-kitchen. ### Example nodes: ``` { "id": "server-community-ubuntu-1204", "automatic": { "ipaddress": "172.17.0.8", "platform": "ubuntu" }, "normal": { "attr1": "val1" } "run_list": [ "recipe[apt]", "recipe[couchbase-tests::ipaddress]", "recipe[couchbase::server]", "recipe[export-node]" ] } { "id": "second-node-ubuntu-1204", "automatic": { "ipaddress": "172.17.0.9", "platform": "ubuntu" }, "run_list": [ "recipe[apt]", "recipe[couchbase-tests::ipaddress]", "recipe[couchbase-tests::default]", "recipe[export-node]" ] } ``` The node data includes the node id based on the test-kitchen suite name, the run list assigned to the node, the normal attributes included in the `.kitchen.yml` file, the externally reachable ip address and the platform of the test instance os. ## Installation ``` gem install kitchen-nodes ``` ## Configuration Use `nodes` instead of `chef-zero` for the kitchen provisioner name. ``` provisioner: name: nodes ``` ## Usage Using `kitchen-nodes` one can expect all previously converged nodes to be represented in a node file and be searchable. For example consider this scenario looking for a primary node in a cluster in order to add a node to join: ``` require 'timeout' def search_for_nodes(query, timeout = 120) nodes = [] Timeout::timeout(timeout) do nodes = search(:node, query) until nodes.count > 0 && nodes[0].has_key?('ipaddress') sleep 5 nodes = search(:node, query) end end if nodes.count == 0 || !nodes[0].has_key?('ipaddress') raise "Unable to find nodes!" end nodes end primary = search_for_nodes("run_list:*couchbase??server* AND platform:#{node['platform']}") node.normal["couchbase-tests"]["primary_ip"] = primary[0]['ipaddress'] ``` ### Using with Vagrant When using kitchen-nodes with the vagrant driver, make sure you add the following to your `driver_config`: ``` network: - ["private_network", { type: "dhcp" }] ``` This will add an additional non-NAT NIC to your vagrant box with an IP reachable from the host and other test nodes. ### Why is my ohai `ipaddress` different from my node ipaddress on vagrant with VirtualBox? Ohai will pick up the localhost ipaddress on vagrant boxes using virtualbox. To reset the `node["ipaddress"]` to the reachable ip, add `hurry-up-and-test::set_non_nat_vbox_ip` to the top of your `run_list`. ``` suites: - name: my-suite run_list: - recipe[hurry-up-and-test::set_non_nat_vbox_ip] - recipe[cookbook-under-test] ``` You can add this even if you do not use virtualbox and the recipe will do nothing. ## Development * Source hosted at [GitHub][repo] * Report issues/questions/feature requests on [GitHub Issues][issues] Pull requests are very welcome! Make sure your patches are well tested. Ideally create a topic branch for every separate change you make. For example: 1. Fork the repo 2. Create your feature branch (`git checkout -b my-new-feature`) 3. Commit your changes (`git commit -am 'Added some feature'`) 4. Push to the branch (`git push origin my-new-feature`) 5. Create new Pull Request ## Authors Created and maintained by [Matt Wrock][author] () ## License Apache 2.0 (see [LICENSE][license]) [author]: https://github.com/mwrock [issues]: https://github.com/mwrock/kitchen-nodes/issues [license]: https://github.com/mwrock/kitchen-nodes/blob/master/LICENSE [repo]: https://github.com/mwrock/kitchen-nodes [driver_usage]: http://docs.kitchen-ci.org/drivers/usage [chef_omnibus_dl]: http://www.getchef.com/chef/install/