Class: Chef::ResourceCollection::ResourceSet
- Inherits:
-
Object
- Object
- Chef::ResourceCollection::ResourceSet
- Includes:
- ResourceCollectionSerialization
- Defined in:
- lib/chef/resource_collection/resource_set.rb
Constant Summary collapse
- MULTIPLE_RESOURCE_MATCH =
Matches a multiple resource lookup specification, e.g., "service[nginx,unicorn]"
/^(.+)\[(.+?),(.+)\]$/.freeze
- SINGLE_RESOURCE_MATCH =
Matches a single resource lookup specification, e.g., "service[nginx]"
/^(.+)\[(.*)\]$/.freeze
- NAMELESS_RESOURCE_MATCH =
Matches e.g. "apt_update" with no name
/^([^\[\]\s]+)$/.freeze
Class Method Summary collapse
Instance Method Summary collapse
- #delete(key) ⇒ Object
-
#find(*args) ⇒ Object
(also: #resources)
Find existing resources by searching the list of existing resources.
-
#initialize ⇒ ResourceSet
constructor
A new instance of ResourceSet.
- #insert_as(resource, resource_type = nil, instance_name = nil) ⇒ Object
- #keys ⇒ Object
- #lookup(key) ⇒ Object
-
#validate_lookup_spec!(query_object) ⇒ Object
Returns true if +query_object+ is a valid string for looking up a resource, or raises InvalidResourceSpecification if not.
Methods included from ResourceCollectionSerialization
included, #is_chef_resource!, #to_h, #to_json
Constructor Details
#initialize ⇒ ResourceSet
Returns a new instance of ResourceSet.
38 39 40 |
# File 'lib/chef/resource_collection/resource_set.rb', line 38 def initialize @resources_by_key = {} end |
Class Method Details
.from_hash(o) ⇒ Object
138 139 140 141 142 143 144 |
# File 'lib/chef/resource_collection/resource_set.rb', line 138 def self.from_hash(o) collection = new rl = o["instance_vars"]["@resources_by_key"] resources = rl.merge(rl) { |k, r| Chef::Resource.from_hash(r) } collection.instance_variable_set(:@resources_by_key, resources) collection end |
Instance Method Details
#delete(key) ⇒ Object
66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/chef/resource_collection/resource_set.rb', line 66 def delete(key) raise ArgumentError, "Must pass a Chef::Resource or String to delete" unless key.is_a?(String) || key.is_a?(Chef::Resource) key = key.to_s res = @resources_by_key.delete(key) if res == @resources_by_key.default raise Chef::Exceptions::ResourceNotFound, "Cannot find a resource matching #{key} (did you define it first?)" end res end |
#find(*args) ⇒ Object Also known as: resources
Find existing resources by searching the list of existing resources. Possible forms are:
find(:file => "foobar") find(:file => [ "foobar", "baz" ]) find("file[foobar]", "file[baz]") find("file[foobar,baz]")
Returns the matching resource, or an Array of matching resources.
Raises an ArgumentError if you feed it bad lookup information Raises a Runtime Error if it can't find the resources you are looking for.
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
# File 'lib/chef/resource_collection/resource_set.rb', line 91 def find(*args) results = [] args.each do |arg| case arg when Hash results << find_resource_by_hash(arg) when String results << find_resource_by_string(arg) else msg = "arguments to #{self.class.name}#find should be of the form :resource => 'name' or 'resource[name]'" raise Chef::Exceptions::InvalidResourceSpecification, msg end end flat_results = results.flatten flat_results.length == 1 ? flat_results[0] : flat_results end |
#insert_as(resource, resource_type = nil, instance_name = nil) ⇒ Object
46 47 48 49 50 51 52 |
# File 'lib/chef/resource_collection/resource_set.rb', line 46 def insert_as(resource, resource_type = nil, instance_name = nil) is_chef_resource!(resource) resource_type ||= resource.resource_name instance_name ||= resource.name key = create_key(resource_type, instance_name) @resources_by_key[key] = resource end |
#keys ⇒ Object
42 43 44 |
# File 'lib/chef/resource_collection/resource_set.rb', line 42 def keys @resources_by_key.keys end |
#lookup(key) ⇒ Object
54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/chef/resource_collection/resource_set.rb', line 54 def lookup(key) raise ArgumentError, "Must pass a Chef::Resource or String to lookup" unless key.is_a?(String) || key.is_a?(Chef::Resource) key = key.to_s res = @resources_by_key[key] unless res raise Chef::Exceptions::ResourceNotFound, "Cannot find a resource matching #{key} (did you define it first?)" end res end |
#validate_lookup_spec!(query_object) ⇒ Object
Returns true if +query_object+ is a valid string for looking up a resource, or raises InvalidResourceSpecification if not. === Arguments
- query_object should be a string of the form "resource_type[resource_name]", a single element Hash (e.g., :service => "apache2"), or a Chef::Resource (this is the happy path). Other arguments will raise an exception. === Returns
- true returns true for all valid input. === Raises
- Chef::Exceptions::InvalidResourceSpecification for all invalid input.
124 125 126 127 128 129 130 131 132 133 134 135 136 |
# File 'lib/chef/resource_collection/resource_set.rb', line 124 def validate_lookup_spec!(query_object) case query_object when Chef::Resource, SINGLE_RESOURCE_MATCH, MULTIPLE_RESOURCE_MATCH, NAMELESS_RESOURCE_MATCH, Hash true when String raise Chef::Exceptions::InvalidResourceSpecification, "The string `#{query_object}' is not valid for resource collection lookup. Correct syntax is `resource_type[resource_name]'" else raise Chef::Exceptions::InvalidResourceSpecification, "The object `#{query_object.inspect}' is not valid for resource collection lookup. " + "Use a String like `resource_type[resource_name]' or a Chef::Resource object" end end |