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
# 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::HTTPServerException => 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::HTTPServerException => 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


112
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
# File 'lib/chef/chef_fs/file_system/chef_server/rest_list_dir.rb', line 112

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::HTTPServerException => 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


160
161
162
# File 'lib/chef/chef_fs/file_system/chef_server/rest_list_dir.rb', line 160

def environment
  parent.environment
end

#make_child_entry(name, exists = nil) ⇒ Object


168
169
170
171
# File 'lib/chef/chef_fs/file_system/chef_server/rest_list_dir.rb', line 168

def make_child_entry(name, exists = nil)
  @children.find { |child| child.name == name } if @children
  RestListEntry.new(name, self, exists)
end

#orgObject


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

def org
  parent.org
end

#restObject


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

def rest
  parent.rest
end