[chef] Re: Re: Re: ideas on testing a clustered application w/ Test-Kitchen


Chronological Thread 
  • From: Bryan Berry < >
  • To:
  • Subject: [chef] Re: Re: Re: ideas on testing a clustered application w/ Test-Kitchen
  • Date: Wed, 8 May 2013 16:58:55 +0200

josh,

I think chef-workflow is neat but it isn't able to reuse
test-kitchen's yaml format nor its drivers. I also think that workflow
I have described isn't overly complicated to need custom rake tasks.

On Wed, May 8, 2013 at 7:35 AM, Joshua Timberman 
< >
 wrote:
> Have y'all looked into Erik Hollensbe's chef-workflow? I haven't used it yet
> myself but it shows a lot of promise for this kind of use case.
>
> https://github.com/chef-workflow
>
>
>
> --
> Joshua Timberman
>
> On Tuesday, May 7, 2013 at 2:31, John Dewey wrote:
>
> Would also be nice if the runner doesn't use chef-solo.  I like where
> Vegabond is
> going.  The ability to truly do integration testing by spinning up dependent
> systems/services,
> and test the cookbook in isolation is needed.
>
> I have abandoned test kitchen all together in favor of chefspec, since I can
> stub/mock
> dependencies that chef-solo cannot resolve.  Looking forward to you work, so
> we can
> add test kitchen to the openstack cookbooks, and get those much needed
> integration
> tests.
>
> For example, I have a use-cases were a cookbook depends on rabbit, mysql,
> memcached to be
> running, and those roles registered into the chef server.  At that point the
> prerequisites
> are met and the cookbook can install recipes, and perform assertions.  This
> is where I
> like the Vegabond approach.
>
> John
>
> On Tuesday, May 7, 2013 at 1:10 AM, Bryan Berry wrote:
>
> I have some ideas on extending test-kitchen to test clustered
> applications and I would love some feedback before I go coding off in
> a particular direction.
>
> Problem: I deal primarily with distributed applications and testing
> the related cookbooks can be a pain. I also have to make sure these
> cookbooks work across different linux distros. Test-Kitchen was not
> originally created with this use case in mind though at this time I
> don't see any reason it couldn't support this use case.
>
> Vagabond[1], written by Chris Roberts, extends .kitchen.yml to include
> a clusters component, among other things. I would love to see
> test-kitchen absorb some of that functionality or at least provide
> extension points to make this more easily pluggable.
>
> Testing a cluster works differently than testing an individual node. I
> want to interrogate the state of the cluster as a whole, not look
> inside each individual server. To do this I need to wait until all
> servers in a cluster converge or at least a quorum of them do. Once a
> quorum of nodes has converged, run a series of tests against the the
> cluster. These tests execute on the client executing `kitchen` rather
> than inside the nodes of the cluster.
>
> Here are the steps in brief:
> 1. Converge all nodes in a cluster
> 2. Wait for quorum of nodes to converge
> 3. execute tests against the cluster
>
> I would put the tests for a cluster in my_cluster/test/cluster/cluster_name
>
> Applications like Elasticsearch, Zookeeper, or Cassandra don't have a
> master node, so each node has an identical run_list and attribute set
>
> clusters:
> default:
> - member: zk1
> - member: zk2
> - member: zk3
>
> platforms:
> - name: ubuntu-12.04
> - name: centos-6.3
>
> suites:
> - name: default
> run_list: [ "recipe[zookeeper]" ]
>
> To test the default cluster on CentOS, `kitchen test --cluster
> default --platform centos-6.3 `
>
> Let's make this even DRYer
>
> clusters:
> default:
> node_count: 3
> quorum: 2
>
> platforms:
> - name: ubuntu-12.04
> - name: centos-6.3
>
> suites:
> - name: default
> run_list: [ "recipe[zookeeper]" ]
>
> The test for this example zookeeper cluster would connect to one
> zookeeper node, make sure it sees the other zookeeper nodes. I am
> paraphrasing the zookeeper code because I am not certain of what the
> actual call would be.
>
> my_cluster/test/cluster/default/check_members.rb
>
> require 'zk'
>
> describe "zookeeper cluster" do
> before(:all) do
> @zk = ZK.new(some_ip)
> end
>
> it "sees the other members" do
> peers = @zk.get("system/peers")
> peers.should == ACTUAL_PEERS
> end
>
> end
>
> The primary challenge here is resolving the names of the members of
> the cluster. One way to do this is to access the statefiles for the
> nodes in .kitchen/*.yml. Another would be to somehow access the
> @instances array for the current Kitchen config. Yet another option
> would be to stand up a chef-zero server.
>
> What about a distributed app where each node does not have an
> identical run_list? Here is how I would handle that for something like
> HBase that has a "hmaster" that stores metadata for the whole cluster.
>
> clusters:
> default:
> - member: head1
> run_list: [ "recipe[hbase::hmaster]" ]
> - member: store1
> run_list: [ "recipe[hbase::data_node]" ]
> - member: store2
> run_list: [ "recipe[hbase::data_node]" ]
>
> platforms:
> - name: ubuntu-12.04
> - name: centos-6.3
>
> suites:
> - name: default
> run_list: [ "recipe[zookeeper]" ]
>
>
>
> I know that test-kitchen is an unopinionated tool and attempts to be
> workflow agnostic but I feel that what I have shown here is a fairly
> simple workflow. The cluster definition I have presented is not
> suitable for modeling failover in a cluster or specific states. At
> that point one should use a custom workflow tool like chef-workflow or
> simply custom rake tasks.
>
> Depending on the feedback I get from this I plan to extend
> test-kitchen or Vagabond to handle the workflow I have described here.
> Thanks for reading!
>
>
> 1. https://github.com/chrisroberts/vagabond/tree/develop
>
>
>



Archive powered by MHonArc 2.6.16.

§