Class: Chef::ResourceCollection::ResourceSet

Inherits:
Object
  • Object
show all
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]"

/^(.+)\[(.+?),(.+)\]$/
SINGLE_RESOURCE_MATCH =

Matches a single resource lookup specification, e.g., "service[nginx]"

/^(.+)\[(.*)\]$/
NAMELESS_RESOURCE_MATCH =

Matches e.g. "apt_update" with no name

/^([^\[\]\s]+)$/

Class Method Summary collapse

Instance Method Summary collapse

Methods included from ResourceCollectionSerialization

included, #is_chef_resource!, #to_hash, #to_json

Constructor Details

#initializeResourceSet

Returns a new instance of ResourceSet


38
39
40
# File 'lib/chef/resource_collection/resource_set.rb', line 38

def initialize
  @resources_by_key = Hash.new
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

Raises:

  • (ArgumentError)

64
65
66
67
68
69
70
71
72
73
# File 'lib/chef/resource_collection/resource_set.rb', line 64

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.


87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/chef/resource_collection/resource_set.rb', line 87

def find(*args)
  results = Array.new
  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

#keysObject


42
43
44
# File 'lib/chef/resource_collection/resource_set.rb', line 42

def keys
  @resources_by_key.keys
end

#lookup(key) ⇒ Object

Raises:

  • (ArgumentError)

54
55
56
57
58
59
60
61
62
# 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.

120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/chef/resource_collection/resource_set.rb', line 120

def validate_lookup_spec!(query_object)
  case query_object
    when Chef::Resource
      true
    when SINGLE_RESOURCE_MATCH, MULTIPLE_RESOURCE_MATCH, NAMELESS_RESOURCE_MATCH
      true
    when 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