chef-zero 4.2.3 → 4.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +201 -201
  3. data/README.md +155 -150
  4. data/Rakefile +31 -31
  5. data/bin/chef-zero +100 -100
  6. data/lib/chef_zero.rb +10 -7
  7. data/lib/chef_zero/chef_data/acl_path.rb +139 -139
  8. data/lib/chef_zero/chef_data/cookbook_data.rb +240 -240
  9. data/lib/chef_zero/chef_data/data_normalizer.rb +207 -207
  10. data/lib/chef_zero/chef_data/default_creator.rb +446 -446
  11. data/lib/chef_zero/data_store/data_already_exists_error.rb +29 -29
  12. data/lib/chef_zero/data_store/data_error.rb +31 -31
  13. data/lib/chef_zero/data_store/data_not_found_error.rb +28 -28
  14. data/lib/chef_zero/data_store/default_facade.rb +149 -149
  15. data/lib/chef_zero/data_store/interface_v1.rb +67 -67
  16. data/lib/chef_zero/data_store/interface_v2.rb +18 -18
  17. data/lib/chef_zero/data_store/memory_store.rb +33 -33
  18. data/lib/chef_zero/data_store/memory_store_v2.rb +155 -155
  19. data/lib/chef_zero/data_store/raw_file_store.rb +147 -147
  20. data/lib/chef_zero/data_store/v1_to_v2_adapter.rb +142 -142
  21. data/lib/chef_zero/data_store/v2_to_v1_adapter.rb +107 -107
  22. data/lib/chef_zero/endpoints/acl_endpoint.rb +38 -38
  23. data/lib/chef_zero/endpoints/acls_endpoint.rb +29 -29
  24. data/lib/chef_zero/endpoints/actor_endpoint.rb +94 -88
  25. data/lib/chef_zero/endpoints/actors_endpoint.rb +64 -64
  26. data/lib/chef_zero/endpoints/authenticate_user_endpoint.rb +31 -31
  27. data/lib/chef_zero/endpoints/container_endpoint.rb +22 -22
  28. data/lib/chef_zero/endpoints/containers_endpoint.rb +13 -13
  29. data/lib/chef_zero/endpoints/cookbook_endpoint.rb +39 -39
  30. data/lib/chef_zero/endpoints/cookbook_version_endpoint.rb +119 -119
  31. data/lib/chef_zero/endpoints/cookbooks_base.rb +65 -65
  32. data/lib/chef_zero/endpoints/cookbooks_endpoint.rb +19 -19
  33. data/lib/chef_zero/endpoints/data_bag_endpoint.rb +45 -45
  34. data/lib/chef_zero/endpoints/data_bag_item_endpoint.rb +25 -25
  35. data/lib/chef_zero/endpoints/data_bags_endpoint.rb +23 -23
  36. data/lib/chef_zero/endpoints/environment_cookbook_endpoint.rb +24 -24
  37. data/lib/chef_zero/endpoints/environment_cookbook_versions_endpoint.rb +123 -123
  38. data/lib/chef_zero/endpoints/environment_cookbooks_endpoint.rb +22 -22
  39. data/lib/chef_zero/endpoints/environment_endpoint.rb +33 -33
  40. data/lib/chef_zero/endpoints/environment_nodes_endpoint.rb +23 -23
  41. data/lib/chef_zero/endpoints/environment_recipes_endpoint.rb +22 -22
  42. data/lib/chef_zero/endpoints/environment_role_endpoint.rb +36 -36
  43. data/lib/chef_zero/endpoints/file_store_file_endpoint.rb +22 -22
  44. data/lib/chef_zero/endpoints/group_endpoint.rb +20 -20
  45. data/lib/chef_zero/endpoints/groups_endpoint.rb +13 -13
  46. data/lib/chef_zero/endpoints/license_endpoint.rb +25 -25
  47. data/lib/chef_zero/endpoints/node_endpoint.rb +17 -17
  48. data/lib/chef_zero/endpoints/node_identifiers_endpoint.rb +22 -0
  49. data/lib/chef_zero/endpoints/not_found_endpoint.rb +11 -11
  50. data/lib/chef_zero/endpoints/organization_association_request_endpoint.rb +22 -22
  51. data/lib/chef_zero/endpoints/organization_association_requests_endpoint.rb +30 -29
  52. data/lib/chef_zero/endpoints/organization_authenticate_user_endpoint.rb +26 -26
  53. data/lib/chef_zero/endpoints/organization_endpoint.rb +46 -41
  54. data/lib/chef_zero/endpoints/organization_user_base.rb +15 -0
  55. data/lib/chef_zero/endpoints/organization_user_endpoint.rb +26 -48
  56. data/lib/chef_zero/endpoints/organization_users_endpoint.rb +43 -14
  57. data/lib/chef_zero/endpoints/organization_validator_key_endpoint.rb +20 -20
  58. data/lib/chef_zero/endpoints/organizations_endpoint.rb +62 -55
  59. data/lib/chef_zero/endpoints/policies_endpoint.rb +151 -154
  60. data/lib/chef_zero/endpoints/principal_endpoint.rb +42 -42
  61. data/lib/chef_zero/endpoints/rest_list_endpoint.rb +42 -42
  62. data/lib/chef_zero/endpoints/rest_object_endpoint.rb +63 -63
  63. data/lib/chef_zero/endpoints/role_endpoint.rb +16 -16
  64. data/lib/chef_zero/endpoints/role_environments_endpoint.rb +14 -14
  65. data/lib/chef_zero/endpoints/sandbox_endpoint.rb +27 -27
  66. data/lib/chef_zero/endpoints/sandboxes_endpoint.rb +50 -50
  67. data/lib/chef_zero/endpoints/search_endpoint.rb +194 -192
  68. data/lib/chef_zero/endpoints/searches_endpoint.rb +18 -18
  69. data/lib/chef_zero/endpoints/server_api_version_endpoint.rb +14 -0
  70. data/lib/chef_zero/endpoints/system_recovery_endpoint.rb +30 -30
  71. data/lib/chef_zero/endpoints/user_association_request_endpoint.rb +40 -40
  72. data/lib/chef_zero/endpoints/user_association_requests_count_endpoint.rb +19 -19
  73. data/lib/chef_zero/endpoints/user_association_requests_endpoint.rb +19 -19
  74. data/lib/chef_zero/endpoints/user_organizations_endpoint.rb +22 -22
  75. data/lib/chef_zero/endpoints/version_endpoint.rb +12 -12
  76. data/lib/chef_zero/log.rb +7 -7
  77. data/lib/chef_zero/rest_base.rb +242 -214
  78. data/lib/chef_zero/rest_error_response.rb +11 -11
  79. data/lib/chef_zero/rest_request.rb +69 -65
  80. data/lib/chef_zero/rest_router.rb +45 -45
  81. data/lib/chef_zero/rspec.rb +308 -308
  82. data/lib/chef_zero/server.rb +642 -637
  83. data/lib/chef_zero/socketless_server_map.rb +92 -92
  84. data/lib/chef_zero/solr/query/binary_operator.rb +52 -52
  85. data/lib/chef_zero/solr/query/phrase.rb +23 -23
  86. data/lib/chef_zero/solr/query/range_query.rb +46 -46
  87. data/lib/chef_zero/solr/query/regexpable_query.rb +29 -29
  88. data/lib/chef_zero/solr/query/subquery.rb +37 -37
  89. data/lib/chef_zero/solr/query/term.rb +45 -45
  90. data/lib/chef_zero/solr/query/unary_operator.rb +43 -43
  91. data/lib/chef_zero/solr/solr_doc.rb +53 -53
  92. data/lib/chef_zero/solr/solr_parser.rb +203 -203
  93. data/lib/chef_zero/version.rb +3 -3
  94. data/spec/run_oc_pedant.rb +63 -56
  95. data/spec/search_spec.rb +32 -32
  96. data/spec/server_spec.rb +92 -91
  97. data/spec/socketless_server_map_spec.rb +76 -76
  98. data/spec/support/oc_pedant.rb +132 -134
  99. data/spec/support/stickywicket.pem +27 -27
  100. metadata +10 -15
  101. data/spec/run_pedant.rb +0 -103
  102. data/spec/support/pedant.rb +0 -129
