class DPL::Provider::ChefSupermarket

Attributes

cookbook[R]
cookbook_category[R]
cookbook_name[R]

Public Instance Methods

check_app() click to toggle source
# File lib/dpl/provider/chef_supermarket.rb, line 23
def check_app
  @cookbook_name = options[:name] || options[:cookbook_name] || options[:app]
  @cookbook_category = options[:category] || options[:cookbook_category]
  unless cookbook_category
    error "Missing cookbook_category option\n" +
      "see https://docs.getchef.com/knife_cookbook_site.html#id12"
  end

  log "Validating cookbook #{cookbook_name}"
  # Check that cookbook exist and is valid
  # So we assume cookbook path is '..'
  cl = ::Chef::CookbookLoader.new '..'
  @cookbook = cl[cookbook_name]
  ::Chef::CookbookUploader.new(cookbook, '..').validate_cookbooks
end
check_auth() click to toggle source
# File lib/dpl/provider/chef_supermarket.rb, line 16
def check_auth
  error "Missing user_id option" unless options[:user_id]
  error "Missing client_key option" unless options[:client_key]
  ::Chef::Config[:client_key] = options[:client_key]
  error "#{options[:client_key]} does not exist" unless ::File.exist?(options[:client_key])
end
needs_key?() click to toggle source
# File lib/dpl/provider/chef_supermarket.rb, line 12
def needs_key?
  false
end
push_app() click to toggle source
# File lib/dpl/provider/chef_supermarket.rb, line 39
def push_app
  log "Creating cookbook build directory"
  tmp_cookbook_dir = Chef::CookbookSiteStreamingUploader.create_build_dir(cookbook)
  log "Making tarball in #{tmp_cookbook_dir}"
  system("tar -czf #{cookbook_name}.tgz #{cookbook_name}", :chdir => tmp_cookbook_dir)

  uri = "https://supermarket.chef.io/api/v1/cookbooks"

  log "Uploading to #{uri}"
  category_string = { 'category'=>cookbook_category }.to_json
  http_resp = ::Chef::CookbookSiteStreamingUploader.post(
    uri,
    options[:user_id],
    options[:client_key],
    {
      :tarball => File.open("#{tmp_cookbook_dir}/#{cookbook_name}.tgz"),
      :cookbook => category_string
    }
  )
  res = ::Chef::JSONCompat.from_json(http_resp.body)
  if http_resp.code.to_i != 201
    if res['error_messages']
      if res['error_messages'][0] =~ /Version already exists/
        error "The same version of this cookbook already exists on the Opscode Cookbook Site."
      else
        error "#{res['error_messages'][0]}"
      end
    else
      error "Unknown error while sharing cookbook\n" +
        "Server response: #{http_resp.body}"
    end
  end

  log "Upload complete."
  ::FileUtils.rm_rf tmp_cookbook_dir
end