class Chef::ChefFS::FileSystem::ChefServer::RestListDir

Attributes

api_path[R]
data_handler[R]

Public Class Methods

new(name, parent, api_path = nil, data_handler = nil) click to toggle source
# File lib/chef/chef_fs/file_system/chef_server/rest_list_dir.rb, line 28
def initialize(name, parent, api_path = nil, data_handler = nil)
  super(name, parent)
  @api_path = api_path || (parent.api_path == "" ? name : "#{parent.api_path}/#{name}")
  @data_handler = data_handler
end

Public Instance Methods

can_have_child?(name, is_dir) click to toggle source
# File lib/chef/chef_fs/file_system/chef_server/rest_list_dir.rb, line 37
def can_have_child?(name, is_dir)
  !is_dir
end
children() click to toggle source

Does GET /<api_path>, assumes the result is of the format:

{

"foo": "<api_path>/foo",
"bar": "<api_path>/bar",

}

Children are foo.json and bar.json in this case.

# File lib/chef/chef_fs/file_system/chef_server/rest_list_dir.rb, line 73
def children
  # Grab the names of the children, append json, and make child entries
  @children ||= root.get_json(api_path).keys.sort.map do |key|
    make_child_entry(key, true)
  end
rescue Timeout::Error => e
  raise Chef::ChefFS::FileSystem::OperationFailedError.new(:children, self, e, "Timeout retrieving children: #{e}")
rescue Net::HTTPClientException => e
  # 404 = NotFoundError
  if $!.response.code == "404"

    if parent.is_a?(ChefServerRootDir)
      # GET /organizations/ORG/<container> returned 404, but that just might be because
      # we are talking to an older version of the server that doesn't support policies.
      # Do GET /organizations/ORG to find out if the org exists at all.
      # TODO use server API version instead of a second network request.
      begin
        root.get_json(parent.api_path)
        # Return empty list if the organization exists but /policies didn't work
        []
      rescue Net::HTTPClientException => e
        if e.response.code == "404"
          raise Chef::ChefFS::FileSystem::NotFoundError.new(self, $!)
        end

        raise Chef::ChefFS::FileSystem::OperationFailedError.new(:children, self, e, "HTTP error retrieving children: #{e}")
      end
    else
      raise Chef::ChefFS::FileSystem::NotFoundError.new(self, $!)
    end

  # Anything else is unexpected (OperationFailedError)
  else
    raise Chef::ChefFS::FileSystem::OperationFailedError.new(:children, self, e, "HTTP error retrieving children: #{e}")
  end
end
create_child(name, file_contents) click to toggle source

Does POST <api_path> with file_contents

# File lib/chef/chef_fs/file_system/chef_server/rest_list_dir.rb, line 113
def create_child(name, file_contents)
  # Parse the contents to ensure they are valid JSON
  begin
    object = Chef::JSONCompat.parse(file_contents)
  rescue Chef::Exceptions::JSON::ParseError => e
    raise Chef::ChefFS::FileSystem::OperationFailedError.new(:create_child, self, e, "Parse error reading JSON creating child '#{name}': #{e}")
  end

  # Create the child entry that will be returned
  result = make_child_entry(name, true)

  # Normalize the file_contents before post (add defaults, etc.)
  if data_handler
    object = data_handler.normalize_for_post(object, result)
    data_handler.verify_integrity(object, result) do |error|
      raise Chef::ChefFS::FileSystem::OperationFailedError.new(:create_child, self, nil, "Error creating '#{name}': #{error}")
    end
  end

  # POST /api_path with the normalized file_contents
  begin
    rest.post(api_path, object)
  rescue Timeout::Error => e
    raise Chef::ChefFS::FileSystem::OperationFailedError.new(:create_child, self, e, "Timeout creating '#{name}': #{e}")
  rescue Net::HTTPClientException => e
    # 404 = NotFoundError
    if e.response.code == "404"
      raise Chef::ChefFS::FileSystem::NotFoundError.new(self, e)
    # 409 = AlreadyExistsError
    elsif $!.response.code == "409"
      raise Chef::ChefFS::FileSystem::AlreadyExistsError.new(:create_child, self, e, "Failure creating '#{name}': #{path}/#{name} already exists")
    # Anything else is unexpected (OperationFailedError)
    else
      raise Chef::ChefFS::FileSystem::OperationFailedError.new(:create_child, self, e, "Failure creating '#{name}': #{e.message}")
    end
  end

  # Clear the cache of children so that if someone asks for children
  # again, we will get it again
  @children = nil

  result
end
environment() click to toggle source
# File lib/chef/chef_fs/file_system/chef_server/rest_list_dir.rb, line 161
def environment
  parent.environment
end
make_child_entry(name, exists = nil) click to toggle source
# File lib/chef/chef_fs/file_system/chef_server/rest_list_dir.rb, line 169
def make_child_entry(name, exists = nil)
  @children.find { |child| child.name == name } if @children
  RestListEntry.new(name, self, exists)
end
org() click to toggle source
# File lib/chef/chef_fs/file_system/chef_server/rest_list_dir.rb, line 157
def org
  parent.org
end
rest() click to toggle source
# File lib/chef/chef_fs/file_system/chef_server/rest_list_dir.rb, line 165
def rest
  parent.rest
end