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.
@@ -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(user, entry)
7
- super(user, {
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 normalize_for_put(data_bag_item, entry)
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
- ContainersDir.new(self),
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
  ]
@@ -45,10 +45,6 @@ module ChefFS
45
45
  @exists
46
46
  end
47
47
 
48
- def identity_key
49
- 'id'
50
- end
51
-
52
48
  def delete(recurse)
53
49
  if !recurse
54
50
  raise NotFoundError.new(self) if !exists?
@@ -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.normalize(object, result)
74
- end
75
-
76
- base_name = name[0,name.length-5]
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
- end
159
-
160
- base_name = name[0,name.length-5] # Strip ".json"
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
@@ -1,3 +1,3 @@
1
1
  module ChefFS
2
- VERSION = "1.0.0.beta4"
2
+ VERSION = "1.0.0.beta5"
3
3
  end
@@ -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 just the cookbook' do
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 in remote/environments/x.json/x.json must be 'x' (is 'y')\n"
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: Name in remote/environments/x.json must be 'x' (is 'y')\n"
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 in remote/environments/x.json/x.json must be 'x' (is 'y')\n"
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: Name in remote/environments/x.json must be 'x' (is 'y')\n"
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
@@ -19,8 +19,8 @@
19
19
 
20
20
  require 'tmpdir'
21
21
  require 'fileutils'
22
- require 'chef_zero/rspec'
23
22
  require 'chef/config'
23
+ require 'chef_zero/rspec'
24
24
  require 'json'
25
25
  require 'support/knife_support'
26
26
  require 'support/spec_helper'
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.beta4
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