Class: ChefFS::FileSystem::CookbooksDir
- Inherits:
-
RestListDir
- Object
- BaseFSObject
- BaseFSDir
- RestListDir
- ChefFS::FileSystem::CookbooksDir
- Defined in:
- lib/chef_fs/file_system/cookbooks_dir.rb
Instance Attribute Summary
Attributes inherited from RestListDir
Attributes inherited from BaseFSObject
Instance Method Summary collapse
- #can_have_child?(name, is_dir) ⇒ Boolean
- #child(name) ⇒ Object
- #children ⇒ Object
- #create_child_from(other, options = {}) ⇒ Object
-
#initialize(parent) ⇒ CookbooksDir
constructor
A new instance of CookbooksDir.
-
#upload_cookbook!(uploader, options = {}) ⇒ Object
Chef 11 changes this API.
- #upload_cookbook_from(other, options = {}) ⇒ Object
- #upload_unversioned_cookbook(other, options) ⇒ Object
-
#upload_versioned_cookbook(other, options) ⇒ Object
Knife currently does not understand versioned cookbooks Cookbook Version uploader also requires a lot of refactoring to make this work.
-
#with_actual_cookbooks_dir(actual_cookbook_path) ⇒ Object
Work around the fact that CookbookUploader doesn’t understand chef_repo_path (yet).
Methods inherited from RestListDir
#_make_child_entry, #create_child, #environment, #org, #rest
Methods inherited from BaseFSDir
Methods inherited from BaseFSObject
#chef_object, #compare_to, #create_child, #delete, #dir?, #exists?, #path_for_printing, #read, #root, #write
Constructor Details
#initialize(parent) ⇒ CookbooksDir
Returns a new instance of CookbooksDir.
31 32 33 |
# File 'lib/chef_fs/file_system/cookbooks_dir.rb', line 31 def initialize(parent) super("cookbooks", parent) end |
Instance Method Details
#can_have_child?(name, is_dir) ⇒ Boolean
142 143 144 145 146 |
# File 'lib/chef_fs/file_system/cookbooks_dir.rb', line 142 def can_have_child?(name, is_dir) return false if !is_dir return false if Chef::Config[:versioned_cookbooks] && name !~ ChefFS::FileSystem::CookbookDir::VALID_VERSIONED_COOKBOOK_NAME return true end |
#child(name) ⇒ Object
35 36 37 38 39 40 41 42 43 44 45 46 |
# File 'lib/chef_fs/file_system/cookbooks_dir.rb', line 35 def child(name) if @children result = self.children.select { |child| child.name == name }.first if result result else NonexistentFSObject.new(name, self) end else CookbookDir.new(name, self) end end |
#children ⇒ Object
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/chef_fs/file_system/cookbooks_dir.rb', line 48 def children @children ||= begin if Chef::Config[:versioned_cookbooks] result = [] ChefFS::RawRequest.raw_json(rest, "#{api_path}/?num_versions=all").each_pair do |cookbook_name, cookbooks| cookbooks['versions'].each do |cookbook_version| result << CookbookDir.new("#{cookbook_name}-#{cookbook_version['version']}", self, :exists => true) end end else result = ChefFS::RawRequest.raw_json(rest, api_path).keys.map { |cookbook_name| CookbookDir.new(cookbook_name, self, :exists => true) } end result.sort_by(&:name) end end |
#create_child_from(other, options = {}) ⇒ Object
64 65 66 67 |
# File 'lib/chef_fs/file_system/cookbooks_dir.rb', line 64 def create_child_from(other, = {}) @children = nil upload_cookbook_from(other, ) end |
#upload_cookbook!(uploader, options = {}) ⇒ Object
Chef 11 changes this API
134 135 136 137 138 139 140 |
# File 'lib/chef_fs/file_system/cookbooks_dir.rb', line 134 def upload_cookbook!(uploader, = {}) if uploader.respond_to?(:upload_cookbook) uploader.upload_cookbook else uploader.upload_cookbooks end end |
#upload_cookbook_from(other, options = {}) ⇒ Object
69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/chef_fs/file_system/cookbooks_dir.rb', line 69 def upload_cookbook_from(other, = {}) Chef::Config[:versioned_cookbooks] ? upload_versioned_cookbook(other, ) : upload_unversioned_cookbook(other, ) rescue Timeout::Error => e raise ChefFS::FileSystem::OperationFailedError.new(:write, self, e), "Timeout writing: #{e}" rescue Net::HTTPServerException => e case e.response.code when "409" raise ChefFS::FileSystem::CookbookFrozenError.new(:write, self, e), "Cookbook #{other.name} is frozen" else raise ChefFS::FileSystem::OperationFailedError.new(:write, self, e), "HTTP error writing: #{e}" end rescue Chef::Exceptions::CookbookFrozen => e raise ChefFS::FileSystem::CookbookFrozenError.new(:write, self, e), "Cookbook #{other.name} is frozen" end |
#upload_unversioned_cookbook(other, options) ⇒ Object
113 114 115 116 117 118 119 120 121 |
# File 'lib/chef_fs/file_system/cookbooks_dir.rb', line 113 def upload_unversioned_cookbook(other, ) cookbook_to_upload = other.chef_object cookbook_to_upload.freeze_version if [:freeze] uploader = Chef::CookbookUploader.new(cookbook_to_upload, other.parent.file_path, :force => [:force], :rest => rest) with_actual_cookbooks_dir(other.parent.file_path) do upload_cookbook!(uploader) end end |
#upload_versioned_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.
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/chef_fs/file_system/cookbooks_dir.rb', line 88 def upload_versioned_cookbook(other, ) cookbook_name = ChefFS::FileSystem::ChefRepositoryFileSystemCookbookDir.canonical_cookbook_name(other.name) Dir.mktmpdir do |temp_cookbooks_path| proxy_cookbook_path = "#{temp_cookbooks_path}/#{cookbook_name}" # Make a symlink File.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.freeze_version if [:freeze] # Instantiate a new uploader based on the proxy loader uploader = Chef::CookbookUploader.new(cookbook_to_upload, proxy_cookbook_path, :force => [:force], :rest => rest) with_actual_cookbooks_dir(temp_cookbooks_path) do upload_cookbook!(uploader) end end end |
#with_actual_cookbooks_dir(actual_cookbook_path) ⇒ Object
Work around the fact that CookbookUploader doesn’t understand chef_repo_path (yet)
124 125 126 127 128 129 130 131 |
# File 'lib/chef_fs/file_system/cookbooks_dir.rb', line 124 def with_actual_cookbooks_dir(actual_cookbook_path) old_cookbook_path = Chef::Config.cookbook_path Chef::Config.cookbook_path = actual_cookbook_path if !Chef::Config.cookbook_path yield ensure Chef::Config.cookbook_path = old_cookbook_path end |