@@ -1,92 +1,92 @@
1
- #
2
- # Author:: Daniel DeLeo (<dan@chef.io>)
3
- # Copyright:: Copyright (c) 2012 Opscode, Inc.
4
- # License:: Apache License, Version 2.0
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
- #
18
-
19
- require 'thread'
20
- require 'singleton'
21
-
22
- module ChefZero
23
-
24
- class ServerNotFound < StandardError
25
- end
26
-
27
- class NoSocketlessPortAvailable < StandardError
28
- end
29
-
30
- class SocketlessServerMap
31
-
32
- def self.request(port, request_env)
33
- instance.request(port, request_env)
34
- end
35
-
36
- def self.server_on_port(port)
37
- instance.server_on_port(port)
38
- end
39
-
40
- MUTEX = Mutex.new
41
-
42
- include Singleton
43
-
44
- def initialize()
45
- reset!
46
- end
47
-
48
- def reset!
49
- @servers_by_port = {}
50
- end
51
-
52
- def register_port(port, server)
53
- MUTEX.synchronize do
54
- @servers_by_port[port] = server
55
- end
56
- end
57
-
58
- def register_no_listen_server(server)
59
- MUTEX.synchronize do
60
- 1.upto(1000) do |port|
61
- unless @servers_by_port.key?(port)
62
- @servers_by_port[port] = server
63
- return port
64
- end
65
- end
66
- raise NoSocketlessPortAvailable, "No socketless ports left to register"
67
- end
68
- end
69
-
70
- def has_server_on_port?(port)
71
- @servers_by_port.key?(port)
72
- end
73
-
74
- def server_on_port(port)
75
- @servers_by_port[port]
76
- end
77
-
78
- def deregister(port)
79
- MUTEX.synchronize do
80
- @servers_by_port.delete(port)
81
- end
82
- end
83
-
84
- def request(port, request_env)
85
- server = @servers_by_port[port]
86
- raise ServerNotFound, "No socketless chef-zero server on given port #{port.inspect}" unless server
87
- server.handle_socketless_request(request_env)
88
- end
89
-
90
- end
91
- end
92
-
1
+ #
2
+ # Author:: Daniel DeLeo (<dan@chef.io>)
3
+ # Copyright:: Copyright (c) 2012 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'thread'
20
+ require 'singleton'
21
+
22
+ module ChefZero
23
+
24
+ class ServerNotFound < StandardError
25
+ end
26
+
27
+ class NoSocketlessPortAvailable < StandardError
28
+ end
29
+
30
+ class SocketlessServerMap
31
+
32
+ def self.request(port, request_env)
33
+ instance.request(port, request_env)
34
+ end
35
+
36
+ def self.server_on_port(port)
37
+ instance.server_on_port(port)
38
+ end
39
+
40
+ MUTEX = Mutex.new
41
+
42
+ include Singleton
43
+
44
+ def initialize()
45
+ reset!
46
+ end
47
+
48
+ def reset!
49
+ @servers_by_port = {}
50
+ end
51
+
52
+ def register_port(port, server)
53
+ MUTEX.synchronize do
54
+ @servers_by_port[port] = server
55
+ end
56
+ end
57
+
58
+ def register_no_listen_server(server)
59
+ MUTEX.synchronize do
60
+ 1.upto(1000) do |port|
61
+ unless @servers_by_port.key?(port)
62
+ @servers_by_port[port] = server
63
+ return port
64
+ end
65
+ end
66
+ raise NoSocketlessPortAvailable, "No socketless ports left to register"
67
+ end
68
+ end
69
+
70
+ def has_server_on_port?(port)
71
+ @servers_by_port.key?(port)
72
+ end
73
+
74
+ def server_on_port(port)
75
+ @servers_by_port[port]
76
+ end
77
+
78
+ def deregister(port)
79
+ MUTEX.synchronize do
80
+ @servers_by_port.delete(port)
81
+ end
82
+ end
83
+
84
+ def request(port, request_env)
85
+ server = @servers_by_port[port]
86
+ raise ServerNotFound, "No socketless chef-zero server on given port #{port.inspect}" unless server
87
+ server.handle_socketless_request(request_env)
88
+ end
89
+
90
+ end
91
+ end
92
+
@@ -1,52 +1,52 @@
1
- module ChefZero
2
- module Solr
3
- module Query
4
- class BinaryOperator
5
- def initialize(left, operator, right)
6
- @left = left
7
- @operator = operator
8
- @right = right
9
- end
10
-
11
- def to_s
12
- "(#{left} #{operator} #{right})"
13
- end
14
-
15
- attr_reader :left
16
- attr_reader :operator
17
- attr_reader :right
18
-
19
- def matches_doc?(doc)
20
- case @operator
21
- when 'AND'
22
- left.matches_doc?(doc) && right.matches_doc?(doc)
23
- when 'OR'
24
- left.matches_doc?(doc) || right.matches_doc?(doc)
25
- when '^'
26
- left.matches_doc?(doc)
27
- when ':'
28
- if left.respond_to?(:literal_string) && left.literal_string
29
- values = doc[left.literal_string]
30
- else
31
- values = doc.matching_values { |key| left.matches_values?([key]) }
32
- end
33
- right.matches_values?(values)
34
- end
35
- end
36
-
37
- def matches_values?(values)
38
- case @operator
39
- when 'AND'
40
- left.matches_values?(values) && right.matches_values?(values)
41
- when 'OR'
42
- left.matches_values?(values) || right.matches_values?(values)
43
- when '^'
44
- left.matches_values?(values)
45
- when ':'
46
- raise ": does not work inside a : or term"
47
- end
48
- end
49
- end
50
- end
51
- end
52
- end
1
+ module ChefZero
2
+ module Solr
3
+ module Query
4
+ class BinaryOperator
5
+ def initialize(left, operator, right)
6
+ @left = left
7
+ @operator = operator
8
+ @right = right
9
+ end
10
+
11
+ def to_s
12
+ "(#{left} #{operator} #{right})"
13
+ end
14
+
15
+ attr_reader :left
16
+ attr_reader :operator
17
+ attr_reader :right
18
+
19
+ def matches_doc?(doc)
20
+ case @operator
21
+ when 'AND'
22
+ left.matches_doc?(doc) && right.matches_doc?(doc)
23
+ when 'OR'
24
+ left.matches_doc?(doc) || right.matches_doc?(doc)
25
+ when '^'
26
+ left.matches_doc?(doc)
27
+ when ':'
28
+ if left.respond_to?(:literal_string) && left.literal_string
29
+ values = doc[left.literal_string]
30
+ else
31
+ values = doc.matching_values { |key| left.matches_values?([key]) }
32
+ end
33
+ right.matches_values?(values)
34
+ end
35
+ end
36
+
37
+ def matches_values?(values)
38
+ case @operator
39
+ when 'AND'
40
+ left.matches_values?(values) && right.matches_values?(values)
41
+ when 'OR'
42
+ left.matches_values?(values) || right.matches_values?(values)
43
+ when '^'
44
+ left.matches_values?(values)
45
+ when ':'
46
+ raise ": does not work inside a : or term"
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -1,23 +1,23 @@
1
- require 'chef_zero/solr/query/regexpable_query'
2
-
3
- module ChefZero
4
- module Solr
5
- module Query
6
- class Phrase < RegexpableQuery
7
- def initialize(terms)
8
- # Phrase is terms separated by whitespace
9
- if terms.size == 0 && terms[0].literal_string
10
- literal_string = terms[0].literal_string
11
- else
12
- literal_string = nil
13
- end
14
- super(terms.map { |term| term.regexp_string }.join("#{NON_WORD_CHARACTER}+"), literal_string)
15
- end
16
-
17
- def to_s
18
- "Phrase(\"#{@regexp_string}\")"
19
- end
20
- end
21
- end
22
- end
23
- end
1
+ require 'chef_zero/solr/query/regexpable_query'
2
+
3
+ module ChefZero
4
+ module Solr
5
+ module Query
6
+ class Phrase < RegexpableQuery
7
+ def initialize(terms)
8
+ # Phrase is terms separated by whitespace
9
+ if terms.size == 0 && terms[0].literal_string
10
+ literal_string = terms[0].literal_string
11
+ else
12
+ literal_string = nil
13
+ end
14
+ super(terms.map { |term| term.regexp_string }.join("#{NON_WORD_CHARACTER}+"), literal_string)
15
+ end
16
+
17
+ def to_s
18
+ "Phrase(\"#{@regexp_string}\")"
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,46 +1,46 @@
1
- module ChefZero
2
- module Solr
3
- module Query
4
- class RangeQuery
5
- def initialize(from, to, from_inclusive, to_inclusive)
6
- @from = from
7
- @to = to
8
- @from_inclusive = from_inclusive
9
- @to_inclusive = to_inclusive
10
- end
11
-
12
- def to_s
13
- "#{@from_inclusive ? '[' : '{'}#{@from} TO #{@to}#{@to_inclusive ? ']' : '}'}"
14
- end
15
-
16
- def matches_values?(values)
17
- values.any? do |value|
18
- unless @from == '*'
19
- case @from <=> value
20
- when -1
21
- return false
22
- when 0
23
- return false if !@from_inclusive
24
- end
25
- end
26
- unless @to == '*'
27
- case value <=> @to
28
- when 1
29
- return false
30
- when 0
31
- return false if !@to_inclusive
32
- end
33
- end
34
- return true
35
- end
36
- end
37
-
38
- def matches_doc?(doc)
39
- matches_values?(doc[DEFAULT_FIELD])
40
- end
41
-
42
- DEFAULT_FIELD = "text"
43
- end
44
- end
45
- end
46
- end
1
+ module ChefZero
2
+ module Solr
3
+ module Query
4
+ class RangeQuery
5
+ def initialize(from, to, from_inclusive, to_inclusive)
6
+ @from = from
7
+ @to = to
8
+ @from_inclusive = from_inclusive
9
+ @to_inclusive = to_inclusive
10
+ end
11
+
12
+ def to_s
13
+ "#{@from_inclusive ? '[' : '{'}#{@from} TO #{@to}#{@to_inclusive ? ']' : '}'}"
14
+ end
15
+
16
+ def matches_values?(values)
17
+ values.any? do |value|
18
+ unless @from == '*'
19
+ case @from <=> value
20
+ when -1
21
+ return false
22
+ when 0
23
+ return false if !@from_inclusive
24
+ end
25
+ end
26
+ unless @to == '*'
27
+ case value <=> @to
28
+ when 1
29
+ return false
30
+ when 0
31
+ return false if !@to_inclusive
32
+ end
33
+ end
34
+ return true
35
+ end
36
+ end
37
+
38
+ def matches_doc?(doc)
39
+ matches_values?(doc[DEFAULT_FIELD])
40
+ end
41
+
42
+ DEFAULT_FIELD = "text"
43
+ end
44
+ end
45
+ end
46
+ end
@@ -1,29 +1,29 @@
1
- module ChefZero
2
- module Solr
3
- module Query
4
- class RegexpableQuery
5
- def initialize(regexp_string, literal_string)
6
- @regexp_string = regexp_string
7
- # Surround the regexp with word boundaries
8
- @regexp = Regexp.new("(^|#{NON_WORD_CHARACTER})#{regexp_string}($|#{NON_WORD_CHARACTER})", true)
9
- @literal_string = literal_string
10
- end
11
-
12
- attr_reader :literal_string
13
- attr_reader :regexp_string
14
- attr_reader :regexp
15
-
16
- def matches_doc?(doc)
17
- matches_values?(doc[DEFAULT_FIELD])
18
- end
19
- def matches_values?(values)
20
- values.any? { |value| !@regexp.match(value).nil? }
21
- end
22
-
23
- DEFAULT_FIELD = "text"
24
- WORD_CHARACTER = "[A-Za-z0-9@._':]"
25
- NON_WORD_CHARACTER = "[^A-Za-z0-9@._':]"
26
- end
27
- end
28
- end
29
- end
1
+ module ChefZero
2
+ module Solr
3
+ module Query
4
+ class RegexpableQuery
5
+ def initialize(regexp_string, literal_string)
6
+ @regexp_string = regexp_string
7
+ # Surround the regexp with word boundaries
8
+ @regexp = Regexp.new("(^|#{NON_WORD_CHARACTER})#{regexp_string}($|#{NON_WORD_CHARACTER})", true)
9
+ @literal_string = literal_string
10
+ end
11
+
12
+ attr_reader :literal_string
13
+ attr_reader :regexp_string
14
+ attr_reader :regexp
15
+
16
+ def matches_doc?(doc)
17
+ matches_values?(doc[DEFAULT_FIELD])
18
+ end
19
+ def matches_values?(values)
20
+ values.any? { |value| !@regexp.match(value).nil? }
21
+ end
22
+
23
+ DEFAULT_FIELD = "text"
24
+ WORD_CHARACTER = "[A-Za-z0-9@._':]"
25
+ NON_WORD_CHARACTER = "[^A-Za-z0-9@._':]"
26
+ end
27
+ end
28
+ end
29
+ end