chef 12.0.0.alpha.1-x86-mingw32 → 12.0.0.alpha.2-x86-mingw32
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.
- checksums.yaml +4 -4
- data/lib/chef/application.rb +8 -1
- data/lib/chef/application/apply.rb +4 -0
- data/lib/chef/application/client.rb +7 -7
- data/lib/chef/application/solo.rb +21 -13
- data/lib/chef/chef_fs/chef_fs_data_store.rb +60 -6
- data/lib/chef/chef_fs/config.rb +78 -4
- data/lib/chef/chef_fs/data_handler/acl_data_handler.rb +2 -2
- data/lib/chef/chef_fs/data_handler/client_data_handler.rb +1 -1
- data/lib/chef/chef_fs/data_handler/container_data_handler.rb +1 -1
- data/lib/chef/chef_fs/data_handler/cookbook_data_handler.rb +1 -1
- data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +1 -1
- data/lib/chef/chef_fs/data_handler/data_handler_base.rb +76 -2
- data/lib/chef/chef_fs/data_handler/environment_data_handler.rb +1 -1
- data/lib/chef/chef_fs/data_handler/group_data_handler.rb +1 -1
- data/lib/chef/chef_fs/data_handler/node_data_handler.rb +1 -1
- data/lib/chef/chef_fs/data_handler/organization_data_handler.rb +30 -0
- data/lib/chef/chef_fs/data_handler/organization_invites_data_handler.rb +17 -0
- data/lib/chef/chef_fs/data_handler/organization_members_data_handler.rb +17 -0
- data/lib/chef/chef_fs/data_handler/role_data_handler.rb +1 -1
- data/lib/chef/chef_fs/data_handler/user_data_handler.rb +2 -1
- data/lib/chef/chef_fs/file_system.rb +0 -1
- data/lib/chef/chef_fs/file_system/acl_entry.rb +1 -1
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_dir.rb +1 -1
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +5 -1
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +73 -13
- data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +44 -5
- data/lib/chef/chef_fs/file_system/cookbook_dir.rb +1 -1
- data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +3 -3
- data/lib/chef/chef_fs/file_system/org_entry.rb +34 -0
- data/lib/chef/chef_fs/file_system/organization_invites_entry.rb +58 -0
- data/lib/chef/chef_fs/file_system/organization_members_entry.rb +57 -0
- data/lib/chef/chef_fs/file_system/rest_list_entry.rb +13 -4
- data/lib/chef/chef_fs/knife.rb +1 -1
- data/lib/chef/client.rb +8 -2
- data/lib/chef/config.rb +75 -57
- data/lib/chef/config_fetcher.rb +6 -21
- data/lib/chef/dsl/data_query.rb +48 -3
- data/lib/chef/dsl/platform_introspection.rb +42 -0
- data/lib/chef/dsl/reboot_pending.rb +6 -3
- data/lib/chef/encrypted_data_bag_item.rb +1 -1
- data/lib/chef/encrypted_data_bag_item/encryptor.rb +12 -0
- data/lib/chef/exceptions.rb +2 -0
- data/lib/chef/http/basic_client.rb +14 -0
- data/lib/chef/http/json_output.rb +7 -2
- data/lib/chef/knife.rb +36 -121
- data/lib/chef/knife/bootstrap.rb +68 -54
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +6 -1
- data/lib/chef/knife/bootstrap/chef-aix.erb +5 -0
- data/lib/chef/knife/bootstrap/chef-full.erb +5 -1
- data/lib/chef/knife/core/bootstrap_context.rb +70 -29
- data/lib/chef/knife/search.rb +56 -12
- data/lib/chef/knife/serve.rb +1 -1
- data/lib/chef/local_mode.rb +10 -4
- data/lib/chef/mixin/deep_merge.rb +6 -3
- data/lib/chef/mixin/shell_out.rb +33 -17
- data/lib/chef/null_logger.rb +72 -0
- data/lib/chef/platform.rb +2 -1
- data/lib/chef/platform/provider_mapping.rb +1 -1
- data/lib/chef/platform/rebooter.rb +54 -0
- data/lib/chef/provider/ifconfig.rb +15 -16
- data/lib/chef/provider/link.rb +1 -1
- data/lib/chef/provider/mount/mount.rb +1 -1
- data/lib/chef/provider/mount/solaris.rb +102 -64
- data/lib/chef/provider/package/aix.rb +4 -12
- data/lib/chef/provider/package/ips.rb +8 -12
- data/lib/chef/provider/package/macports.rb +4 -12
- data/lib/chef/provider/package/pacman.rb +2 -6
- data/lib/chef/provider/package/portage.rb +2 -6
- data/lib/chef/provider/package/rpm.rb +4 -12
- data/lib/chef/provider/package/solaris.rb +4 -12
- data/lib/chef/provider/reboot.rb +69 -0
- data/lib/chef/provider/service/debian.rb +10 -10
- data/lib/chef/provider/service/freebsd.rb +89 -73
- data/lib/chef/provider/service/gentoo.rb +2 -2
- data/lib/chef/provider/service/init.rb +6 -4
- data/lib/chef/provider/service/insserv.rb +3 -3
- data/lib/chef/provider/service/macosx.rb +2 -2
- data/lib/chef/provider/service/simple.rb +6 -4
- data/lib/chef/provider/service/solaris.rb +1 -1
- data/lib/chef/provider/service/systemd.rb +9 -9
- data/lib/chef/provider/service/upstart.rb +6 -6
- data/lib/chef/provider/subversion.rb +6 -6
- data/lib/chef/provider/user/dscl.rb +32 -28
- data/lib/chef/provider/user/windows.rb +6 -6
- data/lib/chef/provider/whyrun_safe_ruby_block.rb +1 -1
- data/lib/chef/providers.rb +1 -0
- data/lib/chef/recipe.rb +0 -1
- data/lib/chef/resource.rb +3 -5
- data/lib/chef/resource/mount.rb +9 -0
- data/lib/chef/resource/reboot.rb +48 -0
- data/lib/chef/resources.rb +1 -0
- data/lib/chef/run_context.rb +25 -0
- data/lib/chef/search/query.rb +122 -14
- data/lib/chef/util/path_helper.rb +54 -6
- data/lib/chef/util/windows/net_user.rb +4 -1
- data/lib/chef/version.rb +1 -1
- data/lib/chef/win32/api/file.rb +1 -5
- data/lib/chef/win32/api/net.rb +1 -0
- data/lib/chef/workstation_config_loader.rb +177 -0
- data/spec/functional/http/simple_spec.rb +57 -1
- data/spec/functional/mixin/shell_out_spec.rb +2 -2
- data/spec/functional/provider/whyrun_safe_ruby_block_spec.rb +51 -0
- data/spec/functional/rebooter_spec.rb +105 -0
- data/spec/functional/resource/deploy_revision_spec.rb +0 -4
- data/spec/functional/resource/file_spec.rb +26 -3
- data/spec/functional/resource/group_spec.rb +5 -3
- data/spec/functional/resource/link_spec.rb +16 -16
- data/spec/functional/resource/reboot_spec.rb +103 -0
- data/spec/integration/client/client_spec.rb +4 -8
- data/spec/integration/client/ipv6_spec.rb +1 -1
- data/spec/integration/knife/cookbook_api_ipv6_spec.rb +3 -2
- data/spec/integration/knife/delete_spec.rb +39 -0
- data/spec/integration/knife/deps_spec.rb +30 -20
- data/spec/integration/knife/download_spec.rb +77 -1
- data/spec/integration/knife/list_spec.rb +221 -0
- data/spec/integration/knife/raw_spec.rb +1 -1
- data/spec/integration/knife/show_spec.rb +2 -2
- data/spec/integration/knife/upload_spec.rb +154 -1
- data/spec/support/pedant/run_pedant.rb +0 -1
- data/spec/support/shared/functional/http.rb +8 -1
- data/spec/support/shared/integration/integration_helper.rb +11 -19
- data/spec/support/shared/unit/platform_introspector.rb +22 -0
- data/spec/unit/application/apply.rb +11 -1
- data/spec/unit/application/solo_spec.rb +19 -3
- data/spec/unit/chef_fs/config_spec.rb +58 -0
- data/spec/unit/config_fetcher_spec.rb +1 -3
- data/spec/unit/config_spec.rb +247 -220
- data/spec/unit/dsl/data_query_spec.rb +165 -23
- data/spec/unit/dsl/reboot_pending_spec.rb +1 -7
- data/spec/unit/encrypted_data_bag_item_spec.rb +1 -1
- data/spec/unit/knife/bootstrap_spec.rb +354 -182
- data/spec/unit/knife/core/bootstrap_context_spec.rb +67 -30
- data/spec/unit/knife_spec.rb +3 -30
- data/spec/unit/mixin/deep_merge_spec.rb +14 -0
- data/spec/unit/mixin/shell_out_spec.rb +134 -64
- data/spec/unit/provider/ifconfig/debian_spec.rb +19 -9
- data/spec/unit/provider/ifconfig/redhat_spec.rb +16 -14
- data/spec/unit/provider/ifconfig_spec.rb +3 -3
- data/spec/unit/provider/link_spec.rb +5 -5
- data/spec/unit/provider/mount/mount_spec.rb +10 -1
- data/spec/unit/provider/mount/solaris_spec.rb +185 -11
- data/spec/unit/provider/package/aix_spec.rb +5 -17
- data/spec/unit/provider/package/ips_spec.rb +8 -21
- data/spec/unit/provider/package/macports_spec.rb +12 -12
- data/spec/unit/provider/package/pacman_spec.rb +4 -12
- data/spec/unit/provider/package/portage_spec.rb +5 -15
- data/spec/unit/provider/package/rpm_spec.rb +7 -22
- data/spec/unit/provider/package/solaris_spec.rb +5 -16
- data/spec/unit/provider/service/arch_service_spec.rb +8 -14
- data/spec/unit/provider/service/debian_service_spec.rb +1 -1
- data/spec/unit/provider/service/freebsd_service_spec.rb +457 -225
- data/spec/unit/provider/service/gentoo_service_spec.rb +2 -2
- data/spec/unit/provider/service/init_service_spec.rb +10 -10
- data/spec/unit/provider/service/insserv_service_spec.rb +3 -4
- data/spec/unit/provider/service/invokercd_service_spec.rb +8 -9
- data/spec/unit/provider/service/macosx_spec.rb +5 -5
- data/spec/unit/provider/service/simple_service_spec.rb +4 -6
- data/spec/unit/provider/service/solaris_smf_service_spec.rb +1 -3
- data/spec/unit/provider/service/systemd_service_spec.rb +20 -20
- data/spec/unit/provider/service/upstart_service_spec.rb +15 -17
- data/spec/unit/provider/subversion_spec.rb +5 -6
- data/spec/unit/provider/user/dscl_spec.rb +2 -1
- data/spec/unit/provider/user/windows_spec.rb +7 -0
- data/spec/unit/provider/whyrun_safe_ruby_block_spec.rb +2 -2
- data/spec/unit/resource/mount_spec.rb +9 -0
- data/spec/unit/resource_spec.rb +0 -4
- data/spec/unit/rest_spec.rb +1 -1
- data/spec/unit/run_context_spec.rb +15 -0
- data/spec/unit/search/query_spec.rb +196 -40
- data/spec/unit/util/path_helper_spec.rb +111 -28
- data/spec/unit/workstation_config_loader_spec.rb +283 -0
- metadata +36 -20
- data/lib/chef/knife/bootstrap/centos5-gems.erb +0 -62
- data/lib/chef/knife/bootstrap/fedora13-gems.erb +0 -44
- data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +0 -53
- data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +0 -48
- data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +0 -46
- data/spec/support/shared/integration/chef_zero_support.rb +0 -130
- data/spec/unit/knife/config_file_selection_spec.rb +0 -135
@@ -487,7 +487,7 @@ EOM
|
|
487
487
|
Updated /cookbooks/x
|
488
488
|
EOM
|
489
489
|
# Modify a file and attempt to upload
|
490
|
-
file 'cookbooks/x/metadata.rb',
|
490
|
+
file 'cookbooks/x/metadata.rb', 'name "x"; version "1.0.0"#different'
|
491
491
|
knife('upload /cookbooks/x').should_fail "ERROR: /cookbooks failed to write: Cookbook x is frozen\n"
|
492
492
|
end
|
493
493
|
end
|
@@ -1216,4 +1216,157 @@ EOM
|
|
1216
1216
|
end
|
1217
1217
|
end
|
1218
1218
|
end
|
1219
|
+
|
1220
|
+
when_the_chef_server "is in Enterprise mode", :osc_compat => false, :single_org => false do
|
1221
|
+
before do
|
1222
|
+
user 'foo', {}
|
1223
|
+
user 'bar', {}
|
1224
|
+
user 'foobar', {}
|
1225
|
+
organization 'foo', { 'full_name' => 'Something'}
|
1226
|
+
end
|
1227
|
+
|
1228
|
+
before :each do
|
1229
|
+
Chef::Config.chef_server_url = URI.join(Chef::Config.chef_server_url, '/organizations/foo')
|
1230
|
+
end
|
1231
|
+
|
1232
|
+
context 'and has nothing but a single group named blah' do
|
1233
|
+
group 'blah', {}
|
1234
|
+
|
1235
|
+
when_the_repository 'has one of each thing' do
|
1236
|
+
|
1237
|
+
before do
|
1238
|
+
# TODO We have to upload acls for an existing group due to a lack of
|
1239
|
+
# dependency detection during upload. Fix that!
|
1240
|
+
file 'acls/groups/blah.json', {}
|
1241
|
+
file 'clients/x.json', { 'public_key' => ChefZero::PUBLIC_KEY }
|
1242
|
+
file 'containers/x.json', {}
|
1243
|
+
file 'cookbooks/x/metadata.rb', cb_metadata("x", "1.0.0")
|
1244
|
+
file 'data_bags/x/y.json', {}
|
1245
|
+
file 'environments/x.json', {}
|
1246
|
+
file 'groups/x.json', {}
|
1247
|
+
file 'invitations.json', [ 'foo' ]
|
1248
|
+
file 'members.json', [ 'bar' ]
|
1249
|
+
file 'nodes/x.json', {}
|
1250
|
+
file 'org.json', { 'full_name' => 'wootles' }
|
1251
|
+
file 'roles/x.json', {}
|
1252
|
+
end
|
1253
|
+
|
1254
|
+
it 'knife upload / uploads everything' do
|
1255
|
+
knife('upload /').should_succeed <<EOM
|
1256
|
+
Updated /acls/groups/blah.json
|
1257
|
+
Created /clients/x.json
|
1258
|
+
Created /containers/x.json
|
1259
|
+
Created /cookbooks/x
|
1260
|
+
Created /data_bags/x
|
1261
|
+
Created /data_bags/x/y.json
|
1262
|
+
Created /environments/x.json
|
1263
|
+
Created /groups/x.json
|
1264
|
+
Updated /invitations.json
|
1265
|
+
Updated /members.json
|
1266
|
+
Created /nodes/x.json
|
1267
|
+
Updated /org.json
|
1268
|
+
Created /roles/x.json
|
1269
|
+
EOM
|
1270
|
+
api.get('association_requests').map { |a| a['username'] }.should == [ 'foo' ]
|
1271
|
+
api.get('users').map { |a| a['user']['username'] }.should == [ 'bar' ]
|
1272
|
+
end
|
1273
|
+
end
|
1274
|
+
|
1275
|
+
when_the_repository 'has an org.json that does not change full_name' do
|
1276
|
+
before do
|
1277
|
+
file 'org.json', { 'full_name' => 'Something' }
|
1278
|
+
end
|
1279
|
+
|
1280
|
+
it 'knife upload / emits a warning for bar and adds foo and foobar' do
|
1281
|
+
knife('upload /').should_succeed ''
|
1282
|
+
api.get('/')['full_name'].should == 'Something'
|
1283
|
+
end
|
1284
|
+
end
|
1285
|
+
|
1286
|
+
when_the_repository 'has an org.json that changes full_name' do
|
1287
|
+
before do
|
1288
|
+
file 'org.json', { 'full_name' => 'Something Else'}
|
1289
|
+
end
|
1290
|
+
|
1291
|
+
it 'knife upload / emits a warning for bar and adds foo and foobar' do
|
1292
|
+
knife('upload /').should_succeed "Updated /org.json\n"
|
1293
|
+
api.get('/')['full_name'].should == 'Something Else'
|
1294
|
+
end
|
1295
|
+
end
|
1296
|
+
|
1297
|
+
context 'and has invited foo and bar is already a member' do
|
1298
|
+
org_invite 'foo'
|
1299
|
+
org_member 'bar'
|
1300
|
+
|
1301
|
+
when_the_repository 'wants to invite foo, bar and foobar' do
|
1302
|
+
before do
|
1303
|
+
file 'invitations.json', [ 'foo', 'bar', 'foobar' ]
|
1304
|
+
end
|
1305
|
+
|
1306
|
+
it 'knife upload / emits a warning for bar and invites foobar' do
|
1307
|
+
knife('upload /').should_succeed "Updated /invitations.json\n", :stderr => "WARN: Could not invite bar to organization foo: User bar is already in organization foo\n"
|
1308
|
+
api.get('association_requests').map { |a| a['username'] }.should == [ 'foo', 'foobar' ]
|
1309
|
+
api.get('users').map { |a| a['user']['username'] }.should == [ 'bar' ]
|
1310
|
+
end
|
1311
|
+
end
|
1312
|
+
|
1313
|
+
when_the_repository 'wants to make foo, bar and foobar members' do
|
1314
|
+
before do
|
1315
|
+
file 'members.json', [ 'foo', 'bar', 'foobar' ]
|
1316
|
+
end
|
1317
|
+
|
1318
|
+
it 'knife upload / emits a warning for bar and adds foo and foobar' do
|
1319
|
+
knife('upload /').should_succeed "Updated /members.json\n"
|
1320
|
+
api.get('association_requests').map { |a| a['username'] }.should == [ ]
|
1321
|
+
api.get('users').map { |a| a['user']['username'] }.should == [ 'bar', 'foo', 'foobar' ]
|
1322
|
+
end
|
1323
|
+
end
|
1324
|
+
|
1325
|
+
when_the_repository 'wants to invite foo and have bar as a member' do
|
1326
|
+
before do
|
1327
|
+
file 'invitations.json', [ 'foo' ]
|
1328
|
+
file 'members.json', [ 'bar' ]
|
1329
|
+
end
|
1330
|
+
|
1331
|
+
it 'knife upload / does nothing' do
|
1332
|
+
knife('upload /').should_succeed ''
|
1333
|
+
api.get('association_requests').map { |a| a['username'] }.should == [ 'foo' ]
|
1334
|
+
api.get('users').map { |a| a['user']['username'] }.should == [ 'bar' ]
|
1335
|
+
end
|
1336
|
+
end
|
1337
|
+
end
|
1338
|
+
|
1339
|
+
context 'and has invited bar and foo' do
|
1340
|
+
org_invite 'bar', 'foo'
|
1341
|
+
|
1342
|
+
when_the_repository 'wants to invite foo and bar (different order)' do
|
1343
|
+
before do
|
1344
|
+
file 'invitations.json', [ 'foo', 'bar' ]
|
1345
|
+
end
|
1346
|
+
|
1347
|
+
it 'knife upload / does nothing' do
|
1348
|
+
knife('upload /').should_succeed ''
|
1349
|
+
api.get('association_requests').map { |a| a['username'] }.should == [ 'bar', 'foo' ]
|
1350
|
+
api.get('users').map { |a| a['user']['username'] }.should == [ ]
|
1351
|
+
end
|
1352
|
+
end
|
1353
|
+
end
|
1354
|
+
|
1355
|
+
context 'and has already added bar and foo as members of the org' do
|
1356
|
+
org_member 'bar', 'foo'
|
1357
|
+
|
1358
|
+
when_the_repository 'wants to add foo and bar (different order)' do
|
1359
|
+
before do
|
1360
|
+
file 'members.json', [ 'foo', 'bar' ]
|
1361
|
+
end
|
1362
|
+
|
1363
|
+
it 'knife upload / does nothing' do
|
1364
|
+
knife('upload /').should_succeed ''
|
1365
|
+
api.get('association_requests').map { |a| a['username'] }.should == [ ]
|
1366
|
+
api.get('users').map { |a| a['user']['username'] }.should == [ 'bar', 'foo' ]
|
1367
|
+
end
|
1368
|
+
end
|
1369
|
+
end
|
1370
|
+
end
|
1371
|
+
end
|
1219
1372
|
end
|
@@ -25,7 +25,6 @@ def start_server(chef_repo_path)
|
|
25
25
|
Chef::Config.versioned_cookbooks = true
|
26
26
|
chef_fs = Chef::ChefFS::Config.new.local_fs
|
27
27
|
data_store = Chef::ChefFS::ChefFSDataStore.new(chef_fs)
|
28
|
-
data_store = ChefZero::DataStore::V1ToV2Adapter.new(data_store, 'chef', :org_defaults => ChefZero::DataStore::V1ToV2Adapter::ORG_DEFAULTS)
|
29
28
|
server = ChefZero::Server.new(:port => 8889.upto(9999), :data_store => data_store)#, :log_level => :debug)
|
30
29
|
server.start_background
|
31
30
|
server
|
@@ -155,6 +155,14 @@ module ChefHTTPShared
|
|
155
155
|
}
|
156
156
|
)
|
157
157
|
|
158
|
+
@api.post('/posty', 200, 'Hi!')
|
159
|
+
|
160
|
+
#
|
161
|
+
# 400 with an error
|
162
|
+
#
|
163
|
+
@api.get('/bad_request', 400, '{ "error": [ "Your request is just terrible." ] }')
|
164
|
+
@api.post('/bad_request', 400, '{ "error": [ "Your request is just terrible." ] }')
|
165
|
+
|
158
166
|
end
|
159
167
|
|
160
168
|
def stop_tiny_server
|
@@ -239,4 +247,3 @@ shared_examples_for "downloading all the things" do
|
|
239
247
|
it_behaves_like "a 403 after a successful request when reusing the request object"
|
240
248
|
end
|
241
249
|
end
|
242
|
-
|
@@ -20,33 +20,23 @@
|
|
20
20
|
require 'tmpdir'
|
21
21
|
require 'fileutils'
|
22
22
|
require 'chef/config'
|
23
|
-
|
24
|
-
# Temporarily use our own copy of chef-zero rspec integration.
|
25
|
-
# See support/shared/integration/chef_zero_support for details
|
26
|
-
#require 'chef_zero/rspec'
|
27
|
-
require 'support/shared/integration/chef_zero_support'
|
28
|
-
|
29
23
|
require 'chef/json_compat'
|
24
|
+
require 'chef/server_api'
|
25
|
+
require 'chef_zero/rspec'
|
30
26
|
require 'support/shared/integration/knife_support'
|
31
27
|
require 'support/shared/integration/app_server_support'
|
32
28
|
require 'spec_helper'
|
33
29
|
|
34
30
|
module IntegrationSupport
|
35
|
-
include
|
31
|
+
include ChefZero::RSpec
|
36
32
|
|
37
33
|
module ClassMethods
|
38
|
-
|
39
|
-
def when_the_chef_server(desc, *tags, &block)
|
40
|
-
context("when the chef server #{desc}", *tags) do
|
41
|
-
#include ChefZero::RSpec::Fixtures
|
42
|
-
include_context "With chef-zero running"
|
43
|
-
module_eval(&block)
|
44
|
-
end
|
45
|
-
end
|
34
|
+
include ChefZero::RSpec
|
46
35
|
|
47
36
|
def when_the_repository(desc, *tags, &block)
|
48
37
|
context("when the chef repo #{desc}", *tags) do
|
49
38
|
include_context "with a chef repo"
|
39
|
+
|
50
40
|
module_eval(&block)
|
51
41
|
end
|
52
42
|
end
|
@@ -63,6 +53,10 @@ module IntegrationSupport
|
|
63
53
|
includer_class.extend(ClassMethods)
|
64
54
|
end
|
65
55
|
|
56
|
+
def api
|
57
|
+
Chef::ServerAPI.new
|
58
|
+
end
|
59
|
+
|
66
60
|
def directory(relative_path, &block)
|
67
61
|
old_parent_path = @parent_path
|
68
62
|
@parent_path = path_to(relative_path)
|
@@ -77,10 +71,8 @@ module IntegrationSupport
|
|
77
71
|
FileUtils.mkdir_p(dir) unless dir == '.'
|
78
72
|
File.open(filename, 'w') do |file|
|
79
73
|
raw = case contents
|
80
|
-
when Hash
|
74
|
+
when Hash, Array
|
81
75
|
JSON.pretty_generate(contents)
|
82
|
-
when Array
|
83
|
-
contents.join("\n")
|
84
76
|
else
|
85
77
|
contents
|
86
78
|
end
|
@@ -101,7 +93,7 @@ module IntegrationSupport
|
|
101
93
|
end
|
102
94
|
|
103
95
|
def cb_metadata(name, version, extra_text="")
|
104
|
-
"name
|
96
|
+
"name #{name.inspect}; version #{version.inspect}#{extra_text}"
|
105
97
|
end
|
106
98
|
|
107
99
|
def cwd(relative_path)
|
@@ -29,6 +29,10 @@ shared_examples_for "a platform introspector" do
|
|
29
29
|
end
|
30
30
|
@platform_hash["debian"] = {["5", "6"] => "debian-5/6", "default" => "debian"}
|
31
31
|
@platform_hash["default"] = "default"
|
32
|
+
# The following @platform_hash keys are used for testing version constraints
|
33
|
+
@platform_hash['exact_match'] = { '1.2.3' => 'exact', '>= 1.0' => 'not exact'}
|
34
|
+
@platform_hash['multiple_matches'] = { '~> 2.3.4' => 'matched ~> 2.3.4', '>= 2.3' => 'matched >=2.3' }
|
35
|
+
@platform_hash['successful_matches'] = { '< 3.0' => 'matched < 3.0', '>= 3.0' => 'matched >= 3.0' }
|
32
36
|
|
33
37
|
@platform_family_hash = {
|
34
38
|
"debian" => "debian value",
|
@@ -79,6 +83,24 @@ shared_examples_for "a platform introspector" do
|
|
79
83
|
platform_introspector.value_for_platform(@platform_hash).should == "openbsd"
|
80
84
|
end
|
81
85
|
|
86
|
+
it 'returns the exact match' do
|
87
|
+
node.automatic_attrs[:platform] = 'exact_match'
|
88
|
+
node.automatic_attrs[:platform_version] = '1.2.3'
|
89
|
+
platform_introspector.value_for_platform(@platform_hash).should == 'exact'
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'raises RuntimeError' do
|
93
|
+
node.automatic_attrs[:platform] = 'multiple_matches'
|
94
|
+
node.automatic_attrs[:platform_version] = '2.3.4'
|
95
|
+
expect {platform_introspector.value_for_platform(@platform_hash)}.to raise_error(RuntimeError)
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'should return the value for that match' do
|
99
|
+
node.automatic_attrs[:platform] = 'successful_matches'
|
100
|
+
node.automatic_attrs[:platform_version] = '2.9'
|
101
|
+
platform_introspector.value_for_platform(@platform_hash).should == 'matched < 3.0'
|
102
|
+
end
|
103
|
+
|
82
104
|
describe "when platform versions is an array" do
|
83
105
|
it "returns a version-specific value based on the current platform" do
|
84
106
|
node.automatic_attrs[:platform] = "debian"
|
@@ -20,7 +20,7 @@ require 'spec_helper'
|
|
20
20
|
describe Chef::Application::Apply do
|
21
21
|
|
22
22
|
before do
|
23
|
-
@app = Chef::Application::
|
23
|
+
@app = Chef::Application::Apply.new
|
24
24
|
@app.stub(:configure_logging).and_return(true)
|
25
25
|
@recipe_text = "package 'nyancat'"
|
26
26
|
Chef::Config[:solo] = true
|
@@ -73,4 +73,14 @@ describe Chef::Application::Apply do
|
|
73
73
|
@recipe_fh.path.should == @app.instance_variable_get(:@recipe_filename)
|
74
74
|
end
|
75
75
|
end
|
76
|
+
describe "recipe_file_arg" do
|
77
|
+
before do
|
78
|
+
ARGV.clear
|
79
|
+
end
|
80
|
+
it "should exit and log message" do
|
81
|
+
Chef::Log.should_receive(:debug).with(/^No recipe file provided/)
|
82
|
+
lambda { @app.run }.should raise_error(SystemExit) { |e| e.status.should == 1 }
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
76
86
|
end
|
@@ -49,7 +49,6 @@ describe Chef::Application::Solo do
|
|
49
49
|
end
|
50
50
|
|
51
51
|
describe "when the json_attribs configuration option is specified" do
|
52
|
-
|
53
52
|
let(:json_attribs) { {"a" => "b"} }
|
54
53
|
let(:config_fetcher) { double(Chef::ConfigFetcher, :fetch_json => json_attribs) }
|
55
54
|
let(:json_source) { "https://foo.com/foo.json" }
|
@@ -66,8 +65,6 @@ describe Chef::Application::Solo do
|
|
66
65
|
end
|
67
66
|
end
|
68
67
|
|
69
|
-
|
70
|
-
|
71
68
|
describe "when the recipe_url configuration option is specified" do
|
72
69
|
before do
|
73
70
|
Chef::Config[:cookbook_path] = "#{Dir.tmpdir}/chef-solo/cookbooks"
|
@@ -104,6 +101,25 @@ describe Chef::Application::Solo do
|
|
104
101
|
end
|
105
102
|
end
|
106
103
|
|
104
|
+
describe "when the json_attribs and recipe_url configuration options are both specified" do
|
105
|
+
let(:json_attribs) { {"a" => "b"} }
|
106
|
+
let(:config_fetcher) { double(Chef::ConfigFetcher, :fetch_json => json_attribs) }
|
107
|
+
let(:json_source) { "https://foo.com/foo.json" }
|
108
|
+
|
109
|
+
before do
|
110
|
+
Chef::Config[:json_attribs] = json_source
|
111
|
+
Chef::Config[:recipe_url] = "http://icanhas.cheezburger.com/lolcats"
|
112
|
+
Chef::Config[:cookbook_path] = "#{Dir.tmpdir}/chef-solo/cookbooks"
|
113
|
+
FileUtils.stub(:mkdir_p).and_return(true)
|
114
|
+
Chef::Mixin::Command.stub(:run_command).and_return(true)
|
115
|
+
end
|
116
|
+
|
117
|
+
it "should fetch the recipe_url first" do
|
118
|
+
@app.should_receive(:fetch_recipe_tarball).ordered
|
119
|
+
Chef::ConfigFetcher.should_receive(:new).ordered.and_return(config_fetcher)
|
120
|
+
@app.reconfigure
|
121
|
+
end
|
122
|
+
end
|
107
123
|
|
108
124
|
describe "after the application has been configured" do
|
109
125
|
before do
|
@@ -0,0 +1,58 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Jess Mink (<jmink@getchef.com>)
|
3
|
+
# Copyright:: Copyright (c) 2014 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 'spec_helper'
|
20
|
+
require 'chef/exceptions'
|
21
|
+
require 'lib/chef/chef_fs/config.rb'
|
22
|
+
|
23
|
+
describe Chef::ChefFS::Config do
|
24
|
+
describe "initialize" do
|
25
|
+
it "warns when hosted setups use 'everything'" do
|
26
|
+
base_config = Hash.new()
|
27
|
+
base_config[:repo_mode] = 'everything'
|
28
|
+
base_config[:chef_server_url] = 'http://foo.com/organizations/fake_org/'
|
29
|
+
|
30
|
+
ui = double("ui")
|
31
|
+
expect(ui).to receive(:warn)
|
32
|
+
|
33
|
+
Chef::ChefFS::Config.new(base_config, Dir.pwd, {}, ui)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "doesn't warn when hosted setups use 'hosted_everything'" do
|
37
|
+
base_config = Hash.new()
|
38
|
+
base_config[:repo_mode] = 'hosted_everything'
|
39
|
+
base_config[:chef_server_url] = 'http://foo.com/organizations/fake_org/'
|
40
|
+
|
41
|
+
ui = double("ui")
|
42
|
+
expect(ui).to receive(:warn).exactly(0).times
|
43
|
+
|
44
|
+
Chef::ChefFS::Config.new(base_config, Dir.pwd, {}, ui)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "doesn't warn when non-hosted setups use 'everything'" do
|
48
|
+
base_config = Hash.new()
|
49
|
+
base_config[:repo_mode] = 'everything'
|
50
|
+
base_config[:chef_server_url] = 'http://foo.com/'
|
51
|
+
|
52
|
+
ui = double("ui")
|
53
|
+
expect(ui).to receive(:warn).exactly(0).times
|
54
|
+
|
55
|
+
Chef::ChefFS::Config.new(base_config, Dir.pwd, {}, ui)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -8,9 +8,7 @@ describe Chef::ConfigFetcher do
|
|
8
8
|
let(:config_location_regex) { Regexp.escape(config_location) }
|
9
9
|
let(:invalid_json_error_regex) { %r[Could not parse the provided JSON file \(#{config_location_regex}\)] }
|
10
10
|
|
11
|
-
let(:
|
12
|
-
|
13
|
-
let(:fetcher) { Chef::ConfigFetcher.new(config_location, config_jail_path) }
|
11
|
+
let(:fetcher) { Chef::ConfigFetcher.new(config_location) }
|
14
12
|
|
15
13
|
context "when loading a local file" do
|
16
14
|
let(:config_location) { "/etc/chef/client.rb" }
|
data/spec/unit/config_spec.rb
CHANGED
@@ -19,6 +19,7 @@
|
|
19
19
|
|
20
20
|
require 'spec_helper'
|
21
21
|
require 'chef/exceptions'
|
22
|
+
require 'chef/util/path_helper'
|
22
23
|
|
23
24
|
describe Chef::Config do
|
24
25
|
describe "config attribute writer: chef_server_url" do
|
@@ -117,278 +118,304 @@ describe Chef::Config do
|
|
117
118
|
|
118
119
|
end
|
119
120
|
|
120
|
-
|
121
|
-
it "should return given path on non-windows systems" do
|
122
|
-
platform_mock :unix do
|
123
|
-
path = "/etc/chef/cookbooks"
|
124
|
-
Chef::Config.platform_specific_path(path).should == "/etc/chef/cookbooks"
|
125
|
-
end
|
126
|
-
end
|
121
|
+
[ false, true ].each do |is_windows|
|
127
122
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
Chef::Config.stub(:env).and_return({ 'SYSTEMDRIVE' => 'C:' })
|
132
|
-
# match on a regex that looks for the base path with an optional
|
133
|
-
# system drive at the beginning (c:)
|
134
|
-
# system drive is not hardcoded b/c it can change and b/c it is not present on linux systems
|
135
|
-
Chef::Config.platform_specific_path(path).should == "C:\\chef\\cookbooks"
|
123
|
+
context "On #{is_windows ? 'Windows' : 'Unix'}" do
|
124
|
+
def to_platform(*args)
|
125
|
+
Chef::Config.platform_specific_path(*args)
|
136
126
|
end
|
137
|
-
end
|
138
|
-
end
|
139
127
|
|
140
|
-
|
141
|
-
|
142
|
-
if windows?
|
143
|
-
"#{Chef::Config.env['SYSTEMDRIVE']}\\chef"
|
144
|
-
else
|
145
|
-
"/var/chef"
|
128
|
+
before :each do
|
129
|
+
Chef::Platform.stub(:windows?).and_return(is_windows)
|
146
130
|
end
|
147
|
-
end
|
148
131
|
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
132
|
+
describe "class method: platform_specific_path" do
|
133
|
+
if is_windows
|
134
|
+
it "should return a windows path on windows systems" do
|
135
|
+
path = "/etc/chef/cookbooks"
|
136
|
+
Chef::Config.stub(:env).and_return({ 'SYSTEMDRIVE' => 'C:' })
|
137
|
+
# match on a regex that looks for the base path with an optional
|
138
|
+
# system drive at the beginning (c:)
|
139
|
+
# system drive is not hardcoded b/c it can change and b/c it is not present on linux systems
|
140
|
+
Chef::Config.platform_specific_path(path).should == "C:\\chef\\cookbooks"
|
141
|
+
end
|
142
|
+
else
|
143
|
+
it "should return given path on non-windows systems" do
|
144
|
+
path = "/etc/chef/cookbooks"
|
145
|
+
Chef::Config.platform_specific_path(path).should == "/etc/chef/cookbooks"
|
146
|
+
end
|
147
|
+
end
|
154
148
|
end
|
155
|
-
end
|
156
149
|
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
150
|
+
describe "default values" do
|
151
|
+
let :primary_cache_path do
|
152
|
+
if is_windows
|
153
|
+
"#{Chef::Config.env['SYSTEMDRIVE']}\\chef"
|
154
|
+
else
|
155
|
+
"/var/chef"
|
156
|
+
end
|
157
|
+
end
|
164
158
|
|
165
|
-
|
166
|
-
|
159
|
+
let :secondary_cache_path do
|
160
|
+
if is_windows
|
161
|
+
"#{Chef::Config[:user_home]}\\.chef"
|
162
|
+
else
|
163
|
+
"#{Chef::Config[:user_home]}/.chef"
|
164
|
+
end
|
165
|
+
end
|
167
166
|
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
167
|
+
before do
|
168
|
+
if is_windows
|
169
|
+
Chef::Config.stub(:env).and_return({ 'SYSTEMDRIVE' => 'C:' })
|
170
|
+
Chef::Config[:user_home] = 'C:\Users\charlie'
|
171
|
+
else
|
172
|
+
Chef::Config[:user_home] = '/Users/charlie'
|
173
|
+
end
|
174
|
+
|
175
|
+
Chef::Config.stub(:path_accessible?).and_return(false)
|
173
176
|
end
|
174
|
-
end
|
175
177
|
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
178
|
+
describe "Chef::Config[:cache_path]" do
|
179
|
+
context "when /var/chef exists and is accessible" do
|
180
|
+
it "defaults to /var/chef" do
|
181
|
+
Chef::Config.stub(:path_accessible?).with(to_platform("/var/chef")).and_return(true)
|
182
|
+
Chef::Config[:cache_path].should == primary_cache_path
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
context "when /var/chef does not exist and /var is accessible" do
|
187
|
+
it "defaults to /var/chef" do
|
188
|
+
File.stub(:exists?).with(to_platform("/var/chef")).and_return(false)
|
189
|
+
Chef::Config.stub(:path_accessible?).with(to_platform("/var")).and_return(true)
|
190
|
+
Chef::Config[:cache_path].should == primary_cache_path
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
context "when /var/chef does not exist and /var is not accessible" do
|
195
|
+
it "defaults to $HOME/.chef" do
|
196
|
+
File.stub(:exists?).with(to_platform("/var/chef")).and_return(false)
|
197
|
+
Chef::Config.stub(:path_accessible?).with(to_platform("/var")).and_return(false)
|
198
|
+
Chef::Config[:cache_path].should == secondary_cache_path
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
context "when /var/chef exists and is not accessible" do
|
203
|
+
it "defaults to $HOME/.chef" do
|
204
|
+
File.stub(:exists?).with(to_platform("/var/chef")).and_return(true)
|
205
|
+
File.stub(:readable?).with(to_platform("/var/chef")).and_return(true)
|
206
|
+
File.stub(:writable?).with(to_platform("/var/chef")).and_return(false)
|
207
|
+
|
208
|
+
Chef::Config[:cache_path].should == secondary_cache_path
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
context "when chef is running in local mode" do
|
213
|
+
before do
|
214
|
+
Chef::Config.local_mode = true
|
215
|
+
end
|
216
|
+
|
217
|
+
context "and config_dir is /a/b/c" do
|
218
|
+
before do
|
219
|
+
Chef::Config.config_dir to_platform('/a/b/c')
|
220
|
+
end
|
221
|
+
|
222
|
+
it "cache_path is /a/b/c/local-mode-cache" do
|
223
|
+
Chef::Config.cache_path.should == to_platform('/a/b/c/local-mode-cache')
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
context "and config_dir is /a/b/c/" do
|
228
|
+
before do
|
229
|
+
Chef::Config.config_dir to_platform('/a/b/c/')
|
230
|
+
end
|
231
|
+
|
232
|
+
it "cache_path is /a/b/c/local-mode-cache" do
|
233
|
+
Chef::Config.cache_path.should == to_platform('/a/b/c/local-mode-cache')
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|
181
237
|
end
|
182
|
-
end
|
183
238
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
Chef::Config
|
188
|
-
Chef::Config[:cache_path].should == secondary_cache_path
|
239
|
+
it "Chef::Config[:file_backup_path] defaults to /var/chef/backup" do
|
240
|
+
Chef::Config.stub(:cache_path).and_return(primary_cache_path)
|
241
|
+
backup_path = is_windows ? "#{primary_cache_path}\\backup" : "#{primary_cache_path}/backup"
|
242
|
+
Chef::Config[:file_backup_path].should == backup_path
|
189
243
|
end
|
190
|
-
end
|
191
244
|
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
File.stub(:readable?).with(Chef::Config.platform_specific_path("/var/chef")).and_return(true)
|
196
|
-
File.stub(:writable?).with(Chef::Config.platform_specific_path("/var/chef")).and_return(false)
|
245
|
+
it "Chef::Config[:ssl_verify_mode] defaults to :verify_none" do
|
246
|
+
Chef::Config[:ssl_verify_mode].should == :verify_none
|
247
|
+
end
|
197
248
|
|
198
|
-
|
249
|
+
it "Chef::Config[:ssl_ca_path] defaults to nil" do
|
250
|
+
Chef::Config[:ssl_ca_path].should be_nil
|
199
251
|
end
|
200
|
-
end
|
201
|
-
end
|
202
252
|
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
253
|
+
# TODO can this be removed?
|
254
|
+
if !is_windows
|
255
|
+
it "Chef::Config[:ssl_ca_file] defaults to nil" do
|
256
|
+
Chef::Config[:ssl_ca_file].should be_nil
|
257
|
+
end
|
258
|
+
end
|
208
259
|
|
209
|
-
|
210
|
-
|
211
|
-
|
260
|
+
it "Chef::Config[:data_bag_path] defaults to /var/chef/data_bags" do
|
261
|
+
Chef::Config.stub(:cache_path).and_return(primary_cache_path)
|
262
|
+
data_bag_path = is_windows ? "#{primary_cache_path}\\data_bags" : "#{primary_cache_path}/data_bags"
|
263
|
+
Chef::Config[:data_bag_path].should == data_bag_path
|
264
|
+
end
|
212
265
|
|
213
|
-
|
214
|
-
|
215
|
-
|
266
|
+
it "Chef::Config[:environment_path] defaults to /var/chef/environments" do
|
267
|
+
Chef::Config.stub(:cache_path).and_return(primary_cache_path)
|
268
|
+
environment_path = is_windows ? "#{primary_cache_path}\\environments" : "#{primary_cache_path}/environments"
|
269
|
+
Chef::Config[:environment_path].should == environment_path
|
270
|
+
end
|
216
271
|
|
217
|
-
|
218
|
-
before do
|
219
|
-
Chef::Config.stub(:on_windows?).and_return(false)
|
220
|
-
end
|
272
|
+
describe "setting the config dir" do
|
221
273
|
|
222
|
-
|
223
|
-
Chef::Config[:ssl_ca_file].should be_nil
|
224
|
-
end
|
225
|
-
end
|
274
|
+
context "when the config file is /etc/chef/client.rb" do
|
226
275
|
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
Chef::Config[:data_bag_path].should == data_bag_path
|
231
|
-
end
|
276
|
+
before do
|
277
|
+
Chef::Config.config_file = to_platform("/etc/chef/client.rb")
|
278
|
+
end
|
232
279
|
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
Chef::Config[:environment_path].should == environment_path
|
237
|
-
end
|
280
|
+
it "config_dir is /etc/chef" do
|
281
|
+
Chef::Config.config_dir.should == to_platform("/etc/chef")
|
282
|
+
end
|
238
283
|
|
239
|
-
|
284
|
+
context "and chef is running in local mode" do
|
285
|
+
before do
|
286
|
+
Chef::Config.local_mode = true
|
287
|
+
end
|
240
288
|
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
289
|
+
it "config_dir is /etc/chef" do
|
290
|
+
Chef::Config.config_dir.should == to_platform("/etc/chef")
|
291
|
+
end
|
292
|
+
end
|
245
293
|
|
246
|
-
|
247
|
-
|
248
|
-
|
294
|
+
context "when config_dir is set to /other/config/dir/" do
|
295
|
+
before do
|
296
|
+
Chef::Config.config_dir = to_platform("/other/config/dir/")
|
297
|
+
end
|
249
298
|
|
250
|
-
|
251
|
-
|
252
|
-
|
299
|
+
it "yields the explicit value" do
|
300
|
+
Chef::Config.config_dir.should == to_platform("/other/config/dir/")
|
301
|
+
end
|
302
|
+
end
|
253
303
|
|
254
|
-
|
304
|
+
end
|
255
305
|
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
306
|
+
context "when the user's home dir is /home/charlie/" do
|
307
|
+
before do
|
308
|
+
Chef::Config.user_home = to_platform("/home/charlie")
|
309
|
+
end
|
260
310
|
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
end
|
265
|
-
end
|
311
|
+
it "config_dir is /home/charlie/.chef/" do
|
312
|
+
Chef::Config.config_dir.should == Chef::Util::PathHelper.join(to_platform("/home/charlie/.chef"), '')
|
313
|
+
end
|
266
314
|
|
267
|
-
|
315
|
+
context "and chef is running in local mode" do
|
316
|
+
before do
|
317
|
+
Chef::Config.local_mode = true
|
318
|
+
end
|
268
319
|
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
320
|
+
it "config_dir is /home/charlie/.chef/" do
|
321
|
+
Chef::Config.config_dir.should == Chef::Util::PathHelper.join(to_platform("/home/charlie/.chef"), '')
|
322
|
+
end
|
323
|
+
end
|
324
|
+
end
|
273
325
|
|
274
|
-
context "by default" do
|
275
|
-
it "is the parent dir of the config file" do
|
276
|
-
Chef::Config.config_dir.should == "/etc/chef"
|
277
|
-
end
|
278
|
-
end
|
279
|
-
|
280
|
-
context "when chef is running in local mode" do
|
281
|
-
before do
|
282
|
-
Chef::Config.local_mode = true
|
283
|
-
Chef::Config.user_home = "/home/charlie"
|
284
326
|
end
|
285
327
|
|
286
|
-
|
287
|
-
|
328
|
+
if is_windows
|
329
|
+
describe "finding the windows embedded dir" do
|
330
|
+
let(:default_config_location) { "c:/opscode/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.0/lib/chef/config.rb" }
|
331
|
+
let(:alternate_install_location) { "c:/my/alternate/install/place/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.0/lib/chef/config.rb" }
|
332
|
+
let(:non_omnibus_location) { "c:/my/dev/stuff/lib/ruby/gems/1.9.1/gems/chef-11.6.0/lib/chef/config.rb" }
|
333
|
+
|
334
|
+
let(:default_ca_file) { "c:/opscode/chef/embedded/ssl/certs/cacert.pem" }
|
335
|
+
|
336
|
+
it "finds the embedded dir in the default location" do
|
337
|
+
Chef::Config.stub(:_this_file).and_return(default_config_location)
|
338
|
+
Chef::Config.embedded_dir.should == "c:/opscode/chef/embedded"
|
339
|
+
end
|
340
|
+
|
341
|
+
it "finds the embedded dir in a custom install location" do
|
342
|
+
Chef::Config.stub(:_this_file).and_return(alternate_install_location)
|
343
|
+
Chef::Config.embedded_dir.should == "c:/my/alternate/install/place/chef/embedded"
|
344
|
+
end
|
345
|
+
|
346
|
+
it "doesn't error when not in an omnibus install" do
|
347
|
+
Chef::Config.stub(:_this_file).and_return(non_omnibus_location)
|
348
|
+
Chef::Config.embedded_dir.should be_nil
|
349
|
+
end
|
350
|
+
|
351
|
+
it "sets the ssl_ca_cert path if the cert file is available" do
|
352
|
+
Chef::Config.stub(:_this_file).and_return(default_config_location)
|
353
|
+
File.stub(:exist?).with(default_ca_file).and_return(true)
|
354
|
+
Chef::Config.ssl_ca_file.should == default_ca_file
|
355
|
+
end
|
356
|
+
end
|
288
357
|
end
|
289
358
|
end
|
290
359
|
|
291
|
-
|
292
|
-
|
293
|
-
|
360
|
+
describe "Chef::Config[:user_home]" do
|
361
|
+
it "should set when HOME is provided" do
|
362
|
+
expected = to_platform("/home/kitten")
|
363
|
+
Chef::Config.stub(:env).and_return({ 'HOME' => expected })
|
364
|
+
Chef::Config[:user_home].should == expected
|
294
365
|
end
|
295
366
|
|
296
|
-
it "
|
297
|
-
|
367
|
+
it "should be set when only USERPROFILE is provided" do
|
368
|
+
expected = to_platform("/users/kitten")
|
369
|
+
Chef::Config.stub(:env).and_return({ 'USERPROFILE' => expected })
|
370
|
+
Chef::Config[:user_home].should == expected
|
298
371
|
end
|
299
|
-
end
|
300
372
|
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
let(:alternate_install_location) { "c:/my/alternate/install/place/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.0/lib/chef/config.rb" }
|
306
|
-
let(:non_omnibus_location) { "c:/my/dev/stuff/lib/ruby/gems/1.9.1/gems/chef-11.6.0/lib/chef/config.rb" }
|
307
|
-
|
308
|
-
let(:default_ca_file) { "c:/opscode/chef/embedded/ssl/certs/cacert.pem" }
|
309
|
-
|
310
|
-
it "finds the embedded dir in the default location" do
|
311
|
-
Chef::Config.stub(:_this_file).and_return(default_config_location)
|
312
|
-
Chef::Config.embedded_dir.should == "c:/opscode/chef/embedded"
|
313
|
-
end
|
314
|
-
|
315
|
-
it "finds the embedded dir in a custom install location" do
|
316
|
-
Chef::Config.stub(:_this_file).and_return(alternate_install_location)
|
317
|
-
Chef::Config.embedded_dir.should == "c:/my/alternate/install/place/chef/embedded"
|
318
|
-
end
|
319
|
-
|
320
|
-
it "doesn't error when not in an omnibus install" do
|
321
|
-
Chef::Config.stub(:_this_file).and_return(non_omnibus_location)
|
322
|
-
Chef::Config.embedded_dir.should be_nil
|
323
|
-
end
|
324
|
-
|
325
|
-
it "sets the ssl_ca_cert path if the cert file is available" do
|
326
|
-
Chef::Config.stub(:_this_file).and_return(default_config_location)
|
327
|
-
Chef::Config.stub(:on_windows?).and_return(true)
|
328
|
-
File.stub(:exist?).with(default_ca_file).and_return(true)
|
329
|
-
Chef::Config.ssl_ca_file.should == default_ca_file
|
373
|
+
it "falls back to the current working directory when HOME and USERPROFILE is not set" do
|
374
|
+
Chef::Config.stub(:env).and_return({})
|
375
|
+
Chef::Config[:user_home].should == Dir.pwd
|
376
|
+
end
|
330
377
|
end
|
331
|
-
end
|
332
|
-
end
|
333
|
-
|
334
|
-
describe "Chef::Config[:user_home]" do
|
335
|
-
it "should set when HOME is provided" do
|
336
|
-
Chef::Config.stub(:env).and_return({ 'HOME' => "/home/kitten" })
|
337
|
-
Chef::Config[:user_home].should == "/home/kitten"
|
338
|
-
end
|
339
378
|
|
340
|
-
|
341
|
-
|
342
|
-
Chef::Config[:user_home].should == "/users/kitten"
|
343
|
-
end
|
344
|
-
|
345
|
-
it "falls back to the current working directory when HOME and USERPROFILE is not set" do
|
346
|
-
Chef::Config.stub(:env).and_return({})
|
347
|
-
Chef::Config[:user_home].should == Dir.pwd
|
348
|
-
end
|
349
|
-
end
|
350
|
-
|
351
|
-
describe "Chef::Config[:encrypted_data_bag_secret]" do
|
352
|
-
db_secret_default_path =
|
353
|
-
Chef::Config.platform_specific_path("/etc/chef/encrypted_data_bag_secret")
|
379
|
+
describe "Chef::Config[:encrypted_data_bag_secret]" do
|
380
|
+
let(:db_secret_default_path){ to_platform("/etc/chef/encrypted_data_bag_secret") }
|
354
381
|
|
355
|
-
|
382
|
+
before do
|
383
|
+
File.stub(:exist?).with(db_secret_default_path).and_return(secret_exists)
|
384
|
+
end
|
356
385
|
|
357
|
-
|
358
|
-
|
359
|
-
|
386
|
+
context "/etc/chef/encrypted_data_bag_secret exists" do
|
387
|
+
let(:secret_exists) { true }
|
388
|
+
it "sets the value to /etc/chef/encrypted_data_bag_secret" do
|
389
|
+
Chef::Config[:encrypted_data_bag_secret].should eq db_secret_default_path
|
390
|
+
end
|
391
|
+
end
|
360
392
|
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
393
|
+
context "/etc/chef/encrypted_data_bag_secret does not exist" do
|
394
|
+
let(:secret_exists) { false }
|
395
|
+
it "sets the value to nil" do
|
396
|
+
Chef::Config[:encrypted_data_bag_secret].should be_nil
|
397
|
+
end
|
398
|
+
end
|
365
399
|
end
|
366
|
-
end
|
367
400
|
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
401
|
+
describe "Chef::Config[:event_handlers]" do
|
402
|
+
it "sets a event_handlers to an empty array by default" do
|
403
|
+
Chef::Config[:event_handlers].should eq([])
|
404
|
+
end
|
405
|
+
it "should be able to add custom handlers" do
|
406
|
+
o = Object.new
|
407
|
+
Chef::Config[:event_handlers] << o
|
408
|
+
Chef::Config[:event_handlers].should be_include(o)
|
409
|
+
end
|
372
410
|
end
|
373
|
-
end
|
374
|
-
end
|
375
411
|
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
Chef::Config[:event_handlers].should be_include(o)
|
384
|
-
end
|
385
|
-
end
|
386
|
-
|
387
|
-
describe "Chef::Config[:user_valid_regex]" do
|
388
|
-
context "on a platform that is not Windows" do
|
389
|
-
it "allows one letter usernames" do
|
390
|
-
any_match = Chef::Config[:user_valid_regex].any? { |regex| regex.match('a') }
|
391
|
-
expect(any_match).to be_true
|
412
|
+
describe "Chef::Config[:user_valid_regex]" do
|
413
|
+
context "on a platform that is not Windows" do
|
414
|
+
it "allows one letter usernames" do
|
415
|
+
any_match = Chef::Config[:user_valid_regex].any? { |regex| regex.match('a') }
|
416
|
+
expect(any_match).to be_true
|
417
|
+
end
|
418
|
+
end
|
392
419
|
end
|
393
420
|
end
|
394
421
|
end
|