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"
  },
  "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]"
  ]
}

Installation and Setup

Please read the Driver usage page for more details.

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']

Development

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 ([email protected])

License

Apache 2.0 (see LICENSE)