knife-essentials 1.0.0.beta4 → 1.0.0.beta5
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.
- data/lib/chef/knife/deps_essentials.rb +1 -1
- data/lib/chef_fs/data_handler/container_data_handler.rb +9 -2
- data/lib/chef_fs/data_handler/data_bag_item_data_handler.rb +14 -3
- data/lib/chef_fs/data_handler/data_handler_base.rb +11 -0
- data/lib/chef_fs/file_system/chef_server_root_dir.rb +1 -2
- data/lib/chef_fs/file_system/data_bag_dir.rb +0 -4
- data/lib/chef_fs/file_system/rest_list_dir.rb +4 -10
- data/lib/chef_fs/file_system/rest_list_entry.rb +3 -9
- data/lib/chef_fs/version.rb +1 -1
- data/spec/integration/deps_spec.rb +1 -1
- data/spec/integration/download_spec.rb +1 -1
- data/spec/integration/upload_spec.rb +6 -6
- data/spec/support/integration_helper.rb +1 -1
- metadata +1 -2
- data/lib/chef_fs/file_system/containers_dir.rb +0 -33
@@ -73,7 +73,7 @@ class Chef
|
|
73
73
|
def get_dependencies(entry)
|
74
74
|
begin
|
75
75
|
if entry.parent && entry.parent.path == '/cookbooks'
|
76
|
-
return entry.chef_object.metadata.dependencies.keys.map { |cookbook| "/cookbooks/#{cookbook}"}
|
76
|
+
return entry.chef_object.metadata.dependencies.keys.map { |cookbook| "/cookbooks/#{cookbook}" }
|
77
77
|
|
78
78
|
elsif entry.parent && entry.parent.path == '/nodes'
|
79
79
|
node = JSON.parse(entry.read, :create_additions => false)
|
@@ -3,8 +3,8 @@ require 'chef_fs/data_handler/data_handler_base'
|
|
3
3
|
module ChefFS
|
4
4
|
module DataHandler
|
5
5
|
class ContainerDataHandler < DataHandlerBase
|
6
|
-
def normalize(
|
7
|
-
super(
|
6
|
+
def normalize(container, entry)
|
7
|
+
super(container, {
|
8
8
|
'containername' => remove_dot_json(entry.name),
|
9
9
|
'containerpath' => remove_dot_json(entry.name)
|
10
10
|
})
|
@@ -14,6 +14,13 @@ module ChefFS
|
|
14
14
|
return key == 'containername'
|
15
15
|
end
|
16
16
|
|
17
|
+
def verify_integrity(object, entry, &on_error)
|
18
|
+
base_name = remove_dot_json(entry.name)
|
19
|
+
if object['containername'] != base_name
|
20
|
+
on_error.call("Name in #{entry.path_for_printing} must be '#{base_name}' (is '#{object['name']}')")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
17
24
|
# There is no chef_class for users, nor does to_ruby work.
|
18
25
|
end
|
19
26
|
end
|
@@ -18,16 +18,20 @@ module ChefFS
|
|
18
18
|
})
|
19
19
|
end
|
20
20
|
|
21
|
-
def
|
21
|
+
def normalize_for_post(data_bag_item, entry)
|
22
22
|
{
|
23
|
-
"name" => "data_bag_item_#{entry.parent.name}_#{entry.name}",
|
23
|
+
"name" => "data_bag_item_#{entry.parent.name}_#{remove_dot_json(entry.name)}",
|
24
24
|
"json_class" => "Chef::DataBagItem",
|
25
25
|
"chef_type" => "data_bag_item",
|
26
26
|
"data_bag" => entry.parent.name,
|
27
|
-
"raw_data" => normalize(data_bag_item)
|
27
|
+
"raw_data" => normalize(data_bag_item, entry)
|
28
28
|
}
|
29
29
|
end
|
30
30
|
|
31
|
+
def normalize_for_put(data_bag_item, entry)
|
32
|
+
normalize_for_post(data_bag_item, entry)
|
33
|
+
end
|
34
|
+
|
31
35
|
def preserve_key(key)
|
32
36
|
return key == 'id'
|
33
37
|
end
|
@@ -36,6 +40,13 @@ module ChefFS
|
|
36
40
|
Chef::DataBagItem
|
37
41
|
end
|
38
42
|
|
43
|
+
def verify_integrity(object, entry, &on_error)
|
44
|
+
base_name = remove_dot_json(entry.name)
|
45
|
+
if object['raw_data']['id'] != base_name
|
46
|
+
on_error.call("ID in #{entry.path_for_printing} must be '#{base_name}' (is '#{object['raw_data']['id']}')")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
39
50
|
# Data bags do not support .rb files (or if they do, it's undocumented)
|
40
51
|
end
|
41
52
|
end
|
@@ -38,6 +38,10 @@ module ChefFS
|
|
38
38
|
result
|
39
39
|
end
|
40
40
|
|
41
|
+
def normalize_for_post(object, entry)
|
42
|
+
normalize(object, entry)
|
43
|
+
end
|
44
|
+
|
41
45
|
def normalize_for_put(object, entry)
|
42
46
|
normalize(object, entry)
|
43
47
|
end
|
@@ -110,6 +114,13 @@ module ChefFS
|
|
110
114
|
result
|
111
115
|
end
|
112
116
|
|
117
|
+
def verify_integrity(object, entry, &on_error)
|
118
|
+
base_name = remove_dot_json(entry.name)
|
119
|
+
if object['name'] != base_name
|
120
|
+
on_error.call("Name must be '#{base_name}' (is '#{object['name']}')")
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
113
124
|
end # class DataHandlerBase
|
114
125
|
end
|
115
126
|
end
|
@@ -19,7 +19,6 @@
|
|
19
19
|
require 'chef_fs/file_system/acls_dir'
|
20
20
|
require 'chef_fs/file_system/base_fs_dir'
|
21
21
|
require 'chef_fs/file_system/rest_list_dir'
|
22
|
-
require 'chef_fs/file_system/containers_dir'
|
23
22
|
require 'chef_fs/file_system/cookbooks_dir'
|
24
23
|
require 'chef_fs/file_system/data_bags_dir'
|
25
24
|
require 'chef_fs/file_system/nodes_dir'
|
@@ -86,7 +85,7 @@ module ChefFS
|
|
86
85
|
result += [
|
87
86
|
AclsDir.new(self),
|
88
87
|
RestListDir.new("clients", self, nil, ChefFS::DataHandler::ClientDataHandler.new),
|
89
|
-
|
88
|
+
RestListDir.new("containers", self, nil, ChefFS::DataHandler::ContainerDataHandler.new),
|
90
89
|
RestListDir.new("groups", self, nil, ChefFS::DataHandler::GroupDataHandler.new),
|
91
90
|
NodesDir.new(self)
|
92
91
|
]
|
@@ -56,10 +56,6 @@ module ChefFS
|
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
|
-
def identity_key
|
60
|
-
'name'
|
61
|
-
end
|
62
|
-
|
63
59
|
def create_child(name, file_contents)
|
64
60
|
begin
|
65
61
|
object = JSON.parse(file_contents, :create_additions => false)
|
@@ -70,12 +66,10 @@ module ChefFS
|
|
70
66
|
result = _make_child_entry(name, true)
|
71
67
|
|
72
68
|
if data_handler
|
73
|
-
object = data_handler.
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
if object[identity_key] != base_name
|
78
|
-
raise ChefFS::FileSystem::OperationFailedError.new(:create_child, self), "Name in #{path_for_printing}/#{name} must be '#{base_name}' (is '#{object[identity_key]}')"
|
69
|
+
object = data_handler.normalize_for_post(object, result)
|
70
|
+
data_handler.verify_integrity(object, result) do |error|
|
71
|
+
raise ChefFS::FileSystem::OperationFailedError.new(:create_child, self), "Error creating '#{name}': #{error}"
|
72
|
+
end
|
79
73
|
end
|
80
74
|
|
81
75
|
begin
|
@@ -141,10 +141,6 @@ module ChefFS
|
|
141
141
|
parent.rest
|
142
142
|
end
|
143
143
|
|
144
|
-
def identity_key
|
145
|
-
parent.identity_key
|
146
|
-
end
|
147
|
-
|
148
144
|
def write(file_contents)
|
149
145
|
begin
|
150
146
|
#object = Chef::JSONCompat.from_json(file_contents).to_hash
|
@@ -155,11 +151,9 @@ module ChefFS
|
|
155
151
|
|
156
152
|
if data_handler
|
157
153
|
object = data_handler.normalize_for_put(object, self)
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
if object[identity_key] != base_name
|
162
|
-
raise ChefFS::FileSystem::OperationFailedError.new(:write, self), "Name in #{path_for_printing}/#{name} must be '#{base_name}' (is '#{object['name']}')"
|
154
|
+
data_handler.verify_integrity(object, self) do |error|
|
155
|
+
raise ChefFS::FileSystem::OperationFailedError.new(:write, self), "#{error}"
|
156
|
+
end
|
163
157
|
end
|
164
158
|
|
165
159
|
begin
|
data/lib/chef_fs/version.rb
CHANGED
@@ -396,7 +396,7 @@ EOM
|
|
396
396
|
when_the_chef_server 'has a cookbook with dependencies' do
|
397
397
|
cookbook 'kettle', '1.0.0', { 'metadata.rb' => "name 'kettle'\nversion '1.0.0'\n" }
|
398
398
|
cookbook 'quiche', '1.0.0', { 'metadata.rb' => "name 'quiche'\ndepends 'kettle'\n", 'recipes' => { 'default.rb' => '' } }
|
399
|
-
it 'knife deps reports
|
399
|
+
it 'knife deps reports the cookbook and its dependencies' do
|
400
400
|
knife('deps --remote /cookbooks/quiche').should_succeed "/cookbooks/kettle\n/cookbooks/quiche\n"
|
401
401
|
end
|
402
402
|
end
|
@@ -192,7 +192,7 @@ EOM
|
|
192
192
|
end
|
193
193
|
|
194
194
|
it 'knife download --no-diff creates the extra files' do
|
195
|
-
knife('download /').should_succeed <<EOM
|
195
|
+
knife('download --no-diff /').should_succeed <<EOM
|
196
196
|
Created /clients
|
197
197
|
Created /clients/chef-validator.json
|
198
198
|
Created /clients/chef-webui.json
|
@@ -91,7 +91,7 @@ EOM
|
|
91
91
|
knife('diff --name-status /').should_succeed ''
|
92
92
|
end
|
93
93
|
it 'knife upload --no-diff does not change the role' do
|
94
|
-
knife('upload /').should_succeed ''
|
94
|
+
knife('upload --no-diff /').should_succeed ''
|
95
95
|
knife('diff --name-status /').should_succeed "M\t/roles/x.json\n"
|
96
96
|
end
|
97
97
|
end
|
@@ -148,7 +148,7 @@ EOM
|
|
148
148
|
end
|
149
149
|
|
150
150
|
it 'knife upload --no-diff adds the new files' do
|
151
|
-
knife('upload /').should_succeed <<EOM
|
151
|
+
knife('upload --no-diff /').should_succeed <<EOM
|
152
152
|
Created /clients/y.json
|
153
153
|
Updated /cookbooks/x
|
154
154
|
Created /cookbooks/y
|
@@ -451,7 +451,7 @@ EOM
|
|
451
451
|
when_the_repository 'has the same environment with the wrong name in the file' do
|
452
452
|
file 'environments/x.json', { 'name' => 'y' }
|
453
453
|
it 'knife upload fails' do
|
454
|
-
knife('upload /environments/x.json').should_fail "ERROR: /environments/x.json failed to write: Name
|
454
|
+
knife('upload /environments/x.json').should_fail "ERROR: /environments/x.json failed to write: Name must be 'x' (is 'y')\n"
|
455
455
|
knife('diff --name-status /environments/x.json').should_succeed "M\t/environments/x.json\n"
|
456
456
|
end
|
457
457
|
end
|
@@ -477,7 +477,7 @@ EOM
|
|
477
477
|
when_the_repository 'has an environment with the wrong name in the file' do
|
478
478
|
file 'environments/x.json', { 'name' => 'y' }
|
479
479
|
it 'knife upload fails' do
|
480
|
-
knife('upload /environments/x.json').should_fail "ERROR: /environments failed to create_child:
|
480
|
+
knife('upload /environments/x.json').should_fail "ERROR: /environments failed to create_child: Error creating 'x.json': Name must be 'x' (is 'y')\n"
|
481
481
|
knife('diff --name-status /environments/x.json').should_succeed "A\t/environments/x.json\n"
|
482
482
|
end
|
483
483
|
end
|
@@ -930,7 +930,7 @@ EOM
|
|
930
930
|
when_the_repository 'has the same environment with the wrong name in the file' do
|
931
931
|
file 'environments/x.json', { 'name' => 'y' }
|
932
932
|
it 'knife upload fails' do
|
933
|
-
knife('upload /environments/x.json').should_fail "ERROR: /environments/x.json failed to write: Name
|
933
|
+
knife('upload /environments/x.json').should_fail "ERROR: /environments/x.json failed to write: Name must be 'x' (is 'y')\n"
|
934
934
|
knife('diff --name-status /environments/x.json').should_succeed "M\t/environments/x.json\n"
|
935
935
|
end
|
936
936
|
end
|
@@ -956,7 +956,7 @@ EOM
|
|
956
956
|
when_the_repository 'has an environment with the wrong name in the file' do
|
957
957
|
file 'environments/x.json', { 'name' => 'y' }
|
958
958
|
it 'knife upload fails' do
|
959
|
-
knife('upload /environments/x.json').should_fail "ERROR: /environments failed to create_child:
|
959
|
+
knife('upload /environments/x.json').should_fail "ERROR: /environments failed to create_child: Error creating 'x.json': Name must be 'x' (is 'y')\n"
|
960
960
|
knife('diff --name-status /environments/x.json').should_succeed "A\t/environments/x.json\n"
|
961
961
|
end
|
962
962
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: knife-essentials
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.beta5
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -87,7 +87,6 @@ files:
|
|
87
87
|
- lib/chef_fs/file_system/chef_repository_file_system_entry.rb
|
88
88
|
- lib/chef_fs/file_system/chef_repository_file_system_root_dir.rb
|
89
89
|
- lib/chef_fs/file_system/chef_server_root_dir.rb
|
90
|
-
- lib/chef_fs/file_system/containers_dir.rb
|
91
90
|
- lib/chef_fs/file_system/cookbook_dir.rb
|
92
91
|
- lib/chef_fs/file_system/cookbook_file.rb
|
93
92
|
- lib/chef_fs/file_system/cookbook_subdir.rb
|
@@ -1,33 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: John Keiser (<jkeiser@opscode.com>)
|
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 'chef_fs/file_system/rest_list_entry'
|
20
|
-
|
21
|
-
module ChefFS
|
22
|
-
module FileSystem
|
23
|
-
class ContainersDir < RestListDir
|
24
|
-
def initialize(parent)
|
25
|
-
super("containers", parent, nil, ChefFS::DataHandler::ContainerDataHandler.new)
|
26
|
-
end
|
27
|
-
|
28
|
-
def identity_key
|
29
|
-
'containername'
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|