summaryrefslogtreecommitdiff
path: root/lib/chef/chef_fs/file_system/policies_dir.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/chef/chef_fs/file_system/policies_dir.rb')
-rw-r--r--lib/chef/chef_fs/file_system/policies_dir.rb158
1 files changed, 0 insertions, 158 deletions
diff --git a/lib/chef/chef_fs/file_system/policies_dir.rb b/lib/chef/chef_fs/file_system/policies_dir.rb
deleted file mode 100644
index a999ca0218..0000000000
--- a/lib/chef/chef_fs/file_system/policies_dir.rb
+++ /dev/null
@@ -1,158 +0,0 @@
-#
-# Author:: John Keiser (<jkeiser@opscode.com>)
-# Copyright:: Copyright (c) 2012 Opscode, Inc.
-# License:: Apache License, Version 2.0
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-require 'chef/chef_fs/file_system/rest_list_dir'
-require 'chef/chef_fs/file_system/policy_revision_entry'
-
-class Chef
- module ChefFS
- module FileSystem
- #
- # 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
- #
- class PoliciesDir < RestListDir
- # 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": {}
- # }
-
- def make_child_entry(name, exists = nil)
- @children.select { |child| child.name == name }.first if @children
- PolicyRevisionEntry.new(name, self, exists)
- end
-
- # Children come from /policies in this format:
- # {
- # "foo": {
- # "uri": "https://api.opscode.com/organizations/essentials/policies/foo",
- # "revisions": {
- # "1.0.0": {
- #
- # },
- # "1.0.1": {
- #
- # }
- # }
- # }
- # }
- def children
- begin
- # 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"].keys.each 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::HTTPServerException => 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::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
- # Anything else is unexpected (OperationFailedError)
- else
- raise Chef::ChefFS::FileSystem::OperationFailedError.new(:children, self, e, "HTTP error retrieving children: #{e}")
- end
- end
- end
-
- #
- # Does POST <api_path> with file_contents
- #
- 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::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
-
- end
- end
- end
-end