Class: Engineyard::Local::Middleware::Chef

Inherits:
Object
  • Object
show all
Includes:
Helpers::Executable, Helpers::Rvm, Helpers::Uploadable
Defined in:
lib/engineyard-local/middleware/chef.rb

Instance Method Summary collapse

Methods included from Helpers::Rvm

#bash_rvm_setup, #export_ruby, #ruby_env_const, #rvm_env, #use_ruby_with_gemset

Methods included from Helpers::Executable

#project_dir, #ssh_exec, #ssh_exec!

Methods included from Helpers::Uploadable

#ssh_upload!

Constructor Details

#initialize(app, env) ⇒ Chef

Returns a new instance of Chef.



9
10
11
12
# File 'lib/engineyard-local/middleware/chef.rb', line 9

def initialize(app, env)
  @app = app
  @env = env
end

Instance Method Details

#cached_data_pathObject



21
22
23
# File 'lib/engineyard-local/middleware/chef.rb', line 21

def cached_data_path
  "#{@env[:root_path]}/.ey_local_data"
end

#call(env) ⇒ Object



14
15
16
17
18
19
# File 'lib/engineyard-local/middleware/chef.rb', line 14

def call(env)
  @env[:ui].info I18n.t("eylocal.setup.chef")
  copy_patches(env)
  ssh_exec!(env, commands)
  @app.call(env)
end

#commandsObject



35
36
37
38
39
40
41
42
43
44
# File 'lib/engineyard-local/middleware/chef.rb', line 35

def commands
  rvm_env +
  [
    ensure_that_recipes_are_installed,
    "cd /etc/chef",
    "sudo env PATH=/usr/local/ey_resin/bin:/sbin:/bin:/usr/sbin:/usr/bin chef-solo -j /etc/chef/dna.json -c /etc/chef/solo.rb",
    "if [[ ! -e /usr/bin/rake ]]; then sudo ln -s /usr/bin/rake19 /usr/bin/rake; fi",
    run_custom_chef_in_application_if_it_exists
  ]
end

#cookbook_suffixObject



74
75
76
77
78
79
80
81
82
83
84
# File 'lib/engineyard-local/middleware/chef.rb', line 74

def cookbook_suffix
  cookbook_uri =~ /\.(\w+)$/
  case $1
  when /bz2|tbz/
    ".bz2"
  when /gz|tgz/
    ".gz"
  else
    ""
  end
end

#cookbook_uriObject



64
65
66
67
68
69
70
71
72
# File 'lib/engineyard-local/middleware/chef.rb', line 64

def cookbook_uri
  ey_local_data = nil
  if ( !@cookbook_uri && File.exist?( cached_data_path ) )
    ey_local_data = YAML.load( File.read( cached_data_path ) )
  end
  @la_brea_data ||= ey_local_data ? ey_local_data[:la_brea_data] : nil
  @cookbook_uri ||= ( ey_local_data && ey_local_data[:la_brea_data][:cookbooks_url] ) ?
    ey_local_data[:la_brea_data][:cookbooks_url] : Local.config[:box_defaults][:cookbook_uri]
end

#cookbook_versionObject



97
98
99
# File 'lib/engineyard-local/middleware/chef.rb', line 97

def cookbook_version
  ( @la_brea_data && @la_brea_data[:cookbooks_version] ) ? @la_brea_data[:cookbooks_version] : Local.config[:box_defaults][:cookbook_version]
end

#copy_patches(env) ⇒ Object



25
26
27
28
29
30
31
32
33
# File 'lib/engineyard-local/middleware/chef.rb', line 25

def copy_patches(env)
  patchdir = "/tmp/eylocal_patches"
  ssh_exec!(env, ["mkdir -p #{patchdir}"])

  Local.config[:box_defaults][:patches].each do |p|
    from = File.expand_path("config/patches/#{p}", Engineyard::Local.project_root)
    ssh_upload!(env, from, File.join(patchdir,p))
  end
end

#ensure_that_recipes_are_installedObject



46
47
48
# File 'lib/engineyard-local/middleware/chef.rb', line 46

def ensure_that_recipes_are_installed
  "if [[ ! -d /etc/chef/recipes ]]; then curl -s #{cookbook_uri} > /tmp/chef.tar#{cookbook_suffix}; sudo mkdir -p /etc/chef/recipes && cd /etc/chef/recipes && sudo tar #{tar_flags} /tmp/chef.tar#{cookbook_suffix}; sudo patch -p1 < /tmp/eylocal_patches/* >& /dev/null; sudo touch #{Engineyard::Local::Middleware::Cookbooks::COOKBOOK_VERSION_FILE}; sudo chown vagrant #{Engineyard::Local::Middleware::Cookbooks::COOKBOOK_VERSION_FILE}; echo \"#{cookbook_version}\" > #{Engineyard::Local::Middleware::Cookbooks::COOKBOOK_VERSION_FILE}; rm /tmp/chef.tar#{cookbook_suffix}; fi"
end

#run_custom_chef_in_application_if_it_existsObject



50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/engineyard-local/middleware/chef.rb', line 50

def run_custom_chef_in_application_if_it_exists
  "if [[ ! -d /etc/chef-custom/recipes ]]; then sudo mkdir -p /etc/chef-custom/recipes; fi;\nif [[ -d /vagrant/cookbooks ]]; then sudo ln -sF /vagrant/cookbooks /etc/chef-custom/recipes/cookbooks; fi;\necho 'cookbook_path     \"/etc/chef-custom/recipes/cookbooks\"\nlog_level         :info\nfile_store_path  \"/etc/chef-custom/recipes/\"\nfile_cache_path  \"/etc/chef-custom/recipes/\"\nnode_name         \"localhost\"' > /tmp/_solo.rb;\nsudo mv -f /tmp/_solo.rb /etc/chef-custom/solo.rb;\nsudo env PATH=/usr/local/ey_resin/bin:/sbin:/bin:/usr/sbin:/usr/bin chef-solo -j /etc/chef/dna.json -c /etc/chef-custom/solo.rb;\n"
end

#tar_flagsObject



86
87
88
89
90
91
92
93
94
95
# File 'lib/engineyard-local/middleware/chef.rb', line 86

def tar_flags
  case cookbook_suffix
  when /bz2|tbz/
    "-xjf"
  when /gz|tgz/
    "-xzf"
  else
    "-xf"
  end
end