Class: Chef::ChefFS::FileSystem::ChefServer::VersionedCookbooksDir
- Inherits:
-
CookbooksDir
- Object
- BaseFSObject
- BaseFSDir
- RestListDir
- CookbooksDir
- Chef::ChefFS::FileSystem::ChefServer::VersionedCookbooksDir
- Defined in:
- lib/chef/chef_fs/file_system/chef_server/versioned_cookbooks_dir.rb
Overview
/cookbooks or /cookbook_artifacts
Example children of /cookbooks:
- apache2-1.0.0
- apache2-1.0.1
- mysql-2.0.5
Example children of /cookbook_artifacts:
- apache2-ab234098245908ddf324a
- apache2-295387a9823745feff239
- mysql-1a2b9e1298734dfe90444
Instance Attribute Summary
Attributes inherited from RestListDir
Attributes inherited from BaseFSObject
Instance Method Summary collapse
- #can_have_child?(name, is_dir) ⇒ Boolean
- #chef_rest ⇒ Object
- #children ⇒ Object
- #make_child_entry(name) ⇒ Object
-
#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.
Methods inherited from CookbooksDir
#create_child_from, #upload_cookbook_from, #with_actual_cookbooks_dir
Methods included from Mixin::FileClass
Methods inherited from RestListDir
#create_child, #environment, #initialize, #org, #rest
Methods inherited from BaseFSDir
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
104 105 106 |
# File 'lib/chef/chef_fs/file_system/chef_server/versioned_cookbooks_dir.rb', line 104 def can_have_child?(name, is_dir) is_dir && name =~ Chef::ChefFS::FileSystem::ChefServer::VersionedCookbookDir::VALID_VERSIONED_COOKBOOK_NAME end |
#chef_rest ⇒ Object
100 101 102 |
# File 'lib/chef/chef_fs/file_system/chef_server/versioned_cookbooks_dir.rb', line 100 def chef_rest Chef::ServerAPI.new(root.chef_rest.url, root.chef_rest..merge(version_class: Chef::CookbookManifestVersions)) end |
#children ⇒ Object
48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/chef/chef_fs/file_system/chef_server/versioned_cookbooks_dir.rb', line 48 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 << VersionedCookbookDir.new("#{cookbook_name}-#{cookbook_version["version"]}", self) end end result.sort_by(&:name) end end |
#make_child_entry(name) ⇒ Object
43 44 45 46 |
# File 'lib/chef/chef_fs/file_system/chef_server/versioned_cookbooks_dir.rb', line 43 def make_child_entry(name) result = @children.find { |child| child.name == name } if @children result || VersionedCookbookDir.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.
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 94 95 96 97 98 |
# File 'lib/chef/chef_fs/file_system/chef_server/versioned_cookbooks_dir.rb', line 64 def upload_cookbook(other, ) cookbook_name = Chef::ChefFS::FileSystem::Repository::ChefRepositoryFileSystemCookbookDir.canonical_cookbook_name(other.name) 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.chefignore) proxy_loader.load! cookbook_to_upload = proxy_loader.cookbook_version cookbook_to_upload.freeze_version if [:freeze] # Instantiate a new uploader based on the proxy loader uploader = Chef::CookbookUploader.new(cookbook_to_upload, force: [:force], rest: chef_rest) 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 ChefUtils.windows? Dir.rmdir proxy_cookbook_path end end end |