Skip to content

Commit 48e7e0f

Browse files
Thom MaySeth Falcon
authored andcommitted
implement dependency version matching for cookbooks
1 parent 5b00cf4 commit 48e7e0f

1 file changed

Lines changed: 26 additions & 1 deletion

File tree

chef-server-api/app/controllers/nodes.rb

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
# limitations under the License.
1818
#
1919

20+
require 'chef/cookbook/metadata/version'
2021
require 'chef' / 'node'
2122

2223
class Nodes < Application
@@ -26,6 +27,17 @@ class Nodes < Application
2627
before :authenticate_every
2728
before :admin_or_requesting_node, :only => [ :update, :destroy, :cookbooks ]
2829

30+
CMP = {
31+
"<<" => lambda { |v, r| v < r },
32+
"<=" => lambda { |v, r| v <= r },
33+
"=" => lambda { |v, r| v == r },
34+
">=" => lambda { |v, r| v >= r },
35+
">>" => lambda { |v, r| v > r }
36+
}
37+
38+
qcmp = CMP.keys.map { |k| Regexp.quote k }.join "|"
39+
PATTERN = /\A\s*(#{qcmp})?\s*(#{Chef::Cookbook::Metadata::Version::PATTERN})\s*\z/
40+
2941
def index
3042
@node_list = Chef::Node.cdb_list
3143
display(@node_list.inject({}) do |r,n|
@@ -91,6 +103,20 @@ def cookbooks
91103

92104
private
93105

106+
def satisfy(cookbook, req=nil)
107+
r = req.to_s
108+
versions = Chef::CookbookVersion.cdb_by_name(cookbook_name)
109+
if r.nil? or r.empty?
110+
versions
111+
elsif r =~ PATTERN
112+
comp = $1 || "="
113+
ver = Chef::Cookbook::Metadata::Version.new $2
114+
versions.select { |v| CMP[comp].call Chef::Cookbook::Metadata::Version.new(v), ver}
115+
else
116+
raise ArgumentError, "Unrecognized dependency specification: #{r}"
117+
end
118+
end
119+
94120
def load_all_files
95121
all_cookbooks = Chef::Environment.cdb_load_filtered_cookbook_versions(@node.chef_environment)
96122

@@ -160,4 +186,3 @@ def expand_cookbook_deps(included_cookbooks, all_cookbooks, run_list_item)
160186
end
161187

162188
end
163-

0 commit comments

Comments
 (0)