Search code examples
amazon-web-serviceschef-infraaws-opsworksberkshelftest-kitchen

How do you mock OpsWorks specific services/dependencies when developing locally with Kitchen and Chef?


I'm writing Chef wrappers around some of the built in OpsWorks cookbooks. I'm using Berkshelf to clone the OpsWorks cookbooks from their github repo.

This is my Berksfile:

source 'https://supermarket.getchef.com'

metadata

def opsworks_cookbook(name)
  cookbook name, github: 'aws/opsworks-cookbooks', branch: 'release-chef-11.10', rel: name
end

%w(dependencies scm_helper mod_php5_apache2 ssh_users opsworks_agent_monit
   opsworks_java gem_support opsworks_commons opsworks_initial_setup
   opsworks_nodejs opsworks_aws_flow_ruby
   deploy mysql memcached).each do |cb|
  opsworks_cookbook cb
end

My metadata.rb:

depends 'deploy'
depends 'mysql'
depends 'memcached'

The problem is, when I try to override attributes that depend on the opsworks key in the node hash, I get a:

NoMethodError
-------------
undefined method `[]=' for nil:NilClass

OpsWorks has a whole bunch of pre-recipe dependencies that create these keys and do a lot of their setup. I'd like to find a way to either pull in those services and run them against my Kitchen instances or mock them in a way that I can actually test my recipes.

Is there a way to do this?


Solution

  • You'll have to do it manually. You can add arbitrary attributes to your .kitchen.yml, just go on an OpsWorks machine and log the values you need and either use them directly or adapt them to workable test data.