1717# limitations under the License.
1818#
1919
20+ require 'chef/cookbook/metadata/version'
2021require 'chef' / 'node'
2122
2223class 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
162188end
163-
0 commit comments