Class: Chef::ChefFS::FileSystem::ChefServer::CookbookArtifactsDir

Inherits:
CookbooksDir show all
Defined in:
lib/chef/chef_fs/file_system/chef_server/cookbook_artifacts_dir.rb

Overview

/cookbook_artifacts

Example children of /cookbook_artifacts:

  • apache2-ab234098245908ddf324a
  • apache2-295387a9823745feff239
  • mysql-1a2b9e1298734dfe90444

Instance Attribute Summary

Attributes inherited from RestListDir

#api_path, #data_handler

Attributes inherited from BaseFSObject

#name, #parent, #path

Instance Method Summary collapse

Methods inherited from CookbooksDir

#create_child_from, #upload_cookbook_from, #with_actual_cookbooks_dir

Methods included from Mixin::FileClass

#file_class

Methods inherited from RestListDir

#create_child, #environment, #initialize, #org, #rest

Methods inherited from BaseFSDir

#dir?, #empty?, #initialize

Methods inherited from BaseFSObject

#chef_object, #child, #compare_to, #create_child, #delete, #dir?, #exists?, #initialize, #path_for_printing, #read, #root, #write

Constructor Details

This class inherits a constructor from Chef::ChefFS::FileSystem::ChefServer::RestListDir

Instance Method Details

#can_have_child?(name, is_dir) ⇒ Boolean


99
100
101
# File 'lib/chef/chef_fs/file_system/chef_server/cookbook_artifacts_dir.rb', line 99

def can_have_child?(name, is_dir)
  is_dir && name.include?("-")
end

#chef_restObject


95
96
97
# File 'lib/chef/chef_fs/file_system/chef_server/cookbook_artifacts_dir.rb', line 95

def chef_rest
  Chef::ServerAPI.new(root.chef_rest.url, root.chef_rest.options.merge(version_class: Chef::CookbookManifestVersions))
end

#childrenObject


42
43
44
45
46
47
48
49
50
51
52
# File 'lib/chef/chef_fs/file_system/chef_server/cookbook_artifacts_dir.rb', line 42

def children
  @children ||= begin
    result = []
    root.get_json("#{api_path}/?num_versions=all").each_pair do |cookbook_name, cookbooks|
      cookbooks["versions"].each do |cookbook_version|
        result << CookbookArtifactDir.new("#{cookbook_name}-#{cookbook_version['identifier']}", self)
      end
    end
    result.sort_by(&:name)
  end
end

#make_child_entry(name) ⇒ Object


37
38
39
40
# File 'lib/chef/chef_fs/file_system/chef_server/cookbook_artifacts_dir.rb', line 37

def make_child_entry(name)
  result = @children.find { |child| child.name == name } if @children
  result || CookbookArtifactDir.new(name, self)
end

#upload_cookbook(other, options) ⇒ Object

Knife currently does not understand versioned cookbooks Cookbook Version uploader also requires a lot of refactoring to make this work. So instead, we make a temporary cookbook symlinking back to real cookbook, and upload the proxy.


58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/chef/chef_fs/file_system/chef_server/cookbook_artifacts_dir.rb', line 58

def upload_cookbook(other, options)
  cookbook_name, _, identifier = other.name.rpartition("-")

  Dir.mktmpdir do |temp_cookbooks_path|
    proxy_cookbook_path = "#{temp_cookbooks_path}/#{cookbook_name}"

    # Make a symlink
    file_class.symlink other.file_path, proxy_cookbook_path

    # Instantiate a proxy loader using the temporary symlink
    proxy_loader = Chef::Cookbook::CookbookVersionLoader.new(proxy_cookbook_path, other.parent.chefignore)
    proxy_loader.load_cookbooks

    cookbook_to_upload = proxy_loader.cookbook_version
    cookbook_to_upload.identifier = identifier
    cookbook_to_upload.freeze_version if options[:freeze]

    # Instantiate a new uploader based on the proxy loader
    uploader = Chef::CookbookUploader.new(cookbook_to_upload, force: options[:force], rest: chef_rest, policy_mode: true)

    with_actual_cookbooks_dir(temp_cookbooks_path) do
      uploader.upload_cookbooks
    end

    #
    # When the temporary directory is being deleted on
    # windows, the contents of the symlink under that
    # directory is also deleted. So explicitly remove
    # the symlink without removing the original contents if we
    # are running on windows
    #
    if Chef::Platform.windows?
      Dir.rmdir proxy_cookbook_path
    end
  end
end