knife-essentials 0.8.1 → 0.8.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/chef/knife/delete_essentials.rb +3 -3
- data/lib/chef/knife/deps_essentials.rb +19 -9
- data/lib/chef/knife/diff_essentials.rb +2 -2
- data/lib/chef/knife/download_essentials.rb +2 -2
- data/lib/chef/knife/list_essentials.rb +61 -29
- data/lib/chef/knife/raw_essentials.rb +5 -5
- data/lib/chef/knife/show_essentials.rb +4 -4
- data/lib/chef/knife/upload_essentials.rb +2 -2
- data/lib/chef_fs/file_system.rb +27 -27
- data/lib/chef_fs/file_system/base_fs_object.rb +6 -1
- data/lib/chef_fs/file_system/chef_repository_file_system_cookbooks_dir.rb +37 -0
- data/lib/chef_fs/file_system/chef_repository_file_system_entry.rb +28 -43
- data/lib/chef_fs/file_system/chef_repository_file_system_root_dir.rb +6 -1
- data/lib/chef_fs/knife.rb +8 -3
- data/lib/chef_fs/version.rb +1 -1
- data/spec/chef_fs/file_system_spec.rb +2 -2
- data/spec/integration/chef_repository_file_system_spec.rb +650 -0
- data/spec/integration/deps_spec.rb +314 -0
- data/spec/integration/list_spec.rb +315 -0
- data/spec/support/integration_helper.rb +95 -0
- data/spec/support/knife_support.rb +92 -0
- data/spec/support/stickywicket.pem +27 -0
- metadata +26 -3
@@ -0,0 +1,314 @@
|
|
1
|
+
require 'support/integration_helper'
|
2
|
+
require 'chef/knife/deps_essentials'
|
3
|
+
|
4
|
+
describe 'knife deps' do
|
5
|
+
extend IntegrationSupport
|
6
|
+
include KnifeSupport
|
7
|
+
|
8
|
+
context 'remote' do
|
9
|
+
when_the_chef_server 'has a role with no run_list' do
|
10
|
+
role 'starring', {}
|
11
|
+
it 'knife deps reports no dependencies' do
|
12
|
+
knife('deps --remote /roles/starring.json').should_succeed "/roles/starring.json\n"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
when_the_chef_server 'has a role with a default run_list' do
|
17
|
+
role 'starring', { 'run_list' => %w(role[minor] recipe[quiche] recipe[soup::chicken]) }
|
18
|
+
role 'minor', {}
|
19
|
+
cookbook 'quiche', '1.0.0', { 'metadata.rb' => '', 'recipes' => { 'default.rb' => '' } }
|
20
|
+
cookbook 'soup', '1.0.0', { 'metadata.rb' => '', 'recipes' => { 'chicken.rb' => '' } }
|
21
|
+
it 'knife deps reports all dependencies' do
|
22
|
+
knife('deps --remote /roles/starring.json').should_succeed <<EOM
|
23
|
+
/roles/minor.json
|
24
|
+
/cookbooks/quiche
|
25
|
+
/cookbooks/soup
|
26
|
+
/roles/starring.json
|
27
|
+
EOM
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
when_the_chef_server 'has a role with an env_run_list' do
|
32
|
+
role 'starring', { 'env_run_lists' => { 'desert' => %w(role[minor] recipe[quiche] recipe[soup::chicken]) } }
|
33
|
+
role 'minor', {}
|
34
|
+
cookbook 'quiche', '1.0.0', { 'metadata.rb' => '', 'recipes' => { 'default.rb' => '' } }
|
35
|
+
cookbook 'soup', '1.0.0', { 'metadata.rb' => '', 'recipes' => { 'chicken.rb' => '' } }
|
36
|
+
it 'knife deps reports all dependencies' do
|
37
|
+
knife('deps --remote /roles/starring.json').should_succeed <<EOM
|
38
|
+
/roles/minor.json
|
39
|
+
/cookbooks/quiche
|
40
|
+
/cookbooks/soup
|
41
|
+
/roles/starring.json
|
42
|
+
EOM
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
when_the_chef_server 'has a node with no environment or run_list' do
|
47
|
+
node 'mort', {}
|
48
|
+
it 'knife deps reports just the node' do
|
49
|
+
knife('deps --remote --repo-mode=everything /nodes/mort.json').should_succeed "/nodes/mort.json\n"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
when_the_chef_server 'has a node with an environment' do
|
53
|
+
environment 'desert', {}
|
54
|
+
node 'mort', { 'chef_environment' => 'desert' }
|
55
|
+
it 'knife deps reports just the node' do
|
56
|
+
knife('deps --remote --repo-mode=everything /nodes/mort.json').should_succeed "/environments/desert.json\n/nodes/mort.json\n"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
when_the_chef_server 'has a node with roles and recipes in its run_list' do
|
60
|
+
role 'minor', {}
|
61
|
+
cookbook 'quiche', '1.0.0', { 'metadata.rb' => '', 'recipes' => { 'default.rb' => '' } }
|
62
|
+
cookbook 'soup', '1.0.0', { 'metadata.rb' => '', 'recipes' => { 'chicken.rb' => '' } }
|
63
|
+
node 'mort', { 'run_list' => %w(role[minor] recipe[quiche] recipe[soup::chicken]) }
|
64
|
+
it 'knife deps reports just the node' do
|
65
|
+
knife('deps --remote --repo-mode=everything /nodes/mort.json').should_succeed <<EOM
|
66
|
+
/roles/minor.json
|
67
|
+
/cookbooks/quiche
|
68
|
+
/cookbooks/soup
|
69
|
+
/nodes/mort.json
|
70
|
+
EOM
|
71
|
+
end
|
72
|
+
end
|
73
|
+
when_the_chef_server 'has a cookbook with no dependencies' do
|
74
|
+
cookbook 'quiche', '1.0.0', { 'metadata.rb' => '', 'recipes' => { 'default.rb' => '' } }
|
75
|
+
it 'knife deps reports just the cookbook' do
|
76
|
+
knife('deps --remote /cookbooks/quiche').should_succeed "/cookbooks/quiche\n"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
when_the_chef_server 'has a cookbook with dependencies' do
|
80
|
+
cookbook 'kettle', '1.0.0', { 'metadata.rb' => '' }
|
81
|
+
cookbook 'quiche', '1.0.0', { 'metadata.rb' => 'depends "kettle"', 'recipes' => { 'default.rb' => '' } }
|
82
|
+
it 'knife deps reports just the cookbook' do
|
83
|
+
knife('deps --remote /cookbooks/quiche').should_succeed "/cookbooks/kettle\n/cookbooks/quiche\n"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
when_the_chef_server 'has a data bag' do
|
87
|
+
data_bag 'bag', { 'item' => {} }
|
88
|
+
it 'knife deps reports just the data bag' do
|
89
|
+
knife('deps --remote /data_bags/bag/item.json').should_succeed "/data_bags/bag/item.json\n"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
when_the_chef_server 'has an environment' do
|
93
|
+
environment 'desert', {}
|
94
|
+
it 'knife deps reports just the environment' do
|
95
|
+
knife('deps --remote /environments/desert.json').should_succeed "/environments/desert.json\n"
|
96
|
+
end
|
97
|
+
end
|
98
|
+
when_the_chef_server 'has a deep dependency tree' do
|
99
|
+
role 'starring', { 'run_list' => %w(role[minor] recipe[quiche] recipe[soup::chicken]) }
|
100
|
+
role 'minor', {}
|
101
|
+
cookbook 'quiche', '1.0.0', { 'metadata.rb' => '', 'recipes' => { 'default.rb' => '' } }
|
102
|
+
cookbook 'soup', '1.0.0', { 'metadata.rb' => '', 'recipes' => { 'chicken.rb' => '' } }
|
103
|
+
environment 'desert', {}
|
104
|
+
node 'mort', { 'chef_environment' => 'desert', 'run_list' => [ 'role[starring]' ] }
|
105
|
+
node 'bart', { 'run_list' => [ 'role[minor]' ] }
|
106
|
+
|
107
|
+
it 'knife deps reports all dependencies' do
|
108
|
+
knife('deps --remote --repo-mode=everything /nodes/mort.json').should_succeed <<EOM
|
109
|
+
/environments/desert.json
|
110
|
+
/roles/minor.json
|
111
|
+
/cookbooks/quiche
|
112
|
+
/cookbooks/soup
|
113
|
+
/roles/starring.json
|
114
|
+
/nodes/mort.json
|
115
|
+
EOM
|
116
|
+
end
|
117
|
+
it 'knife deps * reports all dependencies of all things' do
|
118
|
+
knife('deps --remote --repo-mode=everything /nodes/*').should_succeed <<EOM
|
119
|
+
/roles/minor.json
|
120
|
+
/nodes/bart.json
|
121
|
+
/environments/desert.json
|
122
|
+
/cookbooks/quiche
|
123
|
+
/cookbooks/soup
|
124
|
+
/roles/starring.json
|
125
|
+
/nodes/mort.json
|
126
|
+
EOM
|
127
|
+
end
|
128
|
+
it 'knife deps a b reports all dependencies of a and b' do
|
129
|
+
knife('deps --remote --repo-mode=everything /nodes/bart.json /nodes/mort.json').should_succeed <<EOM
|
130
|
+
/roles/minor.json
|
131
|
+
/nodes/bart.json
|
132
|
+
/environments/desert.json
|
133
|
+
/cookbooks/quiche
|
134
|
+
/cookbooks/soup
|
135
|
+
/roles/starring.json
|
136
|
+
/nodes/mort.json
|
137
|
+
EOM
|
138
|
+
end
|
139
|
+
it 'knife deps --tree /* shows dependencies in a tree' do
|
140
|
+
knife('deps --remote --tree --repo-mode=everything /nodes/*').should_succeed <<EOM
|
141
|
+
/nodes/bart.json
|
142
|
+
/roles/minor.json
|
143
|
+
/nodes/mort.json
|
144
|
+
/environments/desert.json
|
145
|
+
/roles/starring.json
|
146
|
+
/roles/minor.json
|
147
|
+
/cookbooks/quiche
|
148
|
+
/cookbooks/soup
|
149
|
+
EOM
|
150
|
+
end
|
151
|
+
it 'knife deps --tree --no-recurse shows only the first level of dependencies' do
|
152
|
+
knife('deps --remote --tree --no-recurse --repo-mode=everything /nodes/*').should_succeed <<EOM
|
153
|
+
/nodes/bart.json
|
154
|
+
/roles/minor.json
|
155
|
+
/nodes/mort.json
|
156
|
+
/environments/desert.json
|
157
|
+
/roles/starring.json
|
158
|
+
EOM
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
context 'circular dependencies' do
|
163
|
+
when_the_chef_server 'has cookbooks with circular dependencies' do
|
164
|
+
cookbook 'foo', '1.0.0', { 'metadata.rb' => 'depends "bar"' }
|
165
|
+
cookbook 'bar', '1.0.0', { 'metadata.rb' => 'depends "baz"' }
|
166
|
+
cookbook 'baz', '1.0.0', { 'metadata.rb' => 'depends "foo"' }
|
167
|
+
cookbook 'self', '1.0.0', { 'metadata.rb' => 'depends "self"' }
|
168
|
+
it 'knife deps prints each once' do
|
169
|
+
knife('deps --remote /cookbooks/foo /cookbooks/self').should_succeed <<EOM
|
170
|
+
/cookbooks/baz
|
171
|
+
/cookbooks/bar
|
172
|
+
/cookbooks/foo
|
173
|
+
/cookbooks/self
|
174
|
+
EOM
|
175
|
+
end
|
176
|
+
it 'knife deps --tree prints each once' do
|
177
|
+
knife('deps --remote --tree /cookbooks/foo /cookbooks/self').should_succeed <<EOM
|
178
|
+
/cookbooks/foo
|
179
|
+
/cookbooks/bar
|
180
|
+
/cookbooks/baz
|
181
|
+
/cookbooks/foo
|
182
|
+
/cookbooks/self
|
183
|
+
/cookbooks/self
|
184
|
+
EOM
|
185
|
+
end
|
186
|
+
end
|
187
|
+
when_the_chef_server 'has roles with circular dependencies' do
|
188
|
+
role 'foo', { 'run_list' => [ 'role[bar]' ] }
|
189
|
+
role 'bar', { 'run_list' => [ 'role[baz]' ] }
|
190
|
+
role 'baz', { 'run_list' => [ 'role[foo]' ] }
|
191
|
+
role 'self', { 'run_list' => [ 'role[self]' ] }
|
192
|
+
it 'knife deps prints each once' do
|
193
|
+
knife('deps --remote /roles/foo.json /roles/self.json').should_succeed <<EOM
|
194
|
+
/roles/baz.json
|
195
|
+
/roles/bar.json
|
196
|
+
/roles/foo.json
|
197
|
+
/roles/self.json
|
198
|
+
EOM
|
199
|
+
end
|
200
|
+
it 'knife deps --tree prints each once' do
|
201
|
+
knife('deps --remote --tree /roles/foo.json /roles/self.json') do
|
202
|
+
stdout.should == "/roles/foo.json\n /roles/bar.json\n /roles/baz.json\n /roles/foo.json\n/roles/self.json\n /roles/self.json\n"
|
203
|
+
stderr.should == "WARNING: No knife configuration file found\n"
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
context 'missing objects' do
|
210
|
+
when_the_chef_server 'is empty' do
|
211
|
+
it 'knife deps /blah reports an error' do
|
212
|
+
knife('deps --remote /blah').should_fail(
|
213
|
+
:exit_code => 2,
|
214
|
+
:stdout => "/blah\n",
|
215
|
+
:stderr => "ERROR: /blah: No such file or directory\n"
|
216
|
+
)
|
217
|
+
end
|
218
|
+
it 'knife deps /roles/x.json reports an error' do
|
219
|
+
knife('deps --remote /roles/x.json').should_fail(
|
220
|
+
:exit_code => 2,
|
221
|
+
:stdout => "/roles/x.json\n",
|
222
|
+
:stderr => "ERROR: /roles/x.json: No such file or directory\n"
|
223
|
+
)
|
224
|
+
end
|
225
|
+
it 'knife deps /nodes/x.json reports an error' do
|
226
|
+
knife('deps --remote --repo-mode=everything /nodes/x.json').should_fail(
|
227
|
+
:exit_code => 2,
|
228
|
+
:stdout => "/nodes/x.json\n",
|
229
|
+
:stderr => "ERROR: /nodes/x.json: No such file or directory\n"
|
230
|
+
)
|
231
|
+
end
|
232
|
+
it 'knife deps /environments/x.json reports an error' do
|
233
|
+
knife('deps --remote /environments/x.json').should_fail(
|
234
|
+
:exit_code => 2,
|
235
|
+
:stdout => "/environments/x.json\n",
|
236
|
+
:stderr => "ERROR: /environments/x.json: No such file or directory\n"
|
237
|
+
)
|
238
|
+
end
|
239
|
+
it 'knife deps /cookbooks/x reports an error' do
|
240
|
+
knife('deps --remote /cookbooks/x').should_fail(
|
241
|
+
:exit_code => 2,
|
242
|
+
:stdout => "/cookbooks/x\n",
|
243
|
+
:stderr => "ERROR: /cookbooks/x: No such file or directory\n"
|
244
|
+
)
|
245
|
+
end
|
246
|
+
it 'knife deps /data_bags/bag/item reports an error' do
|
247
|
+
knife('deps --remote /data_bags/bag/item').should_fail(
|
248
|
+
:exit_code => 2,
|
249
|
+
:stdout => "/data_bags/bag/item\n",
|
250
|
+
:stderr => "ERROR: /data_bags/bag/item: No such file or directory\n"
|
251
|
+
)
|
252
|
+
end
|
253
|
+
end
|
254
|
+
when_the_chef_server 'is missing a dependent cookbook' do
|
255
|
+
role 'starring', { 'run_list' => [ 'recipe[quiche]'] }
|
256
|
+
it 'knife deps reports the cookbook, along with an error' do
|
257
|
+
knife('deps --remote /roles/starring.json').should_fail(
|
258
|
+
:exit_code => 2,
|
259
|
+
:stdout => "/cookbooks/quiche\n/roles/starring.json\n",
|
260
|
+
:stderr => "ERROR: /cookbooks/quiche: No such file or directory\n"
|
261
|
+
)
|
262
|
+
end
|
263
|
+
end
|
264
|
+
when_the_chef_server 'is missing a dependent environment' do
|
265
|
+
node 'mort', { 'chef_environment' => 'desert' }
|
266
|
+
it 'knife deps reports the environment, along with an error' do
|
267
|
+
knife('deps --remote --repo-mode=everything /nodes/mort.json').should_fail(
|
268
|
+
:exit_code => 2,
|
269
|
+
:stdout => "/environments/desert.json\n/nodes/mort.json\n",
|
270
|
+
:stderr => "ERROR: /environments/desert.json: No such file or directory\n"
|
271
|
+
)
|
272
|
+
end
|
273
|
+
end
|
274
|
+
when_the_chef_server 'is missing a dependent role' do
|
275
|
+
role 'starring', { 'run_list' => [ 'role[minor]'] }
|
276
|
+
it 'knife deps reports the role, along with an error' do
|
277
|
+
knife('deps --remote /roles/starring.json').should_fail(
|
278
|
+
:exit_code => 2,
|
279
|
+
:stdout => "/roles/minor.json\n/roles/starring.json\n",
|
280
|
+
:stderr => "ERROR: /roles/minor.json: No such file or directory\n"
|
281
|
+
)
|
282
|
+
end
|
283
|
+
end
|
284
|
+
end
|
285
|
+
context 'invalid objects' do
|
286
|
+
when_the_chef_server 'is empty' do
|
287
|
+
it 'knife deps / reports an error' do
|
288
|
+
knife('deps --remote /').should_succeed("/\n")
|
289
|
+
end
|
290
|
+
it 'knife deps /roles reports an error' do
|
291
|
+
knife('deps --remote /roles').should_succeed("/roles\n")
|
292
|
+
end
|
293
|
+
end
|
294
|
+
when_the_chef_server 'has a data bag' do
|
295
|
+
data_bag 'bag', { 'item' => {} }
|
296
|
+
it 'knife deps /data_bags/bag shows no dependencies' do
|
297
|
+
knife('deps --remote /data_bags/bag').should_succeed("/data_bags/bag\n")
|
298
|
+
end
|
299
|
+
end
|
300
|
+
when_the_chef_server 'has a cookbook' do
|
301
|
+
cookbook 'blah', '1.0.0', { 'metadata.rb' => '' }
|
302
|
+
it 'knife deps on a cookbook file shows no dependencies' do
|
303
|
+
knife('deps --remote /cookbooks/blah/metadata.rb').should_succeed(
|
304
|
+
"/cookbooks/blah/metadata.rb\n"
|
305
|
+
)
|
306
|
+
end
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
it 'knife deps --no-recurse reports an error' do
|
311
|
+
knife('deps --no-recurse /').should_fail("ERROR: --no-recurse requires --tree\n")
|
312
|
+
end
|
313
|
+
end
|
314
|
+
end
|
@@ -0,0 +1,315 @@
|
|
1
|
+
require 'support/integration_helper'
|
2
|
+
require 'chef/knife/list_essentials'
|
3
|
+
|
4
|
+
describe 'knife list' do
|
5
|
+
extend IntegrationSupport
|
6
|
+
include KnifeSupport
|
7
|
+
|
8
|
+
when_the_chef_server "is empty" do
|
9
|
+
it "knife list / returns all top level directories" do
|
10
|
+
knife('list /').should_succeed <<EOM
|
11
|
+
/cookbooks
|
12
|
+
/data_bags
|
13
|
+
/environments
|
14
|
+
/roles
|
15
|
+
EOM
|
16
|
+
end
|
17
|
+
|
18
|
+
it "knife list -R / returns everything" do
|
19
|
+
knife('list -R /').should_succeed <<EOM
|
20
|
+
/:
|
21
|
+
cookbooks
|
22
|
+
data_bags
|
23
|
+
environments
|
24
|
+
roles
|
25
|
+
|
26
|
+
/cookbooks:
|
27
|
+
|
28
|
+
/data_bags:
|
29
|
+
|
30
|
+
/environments:
|
31
|
+
_default.json
|
32
|
+
|
33
|
+
/roles:
|
34
|
+
EOM
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
when_the_chef_server "has plenty of stuff in it" do
|
39
|
+
client 'client1', {}
|
40
|
+
client 'client2', {}
|
41
|
+
cookbook 'cookbook1', '1.0.0', { 'metadata.rb' => '' }
|
42
|
+
cookbook 'cookbook2', '1.0.1', { 'metadata.rb' => '', 'recipes' => { 'default.rb' => '' } }
|
43
|
+
data_bag 'bag1', { 'item1' => {}, 'item2' => {} }
|
44
|
+
data_bag 'bag2', { 'item1' => {}, 'item2' => {} }
|
45
|
+
environment 'environment1', {}
|
46
|
+
environment 'environment2', {}
|
47
|
+
node 'node1', {}
|
48
|
+
node 'node2', {}
|
49
|
+
role 'role1', {}
|
50
|
+
role 'role2', {}
|
51
|
+
user 'user1', {}
|
52
|
+
user 'user2', {}
|
53
|
+
|
54
|
+
it "knife list / returns all top level directories" do
|
55
|
+
knife('list /').should_succeed <<EOM
|
56
|
+
/cookbooks
|
57
|
+
/data_bags
|
58
|
+
/environments
|
59
|
+
/roles
|
60
|
+
EOM
|
61
|
+
end
|
62
|
+
|
63
|
+
it "knife list -R / returns everything" do
|
64
|
+
knife('list -R /').should_succeed <<EOM
|
65
|
+
/:
|
66
|
+
cookbooks
|
67
|
+
data_bags
|
68
|
+
environments
|
69
|
+
roles
|
70
|
+
|
71
|
+
/cookbooks:
|
72
|
+
cookbook1
|
73
|
+
cookbook2
|
74
|
+
|
75
|
+
/cookbooks/cookbook1:
|
76
|
+
metadata.rb
|
77
|
+
|
78
|
+
/cookbooks/cookbook2:
|
79
|
+
metadata.rb
|
80
|
+
recipes
|
81
|
+
|
82
|
+
/cookbooks/cookbook2/recipes:
|
83
|
+
default.rb
|
84
|
+
|
85
|
+
/data_bags:
|
86
|
+
bag1
|
87
|
+
bag2
|
88
|
+
|
89
|
+
/data_bags/bag1:
|
90
|
+
item1.json
|
91
|
+
item2.json
|
92
|
+
|
93
|
+
/data_bags/bag2:
|
94
|
+
item1.json
|
95
|
+
item2.json
|
96
|
+
|
97
|
+
/environments:
|
98
|
+
_default.json
|
99
|
+
environment1.json
|
100
|
+
environment2.json
|
101
|
+
|
102
|
+
/roles:
|
103
|
+
role1.json
|
104
|
+
role2.json
|
105
|
+
EOM
|
106
|
+
end
|
107
|
+
|
108
|
+
it "knife list -R --flat / returns everything" do
|
109
|
+
knife('list -R --flat /').should_succeed <<EOM
|
110
|
+
/cookbooks
|
111
|
+
/cookbooks/cookbook1
|
112
|
+
/cookbooks/cookbook1/metadata.rb
|
113
|
+
/cookbooks/cookbook2
|
114
|
+
/cookbooks/cookbook2/metadata.rb
|
115
|
+
/cookbooks/cookbook2/recipes
|
116
|
+
/cookbooks/cookbook2/recipes/default.rb
|
117
|
+
/data_bags
|
118
|
+
/data_bags/bag1
|
119
|
+
/data_bags/bag1/item1.json
|
120
|
+
/data_bags/bag1/item2.json
|
121
|
+
/data_bags/bag2
|
122
|
+
/data_bags/bag2/item1.json
|
123
|
+
/data_bags/bag2/item2.json
|
124
|
+
/environments
|
125
|
+
/environments/_default.json
|
126
|
+
/environments/environment1.json
|
127
|
+
/environments/environment2.json
|
128
|
+
/roles
|
129
|
+
/roles/role1.json
|
130
|
+
/roles/role2.json
|
131
|
+
EOM
|
132
|
+
end
|
133
|
+
|
134
|
+
it "knife list -Rp --flat / returns everything" do
|
135
|
+
knife('list -Rp --flat /').should_succeed <<EOM
|
136
|
+
/cookbooks/
|
137
|
+
/cookbooks/cookbook1/
|
138
|
+
/cookbooks/cookbook1/metadata.rb
|
139
|
+
/cookbooks/cookbook2/
|
140
|
+
/cookbooks/cookbook2/metadata.rb
|
141
|
+
/cookbooks/cookbook2/recipes/
|
142
|
+
/cookbooks/cookbook2/recipes/default.rb
|
143
|
+
/data_bags/
|
144
|
+
/data_bags/bag1/
|
145
|
+
/data_bags/bag1/item1.json
|
146
|
+
/data_bags/bag1/item2.json
|
147
|
+
/data_bags/bag2/
|
148
|
+
/data_bags/bag2/item1.json
|
149
|
+
/data_bags/bag2/item2.json
|
150
|
+
/environments/
|
151
|
+
/environments/_default.json
|
152
|
+
/environments/environment1.json
|
153
|
+
/environments/environment2.json
|
154
|
+
/roles/
|
155
|
+
/roles/role1.json
|
156
|
+
/roles/role2.json
|
157
|
+
EOM
|
158
|
+
end
|
159
|
+
|
160
|
+
it "knife list /cookbooks returns the list of cookbooks" do
|
161
|
+
knife('list /cookbooks').should_succeed <<EOM
|
162
|
+
/cookbooks/cookbook1
|
163
|
+
/cookbooks/cookbook2
|
164
|
+
EOM
|
165
|
+
end
|
166
|
+
|
167
|
+
it "knife list /cookbooks/*2/*/*.rb returns the one file" do
|
168
|
+
knife('list /cookbooks/*2/*/*.rb').should_succeed "/cookbooks/cookbook2/recipes/default.rb\n"
|
169
|
+
end
|
170
|
+
|
171
|
+
it "knife list /**.rb returns all ruby files" do
|
172
|
+
knife('list /**.rb').should_succeed <<EOM
|
173
|
+
/cookbooks/cookbook1/metadata.rb
|
174
|
+
/cookbooks/cookbook2/metadata.rb
|
175
|
+
/cookbooks/cookbook2/recipes/default.rb
|
176
|
+
EOM
|
177
|
+
end
|
178
|
+
|
179
|
+
it "knife list /cookbooks/**.rb returns all ruby files" do
|
180
|
+
knife('list /cookbooks/**.rb').should_succeed <<EOM
|
181
|
+
/cookbooks/cookbook1/metadata.rb
|
182
|
+
/cookbooks/cookbook2/metadata.rb
|
183
|
+
/cookbooks/cookbook2/recipes/default.rb
|
184
|
+
EOM
|
185
|
+
end
|
186
|
+
|
187
|
+
it "knife list /**.json returns all json files" do
|
188
|
+
knife('list /**.json').should_succeed <<EOM
|
189
|
+
/data_bags/bag1/item1.json
|
190
|
+
/data_bags/bag1/item2.json
|
191
|
+
/data_bags/bag2/item1.json
|
192
|
+
/data_bags/bag2/item2.json
|
193
|
+
/environments/_default.json
|
194
|
+
/environments/environment1.json
|
195
|
+
/environments/environment2.json
|
196
|
+
/roles/role1.json
|
197
|
+
/roles/role2.json
|
198
|
+
EOM
|
199
|
+
end
|
200
|
+
|
201
|
+
it "knife list /data**.json returns all data bag json files" do
|
202
|
+
knife('list /data**.json').should_succeed <<EOM
|
203
|
+
/data_bags/bag1/item1.json
|
204
|
+
/data_bags/bag1/item2.json
|
205
|
+
/data_bags/bag2/item1.json
|
206
|
+
/data_bags/bag2/item2.json
|
207
|
+
EOM
|
208
|
+
end
|
209
|
+
|
210
|
+
it "knife list /environments/missing_file.json reports missing file" do
|
211
|
+
knife('list /environments/missing_file.json').should_fail "ERROR: /environments/missing_file.json: No such file or directory\n"
|
212
|
+
end
|
213
|
+
|
214
|
+
context "missing file/directory exact match tests" do
|
215
|
+
it "knife list /blarghle reports missing directory" do
|
216
|
+
knife('list /blarghle').should_fail "ERROR: /blarghle: No such file or directory\n"
|
217
|
+
end
|
218
|
+
|
219
|
+
it "knife list /roles/blarghle reports missing directory" do
|
220
|
+
knife('list /roles/blarghle').should_fail "ERROR: /roles/blarghle: No such file or directory\n"
|
221
|
+
end
|
222
|
+
|
223
|
+
it "knife list /roles/blarghle/blorghle reports missing directory" do
|
224
|
+
knife('list /roles/blarghle/blorghle').should_fail "ERROR: /roles/blarghle/blorghle: No such file or directory\n"
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
# TODO different cwd
|
229
|
+
end
|
230
|
+
|
231
|
+
context "--local" do
|
232
|
+
when_the_repository "is empty" do
|
233
|
+
it "knife list --local / returns nothing" do
|
234
|
+
knife('list --local /').should_succeed ""
|
235
|
+
end
|
236
|
+
|
237
|
+
it "knife list /roles returns nothing" do
|
238
|
+
knife('list --local /roles').should_fail "ERROR: /roles: No such file or directory\n"
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
when_the_repository "has a bunch of stuff" do
|
243
|
+
file 'clients/client1.json', {}
|
244
|
+
file 'clients/client2.json', {}
|
245
|
+
|
246
|
+
directory 'cookbooks/cookbook1' do
|
247
|
+
file 'metadata.rb', ''
|
248
|
+
end
|
249
|
+
directory 'cookbooks/cookbook2' do
|
250
|
+
file 'metadata.rb', ''
|
251
|
+
file 'recipes/default.rb', ''
|
252
|
+
end
|
253
|
+
|
254
|
+
directory 'data_bags' do
|
255
|
+
directory 'bag1' do
|
256
|
+
file 'item1.json', {}
|
257
|
+
file 'item2.json', {}
|
258
|
+
end
|
259
|
+
directory 'bag2' do
|
260
|
+
file 'item1.json', {}
|
261
|
+
file 'item2.json', {}
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
file 'environments/environment1.json', {}
|
266
|
+
file 'environments/environment2.json', {}
|
267
|
+
file 'nodes/node1.json', {}
|
268
|
+
file 'nodes/node2.json', {}
|
269
|
+
file 'roles/role1.json', {}
|
270
|
+
file 'roles/role2.json', {}
|
271
|
+
file 'users/user1.json', {}
|
272
|
+
file 'users/user2.json', {}
|
273
|
+
|
274
|
+
it "knife list -Rp --flat / returns everything" do
|
275
|
+
knife('list -Rp --local --flat /').should_succeed <<EOM
|
276
|
+
/cookbooks/
|
277
|
+
/cookbooks/cookbook1/
|
278
|
+
/cookbooks/cookbook1/metadata.rb
|
279
|
+
/cookbooks/cookbook2/
|
280
|
+
/cookbooks/cookbook2/metadata.rb
|
281
|
+
/cookbooks/cookbook2/recipes/
|
282
|
+
/cookbooks/cookbook2/recipes/default.rb
|
283
|
+
/data_bags/
|
284
|
+
/data_bags/bag1/
|
285
|
+
/data_bags/bag1/item1.json
|
286
|
+
/data_bags/bag1/item2.json
|
287
|
+
/data_bags/bag2/
|
288
|
+
/data_bags/bag2/item1.json
|
289
|
+
/data_bags/bag2/item2.json
|
290
|
+
/environments/
|
291
|
+
/environments/environment1.json
|
292
|
+
/environments/environment2.json
|
293
|
+
/roles/
|
294
|
+
/roles/role1.json
|
295
|
+
/roles/role2.json
|
296
|
+
EOM
|
297
|
+
end
|
298
|
+
|
299
|
+
context "missing file/directory tests" do
|
300
|
+
it "knife list --local /blarghle reports missing directory" do
|
301
|
+
knife('list --local /blarghle').should_fail "ERROR: /blarghle: No such file or directory\n"
|
302
|
+
end
|
303
|
+
|
304
|
+
it "knife list /roles/blarghle reports missing directory" do
|
305
|
+
knife('list --local /roles/blarghle').should_fail "ERROR: /roles/blarghle: No such file or directory\n"
|
306
|
+
end
|
307
|
+
|
308
|
+
it "knife list /roles/blarghle/blorghle reports missing directory" do
|
309
|
+
knife('list --local /roles/blarghle/blorghle').should_fail "ERROR: /roles/blarghle/blorghle: No such file or directory\n"
|
310
|
+
end
|
311
|
+
end
|
312
|
+
end
|
313
|
+
# TODO different cwd
|
314
|
+
end
|
315
|
+
end
|