Class: Chef::ChefFS::FileSystem::ChefServer::PoliciesDir
- Inherits:
-
RestListDir
- Object
- BaseFSObject
- BaseFSDir
- RestListDir
- Chef::ChefFS::FileSystem::ChefServer::PoliciesDir
- Defined in:
- lib/chef/chef_fs/file_system/chef_server/policies_dir.rb
Overview
Server API: /policies - list of policies by name
- /policies/NAME - represents a policy with all revisions
- /policies/NAME/revisions - list of revisions for that policy
- /policies/NAME/revisions/REVISION - actual policy-revision document
Local Repository and ChefFS: /policies - PoliciesDir - maps to server API /policies
- /policies/NAME-REVISION.json - PolicyRevision - maps to /policies/NAME/revisions/REVISION
Instance Attribute Summary
Attributes inherited from RestListDir
Attributes inherited from BaseFSObject
Instance Method Summary collapse
-
#children ⇒ Object
Children come from /policies in this format: { “foo”: { “uri”: “api.opscode.com/organizations/essentials/policies/foo”, “revisions”: { “1.0.0”: {.
-
#create_child(name, file_contents) ⇒ Object
Does POST <api_path> with file_contents.
-
#make_child_entry(name, exists = nil) ⇒ Object
Children: NAME-REVISION.json for all revisions of all policies.
Methods inherited from RestListDir
#can_have_child?, #environment, #initialize, #org, #rest
Methods inherited from BaseFSDir
#can_have_child?, #dir?, #empty?, #initialize
Methods inherited from BaseFSObject
#can_have_child?, #chef_object, #child, #compare_to, #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
#children ⇒ Object
Children come from /policies in this format: {
"foo": {
"uri": "https://api.opscode.com/organizations/essentials/policies/foo",
"revisions": {
"1.0.0": {
},
"1.0.1": {
}
}
}
}
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 99 100 101 102 103 104 105 |
# File 'lib/chef/chef_fs/file_system/chef_server/policies_dir.rb', line 68 def children # Grab the names of the children, append json, and make child entries @children ||= begin result = [] data = root.get_json(api_path) data.keys.sort.each do |policy_name| data[policy_name]["revisions"].each_key do |policy_revision| filename = "#{policy_name}-#{policy_revision}.json" result << make_child_entry(filename, true) end end result 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" # GET /organizations/ORG/policies 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 /orgqanizations/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 # 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 <api_path> with file_contents
110 111 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 |
# File 'lib/chef/chef_fs/file_system/chef_server/policies_dir.rb', line 110 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 policy_name, policy_revision = data_handler.name_and_revision(name) rest.post("#{api_path}/#{policy_name}/revisions", 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.}") end end # Clear the cache of children so that if someone asks for children # again, we will get it again @children = nil result end |
#make_child_entry(name, exists = nil) ⇒ Object
Children: NAME-REVISION.json for all revisions of all policies
/nodes:
"node1": "https://api.opscode.com/organizations/myorg/nodes/node1",
"node2": "https://api.opscode.com/organizations/myorg/nodes/node2",
/policies:
"foo": {
}
49 50 51 52 |
# File 'lib/chef/chef_fs/file_system/chef_server/policies_dir.rb', line 49 def make_child_entry(name, exists = nil) @children.find { |child| child.name == name } if @children PolicyRevisionEntry.new(name, self, exists) end |