chef 12.8.1-universal-mingw32 → 12.9.38-universal-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/CONTRIBUTING.md +208 -208
- data/Gemfile +54 -49
- data/LICENSE +201 -201
- data/README.md +139 -139
- data/Rakefile +87 -86
- data/VERSION +1 -1
- data/acceptance/.gitignore +2 -2
- data/acceptance/.shared/kitchen_acceptance/.kitchen.digitalocean.yml +33 -33
- data/acceptance/.shared/kitchen_acceptance/.kitchen.ec2.yml +292 -290
- data/acceptance/.shared/kitchen_acceptance/.kitchen.vagrant.yml +59 -59
- data/acceptance/.shared/kitchen_acceptance/libraries/kitchen.rb +51 -51
- data/acceptance/.shared/kitchen_acceptance/metadata.rb +1 -1
- data/acceptance/Gemfile +13 -14
- data/acceptance/README.md +132 -132
- data/acceptance/basics/.acceptance/acceptance-cookbook/.gitignore +2 -2
- data/acceptance/basics/.acceptance/acceptance-cookbook/metadata.rb +3 -3
- data/acceptance/basics/.acceptance/acceptance-cookbook/recipes/destroy.rb +1 -1
- data/acceptance/basics/.acceptance/acceptance-cookbook/recipes/provision.rb +1 -1
- data/acceptance/basics/.acceptance/acceptance-cookbook/recipes/verify.rb +1 -1
- data/acceptance/basics/.kitchen.yml +4 -4
- data/acceptance/basics/test/integration/chef-current-install/serverspec/chef_client_spec.rb +19 -19
- data/acceptance/basics/test/integration/chef-current-install/serverspec/spec_helper.rb +6 -6
- data/acceptance/fips/.acceptance/acceptance-cookbook/.gitignore +2 -2
- data/acceptance/fips/.acceptance/acceptance-cookbook/metadata.rb +2 -2
- data/acceptance/fips/.acceptance/acceptance-cookbook/recipes/destroy.rb +1 -1
- data/acceptance/fips/.acceptance/acceptance-cookbook/recipes/provision.rb +1 -1
- data/acceptance/fips/.acceptance/acceptance-cookbook/recipes/verify.rb +1 -1
- data/acceptance/fips/.kitchen.yml +4 -4
- data/acceptance/fips/test/integration/fips/serverspec/Gemfile +3 -3
- data/acceptance/fips/test/integration/fips/serverspec/fips_spec.rb +39 -39
- data/acceptance/omnitruck/.acceptance/acceptance-cookbook/.gitignore +2 -0
- data/acceptance/omnitruck/.acceptance/acceptance-cookbook/metadata.rb +1 -0
- data/acceptance/omnitruck/.acceptance/acceptance-cookbook/recipes/destroy.rb +1 -0
- data/acceptance/omnitruck/.acceptance/acceptance-cookbook/recipes/provision.rb +1 -0
- data/acceptance/omnitruck/.acceptance/acceptance-cookbook/recipes/verify.rb +61 -0
- data/acceptance/top-cookbooks/.acceptance/acceptance-cookbook/.gitignore +2 -2
- data/acceptance/top-cookbooks/.acceptance/acceptance-cookbook/libraries/cookbook_kitchen.rb +43 -43
- data/acceptance/top-cookbooks/.acceptance/acceptance-cookbook/libraries/top_cookbooks.rb +45 -23
- data/acceptance/top-cookbooks/.acceptance/acceptance-cookbook/metadata.rb +3 -3
- data/acceptance/top-cookbooks/.acceptance/acceptance-cookbook/recipes/destroy.rb +1 -1
- data/acceptance/top-cookbooks/.acceptance/acceptance-cookbook/recipes/provision.rb +1 -1
- data/acceptance/top-cookbooks/.acceptance/acceptance-cookbook/recipes/verify.rb +1 -1
- data/acceptance/top-cookbooks/.gitignore +1 -1
- data/acceptance/top-cookbooks/.kitchen.chocolatey.yml +6 -0
- data/acceptance/top-cookbooks/.kitchen.docker.yml +12 -12
- data/acceptance/top-cookbooks/.kitchen.git.yml +11 -11
- data/acceptance/top-cookbooks/.kitchen.iis.yml +4 -0
- data/acceptance/top-cookbooks/.kitchen.learn-the-basics-rhel.yml +7 -7
- data/acceptance/top-cookbooks/.kitchen.learn-the-basics-ubuntu.yml +7 -7
- data/acceptance/top-cookbooks/.kitchen.learn-the-basics-windows.yml +7 -7
- data/acceptance/top-cookbooks/.kitchen.powershell.yml +4 -0
- data/acceptance/top-cookbooks/.kitchen.sql_server.yml +5 -0
- data/acceptance/top-cookbooks/.kitchen.winbox.yml +8 -0
- data/acceptance/top-cookbooks/.kitchen.windows.yml +38 -0
- data/acceptance/trivial/.acceptance/acceptance-cookbook/.gitignore +2 -2
- data/acceptance/trivial/.acceptance/acceptance-cookbook/metadata.rb +2 -2
- data/acceptance/trivial/.acceptance/acceptance-cookbook/recipes/destroy.rb +1 -1
- data/acceptance/trivial/.acceptance/acceptance-cookbook/recipes/provision.rb +1 -1
- data/acceptance/trivial/.acceptance/acceptance-cookbook/recipes/verify.rb +1 -1
- data/acceptance/trivial/.kitchen.yml +7 -7
- data/acceptance/trivial/test/integration/chef-current-install/inspec/chef_client_spec.rb +5 -5
- data/acceptance/windows-service/.acceptance/acceptance-cookbook/.gitignore +2 -2
- data/acceptance/windows-service/.acceptance/acceptance-cookbook/metadata.rb +2 -2
- data/acceptance/windows-service/.acceptance/acceptance-cookbook/recipes/destroy.rb +1 -1
- data/acceptance/windows-service/.acceptance/acceptance-cookbook/recipes/provision.rb +1 -1
- data/acceptance/windows-service/.acceptance/acceptance-cookbook/recipes/verify.rb +1 -1
- data/acceptance/windows-service/.kitchen.yml +7 -7
- data/acceptance/windows-service/test/integration/chef-windows-service/inspec/chef_windows_service_spec.rb +58 -58
- data/bin/chef-apply +25 -25
- data/bin/chef-client +26 -26
- data/bin/chef-service-manager +38 -38
- data/bin/chef-shell +34 -34
- data/bin/chef-solo +25 -25
- data/bin/chef-windows-service +35 -35
- data/bin/knife +25 -25
- data/chef-windows.gemspec +24 -24
- data/chef.gemspec +64 -63
- data/distro/common/html/_sources/ctl_chef_client.txt +35 -35
- data/distro/common/html/_sources/ctl_chef_server.txt +341 -341
- data/distro/common/html/_sources/ctl_chef_shell.txt +15 -15
- data/distro/common/html/_sources/ctl_chef_solo.txt +25 -25
- data/distro/common/html/_sources/index.txt +135 -135
- data/distro/common/html/_sources/knife.txt +74 -74
- data/distro/common/html/_sources/knife_bootstrap.txt +56 -56
- data/distro/common/html/_sources/knife_client.txt +150 -150
- data/distro/common/html/_sources/knife_common_options.txt +6 -6
- data/distro/common/html/_sources/knife_configure.txt +29 -29
- data/distro/common/html/_sources/knife_cookbook.txt +236 -236
- data/distro/common/html/_sources/knife_cookbook_site.txt +157 -157
- data/distro/common/html/_sources/knife_data_bag.txt +159 -159
- data/distro/common/html/_sources/knife_delete.txt +26 -26
- data/distro/common/html/_sources/knife_deps.txt +61 -61
- data/distro/common/html/_sources/knife_diff.txt +34 -34
- data/distro/common/html/_sources/knife_download.txt +44 -44
- data/distro/common/html/_sources/knife_edit.txt +26 -26
- data/distro/common/html/_sources/knife_environment.txt +158 -158
- data/distro/common/html/_sources/knife_exec.txt +47 -47
- data/distro/common/html/_sources/knife_index_rebuild.txt +20 -20
- data/distro/common/html/_sources/knife_list.txt +33 -33
- data/distro/common/html/_sources/knife_node.txt +250 -250
- data/distro/common/html/_sources/knife_raw.txt +35 -35
- data/distro/common/html/_sources/knife_recipe_list.txt +23 -23
- data/distro/common/html/_sources/knife_role.txt +157 -157
- data/distro/common/html/_sources/knife_search.txt +53 -53
- data/distro/common/html/_sources/knife_serve.txt +18 -18
- data/distro/common/html/_sources/knife_show.txt +26 -26
- data/distro/common/html/_sources/knife_ssh.txt +43 -43
- data/distro/common/html/_sources/knife_ssl_check.txt +41 -41
- data/distro/common/html/_sources/knife_ssl_fetch.txt +41 -41
- data/distro/common/html/_sources/knife_status.txt +37 -37
- data/distro/common/html/_sources/knife_tag.txt +69 -69
- data/distro/common/html/_sources/knife_upload.txt +49 -49
- data/distro/common/html/_sources/knife_user.txt +127 -127
- data/distro/common/html/_sources/knife_using.txt +43 -43
- data/distro/common/html/_sources/knife_xargs.txt +30 -30
- data/distro/common/html/_static/basic.css +536 -536
- data/distro/common/html/_static/doctools.js +238 -238
- data/distro/common/html/_static/guide.css +504 -504
- data/distro/common/html/_static/pygments.css +61 -61
- data/distro/common/html/_static/searchtools.js +621 -621
- data/distro/common/html/_static/underscore.js +31 -31
- data/distro/common/html/_static/websupport.js +808 -808
- data/distro/common/html/ctl_chef_client.html +269 -269
- data/distro/common/html/ctl_chef_server.html +727 -727
- data/distro/common/html/ctl_chef_shell.html +162 -162
- data/distro/common/html/ctl_chef_solo.html +193 -193
- data/distro/common/html/index.html +201 -201
- data/distro/common/html/knife.html +169 -169
- data/distro/common/html/knife_bootstrap.html +284 -284
- data/distro/common/html/knife_client.html +284 -284
- data/distro/common/html/knife_common_options.html +95 -95
- data/distro/common/html/knife_configure.html +104 -104
- data/distro/common/html/knife_cookbook.html +486 -486
- data/distro/common/html/knife_cookbook_site.html +375 -375
- data/distro/common/html/knife_data_bag.html +373 -373
- data/distro/common/html/knife_delete.html +92 -92
- data/distro/common/html/knife_deps.html +142 -142
- data/distro/common/html/knife_diff.html +122 -122
- data/distro/common/html/knife_download.html +144 -144
- data/distro/common/html/knife_edit.html +88 -88
- data/distro/common/html/knife_environment.html +325 -325
- data/distro/common/html/knife_exec.html +219 -219
- data/distro/common/html/knife_index_rebuild.html +82 -82
- data/distro/common/html/knife_list.html +113 -113
- data/distro/common/html/knife_node.html +457 -457
- data/distro/common/html/knife_raw.html +109 -109
- data/distro/common/html/knife_recipe_list.html +90 -90
- data/distro/common/html/knife_role.html +294 -294
- data/distro/common/html/knife_search.html +202 -202
- data/distro/common/html/knife_serve.html +78 -78
- data/distro/common/html/knife_show.html +103 -103
- data/distro/common/html/knife_ssh.html +176 -176
- data/distro/common/html/knife_ssl_check.html +150 -150
- data/distro/common/html/knife_ssl_fetch.html +150 -150
- data/distro/common/html/knife_status.html +143 -143
- data/distro/common/html/knife_tag.html +137 -137
- data/distro/common/html/knife_upload.html +152 -152
- data/distro/common/html/knife_user.html +241 -241
- data/distro/common/html/knife_using.html +209 -209
- data/distro/common/html/knife_xargs.html +121 -121
- data/distro/common/html/search.html +81 -81
- data/distro/common/man/man1/README.md +58 -58
- data/distro/common/man/man1/chef-shell.1 +194 -194
- data/distro/common/man/man1/knife-bootstrap.1 +215 -215
- data/distro/common/man/man1/knife-client.1 +443 -443
- data/distro/common/man/man1/knife-configure.1 +161 -161
- data/distro/common/man/man1/knife-cookbook-site.1 +552 -552
- data/distro/common/man/man1/knife-cookbook.1 +770 -770
- data/distro/common/man/man1/knife-data-bag.1 +617 -617
- data/distro/common/man/man1/knife-delete.1 +127 -127
- data/distro/common/man/man1/knife-deps.1 +246 -246
- data/distro/common/man/man1/knife-diff.1 +226 -226
- data/distro/common/man/man1/knife-download.1 +258 -258
- data/distro/common/man/man1/knife-edit.1 +121 -121
- data/distro/common/man/man1/knife-environment.1 +508 -508
- data/distro/common/man/man1/knife-exec.1 +362 -362
- data/distro/common/man/man1/knife-index-rebuild.1 +63 -63
- data/distro/common/man/man1/knife-list.1 +174 -174
- data/distro/common/man/man1/knife-node.1 +716 -716
- data/distro/common/man/man1/knife-raw.1 +172 -172
- data/distro/common/man/man1/knife-recipe-list.1 +85 -85
- data/distro/common/man/man1/knife-role.1 +426 -426
- data/distro/common/man/man1/knife-search.1 +359 -359
- data/distro/common/man/man1/knife-serve.1 +109 -109
- data/distro/common/man/man1/knife-show.1 +160 -160
- data/distro/common/man/man1/knife-ssh.1 +284 -284
- data/distro/common/man/man1/knife-ssl-check.1 +207 -207
- data/distro/common/man/man1/knife-ssl-fetch.1 +207 -207
- data/distro/common/man/man1/knife-status.1 +234 -234
- data/distro/common/man/man1/knife-tag.1 +189 -189
- data/distro/common/man/man1/knife-upload.1 +280 -280
- data/distro/common/man/man1/knife-user.1 +356 -356
- data/distro/common/man/man1/knife-xargs.1 +189 -189
- data/distro/common/man/man1/knife.1 +332 -332
- data/distro/common/man/man8/chef-apply.8 +86 -86
- data/distro/common/man/man8/chef-client.8 +398 -398
- data/distro/common/man/man8/chef-solo.8 +260 -260
- data/distro/common/markdown/README +3 -3
- data/distro/common/markdown/man1/chef-shell.mkd +195 -195
- data/distro/common/markdown/man1/knife-bootstrap.mkd +141 -141
- data/distro/common/markdown/man1/knife-client.mkd +103 -103
- data/distro/common/markdown/man1/knife-configure.mkd +70 -70
- data/distro/common/markdown/man1/knife-cookbook-site.mkd +123 -123
- data/distro/common/markdown/man1/knife-cookbook.mkd +263 -263
- data/distro/common/markdown/man1/knife-data-bag.mkd +121 -121
- data/distro/common/markdown/man1/knife-environment.mkd +151 -151
- data/distro/common/markdown/man1/knife-exec.mkd +42 -42
- data/distro/common/markdown/man1/knife-index.mkd +30 -30
- data/distro/common/markdown/man1/knife-node.mkd +130 -130
- data/distro/common/markdown/man1/knife-role.mkd +85 -85
- data/distro/common/markdown/man1/knife-search.mkd +180 -180
- data/distro/common/markdown/man1/knife-ssh.mkd +69 -69
- data/distro/common/markdown/man1/knife-status.mkd +36 -36
- data/distro/common/markdown/man1/knife-tag.mkd +39 -39
- data/distro/common/markdown/man1/knife.mkd +213 -213
- data/distro/common/markdown/man8/chef-client.mkd +75 -75
- data/distro/common/markdown/man8/chef-expander.mkd +81 -81
- data/distro/common/markdown/man8/chef-expanderctl.mkd +57 -57
- data/distro/common/markdown/man8/chef-server-webui.mkd +121 -121
- data/distro/common/markdown/man8/chef-server.mkd +120 -120
- data/distro/common/markdown/man8/chef-solo.mkd +107 -107
- data/distro/common/markdown/man8/chef-solr.mkd +89 -89
- data/distro/powershell/chef/chef.psm1 +327 -327
- data/ext/win32-eventlog/Rakefile +53 -53
- data/ext/win32-eventlog/chef-log.man +56 -56
- data/lib-backcompat/chef/chef_fs/file_system/acl_entry.rb +5 -5
- data/lib-backcompat/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +5 -5
- data/lib-backcompat/chef/chef_fs/file_system/chef_server_root_dir.rb +5 -5
- data/lib/chef.rb +35 -35
- data/lib/chef/api_client.rb +233 -233
- data/lib/chef/api_client/registration.rb +192 -192
- data/lib/chef/api_client_v1.rb +325 -325
- data/lib/chef/application.rb +357 -342
- data/lib/chef/application/apply.rb +221 -221
- data/lib/chef/application/client.rb +520 -513
- data/lib/chef/application/knife.rb +208 -208
- data/lib/chef/application/solo.rb +334 -334
- data/lib/chef/application/windows_service.rb +338 -338
- data/lib/chef/application/windows_service_manager.rb +202 -202
- data/lib/chef/applications.rb +4 -4
- data/lib/chef/audit/audit_event_proxy.rb +93 -93
- data/lib/chef/audit/audit_reporter.rb +172 -172
- data/lib/chef/audit/control_group_data.rb +139 -139
- data/lib/chef/audit/logger.rb +36 -36
- data/lib/chef/audit/rspec_formatter.rb +37 -37
- data/lib/chef/audit/runner.rb +196 -196
- data/lib/chef/chef_class.rb +228 -228
- data/lib/chef/chef_fs.rb +59 -59
- data/lib/chef/chef_fs/chef_fs_data_store.rb +871 -871
- data/lib/chef/chef_fs/command_line.rb +285 -285
- data/lib/chef/chef_fs/config.rb +284 -283
- data/lib/chef/chef_fs/data_handler/acl_data_handler.rb +26 -26
- data/lib/chef/chef_fs/data_handler/client_data_handler.rb +39 -39
- data/lib/chef/chef_fs/data_handler/client_key_data_handler.rb +11 -11
- data/lib/chef/chef_fs/data_handler/container_data_handler.rb +35 -35
- data/lib/chef/chef_fs/data_handler/cookbook_data_handler.rb +38 -38
- data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +62 -62
- data/lib/chef/chef_fs/data_handler/data_handler_base.rb +204 -204
- data/lib/chef/chef_fs/data_handler/environment_data_handler.rb +40 -40
- data/lib/chef/chef_fs/data_handler/group_data_handler.rb +55 -55
- data/lib/chef/chef_fs/data_handler/node_data_handler.rb +36 -36
- data/lib/chef/chef_fs/data_handler/organization_data_handler.rb +36 -36
- data/lib/chef/chef_fs/data_handler/organization_invites_data_handler.rb +17 -17
- data/lib/chef/chef_fs/data_handler/organization_members_data_handler.rb +17 -17
- data/lib/chef/chef_fs/data_handler/policy_data_handler.rb +48 -48
- data/lib/chef/chef_fs/data_handler/policy_group_data_handler.rb +33 -33
- data/lib/chef/chef_fs/data_handler/role_data_handler.rb +40 -40
- data/lib/chef/chef_fs/data_handler/user_data_handler.rb +29 -29
- data/lib/chef/chef_fs/file_pattern.rb +301 -301
- data/lib/chef/chef_fs/file_system.rb +429 -429
- data/lib/chef/chef_fs/file_system/already_exists_error.rb +28 -28
- data/lib/chef/chef_fs/file_system/base_fs_dir.rb +47 -47
- data/lib/chef/chef_fs/file_system/base_fs_object.rb +183 -183
- data/lib/chef/chef_fs/file_system/chef_server/acl_dir.rb +65 -65
- data/lib/chef/chef_fs/file_system/chef_server/acl_entry.rb +60 -60
- data/lib/chef/chef_fs/file_system/chef_server/acls_dir.rb +75 -75
- data/lib/chef/chef_fs/file_system/chef_server/chef_server_root_dir.rb +196 -196
- data/lib/chef/chef_fs/file_system/chef_server/cookbook_artifact_dir.rb +38 -38
- data/lib/chef/chef_fs/file_system/chef_server/cookbook_artifacts_dir.rb +102 -102
- data/lib/chef/chef_fs/file_system/chef_server/cookbook_dir.rb +222 -222
- data/lib/chef/chef_fs/file_system/chef_server/cookbook_file.rb +84 -84
- data/lib/chef/chef_fs/file_system/chef_server/cookbook_subdir.rb +61 -61
- data/lib/chef/chef_fs/file_system/chef_server/cookbooks_acl_dir.rb +42 -42
- data/lib/chef/chef_fs/file_system/chef_server/cookbooks_dir.rb +102 -102
- data/lib/chef/chef_fs/file_system/chef_server/data_bag_dir.rb +71 -71
- data/lib/chef/chef_fs/file_system/chef_server/data_bags_dir.rb +69 -69
- data/lib/chef/chef_fs/file_system/chef_server/environments_dir.rb +57 -57
- data/lib/chef/chef_fs/file_system/chef_server/nodes_dir.rb +53 -53
- data/lib/chef/chef_fs/file_system/chef_server/org_entry.rb +31 -31
- data/lib/chef/chef_fs/file_system/chef_server/organization_invites_entry.rb +61 -61
- data/lib/chef/chef_fs/file_system/chef_server/organization_members_entry.rb +60 -60
- data/lib/chef/chef_fs/file_system/chef_server/policies_acl_dir.rb +41 -41
- data/lib/chef/chef_fs/file_system/chef_server/policies_dir.rb +160 -160
- data/lib/chef/chef_fs/file_system/chef_server/policy_group_entry.rb +137 -137
- data/lib/chef/chef_fs/file_system/chef_server/policy_groups_dir.rb +43 -43
- data/lib/chef/chef_fs/file_system/chef_server/policy_revision_entry.rb +34 -34
- data/lib/chef/chef_fs/file_system/chef_server/rest_list_dir.rb +178 -178
- data/lib/chef/chef_fs/file_system/chef_server/rest_list_entry.rb +187 -187
- data/lib/chef/chef_fs/file_system/chef_server/versioned_cookbook_dir.rb +45 -45
- data/lib/chef/chef_fs/file_system/chef_server/versioned_cookbooks_dir.rb +107 -107
- data/lib/chef/chef_fs/file_system/cookbook_frozen_error.rb +28 -28
- data/lib/chef/chef_fs/file_system/default_environment_cannot_be_modified_error.rb +32 -32
- data/lib/chef/chef_fs/file_system/file_system_error.rb +44 -44
- data/lib/chef/chef_fs/file_system/memory/memory_dir.rb +53 -53
- data/lib/chef/chef_fs/file_system/memory/memory_file.rb +20 -20
- data/lib/chef/chef_fs/file_system/memory/memory_root.rb +23 -23
- data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +64 -64
- data/lib/chef/chef_fs/file_system/must_delete_recursively_error.rb +28 -28
- data/lib/chef/chef_fs/file_system/nonexistent_fs_object.rb +36 -36
- data/lib/chef/chef_fs/file_system/not_found_error.rb +28 -28
- data/lib/chef/chef_fs/file_system/operation_failed_error.rb +42 -42
- data/lib/chef/chef_fs/file_system/operation_not_allowed_error.rb +46 -46
- data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_acls_dir.rb +39 -39
- data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_client_keys_dir.rb +38 -38
- data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_artifact_dir.rb +41 -41
- data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_dir.rb +146 -146
- data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_entry.rb +176 -176
- data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_entry.rb +83 -83
- data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_policies_dir.rb +38 -38
- data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_root_dir.rb +214 -214
- data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_versioned_cookbook_dir.rb +42 -42
- data/lib/chef/chef_fs/file_system/repository/cookbook_artifacts_dir.rb +36 -36
- data/lib/chef/chef_fs/file_system/repository/cookbooks_dir.rb +52 -52
- data/lib/chef/chef_fs/file_system/repository/data_bag.rb +39 -39
- data/lib/chef/chef_fs/file_system/repository/data_bag_item.rb +114 -114
- data/lib/chef/chef_fs/file_system/repository/data_bags_dir.rb +39 -39
- data/lib/chef/chef_fs/file_system/repository/directory.rb +139 -139
- data/lib/chef/chef_fs/file_system/repository/file_system_entry.rb +117 -117
- data/lib/chef/chef_fs/file_system/repository/file_system_root_dir.rb +33 -33
- data/lib/chef/chef_fs/file_system/repository/versioned_cookbooks_dir.rb +34 -34
- data/lib/chef/chef_fs/knife.rb +161 -161
- data/lib/chef/chef_fs/parallelizer.rb +105 -105
- data/lib/chef/chef_fs/parallelizer/flatten_enumerable.rb +35 -35
- data/lib/chef/chef_fs/parallelizer/parallel_enumerable.rb +281 -281
- data/lib/chef/chef_fs/path_utils.rb +127 -127
- data/lib/chef/client.rb +966 -967
- data/lib/chef/config.rb +85 -85
- data/lib/chef/config_fetcher.rb +72 -72
- data/lib/chef/constants.rb +28 -28
- data/lib/chef/cookbook/chefignore.rb +74 -74
- data/lib/chef/cookbook/cookbook_collection.rb +63 -63
- data/lib/chef/cookbook/cookbook_version_loader.rb +352 -352
- data/lib/chef/cookbook/file_system_file_vendor.rb +59 -59
- data/lib/chef/cookbook/file_vendor.rb +71 -71
- data/lib/chef/cookbook/gem_installer.rb +83 -118
- data/lib/chef/cookbook/metadata.rb +904 -904
- data/lib/chef/cookbook/remote_file_vendor.rb +87 -87
- data/lib/chef/cookbook/synchronizer.rb +298 -298
- data/lib/chef/cookbook/syntax_check.rb +260 -260
- data/lib/chef/cookbook_loader.rb +200 -200
- data/lib/chef/cookbook_manifest.rb +290 -290
- data/lib/chef/cookbook_site_streaming_uploader.rb +243 -244
- data/lib/chef/cookbook_uploader.rb +157 -157
- data/lib/chef/cookbook_version.rb +637 -631
- data/lib/chef/daemon.rb +131 -131
- data/lib/chef/data_bag.rb +176 -176
- data/lib/chef/data_bag_item.rb +218 -218
- data/lib/chef/delayed_evaluator.rb +21 -21
- data/lib/chef/deprecation/mixin/template.rb +48 -48
- data/lib/chef/deprecation/provider/cookbook_file.rb +54 -54
- data/lib/chef/deprecation/provider/file.rb +198 -198
- data/lib/chef/deprecation/provider/remote_directory.rb +52 -52
- data/lib/chef/deprecation/provider/remote_file.rb +85 -85
- data/lib/chef/deprecation/provider/template.rb +63 -63
- data/lib/chef/deprecation/warnings.rb +37 -38
- data/lib/chef/digester.rb +74 -74
- data/lib/chef/dsl.rb +6 -6
- data/lib/chef/dsl/audit.rb +51 -51
- data/lib/chef/dsl/chef_provisioning.rb +57 -57
- data/lib/chef/dsl/cheffish.rb +64 -64
- data/lib/chef/dsl/core.rb +42 -0
- data/lib/chef/dsl/data_query.rb +89 -89
- data/lib/chef/dsl/declare_resource.rb +106 -108
- data/lib/chef/dsl/definitions.rb +43 -43
- data/lib/chef/dsl/include_attribute.rb +61 -61
- data/lib/chef/dsl/include_recipe.rb +44 -44
- data/lib/chef/dsl/method_missing.rb +75 -0
- data/lib/chef/dsl/platform_introspection.rb +254 -254
- data/lib/chef/dsl/powershell.rb +29 -29
- data/lib/chef/dsl/reboot_pending.rb +64 -64
- data/lib/chef/dsl/recipe.rb +89 -134
- data/lib/chef/dsl/registry_helper.rb +63 -63
- data/lib/chef/dsl/resources.rb +58 -58
- data/lib/chef/encrypted_data_bag_item.rb +155 -155
- data/lib/chef/encrypted_data_bag_item/assertions.rb +54 -54
- data/lib/chef/encrypted_data_bag_item/check_encrypted.rb +56 -56
- data/lib/chef/encrypted_data_bag_item/decryption_failure.rb +22 -22
- data/lib/chef/encrypted_data_bag_item/decryptor.rb +227 -227
- data/lib/chef/encrypted_data_bag_item/encrypted_data_bag_item_assertions.rb +37 -37
- data/lib/chef/encrypted_data_bag_item/encryption_failure.rb +22 -22
- data/lib/chef/encrypted_data_bag_item/encryptor.rb +225 -225
- data/lib/chef/encrypted_data_bag_item/unacceptable_encrypted_data_bag_item_format.rb +22 -22
- data/lib/chef/encrypted_data_bag_item/unsupported_cipher.rb +22 -22
- data/lib/chef/encrypted_data_bag_item/unsupported_encrypted_data_bag_item_format.rb +22 -22
- data/lib/chef/environment.rb +326 -326
- data/lib/chef/event_dispatch/base.rb +426 -420
- data/lib/chef/event_dispatch/dispatcher.rb +62 -62
- data/lib/chef/event_dispatch/dsl.rb +65 -65
- data/lib/chef/event_dispatch/events_output_stream.rb +37 -37
- data/lib/chef/event_loggers/base.rb +62 -62
- data/lib/chef/event_loggers/windows_eventlog.rb +101 -101
- data/lib/chef/exceptions.rb +504 -504
- data/lib/chef/file_access_control.rb +75 -75
- data/lib/chef/file_access_control/unix.rb +290 -290
- data/lib/chef/file_access_control/windows.rb +335 -335
- data/lib/chef/file_cache.rb +221 -221
- data/lib/chef/file_content_management/content_base.rb +56 -56
- data/lib/chef/file_content_management/deploy.rb +37 -37
- data/lib/chef/file_content_management/deploy/cp.rb +48 -48
- data/lib/chef/file_content_management/deploy/mv_unix.rb +76 -76
- data/lib/chef/file_content_management/deploy/mv_windows.rb +103 -103
- data/lib/chef/file_content_management/tempfile.rb +97 -97
- data/lib/chef/formatters/base.rb +237 -237
- data/lib/chef/formatters/doc.rb +438 -422
- data/lib/chef/formatters/{error_descriptor.rb → error_description.rb} +69 -67
- data/lib/chef/formatters/error_inspectors.rb +19 -19
- data/lib/chef/formatters/error_inspectors/api_error_formatting.rb +184 -184
- data/lib/chef/formatters/error_inspectors/compile_error_inspector.rb +154 -154
- data/lib/chef/formatters/error_inspectors/cookbook_resolve_error_inspector.rb +168 -168
- data/lib/chef/formatters/error_inspectors/cookbook_sync_error_inspector.rb +82 -82
- data/lib/chef/formatters/error_inspectors/node_load_error_inspector.rb +128 -128
- data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +147 -147
- data/lib/chef/formatters/error_inspectors/resource_failure_inspector.rb +124 -124
- data/lib/chef/formatters/error_inspectors/run_list_expansion_error_inspector.rb +121 -121
- data/lib/chef/formatters/error_mapper.rb +85 -85
- data/lib/chef/formatters/indentable_output_stream.rb +170 -170
- data/lib/chef/formatters/minimal.rb +233 -233
- data/lib/chef/guard_interpreter.rb +32 -32
- data/lib/chef/guard_interpreter/default_guard_interpreter.rb +43 -43
- data/lib/chef/guard_interpreter/resource_guard_interpreter.rb +138 -138
- data/lib/chef/handler.rb +235 -235
- data/lib/chef/handler/error_report.rb +33 -33
- data/lib/chef/handler/json_file.rb +63 -63
- data/lib/chef/http.rb +460 -430
- data/lib/chef/http/auth_credentials.rb +57 -57
- data/lib/chef/http/authenticator.rb +106 -106
- data/lib/chef/http/basic_client.rb +149 -169
- data/lib/chef/http/cookie_jar.rb +31 -31
- data/lib/chef/http/cookie_manager.rb +59 -59
- data/lib/chef/http/decompressor.rb +142 -142
- data/lib/chef/http/http_request.rb +186 -186
- data/lib/chef/http/json_input.rb +73 -73
- data/lib/chef/http/json_output.rb +78 -78
- data/lib/chef/http/json_to_model_output.rb +34 -34
- data/lib/chef/http/remote_request_id.rb +46 -46
- data/lib/chef/http/simple.rb +40 -40
- data/lib/chef/http/simple_json.rb +43 -43
- data/lib/chef/http/socketless_chef_zero_client.rb +208 -207
- data/lib/chef/http/ssl_policies.rb +130 -130
- data/lib/chef/http/validate_content_length.rb +114 -115
- data/lib/chef/json_compat.rb +164 -164
- data/lib/chef/key.rb +273 -273
- data/lib/chef/knife.rb +587 -587
- data/lib/chef/knife/bootstrap.rb +480 -480
- data/lib/chef/knife/bootstrap/chef_vault_handler.rb +159 -159
- data/lib/chef/knife/bootstrap/client_builder.rb +208 -208
- data/lib/chef/knife/bootstrap/templates/README.md +11 -11
- data/lib/chef/knife/bootstrap/templates/chef-full.erb +236 -236
- data/lib/chef/knife/client_bulk_delete.rb +104 -104
- data/lib/chef/knife/client_create.rb +111 -111
- data/lib/chef/knife/client_delete.rb +60 -60
- data/lib/chef/knife/client_edit.rb +53 -53
- data/lib/chef/knife/client_key_create.rb +67 -67
- data/lib/chef/knife/client_key_delete.rb +76 -76
- data/lib/chef/knife/client_key_edit.rb +79 -79
- data/lib/chef/knife/client_key_list.rb +69 -69
- data/lib/chef/knife/client_key_show.rb +76 -76
- data/lib/chef/knife/client_list.rb +42 -42
- data/lib/chef/knife/client_reregister.rb +59 -59
- data/lib/chef/knife/client_show.rb +49 -49
- data/lib/chef/knife/configure.rb +171 -171
- data/lib/chef/knife/configure_client.rb +50 -50
- data/lib/chef/knife/cookbook_bulk_delete.rb +71 -71
- data/lib/chef/knife/cookbook_create.rb +458 -448
- data/lib/chef/knife/cookbook_delete.rb +151 -151
- data/lib/chef/knife/cookbook_download.rb +143 -143
- data/lib/chef/knife/cookbook_list.rb +47 -47
- data/lib/chef/knife/cookbook_metadata.rb +107 -108
- data/lib/chef/knife/cookbook_metadata_from_file.rb +44 -44
- data/lib/chef/knife/cookbook_show.rb +98 -98
- data/lib/chef/knife/cookbook_site_download.rb +109 -109
- data/lib/chef/knife/cookbook_site_install.rb +192 -192
- data/lib/chef/knife/cookbook_site_list.rb +58 -58
- data/lib/chef/knife/cookbook_site_search.rb +46 -46
- data/lib/chef/knife/cookbook_site_share.rb +169 -169
- data/lib/chef/knife/cookbook_site_show.rb +55 -55
- data/lib/chef/knife/cookbook_site_unshare.rb +56 -56
- data/lib/chef/knife/cookbook_site_vendor.rb +46 -46
- data/lib/chef/knife/cookbook_test.rb +95 -95
- data/lib/chef/knife/cookbook_upload.rb +308 -308
- data/lib/chef/knife/core/bootstrap_context.rb +233 -233
- data/lib/chef/knife/core/cookbook_scm_repo.rb +159 -159
- data/lib/chef/knife/core/custom_manifest_loader.rb +69 -69
- data/lib/chef/knife/core/gem_glob_loader.rb +138 -138
- data/lib/chef/knife/core/generic_presenter.rb +222 -222
- data/lib/chef/knife/core/hashed_command_loader.rb +99 -99
- data/lib/chef/knife/core/node_editor.rb +130 -130
- data/lib/chef/knife/core/node_presenter.rb +159 -159
- data/lib/chef/knife/core/object_loader.rb +115 -115
- data/lib/chef/knife/core/status_presenter.rb +157 -157
- data/lib/chef/knife/core/subcommand_loader.rb +212 -212
- data/lib/chef/knife/core/text_formatter.rb +85 -85
- data/lib/chef/knife/core/ui.rb +284 -284
- data/lib/chef/knife/data_bag_create.rb +78 -78
- data/lib/chef/knife/data_bag_delete.rb +49 -49
- data/lib/chef/knife/data_bag_edit.rb +74 -74
- data/lib/chef/knife/data_bag_from_file.rb +114 -114
- data/lib/chef/knife/data_bag_list.rb +42 -42
- data/lib/chef/knife/data_bag_secret_options.rb +142 -142
- data/lib/chef/knife/data_bag_show.rb +69 -69
- data/lib/chef/knife/delete.rb +107 -107
- data/lib/chef/knife/deps.rb +140 -140
- data/lib/chef/knife/diff.rb +68 -68
- data/lib/chef/knife/download.rb +68 -68
- data/lib/chef/knife/edit.rb +72 -72
- data/lib/chef/knife/environment_compare.rb +127 -127
- data/lib/chef/knife/environment_create.rb +53 -53
- data/lib/chef/knife/environment_delete.rb +45 -45
- data/lib/chef/knife/environment_edit.rb +45 -45
- data/lib/chef/knife/environment_from_file.rb +82 -82
- data/lib/chef/knife/environment_list.rb +42 -42
- data/lib/chef/knife/environment_show.rb +48 -48
- data/lib/chef/knife/exec.rb +87 -87
- data/lib/chef/knife/help.rb +101 -101
- data/lib/chef/knife/help_topics.rb +4 -4
- data/lib/chef/knife/index_rebuild.rb +133 -133
- data/lib/chef/knife/key_create.rb +112 -112
- data/lib/chef/knife/key_create_base.rb +50 -50
- data/lib/chef/knife/key_delete.rb +55 -55
- data/lib/chef/knife/key_edit.rb +118 -118
- data/lib/chef/knife/key_edit_base.rb +55 -55
- data/lib/chef/knife/key_list.rb +88 -88
- data/lib/chef/knife/key_list_base.rb +45 -45
- data/lib/chef/knife/key_show.rb +53 -53
- data/lib/chef/knife/list.rb +157 -157
- data/lib/chef/knife/node_bulk_delete.rb +74 -74
- data/lib/chef/knife/node_create.rb +47 -47
- data/lib/chef/knife/node_delete.rb +46 -46
- data/lib/chef/knife/node_edit.rb +70 -70
- data/lib/chef/knife/node_environment_set.rb +54 -54
- data/lib/chef/knife/node_from_file.rb +51 -51
- data/lib/chef/knife/node_list.rb +44 -44
- data/lib/chef/knife/node_run_list_add.rb +104 -104
- data/lib/chef/knife/node_run_list_remove.rb +67 -67
- data/lib/chef/knife/node_run_list_set.rb +66 -66
- data/lib/chef/knife/node_show.rb +66 -66
- data/lib/chef/knife/null.rb +10 -10
- data/lib/chef/knife/osc_user_create.rb +97 -97
- data/lib/chef/knife/osc_user_delete.rb +51 -51
- data/lib/chef/knife/osc_user_edit.rb +58 -58
- data/lib/chef/knife/osc_user_list.rb +47 -47
- data/lib/chef/knife/osc_user_reregister.rb +64 -64
- data/lib/chef/knife/osc_user_show.rb +54 -54
- data/lib/chef/knife/raw.rb +103 -103
- data/lib/chef/knife/recipe_list.rb +32 -32
- data/lib/chef/knife/rehash.rb +65 -65
- data/lib/chef/knife/role_bulk_delete.rb +65 -65
- data/lib/chef/knife/role_create.rb +53 -53
- data/lib/chef/knife/role_delete.rb +46 -46
- data/lib/chef/knife/role_edit.rb +45 -45
- data/lib/chef/knife/role_env_run_list_add.rb +86 -86
- data/lib/chef/knife/role_env_run_list_clear.rb +55 -55
- data/lib/chef/knife/role_env_run_list_remove.rb +57 -57
- data/lib/chef/knife/role_env_run_list_replace.rb +59 -59
- data/lib/chef/knife/role_env_run_list_set.rb +70 -70
- data/lib/chef/knife/role_from_file.rb +51 -51
- data/lib/chef/knife/role_list.rb +42 -42
- data/lib/chef/knife/role_run_list_add.rb +86 -86
- data/lib/chef/knife/role_run_list_clear.rb +55 -55
- data/lib/chef/knife/role_run_list_remove.rb +57 -57
- data/lib/chef/knife/role_run_list_replace.rb +59 -59
- data/lib/chef/knife/role_run_list_set.rb +70 -70
- data/lib/chef/knife/role_show.rb +49 -49
- data/lib/chef/knife/search.rb +201 -201
- data/lib/chef/knife/serve.rb +48 -48
- data/lib/chef/knife/show.rb +56 -56
- data/lib/chef/knife/ssh.rb +582 -572
- data/lib/chef/knife/ssl_check.rb +282 -281
- data/lib/chef/knife/ssl_fetch.rb +157 -157
- data/lib/chef/knife/status.rb +110 -110
- data/lib/chef/knife/tag_create.rb +52 -52
- data/lib/chef/knife/tag_delete.rb +60 -60
- data/lib/chef/knife/tag_list.rb +47 -47
- data/lib/chef/knife/upload.rb +70 -70
- data/lib/chef/knife/user_create.rb +150 -150
- data/lib/chef/knife/user_delete.rb +95 -95
- data/lib/chef/knife/user_edit.rb +81 -81
- data/lib/chef/knife/user_key_create.rb +69 -69
- data/lib/chef/knife/user_key_delete.rb +76 -76
- data/lib/chef/knife/user_key_edit.rb +79 -79
- data/lib/chef/knife/user_key_list.rb +69 -69
- data/lib/chef/knife/user_key_show.rb +76 -76
- data/lib/chef/knife/user_list.rb +45 -45
- data/lib/chef/knife/user_reregister.rb +89 -89
- data/lib/chef/knife/user_show.rb +78 -78
- data/lib/chef/knife/xargs.rb +266 -266
- data/lib/chef/local_mode.rb +128 -128
- data/lib/chef/log.rb +68 -68
- data/lib/chef/log/syslog.rb +45 -45
- data/lib/chef/log/winevt.rb +99 -99
- data/lib/chef/mash.rb +226 -226
- data/lib/chef/mixin/api_version_request_handling.rb +66 -66
- data/lib/chef/mixin/checksum.rb +32 -32
- data/lib/chef/mixin/command.rb +193 -193
- data/lib/chef/mixin/command/unix.rb +220 -220
- data/lib/chef/mixin/command/windows.rb +71 -71
- data/lib/chef/mixin/convert_to_class_name.rb +126 -126
- data/lib/chef/mixin/create_path.rb +73 -73
- data/lib/chef/mixin/deep_merge.rb +140 -140
- data/lib/chef/mixin/deprecation.rb +123 -123
- data/lib/chef/mixin/descendants_tracker.rb +81 -81
- data/lib/chef/mixin/enforce_ownership_and_permissions.rb +39 -39
- data/lib/chef/mixin/file_class.rb +35 -35
- data/lib/chef/mixin/from_file.rb +50 -50
- data/lib/chef/mixin/get_source_from_package.rb +47 -47
- data/lib/chef/mixin/homebrew_user.rb +68 -68
- data/lib/chef/mixin/language.rb +48 -48
- data/lib/chef/mixin/language_include_attribute.rb +34 -34
- data/lib/chef/mixin/language_include_recipe.rb +31 -31
- data/lib/chef/mixin/lazy_module_include.rb +77 -0
- data/lib/chef/mixin/params_validate.rb +489 -489
- data/lib/chef/mixin/path_sanity.rb +68 -68
- data/lib/chef/mixin/powershell_out.rb +98 -98
- data/lib/chef/mixin/powershell_type_coercions.rb +84 -84
- data/lib/chef/mixin/properties.rb +303 -303
- data/lib/chef/mixin/provides.rb +28 -28
- data/lib/chef/mixin/proxified_socket.rb +42 -38
- data/lib/chef/mixin/recipe_definition_dsl_core.rb +35 -35
- data/lib/chef/mixin/securable.rb +196 -196
- data/lib/chef/mixin/shell_out.rb +117 -117
- data/lib/chef/mixin/subclass_directive.rb +37 -37
- data/lib/chef/mixin/template.rb +262 -262
- data/lib/chef/mixin/unformatter.rb +32 -32
- data/lib/chef/mixin/uris.rb +43 -43
- data/lib/chef/mixin/which.rb +37 -37
- data/lib/chef/mixin/why_run.rb +331 -331
- data/lib/chef/mixin/wide_string.rb +72 -72
- data/lib/chef/mixin/windows_architecture_helper.rb +114 -114
- data/lib/chef/mixin/windows_env_helper.rb +67 -67
- data/lib/chef/mixin/xml_escape.rb +140 -140
- data/lib/chef/mixins.rb +13 -13
- data/lib/chef/monkey_patches/net-ssh-multi.rb +141 -140
- data/lib/chef/monkey_patches/net_http.rb +60 -60
- data/lib/chef/monkey_patches/webrick-utils.rb +51 -51
- data/lib/chef/monkey_patches/win32/registry.rb +75 -72
- data/lib/chef/monologger.rb +88 -88
- data/lib/chef/nil_argument.rb +3 -3
- data/lib/chef/node.rb +700 -700
- data/lib/chef/node/attribute.rb +586 -586
- data/lib/chef/node/attribute_collections.rb +323 -323
- data/lib/chef/node/immutable_collections.rb +219 -219
- data/lib/chef/node_map.rb +222 -222
- data/lib/chef/null_logger.rb +72 -72
- data/lib/chef/org.rb +149 -149
- data/lib/chef/platform.rb +30 -30
- data/lib/chef/platform/handler_map.rb +40 -40
- data/lib/chef/platform/priority_map.rb +41 -41
- data/lib/chef/platform/provider_handler_map.rb +29 -29
- data/lib/chef/platform/provider_mapping.rb +214 -214
- data/lib/chef/platform/provider_priority_map.rb +11 -11
- data/lib/chef/platform/query_helpers.rb +112 -112
- data/lib/chef/platform/rebooter.rb +54 -54
- data/lib/chef/platform/resource_handler_map.rb +29 -29
- data/lib/chef/platform/resource_priority_map.rb +11 -11
- data/lib/chef/platform/service_helpers.rb +122 -122
- data/lib/chef/policy_builder.rb +42 -42
- data/lib/chef/policy_builder/dynamic.rb +185 -185
- data/lib/chef/policy_builder/expand_node_object.rb +278 -278
- data/lib/chef/policy_builder/policyfile.rb +523 -527
- data/lib/chef/property.rb +674 -673
- data/lib/chef/provider.rb +458 -461
- data/lib/chef/provider/apt_repository.rb +255 -0
- data/lib/chef/provider/apt_update.rb +80 -79
- data/lib/chef/provider/batch.rb +45 -45
- data/lib/chef/provider/breakpoint.rb +38 -38
- data/lib/chef/provider/cookbook_file.rb +53 -53
- data/lib/chef/provider/cookbook_file/content.rb +49 -49
- data/lib/chef/provider/cron.rb +263 -263
- data/lib/chef/provider/cron/aix.rb +50 -50
- data/lib/chef/provider/cron/solaris.rb +22 -22
- data/lib/chef/provider/cron/unix.rb +83 -83
- data/lib/chef/provider/deploy.rb +476 -476
- data/lib/chef/provider/deploy/revision.rb +109 -109
- data/lib/chef/provider/deploy/timestamped.rb +34 -34
- data/lib/chef/provider/directory.rb +152 -152
- data/lib/chef/provider/dsc_resource.rb +197 -197
- data/lib/chef/provider/dsc_script.rb +185 -185
- data/lib/chef/provider/env.rb +169 -169
- data/lib/chef/provider/env/windows.rb +72 -72
- data/lib/chef/provider/erl_call.rb +108 -108
- data/lib/chef/provider/execute.rb +125 -125
- data/lib/chef/provider/file.rb +495 -495
- data/lib/chef/provider/file/content.rb +39 -39
- data/lib/chef/provider/git.rb +332 -332
- data/lib/chef/provider/group.rb +183 -183
- data/lib/chef/provider/group/aix.rb +86 -86
- data/lib/chef/provider/group/dscl.rb +170 -170
- data/lib/chef/provider/group/gpasswd.rb +58 -58
- data/lib/chef/provider/group/groupadd.rb +137 -137
- data/lib/chef/provider/group/groupmod.rb +128 -128
- data/lib/chef/provider/group/pw.rb +140 -140
- data/lib/chef/provider/group/suse.rb +64 -62
- data/lib/chef/provider/group/usermod.rb +91 -91
- data/lib/chef/provider/group/windows.rb +98 -98
- data/lib/chef/provider/http_request.rb +122 -122
- data/lib/chef/provider/ifconfig.rb +226 -226
- data/lib/chef/provider/ifconfig/aix.rb +99 -99
- data/lib/chef/provider/ifconfig/debian.rb +84 -84
- data/lib/chef/provider/ifconfig/redhat.rb +48 -48
- data/lib/chef/provider/launchd.rb +208 -208
- data/lib/chef/provider/link.rb +159 -159
- data/lib/chef/provider/log.rb +57 -57
- data/lib/chef/provider/lwrp_base.rb +99 -99
- data/lib/chef/provider/mdadm.rb +92 -92
- data/lib/chef/provider/mount.rb +169 -173
- data/lib/chef/provider/mount/aix.rb +180 -180
- data/lib/chef/provider/mount/mount.rb +270 -270
- data/lib/chef/provider/mount/solaris.rb +271 -271
- data/lib/chef/provider/mount/windows.rb +92 -86
- data/lib/chef/provider/noop.rb +37 -0
- data/lib/chef/provider/ohai.rb +49 -49
- data/lib/chef/provider/osx_profile.rb +256 -256
- data/lib/chef/provider/package.rb +565 -565
- data/lib/chef/provider/package/aix.rb +136 -136
- data/lib/chef/provider/package/apt.rb +185 -185
- data/lib/chef/provider/package/chocolatey.rb +275 -275
- data/lib/chef/provider/package/dpkg.rb +226 -226
- data/lib/chef/provider/package/easy_install.rb +133 -133
- data/lib/chef/provider/package/freebsd/base.rb +89 -89
- data/lib/chef/provider/package/freebsd/pkg.rb +114 -114
- data/lib/chef/provider/package/freebsd/pkgng.rb +78 -78
- data/lib/chef/provider/package/freebsd/port.rb +60 -60
- data/lib/chef/provider/package/homebrew.rb +137 -137
- data/lib/chef/provider/package/ips.rb +91 -91
- data/lib/chef/provider/package/macports.rb +101 -101
- data/lib/chef/provider/package/openbsd.rb +136 -136
- data/lib/chef/provider/package/pacman.rb +104 -104
- data/lib/chef/provider/package/paludis.rb +86 -86
- data/lib/chef/provider/package/portage.rb +140 -140
- data/lib/chef/provider/package/rpm.rb +123 -123
- data/lib/chef/provider/package/rubygems.rb +586 -586
- data/lib/chef/provider/package/smartos.rb +92 -92
- data/lib/chef/provider/package/solaris.rb +138 -138
- data/lib/chef/provider/package/windows.rb +269 -269
- data/lib/chef/provider/package/windows/exe.rb +117 -117
- data/lib/chef/provider/package/windows/msi.rb +93 -93
- data/lib/chef/provider/package/windows/registry_uninstall_entry.rb +89 -89
- data/lib/chef/provider/package/yum-dump.py +307 -307
- data/lib/chef/provider/package/yum.rb +1421 -1421
- data/lib/chef/provider/package/zypper.rb +143 -143
- data/lib/chef/provider/powershell_script.rb +215 -215
- data/lib/chef/provider/reboot.rb +70 -70
- data/lib/chef/provider/registry_key.rb +155 -155
- data/lib/chef/provider/remote_directory.rb +281 -281
- data/lib/chef/provider/remote_file.rb +53 -53
- data/lib/chef/provider/remote_file/cache_control_data.rb +195 -195
- data/lib/chef/provider/remote_file/content.rb +81 -81
- data/lib/chef/provider/remote_file/fetcher.rb +57 -55
- data/lib/chef/provider/remote_file/ftp.rb +172 -183
- data/lib/chef/provider/remote_file/http.rb +135 -117
- data/lib/chef/provider/remote_file/local_file.rb +60 -60
- data/lib/chef/provider/remote_file/network_file.rb +48 -48
- data/lib/chef/provider/remote_file/sftp.rb +105 -0
- data/lib/chef/provider/resource_update.rb +52 -52
- data/lib/chef/provider/route.rb +229 -229
- data/lib/chef/provider/ruby_block.rb +44 -44
- data/lib/chef/provider/script.rb +85 -85
- data/lib/chef/provider/service.rb +259 -250
- data/lib/chef/provider/service/aix.rb +129 -129
- data/lib/chef/provider/service/aixinit.rb +117 -117
- data/lib/chef/provider/service/arch.rb +118 -118
- data/lib/chef/provider/service/debian.rb +182 -182
- data/lib/chef/provider/service/freebsd.rb +195 -195
- data/lib/chef/provider/service/gentoo.rb +71 -71
- data/lib/chef/provider/service/init.rb +94 -94
- data/lib/chef/provider/service/insserv.rb +59 -59
- data/lib/chef/provider/service/invokercd.rb +41 -41
- data/lib/chef/provider/service/macosx.rb +250 -250
- data/lib/chef/provider/service/openbsd.rb +217 -217
- data/lib/chef/provider/service/redhat.rb +126 -120
- data/lib/chef/provider/service/simple.rb +175 -175
- data/lib/chef/provider/service/solaris.rb +122 -117
- data/lib/chef/provider/service/systemd.rb +188 -155
- data/lib/chef/provider/service/upstart.rb +242 -242
- data/lib/chef/provider/service/windows.rb +313 -313
- data/lib/chef/provider/subversion.rb +233 -221
- data/lib/chef/provider/template.rb +65 -65
- data/lib/chef/provider/template/content.rb +70 -70
- data/lib/chef/provider/template_finder.rb +62 -62
- data/lib/chef/provider/user.rb +211 -211
- data/lib/chef/provider/user/aix.rb +97 -97
- data/lib/chef/provider/user/dscl.rb +710 -710
- data/lib/chef/provider/user/pw.rb +114 -114
- data/lib/chef/provider/user/solaris.rb +121 -121
- data/lib/chef/provider/user/useradd.rb +163 -163
- data/lib/chef/provider/user/windows.rb +128 -128
- data/lib/chef/provider/whyrun_safe_ruby_block.rb +32 -32
- data/lib/chef/provider/windows_script.rb +72 -72
- data/lib/chef/provider_resolver.rb +170 -170
- data/lib/chef/providers.rb +145 -142
- data/lib/chef/recipe.rb +118 -119
- data/lib/chef/request_id.rb +37 -37
- data/lib/chef/reserved_names.rb +9 -9
- data/lib/chef/resource.rb +1581 -1581
- data/lib/chef/resource/action_class.rb +90 -87
- data/lib/chef/resource/apt_package.rb +32 -32
- data/lib/chef/resource/apt_repository.rb +47 -0
- data/lib/chef/resource/apt_update.rb +33 -33
- data/lib/chef/resource/bash.rb +33 -33
- data/lib/chef/resource/batch.rb +33 -33
- data/lib/chef/resource/bff_package.rb +27 -27
- data/lib/chef/resource/breakpoint.rb +32 -32
- data/lib/chef/resource/chef_gem.rb +51 -51
- data/lib/chef/resource/chocolatey_package.rb +39 -39
- data/lib/chef/resource/conditional.rb +127 -127
- data/lib/chef/resource/conditional_action_not_nothing.rb +48 -48
- data/lib/chef/resource/cookbook_file.rb +49 -49
- data/lib/chef/resource/cron.rb +216 -216
- data/lib/chef/resource/csh.rb +33 -33
- data/lib/chef/resource/deploy.rb +443 -443
- data/lib/chef/resource/deploy_revision.rb +31 -31
- data/lib/chef/resource/directory.rb +62 -62
- data/lib/chef/resource/dpkg_package.rb +30 -30
- data/lib/chef/resource/dsc_resource.rb +121 -121
- data/lib/chef/resource/dsc_script.rb +140 -140
- data/lib/chef/resource/easy_install_package.rb +32 -32
- data/lib/chef/resource/env.rb +65 -65
- data/lib/chef/resource/erl_call.rb +85 -85
- data/lib/chef/resource/execute.rb +172 -172
- data/lib/chef/resource/file.rb +83 -83
- data/lib/chef/resource/file/verification.rb +128 -128
- data/lib/chef/resource/freebsd_package.rb +62 -62
- data/lib/chef/resource/gem_package.rb +41 -41
- data/lib/chef/resource/git.rb +44 -44
- data/lib/chef/resource/group.rb +102 -102
- data/lib/chef/resource/homebrew_package.rb +34 -34
- data/lib/chef/resource/http_request.rb +66 -66
- data/lib/chef/resource/ifconfig.rb +147 -147
- data/lib/chef/resource/ips_package.rb +34 -34
- data/lib/chef/resource/ksh.rb +32 -32
- data/lib/chef/resource/launchd.rb +104 -104
- data/lib/chef/resource/link.rb +107 -107
- data/lib/chef/resource/log.rb +76 -76
- data/lib/chef/resource/lwrp_base.rb +124 -124
- data/lib/chef/resource/macosx_service.rb +58 -58
- data/lib/chef/resource/macports_package.rb +27 -27
- data/lib/chef/resource/mdadm.rb +103 -103
- data/lib/chef/resource/mount.rb +187 -187
- data/lib/chef/resource/ohai.rb +53 -53
- data/lib/chef/resource/openbsd_package.rb +35 -35
- data/lib/chef/resource/osx_profile.rb +74 -74
- data/lib/chef/resource/package.rb +47 -47
- data/lib/chef/resource/pacman_package.rb +28 -28
- data/lib/chef/resource/paludis_package.rb +33 -33
- data/lib/chef/resource/perl.rb +32 -32
- data/lib/chef/resource/portage_package.rb +32 -32
- data/lib/chef/resource/powershell_script.rb +50 -50
- data/lib/chef/resource/python.rb +31 -31
- data/lib/chef/resource/reboot.rb +48 -48
- data/lib/chef/resource/registry_key.rb +144 -144
- data/lib/chef/resource/remote_directory.rb +122 -122
- data/lib/chef/resource/remote_file.rb +158 -149
- data/lib/chef/resource/resource_notification.rb +122 -122
- data/lib/chef/resource/route.rb +137 -137
- data/lib/chef/resource/rpm_package.rb +32 -32
- data/lib/chef/resource/ruby.rb +31 -31
- data/lib/chef/resource/ruby_block.rb +53 -53
- data/lib/chef/resource/scm.rb +185 -185
- data/lib/chef/resource/script.rb +74 -74
- data/lib/chef/resource/service.rb +217 -208
- data/lib/chef/resource/smartos_package.rb +29 -29
- data/lib/chef/resource/solaris_package.rb +31 -31
- data/lib/chef/resource/subversion.rb +44 -44
- data/lib/chef/resource/template.rb +215 -215
- data/lib/chef/resource/timestamped_deploy.rb +26 -26
- data/lib/chef/resource/user.rb +160 -160
- data/lib/chef/resource/whyrun_safe_ruby_block.rb +24 -24
- data/lib/chef/resource/windows_package.rb +55 -55
- data/lib/chef/resource/windows_script.rb +65 -65
- data/lib/chef/resource/windows_service.rb +71 -71
- data/lib/chef/resource/yum_package.rb +47 -47
- data/lib/chef/resource/zypper_package.rb +28 -28
- data/lib/chef/resource_builder.rb +151 -151
- data/lib/chef/resource_collection.rb +131 -89
- data/lib/chef/resource_collection/resource_collection_serialization.rb +59 -59
- data/lib/chef/resource_collection/resource_list.rb +90 -90
- data/lib/chef/resource_collection/resource_set.rb +170 -170
- data/lib/chef/resource_collection/stepable_iterator.rb +124 -124
- data/lib/chef/resource_definition.rb +68 -68
- data/lib/chef/resource_definition_list.rb +38 -38
- data/lib/chef/resource_reporter.rb +327 -327
- data/lib/chef/resource_resolver.rb +185 -185
- data/lib/chef/resources.rb +89 -88
- data/lib/chef/rest.rb +209 -209
- data/lib/chef/role.rb +280 -280
- data/lib/chef/run_context.rb +694 -670
- data/lib/chef/run_context/cookbook_compiler.rb +290 -289
- data/lib/chef/run_list.rb +168 -168
- data/lib/chef/run_list/run_list_expansion.rb +234 -234
- data/lib/chef/run_list/run_list_item.rb +98 -98
- data/lib/chef/run_list/versioned_recipe_list.rb +102 -102
- data/lib/chef/run_lock.rb +197 -197
- data/lib/chef/run_status.rb +125 -125
- data/lib/chef/runner.rb +143 -141
- data/lib/chef/sandbox.rb +20 -20
- data/lib/chef/scan_access_control.rb +138 -138
- data/lib/chef/search/query.rb +180 -180
- data/lib/chef/server_api.rb +78 -78
- data/lib/chef/shell.rb +327 -327
- data/lib/chef/shell/ext.rb +593 -593
- data/lib/chef/shell/model_wrapper.rb +120 -120
- data/lib/chef/shell/shell_session.rb +299 -299
- data/lib/chef/shell_out.rb +13 -13
- data/lib/chef/tasks/chef_repo.rake +200 -200
- data/lib/chef/user.rb +199 -199
- data/lib/chef/user_v1.rb +330 -330
- data/lib/chef/util/backup.rb +94 -94
- data/lib/chef/util/diff.rb +184 -184
- data/lib/chef/util/dsc/configuration_generator.rb +139 -139
- data/lib/chef/util/dsc/lcm_output_parser.rb +137 -137
- data/lib/chef/util/dsc/local_configuration_manager.rb +141 -141
- data/lib/chef/util/dsc/resource_info.rb +26 -26
- data/lib/chef/util/dsc/resource_store.rb +109 -109
- data/lib/chef/util/editor.rb +91 -91
- data/lib/chef/util/file_edit.rb +100 -100
- data/lib/chef/util/path_helper.rb +25 -25
- data/lib/chef/util/powershell/cmdlet.rb +170 -170
- data/lib/chef/util/powershell/cmdlet_result.rb +61 -61
- data/lib/chef/util/powershell/ps_credential.rb +41 -41
- data/lib/chef/util/selinux.rb +92 -92
- data/lib/chef/util/threaded_job_queue.rb +61 -61
- data/lib/chef/util/windows.rb +24 -24
- data/lib/chef/util/windows/net_group.rb +84 -84
- data/lib/chef/util/windows/net_use.rb +85 -85
- data/lib/chef/util/windows/net_user.rb +170 -170
- data/lib/chef/util/windows/volume.rb +59 -59
- data/lib/chef/version.rb +34 -34
- data/lib/chef/version/platform.rb +44 -44
- data/lib/chef/version_class.rb +70 -70
- data/lib/chef/version_constraint.rb +118 -118
- data/lib/chef/version_constraint/platform.rb +26 -26
- data/lib/chef/whitelist.rb +86 -86
- data/lib/chef/win32/api.rb +374 -374
- data/lib/chef/win32/api/crypto.rb +63 -63
- data/lib/chef/win32/api/error.rb +953 -953
- data/lib/chef/win32/api/file.rb +625 -625
- data/lib/chef/win32/api/installer.rb +165 -165
- data/lib/chef/win32/api/memory.rb +105 -105
- data/lib/chef/win32/api/net.rb +312 -312
- data/lib/chef/win32/api/process.rb +42 -42
- data/lib/chef/win32/api/psapi.rb +51 -51
- data/lib/chef/win32/api/registry.rb +51 -51
- data/lib/chef/win32/api/security.rb +460 -460
- data/lib/chef/win32/api/synchronization.rb +89 -89
- data/lib/chef/win32/api/system.rb +238 -238
- data/lib/chef/win32/api/unicode.rb +135 -135
- data/lib/chef/win32/crypto.rb +50 -50
- data/lib/chef/win32/error.rb +86 -86
- data/lib/chef/win32/eventlog.rb +31 -31
- data/lib/chef/win32/file.rb +218 -218
- data/lib/chef/win32/file/info.rb +99 -99
- data/lib/chef/win32/file/version_info.rb +93 -93
- data/lib/chef/win32/handle.rb +55 -55
- data/lib/chef/win32/memory.rb +101 -101
- data/lib/chef/win32/mutex.rb +116 -116
- data/lib/chef/win32/net.rb +311 -311
- data/lib/chef/win32/process.rb +97 -97
- data/lib/chef/win32/registry.rb +374 -372
- data/lib/chef/win32/security.rb +665 -665
- data/lib/chef/win32/security/ace.rb +123 -123
- data/lib/chef/win32/security/acl.rb +103 -103
- data/lib/chef/win32/security/securable_object.rb +109 -109
- data/lib/chef/win32/security/security_descriptor.rb +93 -93
- data/lib/chef/win32/security/sid.rb +304 -304
- data/lib/chef/win32/security/token.rb +72 -72
- data/lib/chef/win32/system.rb +62 -62
- data/lib/chef/win32/unicode.rb +60 -60
- data/lib/chef/win32/version.rb +158 -158
- data/lib/chef/workstation_config_loader.rb +23 -23
- data/spec/data/apt/chef-integration-test-1.0/debian/changelog +5 -5
- data/spec/data/apt/chef-integration-test-1.0/debian/compat +1 -1
- data/spec/data/apt/chef-integration-test-1.0/debian/control +13 -13
- data/spec/data/apt/chef-integration-test-1.0/debian/copyright +34 -34
- data/spec/data/apt/chef-integration-test-1.0/debian/files +1 -1
- data/spec/data/apt/chef-integration-test-1.0/debian/rules +13 -13
- data/spec/data/apt/chef-integration-test-1.0/debian/source/format +1 -1
- data/spec/data/apt/chef-integration-test-1.1/debian/changelog +11 -11
- data/spec/data/apt/chef-integration-test-1.1/debian/compat +1 -1
- data/spec/data/apt/chef-integration-test-1.1/debian/control +13 -13
- data/spec/data/apt/chef-integration-test-1.1/debian/copyright +34 -34
- data/spec/data/apt/chef-integration-test-1.1/debian/files +1 -1
- data/spec/data/apt/chef-integration-test-1.1/debian/rules +13 -13
- data/spec/data/apt/chef-integration-test-1.1/debian/source/format +1 -1
- data/spec/data/apt/chef-integration-test2-1.0/debian/changelog +5 -5
- data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2.debhelper.log +45 -45
- data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2.substvars +1 -1
- data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2/DEBIAN/conffiles +1 -1
- data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2/DEBIAN/control +10 -10
- data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2/DEBIAN/md5sums +1 -1
- data/spec/data/apt/chef-integration-test2-1.0/debian/compat +1 -1
- data/spec/data/apt/chef-integration-test2-1.0/debian/conffiles +1 -1
- data/spec/data/apt/chef-integration-test2-1.0/debian/control +13 -13
- data/spec/data/apt/chef-integration-test2-1.0/debian/copyright +34 -34
- data/spec/data/apt/chef-integration-test2-1.0/debian/files +1 -1
- data/spec/data/apt/chef-integration-test2-1.0/debian/rules +13 -13
- data/spec/data/apt/chef-integration-test2-1.0/debian/source/format +1 -1
- data/spec/data/apt/chef-integration-test2_1.0-1.dsc +18 -18
- data/spec/data/apt/chef-integration-test2_1.0-1_amd64.build +91 -91
- data/spec/data/apt/chef-integration-test2_1.0-1_amd64.changes +31 -31
- data/spec/data/apt/chef-integration-test_1.0-1_amd64.changes +22 -22
- data/spec/data/apt/chef-integration-test_1.1-1_amd64.changes +22 -22
- data/spec/data/apt/var/www/apt/conf/distributions +7 -7
- data/spec/data/apt/var/www/apt/conf/incoming +4 -4
- data/spec/data/apt/var/www/apt/conf/pulls +3 -3
- data/spec/data/apt/var/www/apt/db/version +4 -4
- data/spec/data/apt/var/www/apt/dists/sid/Release +19 -19
- data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages +16 -16
- data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Release +5 -5
- data/spec/data/bootstrap/encrypted_data_bag_secret +1 -1
- data/spec/data/bootstrap/no_proxy.erb +2 -2
- data/spec/data/bootstrap/secret.erb +9 -9
- data/spec/data/bootstrap/test-hints.erb +12 -12
- data/spec/data/bootstrap/test.erb +1 -1
- data/spec/data/cb_version_cookbooks/tatft/README.rdoc +2 -2
- data/spec/data/cb_version_cookbooks/tatft/attributes/default.rb +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-600hhz-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ahd2gq-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-api8ux-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-b0r1m1-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-bfygsi-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-el14l6-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ivrl3y-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-kkbs85-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ory1ux-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-pgsq76-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ra8uim-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-t7k1g-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-t8g0sv-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ufy6g3-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-x2d6j9-0 +1 -1
- data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-xi0l6h-0 +1 -1
- data/spec/data/client.d_00/00-foo.rb +2 -2
- data/spec/data/client.d_00/01-bar.rb +1 -1
- data/spec/data/client.d_00/bar +1 -1
- data/spec/data/client.d_01/foo/bar.rb +1 -1
- data/spec/data/client.d_02/foo.rb/foo.txt +1 -1
- data/spec/data/config.rb +6 -6
- data/spec/data/cookbooks/angrybash/metadata.rb +2 -2
- data/spec/data/cookbooks/angrybash/recipes/default.rb +8 -8
- data/spec/data/cookbooks/apache2/files/default/apache2_module_conf_generate.pl +2 -2
- data/spec/data/cookbooks/apache2/metadata.rb +2 -2
- data/spec/data/cookbooks/apache2/recipes/default.rb +2 -2
- data/spec/data/cookbooks/borken/metadata.rb +2 -2
- data/spec/data/cookbooks/borken/recipes/default.rb +1 -1
- data/spec/data/cookbooks/borken/templates/default/borken.erb +1 -1
- data/spec/data/cookbooks/chefignore +8 -8
- data/spec/data/cookbooks/ignorken/files/default/not_me.rb +2 -2
- data/spec/data/cookbooks/ignorken/metadata.rb +2 -2
- data/spec/data/cookbooks/ignorken/recipes/ignoreme.rb +1 -1
- data/spec/data/cookbooks/ignorken/templates/ubuntu-12.10/not_me.rb +2 -2
- data/spec/data/cookbooks/java/files/default/java.response +1 -1
- data/spec/data/cookbooks/java/metadata.rb +2 -2
- data/spec/data/cookbooks/name-mismatch-versionnumber/README.md +4 -4
- data/spec/data/cookbooks/name-mismatch-versionnumber/metadata.rb +8 -8
- data/spec/data/cookbooks/name-mismatch-versionnumber/recipes/default.rb +8 -8
- data/spec/data/cookbooks/openldap/attributes/default.rb +16 -16
- data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
- data/spec/data/cookbooks/openldap/definitions/client.rb +5 -5
- data/spec/data/cookbooks/openldap/definitions/server.rb +5 -5
- data/spec/data/cookbooks/openldap/files/default/.dotfile +1 -1
- data/spec/data/cookbooks/openldap/files/default/remotedir/.a_dotdir/.a_dotfile_in_a_dotdir +1 -1
- data/spec/data/cookbooks/openldap/files/default/remotedir/not_a_template.erb +2 -2
- data/spec/data/cookbooks/openldap/files/default/remotedir/remote_dir_file1.txt +2 -2
- data/spec/data/cookbooks/openldap/files/default/remotedir/remote_dir_file2.txt +2 -2
- data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/.a_dotfile +1 -1
- data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/remote_subdir_file1.txt +2 -2
- data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/remote_subdir_file2.txt +2 -2
- data/spec/data/cookbooks/openldap/files/default/remotedir/subdir_with_no_file_just_a_subsubdir/the_subsubdir/some_file.txt +3 -3
- data/spec/data/cookbooks/openldap/libraries/openldap.rb +4 -4
- data/spec/data/cookbooks/openldap/libraries/openldap/version.rb +3 -3
- data/spec/data/cookbooks/openldap/metadata.rb +8 -8
- data/spec/data/cookbooks/openldap/recipes/default.rb +4 -4
- data/spec/data/cookbooks/openldap/recipes/gigantor.rb +3 -3
- data/spec/data/cookbooks/openldap/recipes/one.rb +15 -15
- data/spec/data/cookbooks/openldap/recipes/return.rb +2 -2
- data/spec/data/cookbooks/openldap/templates/default/helper_test.erb +1 -1
- data/spec/data/cookbooks/openldap/templates/default/helpers.erb +14 -14
- data/spec/data/cookbooks/openldap/templates/default/helpers_via_partial_test.erb +1 -1
- data/spec/data/cookbooks/openldap/templates/default/nested_openldap_partials.erb +1 -1
- data/spec/data/cookbooks/openldap/templates/default/nested_partial.erb +1 -1
- data/spec/data/cookbooks/openldap/templates/default/no_windows_line_endings.erb +4 -4
- data/spec/data/cookbooks/openldap/templates/default/openldap_variable_stuff.conf.erb +1 -1
- data/spec/data/cookbooks/openldap/templates/default/test.erb +1 -1
- data/spec/data/cookbooks/preseed/files/default/preseed-file.seed +1 -1
- data/spec/data/cookbooks/preseed/files/default/preseed-template.seed +4 -4
- data/spec/data/cookbooks/preseed/metadata.rb +2 -2
- data/spec/data/cookbooks/preseed/templates/default/preseed-template-variables.seed +1 -1
- data/spec/data/cookbooks/preseed/templates/default/preseed-template.seed +1 -1
- data/spec/data/cookbooks/supports-platform-constraints/metadata.rb +5 -5
- data/spec/data/definitions/test.rb +4 -4
- data/spec/data/environment-config.rb +4 -4
- data/spec/data/file-providers-method-snapshot-chef-11-4.json +127 -127
- data/spec/data/fileedit/hosts +4 -4
- data/spec/data/incomplete-metadata-chef-repo/incomplete-metadata/README.md +4 -4
- data/spec/data/incomplete-metadata-chef-repo/incomplete-metadata/metadata.rb +13 -13
- data/spec/data/incomplete-metadata-chef-repo/incomplete-metadata/recipes/default.rb +8 -8
- data/spec/data/invalid-metadata-chef-repo/invalid-metadata/README.md +4 -4
- data/spec/data/invalid-metadata-chef-repo/invalid-metadata/metadata.rb +9 -9
- data/spec/data/invalid-metadata-chef-repo/invalid-metadata/recipes/default.rb +8 -8
- data/spec/data/kitchen/chefignore +6 -6
- data/spec/data/kitchen/openldap/attributes/default.rb +3 -3
- data/spec/data/kitchen/openldap/attributes/robinson.rb +2 -2
- data/spec/data/kitchen/openldap/definitions/client.rb +3 -3
- data/spec/data/kitchen/openldap/definitions/drewbarrymore.rb +2 -2
- data/spec/data/kitchen/openldap/recipes/gigantor.rb +2 -2
- data/spec/data/kitchen/openldap/recipes/ignoreme.rb +2 -2
- data/spec/data/kitchen/openldap/recipes/woot.rb +3 -3
- data/spec/data/knife_subcommand/test_explicit_category.rb +6 -6
- data/spec/data/knife_subcommand/test_name_mapping.rb +4 -4
- data/spec/data/knife_subcommand/test_yourself.rb +21 -21
- data/spec/data/lwrp/providers/buck_passer.rb +28 -28
- data/spec/data/lwrp/providers/buck_passer_2.rb +26 -26
- data/spec/data/lwrp/providers/embedded_resource_accesses_providers_scope.rb +28 -28
- data/spec/data/lwrp/providers/inline_compiler.rb +26 -26
- data/spec/data/lwrp/providers/monkey_name_printer.rb +5 -5
- data/spec/data/lwrp/providers/paint_drying_watcher.rb +7 -7
- data/spec/data/lwrp/providers/thumb_twiddler.rb +7 -7
- data/spec/data/lwrp/resources/bar.rb +2 -2
- data/spec/data/lwrp/resources/foo.rb +4 -4
- data/spec/data/lwrp/resources_with_default_attributes/nodeattr.rb +1 -1
- data/spec/data/lwrp_override/providers/buck_passer.rb +5 -5
- data/spec/data/lwrp_override/resources/foo.rb +10 -10
- data/spec/data/mac_users/10.7-8.plist.xml +559 -559
- data/spec/data/mac_users/10.7-8.shadow.xml +11 -11
- data/spec/data/mac_users/10.7.plist.xml +559 -559
- data/spec/data/mac_users/10.7.shadow.xml +11 -11
- data/spec/data/mac_users/10.8.plist.xml +559 -559
- data/spec/data/mac_users/10.8.shadow.xml +21 -21
- data/spec/data/mac_users/10.9.plist.xml +560 -560
- data/spec/data/mac_users/10.9.shadow.xml +21 -21
- data/spec/data/metadata/quick_start/metadata.rb +19 -19
- data/spec/data/nested.json +2 -2
- data/spec/data/nodes/default.rb +15 -15
- data/spec/data/nodes/test.example.com.rb +17 -17
- data/spec/data/nodes/test.rb +15 -15
- data/spec/data/null_config.rb +1 -1
- data/spec/data/object_loader/environments/test.json +7 -7
- data/spec/data/object_loader/environments/test.rb +2 -2
- data/spec/data/object_loader/environments/test_json_class.json +8 -8
- data/spec/data/object_loader/nodes/test.json +7 -7
- data/spec/data/object_loader/nodes/test.rb +2 -2
- data/spec/data/object_loader/nodes/test_json_class.json +8 -8
- data/spec/data/object_loader/roles/test.json +7 -7
- data/spec/data/object_loader/roles/test.rb +2 -2
- data/spec/data/object_loader/roles/test_json_class.json +8 -8
- data/spec/data/partial_one.erb +1 -1
- data/spec/data/recipes/test.rb +7 -7
- data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +4 -4
- data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -1
- data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -2
- data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -2
- data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -1
- data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -1
- data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +3 -3
- data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -1
- data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -2
- data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -2
- data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -1
- data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -1
- data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -2
- data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -2
- data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +3 -3
- data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -1
- data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -2
- data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -1
- data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -1
- data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +3 -3
- data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -1
- data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -2
- data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -1
- data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -1
- data/spec/data/run_context/cookbooks/include/recipes/default.rb +24 -24
- data/spec/data/run_context/cookbooks/include/recipes/includee.rb +3 -3
- data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +3 -3
- data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -1
- data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -1
- data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -1
- data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +3 -3
- data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -1
- data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -2
- data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -2
- data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -1
- data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -1
- data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +3 -3
- data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -1
- data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -1
- data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -3
- data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -1
- data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -1
- data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
- data/spec/data/run_context/cookbooks/test/definitions/new_animals.rb +9 -9
- data/spec/data/run_context/cookbooks/test/definitions/new_cat.rb +5 -5
- data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -1
- data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -1
- data/spec/data/run_context/cookbooks/test/recipes/default.rb +5 -5
- data/spec/data/run_context/cookbooks/test/recipes/one.rb +7 -7
- data/spec/data/run_context/cookbooks/test/recipes/two.rb +7 -7
- data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -1
- data/spec/data/run_context/nodes/run_context.rb +5 -5
- data/spec/data/search_queries_to_transform.txt +98 -98
- data/spec/data/shef-config.rb +10 -10
- data/spec/data/ssl/5e707473.0 +18 -18
- data/spec/data/ssl/chef-rspec.cert +27 -27
- data/spec/data/ssl/chef-rspec.key +27 -27
- data/spec/data/ssl/key.pem +15 -15
- data/spec/data/ssl/private_key.pem +27 -27
- data/spec/data/ssl/private_key_with_whitespace.pem +32 -32
- data/spec/data/standalone_cookbook/chefignore +9 -9
- data/spec/data/standalone_cookbook/recipes/default.rb +2 -2
- data/spec/data/trusted_certs/example.crt +22 -22
- data/spec/data/trusted_certs/intermediate.pem +27 -27
- data/spec/data/trusted_certs/opscode.pem +57 -57
- data/spec/data/trusted_certs/root.pem +22 -22
- data/spec/functional/application_spec.rb +58 -58
- data/spec/functional/assets/chefinittest +34 -34
- data/spec/functional/assets/testchefsubsys +10 -10
- data/spec/functional/audit/rspec_formatter_spec.rb +54 -54
- data/spec/functional/audit/runner_spec.rb +121 -121
- data/spec/functional/dsl/reboot_pending_spec.rb +106 -106
- data/spec/functional/dsl/registry_helper_spec.rb +61 -61
- data/spec/functional/event_loggers/windows_eventlog_spec.rb +101 -101
- data/spec/functional/file_content_management/deploy_strategies_spec.rb +229 -229
- data/spec/functional/http/simple_spec.rb +140 -140
- data/spec/functional/knife/configure_spec.rb +33 -33
- data/spec/functional/knife/cookbook_delete_spec.rb +167 -167
- data/spec/functional/knife/exec_spec.rb +55 -55
- data/spec/functional/knife/rehash_spec.rb +39 -39
- data/spec/functional/knife/smoke_test.rb +42 -42
- data/spec/functional/knife/ssh_spec.rb +284 -284
- data/spec/functional/mixin/powershell_out_spec.rb +43 -43
- data/spec/functional/mixin/shell_out_spec.rb +48 -48
- data/spec/functional/notifications_spec.rb +238 -238
- data/spec/functional/provider/remote_file/cache_control_data_spec.rb +100 -100
- data/spec/functional/provider/whyrun_safe_ruby_block_spec.rb +51 -51
- data/spec/functional/rebooter_spec.rb +105 -105
- data/spec/functional/resource/aix_service_spec.rb +138 -138
- data/spec/functional/resource/aixinit_service_spec.rb +211 -211
- data/spec/functional/resource/base.rb +28 -28
- data/spec/functional/resource/bash_spec.rb +88 -88
- data/spec/functional/resource/batch_spec.rb +30 -30
- data/spec/functional/resource/bff_spec.rb +120 -120
- data/spec/functional/resource/chocolatey_package_spec.rb +130 -130
- data/spec/functional/resource/cookbook_file_spec.rb +81 -81
- data/spec/functional/resource/cron_spec.rb +172 -172
- data/spec/functional/resource/deploy_revision_spec.rb +881 -881
- data/spec/functional/resource/directory_spec.rb +43 -43
- data/spec/functional/resource/dpkg_package_spec.rb +339 -339
- data/spec/functional/resource/dsc_resource_spec.rb +90 -90
- data/spec/functional/resource/dsc_script_spec.rb +479 -479
- data/spec/functional/resource/env_spec.rb +192 -192
- data/spec/functional/resource/execute_spec.rb +154 -154
- data/spec/functional/resource/file_spec.rb +167 -167
- data/spec/functional/resource/git_spec.rb +259 -259
- data/spec/functional/resource/group_spec.rb +461 -461
- data/spec/functional/resource/ifconfig_spec.rb +165 -165
- data/spec/functional/resource/link_spec.rb +613 -613
- data/spec/functional/resource/mount_spec.rb +203 -203
- data/spec/functional/resource/ohai_spec.rb +62 -62
- data/spec/functional/resource/package_spec.rb +386 -386
- data/spec/functional/resource/powershell_script_spec.rb +601 -601
- data/spec/functional/resource/reboot_spec.rb +103 -103
- data/spec/functional/resource/registry_spec.rb +560 -560
- data/spec/functional/resource/remote_directory_spec.rb +220 -220
- data/spec/functional/resource/remote_file_spec.rb +240 -240
- data/spec/functional/resource/rpm_spec.rb +123 -123
- data/spec/functional/resource/template_spec.rb +212 -212
- data/spec/functional/resource/user/dscl_spec.rb +198 -198
- data/spec/functional/resource/user/useradd_spec.rb +692 -692
- data/spec/functional/resource/user/windows_spec.rb +133 -133
- data/spec/functional/resource/windows_package_spec.rb +168 -168
- data/spec/functional/resource/windows_service_spec.rb +102 -102
- data/spec/functional/rest_spec.rb +95 -95
- data/spec/functional/run_lock_spec.rb +466 -466
- data/spec/functional/shell_spec.rb +148 -148
- data/spec/functional/tiny_server_spec.rb +78 -78
- data/spec/functional/util/path_helper_spec.rb +37 -37
- data/spec/functional/util/powershell/cmdlet_spec.rb +111 -111
- data/spec/functional/version_spec.rb +35 -35
- data/spec/functional/win32/crypto_spec.rb +54 -54
- data/spec/functional/win32/registry_spec.rb +623 -623
- data/spec/functional/win32/security_spec.rb +100 -100
- data/spec/functional/win32/service_manager_spec.rb +220 -220
- data/spec/functional/win32/sid_spec.rb +55 -55
- data/spec/functional/win32/version_info_spec.rb +50 -50
- data/spec/functional/win32/versions_spec.rb +117 -117
- data/spec/integration/client/client_spec.rb +500 -500
- data/spec/integration/client/ipv6_spec.rb +134 -134
- data/spec/integration/knife/chef_fs_data_store_spec.rb +556 -556
- data/spec/integration/knife/chef_repo_path_spec.rb +890 -890
- data/spec/integration/knife/chef_repository_file_system_spec.rb +296 -292
- data/spec/integration/knife/chefignore_spec.rb +300 -300
- data/spec/integration/knife/common_options_spec.rb +155 -155
- data/spec/integration/knife/cookbook_api_ipv6_spec.rb +112 -112
- data/spec/integration/knife/delete_spec.rb +1017 -1017
- data/spec/integration/knife/deps_spec.rb +706 -706
- data/spec/integration/knife/diff_spec.rb +602 -602
- data/spec/integration/knife/download_spec.rb +1314 -1314
- data/spec/integration/knife/list_spec.rb +1067 -1067
- data/spec/integration/knife/raw_spec.rb +242 -242
- data/spec/integration/knife/redirection_spec.rb +52 -52
- data/spec/integration/knife/serve_spec.rb +57 -57
- data/spec/integration/knife/show_spec.rb +167 -167
- data/spec/integration/knife/upload_spec.rb +1529 -1529
- data/spec/integration/recipes/lwrp_inline_resources_spec.rb +175 -148
- data/spec/integration/recipes/lwrp_spec.rb +53 -53
- data/spec/integration/recipes/noop_resource_spec.rb +24 -0
- data/spec/integration/recipes/notifies_spec.rb +334 -0
- data/spec/integration/recipes/provider_choice.rb +37 -37
- data/spec/integration/recipes/recipe_dsl_spec.rb +1519 -1519
- data/spec/integration/recipes/remote_directory.rb +74 -74
- data/spec/integration/recipes/resource_action_spec.rb +569 -569
- data/spec/integration/recipes/resource_converge_if_changed_spec.rb +496 -496
- data/spec/integration/recipes/resource_load_spec.rb +208 -208
- data/spec/integration/solo/solo_spec.rb +176 -176
- data/spec/rcov.opts +2 -2
- data/spec/scripts/ssl-serve.rb +47 -47
- data/spec/spec_helper.rb +248 -248
- data/spec/stress/win32/file_spec.rb +37 -37
- data/spec/stress/win32/memory_spec.rb +22 -22
- data/spec/stress/win32/security_spec.rb +69 -69
- data/spec/support/chef_helpers.rb +95 -95
- data/spec/support/key_helpers.rb +104 -104
- data/spec/support/lib/chef/provider/easy.rb +35 -35
- data/spec/support/lib/chef/provider/openldap_includer.rb +29 -29
- data/spec/support/lib/chef/provider/snakeoil.rb +41 -41
- data/spec/support/lib/chef/resource/cat.rb +38 -38
- data/spec/support/lib/chef/resource/one_two_three_four.rb +37 -37
- data/spec/support/lib/chef/resource/openldap_includer.rb +26 -26
- data/spec/support/lib/chef/resource/with_state.rb +28 -28
- data/spec/support/lib/chef/resource/zen_follower.rb +35 -35
- data/spec/support/lib/chef/resource/zen_master.rb +41 -41
- data/spec/support/lib/library_load_order.rb +20 -20
- data/spec/support/matchers/leak.rb +98 -98
- data/spec/support/mock/constant.rb +52 -52
- data/spec/support/mock/platform.rb +25 -25
- data/spec/support/platform_helpers.rb +214 -214
- data/spec/support/platforms/prof/gc.rb +53 -53
- data/spec/support/platforms/prof/win32.rb +45 -45
- data/spec/support/platforms/win32/spec_service.rb +59 -59
- data/spec/support/shared/context/client.rb +285 -285
- data/spec/support/shared/context/config.rb +21 -21
- data/spec/support/shared/context/win32.rb +34 -34
- data/spec/support/shared/examples/client.rb +53 -53
- data/spec/support/shared/functional/diff_disabled.rb +10 -10
- data/spec/support/shared/functional/directory_resource.rb +176 -176
- data/spec/support/shared/functional/file_resource.rb +1049 -1049
- data/spec/support/shared/functional/http.rb +248 -248
- data/spec/support/shared/functional/knife.rb +37 -37
- data/spec/support/shared/functional/securable_resource.rb +547 -547
- data/spec/support/shared/functional/securable_resource_with_reporting.rb +394 -394
- data/spec/support/shared/functional/win32_service.rb +59 -59
- data/spec/support/shared/functional/windows_script.rb +202 -202
- data/spec/support/shared/integration/app_server_support.rb +42 -42
- data/spec/support/shared/integration/integration_helper.rb +154 -154
- data/spec/support/shared/integration/knife_support.rb +173 -173
- data/spec/support/shared/matchers/exit_with_code.rb +32 -32
- data/spec/support/shared/matchers/match_environment_variable.rb +17 -17
- data/spec/support/shared/shared_examples.rb +14 -14
- data/spec/support/shared/unit/api_error_inspector.rb +190 -190
- data/spec/support/shared/unit/api_versioning.rb +77 -77
- data/spec/support/shared/unit/application_dot_d.rb +70 -70
- data/spec/support/shared/unit/execute_resource.rb +133 -133
- data/spec/support/shared/unit/file_system_support.rb +69 -69
- data/spec/support/shared/unit/knife_shared.rb +39 -39
- data/spec/support/shared/unit/mock_shellout.rb +49 -49
- data/spec/support/shared/unit/platform_introspector.rb +189 -189
- data/spec/support/shared/unit/provider/file.rb +835 -835
- data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +433 -433
- data/spec/support/shared/unit/resource/static_provider_resolution.rb +63 -63
- data/spec/support/shared/unit/script_resource.rb +98 -98
- data/spec/support/shared/unit/user_and_client_shared.rb +114 -114
- data/spec/support/shared/unit/windows_script_resource.rb +80 -80
- data/spec/tiny_server.rb +207 -207
- data/spec/unit/api_client/registration_spec.rb +278 -278
- data/spec/unit/api_client_spec.rb +341 -341
- data/spec/unit/api_client_v1_spec.rb +455 -455
- data/spec/unit/application/apply_spec.rb +110 -110
- data/spec/unit/application/client_spec.rb +495 -435
- data/spec/unit/application/knife_spec.rb +229 -229
- data/spec/unit/application/solo_spec.rb +170 -170
- data/spec/unit/application_spec.rb +411 -384
- data/spec/unit/audit/audit_event_proxy_spec.rb +311 -311
- data/spec/unit/audit/audit_reporter_spec.rb +430 -430
- data/spec/unit/audit/control_group_data_spec.rb +477 -477
- data/spec/unit/audit/logger_spec.rb +42 -42
- data/spec/unit/audit/rspec_formatter_spec.rb +29 -29
- data/spec/unit/audit/runner_spec.rb +144 -144
- data/spec/unit/chef_class_spec.rb +110 -110
- data/spec/unit/chef_fs/config_spec.rb +106 -106
- data/spec/unit/chef_fs/data_handler/group_handler_spec.rb +63 -63
- data/spec/unit/chef_fs/diff_spec.rb +328 -328
- data/spec/unit/chef_fs/file_pattern_spec.rb +512 -512
- data/spec/unit/chef_fs/file_system/cookbook_subdir_spec.rb +34 -34
- data/spec/unit/chef_fs/file_system/operation_failed_error_spec.rb +47 -47
- data/spec/unit/chef_fs/file_system_spec.rb +148 -148
- data/spec/unit/chef_fs/parallelizer.rb +479 -479
- data/spec/unit/chef_fs/path_util_spec.rb +108 -108
- data/spec/unit/chef_spec.rb +25 -25
- data/spec/unit/client_spec.rb +544 -544
- data/spec/unit/config_fetcher_spec.rb +125 -125
- data/spec/unit/config_spec.rb +31 -31
- data/spec/unit/cookbook/chefignore_spec.rb +49 -49
- data/spec/unit/cookbook/cookbook_version_loader_spec.rb +198 -198
- data/spec/unit/cookbook/file_vendor_spec.rb +97 -97
- data/spec/unit/cookbook/metadata_spec.rb +952 -952
- data/spec/unit/cookbook/synchronizer_spec.rb +520 -520
- data/spec/unit/cookbook/syntax_check_spec.rb +219 -219
- data/spec/unit/cookbook_loader_spec.rb +299 -299
- data/spec/unit/cookbook_manifest_spec.rb +243 -243
- data/spec/unit/cookbook_site_streaming_uploader_spec.rb +203 -203
- data/spec/unit/cookbook_spec.rb +66 -66
- data/spec/unit/cookbook_uploader_spec.rb +199 -199
- data/spec/unit/cookbook_version_file_specificity_spec.rb +576 -553
- data/spec/unit/cookbook_version_spec.rb +359 -359
- data/spec/unit/daemon_spec.rb +174 -174
- data/spec/unit/data_bag_item_spec.rb +388 -388
- data/spec/unit/data_bag_spec.rb +260 -260
- data/spec/unit/deprecation_spec.rb +150 -150
- data/spec/unit/digester_spec.rb +49 -49
- data/spec/unit/dsl/audit_spec.rb +43 -43
- data/spec/unit/dsl/data_query_spec.rb +106 -106
- data/spec/unit/dsl/platform_introspection_spec.rb +129 -129
- data/spec/unit/dsl/reboot_pending_spec.rb +100 -100
- data/spec/unit/dsl/recipe_spec.rb +93 -80
- data/spec/unit/dsl/{regsitry_helper_spec.rb → registry_helper_spec.rb} +52 -52
- data/spec/unit/dsl/resources_spec.rb +85 -85
- data/spec/unit/encrypted_data_bag_item/check_encrypted_spec.rb +95 -95
- data/spec/unit/encrypted_data_bag_item_spec.rb +437 -437
- data/spec/unit/environment_spec.rb +470 -470
- data/spec/unit/event_dispatch/dispatcher_spec.rb +122 -122
- data/spec/unit/event_dispatch/dsl_spec.rb +83 -83
- data/spec/unit/exceptions_spec.rb +130 -130
- data/spec/unit/file_access_control_spec.rb +308 -308
- data/spec/unit/file_cache_spec.rb +114 -114
- data/spec/unit/file_content_management/deploy/cp_spec.rb +44 -44
- data/spec/unit/file_content_management/deploy/mv_unix_spec.rb +101 -101
- data/spec/unit/file_content_management/deploy/mv_windows_spec.rb +232 -232
- data/spec/unit/file_content_management/tempfile_spec.rb +85 -85
- data/spec/unit/formatters/base_spec.rb +71 -71
- data/spec/unit/formatters/doc_spec.rb +92 -78
- data/spec/unit/formatters/error_description_spec.rb +96 -0
- data/spec/unit/formatters/error_inspectors/api_error_formatting_spec.rb +76 -76
- data/spec/unit/formatters/error_inspectors/compile_error_inspector_spec.rb +265 -265
- data/spec/unit/formatters/error_inspectors/cookbook_resolve_error_inspector_spec.rb +126 -126
- data/spec/unit/formatters/error_inspectors/cookbook_sync_error_inspector_spec.rb +43 -43
- data/spec/unit/formatters/error_inspectors/node_load_error_inspector_spec.rb +26 -26
- data/spec/unit/formatters/error_inspectors/registration_error_inspector_spec.rb +26 -26
- data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +191 -191
- data/spec/unit/formatters/error_inspectors/run_list_expansion_error_inspector_spec.rb +91 -91
- data/spec/unit/guard_interpreter/resource_guard_interpreter_spec.rb +155 -155
- data/spec/unit/guard_interpreter_spec.rb +41 -41
- data/spec/unit/handler/json_file_spec.rb +63 -63
- data/spec/unit/handler_spec.rb +215 -215
- data/spec/unit/http/authenticator_spec.rb +80 -80
- data/spec/unit/http/basic_client_spec.rb +52 -129
- data/spec/unit/http/http_request_spec.rb +91 -91
- data/spec/unit/http/json_input_spec.rb +128 -128
- data/spec/unit/http/simple_spec.rb +32 -32
- data/spec/unit/http/socketless_chef_zero_client_spec.rb +173 -173
- data/spec/unit/http/ssl_policies_spec.rb +169 -169
- data/spec/unit/http/validate_content_length_spec.rb +207 -207
- data/spec/unit/http_spec.rb +206 -206
- data/spec/unit/json_compat_spec.rb +105 -105
- data/spec/unit/key_spec.rb +631 -631
- data/spec/unit/knife/bootstrap/chef_vault_handler_spec.rb +152 -152
- data/spec/unit/knife/bootstrap/client_builder_spec.rb +207 -207
- data/spec/unit/knife/bootstrap_spec.rb +822 -822
- data/spec/unit/knife/client_bulk_delete_spec.rb +166 -166
- data/spec/unit/knife/client_create_spec.rb +186 -186
- data/spec/unit/knife/client_delete_spec.rb +83 -83
- data/spec/unit/knife/client_edit_spec.rb +53 -53
- data/spec/unit/knife/client_list_spec.rb +34 -34
- data/spec/unit/knife/client_reregister_spec.rb +62 -62
- data/spec/unit/knife/client_show_spec.rb +52 -52
- data/spec/unit/knife/configure_client_spec.rb +83 -83
- data/spec/unit/knife/configure_spec.rb +241 -241
- data/spec/unit/knife/cookbook_bulk_delete_spec.rb +87 -87
- data/spec/unit/knife/cookbook_create_spec.rb +260 -260
- data/spec/unit/knife/cookbook_delete_spec.rb +239 -239
- data/spec/unit/knife/cookbook_download_spec.rb +237 -237
- data/spec/unit/knife/cookbook_list_spec.rb +88 -88
- data/spec/unit/knife/cookbook_metadata_from_file_spec.rb +65 -65
- data/spec/unit/knife/cookbook_metadata_spec.rb +179 -179
- data/spec/unit/knife/cookbook_show_spec.rb +222 -222
- data/spec/unit/knife/cookbook_site_download_spec.rb +149 -149
- data/spec/unit/knife/cookbook_site_install_spec.rb +197 -197
- data/spec/unit/knife/cookbook_site_share_spec.rb +209 -209
- data/spec/unit/knife/cookbook_site_unshare_spec.rb +77 -77
- data/spec/unit/knife/cookbook_test_spec.rb +84 -84
- data/spec/unit/knife/cookbook_upload_spec.rb +331 -331
- data/spec/unit/knife/core/bootstrap_context_spec.rb +257 -257
- data/spec/unit/knife/core/cookbook_scm_repo_spec.rb +187 -187
- data/spec/unit/knife/core/custom_manifest_loader_spec.rb +41 -41
- data/spec/unit/knife/core/gem_glob_loader_spec.rb +209 -209
- data/spec/unit/knife/core/hashed_command_loader_spec.rb +109 -109
- data/spec/unit/knife/core/node_editor_spec.rb +211 -211
- data/spec/unit/knife/core/object_loader_spec.rb +81 -81
- data/spec/unit/knife/core/subcommand_loader_spec.rb +70 -70
- data/spec/unit/knife/core/ui_spec.rb +598 -598
- data/spec/unit/knife/data_bag_create_spec.rb +109 -109
- data/spec/unit/knife/data_bag_edit_spec.rb +127 -127
- data/spec/unit/knife/data_bag_from_file_spec.rb +172 -172
- data/spec/unit/knife/data_bag_secret_options_spec.rb +165 -165
- data/spec/unit/knife/data_bag_show_spec.rb +123 -123
- data/spec/unit/knife/environment_compare_spec.rb +112 -112
- data/spec/unit/knife/environment_create_spec.rb +91 -91
- data/spec/unit/knife/environment_delete_spec.rb +71 -71
- data/spec/unit/knife/environment_edit_spec.rb +79 -79
- data/spec/unit/knife/environment_from_file_spec.rb +90 -90
- data/spec/unit/knife/environment_list_spec.rb +54 -54
- data/spec/unit/knife/environment_show_spec.rb +52 -52
- data/spec/unit/knife/index_rebuild_spec.rb +125 -125
- data/spec/unit/knife/key_create_spec.rb +223 -223
- data/spec/unit/knife/key_delete_spec.rb +133 -133
- data/spec/unit/knife/key_edit_spec.rb +264 -264
- data/spec/unit/knife/key_helper.rb +74 -74
- data/spec/unit/knife/key_list_spec.rb +216 -216
- data/spec/unit/knife/key_show_spec.rb +126 -126
- data/spec/unit/knife/knife_help.rb +92 -92
- data/spec/unit/knife/node_bulk_delete_spec.rb +94 -94
- data/spec/unit/knife/node_delete_spec.rb +68 -68
- data/spec/unit/knife/node_edit_spec.rb +114 -114
- data/spec/unit/knife/node_environment_set_spec.rb +80 -80
- data/spec/unit/knife/node_from_file_spec.rb +59 -59
- data/spec/unit/knife/node_list_spec.rb +62 -62
- data/spec/unit/knife/node_run_list_add_spec.rb +145 -145
- data/spec/unit/knife/node_run_list_remove_spec.rb +106 -106
- data/spec/unit/knife/node_run_list_set_spec.rb +140 -140
- data/spec/unit/knife/node_show_spec.rb +65 -65
- data/spec/unit/knife/osc_user_create_spec.rb +93 -93
- data/spec/unit/knife/osc_user_delete_spec.rb +44 -44
- data/spec/unit/knife/osc_user_edit_spec.rb +52 -52
- data/spec/unit/knife/osc_user_list_spec.rb +37 -37
- data/spec/unit/knife/osc_user_reregister_spec.rb +58 -58
- data/spec/unit/knife/osc_user_show_spec.rb +46 -46
- data/spec/unit/knife/raw_spec.rb +43 -43
- data/spec/unit/knife/role_bulk_delete_spec.rb +80 -80
- data/spec/unit/knife/role_create_spec.rb +80 -80
- data/spec/unit/knife/role_delete_spec.rb +67 -67
- data/spec/unit/knife/role_edit_spec.rb +77 -77
- data/spec/unit/knife/role_env_run_list_add_spec.rb +217 -217
- data/spec/unit/knife/role_env_run_list_clear_spec.rb +94 -94
- data/spec/unit/knife/role_env_run_list_remove_spec.rb +102 -102
- data/spec/unit/knife/role_env_run_list_replace_spec.rb +105 -105
- data/spec/unit/knife/role_env_run_list_set_spec.rb +99 -99
- data/spec/unit/knife/role_from_file_spec.rb +69 -69
- data/spec/unit/knife/role_list_spec.rb +54 -54
- data/spec/unit/knife/role_run_list_add_spec.rb +179 -179
- data/spec/unit/knife/role_run_list_clear_spec.rb +84 -84
- data/spec/unit/knife/role_run_list_remove_spec.rb +92 -92
- data/spec/unit/knife/role_run_list_replace_spec.rb +98 -98
- data/spec/unit/knife/role_run_list_set_spec.rb +89 -89
- data/spec/unit/knife/role_show_spec.rb +59 -59
- data/spec/unit/knife/ssh_spec.rb +428 -410
- data/spec/unit/knife/ssl_check_spec.rb +240 -240
- data/spec/unit/knife/ssl_fetch_spec.rb +184 -184
- data/spec/unit/knife/status_spec.rb +108 -108
- data/spec/unit/knife/tag_create_spec.rb +23 -23
- data/spec/unit/knife/tag_delete_spec.rb +25 -25
- data/spec/unit/knife/tag_list_spec.rb +23 -23
- data/spec/unit/knife/user_create_spec.rb +214 -214
- data/spec/unit/knife/user_delete_spec.rb +65 -65
- data/spec/unit/knife/user_edit_spec.rb +66 -66
- data/spec/unit/knife/user_list_spec.rb +36 -36
- data/spec/unit/knife/user_reregister_spec.rb +74 -74
- data/spec/unit/knife/user_show_spec.rb +65 -65
- data/spec/unit/knife_spec.rb +529 -529
- data/spec/unit/lib_backcompat_spec.rb +34 -34
- data/spec/unit/log/syslog_spec.rb +53 -53
- data/spec/unit/log/winevt_spec.rb +55 -55
- data/spec/unit/log_spec.rb +24 -24
- data/spec/unit/lwrp_spec.rb +778 -720
- data/spec/unit/mash_spec.rb +51 -51
- data/spec/unit/mixin/api_version_request_handling_spec.rb +126 -126
- data/spec/unit/mixin/checksum_spec.rb +40 -40
- data/spec/unit/mixin/command_spec.rb +104 -104
- data/spec/unit/mixin/convert_to_class_name_spec.rb +54 -54
- data/spec/unit/mixin/deep_merge_spec.rb +342 -342
- data/spec/unit/mixin/deprecation_spec.rb +57 -57
- data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +96 -96
- data/spec/unit/mixin/homebrew_user_spec.rb +100 -100
- data/spec/unit/mixin/lazy_module_include.rb +71 -0
- data/spec/unit/mixin/params_validate_spec.rb +409 -409
- data/spec/unit/mixin/path_sanity_spec.rb +92 -92
- data/spec/unit/mixin/powershell_out_spec.rb +70 -70
- data/spec/unit/mixin/powershell_type_coercions_spec.rb +83 -83
- data/spec/unit/mixin/properties_spec.rb +97 -97
- data/spec/unit/mixin/proxified_socket_spec.rb +97 -94
- data/spec/unit/mixin/securable_spec.rb +314 -314
- data/spec/unit/mixin/shell_out_spec.rb +299 -299
- data/spec/unit/mixin/subclass_directive_spec.rb +45 -45
- data/spec/unit/mixin/template_spec.rb +276 -276
- data/spec/unit/mixin/unformatter_spec.rb +61 -61
- data/spec/unit/mixin/uris_spec.rb +57 -57
- data/spec/unit/mixin/windows_architecture_helper_spec.rb +85 -85
- data/spec/unit/mixin/xml_escape_spec.rb +54 -54
- data/spec/unit/monkey_patches/uri_spec.rb +34 -34
- data/spec/unit/monologger_spec.rb +45 -45
- data/spec/unit/node/attribute_spec.rb +1179 -1179
- data/spec/unit/node/immutable_collections_spec.rb +197 -197
- data/spec/unit/node_map_spec.rb +170 -170
- data/spec/unit/node_spec.rb +1565 -1565
- data/spec/unit/org_spec.rb +196 -196
- data/spec/unit/platform/query_helpers_spec.rb +220 -220
- data/spec/unit/platform_spec.rb +241 -241
- data/spec/unit/policy_builder/dynamic_spec.rb +273 -273
- data/spec/unit/policy_builder/expand_node_object_spec.rb +336 -336
- data/spec/unit/policy_builder/policyfile_spec.rb +745 -745
- data/spec/unit/policy_builder_spec.rb +26 -26
- data/spec/unit/property/state_spec.rb +508 -508
- data/spec/unit/property/validation_spec.rb +704 -704
- data/spec/unit/property_spec.rb +1227 -1227
- data/spec/unit/provider/apt_repository_spec.rb +178 -0
- data/spec/unit/provider/apt_update_spec.rb +113 -113
- data/spec/unit/provider/breakpoint_spec.rb +53 -53
- data/spec/unit/provider/cookbook_file/content_spec.rb +39 -39
- data/spec/unit/provider/cookbook_file_spec.rb +58 -58
- data/spec/unit/provider/cron/unix_spec.rb +139 -139
- data/spec/unit/provider/cron_spec.rb +1010 -1010
- data/spec/unit/provider/deploy/revision_spec.rb +110 -110
- data/spec/unit/provider/deploy/timestamped_spec.rb +40 -40
- data/spec/unit/provider/deploy_spec.rb +641 -641
- data/spec/unit/provider/directory_spec.rb +287 -287
- data/spec/unit/provider/dsc_resource_spec.rb +167 -167
- data/spec/unit/provider/dsc_script_spec.rb +173 -173
- data/spec/unit/provider/env/windows_spec.rb +103 -103
- data/spec/unit/provider/env_spec.rb +310 -310
- data/spec/unit/provider/erl_call_spec.rb +85 -85
- data/spec/unit/provider/execute_spec.rb +243 -243
- data/spec/unit/provider/file/content_spec.rb +114 -114
- data/spec/unit/provider/file_spec.rb +56 -56
- data/spec/unit/provider/git_spec.rb +668 -668
- data/spec/unit/provider/group/dscl_spec.rb +331 -331
- data/spec/unit/provider/group/gpasswd_spec.rb +116 -116
- data/spec/unit/provider/group/groupadd_spec.rb +174 -174
- data/spec/unit/provider/group/groupmod_spec.rb +133 -133
- data/spec/unit/provider/group/pw_spec.rb +138 -138
- data/spec/unit/provider/group/usermod_spec.rb +115 -115
- data/spec/unit/provider/group/windows_spec.rb +101 -101
- data/spec/unit/provider/group_spec.rb +286 -286
- data/spec/unit/provider/http_request_spec.rb +159 -159
- data/spec/unit/provider/ifconfig/aix_spec.rb +180 -180
- data/spec/unit/provider/ifconfig/debian_spec.rb +344 -344
- data/spec/unit/provider/ifconfig/redhat_spec.rb +73 -73
- data/spec/unit/provider/ifconfig_spec.rb +200 -200
- data/spec/unit/provider/launchd_spec.rb +189 -189
- data/spec/unit/provider/link_spec.rb +252 -252
- data/spec/unit/provider/log_spec.rb +75 -75
- data/spec/unit/provider/mdadm_spec.rb +131 -131
- data/spec/unit/provider/mount/aix_spec.rb +237 -238
- data/spec/unit/provider/mount/mount_spec.rb +474 -480
- data/spec/unit/provider/mount/solaris_spec.rb +822 -822
- data/spec/unit/provider/mount/windows_spec.rb +149 -151
- data/spec/unit/provider/mount_spec.rb +184 -203
- data/spec/unit/provider/ohai_spec.rb +84 -84
- data/spec/unit/provider/osx_profile_spec.rb +249 -249
- data/spec/unit/provider/package/aix_spec.rb +172 -172
- data/spec/unit/provider/package/apt_spec.rb +386 -386
- data/spec/unit/provider/package/chocolatey_spec.rb +501 -501
- data/spec/unit/provider/package/dpkg_spec.rb +287 -287
- data/spec/unit/provider/package/easy_install_spec.rb +108 -108
- data/spec/unit/provider/package/freebsd/pkg_spec.rb +274 -274
- data/spec/unit/provider/package/freebsd/pkgng_spec.rb +148 -148
- data/spec/unit/provider/package/freebsd/port_spec.rb +163 -163
- data/spec/unit/provider/package/homebrew_spec.rb +292 -292
- data/spec/unit/provider/package/ips_spec.rb +227 -227
- data/spec/unit/provider/package/macports_spec.rb +203 -203
- data/spec/unit/provider/package/openbsd_spec.rb +132 -132
- data/spec/unit/provider/package/pacman_spec.rb +194 -194
- data/spec/unit/provider/package/paludis_spec.rb +134 -134
- data/spec/unit/provider/package/portage_spec.rb +310 -310
- data/spec/unit/provider/package/rpm_spec.rb +429 -429
- data/spec/unit/provider/package/rubygems_spec.rb +782 -782
- data/spec/unit/provider/package/smartos_spec.rb +110 -110
- data/spec/unit/provider/package/solaris_spec.rb +167 -167
- data/spec/unit/provider/package/windows/exe_spec.rb +187 -187
- data/spec/unit/provider/package/windows/msi_spec.rb +159 -159
- data/spec/unit/provider/package/windows_spec.rb +397 -397
- data/spec/unit/provider/package/yum_spec.rb +2267 -2267
- data/spec/unit/provider/package/zypper_spec.rb +268 -268
- data/spec/unit/provider/package_spec.rb +870 -870
- data/spec/unit/provider/powershell_script_spec.rb +106 -106
- data/spec/unit/provider/registry_key_spec.rb +295 -295
- data/spec/unit/provider/remote_directory_spec.rb +221 -221
- data/spec/unit/provider/remote_file/cache_control_data_spec.rb +245 -245
- data/spec/unit/provider/remote_file/content_spec.rb +252 -252
- data/spec/unit/provider/remote_file/fetcher_spec.rb +94 -94
- data/spec/unit/provider/remote_file/ftp_spec.rb +217 -219
- data/spec/unit/provider/remote_file/http_spec.rb +322 -301
- data/spec/unit/provider/remote_file/local_file_spec.rb +103 -103
- data/spec/unit/provider/remote_file/network_file_spec.rb +45 -45
- data/spec/unit/provider/remote_file/sftp_spec.rb +150 -0
- data/spec/unit/provider/remote_file_spec.rb +61 -61
- data/spec/unit/provider/route_spec.rb +242 -242
- data/spec/unit/provider/ruby_block_spec.rb +45 -45
- data/spec/unit/provider/script_spec.rb +114 -114
- data/spec/unit/provider/service/aix_service_spec.rb +195 -195
- data/spec/unit/provider/service/aixinit_service_spec.rb +272 -272
- data/spec/unit/provider/service/arch_service_spec.rb +324 -324
- data/spec/unit/provider/service/debian_service_spec.rb +375 -375
- data/spec/unit/provider/service/freebsd_service_spec.rb +613 -613
- data/spec/unit/provider/service/gentoo_service_spec.rb +144 -144
- data/spec/unit/provider/service/init_service_spec.rb +235 -235
- data/spec/unit/provider/service/insserv_service_spec.rb +75 -75
- data/spec/unit/provider/service/invokercd_service_spec.rb +211 -211
- data/spec/unit/provider/service/macosx_spec.rb +335 -335
- data/spec/unit/provider/service/openbsd_service_spec.rb +545 -545
- data/spec/unit/provider/service/redhat_spec.rb +250 -236
- data/spec/unit/provider/service/simple_service_spec.rb +169 -169
- data/spec/unit/provider/service/solaris_smf_service_spec.rb +255 -255
- data/spec/unit/provider/service/systemd_service_spec.rb +370 -344
- data/spec/unit/provider/service/upstart_service_spec.rb +342 -342
- data/spec/unit/provider/service/windows_spec.rb +463 -463
- data/spec/unit/provider/service_spec.rb +168 -168
- data/spec/unit/provider/subversion_spec.rb +352 -298
- data/spec/unit/provider/template/content_spec.rb +169 -169
- data/spec/unit/provider/template_spec.rb +89 -89
- data/spec/unit/provider/user/dscl_spec.rb +901 -901
- data/spec/unit/provider/user/pw_spec.rb +252 -252
- data/spec/unit/provider/user/solaris_spec.rb +139 -139
- data/spec/unit/provider/user/useradd_spec.rb +51 -51
- data/spec/unit/provider/user/windows_spec.rb +185 -185
- data/spec/unit/provider/user_spec.rb +474 -474
- data/spec/unit/provider/whyrun_safe_ruby_block_spec.rb +46 -46
- data/spec/unit/provider_resolver_spec.rb +893 -893
- data/spec/unit/provider_spec.rb +198 -198
- data/spec/unit/pure_application_spec.rb +32 -32
- data/spec/unit/recipe_spec.rb +699 -699
- data/spec/unit/resource/apt_package_spec.rb +38 -38
- data/spec/unit/resource/apt_repository_spec.rb +34 -0
- data/spec/unit/resource/apt_update_spec.rb +38 -38
- data/spec/unit/resource/bash_spec.rb +40 -40
- data/spec/unit/resource/batch_spec.rb +49 -49
- data/spec/unit/resource/breakpoint_spec.rb +47 -47
- data/spec/unit/resource/chef_gem_spec.rb +157 -157
- data/spec/unit/resource/chocolatey_package_spec.rb +67 -67
- data/spec/unit/resource/conditional_action_not_nothing_spec.rb +45 -45
- data/spec/unit/resource/conditional_spec.rb +208 -208
- data/spec/unit/resource/cookbook_file_spec.rb +88 -88
- data/spec/unit/resource/cron_spec.rb +186 -186
- data/spec/unit/resource/csh_spec.rb +40 -40
- data/spec/unit/resource/deploy_revision_spec.rb +42 -42
- data/spec/unit/resource/deploy_spec.rb +283 -283
- data/spec/unit/resource/directory_spec.rb +82 -82
- data/spec/unit/resource/dpkg_package_spec.rb +32 -32
- data/spec/unit/resource/dsc_resource_spec.rb +96 -96
- data/spec/unit/resource/dsc_script_spec.rb +134 -134
- data/spec/unit/resource/easy_install_package_spec.rb +39 -39
- data/spec/unit/resource/env_spec.rb +85 -85
- data/spec/unit/resource/erl_call_spec.rb +81 -81
- data/spec/unit/resource/execute_spec.rb +35 -35
- data/spec/unit/resource/file/verification_spec.rb +139 -139
- data/spec/unit/resource/file_spec.rb +130 -130
- data/spec/unit/resource/freebsd_package_spec.rb +87 -87
- data/spec/unit/resource/gem_package_spec.rb +42 -42
- data/spec/unit/resource/git_spec.rb +50 -50
- data/spec/unit/resource/group_spec.rb +162 -162
- data/spec/unit/resource/homebrew_package_spec.rb +50 -50
- data/spec/unit/resource/http_request_spec.rb +59 -59
- data/spec/unit/resource/ifconfig_spec.rb +109 -109
- data/spec/unit/resource/ips_package_spec.rb +40 -40
- data/spec/unit/resource/ksh_spec.rb +40 -40
- data/spec/unit/resource/launchd_spec.rb +31 -31
- data/spec/unit/resource/link_spec.rb +134 -134
- data/spec/unit/resource/log_spec.rb +73 -73
- data/spec/unit/resource/macports_package_spec.rb +32 -32
- data/spec/unit/resource/mdadm_spec.rb +102 -102
- data/spec/unit/resource/mount_spec.rb +214 -214
- data/spec/unit/resource/ohai_spec.rb +61 -61
- data/spec/unit/resource/openbsd_package_spec.rb +48 -48
- data/spec/unit/resource/osx_profile_spec.rb +61 -61
- data/spec/unit/resource/package_spec.rb +93 -93
- data/spec/unit/resource/pacman_package_spec.rb +32 -32
- data/spec/unit/resource/perl_spec.rb +40 -40
- data/spec/unit/resource/portage_package_spec.rb +38 -38
- data/spec/unit/resource/powershell_script_spec.rb +136 -136
- data/spec/unit/resource/python_spec.rb +40 -40
- data/spec/unit/resource/registry_key_spec.rb +199 -199
- data/spec/unit/resource/remote_directory_spec.rb +97 -97
- data/spec/unit/resource/remote_file_spec.rb +207 -207
- data/spec/unit/resource/resource_notification_spec.rb +169 -169
- data/spec/unit/resource/route_spec.rb +107 -107
- data/spec/unit/resource/rpm_package_spec.rb +46 -46
- data/spec/unit/resource/ruby_block_spec.rb +61 -61
- data/spec/unit/resource/ruby_spec.rb +40 -40
- data/spec/unit/resource/scm_spec.rb +193 -193
- data/spec/unit/resource/script_spec.rb +44 -44
- data/spec/unit/resource/service_spec.rb +179 -179
- data/spec/unit/resource/smartos_package_spec.rb +33 -33
- data/spec/unit/resource/solaris_package_spec.rb +42 -42
- data/spec/unit/resource/subversion_spec.rb +71 -71
- data/spec/unit/resource/template_spec.rb +210 -210
- data/spec/unit/resource/timestamped_deploy_spec.rb +32 -32
- data/spec/unit/resource/user_spec.rb +133 -133
- data/spec/unit/resource/windows_package_spec.rb +95 -95
- data/spec/unit/resource/windows_service_spec.rb +49 -49
- data/spec/unit/resource/yum_package_spec.rb +89 -89
- data/spec/unit/resource_builder_spec.rb +1 -1
- data/spec/unit/resource_collection/resource_list_spec.rb +137 -137
- data/spec/unit/resource_collection/resource_set_spec.rb +199 -199
- data/spec/unit/resource_collection/stepable_iterator_spec.rb +144 -144
- data/spec/unit/resource_collection_spec.rb +369 -299
- data/spec/unit/resource_definition_spec.rb +117 -117
- data/spec/unit/resource_reporter_spec.rb +758 -758
- data/spec/unit/resource_resolver_spec.rb +52 -52
- data/spec/unit/resource_spec.rb +1101 -1101
- data/spec/unit/rest/auth_credentials_spec.rb +292 -296
- data/spec/unit/rest_spec.rb +753 -753
- data/spec/unit/role_spec.rb +358 -358
- data/spec/unit/run_context/child_run_context_spec.rb +133 -133
- data/spec/unit/run_context/cookbook_compiler_spec.rb +184 -184
- data/spec/unit/run_context_spec.rb +241 -241
- data/spec/unit/run_list/run_list_expansion_spec.rb +144 -144
- data/spec/unit/run_list/run_list_item_spec.rb +117 -117
- data/spec/unit/run_list/versioned_recipe_list_spec.rb +194 -194
- data/spec/unit/run_list_spec.rb +312 -312
- data/spec/unit/run_lock_spec.rb +140 -140
- data/spec/unit/run_status_spec.rb +144 -144
- data/spec/unit/runner_spec.rb +411 -411
- data/spec/unit/scan_access_control_spec.rb +183 -183
- data/spec/unit/search/query_spec.rb +289 -289
- data/spec/unit/shell/model_wrapper_spec.rb +96 -96
- data/spec/unit/shell/shell_ext_spec.rb +153 -153
- data/spec/unit/shell/shell_session_spec.rb +195 -195
- data/spec/unit/shell_out_spec.rb +18 -18
- data/spec/unit/shell_spec.rb +162 -162
- data/spec/unit/user_spec.rb +275 -275
- data/spec/unit/user_v1_spec.rb +583 -583
- data/spec/unit/util/backup_spec.rb +141 -141
- data/spec/unit/util/diff_spec.rb +576 -576
- data/spec/unit/util/dsc/configuration_generator_spec.rb +193 -193
- data/spec/unit/util/dsc/lcm_output_parser_spec.rb +164 -164
- data/spec/unit/util/dsc/local_configuration_manager_spec.rb +138 -138
- data/spec/unit/util/dsc/resource_store.rb +76 -76
- data/spec/unit/util/editor_spec.rb +152 -152
- data/spec/unit/util/file_edit_spec.rb +224 -224
- data/spec/unit/util/powershell/cmdlet_spec.rb +106 -106
- data/spec/unit/util/powershell/ps_credential_spec.rb +44 -44
- data/spec/unit/util/selinux_spec.rb +171 -171
- data/spec/unit/util/threaded_job_queue_spec.rb +51 -51
- data/spec/unit/version/platform_spec.rb +60 -60
- data/spec/unit/version_class_spec.rb +171 -171
- data/spec/unit/version_constraint/platform_spec.rb +45 -45
- data/spec/unit/version_constraint_spec.rb +179 -179
- data/spec/unit/win32/registry_spec.rb +394 -394
- data/spec/unit/windows_service_spec.rb +116 -116
- data/tasks/cbgb.rb +84 -84
- data/tasks/external_tests.rb +64 -64
- data/tasks/maintainers.rb +210 -210
- data/tasks/rspec.rb +89 -89
- metadata +55 -464
data/spec/unit/node_spec.rb
CHANGED
@@ -1,1565 +1,1565 @@
|
|
1
|
-
#
|
2
|
-
# Author:: Adam Jacob (<adam@chef.io>)
|
3
|
-
# Copyright:: Copyright 2008-2016, Chef Software, 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 "ostruct"
|
21
|
-
|
22
|
-
describe Chef::Node do
|
23
|
-
|
24
|
-
let(:node) { Chef::Node.new() }
|
25
|
-
let(:platform_introspector) { node }
|
26
|
-
|
27
|
-
it_behaves_like "a platform introspector"
|
28
|
-
|
29
|
-
it "creates a node and assigns it a name" do
|
30
|
-
node = Chef::Node.build("solo-node")
|
31
|
-
expect(node.name).to eq("solo-node")
|
32
|
-
end
|
33
|
-
|
34
|
-
it "should validate the name of the node" do
|
35
|
-
expect { Chef::Node.build("solo node") }.to raise_error(Chef::Exceptions::ValidationFailed)
|
36
|
-
end
|
37
|
-
|
38
|
-
it "should be sortable" do
|
39
|
-
n1 = Chef::Node.build("alpha")
|
40
|
-
n2 = Chef::Node.build("beta")
|
41
|
-
n3 = Chef::Node.build("omega")
|
42
|
-
expect([n3, n1, n2].sort).to eq([n1, n2, n3])
|
43
|
-
end
|
44
|
-
|
45
|
-
it "should share identity only with others of the same name" do
|
46
|
-
n1 = Chef::Node.build("foo")
|
47
|
-
n2 = Chef::Node.build("foo")
|
48
|
-
n3 = Chef::Node.build("bar")
|
49
|
-
expect(n1).to eq(n2)
|
50
|
-
expect(n1).not_to eq(n3)
|
51
|
-
end
|
52
|
-
|
53
|
-
describe "when the node does not exist on the server" do
|
54
|
-
before do
|
55
|
-
response = OpenStruct.new(:code => "404")
|
56
|
-
exception = Net::HTTPServerException.new("404 not found", response)
|
57
|
-
allow(Chef::Node).to receive(:load).and_raise(exception)
|
58
|
-
node.name("created-node")
|
59
|
-
end
|
60
|
-
|
61
|
-
it "creates a new node for find_or_create" do
|
62
|
-
allow(Chef::Node).to receive(:new).and_return(node)
|
63
|
-
expect(node).to receive(:create).and_return(node)
|
64
|
-
node = Chef::Node.find_or_create("created-node")
|
65
|
-
expect(node.name).to eq("created-node")
|
66
|
-
expect(node).to equal(node)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
describe "when the node exists on the server" do
|
71
|
-
before do
|
72
|
-
node.name("existing-node")
|
73
|
-
allow(Chef::Node).to receive(:load).and_return(node)
|
74
|
-
end
|
75
|
-
|
76
|
-
it "loads the node via the REST API for find_or_create" do
|
77
|
-
expect(Chef::Node.find_or_create("existing-node")).to equal(node)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
describe "run_state" do
|
82
|
-
it "is an empty hash" do
|
83
|
-
expect(node.run_state).to respond_to(:keys)
|
84
|
-
expect(node.run_state).to be_empty
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
describe "initialize" do
|
89
|
-
it "should default to the '_default' chef_environment" do
|
90
|
-
n = Chef::Node.new
|
91
|
-
expect(n.chef_environment).to eq("_default")
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
describe "name" do
|
96
|
-
it "should allow you to set a name with name(something)" do
|
97
|
-
expect { node.name("latte") }.not_to raise_error
|
98
|
-
end
|
99
|
-
|
100
|
-
it "should return the name with name()" do
|
101
|
-
node.name("latte")
|
102
|
-
expect(node.name).to eql("latte")
|
103
|
-
end
|
104
|
-
|
105
|
-
it "should always have a string for name" do
|
106
|
-
expect { node.name(Hash.new) }.to raise_error(ArgumentError)
|
107
|
-
end
|
108
|
-
|
109
|
-
it "cannot be blank" do
|
110
|
-
expect { node.name("") }.to raise_error(Chef::Exceptions::ValidationFailed)
|
111
|
-
end
|
112
|
-
|
113
|
-
it "should not accept name doesn't match /^[\-[:alnum:]_:.]+$/" do
|
114
|
-
expect { node.name("space in it") }.to raise_error(Chef::Exceptions::ValidationFailed)
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
describe "chef_environment" do
|
119
|
-
it "should set an environment with chef_environment(something)" do
|
120
|
-
expect { node.chef_environment("latte") }.not_to raise_error
|
121
|
-
end
|
122
|
-
|
123
|
-
it "should return the chef_environment with chef_environment()" do
|
124
|
-
node.chef_environment("latte")
|
125
|
-
expect(node.chef_environment).to eq("latte")
|
126
|
-
end
|
127
|
-
|
128
|
-
it "should disallow non-strings" do
|
129
|
-
expect { node.chef_environment(Hash.new) }.to raise_error(ArgumentError)
|
130
|
-
expect { node.chef_environment(42) }.to raise_error(ArgumentError)
|
131
|
-
end
|
132
|
-
|
133
|
-
it "cannot be blank" do
|
134
|
-
expect { node.chef_environment("") }.to raise_error(Chef::Exceptions::ValidationFailed)
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
describe "policy_name" do
|
139
|
-
|
140
|
-
it "defaults to nil" do
|
141
|
-
expect(node.policy_name).to be_nil
|
142
|
-
end
|
143
|
-
|
144
|
-
it "sets policy_name with a regular setter" do
|
145
|
-
node.policy_name = "example-policy"
|
146
|
-
expect(node.policy_name).to eq("example-policy")
|
147
|
-
end
|
148
|
-
|
149
|
-
it "allows policy_name with every valid character" do
|
150
|
-
expect { node.policy_name = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqurstuvwxyz0123456789-_:." }.to_not raise_error
|
151
|
-
end
|
152
|
-
|
153
|
-
it "sets policy_name when given an argument" do
|
154
|
-
node.policy_name("example-policy")
|
155
|
-
expect(node.policy_name).to eq("example-policy")
|
156
|
-
end
|
157
|
-
|
158
|
-
it "sets policy_name to nil when given nil" do
|
159
|
-
node.policy_name = "example-policy"
|
160
|
-
node.policy_name = nil
|
161
|
-
expect(node.policy_name).to be_nil
|
162
|
-
end
|
163
|
-
|
164
|
-
it "disallows non-strings" do
|
165
|
-
expect { node.policy_name(Hash.new) }.to raise_error(Chef::Exceptions::ValidationFailed)
|
166
|
-
expect { node.policy_name(42) }.to raise_error(Chef::Exceptions::ValidationFailed)
|
167
|
-
end
|
168
|
-
|
169
|
-
it "cannot be blank" do
|
170
|
-
expect { node.policy_name("") }.to raise_error(Chef::Exceptions::ValidationFailed)
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
|
-
describe "policy_group" do
|
175
|
-
|
176
|
-
it "defaults to nil" do
|
177
|
-
expect(node.policy_group).to be_nil
|
178
|
-
end
|
179
|
-
|
180
|
-
it "sets policy_group with a regular setter" do
|
181
|
-
node.policy_group = "staging"
|
182
|
-
expect(node.policy_group).to eq("staging")
|
183
|
-
end
|
184
|
-
|
185
|
-
it "allows policy_group with every valid character" do
|
186
|
-
expect { node.policy_group = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqurstuvwxyz0123456789-_:." }.to_not raise_error
|
187
|
-
end
|
188
|
-
|
189
|
-
it "sets an environment with chef_environment(something)" do
|
190
|
-
node.policy_group("staging")
|
191
|
-
expect(node.policy_group).to eq("staging")
|
192
|
-
end
|
193
|
-
|
194
|
-
it "sets policy_group to nil when given nil" do
|
195
|
-
node.policy_group = "staging"
|
196
|
-
node.policy_group = nil
|
197
|
-
expect(node.policy_group).to be_nil
|
198
|
-
end
|
199
|
-
|
200
|
-
it "disallows non-strings" do
|
201
|
-
expect { node.policy_group(Hash.new) }.to raise_error(Chef::Exceptions::ValidationFailed)
|
202
|
-
expect { node.policy_group(42) }.to raise_error(Chef::Exceptions::ValidationFailed)
|
203
|
-
end
|
204
|
-
|
205
|
-
it "cannot be blank" do
|
206
|
-
expect { node.policy_group("") }.to raise_error(Chef::Exceptions::ValidationFailed)
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|
210
|
-
describe "attributes" do
|
211
|
-
it "should have attributes" do
|
212
|
-
expect(node.attribute).to be_a_kind_of(Hash)
|
213
|
-
end
|
214
|
-
|
215
|
-
it "should allow attributes to be accessed by name or symbol directly on node[]" do
|
216
|
-
node.default["locust"] = "something"
|
217
|
-
expect(node[:locust]).to eql("something")
|
218
|
-
expect(node["locust"]).to eql("something")
|
219
|
-
end
|
220
|
-
|
221
|
-
it "should return nil if it cannot find an attribute with node[]" do
|
222
|
-
expect(node["secret"]).to eql(nil)
|
223
|
-
end
|
224
|
-
|
225
|
-
it "does not allow you to set an attribute via node[]=" do
|
226
|
-
expect { node["secret"] = "shush" }.to raise_error(Chef::Exceptions::ImmutableAttributeModification)
|
227
|
-
end
|
228
|
-
|
229
|
-
it "should allow you to query whether an attribute exists with attribute?" do
|
230
|
-
node.default["locust"] = "something"
|
231
|
-
expect(node.attribute?("locust")).to eql(true)
|
232
|
-
expect(node.attribute?("no dice")).to eql(false)
|
233
|
-
end
|
234
|
-
|
235
|
-
it "should let you go deep with attribute?" do
|
236
|
-
node.set["battles"]["people"]["wonkey"] = true
|
237
|
-
expect(node["battles"]["people"].attribute?("wonkey")).to eq(true)
|
238
|
-
expect(node["battles"]["people"].attribute?("snozzberry")).to eq(false)
|
239
|
-
end
|
240
|
-
|
241
|
-
it "does not allow you to set an attribute via method_missing" do
|
242
|
-
expect { node.sunshine = "is bright" }.to raise_error(Chef::Exceptions::ImmutableAttributeModification)
|
243
|
-
end
|
244
|
-
|
245
|
-
it "should allow you get get an attribute via method_missing" do
|
246
|
-
node.default.sunshine = "is bright"
|
247
|
-
expect(node.sunshine).to eql("is bright")
|
248
|
-
end
|
249
|
-
|
250
|
-
describe "normal attributes" do
|
251
|
-
it "should allow you to set an attribute with set, without pre-declaring a hash" do
|
252
|
-
node.set[:snoopy][:is_a_puppy] = true
|
253
|
-
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
254
|
-
end
|
255
|
-
|
256
|
-
it "should allow you to set an attribute with set_unless" do
|
257
|
-
node.set_unless[:snoopy][:is_a_puppy] = false
|
258
|
-
expect(node[:snoopy][:is_a_puppy]).to eq(false)
|
259
|
-
end
|
260
|
-
|
261
|
-
it "should not allow you to set an attribute with set_unless if it already exists" do
|
262
|
-
node.set[:snoopy][:is_a_puppy] = true
|
263
|
-
node.set_unless[:snoopy][:is_a_puppy] = false
|
264
|
-
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
265
|
-
end
|
266
|
-
|
267
|
-
it "should allow you to set an attribute with set_unless if is a nil value" do
|
268
|
-
node.attributes.normal = { snoopy: { is_a_puppy: nil } }
|
269
|
-
node.set_unless[:snoopy][:is_a_puppy] = false
|
270
|
-
expect(node[:snoopy][:is_a_puppy]).to eq(false)
|
271
|
-
end
|
272
|
-
|
273
|
-
it "should allow you to set a value after a set_unless" do
|
274
|
-
# this tests for set_unless_present state bleeding between statements CHEF-3806
|
275
|
-
node.set_unless[:snoopy][:is_a_puppy] = false
|
276
|
-
node.set[:snoopy][:is_a_puppy] = true
|
277
|
-
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
278
|
-
end
|
279
|
-
|
280
|
-
it "should let you set a value after a 'dangling' set_unless" do
|
281
|
-
# this tests for set_unless_present state bleeding between statements CHEF-3806
|
282
|
-
node.set[:snoopy][:is_a_puppy] = "what"
|
283
|
-
node.set_unless[:snoopy][:is_a_puppy]
|
284
|
-
node.set[:snoopy][:is_a_puppy] = true
|
285
|
-
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
286
|
-
end
|
287
|
-
|
288
|
-
it "auto-vivifies attributes created via method syntax" do
|
289
|
-
node.set.fuu.bahrr.baz = "qux"
|
290
|
-
expect(node.fuu.bahrr.baz).to eq("qux")
|
291
|
-
end
|
292
|
-
|
293
|
-
it "should let you use tag as a convience method for the tags attribute" do
|
294
|
-
node.normal["tags"] = %w{one two}
|
295
|
-
node.tag("three", "four")
|
296
|
-
expect(node["tags"]).to eq(%w{one two three four})
|
297
|
-
end
|
298
|
-
end
|
299
|
-
|
300
|
-
describe "default attributes" do
|
301
|
-
it "should be set with default, without pre-declaring a hash" do
|
302
|
-
node.default[:snoopy][:is_a_puppy] = true
|
303
|
-
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
304
|
-
end
|
305
|
-
|
306
|
-
it "should allow you to set with default_unless without pre-declaring a hash" do
|
307
|
-
node.default_unless[:snoopy][:is_a_puppy] = false
|
308
|
-
expect(node[:snoopy][:is_a_puppy]).to eq(false)
|
309
|
-
end
|
310
|
-
|
311
|
-
it "should not allow you to set an attribute with default_unless if it already exists" do
|
312
|
-
node.default[:snoopy][:is_a_puppy] = true
|
313
|
-
node.default_unless[:snoopy][:is_a_puppy] = false
|
314
|
-
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
315
|
-
end
|
316
|
-
|
317
|
-
it "should allow you to set a value after a default_unless" do
|
318
|
-
# this tests for set_unless_present state bleeding between statements CHEF-3806
|
319
|
-
node.default_unless[:snoopy][:is_a_puppy] = false
|
320
|
-
node.default[:snoopy][:is_a_puppy] = true
|
321
|
-
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
322
|
-
end
|
323
|
-
|
324
|
-
it "should allow you to set a value after a 'dangling' default_unless" do
|
325
|
-
# this tests for set_unless_present state bleeding between statements CHEF-3806
|
326
|
-
node.default[:snoopy][:is_a_puppy] = "what"
|
327
|
-
node.default_unless[:snoopy][:is_a_puppy]
|
328
|
-
node.default[:snoopy][:is_a_puppy] = true
|
329
|
-
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
330
|
-
end
|
331
|
-
|
332
|
-
it "auto-vivifies attributes created via method syntax" do
|
333
|
-
node.default.fuu.bahrr.baz = "qux"
|
334
|
-
expect(node.fuu.bahrr.baz).to eq("qux")
|
335
|
-
end
|
336
|
-
end
|
337
|
-
|
338
|
-
describe "override attributes" do
|
339
|
-
it "should be set with override, without pre-declaring a hash" do
|
340
|
-
node.override[:snoopy][:is_a_puppy] = true
|
341
|
-
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
342
|
-
end
|
343
|
-
|
344
|
-
it "should allow you to set with override_unless without pre-declaring a hash" do
|
345
|
-
node.override_unless[:snoopy][:is_a_puppy] = false
|
346
|
-
expect(node[:snoopy][:is_a_puppy]).to eq(false)
|
347
|
-
end
|
348
|
-
|
349
|
-
it "should not allow you to set an attribute with override_unless if it already exists" do
|
350
|
-
node.override[:snoopy][:is_a_puppy] = true
|
351
|
-
node.override_unless[:snoopy][:is_a_puppy] = false
|
352
|
-
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
353
|
-
end
|
354
|
-
|
355
|
-
it "should allow you to set a value after an override_unless" do
|
356
|
-
# this tests for set_unless_present state bleeding between statements CHEF-3806
|
357
|
-
node.override_unless[:snoopy][:is_a_puppy] = false
|
358
|
-
node.override[:snoopy][:is_a_puppy] = true
|
359
|
-
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
360
|
-
end
|
361
|
-
|
362
|
-
it "should allow you to set a value after a 'dangling' override_unless" do
|
363
|
-
# this tests for set_unless_present state bleeding between statements CHEF-3806
|
364
|
-
node.override_unless[:snoopy][:is_a_puppy] = "what"
|
365
|
-
node.override_unless[:snoopy][:is_a_puppy]
|
366
|
-
node.override[:snoopy][:is_a_puppy] = true
|
367
|
-
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
368
|
-
end
|
369
|
-
|
370
|
-
it "auto-vivifies attributes created via method syntax" do
|
371
|
-
node.override.fuu.bahrr.baz = "qux"
|
372
|
-
expect(node.fuu.bahrr.baz).to eq("qux")
|
373
|
-
end
|
374
|
-
end
|
375
|
-
|
376
|
-
describe "globally deleting attributes" do
|
377
|
-
context "with hash values" do
|
378
|
-
before do
|
379
|
-
node.role_default["mysql"]["server"]["port"] = 1234
|
380
|
-
node.normal["mysql"]["server"]["port"] = 2345
|
381
|
-
node.override["mysql"]["server"]["port"] = 3456
|
382
|
-
end
|
383
|
-
|
384
|
-
it "deletes all the values and returns the value with the highest precidence" do
|
385
|
-
expect( node.rm("mysql", "server", "port") ).to eql(3456)
|
386
|
-
expect( node["mysql"]["server"]["port"] ).to be_nil
|
387
|
-
expect( node["mysql"]["server"] ).to eql({})
|
388
|
-
end
|
389
|
-
|
390
|
-
it "deletes nested things correctly" do
|
391
|
-
node.default["mysql"]["client"]["client_setting"] = "foo"
|
392
|
-
expect( node.rm("mysql", "server") ).to eql( { "port" => 3456 } )
|
393
|
-
expect( node["mysql"] ).to eql( { "client" => { "client_setting" => "foo" } } )
|
394
|
-
end
|
395
|
-
|
396
|
-
it "returns nil if the node attribute does not exist" do
|
397
|
-
expect( node.rm("no", "such", "thing") ).to be_nil
|
398
|
-
end
|
399
|
-
|
400
|
-
it "can delete the entire tree" do
|
401
|
-
expect( node.rm("mysql") ).to eql({ "server" => { "port" => 3456 } })
|
402
|
-
end
|
403
|
-
end
|
404
|
-
|
405
|
-
context "when trying to delete through a thing that isn't an array-like or hash-like object" do
|
406
|
-
before do
|
407
|
-
node.default["mysql"] = true
|
408
|
-
end
|
409
|
-
|
410
|
-
it "returns nil when you're two levels deeper" do
|
411
|
-
expect( node.rm("mysql", "server", "port") ).to eql(nil)
|
412
|
-
end
|
413
|
-
|
414
|
-
it "returns nil when you're one level deeper" do
|
415
|
-
expect( node.rm("mysql", "server") ).to eql(nil)
|
416
|
-
end
|
417
|
-
|
418
|
-
it "correctly deletes at the top level" do
|
419
|
-
expect( node.rm("mysql") ).to eql(true)
|
420
|
-
end
|
421
|
-
end
|
422
|
-
|
423
|
-
context "with array indexes" do
|
424
|
-
before do
|
425
|
-
node.role_default["mysql"]["server"][0]["port"] = 1234
|
426
|
-
node.normal["mysql"]["server"][0]["port"] = 2345
|
427
|
-
node.override["mysql"]["server"][0]["port"] = 3456
|
428
|
-
node.override["mysql"]["server"][1]["port"] = 3456
|
429
|
-
end
|
430
|
-
|
431
|
-
it "deletes the array element" do
|
432
|
-
expect( node.rm("mysql", "server", 0, "port") ).to eql(3456)
|
433
|
-
expect( node["mysql"]["server"][0]["port"] ).to be_nil
|
434
|
-
expect( node["mysql"]["server"][1]["port"] ).to eql(3456)
|
435
|
-
end
|
436
|
-
end
|
437
|
-
|
438
|
-
context "with real arrays" do
|
439
|
-
before do
|
440
|
-
node.role_default["mysql"]["server"] = [ {
|
441
|
-
"port" => 1234,
|
442
|
-
} ]
|
443
|
-
node.normal["mysql"]["server"] = [ {
|
444
|
-
"port" => 2345,
|
445
|
-
} ]
|
446
|
-
node.override["mysql"]["server"] = [ {
|
447
|
-
"port" => 3456,
|
448
|
-
} ]
|
449
|
-
end
|
450
|
-
|
451
|
-
it "deletes the array element" do
|
452
|
-
expect( node.rm("mysql", "server", 0, "port") ).to eql(3456)
|
453
|
-
expect( node["mysql"]["server"][0]["port"] ).to be_nil
|
454
|
-
end
|
455
|
-
|
456
|
-
it "does not have a horrible error message when mistaking arrays for hashes" do
|
457
|
-
expect { node.rm("mysql", "server", "port") }.to raise_error(TypeError, "Wrong type in index of attribute (did you use a Hash index on an Array?)")
|
458
|
-
end
|
459
|
-
end
|
460
|
-
end
|
461
|
-
|
462
|
-
describe "granular deleting attributes" do
|
463
|
-
context "when only defaults exist" do
|
464
|
-
before do
|
465
|
-
node.role_default["mysql"]["server"]["port"] = 1234
|
466
|
-
node.default["mysql"]["server"]["port"] = 2345
|
467
|
-
node.force_default["mysql"]["server"]["port"] = 3456
|
468
|
-
end
|
469
|
-
|
470
|
-
it "returns the deleted values" do
|
471
|
-
expect( node.rm_default("mysql", "server", "port") ).to eql(3456)
|
472
|
-
end
|
473
|
-
|
474
|
-
it "returns nil for the combined attribues" do
|
475
|
-
expect( node.rm_default("mysql", "server", "port") ).to eql(3456)
|
476
|
-
expect( node["mysql"]["server"]["port"] ).to eql(nil)
|
477
|
-
end
|
478
|
-
|
479
|
-
it "returns an empty hash for the default attrs" do
|
480
|
-
expect( node.rm_default("mysql", "server", "port") ).to eql(3456)
|
481
|
-
# this auto-vivifies, should it?
|
482
|
-
expect( node.default_attrs["mysql"]["server"]["port"] ).to eql({})
|
483
|
-
end
|
484
|
-
|
485
|
-
it "returns an empty hash after the last key is deleted" do
|
486
|
-
expect( node.rm_default("mysql", "server", "port") ).to eql(3456)
|
487
|
-
expect( node["mysql"]["server"] ).to eql({})
|
488
|
-
end
|
489
|
-
end
|
490
|
-
|
491
|
-
context "when trying to delete through a thing that isn't an array-like or hash-like object" do
|
492
|
-
before do
|
493
|
-
node.default["mysql"] = true
|
494
|
-
end
|
495
|
-
|
496
|
-
it "returns nil when you're two levels deeper" do
|
497
|
-
expect( node.rm_default("mysql", "server", "port") ).to eql(nil)
|
498
|
-
end
|
499
|
-
|
500
|
-
it "returns nil when you're one level deeper" do
|
501
|
-
expect( node.rm_default("mysql", "server") ).to eql(nil)
|
502
|
-
end
|
503
|
-
|
504
|
-
it "correctly deletes at the top level" do
|
505
|
-
expect( node.rm_default("mysql") ).to eql(true)
|
506
|
-
end
|
507
|
-
end
|
508
|
-
|
509
|
-
context "when a higher precedence exists" do
|
510
|
-
before do
|
511
|
-
node.role_default["mysql"]["server"]["port"] = 1234
|
512
|
-
node.default["mysql"]["server"]["port"] = 2345
|
513
|
-
node.force_default["mysql"]["server"]["port"] = 3456
|
514
|
-
|
515
|
-
node.override["mysql"]["server"]["port"] = 9999
|
516
|
-
end
|
517
|
-
|
518
|
-
it "returns the deleted values" do
|
519
|
-
expect( node.rm_default("mysql", "server", "port") ).to eql(3456)
|
520
|
-
end
|
521
|
-
|
522
|
-
it "returns the higher precedence values after the delete" do
|
523
|
-
expect( node.rm_default("mysql", "server", "port") ).to eql(3456)
|
524
|
-
expect( node["mysql"]["server"]["port"] ).to eql(9999)
|
525
|
-
end
|
526
|
-
|
527
|
-
it "returns an empty has for the default attrs" do
|
528
|
-
expect( node.rm_default("mysql", "server", "port") ).to eql(3456)
|
529
|
-
# this auto-vivifies, should it?
|
530
|
-
expect( node.default_attrs["mysql"]["server"]["port"] ).to eql({})
|
531
|
-
end
|
532
|
-
end
|
533
|
-
|
534
|
-
context "when a lower precedence exists" do
|
535
|
-
before do
|
536
|
-
node.default["mysql"]["server"]["port"] = 2345
|
537
|
-
node.override["mysql"]["server"]["port"] = 9999
|
538
|
-
node.role_override["mysql"]["server"]["port"] = 9876
|
539
|
-
node.force_override["mysql"]["server"]["port"] = 6669
|
540
|
-
end
|
541
|
-
|
542
|
-
it "returns the deleted values" do
|
543
|
-
expect( node.rm_override("mysql", "server", "port") ).to eql(6669)
|
544
|
-
end
|
545
|
-
|
546
|
-
it "returns the lower precedence levels after the delete" do
|
547
|
-
expect( node.rm_override("mysql", "server", "port") ).to eql(6669)
|
548
|
-
expect( node["mysql"]["server"]["port"] ).to eql(2345)
|
549
|
-
end
|
550
|
-
|
551
|
-
it "returns an empty has for the override attrs" do
|
552
|
-
expect( node.rm_override("mysql", "server", "port") ).to eql(6669)
|
553
|
-
# this auto-vivifies, should it?
|
554
|
-
expect( node.override_attrs["mysql"]["server"]["port"] ).to eql({})
|
555
|
-
end
|
556
|
-
end
|
557
|
-
|
558
|
-
it "rm_default returns nil on deleting non-existent values" do
|
559
|
-
expect( node.rm_default("no", "such", "thing") ).to be_nil
|
560
|
-
end
|
561
|
-
|
562
|
-
it "rm_normal returns nil on deleting non-existent values" do
|
563
|
-
expect( node.rm_normal("no", "such", "thing") ).to be_nil
|
564
|
-
end
|
565
|
-
|
566
|
-
it "rm_override returns nil on deleting non-existent values" do
|
567
|
-
expect( node.rm_override("no", "such", "thing") ).to be_nil
|
568
|
-
end
|
569
|
-
end
|
570
|
-
|
571
|
-
describe "granular replacing attributes" do
|
572
|
-
it "removes everything at the level of the last key" do
|
573
|
-
node.default["mysql"]["server"]["port"] = 2345
|
574
|
-
|
575
|
-
node.default!["mysql"]["server"] = { "data_dir" => "/my_raid_volume/lib/mysql" }
|
576
|
-
|
577
|
-
expect( node["mysql"]["server"] ).to eql({ "data_dir" => "/my_raid_volume/lib/mysql" })
|
578
|
-
end
|
579
|
-
|
580
|
-
it "replaces a value at the cookbook sub-level of the atributes only" do
|
581
|
-
node.default["mysql"]["server"]["port"] = 2345
|
582
|
-
node.default["mysql"]["server"]["service_name"] = "fancypants-sql"
|
583
|
-
node.role_default["mysql"]["server"]["port"] = 1234
|
584
|
-
node.force_default["mysql"]["server"]["port"] = 3456
|
585
|
-
|
586
|
-
node.default!["mysql"]["server"] = { "data_dir" => "/my_raid_volume/lib/mysql" }
|
587
|
-
|
588
|
-
expect( node["mysql"]["server"]["port"] ).to eql(3456)
|
589
|
-
expect( node["mysql"]["server"]["service_name"] ).to be_nil
|
590
|
-
expect( node["mysql"]["server"]["data_dir"] ).to eql("/my_raid_volume/lib/mysql")
|
591
|
-
expect( node["mysql"]["server"] ).to eql({ "port" => 3456, "data_dir" => "/my_raid_volume/lib/mysql" })
|
592
|
-
end
|
593
|
-
|
594
|
-
it "higher precedence values aren't removed" do
|
595
|
-
node.role_default["mysql"]["server"]["port"] = 1234
|
596
|
-
node.default["mysql"]["server"]["port"] = 2345
|
597
|
-
node.force_default["mysql"]["server"]["port"] = 3456
|
598
|
-
node.override["mysql"]["server"]["service_name"] = "fancypants-sql"
|
599
|
-
|
600
|
-
node.default!["mysql"]["server"] = { "data_dir" => "/my_raid_volume/lib/mysql" }
|
601
|
-
|
602
|
-
expect( node["mysql"]["server"]["port"] ).to eql(3456)
|
603
|
-
expect( node["mysql"]["server"]["data_dir"] ).to eql("/my_raid_volume/lib/mysql")
|
604
|
-
expect( node["mysql"]["server"] ).to eql({ "service_name" => "fancypants-sql", "port" => 3456, "data_dir" => "/my_raid_volume/lib/mysql" })
|
605
|
-
end
|
606
|
-
end
|
607
|
-
|
608
|
-
describe "granular force replacing attributes" do
|
609
|
-
it "removes everything at the level of the last key" do
|
610
|
-
node.force_default["mysql"]["server"]["port"] = 2345
|
611
|
-
|
612
|
-
node.force_default!["mysql"]["server"] = {
|
613
|
-
"data_dir" => "/my_raid_volume/lib/mysql",
|
614
|
-
}
|
615
|
-
|
616
|
-
expect( node["mysql"]["server"] ).to eql({
|
617
|
-
"data_dir" => "/my_raid_volume/lib/mysql",
|
618
|
-
})
|
619
|
-
end
|
620
|
-
|
621
|
-
it "removes all values from the precedence level when setting" do
|
622
|
-
node.role_default["mysql"]["server"]["port"] = 1234
|
623
|
-
node.default["mysql"]["server"]["port"] = 2345
|
624
|
-
node.force_default["mysql"]["server"]["port"] = 3456
|
625
|
-
|
626
|
-
node.force_default!["mysql"]["server"] = {
|
627
|
-
"data_dir" => "/my_raid_volume/lib/mysql",
|
628
|
-
}
|
629
|
-
|
630
|
-
expect( node["mysql"]["server"]["port"] ).to be_nil
|
631
|
-
expect( node["mysql"]["server"]["data_dir"] ).to eql("/my_raid_volume/lib/mysql")
|
632
|
-
expect( node["mysql"]["server"] ).to eql({
|
633
|
-
"data_dir" => "/my_raid_volume/lib/mysql",
|
634
|
-
})
|
635
|
-
end
|
636
|
-
|
637
|
-
it "higher precedence levels are not removed" do
|
638
|
-
node.role_default["mysql"]["server"]["port"] = 1234
|
639
|
-
node.default["mysql"]["server"]["port"] = 2345
|
640
|
-
node.force_default["mysql"]["server"]["port"] = 3456
|
641
|
-
node.override["mysql"]["server"]["service_name"] = "fancypants-sql"
|
642
|
-
|
643
|
-
node.force_default!["mysql"]["server"] = {
|
644
|
-
"data_dir" => "/my_raid_volume/lib/mysql",
|
645
|
-
}
|
646
|
-
|
647
|
-
expect( node["mysql"]["server"]["port"] ).to be_nil
|
648
|
-
expect( node["mysql"]["server"]["data_dir"] ).to eql("/my_raid_volume/lib/mysql")
|
649
|
-
expect( node["mysql"]["server"] ).to eql({
|
650
|
-
"service_name" => "fancypants-sql",
|
651
|
-
"data_dir" => "/my_raid_volume/lib/mysql",
|
652
|
-
})
|
653
|
-
end
|
654
|
-
|
655
|
-
it "will autovivify" do
|
656
|
-
node.force_default!["mysql"]["server"] = {
|
657
|
-
"data_dir" => "/my_raid_volume/lib/mysql",
|
658
|
-
}
|
659
|
-
expect( node["mysql"]["server"]["data_dir"] ).to eql("/my_raid_volume/lib/mysql")
|
660
|
-
end
|
661
|
-
|
662
|
-
it "lower precedence levels aren't removed" do
|
663
|
-
node.role_override["mysql"]["server"]["port"] = 1234
|
664
|
-
node.override["mysql"]["server"]["port"] = 2345
|
665
|
-
node.force_override["mysql"]["server"]["port"] = 3456
|
666
|
-
node.default["mysql"]["server"]["service_name"] = "fancypants-sql"
|
667
|
-
|
668
|
-
node.force_override!["mysql"]["server"] = {
|
669
|
-
"data_dir" => "/my_raid_volume/lib/mysql",
|
670
|
-
}
|
671
|
-
|
672
|
-
expect( node["mysql"]["server"]["port"] ).to be_nil
|
673
|
-
expect( node["mysql"]["server"]["data_dir"] ).to eql("/my_raid_volume/lib/mysql")
|
674
|
-
expect( node["mysql"]["server"] ).to eql({
|
675
|
-
"service_name" => "fancypants-sql",
|
676
|
-
"data_dir" => "/my_raid_volume/lib/mysql",
|
677
|
-
})
|
678
|
-
end
|
679
|
-
|
680
|
-
it "when overwriting a non-hash/array" do
|
681
|
-
node.override["mysql"] = false
|
682
|
-
node.force_override["mysql"] = true
|
683
|
-
node.force_override!["mysql"]["server"] = {
|
684
|
-
"data_dir" => "/my_raid_volume/lib/mysql",
|
685
|
-
}
|
686
|
-
expect( node["mysql"]["server"]["data_dir"] ).to eql("/my_raid_volume/lib/mysql")
|
687
|
-
end
|
688
|
-
|
689
|
-
it "when overwriting an array with a hash" do
|
690
|
-
node.force_override["mysql"][0] = true
|
691
|
-
node.force_override!["mysql"]["server"] = {
|
692
|
-
"data_dir" => "/my_raid_volume/lib/mysql",
|
693
|
-
}
|
694
|
-
expect( node["mysql"]["server"] ).to eql({
|
695
|
-
"data_dir" => "/my_raid_volume/lib/mysql",
|
696
|
-
})
|
697
|
-
end
|
698
|
-
end
|
699
|
-
|
700
|
-
# In Chef-12.0 there is a deep_merge cache on the top level attribute which had a bug
|
701
|
-
# where it cached node[:foo] separate from node['foo']. These tests exercise those edge conditions.
|
702
|
-
#
|
703
|
-
# https://github.com/opscode/chef/issues/2700
|
704
|
-
# https://github.com/opscode/chef/issues/2712
|
705
|
-
# https://github.com/opscode/chef/issues/2745
|
706
|
-
#
|
707
|
-
describe "deep merge attribute cache edge conditions" do
|
708
|
-
it "does not error with complicated attribute substitution" do
|
709
|
-
node.default["chef_attribute_hell"]["attr1"] = "attribute1"
|
710
|
-
node.default["chef_attribute_hell"]["attr2"] = "#{node.chef_attribute_hell.attr1}/attr2"
|
711
|
-
expect { node.default["chef_attribute_hell"]["attr3"] = "#{node.chef_attribute_hell.attr2}/attr3" }.not_to raise_error
|
712
|
-
end
|
713
|
-
|
714
|
-
it "caches both strings and symbols correctly" do
|
715
|
-
node.force_default[:solr][:version] = "4.10.2"
|
716
|
-
node.force_default[:solr][:data_dir] = "/opt/solr-#{node['solr'][:version]}/example/solr"
|
717
|
-
node.force_default[:solr][:xms] = "512M"
|
718
|
-
expect(node[:solr][:xms]).to eql("512M")
|
719
|
-
expect(node["solr"][:xms]).to eql("512M")
|
720
|
-
end
|
721
|
-
|
722
|
-
it "method interpolation syntax also works" do
|
723
|
-
node.default["passenger"]["version"] = "4.0.57"
|
724
|
-
node.default["passenger"]["root_path"] = "passenger-#{node['passenger']['version']}"
|
725
|
-
node.default["passenger"]["root_path_2"] = "passenger-#{node.passenger['version']}"
|
726
|
-
expect(node["passenger"]["root_path_2"]).to eql("passenger-4.0.57")
|
727
|
-
expect(node[:passenger]["root_path_2"]).to eql("passenger-4.0.57")
|
728
|
-
end
|
729
|
-
end
|
730
|
-
|
731
|
-
it "should raise an ArgumentError if you ask for an attribute that doesn't exist via method_missing" do
|
732
|
-
expect { node.sunshine }.to raise_error(NoMethodError)
|
733
|
-
end
|
734
|
-
|
735
|
-
it "should allow you to iterate over attributes with each_attribute" do
|
736
|
-
node.default.sunshine = "is bright"
|
737
|
-
node.default.canada = "is a nice place"
|
738
|
-
seen_attributes = Hash.new
|
739
|
-
node.each_attribute do |a, v|
|
740
|
-
seen_attributes[a] = v
|
741
|
-
end
|
742
|
-
expect(seen_attributes).to have_key("sunshine")
|
743
|
-
expect(seen_attributes).to have_key("canada")
|
744
|
-
expect(seen_attributes["sunshine"]).to eq("is bright")
|
745
|
-
expect(seen_attributes["canada"]).to eq("is a nice place")
|
746
|
-
end
|
747
|
-
end
|
748
|
-
|
749
|
-
describe "consuming json" do
|
750
|
-
|
751
|
-
before do
|
752
|
-
@ohai_data = { :platform => "foo", :platform_version => "bar" }
|
753
|
-
end
|
754
|
-
|
755
|
-
it "consumes the run list portion of a collection of attributes and returns the remainder" do
|
756
|
-
attrs = { "run_list" => [ "role[base]", "recipe[chef::server]" ], "foo" => "bar" }
|
757
|
-
expect(node.consume_run_list(attrs)).to eq({ "foo" => "bar" })
|
758
|
-
expect(node.run_list).to eq([ "role[base]", "recipe[chef::server]" ])
|
759
|
-
end
|
760
|
-
|
761
|
-
it "sets the node chef_environment" do
|
762
|
-
attrs = { "chef_environment" => "foo_environment", "bar" => "baz" }
|
763
|
-
expect(node.consume_chef_environment(attrs)).to eq({ "bar" => "baz" })
|
764
|
-
expect(node.chef_environment).to eq("foo_environment")
|
765
|
-
expect(node["chef_environment"]).to be nil
|
766
|
-
end
|
767
|
-
|
768
|
-
it "should overwrites the run list with the run list it consumes" do
|
769
|
-
node.consume_run_list "recipes" => %w{one two}
|
770
|
-
node.consume_run_list "recipes" => [ "three" ]
|
771
|
-
expect(node.run_list).to eq([ "three" ])
|
772
|
-
end
|
773
|
-
|
774
|
-
it "should not add duplicate recipes from the json attributes" do
|
775
|
-
node.run_list << "one"
|
776
|
-
node.consume_run_list "recipes" => %w{one two three}
|
777
|
-
expect(node.run_list).to eq(%w{one two three})
|
778
|
-
end
|
779
|
-
|
780
|
-
it "doesn't change the run list if no run_list is specified in the json" do
|
781
|
-
node.run_list << "role[database]"
|
782
|
-
node.consume_run_list "foo" => "bar"
|
783
|
-
expect(node.run_list).to eq(["role[database]"])
|
784
|
-
end
|
785
|
-
|
786
|
-
it "raises an exception if you provide both recipe and run_list attributes, since this is ambiguous" do
|
787
|
-
expect { node.consume_run_list "recipes" => "stuff", "run_list" => "other_stuff" }.to raise_error(Chef::Exceptions::AmbiguousRunlistSpecification)
|
788
|
-
end
|
789
|
-
|
790
|
-
it "should add json attributes to the node" do
|
791
|
-
node.consume_external_attrs(@ohai_data, { "one" => "two", "three" => "four" })
|
792
|
-
expect(node.one).to eql("two")
|
793
|
-
expect(node.three).to eql("four")
|
794
|
-
end
|
795
|
-
|
796
|
-
it "should set the tags attribute to an empty array if it is not already defined" do
|
797
|
-
node.consume_external_attrs(@ohai_data, {})
|
798
|
-
expect(node.tags).to eql([])
|
799
|
-
end
|
800
|
-
|
801
|
-
it "should not set the tags attribute to an empty array if it is already defined" do
|
802
|
-
node.tag("radiohead")
|
803
|
-
node.consume_external_attrs(@ohai_data, {})
|
804
|
-
expect(node.tags).to eql([ "radiohead" ])
|
805
|
-
end
|
806
|
-
|
807
|
-
it "should set the tags attribute to an empty array if it is nil" do
|
808
|
-
node.attributes.normal = { "tags" => nil }
|
809
|
-
node.consume_external_attrs(@ohai_data, {})
|
810
|
-
expect(node.tags).to eql([])
|
811
|
-
end
|
812
|
-
|
813
|
-
it "should return an array if it is fed a string" do
|
814
|
-
node.normal[:tags] = "string"
|
815
|
-
node.consume_external_attrs(@ohai_data, {})
|
816
|
-
expect(node.tags).to eql(["string"])
|
817
|
-
end
|
818
|
-
|
819
|
-
it "should return an array if it is fed a hash" do
|
820
|
-
node.normal[:tags] = {}
|
821
|
-
node.consume_external_attrs(@ohai_data, {})
|
822
|
-
expect(node.tags).to eql([])
|
823
|
-
end
|
824
|
-
|
825
|
-
it "deep merges attributes instead of overwriting them" do
|
826
|
-
node.consume_external_attrs(@ohai_data, "one" => { "two" => { "three" => "four" } })
|
827
|
-
expect(node.one.to_hash).to eq({ "two" => { "three" => "four" } })
|
828
|
-
node.consume_external_attrs(@ohai_data, "one" => { "abc" => "123" })
|
829
|
-
node.consume_external_attrs(@ohai_data, "one" => { "two" => { "foo" => "bar" } })
|
830
|
-
expect(node.one.to_hash).to eq({ "two" => { "three" => "four", "foo" => "bar" }, "abc" => "123" })
|
831
|
-
end
|
832
|
-
|
833
|
-
it "gives attributes from JSON priority when deep merging" do
|
834
|
-
node.consume_external_attrs(@ohai_data, "one" => { "two" => { "three" => "four" } })
|
835
|
-
expect(node.one.to_hash).to eq({ "two" => { "three" => "four" } })
|
836
|
-
node.consume_external_attrs(@ohai_data, "one" => { "two" => { "three" => "forty-two" } })
|
837
|
-
expect(node.one.to_hash).to eq({ "two" => { "three" => "forty-two" } })
|
838
|
-
end
|
839
|
-
|
840
|
-
end
|
841
|
-
|
842
|
-
describe "preparing for a chef client run" do
|
843
|
-
before do
|
844
|
-
@ohai_data = { :platform => "foobuntu", :platform_version => "23.42" }
|
845
|
-
end
|
846
|
-
|
847
|
-
it "sets its platform according to platform detection" do
|
848
|
-
node.consume_external_attrs(@ohai_data, {})
|
849
|
-
expect(node.automatic_attrs[:platform]).to eq("foobuntu")
|
850
|
-
expect(node.automatic_attrs[:platform_version]).to eq("23.42")
|
851
|
-
end
|
852
|
-
|
853
|
-
it "consumes the run list from provided json attributes" do
|
854
|
-
node.consume_external_attrs(@ohai_data, { "run_list" => ["recipe[unicorn]"] })
|
855
|
-
expect(node.run_list).to eq(["recipe[unicorn]"])
|
856
|
-
end
|
857
|
-
|
858
|
-
it "saves non-runlist json attrs for later" do
|
859
|
-
expansion = Chef::RunList::RunListExpansion.new("_default", [])
|
860
|
-
allow(node.run_list).to receive(:expand).and_return(expansion)
|
861
|
-
node.consume_external_attrs(@ohai_data, { "foo" => "bar" })
|
862
|
-
node.expand!
|
863
|
-
expect(node.normal_attrs).to eq({ "foo" => "bar", "tags" => [] })
|
864
|
-
end
|
865
|
-
|
866
|
-
end
|
867
|
-
|
868
|
-
describe "when expanding its run list and merging attributes" do
|
869
|
-
before do
|
870
|
-
@environment = Chef::Environment.new.tap do |e|
|
871
|
-
e.name("rspec_env")
|
872
|
-
e.default_attributes("env default key" => "env default value")
|
873
|
-
e.override_attributes("env override key" => "env override value")
|
874
|
-
end
|
875
|
-
expect(Chef::Environment).to receive(:load).with("rspec_env").and_return(@environment)
|
876
|
-
@expansion = Chef::RunList::RunListExpansion.new("rspec_env", [])
|
877
|
-
node.chef_environment("rspec_env")
|
878
|
-
allow(node.run_list).to receive(:expand).and_return(@expansion)
|
879
|
-
end
|
880
|
-
|
881
|
-
it "sets the 'recipes' automatic attribute to the recipes in the expanded run_list" do
|
882
|
-
@expansion.recipes << "recipe[chef::client]" << "recipe[nginx::default]"
|
883
|
-
node.expand!
|
884
|
-
expect(node.automatic_attrs[:recipes]).to eq(["recipe[chef::client]", "recipe[nginx::default]"])
|
885
|
-
end
|
886
|
-
|
887
|
-
it "sets the 'roles' automatic attribute to the expanded role list" do
|
888
|
-
@expansion.instance_variable_set(:@applied_roles, { "arf" => nil, "countersnark" => nil })
|
889
|
-
node.expand!
|
890
|
-
expect(node.automatic_attrs[:roles].sort).to eq(%w{arf countersnark})
|
891
|
-
end
|
892
|
-
|
893
|
-
it "applies default attributes from the environment as environment defaults" do
|
894
|
-
node.expand!
|
895
|
-
expect(node.attributes.env_default["env default key"]).to eq("env default value")
|
896
|
-
end
|
897
|
-
|
898
|
-
it "applies override attributes from the environment as env overrides" do
|
899
|
-
node.expand!
|
900
|
-
expect(node.attributes.env_override["env override key"]).to eq("env override value")
|
901
|
-
end
|
902
|
-
|
903
|
-
it "applies default attributes from roles as role defaults" do
|
904
|
-
@expansion.default_attrs["role default key"] = "role default value"
|
905
|
-
node.expand!
|
906
|
-
expect(node.attributes.role_default["role default key"]).to eq("role default value")
|
907
|
-
end
|
908
|
-
|
909
|
-
it "applies override attributes from roles as role overrides" do
|
910
|
-
@expansion.override_attrs["role override key"] = "role override value"
|
911
|
-
node.expand!
|
912
|
-
expect(node.attributes.role_override["role override key"]).to eq("role override value")
|
913
|
-
end
|
914
|
-
end
|
915
|
-
|
916
|
-
describe "loaded_recipe" do
|
917
|
-
it "should not add a recipe that is already in the recipes list" do
|
918
|
-
node.automatic_attrs[:recipes] = [ "nginx::module" ]
|
919
|
-
node.loaded_recipe(:nginx, "module")
|
920
|
-
expect(node.automatic_attrs[:recipes].length).to eq(1)
|
921
|
-
end
|
922
|
-
|
923
|
-
it "should add a recipe that is not already in the recipes list" do
|
924
|
-
node.automatic_attrs[:recipes] = [ "nginx::other_module" ]
|
925
|
-
node.loaded_recipe(:nginx, "module")
|
926
|
-
expect(node.automatic_attrs[:recipes].length).to eq(2)
|
927
|
-
expect(node.recipe?("nginx::module")).to be true
|
928
|
-
expect(node.recipe?("nginx::other_module")).to be true
|
929
|
-
end
|
930
|
-
end
|
931
|
-
|
932
|
-
describe "when querying for recipes in the run list" do
|
933
|
-
context "when a recipe is in the top level run list" do
|
934
|
-
before do
|
935
|
-
node.run_list << "recipe[nginx::module]"
|
936
|
-
end
|
937
|
-
|
938
|
-
it "finds the recipe" do
|
939
|
-
expect(node.recipe?("nginx::module")).to be true
|
940
|
-
end
|
941
|
-
|
942
|
-
it "does not find a recipe not in the run list" do
|
943
|
-
expect(node.recipe?("nginx::other_module")).to be false
|
944
|
-
end
|
945
|
-
end
|
946
|
-
context "when a recipe is in the expanded run list only" do
|
947
|
-
before do
|
948
|
-
node.run_list << "role[base]"
|
949
|
-
node.automatic_attrs[:recipes] = [ "nginx::module" ]
|
950
|
-
end
|
951
|
-
|
952
|
-
it "finds a recipe in the expanded run list" do
|
953
|
-
expect(node.recipe?("nginx::module")).to be true
|
954
|
-
end
|
955
|
-
|
956
|
-
it "does not find a recipe that's not in the run list" do
|
957
|
-
expect(node.recipe?("nginx::other_module")).to be false
|
958
|
-
end
|
959
|
-
end
|
960
|
-
end
|
961
|
-
|
962
|
-
describe "when clearing computed state at the beginning of a run" do
|
963
|
-
before do
|
964
|
-
node.default[:foo] = "default"
|
965
|
-
node.normal[:foo] = "normal"
|
966
|
-
node.override[:foo] = "override"
|
967
|
-
node.reset_defaults_and_overrides
|
968
|
-
end
|
969
|
-
|
970
|
-
it "removes default attributes" do
|
971
|
-
expect(node.default).to be_empty
|
972
|
-
end
|
973
|
-
|
974
|
-
it "removes override attributes" do
|
975
|
-
expect(node.override).to be_empty
|
976
|
-
end
|
977
|
-
|
978
|
-
it "leaves normal level attributes untouched" do
|
979
|
-
expect(node[:foo]).to eq("normal")
|
980
|
-
end
|
981
|
-
|
982
|
-
end
|
983
|
-
|
984
|
-
describe "when merging environment attributes" do
|
985
|
-
before do
|
986
|
-
node.chef_environment = "rspec"
|
987
|
-
@expansion = Chef::RunList::RunListExpansion.new("rspec", [])
|
988
|
-
@expansion.default_attrs.replace({ :default => "from role", :d_role => "role only" })
|
989
|
-
@expansion.override_attrs.replace({ :override => "from role", :o_role => "role only" })
|
990
|
-
|
991
|
-
@environment = Chef::Environment.new
|
992
|
-
@environment.default_attributes = { :default => "from env", :d_env => "env only" }
|
993
|
-
@environment.override_attributes = { :override => "from env", :o_env => "env only" }
|
994
|
-
allow(Chef::Environment).to receive(:load).and_return(@environment)
|
995
|
-
node.apply_expansion_attributes(@expansion)
|
996
|
-
end
|
997
|
-
|
998
|
-
it "does not nuke role-only default attrs" do
|
999
|
-
expect(node[:d_role]).to eq("role only")
|
1000
|
-
end
|
1001
|
-
|
1002
|
-
it "does not nuke role-only override attrs" do
|
1003
|
-
expect(node[:o_role]).to eq("role only")
|
1004
|
-
end
|
1005
|
-
|
1006
|
-
it "does not nuke env-only default attrs" do
|
1007
|
-
expect(node[:o_env]).to eq("env only")
|
1008
|
-
end
|
1009
|
-
|
1010
|
-
it "does not nuke role-only override attrs" do
|
1011
|
-
expect(node[:o_env]).to eq("env only")
|
1012
|
-
end
|
1013
|
-
|
1014
|
-
it "gives role defaults precedence over env defaults" do
|
1015
|
-
expect(node[:default]).to eq("from role")
|
1016
|
-
end
|
1017
|
-
|
1018
|
-
it "gives env overrides precedence over role overrides" do
|
1019
|
-
expect(node[:override]).to eq("from env")
|
1020
|
-
end
|
1021
|
-
end
|
1022
|
-
|
1023
|
-
describe "when evaluating attributes files" do
|
1024
|
-
before do
|
1025
|
-
@cookbook_repo = File.expand_path(File.join(CHEF_SPEC_DATA, "cookbooks"))
|
1026
|
-
@cookbook_loader = Chef::CookbookLoader.new(@cookbook_repo)
|
1027
|
-
@cookbook_loader.load_cookbooks
|
1028
|
-
|
1029
|
-
@cookbook_collection = Chef::CookbookCollection.new(@cookbook_loader.cookbooks_by_name)
|
1030
|
-
|
1031
|
-
@events = Chef::EventDispatch::Dispatcher.new
|
1032
|
-
@run_context = Chef::RunContext.new(node, @cookbook_collection, @events)
|
1033
|
-
|
1034
|
-
node.include_attribute("openldap::default")
|
1035
|
-
node.include_attribute("openldap::smokey")
|
1036
|
-
end
|
1037
|
-
|
1038
|
-
it "sets attributes from the files" do
|
1039
|
-
expect(node.ldap_server).to eql("ops1prod")
|
1040
|
-
expect(node.ldap_basedn).to eql("dc=hjksolutions,dc=com")
|
1041
|
-
expect(node.ldap_replication_password).to eql("forsure")
|
1042
|
-
expect(node.smokey).to eql("robinson")
|
1043
|
-
end
|
1044
|
-
|
1045
|
-
it "gives a sensible error when attempting to load a missing attributes file" do
|
1046
|
-
expect { node.include_attribute("nope-this::doesnt-exist") }.to raise_error(Chef::Exceptions::CookbookNotFound)
|
1047
|
-
end
|
1048
|
-
end
|
1049
|
-
|
1050
|
-
describe "roles" do
|
1051
|
-
it "should allow you to query whether or not it has a recipe applied with role?" do
|
1052
|
-
node.run_list << "role[sunrise]"
|
1053
|
-
expect(node.role?("sunrise")).to eql(true)
|
1054
|
-
expect(node.role?("not at home")).to eql(false)
|
1055
|
-
end
|
1056
|
-
|
1057
|
-
it "should allow you to set roles with arguments" do
|
1058
|
-
node.run_list << "role[one]"
|
1059
|
-
node.run_list << "role[two]"
|
1060
|
-
expect(node.role?("one")).to eql(true)
|
1061
|
-
expect(node.role?("two")).to eql(true)
|
1062
|
-
end
|
1063
|
-
end
|
1064
|
-
|
1065
|
-
describe "run_list" do
|
1066
|
-
it "should have a Chef::RunList of recipes and roles that should be applied" do
|
1067
|
-
expect(node.run_list).to be_a_kind_of(Chef::RunList)
|
1068
|
-
end
|
1069
|
-
|
1070
|
-
it "should allow you to query the run list with arguments" do
|
1071
|
-
node.run_list "recipe[baz]"
|
1072
|
-
expect(node.run_list?("recipe[baz]")).to eql(true)
|
1073
|
-
end
|
1074
|
-
|
1075
|
-
it "should allow you to set the run list with arguments" do
|
1076
|
-
node.run_list "recipe[baz]", "role[foo]"
|
1077
|
-
expect(node.run_list?("recipe[baz]")).to eql(true)
|
1078
|
-
expect(node.run_list?("role[foo]")).to eql(true)
|
1079
|
-
end
|
1080
|
-
end
|
1081
|
-
|
1082
|
-
describe "from file" do
|
1083
|
-
it "should load a node from a ruby file" do
|
1084
|
-
node.from_file(File.expand_path(File.join(CHEF_SPEC_DATA, "nodes", "test.rb")))
|
1085
|
-
expect(node.name).to eql("test.example.com-short")
|
1086
|
-
expect(node.sunshine).to eql("in")
|
1087
|
-
expect(node.something).to eql("else")
|
1088
|
-
expect(node.run_list).to eq(["operations-master", "operations-monitoring"])
|
1089
|
-
end
|
1090
|
-
|
1091
|
-
it "should raise an exception if the file cannot be found or read" do
|
1092
|
-
expect { node.from_file("/tmp/monkeydiving") }.to raise_error(IOError)
|
1093
|
-
end
|
1094
|
-
end
|
1095
|
-
|
1096
|
-
describe "update_from!" do
|
1097
|
-
before(:each) do
|
1098
|
-
node.name("orig")
|
1099
|
-
node.chef_environment("dev")
|
1100
|
-
node.default_attrs = { "one" => { "two" => "three", "four" => "five", "eight" => "nine" } }
|
1101
|
-
node.override_attrs = { "one" => { "two" => "three", "four" => "six" } }
|
1102
|
-
node.normal_attrs = { "one" => { "two" => "seven" } }
|
1103
|
-
node.run_list << "role[marxist]"
|
1104
|
-
node.run_list << "role[leninist]"
|
1105
|
-
node.run_list << "recipe[stalinist]"
|
1106
|
-
|
1107
|
-
@example = Chef::Node.new()
|
1108
|
-
@example.name("newname")
|
1109
|
-
@example.chef_environment("prod")
|
1110
|
-
@example.default_attrs = { "alpha" => { "bravo" => "charlie", "delta" => "echo" } }
|
1111
|
-
@example.override_attrs = { "alpha" => { "bravo" => "foxtrot", "delta" => "golf" } }
|
1112
|
-
@example.normal_attrs = { "alpha" => { "bravo" => "hotel" } }
|
1113
|
-
@example.run_list << "role[comedy]"
|
1114
|
-
@example.run_list << "role[drama]"
|
1115
|
-
@example.run_list << "recipe[mystery]"
|
1116
|
-
end
|
1117
|
-
|
1118
|
-
it "allows update of everything except name" do
|
1119
|
-
node.update_from!(@example)
|
1120
|
-
expect(node.name).to eq("orig")
|
1121
|
-
expect(node.chef_environment).to eq(@example.chef_environment)
|
1122
|
-
expect(node.default_attrs).to eq(@example.default_attrs)
|
1123
|
-
expect(node.override_attrs).to eq(@example.override_attrs)
|
1124
|
-
expect(node.normal_attrs).to eq(@example.normal_attrs)
|
1125
|
-
expect(node.run_list).to eq(@example.run_list)
|
1126
|
-
end
|
1127
|
-
|
1128
|
-
it "should not update the name of the node" do
|
1129
|
-
expect(node).not_to receive(:name).with(@example.name)
|
1130
|
-
node.update_from!(@example)
|
1131
|
-
end
|
1132
|
-
end
|
1133
|
-
|
1134
|
-
describe "to_hash" do
|
1135
|
-
it "should serialize itself as a hash" do
|
1136
|
-
node.chef_environment("dev")
|
1137
|
-
node.default_attrs = { "one" => { "two" => "three", "four" => "five", "eight" => "nine" } }
|
1138
|
-
node.override_attrs = { "one" => { "two" => "three", "four" => "six" } }
|
1139
|
-
node.normal_attrs = { "one" => { "two" => "seven" } }
|
1140
|
-
node.run_list << "role[marxist]"
|
1141
|
-
node.run_list << "role[leninist]"
|
1142
|
-
node.run_list << "recipe[stalinist]"
|
1143
|
-
h = node.to_hash
|
1144
|
-
expect(h["one"]["two"]).to eq("three")
|
1145
|
-
expect(h["one"]["four"]).to eq("six")
|
1146
|
-
expect(h["one"]["eight"]).to eq("nine")
|
1147
|
-
expect(h["role"]).to be_include("marxist")
|
1148
|
-
expect(h["role"]).to be_include("leninist")
|
1149
|
-
expect(h["run_list"]).to be_include("role[marxist]")
|
1150
|
-
expect(h["run_list"]).to be_include("role[leninist]")
|
1151
|
-
expect(h["run_list"]).to be_include("recipe[stalinist]")
|
1152
|
-
expect(h["chef_environment"]).to eq("dev")
|
1153
|
-
end
|
1154
|
-
|
1155
|
-
it "should return an empty array for empty run_list" do
|
1156
|
-
expect(node.to_hash["run_list"]).to eq([])
|
1157
|
-
end
|
1158
|
-
end
|
1159
|
-
|
1160
|
-
describe "converting to or from json" do
|
1161
|
-
it "should serialize itself as json", :json => true do
|
1162
|
-
node.from_file(File.expand_path("nodes/test.example.com.rb", CHEF_SPEC_DATA))
|
1163
|
-
json = Chef::JSONCompat.to_json(node)
|
1164
|
-
expect(json).to match(/json_class/)
|
1165
|
-
expect(json).to match(/name/)
|
1166
|
-
expect(json).to match(/chef_environment/)
|
1167
|
-
expect(json).to match(/normal/)
|
1168
|
-
expect(json).to match(/default/)
|
1169
|
-
expect(json).to match(/override/)
|
1170
|
-
expect(json).to match(/run_list/)
|
1171
|
-
end
|
1172
|
-
|
1173
|
-
it "should serialize valid json with a run list", :json => true do
|
1174
|
-
#This test came about because activesupport mucks with Chef json serialization
|
1175
|
-
#Test should pass with and without Activesupport
|
1176
|
-
node.run_list << { "type" => "role", "name" => "Cthulu" }
|
1177
|
-
node.run_list << { "type" => "role", "name" => "Hastur" }
|
1178
|
-
json = Chef::JSONCompat.to_json(node)
|
1179
|
-
expect(json).to match(/\"run_list\":\[\"role\[Cthulu\]\",\"role\[Hastur\]\"\]/)
|
1180
|
-
end
|
1181
|
-
|
1182
|
-
it "should serialize the correct run list", :json => true do
|
1183
|
-
node.run_list << "role[marxist]"
|
1184
|
-
node.run_list << "role[leninist]"
|
1185
|
-
node.override_runlist << "role[stalinist]"
|
1186
|
-
expect(node.run_list).to be_include("role[stalinist]")
|
1187
|
-
json = Chef::JSONCompat.to_json(node)
|
1188
|
-
expect(json).to match(/\"run_list\":\[\"role\[marxist\]\",\"role\[leninist\]\"\]/)
|
1189
|
-
end
|
1190
|
-
|
1191
|
-
it "merges the override components into a combined override object" do
|
1192
|
-
node.attributes.role_override["role override"] = "role override"
|
1193
|
-
node.attributes.env_override["env override"] = "env override"
|
1194
|
-
node_for_json = node.for_json
|
1195
|
-
expect(node_for_json["override"]["role override"]).to eq("role override")
|
1196
|
-
expect(node_for_json["override"]["env override"]).to eq("env override")
|
1197
|
-
end
|
1198
|
-
|
1199
|
-
it "merges the default components into a combined default object" do
|
1200
|
-
node.attributes.role_default["role default"] = "role default"
|
1201
|
-
node.attributes.env_default["env default"] = "env default"
|
1202
|
-
node_for_json = node.for_json
|
1203
|
-
expect(node_for_json["default"]["role default"]).to eq("role default")
|
1204
|
-
expect(node_for_json["default"]["env default"]).to eq("env default")
|
1205
|
-
end
|
1206
|
-
|
1207
|
-
it "should deserialize itself from json", :json => true do
|
1208
|
-
node.from_file(File.expand_path("nodes/test.example.com.rb", CHEF_SPEC_DATA))
|
1209
|
-
json = Chef::JSONCompat.to_json(node)
|
1210
|
-
serialized_node = Chef::Node.from_hash(Chef::JSONCompat.parse(json))
|
1211
|
-
expect(serialized_node).to be_a_kind_of(Chef::Node)
|
1212
|
-
expect(serialized_node.name).to eql(node.name)
|
1213
|
-
expect(serialized_node.chef_environment).to eql(node.chef_environment)
|
1214
|
-
node.each_attribute do |k, v|
|
1215
|
-
expect(serialized_node[k]).to eql(v)
|
1216
|
-
end
|
1217
|
-
expect(serialized_node.run_list).to eq(node.run_list)
|
1218
|
-
end
|
1219
|
-
|
1220
|
-
context "when policyfile attributes are not present" do
|
1221
|
-
|
1222
|
-
it "does not have a policy_name key in the json" do
|
1223
|
-
expect(node.for_json.keys).to_not include("policy_name")
|
1224
|
-
end
|
1225
|
-
|
1226
|
-
it "does not have a policy_group key in the json" do
|
1227
|
-
expect(node.for_json.keys).to_not include("policy_name")
|
1228
|
-
end
|
1229
|
-
end
|
1230
|
-
|
1231
|
-
context "when policyfile attributes are present" do
|
1232
|
-
|
1233
|
-
before do
|
1234
|
-
node.policy_name = "my-application"
|
1235
|
-
node.policy_group = "staging"
|
1236
|
-
end
|
1237
|
-
|
1238
|
-
it "includes policy_name key in the json" do
|
1239
|
-
expect(node.for_json).to have_key("policy_name")
|
1240
|
-
expect(node.for_json["policy_name"]).to eq("my-application")
|
1241
|
-
end
|
1242
|
-
|
1243
|
-
it "includes a policy_group key in the json" do
|
1244
|
-
expect(node.for_json).to have_key("policy_group")
|
1245
|
-
expect(node.for_json["policy_group"]).to eq("staging")
|
1246
|
-
end
|
1247
|
-
|
1248
|
-
it "parses policyfile attributes from JSON" do
|
1249
|
-
round_tripped_node = Chef::Node.from_hash(node.for_json)
|
1250
|
-
|
1251
|
-
expect(round_tripped_node.policy_name).to eq("my-application")
|
1252
|
-
expect(round_tripped_node.policy_group).to eq("staging")
|
1253
|
-
end
|
1254
|
-
|
1255
|
-
end
|
1256
|
-
|
1257
|
-
include_examples "to_json equivalent to Chef::JSONCompat.to_json" do
|
1258
|
-
let(:jsonable) {
|
1259
|
-
node.from_file(File.expand_path("nodes/test.example.com.rb", CHEF_SPEC_DATA))
|
1260
|
-
node
|
1261
|
-
}
|
1262
|
-
end
|
1263
|
-
end
|
1264
|
-
|
1265
|
-
describe "to_s" do
|
1266
|
-
it "should turn into a string like node[name]" do
|
1267
|
-
node.name("airplane")
|
1268
|
-
expect(node.to_s).to eql("node[airplane]")
|
1269
|
-
end
|
1270
|
-
end
|
1271
|
-
|
1272
|
-
describe "api model" do
|
1273
|
-
before(:each) do
|
1274
|
-
@rest = double("Chef::ServerAPI")
|
1275
|
-
allow(Chef::ServerAPI).to receive(:new).and_return(@rest)
|
1276
|
-
@query = double("Chef::Search::Query")
|
1277
|
-
allow(Chef::Search::Query).to receive(:new).and_return(@query)
|
1278
|
-
end
|
1279
|
-
|
1280
|
-
describe "list" do
|
1281
|
-
describe "inflated" do
|
1282
|
-
it "should return a hash of node names and objects" do
|
1283
|
-
n1 = double("Chef::Node", :name => "one")
|
1284
|
-
allow(n1).to receive(:kind_of?).with(Chef::Node) { true }
|
1285
|
-
expect(@query).to receive(:search).with(:node).and_yield(n1)
|
1286
|
-
r = Chef::Node.list(true)
|
1287
|
-
expect(r["one"]).to eq(n1)
|
1288
|
-
end
|
1289
|
-
end
|
1290
|
-
|
1291
|
-
it "should return a hash of node names and urls" do
|
1292
|
-
expect(@rest).to receive(:get).and_return({ "one" => "http://foo" })
|
1293
|
-
r = Chef::Node.list
|
1294
|
-
expect(r["one"]).to eq("http://foo")
|
1295
|
-
end
|
1296
|
-
end
|
1297
|
-
|
1298
|
-
describe "load" do
|
1299
|
-
it "should load a node by name" do
|
1300
|
-
node.from_file(File.expand_path("nodes/test.example.com.rb", CHEF_SPEC_DATA))
|
1301
|
-
json = Chef::JSONCompat.to_json(node)
|
1302
|
-
parsed = Chef::JSONCompat.parse(json)
|
1303
|
-
expect(@rest).to receive(:get).with("nodes/test.example.com").and_return(parsed)
|
1304
|
-
serialized_node = Chef::Node.load("test.example.com")
|
1305
|
-
expect(serialized_node).to be_a_kind_of(Chef::Node)
|
1306
|
-
expect(serialized_node.name).to eql(node.name)
|
1307
|
-
end
|
1308
|
-
end
|
1309
|
-
|
1310
|
-
describe "destroy" do
|
1311
|
-
it "should destroy a node" do
|
1312
|
-
expect(@rest).to receive(:delete).with("nodes/monkey").and_return("foo")
|
1313
|
-
node.name("monkey")
|
1314
|
-
node.destroy
|
1315
|
-
end
|
1316
|
-
end
|
1317
|
-
|
1318
|
-
describe "save" do
|
1319
|
-
it "should update a node if it already exists" do
|
1320
|
-
node.name("monkey")
|
1321
|
-
allow(node).to receive(:data_for_save).and_return({})
|
1322
|
-
expect(@rest).to receive(:put).with("nodes/monkey", {}).and_return("foo")
|
1323
|
-
node.save
|
1324
|
-
end
|
1325
|
-
|
1326
|
-
it "should not try and create if it can update" do
|
1327
|
-
node.name("monkey")
|
1328
|
-
allow(node).to receive(:data_for_save).and_return({})
|
1329
|
-
expect(@rest).to receive(:put).with("nodes/monkey", {}).and_return("foo")
|
1330
|
-
expect(@rest).not_to receive(:post)
|
1331
|
-
node.save
|
1332
|
-
end
|
1333
|
-
|
1334
|
-
it "should create if it cannot update" do
|
1335
|
-
node.name("monkey")
|
1336
|
-
allow(node).to receive(:data_for_save).and_return({})
|
1337
|
-
exception = double("404 error", :code => "404")
|
1338
|
-
expect(@rest).to receive(:put).and_raise(Net::HTTPServerException.new("foo", exception))
|
1339
|
-
expect(@rest).to receive(:post).with("nodes", {})
|
1340
|
-
node.save
|
1341
|
-
end
|
1342
|
-
|
1343
|
-
describe "when whyrun mode is enabled" do
|
1344
|
-
before do
|
1345
|
-
Chef::Config[:why_run] = true
|
1346
|
-
end
|
1347
|
-
after do
|
1348
|
-
Chef::Config[:why_run] = false
|
1349
|
-
end
|
1350
|
-
it "should not save" do
|
1351
|
-
node.name("monkey")
|
1352
|
-
expect(@rest).not_to receive(:put)
|
1353
|
-
expect(@rest).not_to receive(:post)
|
1354
|
-
node.save
|
1355
|
-
end
|
1356
|
-
end
|
1357
|
-
|
1358
|
-
context "with whitelisted attributes configured" do
|
1359
|
-
it "should only save whitelisted attributes (and subattributes)" do
|
1360
|
-
Chef::Config[:automatic_attribute_whitelist] = [
|
1361
|
-
["filesystem", "/dev/disk0s2"],
|
1362
|
-
"network/interfaces/eth0",
|
1363
|
-
]
|
1364
|
-
|
1365
|
-
data = {
|
1366
|
-
"automatic" => {
|
1367
|
-
"filesystem" => {
|
1368
|
-
"/dev/disk0s2" => { "size" => "10mb" },
|
1369
|
-
"map - autohome" => { "size" => "10mb" },
|
1370
|
-
},
|
1371
|
-
"network" => {
|
1372
|
-
"interfaces" => {
|
1373
|
-
"eth0" => {},
|
1374
|
-
"eth1" => {},
|
1375
|
-
},
|
1376
|
-
},
|
1377
|
-
},
|
1378
|
-
"default" => {}, "normal" => {}, "override" => {}
|
1379
|
-
}
|
1380
|
-
|
1381
|
-
selected_data = {
|
1382
|
-
"automatic" => {
|
1383
|
-
"filesystem" => {
|
1384
|
-
"/dev/disk0s2" => { "size" => "10mb" },
|
1385
|
-
},
|
1386
|
-
"network" => {
|
1387
|
-
"interfaces" => {
|
1388
|
-
"eth0" => {},
|
1389
|
-
},
|
1390
|
-
},
|
1391
|
-
},
|
1392
|
-
"default" => {}, "normal" => {}, "override" => {}
|
1393
|
-
}
|
1394
|
-
|
1395
|
-
node.name("picky-monkey")
|
1396
|
-
allow(node).to receive(:for_json).and_return(data)
|
1397
|
-
expect(@rest).to receive(:put).with("nodes/picky-monkey", selected_data).and_return("foo")
|
1398
|
-
node.save
|
1399
|
-
end
|
1400
|
-
|
1401
|
-
it "should save false-y whitelisted attributes" do
|
1402
|
-
Chef::Config[:default_attribute_whitelist] = [
|
1403
|
-
"foo/bar/baz",
|
1404
|
-
]
|
1405
|
-
|
1406
|
-
data = {
|
1407
|
-
"default" => {
|
1408
|
-
"foo" => {
|
1409
|
-
"bar" => {
|
1410
|
-
"baz" => false,
|
1411
|
-
},
|
1412
|
-
"other" => {
|
1413
|
-
"stuff" => true,
|
1414
|
-
},
|
1415
|
-
},
|
1416
|
-
},
|
1417
|
-
}
|
1418
|
-
|
1419
|
-
selected_data = {
|
1420
|
-
"default" => {
|
1421
|
-
"foo" => {
|
1422
|
-
"bar" => {
|
1423
|
-
"baz" => false,
|
1424
|
-
},
|
1425
|
-
},
|
1426
|
-
},
|
1427
|
-
}
|
1428
|
-
|
1429
|
-
node.name("falsey-monkey")
|
1430
|
-
allow(node).to receive(:for_json).and_return(data)
|
1431
|
-
expect(@rest).to receive(:put).with("nodes/falsey-monkey", selected_data).and_return("foo")
|
1432
|
-
node.save
|
1433
|
-
end
|
1434
|
-
|
1435
|
-
it "should not save any attributes if the whitelist is empty" do
|
1436
|
-
Chef::Config[:automatic_attribute_whitelist] = []
|
1437
|
-
|
1438
|
-
data = {
|
1439
|
-
"automatic" => {
|
1440
|
-
"filesystem" => {
|
1441
|
-
"/dev/disk0s2" => { "size" => "10mb" },
|
1442
|
-
"map - autohome" => { "size" => "10mb" },
|
1443
|
-
},
|
1444
|
-
},
|
1445
|
-
"default" => {}, "normal" => {}, "override" => {}
|
1446
|
-
}
|
1447
|
-
|
1448
|
-
selected_data = {
|
1449
|
-
"automatic" => {}, "default" => {}, "normal" => {}, "override" => {}
|
1450
|
-
}
|
1451
|
-
|
1452
|
-
node.name("picky-monkey")
|
1453
|
-
allow(node).to receive(:for_json).and_return(data)
|
1454
|
-
expect(@rest).to receive(:put).with("nodes/picky-monkey", selected_data).and_return("foo")
|
1455
|
-
node.save
|
1456
|
-
end
|
1457
|
-
end
|
1458
|
-
|
1459
|
-
context "when policyfile attributes are present" do
|
1460
|
-
|
1461
|
-
before do
|
1462
|
-
node.name("example-node")
|
1463
|
-
node.policy_name = "my-application"
|
1464
|
-
node.policy_group = "staging"
|
1465
|
-
end
|
1466
|
-
|
1467
|
-
context "and the server supports policyfile attributes in node JSON" do
|
1468
|
-
|
1469
|
-
it "creates the object normally" do
|
1470
|
-
expect(@rest).to receive(:post).with("nodes", node.for_json)
|
1471
|
-
node.create
|
1472
|
-
end
|
1473
|
-
|
1474
|
-
it "saves the node object normally" do
|
1475
|
-
expect(@rest).to receive(:put).with("nodes/example-node", node.for_json)
|
1476
|
-
node.save
|
1477
|
-
end
|
1478
|
-
end
|
1479
|
-
|
1480
|
-
# Chef Server before 12.3
|
1481
|
-
context "and the Chef Server does not support policyfile attributes in node JSON" do
|
1482
|
-
|
1483
|
-
let(:response_body) { %q[{"error":["Invalid key policy_name in request body"]}] }
|
1484
|
-
|
1485
|
-
let(:response) do
|
1486
|
-
Net::HTTPResponse.send(:response_class, "400").new("1.0", "400", "Bad Request").tap do |r|
|
1487
|
-
allow(r).to receive(:body).and_return(response_body)
|
1488
|
-
end
|
1489
|
-
end
|
1490
|
-
|
1491
|
-
let(:http_exception) do
|
1492
|
-
begin
|
1493
|
-
response.error!
|
1494
|
-
rescue => e
|
1495
|
-
e
|
1496
|
-
end
|
1497
|
-
end
|
1498
|
-
|
1499
|
-
let(:trimmed_node) do
|
1500
|
-
node.for_json.tap do |j|
|
1501
|
-
j.delete("policy_name")
|
1502
|
-
j.delete("policy_group")
|
1503
|
-
end
|
1504
|
-
|
1505
|
-
end
|
1506
|
-
|
1507
|
-
context "on Chef Client 13 and later" do
|
1508
|
-
|
1509
|
-
# Though we normally attempt to provide compatibility with chef
|
1510
|
-
# server one major version back, policyfiles were beta when we
|
1511
|
-
# added the policyfile attributes to the node JSON, therefore
|
1512
|
-
# policyfile users need to be on 12.3 minimum when upgrading Chef
|
1513
|
-
# Client to 13+
|
1514
|
-
it "lets the 400 pass through", chef: ">= 13" do
|
1515
|
-
expect { node.save }.to raise_error(http_exception)
|
1516
|
-
end
|
1517
|
-
|
1518
|
-
end
|
1519
|
-
|
1520
|
-
context "when the node exists" do
|
1521
|
-
|
1522
|
-
it "falls back to saving without policyfile attributes" do
|
1523
|
-
expect(@rest).to receive(:put).with("nodes/example-node", node.for_json).and_raise(http_exception)
|
1524
|
-
expect(@rest).to receive(:put).with("nodes/example-node", trimmed_node).and_return(@node)
|
1525
|
-
expect { node.save }.to_not raise_error
|
1526
|
-
end
|
1527
|
-
|
1528
|
-
end
|
1529
|
-
|
1530
|
-
context "when the node doesn't exist" do
|
1531
|
-
|
1532
|
-
let(:response_404) do
|
1533
|
-
Net::HTTPResponse.send(:response_class, "404").new("1.0", "404", "Not Found")
|
1534
|
-
end
|
1535
|
-
|
1536
|
-
let(:http_exception_404) do
|
1537
|
-
begin
|
1538
|
-
response_404.error!
|
1539
|
-
rescue => e
|
1540
|
-
e
|
1541
|
-
end
|
1542
|
-
end
|
1543
|
-
|
1544
|
-
it "falls back to saving without policyfile attributes" do
|
1545
|
-
expect(@rest).to receive(:put).with("nodes/example-node", node.for_json).and_raise(http_exception)
|
1546
|
-
expect(@rest).to receive(:put).with("nodes/example-node", trimmed_node).and_raise(http_exception_404)
|
1547
|
-
expect(@rest).to receive(:post).with("nodes", trimmed_node).and_return(@node)
|
1548
|
-
node.save
|
1549
|
-
end
|
1550
|
-
|
1551
|
-
it "creates the node without policyfile attributes" do
|
1552
|
-
expect(@rest).to receive(:post).with("nodes", node.for_json).and_raise(http_exception)
|
1553
|
-
expect(@rest).to receive(:post).with("nodes", trimmed_node).and_return(@node)
|
1554
|
-
node.create
|
1555
|
-
end
|
1556
|
-
end
|
1557
|
-
|
1558
|
-
end
|
1559
|
-
|
1560
|
-
end
|
1561
|
-
|
1562
|
-
end
|
1563
|
-
end
|
1564
|
-
|
1565
|
-
end
|
1
|
+
#
|
2
|
+
# Author:: Adam Jacob (<adam@chef.io>)
|
3
|
+
# Copyright:: Copyright 2008-2016, Chef Software, 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 "ostruct"
|
21
|
+
|
22
|
+
describe Chef::Node do
|
23
|
+
|
24
|
+
let(:node) { Chef::Node.new() }
|
25
|
+
let(:platform_introspector) { node }
|
26
|
+
|
27
|
+
it_behaves_like "a platform introspector"
|
28
|
+
|
29
|
+
it "creates a node and assigns it a name" do
|
30
|
+
node = Chef::Node.build("solo-node")
|
31
|
+
expect(node.name).to eq("solo-node")
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should validate the name of the node" do
|
35
|
+
expect { Chef::Node.build("solo node") }.to raise_error(Chef::Exceptions::ValidationFailed)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should be sortable" do
|
39
|
+
n1 = Chef::Node.build("alpha")
|
40
|
+
n2 = Chef::Node.build("beta")
|
41
|
+
n3 = Chef::Node.build("omega")
|
42
|
+
expect([n3, n1, n2].sort).to eq([n1, n2, n3])
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should share identity only with others of the same name" do
|
46
|
+
n1 = Chef::Node.build("foo")
|
47
|
+
n2 = Chef::Node.build("foo")
|
48
|
+
n3 = Chef::Node.build("bar")
|
49
|
+
expect(n1).to eq(n2)
|
50
|
+
expect(n1).not_to eq(n3)
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "when the node does not exist on the server" do
|
54
|
+
before do
|
55
|
+
response = OpenStruct.new(:code => "404")
|
56
|
+
exception = Net::HTTPServerException.new("404 not found", response)
|
57
|
+
allow(Chef::Node).to receive(:load).and_raise(exception)
|
58
|
+
node.name("created-node")
|
59
|
+
end
|
60
|
+
|
61
|
+
it "creates a new node for find_or_create" do
|
62
|
+
allow(Chef::Node).to receive(:new).and_return(node)
|
63
|
+
expect(node).to receive(:create).and_return(node)
|
64
|
+
node = Chef::Node.find_or_create("created-node")
|
65
|
+
expect(node.name).to eq("created-node")
|
66
|
+
expect(node).to equal(node)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe "when the node exists on the server" do
|
71
|
+
before do
|
72
|
+
node.name("existing-node")
|
73
|
+
allow(Chef::Node).to receive(:load).and_return(node)
|
74
|
+
end
|
75
|
+
|
76
|
+
it "loads the node via the REST API for find_or_create" do
|
77
|
+
expect(Chef::Node.find_or_create("existing-node")).to equal(node)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe "run_state" do
|
82
|
+
it "is an empty hash" do
|
83
|
+
expect(node.run_state).to respond_to(:keys)
|
84
|
+
expect(node.run_state).to be_empty
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe "initialize" do
|
89
|
+
it "should default to the '_default' chef_environment" do
|
90
|
+
n = Chef::Node.new
|
91
|
+
expect(n.chef_environment).to eq("_default")
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe "name" do
|
96
|
+
it "should allow you to set a name with name(something)" do
|
97
|
+
expect { node.name("latte") }.not_to raise_error
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should return the name with name()" do
|
101
|
+
node.name("latte")
|
102
|
+
expect(node.name).to eql("latte")
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should always have a string for name" do
|
106
|
+
expect { node.name(Hash.new) }.to raise_error(ArgumentError)
|
107
|
+
end
|
108
|
+
|
109
|
+
it "cannot be blank" do
|
110
|
+
expect { node.name("") }.to raise_error(Chef::Exceptions::ValidationFailed)
|
111
|
+
end
|
112
|
+
|
113
|
+
it "should not accept name doesn't match /^[\-[:alnum:]_:.]+$/" do
|
114
|
+
expect { node.name("space in it") }.to raise_error(Chef::Exceptions::ValidationFailed)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
describe "chef_environment" do
|
119
|
+
it "should set an environment with chef_environment(something)" do
|
120
|
+
expect { node.chef_environment("latte") }.not_to raise_error
|
121
|
+
end
|
122
|
+
|
123
|
+
it "should return the chef_environment with chef_environment()" do
|
124
|
+
node.chef_environment("latte")
|
125
|
+
expect(node.chef_environment).to eq("latte")
|
126
|
+
end
|
127
|
+
|
128
|
+
it "should disallow non-strings" do
|
129
|
+
expect { node.chef_environment(Hash.new) }.to raise_error(ArgumentError)
|
130
|
+
expect { node.chef_environment(42) }.to raise_error(ArgumentError)
|
131
|
+
end
|
132
|
+
|
133
|
+
it "cannot be blank" do
|
134
|
+
expect { node.chef_environment("") }.to raise_error(Chef::Exceptions::ValidationFailed)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
describe "policy_name" do
|
139
|
+
|
140
|
+
it "defaults to nil" do
|
141
|
+
expect(node.policy_name).to be_nil
|
142
|
+
end
|
143
|
+
|
144
|
+
it "sets policy_name with a regular setter" do
|
145
|
+
node.policy_name = "example-policy"
|
146
|
+
expect(node.policy_name).to eq("example-policy")
|
147
|
+
end
|
148
|
+
|
149
|
+
it "allows policy_name with every valid character" do
|
150
|
+
expect { node.policy_name = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqurstuvwxyz0123456789-_:." }.to_not raise_error
|
151
|
+
end
|
152
|
+
|
153
|
+
it "sets policy_name when given an argument" do
|
154
|
+
node.policy_name("example-policy")
|
155
|
+
expect(node.policy_name).to eq("example-policy")
|
156
|
+
end
|
157
|
+
|
158
|
+
it "sets policy_name to nil when given nil" do
|
159
|
+
node.policy_name = "example-policy"
|
160
|
+
node.policy_name = nil
|
161
|
+
expect(node.policy_name).to be_nil
|
162
|
+
end
|
163
|
+
|
164
|
+
it "disallows non-strings" do
|
165
|
+
expect { node.policy_name(Hash.new) }.to raise_error(Chef::Exceptions::ValidationFailed)
|
166
|
+
expect { node.policy_name(42) }.to raise_error(Chef::Exceptions::ValidationFailed)
|
167
|
+
end
|
168
|
+
|
169
|
+
it "cannot be blank" do
|
170
|
+
expect { node.policy_name("") }.to raise_error(Chef::Exceptions::ValidationFailed)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
describe "policy_group" do
|
175
|
+
|
176
|
+
it "defaults to nil" do
|
177
|
+
expect(node.policy_group).to be_nil
|
178
|
+
end
|
179
|
+
|
180
|
+
it "sets policy_group with a regular setter" do
|
181
|
+
node.policy_group = "staging"
|
182
|
+
expect(node.policy_group).to eq("staging")
|
183
|
+
end
|
184
|
+
|
185
|
+
it "allows policy_group with every valid character" do
|
186
|
+
expect { node.policy_group = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqurstuvwxyz0123456789-_:." }.to_not raise_error
|
187
|
+
end
|
188
|
+
|
189
|
+
it "sets an environment with chef_environment(something)" do
|
190
|
+
node.policy_group("staging")
|
191
|
+
expect(node.policy_group).to eq("staging")
|
192
|
+
end
|
193
|
+
|
194
|
+
it "sets policy_group to nil when given nil" do
|
195
|
+
node.policy_group = "staging"
|
196
|
+
node.policy_group = nil
|
197
|
+
expect(node.policy_group).to be_nil
|
198
|
+
end
|
199
|
+
|
200
|
+
it "disallows non-strings" do
|
201
|
+
expect { node.policy_group(Hash.new) }.to raise_error(Chef::Exceptions::ValidationFailed)
|
202
|
+
expect { node.policy_group(42) }.to raise_error(Chef::Exceptions::ValidationFailed)
|
203
|
+
end
|
204
|
+
|
205
|
+
it "cannot be blank" do
|
206
|
+
expect { node.policy_group("") }.to raise_error(Chef::Exceptions::ValidationFailed)
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
describe "attributes" do
|
211
|
+
it "should have attributes" do
|
212
|
+
expect(node.attribute).to be_a_kind_of(Hash)
|
213
|
+
end
|
214
|
+
|
215
|
+
it "should allow attributes to be accessed by name or symbol directly on node[]" do
|
216
|
+
node.default["locust"] = "something"
|
217
|
+
expect(node[:locust]).to eql("something")
|
218
|
+
expect(node["locust"]).to eql("something")
|
219
|
+
end
|
220
|
+
|
221
|
+
it "should return nil if it cannot find an attribute with node[]" do
|
222
|
+
expect(node["secret"]).to eql(nil)
|
223
|
+
end
|
224
|
+
|
225
|
+
it "does not allow you to set an attribute via node[]=" do
|
226
|
+
expect { node["secret"] = "shush" }.to raise_error(Chef::Exceptions::ImmutableAttributeModification)
|
227
|
+
end
|
228
|
+
|
229
|
+
it "should allow you to query whether an attribute exists with attribute?" do
|
230
|
+
node.default["locust"] = "something"
|
231
|
+
expect(node.attribute?("locust")).to eql(true)
|
232
|
+
expect(node.attribute?("no dice")).to eql(false)
|
233
|
+
end
|
234
|
+
|
235
|
+
it "should let you go deep with attribute?" do
|
236
|
+
node.set["battles"]["people"]["wonkey"] = true
|
237
|
+
expect(node["battles"]["people"].attribute?("wonkey")).to eq(true)
|
238
|
+
expect(node["battles"]["people"].attribute?("snozzberry")).to eq(false)
|
239
|
+
end
|
240
|
+
|
241
|
+
it "does not allow you to set an attribute via method_missing" do
|
242
|
+
expect { node.sunshine = "is bright" }.to raise_error(Chef::Exceptions::ImmutableAttributeModification)
|
243
|
+
end
|
244
|
+
|
245
|
+
it "should allow you get get an attribute via method_missing" do
|
246
|
+
node.default.sunshine = "is bright"
|
247
|
+
expect(node.sunshine).to eql("is bright")
|
248
|
+
end
|
249
|
+
|
250
|
+
describe "normal attributes" do
|
251
|
+
it "should allow you to set an attribute with set, without pre-declaring a hash" do
|
252
|
+
node.set[:snoopy][:is_a_puppy] = true
|
253
|
+
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
254
|
+
end
|
255
|
+
|
256
|
+
it "should allow you to set an attribute with set_unless" do
|
257
|
+
node.set_unless[:snoopy][:is_a_puppy] = false
|
258
|
+
expect(node[:snoopy][:is_a_puppy]).to eq(false)
|
259
|
+
end
|
260
|
+
|
261
|
+
it "should not allow you to set an attribute with set_unless if it already exists" do
|
262
|
+
node.set[:snoopy][:is_a_puppy] = true
|
263
|
+
node.set_unless[:snoopy][:is_a_puppy] = false
|
264
|
+
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
265
|
+
end
|
266
|
+
|
267
|
+
it "should allow you to set an attribute with set_unless if is a nil value" do
|
268
|
+
node.attributes.normal = { snoopy: { is_a_puppy: nil } }
|
269
|
+
node.set_unless[:snoopy][:is_a_puppy] = false
|
270
|
+
expect(node[:snoopy][:is_a_puppy]).to eq(false)
|
271
|
+
end
|
272
|
+
|
273
|
+
it "should allow you to set a value after a set_unless" do
|
274
|
+
# this tests for set_unless_present state bleeding between statements CHEF-3806
|
275
|
+
node.set_unless[:snoopy][:is_a_puppy] = false
|
276
|
+
node.set[:snoopy][:is_a_puppy] = true
|
277
|
+
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
278
|
+
end
|
279
|
+
|
280
|
+
it "should let you set a value after a 'dangling' set_unless" do
|
281
|
+
# this tests for set_unless_present state bleeding between statements CHEF-3806
|
282
|
+
node.set[:snoopy][:is_a_puppy] = "what"
|
283
|
+
node.set_unless[:snoopy][:is_a_puppy]
|
284
|
+
node.set[:snoopy][:is_a_puppy] = true
|
285
|
+
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
286
|
+
end
|
287
|
+
|
288
|
+
it "auto-vivifies attributes created via method syntax" do
|
289
|
+
node.set.fuu.bahrr.baz = "qux"
|
290
|
+
expect(node.fuu.bahrr.baz).to eq("qux")
|
291
|
+
end
|
292
|
+
|
293
|
+
it "should let you use tag as a convience method for the tags attribute" do
|
294
|
+
node.normal["tags"] = %w{one two}
|
295
|
+
node.tag("three", "four")
|
296
|
+
expect(node["tags"]).to eq(%w{one two three four})
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
300
|
+
describe "default attributes" do
|
301
|
+
it "should be set with default, without pre-declaring a hash" do
|
302
|
+
node.default[:snoopy][:is_a_puppy] = true
|
303
|
+
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
304
|
+
end
|
305
|
+
|
306
|
+
it "should allow you to set with default_unless without pre-declaring a hash" do
|
307
|
+
node.default_unless[:snoopy][:is_a_puppy] = false
|
308
|
+
expect(node[:snoopy][:is_a_puppy]).to eq(false)
|
309
|
+
end
|
310
|
+
|
311
|
+
it "should not allow you to set an attribute with default_unless if it already exists" do
|
312
|
+
node.default[:snoopy][:is_a_puppy] = true
|
313
|
+
node.default_unless[:snoopy][:is_a_puppy] = false
|
314
|
+
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
315
|
+
end
|
316
|
+
|
317
|
+
it "should allow you to set a value after a default_unless" do
|
318
|
+
# this tests for set_unless_present state bleeding between statements CHEF-3806
|
319
|
+
node.default_unless[:snoopy][:is_a_puppy] = false
|
320
|
+
node.default[:snoopy][:is_a_puppy] = true
|
321
|
+
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
322
|
+
end
|
323
|
+
|
324
|
+
it "should allow you to set a value after a 'dangling' default_unless" do
|
325
|
+
# this tests for set_unless_present state bleeding between statements CHEF-3806
|
326
|
+
node.default[:snoopy][:is_a_puppy] = "what"
|
327
|
+
node.default_unless[:snoopy][:is_a_puppy]
|
328
|
+
node.default[:snoopy][:is_a_puppy] = true
|
329
|
+
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
330
|
+
end
|
331
|
+
|
332
|
+
it "auto-vivifies attributes created via method syntax" do
|
333
|
+
node.default.fuu.bahrr.baz = "qux"
|
334
|
+
expect(node.fuu.bahrr.baz).to eq("qux")
|
335
|
+
end
|
336
|
+
end
|
337
|
+
|
338
|
+
describe "override attributes" do
|
339
|
+
it "should be set with override, without pre-declaring a hash" do
|
340
|
+
node.override[:snoopy][:is_a_puppy] = true
|
341
|
+
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
342
|
+
end
|
343
|
+
|
344
|
+
it "should allow you to set with override_unless without pre-declaring a hash" do
|
345
|
+
node.override_unless[:snoopy][:is_a_puppy] = false
|
346
|
+
expect(node[:snoopy][:is_a_puppy]).to eq(false)
|
347
|
+
end
|
348
|
+
|
349
|
+
it "should not allow you to set an attribute with override_unless if it already exists" do
|
350
|
+
node.override[:snoopy][:is_a_puppy] = true
|
351
|
+
node.override_unless[:snoopy][:is_a_puppy] = false
|
352
|
+
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
353
|
+
end
|
354
|
+
|
355
|
+
it "should allow you to set a value after an override_unless" do
|
356
|
+
# this tests for set_unless_present state bleeding between statements CHEF-3806
|
357
|
+
node.override_unless[:snoopy][:is_a_puppy] = false
|
358
|
+
node.override[:snoopy][:is_a_puppy] = true
|
359
|
+
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
360
|
+
end
|
361
|
+
|
362
|
+
it "should allow you to set a value after a 'dangling' override_unless" do
|
363
|
+
# this tests for set_unless_present state bleeding between statements CHEF-3806
|
364
|
+
node.override_unless[:snoopy][:is_a_puppy] = "what"
|
365
|
+
node.override_unless[:snoopy][:is_a_puppy]
|
366
|
+
node.override[:snoopy][:is_a_puppy] = true
|
367
|
+
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
368
|
+
end
|
369
|
+
|
370
|
+
it "auto-vivifies attributes created via method syntax" do
|
371
|
+
node.override.fuu.bahrr.baz = "qux"
|
372
|
+
expect(node.fuu.bahrr.baz).to eq("qux")
|
373
|
+
end
|
374
|
+
end
|
375
|
+
|
376
|
+
describe "globally deleting attributes" do
|
377
|
+
context "with hash values" do
|
378
|
+
before do
|
379
|
+
node.role_default["mysql"]["server"]["port"] = 1234
|
380
|
+
node.normal["mysql"]["server"]["port"] = 2345
|
381
|
+
node.override["mysql"]["server"]["port"] = 3456
|
382
|
+
end
|
383
|
+
|
384
|
+
it "deletes all the values and returns the value with the highest precidence" do
|
385
|
+
expect( node.rm("mysql", "server", "port") ).to eql(3456)
|
386
|
+
expect( node["mysql"]["server"]["port"] ).to be_nil
|
387
|
+
expect( node["mysql"]["server"] ).to eql({})
|
388
|
+
end
|
389
|
+
|
390
|
+
it "deletes nested things correctly" do
|
391
|
+
node.default["mysql"]["client"]["client_setting"] = "foo"
|
392
|
+
expect( node.rm("mysql", "server") ).to eql( { "port" => 3456 } )
|
393
|
+
expect( node["mysql"] ).to eql( { "client" => { "client_setting" => "foo" } } )
|
394
|
+
end
|
395
|
+
|
396
|
+
it "returns nil if the node attribute does not exist" do
|
397
|
+
expect( node.rm("no", "such", "thing") ).to be_nil
|
398
|
+
end
|
399
|
+
|
400
|
+
it "can delete the entire tree" do
|
401
|
+
expect( node.rm("mysql") ).to eql({ "server" => { "port" => 3456 } })
|
402
|
+
end
|
403
|
+
end
|
404
|
+
|
405
|
+
context "when trying to delete through a thing that isn't an array-like or hash-like object" do
|
406
|
+
before do
|
407
|
+
node.default["mysql"] = true
|
408
|
+
end
|
409
|
+
|
410
|
+
it "returns nil when you're two levels deeper" do
|
411
|
+
expect( node.rm("mysql", "server", "port") ).to eql(nil)
|
412
|
+
end
|
413
|
+
|
414
|
+
it "returns nil when you're one level deeper" do
|
415
|
+
expect( node.rm("mysql", "server") ).to eql(nil)
|
416
|
+
end
|
417
|
+
|
418
|
+
it "correctly deletes at the top level" do
|
419
|
+
expect( node.rm("mysql") ).to eql(true)
|
420
|
+
end
|
421
|
+
end
|
422
|
+
|
423
|
+
context "with array indexes" do
|
424
|
+
before do
|
425
|
+
node.role_default["mysql"]["server"][0]["port"] = 1234
|
426
|
+
node.normal["mysql"]["server"][0]["port"] = 2345
|
427
|
+
node.override["mysql"]["server"][0]["port"] = 3456
|
428
|
+
node.override["mysql"]["server"][1]["port"] = 3456
|
429
|
+
end
|
430
|
+
|
431
|
+
it "deletes the array element" do
|
432
|
+
expect( node.rm("mysql", "server", 0, "port") ).to eql(3456)
|
433
|
+
expect( node["mysql"]["server"][0]["port"] ).to be_nil
|
434
|
+
expect( node["mysql"]["server"][1]["port"] ).to eql(3456)
|
435
|
+
end
|
436
|
+
end
|
437
|
+
|
438
|
+
context "with real arrays" do
|
439
|
+
before do
|
440
|
+
node.role_default["mysql"]["server"] = [ {
|
441
|
+
"port" => 1234,
|
442
|
+
} ]
|
443
|
+
node.normal["mysql"]["server"] = [ {
|
444
|
+
"port" => 2345,
|
445
|
+
} ]
|
446
|
+
node.override["mysql"]["server"] = [ {
|
447
|
+
"port" => 3456,
|
448
|
+
} ]
|
449
|
+
end
|
450
|
+
|
451
|
+
it "deletes the array element" do
|
452
|
+
expect( node.rm("mysql", "server", 0, "port") ).to eql(3456)
|
453
|
+
expect( node["mysql"]["server"][0]["port"] ).to be_nil
|
454
|
+
end
|
455
|
+
|
456
|
+
it "does not have a horrible error message when mistaking arrays for hashes" do
|
457
|
+
expect { node.rm("mysql", "server", "port") }.to raise_error(TypeError, "Wrong type in index of attribute (did you use a Hash index on an Array?)")
|
458
|
+
end
|
459
|
+
end
|
460
|
+
end
|
461
|
+
|
462
|
+
describe "granular deleting attributes" do
|
463
|
+
context "when only defaults exist" do
|
464
|
+
before do
|
465
|
+
node.role_default["mysql"]["server"]["port"] = 1234
|
466
|
+
node.default["mysql"]["server"]["port"] = 2345
|
467
|
+
node.force_default["mysql"]["server"]["port"] = 3456
|
468
|
+
end
|
469
|
+
|
470
|
+
it "returns the deleted values" do
|
471
|
+
expect( node.rm_default("mysql", "server", "port") ).to eql(3456)
|
472
|
+
end
|
473
|
+
|
474
|
+
it "returns nil for the combined attribues" do
|
475
|
+
expect( node.rm_default("mysql", "server", "port") ).to eql(3456)
|
476
|
+
expect( node["mysql"]["server"]["port"] ).to eql(nil)
|
477
|
+
end
|
478
|
+
|
479
|
+
it "returns an empty hash for the default attrs" do
|
480
|
+
expect( node.rm_default("mysql", "server", "port") ).to eql(3456)
|
481
|
+
# this auto-vivifies, should it?
|
482
|
+
expect( node.default_attrs["mysql"]["server"]["port"] ).to eql({})
|
483
|
+
end
|
484
|
+
|
485
|
+
it "returns an empty hash after the last key is deleted" do
|
486
|
+
expect( node.rm_default("mysql", "server", "port") ).to eql(3456)
|
487
|
+
expect( node["mysql"]["server"] ).to eql({})
|
488
|
+
end
|
489
|
+
end
|
490
|
+
|
491
|
+
context "when trying to delete through a thing that isn't an array-like or hash-like object" do
|
492
|
+
before do
|
493
|
+
node.default["mysql"] = true
|
494
|
+
end
|
495
|
+
|
496
|
+
it "returns nil when you're two levels deeper" do
|
497
|
+
expect( node.rm_default("mysql", "server", "port") ).to eql(nil)
|
498
|
+
end
|
499
|
+
|
500
|
+
it "returns nil when you're one level deeper" do
|
501
|
+
expect( node.rm_default("mysql", "server") ).to eql(nil)
|
502
|
+
end
|
503
|
+
|
504
|
+
it "correctly deletes at the top level" do
|
505
|
+
expect( node.rm_default("mysql") ).to eql(true)
|
506
|
+
end
|
507
|
+
end
|
508
|
+
|
509
|
+
context "when a higher precedence exists" do
|
510
|
+
before do
|
511
|
+
node.role_default["mysql"]["server"]["port"] = 1234
|
512
|
+
node.default["mysql"]["server"]["port"] = 2345
|
513
|
+
node.force_default["mysql"]["server"]["port"] = 3456
|
514
|
+
|
515
|
+
node.override["mysql"]["server"]["port"] = 9999
|
516
|
+
end
|
517
|
+
|
518
|
+
it "returns the deleted values" do
|
519
|
+
expect( node.rm_default("mysql", "server", "port") ).to eql(3456)
|
520
|
+
end
|
521
|
+
|
522
|
+
it "returns the higher precedence values after the delete" do
|
523
|
+
expect( node.rm_default("mysql", "server", "port") ).to eql(3456)
|
524
|
+
expect( node["mysql"]["server"]["port"] ).to eql(9999)
|
525
|
+
end
|
526
|
+
|
527
|
+
it "returns an empty has for the default attrs" do
|
528
|
+
expect( node.rm_default("mysql", "server", "port") ).to eql(3456)
|
529
|
+
# this auto-vivifies, should it?
|
530
|
+
expect( node.default_attrs["mysql"]["server"]["port"] ).to eql({})
|
531
|
+
end
|
532
|
+
end
|
533
|
+
|
534
|
+
context "when a lower precedence exists" do
|
535
|
+
before do
|
536
|
+
node.default["mysql"]["server"]["port"] = 2345
|
537
|
+
node.override["mysql"]["server"]["port"] = 9999
|
538
|
+
node.role_override["mysql"]["server"]["port"] = 9876
|
539
|
+
node.force_override["mysql"]["server"]["port"] = 6669
|
540
|
+
end
|
541
|
+
|
542
|
+
it "returns the deleted values" do
|
543
|
+
expect( node.rm_override("mysql", "server", "port") ).to eql(6669)
|
544
|
+
end
|
545
|
+
|
546
|
+
it "returns the lower precedence levels after the delete" do
|
547
|
+
expect( node.rm_override("mysql", "server", "port") ).to eql(6669)
|
548
|
+
expect( node["mysql"]["server"]["port"] ).to eql(2345)
|
549
|
+
end
|
550
|
+
|
551
|
+
it "returns an empty has for the override attrs" do
|
552
|
+
expect( node.rm_override("mysql", "server", "port") ).to eql(6669)
|
553
|
+
# this auto-vivifies, should it?
|
554
|
+
expect( node.override_attrs["mysql"]["server"]["port"] ).to eql({})
|
555
|
+
end
|
556
|
+
end
|
557
|
+
|
558
|
+
it "rm_default returns nil on deleting non-existent values" do
|
559
|
+
expect( node.rm_default("no", "such", "thing") ).to be_nil
|
560
|
+
end
|
561
|
+
|
562
|
+
it "rm_normal returns nil on deleting non-existent values" do
|
563
|
+
expect( node.rm_normal("no", "such", "thing") ).to be_nil
|
564
|
+
end
|
565
|
+
|
566
|
+
it "rm_override returns nil on deleting non-existent values" do
|
567
|
+
expect( node.rm_override("no", "such", "thing") ).to be_nil
|
568
|
+
end
|
569
|
+
end
|
570
|
+
|
571
|
+
describe "granular replacing attributes" do
|
572
|
+
it "removes everything at the level of the last key" do
|
573
|
+
node.default["mysql"]["server"]["port"] = 2345
|
574
|
+
|
575
|
+
node.default!["mysql"]["server"] = { "data_dir" => "/my_raid_volume/lib/mysql" }
|
576
|
+
|
577
|
+
expect( node["mysql"]["server"] ).to eql({ "data_dir" => "/my_raid_volume/lib/mysql" })
|
578
|
+
end
|
579
|
+
|
580
|
+
it "replaces a value at the cookbook sub-level of the atributes only" do
|
581
|
+
node.default["mysql"]["server"]["port"] = 2345
|
582
|
+
node.default["mysql"]["server"]["service_name"] = "fancypants-sql"
|
583
|
+
node.role_default["mysql"]["server"]["port"] = 1234
|
584
|
+
node.force_default["mysql"]["server"]["port"] = 3456
|
585
|
+
|
586
|
+
node.default!["mysql"]["server"] = { "data_dir" => "/my_raid_volume/lib/mysql" }
|
587
|
+
|
588
|
+
expect( node["mysql"]["server"]["port"] ).to eql(3456)
|
589
|
+
expect( node["mysql"]["server"]["service_name"] ).to be_nil
|
590
|
+
expect( node["mysql"]["server"]["data_dir"] ).to eql("/my_raid_volume/lib/mysql")
|
591
|
+
expect( node["mysql"]["server"] ).to eql({ "port" => 3456, "data_dir" => "/my_raid_volume/lib/mysql" })
|
592
|
+
end
|
593
|
+
|
594
|
+
it "higher precedence values aren't removed" do
|
595
|
+
node.role_default["mysql"]["server"]["port"] = 1234
|
596
|
+
node.default["mysql"]["server"]["port"] = 2345
|
597
|
+
node.force_default["mysql"]["server"]["port"] = 3456
|
598
|
+
node.override["mysql"]["server"]["service_name"] = "fancypants-sql"
|
599
|
+
|
600
|
+
node.default!["mysql"]["server"] = { "data_dir" => "/my_raid_volume/lib/mysql" }
|
601
|
+
|
602
|
+
expect( node["mysql"]["server"]["port"] ).to eql(3456)
|
603
|
+
expect( node["mysql"]["server"]["data_dir"] ).to eql("/my_raid_volume/lib/mysql")
|
604
|
+
expect( node["mysql"]["server"] ).to eql({ "service_name" => "fancypants-sql", "port" => 3456, "data_dir" => "/my_raid_volume/lib/mysql" })
|
605
|
+
end
|
606
|
+
end
|
607
|
+
|
608
|
+
describe "granular force replacing attributes" do
|
609
|
+
it "removes everything at the level of the last key" do
|
610
|
+
node.force_default["mysql"]["server"]["port"] = 2345
|
611
|
+
|
612
|
+
node.force_default!["mysql"]["server"] = {
|
613
|
+
"data_dir" => "/my_raid_volume/lib/mysql",
|
614
|
+
}
|
615
|
+
|
616
|
+
expect( node["mysql"]["server"] ).to eql({
|
617
|
+
"data_dir" => "/my_raid_volume/lib/mysql",
|
618
|
+
})
|
619
|
+
end
|
620
|
+
|
621
|
+
it "removes all values from the precedence level when setting" do
|
622
|
+
node.role_default["mysql"]["server"]["port"] = 1234
|
623
|
+
node.default["mysql"]["server"]["port"] = 2345
|
624
|
+
node.force_default["mysql"]["server"]["port"] = 3456
|
625
|
+
|
626
|
+
node.force_default!["mysql"]["server"] = {
|
627
|
+
"data_dir" => "/my_raid_volume/lib/mysql",
|
628
|
+
}
|
629
|
+
|
630
|
+
expect( node["mysql"]["server"]["port"] ).to be_nil
|
631
|
+
expect( node["mysql"]["server"]["data_dir"] ).to eql("/my_raid_volume/lib/mysql")
|
632
|
+
expect( node["mysql"]["server"] ).to eql({
|
633
|
+
"data_dir" => "/my_raid_volume/lib/mysql",
|
634
|
+
})
|
635
|
+
end
|
636
|
+
|
637
|
+
it "higher precedence levels are not removed" do
|
638
|
+
node.role_default["mysql"]["server"]["port"] = 1234
|
639
|
+
node.default["mysql"]["server"]["port"] = 2345
|
640
|
+
node.force_default["mysql"]["server"]["port"] = 3456
|
641
|
+
node.override["mysql"]["server"]["service_name"] = "fancypants-sql"
|
642
|
+
|
643
|
+
node.force_default!["mysql"]["server"] = {
|
644
|
+
"data_dir" => "/my_raid_volume/lib/mysql",
|
645
|
+
}
|
646
|
+
|
647
|
+
expect( node["mysql"]["server"]["port"] ).to be_nil
|
648
|
+
expect( node["mysql"]["server"]["data_dir"] ).to eql("/my_raid_volume/lib/mysql")
|
649
|
+
expect( node["mysql"]["server"] ).to eql({
|
650
|
+
"service_name" => "fancypants-sql",
|
651
|
+
"data_dir" => "/my_raid_volume/lib/mysql",
|
652
|
+
})
|
653
|
+
end
|
654
|
+
|
655
|
+
it "will autovivify" do
|
656
|
+
node.force_default!["mysql"]["server"] = {
|
657
|
+
"data_dir" => "/my_raid_volume/lib/mysql",
|
658
|
+
}
|
659
|
+
expect( node["mysql"]["server"]["data_dir"] ).to eql("/my_raid_volume/lib/mysql")
|
660
|
+
end
|
661
|
+
|
662
|
+
it "lower precedence levels aren't removed" do
|
663
|
+
node.role_override["mysql"]["server"]["port"] = 1234
|
664
|
+
node.override["mysql"]["server"]["port"] = 2345
|
665
|
+
node.force_override["mysql"]["server"]["port"] = 3456
|
666
|
+
node.default["mysql"]["server"]["service_name"] = "fancypants-sql"
|
667
|
+
|
668
|
+
node.force_override!["mysql"]["server"] = {
|
669
|
+
"data_dir" => "/my_raid_volume/lib/mysql",
|
670
|
+
}
|
671
|
+
|
672
|
+
expect( node["mysql"]["server"]["port"] ).to be_nil
|
673
|
+
expect( node["mysql"]["server"]["data_dir"] ).to eql("/my_raid_volume/lib/mysql")
|
674
|
+
expect( node["mysql"]["server"] ).to eql({
|
675
|
+
"service_name" => "fancypants-sql",
|
676
|
+
"data_dir" => "/my_raid_volume/lib/mysql",
|
677
|
+
})
|
678
|
+
end
|
679
|
+
|
680
|
+
it "when overwriting a non-hash/array" do
|
681
|
+
node.override["mysql"] = false
|
682
|
+
node.force_override["mysql"] = true
|
683
|
+
node.force_override!["mysql"]["server"] = {
|
684
|
+
"data_dir" => "/my_raid_volume/lib/mysql",
|
685
|
+
}
|
686
|
+
expect( node["mysql"]["server"]["data_dir"] ).to eql("/my_raid_volume/lib/mysql")
|
687
|
+
end
|
688
|
+
|
689
|
+
it "when overwriting an array with a hash" do
|
690
|
+
node.force_override["mysql"][0] = true
|
691
|
+
node.force_override!["mysql"]["server"] = {
|
692
|
+
"data_dir" => "/my_raid_volume/lib/mysql",
|
693
|
+
}
|
694
|
+
expect( node["mysql"]["server"] ).to eql({
|
695
|
+
"data_dir" => "/my_raid_volume/lib/mysql",
|
696
|
+
})
|
697
|
+
end
|
698
|
+
end
|
699
|
+
|
700
|
+
# In Chef-12.0 there is a deep_merge cache on the top level attribute which had a bug
|
701
|
+
# where it cached node[:foo] separate from node['foo']. These tests exercise those edge conditions.
|
702
|
+
#
|
703
|
+
# https://github.com/opscode/chef/issues/2700
|
704
|
+
# https://github.com/opscode/chef/issues/2712
|
705
|
+
# https://github.com/opscode/chef/issues/2745
|
706
|
+
#
|
707
|
+
describe "deep merge attribute cache edge conditions" do
|
708
|
+
it "does not error with complicated attribute substitution" do
|
709
|
+
node.default["chef_attribute_hell"]["attr1"] = "attribute1"
|
710
|
+
node.default["chef_attribute_hell"]["attr2"] = "#{node.chef_attribute_hell.attr1}/attr2"
|
711
|
+
expect { node.default["chef_attribute_hell"]["attr3"] = "#{node.chef_attribute_hell.attr2}/attr3" }.not_to raise_error
|
712
|
+
end
|
713
|
+
|
714
|
+
it "caches both strings and symbols correctly" do
|
715
|
+
node.force_default[:solr][:version] = "4.10.2"
|
716
|
+
node.force_default[:solr][:data_dir] = "/opt/solr-#{node['solr'][:version]}/example/solr"
|
717
|
+
node.force_default[:solr][:xms] = "512M"
|
718
|
+
expect(node[:solr][:xms]).to eql("512M")
|
719
|
+
expect(node["solr"][:xms]).to eql("512M")
|
720
|
+
end
|
721
|
+
|
722
|
+
it "method interpolation syntax also works" do
|
723
|
+
node.default["passenger"]["version"] = "4.0.57"
|
724
|
+
node.default["passenger"]["root_path"] = "passenger-#{node['passenger']['version']}"
|
725
|
+
node.default["passenger"]["root_path_2"] = "passenger-#{node.passenger['version']}"
|
726
|
+
expect(node["passenger"]["root_path_2"]).to eql("passenger-4.0.57")
|
727
|
+
expect(node[:passenger]["root_path_2"]).to eql("passenger-4.0.57")
|
728
|
+
end
|
729
|
+
end
|
730
|
+
|
731
|
+
it "should raise an ArgumentError if you ask for an attribute that doesn't exist via method_missing" do
|
732
|
+
expect { node.sunshine }.to raise_error(NoMethodError)
|
733
|
+
end
|
734
|
+
|
735
|
+
it "should allow you to iterate over attributes with each_attribute" do
|
736
|
+
node.default.sunshine = "is bright"
|
737
|
+
node.default.canada = "is a nice place"
|
738
|
+
seen_attributes = Hash.new
|
739
|
+
node.each_attribute do |a, v|
|
740
|
+
seen_attributes[a] = v
|
741
|
+
end
|
742
|
+
expect(seen_attributes).to have_key("sunshine")
|
743
|
+
expect(seen_attributes).to have_key("canada")
|
744
|
+
expect(seen_attributes["sunshine"]).to eq("is bright")
|
745
|
+
expect(seen_attributes["canada"]).to eq("is a nice place")
|
746
|
+
end
|
747
|
+
end
|
748
|
+
|
749
|
+
describe "consuming json" do
|
750
|
+
|
751
|
+
before do
|
752
|
+
@ohai_data = { :platform => "foo", :platform_version => "bar" }
|
753
|
+
end
|
754
|
+
|
755
|
+
it "consumes the run list portion of a collection of attributes and returns the remainder" do
|
756
|
+
attrs = { "run_list" => [ "role[base]", "recipe[chef::server]" ], "foo" => "bar" }
|
757
|
+
expect(node.consume_run_list(attrs)).to eq({ "foo" => "bar" })
|
758
|
+
expect(node.run_list).to eq([ "role[base]", "recipe[chef::server]" ])
|
759
|
+
end
|
760
|
+
|
761
|
+
it "sets the node chef_environment" do
|
762
|
+
attrs = { "chef_environment" => "foo_environment", "bar" => "baz" }
|
763
|
+
expect(node.consume_chef_environment(attrs)).to eq({ "bar" => "baz" })
|
764
|
+
expect(node.chef_environment).to eq("foo_environment")
|
765
|
+
expect(node["chef_environment"]).to be nil
|
766
|
+
end
|
767
|
+
|
768
|
+
it "should overwrites the run list with the run list it consumes" do
|
769
|
+
node.consume_run_list "recipes" => %w{one two}
|
770
|
+
node.consume_run_list "recipes" => [ "three" ]
|
771
|
+
expect(node.run_list).to eq([ "three" ])
|
772
|
+
end
|
773
|
+
|
774
|
+
it "should not add duplicate recipes from the json attributes" do
|
775
|
+
node.run_list << "one"
|
776
|
+
node.consume_run_list "recipes" => %w{one two three}
|
777
|
+
expect(node.run_list).to eq(%w{one two three})
|
778
|
+
end
|
779
|
+
|
780
|
+
it "doesn't change the run list if no run_list is specified in the json" do
|
781
|
+
node.run_list << "role[database]"
|
782
|
+
node.consume_run_list "foo" => "bar"
|
783
|
+
expect(node.run_list).to eq(["role[database]"])
|
784
|
+
end
|
785
|
+
|
786
|
+
it "raises an exception if you provide both recipe and run_list attributes, since this is ambiguous" do
|
787
|
+
expect { node.consume_run_list "recipes" => "stuff", "run_list" => "other_stuff" }.to raise_error(Chef::Exceptions::AmbiguousRunlistSpecification)
|
788
|
+
end
|
789
|
+
|
790
|
+
it "should add json attributes to the node" do
|
791
|
+
node.consume_external_attrs(@ohai_data, { "one" => "two", "three" => "four" })
|
792
|
+
expect(node.one).to eql("two")
|
793
|
+
expect(node.three).to eql("four")
|
794
|
+
end
|
795
|
+
|
796
|
+
it "should set the tags attribute to an empty array if it is not already defined" do
|
797
|
+
node.consume_external_attrs(@ohai_data, {})
|
798
|
+
expect(node.tags).to eql([])
|
799
|
+
end
|
800
|
+
|
801
|
+
it "should not set the tags attribute to an empty array if it is already defined" do
|
802
|
+
node.tag("radiohead")
|
803
|
+
node.consume_external_attrs(@ohai_data, {})
|
804
|
+
expect(node.tags).to eql([ "radiohead" ])
|
805
|
+
end
|
806
|
+
|
807
|
+
it "should set the tags attribute to an empty array if it is nil" do
|
808
|
+
node.attributes.normal = { "tags" => nil }
|
809
|
+
node.consume_external_attrs(@ohai_data, {})
|
810
|
+
expect(node.tags).to eql([])
|
811
|
+
end
|
812
|
+
|
813
|
+
it "should return an array if it is fed a string" do
|
814
|
+
node.normal[:tags] = "string"
|
815
|
+
node.consume_external_attrs(@ohai_data, {})
|
816
|
+
expect(node.tags).to eql(["string"])
|
817
|
+
end
|
818
|
+
|
819
|
+
it "should return an array if it is fed a hash" do
|
820
|
+
node.normal[:tags] = {}
|
821
|
+
node.consume_external_attrs(@ohai_data, {})
|
822
|
+
expect(node.tags).to eql([])
|
823
|
+
end
|
824
|
+
|
825
|
+
it "deep merges attributes instead of overwriting them" do
|
826
|
+
node.consume_external_attrs(@ohai_data, "one" => { "two" => { "three" => "four" } })
|
827
|
+
expect(node.one.to_hash).to eq({ "two" => { "three" => "four" } })
|
828
|
+
node.consume_external_attrs(@ohai_data, "one" => { "abc" => "123" })
|
829
|
+
node.consume_external_attrs(@ohai_data, "one" => { "two" => { "foo" => "bar" } })
|
830
|
+
expect(node.one.to_hash).to eq({ "two" => { "three" => "four", "foo" => "bar" }, "abc" => "123" })
|
831
|
+
end
|
832
|
+
|
833
|
+
it "gives attributes from JSON priority when deep merging" do
|
834
|
+
node.consume_external_attrs(@ohai_data, "one" => { "two" => { "three" => "four" } })
|
835
|
+
expect(node.one.to_hash).to eq({ "two" => { "three" => "four" } })
|
836
|
+
node.consume_external_attrs(@ohai_data, "one" => { "two" => { "three" => "forty-two" } })
|
837
|
+
expect(node.one.to_hash).to eq({ "two" => { "three" => "forty-two" } })
|
838
|
+
end
|
839
|
+
|
840
|
+
end
|
841
|
+
|
842
|
+
describe "preparing for a chef client run" do
|
843
|
+
before do
|
844
|
+
@ohai_data = { :platform => "foobuntu", :platform_version => "23.42" }
|
845
|
+
end
|
846
|
+
|
847
|
+
it "sets its platform according to platform detection" do
|
848
|
+
node.consume_external_attrs(@ohai_data, {})
|
849
|
+
expect(node.automatic_attrs[:platform]).to eq("foobuntu")
|
850
|
+
expect(node.automatic_attrs[:platform_version]).to eq("23.42")
|
851
|
+
end
|
852
|
+
|
853
|
+
it "consumes the run list from provided json attributes" do
|
854
|
+
node.consume_external_attrs(@ohai_data, { "run_list" => ["recipe[unicorn]"] })
|
855
|
+
expect(node.run_list).to eq(["recipe[unicorn]"])
|
856
|
+
end
|
857
|
+
|
858
|
+
it "saves non-runlist json attrs for later" do
|
859
|
+
expansion = Chef::RunList::RunListExpansion.new("_default", [])
|
860
|
+
allow(node.run_list).to receive(:expand).and_return(expansion)
|
861
|
+
node.consume_external_attrs(@ohai_data, { "foo" => "bar" })
|
862
|
+
node.expand!
|
863
|
+
expect(node.normal_attrs).to eq({ "foo" => "bar", "tags" => [] })
|
864
|
+
end
|
865
|
+
|
866
|
+
end
|
867
|
+
|
868
|
+
describe "when expanding its run list and merging attributes" do
|
869
|
+
before do
|
870
|
+
@environment = Chef::Environment.new.tap do |e|
|
871
|
+
e.name("rspec_env")
|
872
|
+
e.default_attributes("env default key" => "env default value")
|
873
|
+
e.override_attributes("env override key" => "env override value")
|
874
|
+
end
|
875
|
+
expect(Chef::Environment).to receive(:load).with("rspec_env").and_return(@environment)
|
876
|
+
@expansion = Chef::RunList::RunListExpansion.new("rspec_env", [])
|
877
|
+
node.chef_environment("rspec_env")
|
878
|
+
allow(node.run_list).to receive(:expand).and_return(@expansion)
|
879
|
+
end
|
880
|
+
|
881
|
+
it "sets the 'recipes' automatic attribute to the recipes in the expanded run_list" do
|
882
|
+
@expansion.recipes << "recipe[chef::client]" << "recipe[nginx::default]"
|
883
|
+
node.expand!
|
884
|
+
expect(node.automatic_attrs[:recipes]).to eq(["recipe[chef::client]", "recipe[nginx::default]"])
|
885
|
+
end
|
886
|
+
|
887
|
+
it "sets the 'roles' automatic attribute to the expanded role list" do
|
888
|
+
@expansion.instance_variable_set(:@applied_roles, { "arf" => nil, "countersnark" => nil })
|
889
|
+
node.expand!
|
890
|
+
expect(node.automatic_attrs[:roles].sort).to eq(%w{arf countersnark})
|
891
|
+
end
|
892
|
+
|
893
|
+
it "applies default attributes from the environment as environment defaults" do
|
894
|
+
node.expand!
|
895
|
+
expect(node.attributes.env_default["env default key"]).to eq("env default value")
|
896
|
+
end
|
897
|
+
|
898
|
+
it "applies override attributes from the environment as env overrides" do
|
899
|
+
node.expand!
|
900
|
+
expect(node.attributes.env_override["env override key"]).to eq("env override value")
|
901
|
+
end
|
902
|
+
|
903
|
+
it "applies default attributes from roles as role defaults" do
|
904
|
+
@expansion.default_attrs["role default key"] = "role default value"
|
905
|
+
node.expand!
|
906
|
+
expect(node.attributes.role_default["role default key"]).to eq("role default value")
|
907
|
+
end
|
908
|
+
|
909
|
+
it "applies override attributes from roles as role overrides" do
|
910
|
+
@expansion.override_attrs["role override key"] = "role override value"
|
911
|
+
node.expand!
|
912
|
+
expect(node.attributes.role_override["role override key"]).to eq("role override value")
|
913
|
+
end
|
914
|
+
end
|
915
|
+
|
916
|
+
describe "loaded_recipe" do
|
917
|
+
it "should not add a recipe that is already in the recipes list" do
|
918
|
+
node.automatic_attrs[:recipes] = [ "nginx::module" ]
|
919
|
+
node.loaded_recipe(:nginx, "module")
|
920
|
+
expect(node.automatic_attrs[:recipes].length).to eq(1)
|
921
|
+
end
|
922
|
+
|
923
|
+
it "should add a recipe that is not already in the recipes list" do
|
924
|
+
node.automatic_attrs[:recipes] = [ "nginx::other_module" ]
|
925
|
+
node.loaded_recipe(:nginx, "module")
|
926
|
+
expect(node.automatic_attrs[:recipes].length).to eq(2)
|
927
|
+
expect(node.recipe?("nginx::module")).to be true
|
928
|
+
expect(node.recipe?("nginx::other_module")).to be true
|
929
|
+
end
|
930
|
+
end
|
931
|
+
|
932
|
+
describe "when querying for recipes in the run list" do
|
933
|
+
context "when a recipe is in the top level run list" do
|
934
|
+
before do
|
935
|
+
node.run_list << "recipe[nginx::module]"
|
936
|
+
end
|
937
|
+
|
938
|
+
it "finds the recipe" do
|
939
|
+
expect(node.recipe?("nginx::module")).to be true
|
940
|
+
end
|
941
|
+
|
942
|
+
it "does not find a recipe not in the run list" do
|
943
|
+
expect(node.recipe?("nginx::other_module")).to be false
|
944
|
+
end
|
945
|
+
end
|
946
|
+
context "when a recipe is in the expanded run list only" do
|
947
|
+
before do
|
948
|
+
node.run_list << "role[base]"
|
949
|
+
node.automatic_attrs[:recipes] = [ "nginx::module" ]
|
950
|
+
end
|
951
|
+
|
952
|
+
it "finds a recipe in the expanded run list" do
|
953
|
+
expect(node.recipe?("nginx::module")).to be true
|
954
|
+
end
|
955
|
+
|
956
|
+
it "does not find a recipe that's not in the run list" do
|
957
|
+
expect(node.recipe?("nginx::other_module")).to be false
|
958
|
+
end
|
959
|
+
end
|
960
|
+
end
|
961
|
+
|
962
|
+
describe "when clearing computed state at the beginning of a run" do
|
963
|
+
before do
|
964
|
+
node.default[:foo] = "default"
|
965
|
+
node.normal[:foo] = "normal"
|
966
|
+
node.override[:foo] = "override"
|
967
|
+
node.reset_defaults_and_overrides
|
968
|
+
end
|
969
|
+
|
970
|
+
it "removes default attributes" do
|
971
|
+
expect(node.default).to be_empty
|
972
|
+
end
|
973
|
+
|
974
|
+
it "removes override attributes" do
|
975
|
+
expect(node.override).to be_empty
|
976
|
+
end
|
977
|
+
|
978
|
+
it "leaves normal level attributes untouched" do
|
979
|
+
expect(node[:foo]).to eq("normal")
|
980
|
+
end
|
981
|
+
|
982
|
+
end
|
983
|
+
|
984
|
+
describe "when merging environment attributes" do
|
985
|
+
before do
|
986
|
+
node.chef_environment = "rspec"
|
987
|
+
@expansion = Chef::RunList::RunListExpansion.new("rspec", [])
|
988
|
+
@expansion.default_attrs.replace({ :default => "from role", :d_role => "role only" })
|
989
|
+
@expansion.override_attrs.replace({ :override => "from role", :o_role => "role only" })
|
990
|
+
|
991
|
+
@environment = Chef::Environment.new
|
992
|
+
@environment.default_attributes = { :default => "from env", :d_env => "env only" }
|
993
|
+
@environment.override_attributes = { :override => "from env", :o_env => "env only" }
|
994
|
+
allow(Chef::Environment).to receive(:load).and_return(@environment)
|
995
|
+
node.apply_expansion_attributes(@expansion)
|
996
|
+
end
|
997
|
+
|
998
|
+
it "does not nuke role-only default attrs" do
|
999
|
+
expect(node[:d_role]).to eq("role only")
|
1000
|
+
end
|
1001
|
+
|
1002
|
+
it "does not nuke role-only override attrs" do
|
1003
|
+
expect(node[:o_role]).to eq("role only")
|
1004
|
+
end
|
1005
|
+
|
1006
|
+
it "does not nuke env-only default attrs" do
|
1007
|
+
expect(node[:o_env]).to eq("env only")
|
1008
|
+
end
|
1009
|
+
|
1010
|
+
it "does not nuke role-only override attrs" do
|
1011
|
+
expect(node[:o_env]).to eq("env only")
|
1012
|
+
end
|
1013
|
+
|
1014
|
+
it "gives role defaults precedence over env defaults" do
|
1015
|
+
expect(node[:default]).to eq("from role")
|
1016
|
+
end
|
1017
|
+
|
1018
|
+
it "gives env overrides precedence over role overrides" do
|
1019
|
+
expect(node[:override]).to eq("from env")
|
1020
|
+
end
|
1021
|
+
end
|
1022
|
+
|
1023
|
+
describe "when evaluating attributes files" do
|
1024
|
+
before do
|
1025
|
+
@cookbook_repo = File.expand_path(File.join(CHEF_SPEC_DATA, "cookbooks"))
|
1026
|
+
@cookbook_loader = Chef::CookbookLoader.new(@cookbook_repo)
|
1027
|
+
@cookbook_loader.load_cookbooks
|
1028
|
+
|
1029
|
+
@cookbook_collection = Chef::CookbookCollection.new(@cookbook_loader.cookbooks_by_name)
|
1030
|
+
|
1031
|
+
@events = Chef::EventDispatch::Dispatcher.new
|
1032
|
+
@run_context = Chef::RunContext.new(node, @cookbook_collection, @events)
|
1033
|
+
|
1034
|
+
node.include_attribute("openldap::default")
|
1035
|
+
node.include_attribute("openldap::smokey")
|
1036
|
+
end
|
1037
|
+
|
1038
|
+
it "sets attributes from the files" do
|
1039
|
+
expect(node.ldap_server).to eql("ops1prod")
|
1040
|
+
expect(node.ldap_basedn).to eql("dc=hjksolutions,dc=com")
|
1041
|
+
expect(node.ldap_replication_password).to eql("forsure")
|
1042
|
+
expect(node.smokey).to eql("robinson")
|
1043
|
+
end
|
1044
|
+
|
1045
|
+
it "gives a sensible error when attempting to load a missing attributes file" do
|
1046
|
+
expect { node.include_attribute("nope-this::doesnt-exist") }.to raise_error(Chef::Exceptions::CookbookNotFound)
|
1047
|
+
end
|
1048
|
+
end
|
1049
|
+
|
1050
|
+
describe "roles" do
|
1051
|
+
it "should allow you to query whether or not it has a recipe applied with role?" do
|
1052
|
+
node.run_list << "role[sunrise]"
|
1053
|
+
expect(node.role?("sunrise")).to eql(true)
|
1054
|
+
expect(node.role?("not at home")).to eql(false)
|
1055
|
+
end
|
1056
|
+
|
1057
|
+
it "should allow you to set roles with arguments" do
|
1058
|
+
node.run_list << "role[one]"
|
1059
|
+
node.run_list << "role[two]"
|
1060
|
+
expect(node.role?("one")).to eql(true)
|
1061
|
+
expect(node.role?("two")).to eql(true)
|
1062
|
+
end
|
1063
|
+
end
|
1064
|
+
|
1065
|
+
describe "run_list" do
|
1066
|
+
it "should have a Chef::RunList of recipes and roles that should be applied" do
|
1067
|
+
expect(node.run_list).to be_a_kind_of(Chef::RunList)
|
1068
|
+
end
|
1069
|
+
|
1070
|
+
it "should allow you to query the run list with arguments" do
|
1071
|
+
node.run_list "recipe[baz]"
|
1072
|
+
expect(node.run_list?("recipe[baz]")).to eql(true)
|
1073
|
+
end
|
1074
|
+
|
1075
|
+
it "should allow you to set the run list with arguments" do
|
1076
|
+
node.run_list "recipe[baz]", "role[foo]"
|
1077
|
+
expect(node.run_list?("recipe[baz]")).to eql(true)
|
1078
|
+
expect(node.run_list?("role[foo]")).to eql(true)
|
1079
|
+
end
|
1080
|
+
end
|
1081
|
+
|
1082
|
+
describe "from file" do
|
1083
|
+
it "should load a node from a ruby file" do
|
1084
|
+
node.from_file(File.expand_path(File.join(CHEF_SPEC_DATA, "nodes", "test.rb")))
|
1085
|
+
expect(node.name).to eql("test.example.com-short")
|
1086
|
+
expect(node.sunshine).to eql("in")
|
1087
|
+
expect(node.something).to eql("else")
|
1088
|
+
expect(node.run_list).to eq(["operations-master", "operations-monitoring"])
|
1089
|
+
end
|
1090
|
+
|
1091
|
+
it "should raise an exception if the file cannot be found or read" do
|
1092
|
+
expect { node.from_file("/tmp/monkeydiving") }.to raise_error(IOError)
|
1093
|
+
end
|
1094
|
+
end
|
1095
|
+
|
1096
|
+
describe "update_from!" do
|
1097
|
+
before(:each) do
|
1098
|
+
node.name("orig")
|
1099
|
+
node.chef_environment("dev")
|
1100
|
+
node.default_attrs = { "one" => { "two" => "three", "four" => "five", "eight" => "nine" } }
|
1101
|
+
node.override_attrs = { "one" => { "two" => "three", "four" => "six" } }
|
1102
|
+
node.normal_attrs = { "one" => { "two" => "seven" } }
|
1103
|
+
node.run_list << "role[marxist]"
|
1104
|
+
node.run_list << "role[leninist]"
|
1105
|
+
node.run_list << "recipe[stalinist]"
|
1106
|
+
|
1107
|
+
@example = Chef::Node.new()
|
1108
|
+
@example.name("newname")
|
1109
|
+
@example.chef_environment("prod")
|
1110
|
+
@example.default_attrs = { "alpha" => { "bravo" => "charlie", "delta" => "echo" } }
|
1111
|
+
@example.override_attrs = { "alpha" => { "bravo" => "foxtrot", "delta" => "golf" } }
|
1112
|
+
@example.normal_attrs = { "alpha" => { "bravo" => "hotel" } }
|
1113
|
+
@example.run_list << "role[comedy]"
|
1114
|
+
@example.run_list << "role[drama]"
|
1115
|
+
@example.run_list << "recipe[mystery]"
|
1116
|
+
end
|
1117
|
+
|
1118
|
+
it "allows update of everything except name" do
|
1119
|
+
node.update_from!(@example)
|
1120
|
+
expect(node.name).to eq("orig")
|
1121
|
+
expect(node.chef_environment).to eq(@example.chef_environment)
|
1122
|
+
expect(node.default_attrs).to eq(@example.default_attrs)
|
1123
|
+
expect(node.override_attrs).to eq(@example.override_attrs)
|
1124
|
+
expect(node.normal_attrs).to eq(@example.normal_attrs)
|
1125
|
+
expect(node.run_list).to eq(@example.run_list)
|
1126
|
+
end
|
1127
|
+
|
1128
|
+
it "should not update the name of the node" do
|
1129
|
+
expect(node).not_to receive(:name).with(@example.name)
|
1130
|
+
node.update_from!(@example)
|
1131
|
+
end
|
1132
|
+
end
|
1133
|
+
|
1134
|
+
describe "to_hash" do
|
1135
|
+
it "should serialize itself as a hash" do
|
1136
|
+
node.chef_environment("dev")
|
1137
|
+
node.default_attrs = { "one" => { "two" => "three", "four" => "five", "eight" => "nine" } }
|
1138
|
+
node.override_attrs = { "one" => { "two" => "three", "four" => "six" } }
|
1139
|
+
node.normal_attrs = { "one" => { "two" => "seven" } }
|
1140
|
+
node.run_list << "role[marxist]"
|
1141
|
+
node.run_list << "role[leninist]"
|
1142
|
+
node.run_list << "recipe[stalinist]"
|
1143
|
+
h = node.to_hash
|
1144
|
+
expect(h["one"]["two"]).to eq("three")
|
1145
|
+
expect(h["one"]["four"]).to eq("six")
|
1146
|
+
expect(h["one"]["eight"]).to eq("nine")
|
1147
|
+
expect(h["role"]).to be_include("marxist")
|
1148
|
+
expect(h["role"]).to be_include("leninist")
|
1149
|
+
expect(h["run_list"]).to be_include("role[marxist]")
|
1150
|
+
expect(h["run_list"]).to be_include("role[leninist]")
|
1151
|
+
expect(h["run_list"]).to be_include("recipe[stalinist]")
|
1152
|
+
expect(h["chef_environment"]).to eq("dev")
|
1153
|
+
end
|
1154
|
+
|
1155
|
+
it "should return an empty array for empty run_list" do
|
1156
|
+
expect(node.to_hash["run_list"]).to eq([])
|
1157
|
+
end
|
1158
|
+
end
|
1159
|
+
|
1160
|
+
describe "converting to or from json" do
|
1161
|
+
it "should serialize itself as json", :json => true do
|
1162
|
+
node.from_file(File.expand_path("nodes/test.example.com.rb", CHEF_SPEC_DATA))
|
1163
|
+
json = Chef::JSONCompat.to_json(node)
|
1164
|
+
expect(json).to match(/json_class/)
|
1165
|
+
expect(json).to match(/name/)
|
1166
|
+
expect(json).to match(/chef_environment/)
|
1167
|
+
expect(json).to match(/normal/)
|
1168
|
+
expect(json).to match(/default/)
|
1169
|
+
expect(json).to match(/override/)
|
1170
|
+
expect(json).to match(/run_list/)
|
1171
|
+
end
|
1172
|
+
|
1173
|
+
it "should serialize valid json with a run list", :json => true do
|
1174
|
+
#This test came about because activesupport mucks with Chef json serialization
|
1175
|
+
#Test should pass with and without Activesupport
|
1176
|
+
node.run_list << { "type" => "role", "name" => "Cthulu" }
|
1177
|
+
node.run_list << { "type" => "role", "name" => "Hastur" }
|
1178
|
+
json = Chef::JSONCompat.to_json(node)
|
1179
|
+
expect(json).to match(/\"run_list\":\[\"role\[Cthulu\]\",\"role\[Hastur\]\"\]/)
|
1180
|
+
end
|
1181
|
+
|
1182
|
+
it "should serialize the correct run list", :json => true do
|
1183
|
+
node.run_list << "role[marxist]"
|
1184
|
+
node.run_list << "role[leninist]"
|
1185
|
+
node.override_runlist << "role[stalinist]"
|
1186
|
+
expect(node.run_list).to be_include("role[stalinist]")
|
1187
|
+
json = Chef::JSONCompat.to_json(node)
|
1188
|
+
expect(json).to match(/\"run_list\":\[\"role\[marxist\]\",\"role\[leninist\]\"\]/)
|
1189
|
+
end
|
1190
|
+
|
1191
|
+
it "merges the override components into a combined override object" do
|
1192
|
+
node.attributes.role_override["role override"] = "role override"
|
1193
|
+
node.attributes.env_override["env override"] = "env override"
|
1194
|
+
node_for_json = node.for_json
|
1195
|
+
expect(node_for_json["override"]["role override"]).to eq("role override")
|
1196
|
+
expect(node_for_json["override"]["env override"]).to eq("env override")
|
1197
|
+
end
|
1198
|
+
|
1199
|
+
it "merges the default components into a combined default object" do
|
1200
|
+
node.attributes.role_default["role default"] = "role default"
|
1201
|
+
node.attributes.env_default["env default"] = "env default"
|
1202
|
+
node_for_json = node.for_json
|
1203
|
+
expect(node_for_json["default"]["role default"]).to eq("role default")
|
1204
|
+
expect(node_for_json["default"]["env default"]).to eq("env default")
|
1205
|
+
end
|
1206
|
+
|
1207
|
+
it "should deserialize itself from json", :json => true do
|
1208
|
+
node.from_file(File.expand_path("nodes/test.example.com.rb", CHEF_SPEC_DATA))
|
1209
|
+
json = Chef::JSONCompat.to_json(node)
|
1210
|
+
serialized_node = Chef::Node.from_hash(Chef::JSONCompat.parse(json))
|
1211
|
+
expect(serialized_node).to be_a_kind_of(Chef::Node)
|
1212
|
+
expect(serialized_node.name).to eql(node.name)
|
1213
|
+
expect(serialized_node.chef_environment).to eql(node.chef_environment)
|
1214
|
+
node.each_attribute do |k, v|
|
1215
|
+
expect(serialized_node[k]).to eql(v)
|
1216
|
+
end
|
1217
|
+
expect(serialized_node.run_list).to eq(node.run_list)
|
1218
|
+
end
|
1219
|
+
|
1220
|
+
context "when policyfile attributes are not present" do
|
1221
|
+
|
1222
|
+
it "does not have a policy_name key in the json" do
|
1223
|
+
expect(node.for_json.keys).to_not include("policy_name")
|
1224
|
+
end
|
1225
|
+
|
1226
|
+
it "does not have a policy_group key in the json" do
|
1227
|
+
expect(node.for_json.keys).to_not include("policy_name")
|
1228
|
+
end
|
1229
|
+
end
|
1230
|
+
|
1231
|
+
context "when policyfile attributes are present" do
|
1232
|
+
|
1233
|
+
before do
|
1234
|
+
node.policy_name = "my-application"
|
1235
|
+
node.policy_group = "staging"
|
1236
|
+
end
|
1237
|
+
|
1238
|
+
it "includes policy_name key in the json" do
|
1239
|
+
expect(node.for_json).to have_key("policy_name")
|
1240
|
+
expect(node.for_json["policy_name"]).to eq("my-application")
|
1241
|
+
end
|
1242
|
+
|
1243
|
+
it "includes a policy_group key in the json" do
|
1244
|
+
expect(node.for_json).to have_key("policy_group")
|
1245
|
+
expect(node.for_json["policy_group"]).to eq("staging")
|
1246
|
+
end
|
1247
|
+
|
1248
|
+
it "parses policyfile attributes from JSON" do
|
1249
|
+
round_tripped_node = Chef::Node.from_hash(node.for_json)
|
1250
|
+
|
1251
|
+
expect(round_tripped_node.policy_name).to eq("my-application")
|
1252
|
+
expect(round_tripped_node.policy_group).to eq("staging")
|
1253
|
+
end
|
1254
|
+
|
1255
|
+
end
|
1256
|
+
|
1257
|
+
include_examples "to_json equivalent to Chef::JSONCompat.to_json" do
|
1258
|
+
let(:jsonable) {
|
1259
|
+
node.from_file(File.expand_path("nodes/test.example.com.rb", CHEF_SPEC_DATA))
|
1260
|
+
node
|
1261
|
+
}
|
1262
|
+
end
|
1263
|
+
end
|
1264
|
+
|
1265
|
+
describe "to_s" do
|
1266
|
+
it "should turn into a string like node[name]" do
|
1267
|
+
node.name("airplane")
|
1268
|
+
expect(node.to_s).to eql("node[airplane]")
|
1269
|
+
end
|
1270
|
+
end
|
1271
|
+
|
1272
|
+
describe "api model" do
|
1273
|
+
before(:each) do
|
1274
|
+
@rest = double("Chef::ServerAPI")
|
1275
|
+
allow(Chef::ServerAPI).to receive(:new).and_return(@rest)
|
1276
|
+
@query = double("Chef::Search::Query")
|
1277
|
+
allow(Chef::Search::Query).to receive(:new).and_return(@query)
|
1278
|
+
end
|
1279
|
+
|
1280
|
+
describe "list" do
|
1281
|
+
describe "inflated" do
|
1282
|
+
it "should return a hash of node names and objects" do
|
1283
|
+
n1 = double("Chef::Node", :name => "one")
|
1284
|
+
allow(n1).to receive(:kind_of?).with(Chef::Node) { true }
|
1285
|
+
expect(@query).to receive(:search).with(:node).and_yield(n1)
|
1286
|
+
r = Chef::Node.list(true)
|
1287
|
+
expect(r["one"]).to eq(n1)
|
1288
|
+
end
|
1289
|
+
end
|
1290
|
+
|
1291
|
+
it "should return a hash of node names and urls" do
|
1292
|
+
expect(@rest).to receive(:get).and_return({ "one" => "http://foo" })
|
1293
|
+
r = Chef::Node.list
|
1294
|
+
expect(r["one"]).to eq("http://foo")
|
1295
|
+
end
|
1296
|
+
end
|
1297
|
+
|
1298
|
+
describe "load" do
|
1299
|
+
it "should load a node by name" do
|
1300
|
+
node.from_file(File.expand_path("nodes/test.example.com.rb", CHEF_SPEC_DATA))
|
1301
|
+
json = Chef::JSONCompat.to_json(node)
|
1302
|
+
parsed = Chef::JSONCompat.parse(json)
|
1303
|
+
expect(@rest).to receive(:get).with("nodes/test.example.com").and_return(parsed)
|
1304
|
+
serialized_node = Chef::Node.load("test.example.com")
|
1305
|
+
expect(serialized_node).to be_a_kind_of(Chef::Node)
|
1306
|
+
expect(serialized_node.name).to eql(node.name)
|
1307
|
+
end
|
1308
|
+
end
|
1309
|
+
|
1310
|
+
describe "destroy" do
|
1311
|
+
it "should destroy a node" do
|
1312
|
+
expect(@rest).to receive(:delete).with("nodes/monkey").and_return("foo")
|
1313
|
+
node.name("monkey")
|
1314
|
+
node.destroy
|
1315
|
+
end
|
1316
|
+
end
|
1317
|
+
|
1318
|
+
describe "save" do
|
1319
|
+
it "should update a node if it already exists" do
|
1320
|
+
node.name("monkey")
|
1321
|
+
allow(node).to receive(:data_for_save).and_return({})
|
1322
|
+
expect(@rest).to receive(:put).with("nodes/monkey", {}).and_return("foo")
|
1323
|
+
node.save
|
1324
|
+
end
|
1325
|
+
|
1326
|
+
it "should not try and create if it can update" do
|
1327
|
+
node.name("monkey")
|
1328
|
+
allow(node).to receive(:data_for_save).and_return({})
|
1329
|
+
expect(@rest).to receive(:put).with("nodes/monkey", {}).and_return("foo")
|
1330
|
+
expect(@rest).not_to receive(:post)
|
1331
|
+
node.save
|
1332
|
+
end
|
1333
|
+
|
1334
|
+
it "should create if it cannot update" do
|
1335
|
+
node.name("monkey")
|
1336
|
+
allow(node).to receive(:data_for_save).and_return({})
|
1337
|
+
exception = double("404 error", :code => "404")
|
1338
|
+
expect(@rest).to receive(:put).and_raise(Net::HTTPServerException.new("foo", exception))
|
1339
|
+
expect(@rest).to receive(:post).with("nodes", {})
|
1340
|
+
node.save
|
1341
|
+
end
|
1342
|
+
|
1343
|
+
describe "when whyrun mode is enabled" do
|
1344
|
+
before do
|
1345
|
+
Chef::Config[:why_run] = true
|
1346
|
+
end
|
1347
|
+
after do
|
1348
|
+
Chef::Config[:why_run] = false
|
1349
|
+
end
|
1350
|
+
it "should not save" do
|
1351
|
+
node.name("monkey")
|
1352
|
+
expect(@rest).not_to receive(:put)
|
1353
|
+
expect(@rest).not_to receive(:post)
|
1354
|
+
node.save
|
1355
|
+
end
|
1356
|
+
end
|
1357
|
+
|
1358
|
+
context "with whitelisted attributes configured" do
|
1359
|
+
it "should only save whitelisted attributes (and subattributes)" do
|
1360
|
+
Chef::Config[:automatic_attribute_whitelist] = [
|
1361
|
+
["filesystem", "/dev/disk0s2"],
|
1362
|
+
"network/interfaces/eth0",
|
1363
|
+
]
|
1364
|
+
|
1365
|
+
data = {
|
1366
|
+
"automatic" => {
|
1367
|
+
"filesystem" => {
|
1368
|
+
"/dev/disk0s2" => { "size" => "10mb" },
|
1369
|
+
"map - autohome" => { "size" => "10mb" },
|
1370
|
+
},
|
1371
|
+
"network" => {
|
1372
|
+
"interfaces" => {
|
1373
|
+
"eth0" => {},
|
1374
|
+
"eth1" => {},
|
1375
|
+
},
|
1376
|
+
},
|
1377
|
+
},
|
1378
|
+
"default" => {}, "normal" => {}, "override" => {}
|
1379
|
+
}
|
1380
|
+
|
1381
|
+
selected_data = {
|
1382
|
+
"automatic" => {
|
1383
|
+
"filesystem" => {
|
1384
|
+
"/dev/disk0s2" => { "size" => "10mb" },
|
1385
|
+
},
|
1386
|
+
"network" => {
|
1387
|
+
"interfaces" => {
|
1388
|
+
"eth0" => {},
|
1389
|
+
},
|
1390
|
+
},
|
1391
|
+
},
|
1392
|
+
"default" => {}, "normal" => {}, "override" => {}
|
1393
|
+
}
|
1394
|
+
|
1395
|
+
node.name("picky-monkey")
|
1396
|
+
allow(node).to receive(:for_json).and_return(data)
|
1397
|
+
expect(@rest).to receive(:put).with("nodes/picky-monkey", selected_data).and_return("foo")
|
1398
|
+
node.save
|
1399
|
+
end
|
1400
|
+
|
1401
|
+
it "should save false-y whitelisted attributes" do
|
1402
|
+
Chef::Config[:default_attribute_whitelist] = [
|
1403
|
+
"foo/bar/baz",
|
1404
|
+
]
|
1405
|
+
|
1406
|
+
data = {
|
1407
|
+
"default" => {
|
1408
|
+
"foo" => {
|
1409
|
+
"bar" => {
|
1410
|
+
"baz" => false,
|
1411
|
+
},
|
1412
|
+
"other" => {
|
1413
|
+
"stuff" => true,
|
1414
|
+
},
|
1415
|
+
},
|
1416
|
+
},
|
1417
|
+
}
|
1418
|
+
|
1419
|
+
selected_data = {
|
1420
|
+
"default" => {
|
1421
|
+
"foo" => {
|
1422
|
+
"bar" => {
|
1423
|
+
"baz" => false,
|
1424
|
+
},
|
1425
|
+
},
|
1426
|
+
},
|
1427
|
+
}
|
1428
|
+
|
1429
|
+
node.name("falsey-monkey")
|
1430
|
+
allow(node).to receive(:for_json).and_return(data)
|
1431
|
+
expect(@rest).to receive(:put).with("nodes/falsey-monkey", selected_data).and_return("foo")
|
1432
|
+
node.save
|
1433
|
+
end
|
1434
|
+
|
1435
|
+
it "should not save any attributes if the whitelist is empty" do
|
1436
|
+
Chef::Config[:automatic_attribute_whitelist] = []
|
1437
|
+
|
1438
|
+
data = {
|
1439
|
+
"automatic" => {
|
1440
|
+
"filesystem" => {
|
1441
|
+
"/dev/disk0s2" => { "size" => "10mb" },
|
1442
|
+
"map - autohome" => { "size" => "10mb" },
|
1443
|
+
},
|
1444
|
+
},
|
1445
|
+
"default" => {}, "normal" => {}, "override" => {}
|
1446
|
+
}
|
1447
|
+
|
1448
|
+
selected_data = {
|
1449
|
+
"automatic" => {}, "default" => {}, "normal" => {}, "override" => {}
|
1450
|
+
}
|
1451
|
+
|
1452
|
+
node.name("picky-monkey")
|
1453
|
+
allow(node).to receive(:for_json).and_return(data)
|
1454
|
+
expect(@rest).to receive(:put).with("nodes/picky-monkey", selected_data).and_return("foo")
|
1455
|
+
node.save
|
1456
|
+
end
|
1457
|
+
end
|
1458
|
+
|
1459
|
+
context "when policyfile attributes are present" do
|
1460
|
+
|
1461
|
+
before do
|
1462
|
+
node.name("example-node")
|
1463
|
+
node.policy_name = "my-application"
|
1464
|
+
node.policy_group = "staging"
|
1465
|
+
end
|
1466
|
+
|
1467
|
+
context "and the server supports policyfile attributes in node JSON" do
|
1468
|
+
|
1469
|
+
it "creates the object normally" do
|
1470
|
+
expect(@rest).to receive(:post).with("nodes", node.for_json)
|
1471
|
+
node.create
|
1472
|
+
end
|
1473
|
+
|
1474
|
+
it "saves the node object normally" do
|
1475
|
+
expect(@rest).to receive(:put).with("nodes/example-node", node.for_json)
|
1476
|
+
node.save
|
1477
|
+
end
|
1478
|
+
end
|
1479
|
+
|
1480
|
+
# Chef Server before 12.3
|
1481
|
+
context "and the Chef Server does not support policyfile attributes in node JSON" do
|
1482
|
+
|
1483
|
+
let(:response_body) { %q[{"error":["Invalid key policy_name in request body"]}] }
|
1484
|
+
|
1485
|
+
let(:response) do
|
1486
|
+
Net::HTTPResponse.send(:response_class, "400").new("1.0", "400", "Bad Request").tap do |r|
|
1487
|
+
allow(r).to receive(:body).and_return(response_body)
|
1488
|
+
end
|
1489
|
+
end
|
1490
|
+
|
1491
|
+
let(:http_exception) do
|
1492
|
+
begin
|
1493
|
+
response.error!
|
1494
|
+
rescue => e
|
1495
|
+
e
|
1496
|
+
end
|
1497
|
+
end
|
1498
|
+
|
1499
|
+
let(:trimmed_node) do
|
1500
|
+
node.for_json.tap do |j|
|
1501
|
+
j.delete("policy_name")
|
1502
|
+
j.delete("policy_group")
|
1503
|
+
end
|
1504
|
+
|
1505
|
+
end
|
1506
|
+
|
1507
|
+
context "on Chef Client 13 and later" do
|
1508
|
+
|
1509
|
+
# Though we normally attempt to provide compatibility with chef
|
1510
|
+
# server one major version back, policyfiles were beta when we
|
1511
|
+
# added the policyfile attributes to the node JSON, therefore
|
1512
|
+
# policyfile users need to be on 12.3 minimum when upgrading Chef
|
1513
|
+
# Client to 13+
|
1514
|
+
it "lets the 400 pass through", chef: ">= 13" do
|
1515
|
+
expect { node.save }.to raise_error(http_exception)
|
1516
|
+
end
|
1517
|
+
|
1518
|
+
end
|
1519
|
+
|
1520
|
+
context "when the node exists" do
|
1521
|
+
|
1522
|
+
it "falls back to saving without policyfile attributes" do
|
1523
|
+
expect(@rest).to receive(:put).with("nodes/example-node", node.for_json).and_raise(http_exception)
|
1524
|
+
expect(@rest).to receive(:put).with("nodes/example-node", trimmed_node).and_return(@node)
|
1525
|
+
expect { node.save }.to_not raise_error
|
1526
|
+
end
|
1527
|
+
|
1528
|
+
end
|
1529
|
+
|
1530
|
+
context "when the node doesn't exist" do
|
1531
|
+
|
1532
|
+
let(:response_404) do
|
1533
|
+
Net::HTTPResponse.send(:response_class, "404").new("1.0", "404", "Not Found")
|
1534
|
+
end
|
1535
|
+
|
1536
|
+
let(:http_exception_404) do
|
1537
|
+
begin
|
1538
|
+
response_404.error!
|
1539
|
+
rescue => e
|
1540
|
+
e
|
1541
|
+
end
|
1542
|
+
end
|
1543
|
+
|
1544
|
+
it "falls back to saving without policyfile attributes" do
|
1545
|
+
expect(@rest).to receive(:put).with("nodes/example-node", node.for_json).and_raise(http_exception)
|
1546
|
+
expect(@rest).to receive(:put).with("nodes/example-node", trimmed_node).and_raise(http_exception_404)
|
1547
|
+
expect(@rest).to receive(:post).with("nodes", trimmed_node).and_return(@node)
|
1548
|
+
node.save
|
1549
|
+
end
|
1550
|
+
|
1551
|
+
it "creates the node without policyfile attributes" do
|
1552
|
+
expect(@rest).to receive(:post).with("nodes", node.for_json).and_raise(http_exception)
|
1553
|
+
expect(@rest).to receive(:post).with("nodes", trimmed_node).and_return(@node)
|
1554
|
+
node.create
|
1555
|
+
end
|
1556
|
+
end
|
1557
|
+
|
1558
|
+
end
|
1559
|
+
|
1560
|
+
end
|
1561
|
+
|
1562
|
+
end
|
1563
|
+
end
|
1564
|
+
|
1565
|
+
end
|