Class: Chef::ChefFS::FileSystem::ChefServer::VersionedCookbooksDir

Inherits:
CookbooksDir show all
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

#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

Returns:

  • (Boolean)
[View source]

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_restObject

[View source]

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.options.merge(version_class: Chef::CookbookManifestVersions))
end

#childrenObject

[View source]

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

[View source]

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.

[View source]

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, options)
  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 options[:freeze]

    # Instantiate a new uploader based on the proxy loader
    uploader = Chef::CookbookUploader.new(cookbook_to_upload, force: options[: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