Class: Chef::ChefFS::FileSystem::ChefServer::RestListDir

Inherits:
BaseFSDir show all
Defined in:
lib/chef/chef_fs/file_system/chef_server/rest_list_dir.rb

Instance Attribute Summary collapse

Attributes inherited from BaseFSObject

#name, #parent, #path

Instance Method Summary collapse

Methods inherited from BaseFSDir

#dir?, #empty?

Methods inherited from BaseFSObject

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

Constructor Details

#initialize(name, parent, api_path = nil, data_handler = nil) ⇒ RestListDir

Returns a new instance of RestListDir.



28
29
30
31
32
# 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

Instance Attribute Details

#api_pathObject (readonly)

Returns the value of attribute api_path.



34
35
36
# File 'lib/chef/chef_fs/file_system/chef_server/rest_list_dir.rb', line 34

def api_path
  @api_path
end

#data_handlerObject (readonly)

Returns the value of attribute data_handler.



35
36
37
# File 'lib/chef/chef_fs/file_system/chef_server/rest_list_dir.rb', line 35

def data_handler
  @data_handler
end

Instance Method Details

#can_have_child?(name, is_dir) ⇒ Boolean

Returns:

  • (Boolean)


37
38
39
# 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

#childrenObject

Does GET /, assumes the result is of the format:

{ "foo": "/foo", "bar": "/bar", }

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



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
99
100
101
102
103
104
105
106
107
108
# 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) ⇒ Object

Does POST with file_contents



113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# 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

#environmentObject



161
162
163
# 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) ⇒ Object



169
170
171
172
# 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

#orgObject



157
158
159
# File 'lib/chef/chef_fs/file_system/chef_server/rest_list_dir.rb', line 157

def org
  parent.org
end

#restObject



165
166
167
# File 'lib/chef/chef_fs/file_system/chef_server/rest_list_dir.rb', line 165

def rest
  parent.rest
end