chef 13.12.14-universal-mingw32 → 14.0.190-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 +151 -0
- data/Gemfile +12 -9
- data/README.md +34 -32
- data/Rakefile +22 -18
- data/VERSION +1 -0
- data/acceptance/.shared/kitchen_acceptance/.kitchen.digitalocean.yml +33 -0
- data/acceptance/.shared/kitchen_acceptance/.kitchen.ec2.yml +272 -0
- data/acceptance/.shared/kitchen_acceptance/.kitchen.vagrant.yml +57 -0
- data/acceptance/.shared/kitchen_acceptance/libraries/kitchen.rb +68 -0
- data/acceptance/.shared/kitchen_acceptance/metadata.rb +1 -0
- data/acceptance/Gemfile +19 -0
- data/acceptance/Gemfile.lock +266 -0
- data/acceptance/README.md +137 -0
- data/acceptance/basics/.acceptance/acceptance-cookbook/.gitignore +2 -0
- data/acceptance/basics/.acceptance/acceptance-cookbook/metadata.rb +3 -0
- data/acceptance/basics/.acceptance/acceptance-cookbook/recipes/destroy.rb +1 -0
- data/acceptance/basics/.acceptance/acceptance-cookbook/recipes/provision.rb +1 -0
- data/acceptance/basics/.acceptance/acceptance-cookbook/recipes/verify.rb +1 -0
- data/acceptance/basics/.kitchen.yml +4 -0
- data/acceptance/basics/test/integration/chef-current-install/serverspec/chef_client_spec.rb +19 -0
- data/acceptance/basics/test/integration/chef-current-install/serverspec/spec_helper.rb +6 -0
- data/acceptance/basics/test/integration/helpers/serverspec/Gemfile +8 -0
- data/acceptance/data-collector/.acceptance/acceptance-cookbook/.gitignore +2 -0
- data/acceptance/data-collector/.acceptance/acceptance-cookbook/metadata.rb +3 -0
- data/acceptance/data-collector/.acceptance/acceptance-cookbook/recipes/destroy.rb +2 -0
- data/acceptance/data-collector/.acceptance/acceptance-cookbook/recipes/provision.rb +2 -0
- data/acceptance/data-collector/.acceptance/acceptance-cookbook/recipes/verify.rb +2 -0
- data/acceptance/data-collector/.acceptance/data-collector-test/.gitignore +16 -0
- data/acceptance/data-collector/.acceptance/data-collector-test/Berksfile +3 -0
- data/acceptance/data-collector/.acceptance/data-collector-test/files/default/api.rb +101 -0
- data/acceptance/data-collector/.acceptance/data-collector-test/files/default/apigemfile +3 -0
- data/acceptance/data-collector/.acceptance/data-collector-test/files/default/client-rb-both-mode.rb +4 -0
- data/acceptance/data-collector/.acceptance/data-collector-test/files/default/client-rb-client-mode.rb +4 -0
- data/acceptance/data-collector/.acceptance/data-collector-test/files/default/client-rb-no-endpoint.rb +2 -0
- data/acceptance/data-collector/.acceptance/data-collector-test/files/default/client-rb-solo-mode.rb +4 -0
- data/acceptance/data-collector/.acceptance/data-collector-test/files/default/config.ru +2 -0
- data/acceptance/data-collector/.acceptance/data-collector-test/metadata.rb +7 -0
- data/acceptance/data-collector/.acceptance/data-collector-test/recipes/default.rb +44 -0
- data/acceptance/data-collector/.kitchen.yml +9 -0
- data/acceptance/data-collector/Berksfile +3 -0
- data/acceptance/data-collector/test/integration/default/serverspec/default_spec.rb +208 -0
- data/acceptance/data-collector/test/integration/helpers/serverspec/Gemfile +8 -0
- 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 -0
- data/acceptance/top-cookbooks/.acceptance/acceptance-cookbook/libraries/cookbook_kitchen.rb +43 -0
- data/acceptance/top-cookbooks/.acceptance/acceptance-cookbook/libraries/top_cookbooks.rb +41 -0
- data/acceptance/top-cookbooks/.acceptance/acceptance-cookbook/metadata.rb +3 -0
- data/acceptance/top-cookbooks/.acceptance/acceptance-cookbook/recipes/destroy.rb +1 -0
- data/acceptance/top-cookbooks/.acceptance/acceptance-cookbook/recipes/provision.rb +1 -0
- data/acceptance/top-cookbooks/.acceptance/acceptance-cookbook/recipes/verify.rb +1 -0
- data/acceptance/top-cookbooks/.gitignore +1 -0
- data/acceptance/top-cookbooks/.kitchen.chocolatey.yml +6 -0
- data/acceptance/top-cookbooks/.kitchen.iis.yml +4 -0
- data/acceptance/top-cookbooks/.kitchen.learn-the-basics-rhel.yml +7 -0
- data/acceptance/top-cookbooks/.kitchen.learn-the-basics-ubuntu.yml +7 -0
- data/acceptance/top-cookbooks/.kitchen.learn-the-basics-windows.yml +7 -0
- 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 -0
- data/acceptance/trivial/.acceptance/acceptance-cookbook/metadata.rb +2 -0
- data/acceptance/trivial/.acceptance/acceptance-cookbook/recipes/destroy.rb +1 -0
- data/acceptance/trivial/.acceptance/acceptance-cookbook/recipes/provision.rb +1 -0
- data/acceptance/trivial/.acceptance/acceptance-cookbook/recipes/verify.rb +1 -0
- data/acceptance/trivial/.kitchen.yml +7 -0
- data/acceptance/trivial/test/integration/chef-current-install/inspec/chef_client_spec.rb +5 -0
- data/acceptance/windows-service/.acceptance/acceptance-cookbook/.gitignore +2 -0
- data/acceptance/windows-service/.acceptance/acceptance-cookbook/metadata.rb +2 -0
- data/acceptance/windows-service/.acceptance/acceptance-cookbook/recipes/destroy.rb +1 -0
- data/acceptance/windows-service/.acceptance/acceptance-cookbook/recipes/provision.rb +1 -0
- data/acceptance/windows-service/.acceptance/acceptance-cookbook/recipes/verify.rb +1 -0
- data/acceptance/windows-service/.kitchen.yml +7 -0
- data/acceptance/windows-service/test/integration/chef-windows-service/inspec/chef_windows_service_spec.rb +58 -0
- data/chef-universal-mingw32.gemspec +2 -2
- data/chef.gemspec +10 -10
- data/distro/powershell/chef/Chef.PowerShell.dll +0 -0
- data/distro/powershell/chef/Newtonsoft.Json.dll +0 -0
- data/lib/chef/api_client.rb +1 -1
- data/lib/chef/api_client/registration.rb +10 -2
- data/lib/chef/api_client_v1.rb +7 -6
- data/lib/chef/application.rb +75 -46
- data/lib/chef/application/client.rb +17 -19
- data/lib/chef/application/solo.rb +13 -16
- data/lib/chef/application/windows_service.rb +5 -5
- data/lib/chef/audit/audit_event_proxy.rb +1 -1
- data/lib/chef/audit/audit_reporter.rb +12 -12
- data/lib/chef/audit/runner.rb +2 -2
- data/lib/chef/chef_fs/chef_fs_data_store.rb +17 -31
- data/lib/chef/chef_fs/command_line.rb +9 -9
- data/lib/chef/chef_fs/data_handler/acl_data_handler.rb +1 -1
- data/lib/chef/chef_fs/data_handler/policy_data_handler.rb +1 -1
- data/lib/chef/chef_fs/data_handler/policy_group_data_handler.rb +1 -1
- data/lib/chef/chef_fs/file_system/chef_server/cookbook_dir.rb +2 -2
- data/lib/chef/chef_fs/file_system/chef_server/policies_dir.rb +2 -2
- data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +1 -1
- data/lib/chef/chef_fs/file_system/repository/base_file.rb +2 -2
- data/lib/chef/chef_fs/file_system_cache.rb +1 -1
- data/lib/chef/chef_fs/path_utils.rb +2 -2
- data/lib/chef/client.rb +61 -41
- data/lib/chef/config.rb +1 -2
- data/lib/chef/config_fetcher.rb +1 -1
- data/lib/chef/cookbook/chefignore.rb +2 -2
- data/lib/chef/cookbook/cookbook_collection.rb +2 -2
- data/lib/chef/cookbook/cookbook_version_loader.rb +0 -1
- data/lib/chef/cookbook/gem_installer.rb +4 -4
- data/lib/chef/cookbook/manifest_v2.rb +1 -1
- data/lib/chef/cookbook/metadata.rb +2 -3
- data/lib/chef/cookbook/remote_file_vendor.rb +4 -4
- data/lib/chef/cookbook/synchronizer.rb +2 -2
- data/lib/chef/cookbook/syntax_check.rb +4 -4
- data/lib/chef/cookbook_loader.rb +10 -2
- data/lib/chef/cookbook_site_streaming_uploader.rb +4 -4
- data/lib/chef/cookbook_uploader.rb +2 -3
- data/lib/chef/cookbook_version.rb +5 -11
- data/lib/chef/data_bag.rb +1 -3
- data/lib/chef/data_bag_item.rb +1 -7
- data/lib/chef/data_collector.rb +111 -35
- data/lib/chef/data_collector/messages.rb +2 -2
- data/lib/chef/data_collector/messages/helpers.rb +2 -4
- data/lib/chef/deprecated.rb +0 -4
- data/lib/chef/dsl/data_query.rb +1 -5
- data/lib/chef/dsl/include_attribute.rb +3 -7
- data/lib/chef/dsl/include_recipe.rb +1 -5
- data/lib/chef/dsl/platform_introspection.rb +9 -13
- data/lib/chef/dsl/reboot_pending.rb +1 -8
- data/lib/chef/dsl/recipe.rb +2 -12
- data/lib/chef/dsl/universal.rb +3 -3
- data/lib/chef/environment.rb +2 -4
- data/lib/chef/event_dispatch/dsl.rb +2 -2
- data/lib/chef/exceptions.rb +1 -1
- data/lib/chef/file_access_control/unix.rb +14 -14
- data/lib/chef/file_content_management/content_base.rb +3 -1
- data/lib/chef/file_content_management/deploy/cp.rb +2 -2
- data/lib/chef/file_content_management/deploy/mv_unix.rb +4 -4
- data/lib/chef/file_content_management/deploy/mv_windows.rb +1 -1
- data/lib/chef/file_content_management/tempfile.rb +1 -1
- data/lib/chef/formatters/error_inspectors/compile_error_inspector.rb +3 -3
- data/lib/chef/guard_interpreter/default_guard_interpreter.rb +3 -1
- data/lib/chef/guard_interpreter/resource_guard_interpreter.rb +2 -2
- data/lib/chef/handler.rb +1 -3
- data/lib/chef/handler/json_file.rb +1 -2
- data/lib/chef/http.rb +23 -11
- data/lib/chef/http/auth_credentials.rb +1 -1
- data/lib/chef/http/basic_client.rb +16 -17
- data/lib/chef/http/decompressor.rb +6 -6
- data/lib/chef/http/http_request.rb +5 -5
- data/lib/chef/http/json_output.rb +2 -2
- data/lib/chef/http/socketless_chef_zero_client.rb +2 -2
- data/lib/chef/http/validate_content_length.rb +5 -5
- data/lib/chef/knife.rb +1 -1
- data/lib/chef/knife/bootstrap.rb +12 -37
- data/lib/chef/knife/bootstrap/templates/chef-full.erb +7 -1
- data/lib/chef/knife/client_reregister.rb +1 -1
- data/lib/chef/knife/configure.rb +1 -3
- data/lib/chef/knife/cookbook_download.rb +2 -2
- data/lib/chef/knife/cookbook_metadata.rb +3 -3
- data/lib/chef/knife/cookbook_site_install.rb +2 -2
- data/lib/chef/knife/cookbook_site_share.rb +5 -5
- data/lib/chef/knife/cookbook_test.rb +2 -2
- data/lib/chef/knife/cookbook_upload.rb +2 -2
- data/lib/chef/knife/core/status_presenter.rb +22 -17
- data/lib/chef/knife/core/subcommand_loader.rb +1 -1
- data/lib/chef/knife/deps.rb +1 -1
- data/lib/chef/knife/environment_compare.rb +4 -4
- data/lib/chef/knife/exec.rb +3 -3
- data/lib/chef/knife/list.rb +1 -1
- data/lib/chef/knife/node_policy_set.rb +79 -0
- data/lib/chef/knife/osc_user_reregister.rb +1 -1
- data/lib/chef/knife/ssh.rb +35 -22
- data/lib/chef/knife/ssl_check.rb +3 -3
- data/lib/chef/knife/ssl_fetch.rb +1 -1
- data/lib/chef/knife/user_reregister.rb +1 -1
- data/lib/chef/knife/xargs.rb +1 -1
- data/lib/chef/mixin/api_version_request_handling.rb +2 -4
- data/lib/chef/mixin/create_path.rb +1 -1
- data/lib/chef/mixin/deprecation.rb +14 -14
- data/lib/chef/mixin/from_file.rb +5 -0
- data/lib/chef/mixin/get_source_from_package.rb +2 -2
- data/lib/chef/mixin/homebrew_user.rb +13 -2
- data/lib/chef/mixin/openssl_helper.rb +119 -0
- data/lib/chef/mixin/params_validate.rb +2 -8
- data/lib/chef/mixin/powershell_exec.rb +105 -0
- data/lib/chef/mixin/provides.rb +3 -2
- data/lib/chef/mixin/securable.rb +1 -5
- data/lib/chef/mixin/shell_out.rb +2 -2
- data/lib/chef/mixin/template.rb +1 -3
- data/lib/chef/mixin/user_context.rb +6 -3
- data/lib/chef/mixin/why_run.rb +6 -11
- data/lib/chef/monkey_patches/net_http.rb +7 -7
- data/lib/chef/monologger.rb +2 -86
- data/lib/chef/node.rb +30 -20
- data/lib/chef/node/attribute.rb +1 -6
- data/lib/chef/node/attribute_collections.rb +2 -2
- data/lib/chef/node/immutable_collections.rb +1 -1
- data/lib/chef/node/mixin/immutablize_array.rb +110 -3
- data/lib/chef/node/mixin/immutablize_hash.rb +111 -5
- data/lib/chef/node_map.rb +5 -23
- data/lib/chef/platform/query_helpers.rb +0 -12
- data/lib/chef/policy_builder/dynamic.rb +1 -1
- data/lib/chef/policy_builder/expand_node_object.rb +1 -1
- data/lib/chef/policy_builder/policyfile.rb +17 -1
- data/lib/chef/powershell.rb +55 -0
- data/lib/chef/property.rb +12 -34
- data/lib/chef/provider.rb +16 -39
- data/lib/chef/provider/apt_preference.rb +3 -3
- data/lib/chef/provider/apt_repository.rb +116 -34
- data/lib/chef/provider/batch.rb +1 -1
- data/lib/chef/provider/cookbook_file/content.rb +1 -1
- data/lib/chef/provider/cron.rb +10 -10
- data/lib/chef/provider/cron/unix.rb +3 -3
- data/lib/chef/provider/directory.rb +3 -3
- data/lib/chef/provider/dsc_resource.rb +4 -4
- data/lib/chef/provider/dsc_script.rb +4 -4
- data/lib/chef/provider/execute.rb +9 -5
- data/lib/chef/provider/file.rb +12 -12
- data/lib/chef/provider/git.rb +14 -14
- data/lib/chef/provider/group.rb +6 -6
- data/lib/chef/provider/group/aix.rb +1 -1
- data/lib/chef/provider/group/dscl.rb +4 -4
- data/lib/chef/provider/group/groupadd.rb +4 -4
- data/lib/chef/provider/group/groupmod.rb +3 -3
- data/lib/chef/provider/group/pw.rb +4 -4
- data/lib/chef/provider/group/windows.rb +2 -2
- data/lib/chef/provider/http_request.rb +12 -12
- data/lib/chef/provider/ifconfig.rb +6 -6
- data/lib/chef/provider/ifconfig/aix.rb +1 -1
- data/lib/chef/provider/ifconfig/debian.rb +3 -5
- data/lib/chef/provider/launchd.rb +1 -1
- data/lib/chef/provider/link.rb +6 -6
- data/lib/chef/provider/log.rb +1 -1
- data/lib/chef/provider/lwrp_base.rb +2 -2
- data/lib/chef/provider/mdadm.rb +10 -10
- data/lib/chef/provider/mount.rb +12 -12
- data/lib/chef/provider/mount/aix.rb +20 -21
- data/lib/chef/provider/mount/mount.rb +20 -15
- data/lib/chef/provider/mount/solaris.rb +6 -6
- data/lib/chef/provider/mount/windows.rb +7 -7
- data/lib/chef/provider/noop.rb +1 -1
- data/lib/chef/provider/ohai.rb +1 -1
- data/lib/chef/provider/osx_profile.rb +8 -8
- data/lib/chef/provider/package.rb +56 -42
- data/lib/chef/provider/package/apt.rb +24 -14
- data/lib/chef/provider/package/{aix.rb → bff.rb} +12 -12
- data/lib/chef/provider/package/cab.rb +3 -3
- data/lib/chef/provider/package/chocolatey.rb +1 -9
- data/lib/chef/provider/package/dnf/python_helper.rb +6 -6
- data/lib/chef/provider/package/dpkg.rb +9 -9
- data/lib/chef/provider/package/freebsd/base.rb +2 -2
- data/lib/chef/provider/package/freebsd/pkg.rb +2 -2
- data/lib/chef/provider/package/freebsd/pkgng.rb +1 -1
- data/lib/chef/provider/package/homebrew.rb +3 -3
- data/lib/chef/provider/package/ips.rb +2 -2
- data/lib/chef/provider/package/macports.rb +3 -3
- data/lib/chef/provider/package/msu.rb +2 -2
- data/lib/chef/provider/package/openbsd.rb +3 -3
- data/lib/chef/provider/package/pacman.rb +3 -3
- data/lib/chef/provider/package/paludis.rb +2 -2
- data/lib/chef/provider/package/portage.rb +27 -33
- data/lib/chef/provider/package/powershell.rb +24 -9
- data/lib/chef/provider/package/rpm.rb +5 -6
- data/lib/chef/provider/package/rubygems.rb +32 -28
- data/lib/chef/provider/package/smartos.rb +6 -6
- data/lib/chef/provider/package/solaris.rb +10 -10
- data/lib/chef/provider/package/windows.rb +6 -15
- data/lib/chef/provider/package/windows/exe.rb +6 -4
- data/lib/chef/provider/package/windows/msi.rb +8 -6
- data/lib/chef/provider/package/windows/registry_uninstall_entry.rb +12 -6
- data/lib/chef/provider/package/yum.rb +167 -398
- data/lib/chef/provider/package/yum/python_helper.rb +221 -0
- data/lib/chef/provider/package/yum/rpm_utils.rb +10 -1
- data/lib/chef/provider/package/yum/simplejson/LICENSE.txt +79 -0
- data/lib/chef/provider/package/yum/simplejson/__init__.py +318 -0
- data/lib/chef/provider/package/yum/simplejson/__init__.pyc +0 -0
- data/lib/chef/provider/package/yum/simplejson/decoder.py +354 -0
- data/lib/chef/provider/package/yum/simplejson/decoder.pyc +0 -0
- data/lib/chef/provider/package/yum/simplejson/encoder.py +440 -0
- data/lib/chef/provider/package/yum/simplejson/encoder.pyc +0 -0
- data/lib/chef/provider/package/yum/simplejson/scanner.py +65 -0
- data/lib/chef/provider/package/yum/simplejson/scanner.pyc +0 -0
- data/lib/chef/provider/package/yum/simplejson/tool.py +37 -0
- data/lib/chef/provider/package/yum/version.rb +56 -0
- data/lib/chef/provider/package/yum/yum_cache.rb +33 -316
- data/lib/chef/provider/package/yum/yum_helper.py +198 -0
- data/lib/chef/provider/package/zypper.rb +9 -13
- data/lib/chef/provider/powershell_script.rb +3 -3
- data/lib/chef/provider/reboot.rb +3 -3
- data/lib/chef/provider/registry_key.rb +16 -4
- data/lib/chef/provider/remote_directory.rb +1 -3
- data/lib/chef/provider/remote_file/cache_control_data.rb +1 -1
- data/lib/chef/provider/remote_file/content.rb +4 -4
- data/lib/chef/provider/remote_file/http.rb +5 -3
- data/lib/chef/provider/remote_file/local_file.rb +1 -1
- data/lib/chef/provider/remote_file/network_file.rb +2 -2
- data/lib/chef/provider/route.rb +12 -11
- data/lib/chef/provider/ruby_block.rb +1 -1
- data/lib/chef/provider/script.rb +2 -2
- data/lib/chef/provider/service.rb +14 -14
- data/lib/chef/provider/service/aix.rb +3 -3
- data/lib/chef/provider/service/aixinit.rb +2 -2
- data/lib/chef/provider/service/debian.rb +5 -5
- data/lib/chef/provider/service/freebsd.rb +3 -3
- data/lib/chef/provider/service/gentoo.rb +2 -2
- data/lib/chef/provider/service/macosx.rb +8 -8
- data/lib/chef/provider/service/openbsd.rb +1 -1
- data/lib/chef/provider/service/simple.rb +7 -7
- data/lib/chef/provider/service/systemd.rb +4 -4
- data/lib/chef/provider/service/upstart.rb +10 -9
- data/lib/chef/provider/service/windows.rb +245 -70
- data/lib/chef/provider/subversion.rb +8 -8
- data/lib/chef/provider/systemd_unit.rb +25 -6
- data/lib/chef/provider/user.rb +10 -10
- data/lib/chef/provider/user/aix.rb +3 -3
- data/lib/chef/provider/user/dscl.rb +2 -2
- data/lib/chef/provider/user/pw.rb +4 -4
- data/lib/chef/provider/user/solaris.rb +1 -1
- data/lib/chef/provider/user/useradd.rb +3 -3
- data/lib/chef/provider/user/windows.rb +4 -4
- data/lib/chef/provider/whyrun_safe_ruby_block.rb +1 -1
- data/lib/chef/provider/{env.rb → windows_env.rb} +55 -19
- data/lib/chef/provider/windows_task.rb +27 -27
- data/lib/chef/provider/zypper_repository.rb +7 -7
- data/lib/chef/provider_resolver.rb +4 -4
- data/lib/chef/providers.rb +2 -9
- data/lib/chef/resource.rb +19 -13
- data/lib/chef/resource/action_class.rb +2 -2
- data/lib/chef/resource/apt_package.rb +10 -4
- data/lib/chef/resource/apt_preference.rb +20 -7
- data/lib/chef/resource/apt_repository.rb +21 -12
- data/lib/chef/resource/apt_update.rb +3 -3
- data/lib/chef/resource/bash.rb +6 -4
- data/lib/chef/resource/batch.rb +8 -6
- data/lib/chef/resource/bff_package.rb +8 -5
- data/lib/chef/resource/breakpoint.rb +9 -6
- data/lib/chef/resource/build_essential.rb +139 -0
- data/lib/chef/resource/cab_package.rb +5 -4
- data/lib/chef/resource/chef_gem.rb +1 -1
- data/lib/chef/resource/chef_handler.rb +130 -0
- data/lib/chef/resource/chocolatey_package.rb +6 -6
- data/lib/chef/resource/cookbook_file.rb +12 -9
- data/lib/chef/resource/cron.rb +14 -75
- data/lib/chef/resource/csh.rb +6 -4
- data/lib/chef/resource/directory.rb +7 -4
- data/lib/chef/resource/dmg_package.rb +161 -0
- data/lib/chef/resource/dnf_package.rb +10 -7
- data/lib/chef/resource/dpkg_package.rb +5 -3
- data/lib/chef/resource/dsc_resource.rb +11 -28
- data/lib/chef/resource/dsc_script.rb +14 -37
- data/lib/chef/resource/execute.rb +15 -78
- data/lib/chef/resource/file.rb +6 -5
- data/lib/chef/resource/file/verification.rb +5 -1
- data/lib/chef/resource/freebsd_package.rb +2 -1
- data/lib/chef/resource/gem_package.rb +6 -3
- data/lib/chef/resource/git.rb +4 -15
- data/lib/chef/resource/group.rb +7 -46
- data/lib/chef/resource/homebrew_cask.rb +98 -0
- data/lib/chef/resource/homebrew_package.rb +3 -3
- data/lib/chef/resource/homebrew_tap.rb +86 -0
- data/lib/chef/resource/hostname.rb +249 -0
- data/lib/chef/resource/http_request.rb +8 -22
- data/lib/chef/resource/ifconfig.rb +3 -2
- data/lib/chef/resource/ips_package.rb +4 -3
- data/lib/chef/resource/ksh.rb +7 -6
- data/lib/chef/resource/launchd.rb +4 -4
- data/lib/chef/resource/link.rb +18 -56
- data/lib/chef/resource/log.rb +6 -8
- data/lib/chef/resource/lwrp_base.rb +4 -5
- data/lib/chef/resource/macos_userdefaults.rb +133 -0
- data/lib/chef/resource/macosx_service.rb +7 -23
- data/lib/chef/resource/macports_package.rb +2 -1
- data/lib/chef/resource/mdadm.rb +13 -84
- data/lib/chef/resource/mount.rb +21 -127
- data/lib/chef/resource/msu_package.rb +4 -4
- data/lib/chef/resource/ohai.rb +5 -3
- data/lib/chef/resource/ohai_hint.rb +93 -0
- data/lib/chef/resource/openbsd_package.rb +3 -3
- data/lib/chef/resource/openssl_dhparam.rb +80 -0
- data/lib/chef/resource/openssl_rsa_private_key.rb +93 -0
- data/lib/chef/resource/openssl_rsa_public_key.rb +73 -0
- data/lib/chef/resource/osx_profile.rb +9 -10
- data/lib/chef/resource/package.rb +8 -6
- data/lib/chef/resource/pacman_package.rb +3 -2
- data/lib/chef/resource/paludis_package.rb +4 -4
- data/lib/chef/resource/perl.rb +6 -4
- data/lib/chef/resource/portage_package.rb +3 -6
- data/lib/chef/resource/powershell_package.rb +9 -13
- data/lib/chef/resource/powershell_script.rb +9 -8
- data/lib/chef/resource/python.rb +5 -4
- data/lib/chef/resource/reboot.rb +8 -9
- data/lib/chef/resource/registry_key.rb +9 -19
- data/lib/chef/resource/remote_directory.rb +5 -3
- data/lib/chef/resource/remote_file.rb +11 -50
- data/lib/chef/resource/resource_notification.rb +2 -2
- data/lib/chef/resource/rhsm_errata.rb +44 -0
- data/lib/chef/resource/rhsm_errata_level.rb +51 -0
- data/lib/chef/resource/rhsm_register.rb +162 -0
- data/lib/chef/resource/rhsm_repo.rb +62 -0
- data/lib/chef/resource/rhsm_subscription.rb +95 -0
- data/lib/chef/resource/route.rb +3 -1
- data/lib/chef/resource/rpm_package.rb +3 -3
- data/lib/chef/resource/ruby.rb +6 -4
- data/lib/chef/resource/ruby_block.rb +6 -17
- data/lib/chef/resource/scm.rb +14 -146
- data/lib/chef/resource/script.rb +7 -5
- data/lib/chef/resource/service.rb +2 -1
- data/lib/chef/resource/smartos_package.rb +4 -3
- data/lib/chef/resource/solaris_package.rb +3 -2
- data/lib/chef/resource/subversion.rb +20 -4
- data/lib/chef/resource/sudo.rb +231 -0
- data/lib/chef/resource/support/sudoer.erb +18 -0
- data/lib/chef/resource/swap_file.rb +209 -0
- data/lib/chef/resource/sysctl.rb +111 -0
- data/lib/chef/resource/systemd_unit.rb +6 -5
- data/lib/chef/resource/template.rb +6 -27
- data/lib/chef/resource/windows_ad_join.rb +92 -0
- data/lib/chef/resource/windows_auto_run.rb +87 -0
- data/lib/chef/resource/{env.rb → windows_env.rb} +11 -5
- data/lib/chef/resource/windows_feature.rb +95 -0
- data/lib/chef/resource/windows_feature_dism.rb +226 -0
- data/lib/chef/resource/windows_feature_powershell.rb +256 -0
- data/lib/chef/resource/windows_font.rb +127 -0
- data/lib/chef/resource/windows_package.rb +5 -3
- data/lib/chef/resource/windows_pagefile.rb +206 -0
- data/lib/chef/resource/windows_path.rb +3 -3
- data/lib/chef/resource/windows_printer.rb +148 -0
- data/lib/chef/resource/windows_printer_port.rb +136 -0
- data/lib/chef/resource/windows_service.rb +79 -38
- data/lib/chef/resource/windows_shortcut.rb +79 -0
- data/lib/chef/resource/windows_task.rb +5 -5
- data/lib/chef/resource/yum_package.rb +8 -2
- data/lib/chef/resource/yum_repository.rb +12 -5
- data/lib/chef/resource/zypper_package.rb +5 -3
- data/lib/chef/resource/zypper_repository.rb +17 -12
- data/lib/chef/resource_inspector.rb +89 -0
- data/lib/chef/resource_reporter.rb +5 -6
- data/lib/chef/resource_resolver.rb +4 -4
- data/lib/chef/resources.rb +31 -6
- data/lib/chef/role.rb +1 -3
- data/lib/chef/run_context.rb +21 -12
- data/lib/chef/run_context/cookbook_compiler.rb +18 -9
- data/lib/chef/search/query.rb +1 -2
- data/lib/chef/shell.rb +0 -1
- data/lib/chef/shell/model_wrapper.rb +1 -1
- data/lib/chef/shell/shell_session.rb +4 -3
- data/lib/chef/util/diff.rb +2 -2
- data/lib/chef/util/dsc/configuration_generator.rb +1 -1
- data/lib/chef/util/dsc/lcm_output_parser.rb +1 -1
- data/lib/chef/util/dsc/local_configuration_manager.rb +4 -4
- data/lib/chef/util/selinux.rb +1 -1
- data/lib/chef/util/windows/logon_session.rb +5 -2
- data/lib/chef/util/windows/net_user.rb +2 -2
- data/lib/chef/util/windows/volume.rb +0 -4
- data/lib/chef/version.rb +1 -1
- data/lib/chef/win32/api/error.rb +2 -2
- data/lib/chef/win32/api/net.rb +1 -1
- data/lib/chef/win32/api/security.rb +11 -0
- data/lib/chef/win32/eventlog.rb +2 -2
- data/lib/chef/win32/mutex.rb +1 -1
- data/lib/chef/win32/registry.rb +17 -17
- data/lib/chef/win32/security.rb +34 -12
- data/lib/chef/win32/security/sid.rb +1 -2
- data/lib/chef/win32/version.rb +2 -15
- data/lib/chef/win32_service_constants.rb +143 -0
- data/spec/data/mixin/invalid_data.rb +3 -0
- data/spec/data/mixin/real_data.rb +2 -0
- data/spec/functional/assets/yumrepo/chef_rpm-1.10-1.aarch64.rpm +0 -0
- data/spec/functional/assets/yumrepo/chef_rpm-1.10-1.i686.rpm +0 -0
- data/spec/functional/assets/yumrepo/chef_rpm-1.10-1.ppc64.rpm +0 -0
- data/spec/functional/assets/yumrepo/chef_rpm-1.10-1.ppc64le.rpm +0 -0
- data/spec/functional/assets/yumrepo/chef_rpm-1.10-1.s390x.rpm +0 -0
- data/spec/functional/assets/yumrepo/chef_rpm-1.10-1.src.rpm +0 -0
- data/spec/functional/assets/yumrepo/chef_rpm-1.10-1.x86_64.rpm +0 -0
- data/spec/functional/assets/yumrepo/chef_rpm-1.2-1.aarch64.rpm +0 -0
- data/spec/functional/assets/yumrepo/chef_rpm-1.2-1.i686.rpm +0 -0
- data/spec/functional/assets/yumrepo/chef_rpm-1.2-1.ppc64.rpm +0 -0
- data/spec/functional/assets/yumrepo/chef_rpm-1.2-1.ppc64le.rpm +0 -0
- data/spec/functional/assets/yumrepo/chef_rpm-1.2-1.s390x.rpm +0 -0
- data/spec/functional/assets/yumrepo/chef_rpm-1.2-1.src.rpm +0 -0
- data/spec/functional/assets/yumrepo/chef_rpm-1.2-1.x86_64.rpm +0 -0
- data/spec/functional/assets/yumrepo/repodata/4632d67cb92636e7575d911c24f0e04d3505a944e97c483abe0c3e73a7c62d33-filelists.sqlite.bz2 +0 -0
- data/spec/functional/assets/yumrepo/repodata/74599b793e54d877323837d2d81a1c3c594c44e4335f9528234bb490f7b9b439-other.xml.gz +0 -0
- data/spec/functional/assets/yumrepo/repodata/a845d418f919d2115ab95a56b2c76f6825ad0d0bede49181a55c04f58995d057-primary.sqlite.bz2 +0 -0
- data/spec/functional/assets/yumrepo/repodata/af9b7cf9ef23bd7b43068d74a460f3b5d06753d638e58e4a0c9edc35bfb9cdc4-other.sqlite.bz2 +0 -0
- data/spec/functional/assets/yumrepo/repodata/bdb4f5f1492a3b9532f22c43110a81500dd744f23da0aec5c33b2a41317c737d-filelists.xml.gz +0 -0
- data/spec/functional/assets/yumrepo/repodata/c10d1d34ce99e02f12ec96ef68360543ab1bb7c3cb81a4a2bf78df7d8597e9df-primary.xml.gz +0 -0
- data/spec/functional/assets/yumrepo/repodata/filelists.xml.gz +0 -0
- data/spec/functional/assets/yumrepo/repodata/other.xml.gz +0 -0
- data/spec/functional/assets/yumrepo/repodata/primary.xml.gz +0 -0
- data/spec/functional/assets/yumrepo/repodata/repomd.xml +19 -53
- data/spec/functional/event_loggers/windows_eventlog_spec.rb +2 -2
- data/spec/functional/http/simple_spec.rb +6 -6
- data/spec/functional/mixin/from_file_spec.rb +82 -0
- data/spec/functional/notifications_spec.rb +1 -1
- data/spec/functional/resource/{package_spec.rb → apt_package_spec.rb} +4 -4
- data/spec/functional/resource/dnf_package_spec.rb +115 -115
- data/spec/functional/resource/ifconfig_spec.rb +1 -2
- data/spec/functional/resource/link_spec.rb +9 -13
- data/spec/functional/resource/powershell_script_spec.rb +0 -2
- data/spec/functional/resource/registry_spec.rb +3 -3
- data/spec/functional/resource/remote_file_spec.rb +4 -4
- data/spec/functional/resource/user/windows_spec.rb +3 -1
- data/spec/functional/resource/windows_env_spec.rb +285 -0
- data/spec/functional/resource/windows_task_spec.rb +303 -2
- data/spec/functional/resource/yum_package_spec.rb +949 -0
- data/spec/functional/root_alias_spec.rb +1 -1
- data/spec/functional/win32/security_spec.rb +60 -7
- data/spec/functional/win32/versions_spec.rb +7 -9
- data/spec/integration/client/client_spec.rb +99 -7
- data/spec/integration/knife/chef_fs_data_store_spec.rb +23 -4
- data/spec/integration/recipes/recipe_dsl_spec.rb +26 -26
- data/spec/integration/recipes/resource_action_spec.rb +25 -120
- data/spec/spec_helper.rb +10 -2
- data/spec/support/lib/chef/resource/one_two_three_four.rb +0 -2
- data/spec/support/lib/chef/resource/zen_master.rb +1 -3
- data/spec/support/mock/constant.rb +1 -1
- data/spec/support/platform_helpers.rb +24 -7
- data/spec/support/shared/context/client.rb +13 -10
- data/spec/support/shared/examples/client.rb +50 -0
- data/spec/support/shared/functional/file_resource.rb +1 -1
- data/spec/support/shared/functional/securable_resource.rb +2 -2
- data/spec/support/shared/integration/knife_support.rb +5 -0
- data/spec/unit/application/client_spec.rb +39 -13
- data/spec/unit/application/solo_spec.rb +1 -8
- data/spec/unit/application_spec.rb +66 -2
- data/spec/unit/audit/audit_event_proxy_spec.rb +1 -1
- data/spec/unit/audit/audit_reporter_spec.rb +16 -16
- data/spec/unit/chef_fs/file_system_spec.rb +1 -1
- data/spec/unit/client_spec.rb +3 -4
- data/spec/unit/cookbook/metadata_spec.rb +1 -1
- data/spec/unit/cookbook_loader_spec.rb +6 -6
- data/spec/unit/cookbook_manifest_spec.rb +2 -2
- data/spec/unit/cookbook_version_file_specificity_spec.rb +5 -25
- data/spec/unit/data_collector/messages/helpers_spec.rb +9 -0
- data/spec/unit/data_collector/resource_report_spec.rb +3 -3
- data/spec/unit/data_collector_spec.rb +135 -1
- data/spec/unit/dsl/reboot_pending_spec.rb +0 -13
- data/spec/unit/dsl/recipe_spec.rb +0 -13
- data/spec/unit/environment_spec.rb +2 -2
- data/spec/unit/exceptions_spec.rb +1 -1
- data/spec/unit/http/validate_content_length_spec.rb +5 -5
- data/spec/unit/knife/bootstrap_spec.rb +11 -15
- data/spec/unit/knife/configure_spec.rb +1 -2
- data/spec/unit/knife/cookbook_test_spec.rb +2 -2
- data/spec/unit/knife/core/gem_glob_loader_spec.rb +2 -2
- data/spec/unit/knife/core/node_editor_spec.rb +6 -6
- data/spec/unit/knife/environment_compare_spec.rb +3 -3
- data/spec/unit/knife/node_edit_spec.rb +3 -1
- data/spec/unit/knife/node_policy_set_spec.rb +122 -0
- data/spec/unit/knife/osc_user_reregister_spec.rb +1 -1
- data/spec/unit/knife/osc_user_show_spec.rb +1 -1
- data/spec/unit/knife/ssh_spec.rb +18 -0
- data/spec/unit/log/syslog_spec.rb +2 -4
- data/spec/unit/log/winevt_spec.rb +2 -3
- data/spec/unit/lwrp_spec.rb +4 -4
- data/spec/unit/mixin/homebrew_user_spec.rb +1 -5
- data/spec/unit/mixin/openssl_helper_spec.rb +252 -0
- data/spec/unit/mixin/powershell_exec_spec.rb +43 -0
- data/spec/unit/node/attribute_spec.rb +3 -3
- data/spec/unit/node/immutable_collections_spec.rb +11 -1
- data/spec/unit/node_map_spec.rb +2 -2
- data/spec/unit/node_spec.rb +11 -16
- data/spec/unit/platform/query_helpers_spec.rb +0 -13
- data/spec/unit/policy_builder/policyfile_spec.rb +79 -2
- data/spec/unit/property/validation_spec.rb +51 -4
- data/spec/unit/provider/apt_repository_spec.rb +97 -32
- data/spec/unit/provider/cookbook_file_spec.rb +2 -1
- data/spec/unit/provider/cron/unix_spec.rb +8 -3
- data/spec/unit/provider/cron_spec.rb +27 -32
- data/spec/unit/provider/file_spec.rb +2 -1
- data/spec/unit/provider/group/dscl_spec.rb +7 -8
- data/spec/unit/provider/group/gpasswd_spec.rb +5 -2
- data/spec/unit/provider/group/groupmod_spec.rb +6 -3
- data/spec/unit/provider/group/pw_spec.rb +5 -2
- data/spec/unit/provider/link_spec.rb +6 -4
- data/spec/unit/provider/log_spec.rb +18 -13
- data/spec/unit/provider/mount/aix_spec.rb +1 -9
- data/spec/unit/provider/mount/mount_spec.rb +22 -0
- data/spec/unit/provider/osx_profile_spec.rb +3 -3
- data/spec/unit/provider/package/apt_spec.rb +431 -411
- data/spec/unit/provider/package/{aix_spec.rb → bff_spec.rb} +7 -5
- data/spec/unit/provider/package/chocolatey_spec.rb +0 -13
- data/spec/unit/provider/package/homebrew_spec.rb +2 -1
- data/spec/unit/provider/package/portage_spec.rb +11 -147
- data/spec/unit/provider/package/powershell_spec.rb +208 -57
- data/spec/unit/provider/package/rubygems_spec.rb +11 -2
- data/spec/unit/provider/package/windows_spec.rb +0 -19
- data/spec/unit/provider/package/yum/python_helper_spec.rb +29 -0
- data/spec/unit/provider/package/yum/yum_cache_spec.rb +86 -4
- data/spec/unit/provider/package/zypper_spec.rb +8 -0
- data/spec/unit/provider/package_spec.rb +47 -20
- data/spec/unit/provider/registry_key_spec.rb +7 -1
- data/spec/unit/provider/remote_directory_spec.rb +1 -1
- data/spec/unit/provider/remote_file_spec.rb +2 -1
- data/spec/unit/provider/service/macosx_spec.rb +4 -2
- data/spec/unit/provider/service/systemd_service_spec.rb +2 -10
- data/spec/unit/provider/service/windows_spec.rb +447 -30
- data/spec/unit/provider/systemd_unit_spec.rb +50 -13
- data/spec/unit/provider/template_spec.rb +2 -4
- data/spec/unit/provider/user/windows_spec.rb +3 -0
- data/spec/unit/provider/{env_spec.rb → windows_env_spec.rb} +102 -12
- data/spec/unit/provider/zypper_repository_spec.rb +4 -2
- data/spec/unit/provider_resolver_spec.rb +23 -38
- data/spec/unit/recipe_spec.rb +4 -4
- data/spec/unit/resource/apt_package_spec.rb +4 -0
- data/spec/unit/resource/apt_preference_spec.rb +0 -5
- data/spec/unit/resource/apt_repository_spec.rb +35 -10
- data/spec/unit/resource/apt_update_spec.rb +0 -5
- data/spec/unit/resource/bash_spec.rb +2 -3
- data/spec/unit/resource/batch_spec.rb +1 -4
- data/spec/unit/resource/{timestamped_deploy_spec.rb → build_essential_spec.rb} +10 -11
- data/spec/unit/resource/cab_package_spec.rb +1 -3
- data/{lib/chef/mixin/language_include_attribute.rb → spec/unit/resource/chef_handler_spec.rb} +13 -12
- data/spec/unit/resource/chocolatey_package_spec.rb +1 -3
- data/spec/unit/resource/cron_spec.rb +0 -5
- data/spec/unit/resource/csh_spec.rb +2 -3
- data/spec/unit/resource/directory_spec.rb +1 -6
- data/{lib/chef/resource/deploy_revision.rb → spec/unit/resource/dmg_package_spec.rb} +14 -10
- data/spec/unit/resource/dnf_package_spec.rb +20 -26
- data/spec/unit/resource/file_spec.rb +1 -1
- data/spec/unit/resource/freebsd_package_spec.rb +22 -23
- data/spec/unit/resource/gem_package_spec.rb +3 -5
- data/spec/unit/resource/git_spec.rb +1 -2
- data/spec/unit/resource/group_spec.rb +0 -5
- data/spec/unit/resource/homebrew_cask_spec.rb +35 -0
- data/spec/unit/resource/homebrew_package_spec.rb +4 -0
- data/spec/unit/resource/homebrew_tap_spec.rb +39 -0
- data/spec/unit/resource/hostname_spec.rb +43 -0
- data/spec/unit/resource/http_request_spec.rb +0 -5
- data/spec/unit/resource/ips_package_spec.rb +4 -0
- data/spec/unit/resource/ksh_spec.rb +2 -3
- data/spec/unit/resource/launchd_spec.rb +0 -5
- data/spec/unit/resource/link_spec.rb +1 -6
- data/spec/unit/resource/log_spec.rb +0 -5
- data/spec/unit/resource/macos_user_defaults_spec.rb +45 -0
- data/spec/unit/resource/mdadm_spec.rb +0 -5
- data/spec/unit/resource/mount_spec.rb +1 -6
- data/spec/unit/resource/msu_package_spec.rb +1 -3
- data/spec/unit/resource/ohai_hint_spec.rb +43 -0
- data/spec/unit/resource/ohai_spec.rb +0 -5
- data/spec/unit/resource/openbsd_package_spec.rb +8 -12
- data/spec/unit/resource/openssl_dhparam.rb +51 -0
- data/spec/unit/resource/openssl_rsa_private_key_spec.rb +59 -0
- data/spec/unit/resource/openssl_rsa_public_key_spec.rb +39 -0
- data/spec/unit/resource/osx_profile_spec.rb +0 -5
- data/spec/unit/resource/package_spec.rb +0 -5
- data/spec/unit/resource/perl_spec.rb +2 -3
- data/spec/unit/resource/portage_package_spec.rb +3 -7
- data/spec/unit/resource/powershell_package_spec.rb +11 -4
- data/spec/unit/resource/python_spec.rb +0 -5
- data/spec/unit/resource/reboot_spec.rb +0 -5
- data/spec/unit/resource/registry_key_spec.rb +5 -6
- data/spec/unit/resource/remote_directory_spec.rb +0 -5
- data/spec/unit/resource/remote_file_spec.rb +1 -5
- data/spec/unit/resource/rhsm_errata_level_spec.rb +46 -0
- data/{lib/chef/mixin/language_include_recipe.rb → spec/unit/resource/rhsm_errata_spec.rb} +14 -10
- data/spec/unit/resource/rhsm_register_spec.rb +199 -0
- data/spec/unit/resource/rhsm_repo_spec.rb +59 -0
- data/spec/unit/resource/rhsm_subscription_spec.rb +93 -0
- data/spec/unit/resource/route_spec.rb +1 -6
- data/spec/unit/resource/rpm_package_spec.rb +4 -0
- data/spec/unit/resource/ruby_block_spec.rb +0 -5
- data/spec/unit/resource/ruby_spec.rb +0 -5
- data/spec/unit/resource/scm_spec.rb +0 -15
- data/spec/unit/resource/service_spec.rb +0 -5
- data/spec/unit/resource/subversion_spec.rb +12 -0
- data/spec/unit/resource/sudo_spec.rb +92 -0
- data/spec/unit/resource/swap_file_spec.rb +40 -0
- data/spec/unit/resource/sysctl_spec.rb +56 -0
- data/spec/unit/resource/systemd_unit_spec.rb +5 -7
- data/spec/unit/resource/template_spec.rb +1 -3
- data/spec/unit/resource/user_spec.rb +0 -5
- data/spec/unit/resource/windows_ad_join.rb +45 -0
- data/spec/unit/resource/windows_auto_run_spec.rb +50 -0
- data/spec/unit/resource/{env_spec.rb → windows_env_spec.rb} +19 -21
- data/spec/unit/resource/windows_feature.rb +41 -0
- data/spec/unit/resource/windows_feature_dism.rb +51 -0
- data/spec/unit/resource/windows_feature_powershell.rb +51 -0
- data/spec/unit/resource/windows_font_spec.rb +44 -0
- data/spec/unit/resource/windows_package_spec.rb +2 -2
- data/spec/unit/resource/windows_pagefile_spec.rb +45 -0
- data/spec/unit/resource/windows_printer_port_spec.rb +45 -0
- data/spec/unit/resource/windows_printer_spec.rb +45 -0
- data/spec/unit/resource/windows_service_spec.rb +25 -4
- data/spec/unit/resource/windows_shortcut_spec.rb +39 -0
- data/spec/unit/resource/windows_task_spec.rb +0 -5
- data/spec/unit/resource/yum_repository_spec.rb +4 -0
- data/spec/unit/resource/zypper_repository_spec.rb +4 -0
- data/spec/unit/resource_inspector_spec.rb +60 -0
- data/spec/unit/resource_reporter_spec.rb +2 -2
- data/spec/unit/resource_spec.rb +0 -5
- data/spec/unit/shell/shell_session_spec.rb +0 -1
- data/spec/unit/user_spec.rb +1 -1
- data/spec/unit/util/windows/logon_session_spec.rb +2 -1
- data/spec/unit/win32/security_spec.rb +44 -1
- data/spec/unit/windows_service_spec.rb +4 -2
- data/tasks/announce.rb +1 -1
- data/tasks/cbgb.rb +84 -0
- data/tasks/dependencies.rb +38 -2
- data/tasks/maintainers.rb +7 -7
- data/tasks/rspec.rb +2 -2
- data/tasks/templates/prerelease.md.erb +2 -11
- data/tasks/templates/release.md.erb +1 -9
- metadata +225 -96
- data/lib/chef/knife/help.rb +0 -101
- data/lib/chef/knife/help_topics.rb +0 -4
- data/lib/chef/knife/index_rebuild.rb +0 -133
- data/lib/chef/mixin/language.rb +0 -48
- data/lib/chef/mixin/recipe_definition_dsl_core.rb +0 -35
- data/lib/chef/provider/deploy.rb +0 -470
- data/lib/chef/provider/deploy/revision.rb +0 -107
- data/lib/chef/provider/deploy/timestamped.rb +0 -34
- data/lib/chef/provider/env/windows.rb +0 -76
- data/lib/chef/provider/erl_call.rb +0 -76
- data/lib/chef/provider/package/yum/yum-dump.py +0 -307
- data/lib/chef/resource/deploy.rb +0 -449
- data/lib/chef/resource/erl_call.rb +0 -90
- data/lib/chef/resource/timestamped_deploy.rb +0 -26
- data/spec/functional/assets/yumrepo/chef_rpm-1.10-1.fc24.i686.rpm +0 -0
- data/spec/functional/assets/yumrepo/chef_rpm-1.10-1.fc24.src.rpm +0 -0
- data/spec/functional/assets/yumrepo/chef_rpm-1.10-1.fc24.x86_64.rpm +0 -0
- data/spec/functional/assets/yumrepo/chef_rpm-1.2-1.fc24.i686.rpm +0 -0
- data/spec/functional/assets/yumrepo/chef_rpm-1.2-1.fc24.src.rpm +0 -0
- data/spec/functional/assets/yumrepo/chef_rpm-1.2-1.fc24.x86_64.rpm +0 -0
- data/spec/functional/assets/yumrepo/repodata/313329137b55fd333b2dc66394a6661a2befa6cc535d8460d92a4a78a9c581f0-primary.sqlite.bz2 +0 -0
- data/spec/functional/assets/yumrepo/repodata/31ac4db5d5ac593728fcc26aef82b7b93c4cc4dbec843786b1845b939b658553-other.xml.gz +0 -0
- data/spec/functional/assets/yumrepo/repodata/4ac40fa3c6728c1401318e2e20a997436624e83dcf7a5f952b851ef422637773-filelists.sqlite.bz2 +0 -0
- data/spec/functional/assets/yumrepo/repodata/66391e53f0510b98b3f0b79f40ba1048026d9a1ef20905d9c40ba6f5411f3243-primary.xml.gz +0 -0
- data/spec/functional/assets/yumrepo/repodata/8b34697595fcc87928e12d24644dda9462c3857bd932861e28bc77ae1f31be16-filelists.xml.gz +0 -0
- data/spec/functional/assets/yumrepo/repodata/b97cca3fe14bcf06c52be4449b6108f7731239ff221111dcce8aada5467f60dc-other.sqlite.bz2 +0 -0
- data/spec/functional/resource/deploy_revision_spec.rb +0 -881
- data/spec/functional/resource/env_spec.rb +0 -192
- data/spec/unit/knife/index_rebuild_spec.rb +0 -125
- data/spec/unit/knife/knife_help.rb +0 -92
- data/spec/unit/provider/deploy/revision_spec.rb +0 -110
- data/spec/unit/provider/deploy/timestamped_spec.rb +0 -40
- data/spec/unit/provider/deploy_spec.rb +0 -641
- data/spec/unit/provider/env/windows_spec.rb +0 -103
- data/spec/unit/provider/erl_call_spec.rb +0 -77
- data/spec/unit/provider/package/yum_spec.rb +0 -2294
- data/spec/unit/resource/deploy_revision_spec.rb +0 -42
- data/spec/unit/resource/deploy_spec.rb +0 -283
- data/spec/unit/resource/erl_call_spec.rb +0 -81
@@ -1,26 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: Daniel DeLeo (<dan@kallistec.com>)
|
3
|
-
# Copyright:: Copyright 2009-2016, Daniel DeLeo
|
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
|
-
class Chef
|
20
|
-
class Resource
|
21
|
-
# Convenience class for using the deploy resource with the timestamped
|
22
|
-
# deployment strategy (provider)
|
23
|
-
class TimestampedDeploy < Chef::Resource::Deploy
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -1,881 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: Daniel DeLeo (<dan@chef.io>)
|
3
|
-
# Copyright:: Copyright 2012-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 "tmpdir"
|
21
|
-
|
22
|
-
# Deploy relies heavily on symlinks, so it doesn't work on windows.
|
23
|
-
describe Chef::Resource::DeployRevision, :unix_only => true, :requires_git => true do
|
24
|
-
|
25
|
-
let(:file_cache_path) { Dir.mktmpdir }
|
26
|
-
let(:deploy_directory) { Dir.mktmpdir }
|
27
|
-
|
28
|
-
# By making restart or other operations write to this file, we can externally
|
29
|
-
# track the order in which those operations happened.
|
30
|
-
let(:observe_order_file) { Tempfile.new("deploy-resource-observe-operations") }
|
31
|
-
|
32
|
-
before do
|
33
|
-
Chef::Log.level = :info
|
34
|
-
@old_file_cache_path = Chef::Config[:file_cache_path]
|
35
|
-
Chef::Config[:file_cache_path] = file_cache_path
|
36
|
-
end
|
37
|
-
|
38
|
-
after do
|
39
|
-
Chef::Config[:file_cache_path] = @old_file_cache_path
|
40
|
-
FileUtils.remove_entry_secure deploy_directory if File.exist?(deploy_directory)
|
41
|
-
FileUtils.remove_entry_secure file_cache_path
|
42
|
-
observe_order_file.close
|
43
|
-
FileUtils.remove_entry_secure observe_order_file.path
|
44
|
-
end
|
45
|
-
|
46
|
-
before(:all) do
|
47
|
-
@ohai = Ohai::System.new
|
48
|
-
@ohai.all_plugins(%w{platform os})
|
49
|
-
end
|
50
|
-
|
51
|
-
let(:node) do
|
52
|
-
Chef::Node.new.tap do |n|
|
53
|
-
n.name "rspec-test"
|
54
|
-
n.consume_external_attrs(@ohai.data, {})
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
let(:event_dispatch) { Chef::EventDispatch::Dispatcher.new }
|
59
|
-
let(:run_context) { Chef::RunContext.new(node, {}, event_dispatch) }
|
60
|
-
|
61
|
-
# These tests use git's bundle feature, which is a way to export an entire
|
62
|
-
# git repo (or subset of commits) as a single file.
|
63
|
-
#
|
64
|
-
# Generally you can treat a git bundle as a regular git remote.
|
65
|
-
#
|
66
|
-
# See also: http://git-scm.com/2010/03/10/bundles.html
|
67
|
-
let(:git_bundle_repo) { File.expand_path("git_bundles/sinatra-test-app.gitbundle", CHEF_SPEC_DATA) }
|
68
|
-
|
69
|
-
let(:git_bundle_with_in_repo_callbacks) { File.expand_path("git_bundles/sinatra-test-app-with-callback-files.gitbundle", CHEF_SPEC_DATA) }
|
70
|
-
|
71
|
-
let(:git_bundle_with_in_repo_symlinks) { File.expand_path("git_bundles/sinatra-test-app-with-symlinks.gitbundle", CHEF_SPEC_DATA) }
|
72
|
-
|
73
|
-
# This is the fourth version
|
74
|
-
let(:latest_rev) { "3eb5ca6c353c83d9179dd3b29347539829b401f3" }
|
75
|
-
|
76
|
-
# This is the third version
|
77
|
-
let(:previous_rev) { "6d19a6dbecc8e37f5b2277345885c0c783eb8fb1" }
|
78
|
-
|
79
|
-
# This is the second version
|
80
|
-
let(:second_rev) { "0827e1b0e5043608ac0a824da5c558e252154ad0" }
|
81
|
-
|
82
|
-
# This is the sixth version, it is on the "with-deploy-scripts" branch
|
83
|
-
let(:rev_with_in_repo_callbacks) { "2404d015882659754bdb93ad6e4b4d3d02691a82" }
|
84
|
-
|
85
|
-
# This is the fifth version in the "with-symlinks" branch
|
86
|
-
let(:rev_with_in_repo_symlinks) { "5a4748c52aaea8250b4346a9b8ede95ee3755e28" }
|
87
|
-
|
88
|
-
# Read values from the +observe_order_file+ and split each line. This way you
|
89
|
-
# can see in which order things really happened.
|
90
|
-
def actual_operations_order
|
91
|
-
IO.read(observe_order_file.path).split("\n").map(&:strip)
|
92
|
-
end
|
93
|
-
|
94
|
-
# 1. touch `restart.txt` in cwd so we know that the command is run with the
|
95
|
-
# right cwd.
|
96
|
-
# 2. Append +tag+ to the `observe_order_file` so we can check the order in
|
97
|
-
# which operations happen later in the test.
|
98
|
-
def shell_restart_command(tag)
|
99
|
-
"touch restart.txt && echo '#{tag}' >> #{observe_order_file.path}"
|
100
|
-
end
|
101
|
-
|
102
|
-
let(:basic_deploy_resource) do
|
103
|
-
Chef::Resource::DeployRevision.new(deploy_directory, run_context).tap do |r|
|
104
|
-
r.name "deploy-revision-unit-test"
|
105
|
-
r.repo git_bundle_repo
|
106
|
-
r.symlink_before_migrate({})
|
107
|
-
r.symlinks({})
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
let(:deploy_to_latest_rev) do
|
112
|
-
basic_deploy_resource.dup.tap do |r|
|
113
|
-
r.revision(latest_rev)
|
114
|
-
r.restart_command shell_restart_command(:deploy_to_latest_rev)
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
let(:deploy_to_previous_rev) do
|
119
|
-
basic_deploy_resource.dup.tap do |r|
|
120
|
-
r.revision(previous_rev)
|
121
|
-
r.restart_command shell_restart_command(:deploy_to_previous_rev)
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
let(:deploy_to_latest_rev_again) do
|
126
|
-
basic_deploy_resource.dup.tap do |r|
|
127
|
-
r.revision(latest_rev)
|
128
|
-
r.restart_command shell_restart_command(:deploy_to_latest_rev_again)
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
let(:deploy_to_previous_rev_again) do
|
133
|
-
basic_deploy_resource.dup.tap do |r|
|
134
|
-
r.revision(previous_rev)
|
135
|
-
r.restart_command shell_restart_command(:deploy_to_previous_rev_again)
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
let(:deploy_to_second_rev) do
|
140
|
-
basic_deploy_resource.dup.tap do |r|
|
141
|
-
r.revision(second_rev)
|
142
|
-
r.restart_command shell_restart_command(:deploy_to_second_rev)
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
let(:deploy_to_second_rev_again) do
|
147
|
-
basic_deploy_resource.dup.tap do |r|
|
148
|
-
r.revision(second_rev)
|
149
|
-
r.restart_command shell_restart_command(:deploy_to_second_rev_again)
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
let(:deploy_to_second_rev_again_again) do
|
154
|
-
basic_deploy_resource.dup.tap do |r|
|
155
|
-
r.revision(second_rev)
|
156
|
-
r.restart_command shell_restart_command(:deploy_to_second_rev_again_again)
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
# Computes the full path for +path+ relative to the deploy directory
|
161
|
-
def rel_path(path)
|
162
|
-
File.expand_path(path, deploy_directory)
|
163
|
-
end
|
164
|
-
|
165
|
-
def actual_current_rev
|
166
|
-
Dir.chdir(rel_path("current")) do
|
167
|
-
`git rev-parse HEAD`.strip
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|
171
|
-
def self.the_app_is_deployed_at_revision(target_rev_spec)
|
172
|
-
it "deploys the app to the target revision (#{target_rev_spec})" do
|
173
|
-
target_rev = send(target_rev_spec)
|
174
|
-
|
175
|
-
expect(File).to exist(rel_path("current"))
|
176
|
-
|
177
|
-
expect(actual_current_rev).to eq(target_rev)
|
178
|
-
|
179
|
-
# Is the app code actually there?
|
180
|
-
expect(File).to exist(rel_path("current/app/app.rb"))
|
181
|
-
end
|
182
|
-
end
|
183
|
-
|
184
|
-
context "when deploying a simple app" do
|
185
|
-
describe "for the first time, with the required directory layout precreated" do
|
186
|
-
before do
|
187
|
-
FileUtils.mkdir_p(rel_path("releases"))
|
188
|
-
FileUtils.mkdir_p(rel_path("shared"))
|
189
|
-
deploy_to_latest_rev.run_action(:deploy)
|
190
|
-
end
|
191
|
-
|
192
|
-
the_app_is_deployed_at_revision(:latest_rev)
|
193
|
-
|
194
|
-
it "restarts the application" do
|
195
|
-
expect(File).to exist(rel_path("current/restart.txt"))
|
196
|
-
expect(actual_operations_order).to eq(%w{deploy_to_latest_rev})
|
197
|
-
end
|
198
|
-
|
199
|
-
it "is marked as updated" do
|
200
|
-
expect(deploy_to_latest_rev).to be_updated_by_last_action
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
204
|
-
describe "back to a previously deployed revision, with the directory structure precreated" do
|
205
|
-
before do
|
206
|
-
FileUtils.mkdir_p(rel_path("releases"))
|
207
|
-
FileUtils.mkdir_p(rel_path("shared"))
|
208
|
-
|
209
|
-
deploy_to_latest_rev.run_action(:deploy)
|
210
|
-
deploy_to_previous_rev.run_action(:deploy)
|
211
|
-
deploy_to_latest_rev_again.run_action(:deploy)
|
212
|
-
end
|
213
|
-
|
214
|
-
the_app_is_deployed_at_revision(:latest_rev)
|
215
|
-
|
216
|
-
it "restarts the application after rolling back" do
|
217
|
-
expect(actual_operations_order).to eq(%w{deploy_to_latest_rev deploy_to_previous_rev deploy_to_latest_rev_again})
|
218
|
-
end
|
219
|
-
|
220
|
-
it "is marked updated" do
|
221
|
-
expect(deploy_to_latest_rev_again).to be_updated_by_last_action
|
222
|
-
end
|
223
|
-
|
224
|
-
it "deploys the right code" do
|
225
|
-
expect(IO.read(rel_path("current/app/app.rb"))).to include("this is the fourth version of the app")
|
226
|
-
end
|
227
|
-
end
|
228
|
-
|
229
|
-
describe "for the first time, with no existing directory layout" do
|
230
|
-
before do
|
231
|
-
deploy_to_latest_rev.run_action(:deploy)
|
232
|
-
end
|
233
|
-
|
234
|
-
it "creates the required directory tree" do
|
235
|
-
expect(File).to be_directory(rel_path("releases"))
|
236
|
-
expect(File).to be_directory(rel_path("shared"))
|
237
|
-
expect(File).to be_directory(rel_path("releases/#{latest_rev}"))
|
238
|
-
|
239
|
-
expect(File).to be_directory(rel_path("current/tmp"))
|
240
|
-
expect(File).to be_directory(rel_path("current/config"))
|
241
|
-
expect(File).to be_directory(rel_path("current/public"))
|
242
|
-
|
243
|
-
expect(File).to be_symlink(rel_path("current"))
|
244
|
-
expect(File.readlink(rel_path("current"))).to eq(rel_path("releases/#{latest_rev}"))
|
245
|
-
end
|
246
|
-
|
247
|
-
the_app_is_deployed_at_revision(:latest_rev)
|
248
|
-
|
249
|
-
it "restarts the application" do
|
250
|
-
expect(File).to exist(rel_path("current/restart.txt"))
|
251
|
-
expect(actual_operations_order).to eq(%w{deploy_to_latest_rev})
|
252
|
-
end
|
253
|
-
|
254
|
-
it "is marked as updated" do
|
255
|
-
expect(deploy_to_latest_rev).to be_updated_by_last_action
|
256
|
-
end
|
257
|
-
end
|
258
|
-
|
259
|
-
describe "again to the current revision" do
|
260
|
-
before do
|
261
|
-
deploy_to_latest_rev.run_action(:deploy)
|
262
|
-
deploy_to_latest_rev.run_action(:deploy)
|
263
|
-
end
|
264
|
-
|
265
|
-
the_app_is_deployed_at_revision(:latest_rev)
|
266
|
-
|
267
|
-
it "does not restart the app" do
|
268
|
-
expect(actual_operations_order).to eq(%w{deploy_to_latest_rev})
|
269
|
-
end
|
270
|
-
|
271
|
-
it "is not marked updated" do
|
272
|
-
expect(deploy_to_latest_rev).not_to be_updated_by_last_action
|
273
|
-
end
|
274
|
-
|
275
|
-
end
|
276
|
-
|
277
|
-
describe "again with force_deploy" do
|
278
|
-
before do
|
279
|
-
deploy_to_latest_rev.run_action(:force_deploy)
|
280
|
-
deploy_to_latest_rev_again.run_action(:force_deploy)
|
281
|
-
end
|
282
|
-
|
283
|
-
the_app_is_deployed_at_revision(:latest_rev)
|
284
|
-
|
285
|
-
it "restarts the app" do
|
286
|
-
expect(actual_operations_order).to eq(%w{deploy_to_latest_rev deploy_to_latest_rev_again})
|
287
|
-
end
|
288
|
-
|
289
|
-
it "is marked updated" do
|
290
|
-
expect(deploy_to_latest_rev).to be_updated_by_last_action
|
291
|
-
end
|
292
|
-
|
293
|
-
end
|
294
|
-
|
295
|
-
describe "again to a new revision" do
|
296
|
-
before do
|
297
|
-
deploy_to_previous_rev.run_action(:deploy)
|
298
|
-
deploy_to_latest_rev.run_action(:deploy)
|
299
|
-
end
|
300
|
-
|
301
|
-
the_app_is_deployed_at_revision(:latest_rev)
|
302
|
-
|
303
|
-
it "restarts the application after the new deploy" do
|
304
|
-
expect(actual_operations_order).to eq(%w{deploy_to_previous_rev deploy_to_latest_rev})
|
305
|
-
end
|
306
|
-
|
307
|
-
it "is marked updated" do
|
308
|
-
expect(deploy_to_previous_rev).to be_updated_by_last_action
|
309
|
-
end
|
310
|
-
|
311
|
-
it "leaves the old copy of the app around for rollback" do
|
312
|
-
expect(File).to exist(File.join(deploy_directory, "releases", previous_rev))
|
313
|
-
end
|
314
|
-
|
315
|
-
end
|
316
|
-
|
317
|
-
describe "back to a previously deployed revision (implicit rollback)" do
|
318
|
-
before do
|
319
|
-
deploy_to_latest_rev.run_action(:deploy)
|
320
|
-
deploy_to_previous_rev.run_action(:deploy)
|
321
|
-
deploy_to_latest_rev_again.run_action(:deploy)
|
322
|
-
end
|
323
|
-
|
324
|
-
the_app_is_deployed_at_revision(:latest_rev)
|
325
|
-
|
326
|
-
it "restarts the application after rolling back" do
|
327
|
-
expect(actual_operations_order).to eq(%w{deploy_to_latest_rev deploy_to_previous_rev deploy_to_latest_rev_again})
|
328
|
-
end
|
329
|
-
|
330
|
-
it "is marked updated" do
|
331
|
-
expect(deploy_to_latest_rev_again).to be_updated_by_last_action
|
332
|
-
end
|
333
|
-
|
334
|
-
it "deploys the right code" do
|
335
|
-
expect(IO.read(rel_path("current/app/app.rb"))).to include("this is the fourth version of the app")
|
336
|
-
end
|
337
|
-
end
|
338
|
-
|
339
|
-
describe "back to a previously deployed revision where resource rev == latest revision (explicit rollback)" do
|
340
|
-
before do
|
341
|
-
deploy_to_previous_rev.run_action(:deploy)
|
342
|
-
@previous_rev_all_releases = deploy_to_previous_rev.provider_for_action(:deploy).all_releases
|
343
|
-
deploy_to_latest_rev.run_action(:deploy)
|
344
|
-
@latest_rev_all_releases = deploy_to_latest_rev.provider_for_action(:deploy).all_releases
|
345
|
-
deploy_to_latest_rev_again.run_action(:rollback)
|
346
|
-
@previous_rev_again_all_releases = deploy_to_latest_rev_again.provider_for_action(:deploy).all_releases
|
347
|
-
end
|
348
|
-
|
349
|
-
the_app_is_deployed_at_revision(:previous_rev)
|
350
|
-
|
351
|
-
it "restarts the application after rolling back" do
|
352
|
-
expect(actual_operations_order).to eq(%w{deploy_to_previous_rev deploy_to_latest_rev deploy_to_latest_rev_again})
|
353
|
-
end
|
354
|
-
|
355
|
-
it "is marked updated" do
|
356
|
-
expect(deploy_to_latest_rev_again).to be_updated_by_last_action
|
357
|
-
end
|
358
|
-
|
359
|
-
it "deploys the right code" do
|
360
|
-
expect(IO.read(rel_path("current/app/app.rb"))).to include("this is the third version of the app")
|
361
|
-
end
|
362
|
-
|
363
|
-
it "all_releases after first deploy should have one entry" do
|
364
|
-
expect(@previous_rev_all_releases.length).to eq(1)
|
365
|
-
end
|
366
|
-
|
367
|
-
it "all_releases after second deploy should have two entries" do
|
368
|
-
expect(@latest_rev_all_releases.length).to eq(2)
|
369
|
-
end
|
370
|
-
|
371
|
-
it "all_releases after rollback should have one entry" do
|
372
|
-
expect(@previous_rev_again_all_releases.length).to eq(1)
|
373
|
-
end
|
374
|
-
|
375
|
-
it "all_releases after rollback should be the same as after the first deploy" do
|
376
|
-
expect(@previous_rev_again_all_releases).to eq(@previous_rev_all_releases)
|
377
|
-
end
|
378
|
-
|
379
|
-
end
|
380
|
-
|
381
|
-
describe "back to a previously deployed revision where resource rev == previous revision (explicit rollback)" do
|
382
|
-
before do
|
383
|
-
deploy_to_previous_rev.run_action(:deploy)
|
384
|
-
@previous_rev_all_releases = deploy_to_previous_rev.provider_for_action(:deploy).all_releases
|
385
|
-
deploy_to_latest_rev.run_action(:deploy)
|
386
|
-
@latest_rev_all_releases = deploy_to_latest_rev.provider_for_action(:deploy).all_releases
|
387
|
-
deploy_to_previous_rev_again.run_action(:rollback)
|
388
|
-
# FIXME: only difference with previous test is using latest_rev_again insetad of previous_rev_again
|
389
|
-
@previous_rev_again_all_releases = deploy_to_latest_rev_again.provider_for_action(:deploy).all_releases
|
390
|
-
end
|
391
|
-
|
392
|
-
the_app_is_deployed_at_revision(:previous_rev)
|
393
|
-
|
394
|
-
it "restarts the application after rolling back" do
|
395
|
-
expect(actual_operations_order).to eq(%w{deploy_to_previous_rev deploy_to_latest_rev deploy_to_previous_rev_again})
|
396
|
-
end
|
397
|
-
|
398
|
-
it "is marked updated" do
|
399
|
-
expect(deploy_to_previous_rev_again).to be_updated_by_last_action
|
400
|
-
end
|
401
|
-
|
402
|
-
it "deploys the right code" do
|
403
|
-
expect(IO.read(rel_path("current/app/app.rb"))).to include("this is the third version of the app")
|
404
|
-
end
|
405
|
-
|
406
|
-
it "all_releases after first deploy should have one entry" do
|
407
|
-
expect(@previous_rev_all_releases.length).to eq(1)
|
408
|
-
end
|
409
|
-
|
410
|
-
it "all_releases after second deploy should have two entries" do
|
411
|
-
expect(@latest_rev_all_releases.length).to eq(2)
|
412
|
-
end
|
413
|
-
|
414
|
-
it "all_releases after rollback should have one entry" do
|
415
|
-
expect(@previous_rev_again_all_releases.length).to eq(1)
|
416
|
-
end
|
417
|
-
|
418
|
-
it "all_releases after rollback should be the same as after the first deploy" do
|
419
|
-
expect(@previous_rev_again_all_releases).to eq(@previous_rev_all_releases)
|
420
|
-
end
|
421
|
-
end
|
422
|
-
|
423
|
-
describe "back to a previously deployed revision where resource rev == latest revision (explicit rollback)" do
|
424
|
-
before do
|
425
|
-
deploy_to_second_rev.run_action(:deploy)
|
426
|
-
@first_deploy_all_releases = deploy_to_second_rev.provider_for_action(:deploy).all_releases
|
427
|
-
deploy_to_previous_rev.run_action(:deploy)
|
428
|
-
@second_deploy_all_releases = deploy_to_previous_rev.provider_for_action(:deploy).all_releases
|
429
|
-
deploy_to_previous_rev_again.run_action(:rollback)
|
430
|
-
@third_deploy_all_releases = deploy_to_previous_rev_again.provider_for_action(:deploy).all_releases
|
431
|
-
deploy_to_latest_rev.run_action(:deploy)
|
432
|
-
@fourth_deploy_all_releases = deploy_to_latest_rev.provider_for_action(:deploy).all_releases
|
433
|
-
deploy_to_latest_rev_again.run_action(:rollback)
|
434
|
-
@fifth_deploy_all_releases = deploy_to_latest_rev_again.provider_for_action(:deploy).all_releases
|
435
|
-
end
|
436
|
-
|
437
|
-
the_app_is_deployed_at_revision(:second_rev)
|
438
|
-
|
439
|
-
it "restarts the application after rolling back" do
|
440
|
-
expect(actual_operations_order).to eq(%w{deploy_to_second_rev deploy_to_previous_rev deploy_to_previous_rev_again deploy_to_latest_rev deploy_to_latest_rev_again})
|
441
|
-
end
|
442
|
-
|
443
|
-
it "is marked updated" do
|
444
|
-
expect(deploy_to_latest_rev_again).to be_updated_by_last_action
|
445
|
-
end
|
446
|
-
|
447
|
-
it "deploys the right code" do
|
448
|
-
expect(IO.read(rel_path("current/app/app.rb"))).to include("this is the second version of the app")
|
449
|
-
end
|
450
|
-
|
451
|
-
it "all_releases after rollback should have one entry" do
|
452
|
-
expect(@fifth_deploy_all_releases.length).to eq(1)
|
453
|
-
end
|
454
|
-
|
455
|
-
it "all_releases after rollback should be the same as after the first deploy" do
|
456
|
-
expect(@fifth_deploy_all_releases).to eq(@first_deploy_all_releases)
|
457
|
-
end
|
458
|
-
end
|
459
|
-
|
460
|
-
describe "back to a previously deployed revision where resource rev == latest revision (explicit rollback)" do
|
461
|
-
before do
|
462
|
-
deploy_to_second_rev.run_action(:deploy)
|
463
|
-
@first_deploy_all_releases = deploy_to_second_rev.provider_for_action(:deploy).all_releases
|
464
|
-
deploy_to_previous_rev.run_action(:deploy)
|
465
|
-
@second_deploy_all_releases = deploy_to_previous_rev.provider_for_action(:deploy).all_releases
|
466
|
-
deploy_to_second_rev_again.run_action(:rollback)
|
467
|
-
@third_deploy_all_releases = deploy_to_second_rev_again.provider_for_action(:deploy).all_releases
|
468
|
-
deploy_to_latest_rev.run_action(:deploy)
|
469
|
-
@fourth_deploy_all_releases = deploy_to_latest_rev.provider_for_action(:deploy).all_releases
|
470
|
-
deploy_to_second_rev_again_again.run_action(:rollback)
|
471
|
-
@fifth_deploy_all_releases = deploy_to_second_rev_again_again.provider_for_action(:deploy).all_releases
|
472
|
-
end
|
473
|
-
|
474
|
-
the_app_is_deployed_at_revision(:second_rev)
|
475
|
-
|
476
|
-
it "restarts the application after rolling back" do
|
477
|
-
expect(actual_operations_order).to eq(%w{deploy_to_second_rev deploy_to_previous_rev deploy_to_second_rev_again deploy_to_latest_rev deploy_to_second_rev_again_again})
|
478
|
-
end
|
479
|
-
|
480
|
-
it "is marked updated" do
|
481
|
-
expect(deploy_to_second_rev_again_again).to be_updated_by_last_action
|
482
|
-
end
|
483
|
-
|
484
|
-
it "deploys the right code" do
|
485
|
-
expect(IO.read(rel_path("current/app/app.rb"))).to include("this is the second version of the app")
|
486
|
-
end
|
487
|
-
|
488
|
-
it "all_releases after rollback should have one entry" do
|
489
|
-
expect(@fifth_deploy_all_releases.length).to eq(1)
|
490
|
-
end
|
491
|
-
|
492
|
-
it "all_releases after rollback should be the same as after the first deploy" do
|
493
|
-
expect(@fifth_deploy_all_releases).to eq(@first_deploy_all_releases)
|
494
|
-
end
|
495
|
-
|
496
|
-
end
|
497
|
-
|
498
|
-
# CHEF-3435
|
499
|
-
describe "to a deploy_to path that does not yet exist" do
|
500
|
-
|
501
|
-
let(:top_level_tmpdir) { Dir.mktmpdir }
|
502
|
-
|
503
|
-
# override top level deploy_directory let block with one that is two
|
504
|
-
# directories deeper
|
505
|
-
let(:deploy_directory) { File.expand_path("nested/deeper", top_level_tmpdir) }
|
506
|
-
|
507
|
-
after do
|
508
|
-
FileUtils.remove_entry_secure top_level_tmpdir
|
509
|
-
end
|
510
|
-
|
511
|
-
before do
|
512
|
-
expect(File).not_to exist(deploy_directory)
|
513
|
-
deploy_to_latest_rev.run_action(:deploy)
|
514
|
-
end
|
515
|
-
|
516
|
-
it "creates the required directory tree" do
|
517
|
-
expect(File).to be_directory(rel_path("releases"))
|
518
|
-
expect(File).to be_directory(rel_path("shared"))
|
519
|
-
expect(File).to be_directory(rel_path("releases/#{latest_rev}"))
|
520
|
-
|
521
|
-
expect(File).to be_directory(rel_path("current/tmp"))
|
522
|
-
expect(File).to be_directory(rel_path("current/config"))
|
523
|
-
expect(File).to be_directory(rel_path("current/public"))
|
524
|
-
|
525
|
-
expect(File).to be_symlink(rel_path("current"))
|
526
|
-
expect(File.readlink(rel_path("current"))).to eq(rel_path("releases/#{latest_rev}"))
|
527
|
-
end
|
528
|
-
|
529
|
-
the_app_is_deployed_at_revision(:latest_rev)
|
530
|
-
|
531
|
-
end
|
532
|
-
end
|
533
|
-
|
534
|
-
context "when deploying an app with inline recipe callbacks" do
|
535
|
-
|
536
|
-
# Use closures to capture and mutate this variable. This allows us to track
|
537
|
-
# ordering of operations.
|
538
|
-
callback_order = []
|
539
|
-
|
540
|
-
let(:deploy_to_latest_with_inline_recipes) do
|
541
|
-
deploy_to_latest_rev.dup.tap do |r|
|
542
|
-
r.symlink_before_migrate "config/config.ru" => "config.ru"
|
543
|
-
r.before_migrate do
|
544
|
-
callback_order << :before_migrate
|
545
|
-
|
546
|
-
file "#{release_path}/before_migrate.txt" do
|
547
|
-
# The content here isn't relevant, but it gets printed when running
|
548
|
-
# the tests. Could be handy for debugging.
|
549
|
-
content callback_order.inspect
|
550
|
-
end
|
551
|
-
end
|
552
|
-
r.before_symlink do
|
553
|
-
callback_order << :before_symlink
|
554
|
-
|
555
|
-
current_release_path = release_path
|
556
|
-
ruby_block "ensure before symlink" do
|
557
|
-
block do
|
558
|
-
if ::File.exist?(::File.join(current_release_path, "/tmp"))
|
559
|
-
raise "Ordering issue with provider, expected symlinks to not have been created"
|
560
|
-
end
|
561
|
-
end
|
562
|
-
end
|
563
|
-
|
564
|
-
file "#{release_path}/before_symlink.txt" do
|
565
|
-
content callback_order.inspect
|
566
|
-
end
|
567
|
-
end
|
568
|
-
r.before_restart do
|
569
|
-
callback_order << :before_restart
|
570
|
-
|
571
|
-
current_release_path = release_path
|
572
|
-
ruby_block "ensure after symlink" do
|
573
|
-
block do
|
574
|
-
unless ::File.exist?(::File.join(current_release_path, "/tmp"))
|
575
|
-
raise "Ordering issue with provider, expected symlinks to have been created"
|
576
|
-
end
|
577
|
-
end
|
578
|
-
end
|
579
|
-
|
580
|
-
file "#{release_path}/tmp/before_restart.txt" do
|
581
|
-
content callback_order.inspect
|
582
|
-
end
|
583
|
-
end
|
584
|
-
r.after_restart do
|
585
|
-
callback_order << :after_restart
|
586
|
-
file "#{release_path}/tmp/after_restart.txt" do
|
587
|
-
content callback_order.inspect
|
588
|
-
end
|
589
|
-
end
|
590
|
-
end
|
591
|
-
end
|
592
|
-
|
593
|
-
before do
|
594
|
-
callback_order.clear # callback_order variable is global for this context group
|
595
|
-
deploy_to_latest_with_inline_recipes.run_action(:deploy)
|
596
|
-
end
|
597
|
-
|
598
|
-
the_app_is_deployed_at_revision(:latest_rev)
|
599
|
-
|
600
|
-
it "is marked updated" do
|
601
|
-
expect(deploy_to_latest_with_inline_recipes).to be_updated_by_last_action
|
602
|
-
end
|
603
|
-
|
604
|
-
it "calls the callbacks in order" do
|
605
|
-
expect(callback_order).to eq([:before_migrate, :before_symlink, :before_restart, :after_restart])
|
606
|
-
end
|
607
|
-
|
608
|
-
it "runs chef resources in the callbacks" do
|
609
|
-
expect(File).to exist(rel_path("current/before_migrate.txt"))
|
610
|
-
expect(File).to exist(rel_path("current/before_symlink.txt"))
|
611
|
-
expect(File).to exist(rel_path("current/tmp/before_restart.txt"))
|
612
|
-
expect(File).to exist(rel_path("current/tmp/after_restart.txt"))
|
613
|
-
end
|
614
|
-
end
|
615
|
-
|
616
|
-
context "when deploying an app with in-repo callback scripts" do
|
617
|
-
let(:deploy_with_in_repo_callbacks) do
|
618
|
-
basic_deploy_resource.dup.tap do |r|
|
619
|
-
r.repo git_bundle_with_in_repo_callbacks
|
620
|
-
r.revision rev_with_in_repo_callbacks
|
621
|
-
end
|
622
|
-
end
|
623
|
-
|
624
|
-
before do
|
625
|
-
deploy_with_in_repo_callbacks.run_action(:deploy)
|
626
|
-
end
|
627
|
-
|
628
|
-
the_app_is_deployed_at_revision(:rev_with_in_repo_callbacks)
|
629
|
-
|
630
|
-
it "runs chef resources in the callbacks" do
|
631
|
-
expect(File).to exist(rel_path("current/before_migrate.txt"))
|
632
|
-
expect(File).to exist(rel_path("current/before_symlink.txt"))
|
633
|
-
expect(File).to exist(rel_path("current/tmp/before_restart.txt"))
|
634
|
-
expect(File).to exist(rel_path("current/tmp/after_restart.txt"))
|
635
|
-
end
|
636
|
-
|
637
|
-
end
|
638
|
-
|
639
|
-
context "when deploying an app with migrations" do
|
640
|
-
let(:deploy_with_migration) do
|
641
|
-
basic_deploy_resource.dup.tap do |r|
|
642
|
-
|
643
|
-
# Need this so we can call methods from this test inside the inline
|
644
|
-
# recipe callbacks
|
645
|
-
spec_context = self
|
646
|
-
|
647
|
-
r.revision latest_rev
|
648
|
-
|
649
|
-
# enable migrations
|
650
|
-
r.migrate true
|
651
|
-
# abuse `shell_restart_command` so we can observe order of when the
|
652
|
-
# miration command gets run
|
653
|
-
r.migration_command shell_restart_command("migration")
|
654
|
-
r.before_migrate do
|
655
|
-
|
656
|
-
# inline recipe callbacks don't cwd, so you have to get the release
|
657
|
-
# directory as a local and "capture" it in the closure.
|
658
|
-
current_release = release_path
|
659
|
-
execute spec_context.shell_restart_command("before_migrate") do
|
660
|
-
cwd current_release
|
661
|
-
end
|
662
|
-
end
|
663
|
-
r.before_symlink do
|
664
|
-
current_release = release_path
|
665
|
-
execute spec_context.shell_restart_command("before_symlink") do
|
666
|
-
cwd current_release
|
667
|
-
end
|
668
|
-
end
|
669
|
-
|
670
|
-
r.before_restart do
|
671
|
-
current_release = release_path
|
672
|
-
execute spec_context.shell_restart_command("before_restart") do
|
673
|
-
cwd current_release
|
674
|
-
end
|
675
|
-
end
|
676
|
-
|
677
|
-
r.after_restart do
|
678
|
-
current_release = release_path
|
679
|
-
execute spec_context.shell_restart_command("after_restart") do
|
680
|
-
cwd current_release
|
681
|
-
end
|
682
|
-
end
|
683
|
-
|
684
|
-
end
|
685
|
-
end
|
686
|
-
|
687
|
-
before do
|
688
|
-
deploy_with_migration.run_action(:deploy)
|
689
|
-
end
|
690
|
-
|
691
|
-
it "runs migrations in between the before_migrate and before_symlink steps" do
|
692
|
-
expect(actual_operations_order).to eq(%w{before_migrate migration before_symlink before_restart after_restart})
|
693
|
-
end
|
694
|
-
end
|
695
|
-
|
696
|
-
context "when deploying an app with in-repo symlinks" do
|
697
|
-
let(:deploy_with_in_repo_symlinks) do
|
698
|
-
basic_deploy_resource.dup.tap do |r|
|
699
|
-
r.repo git_bundle_with_in_repo_symlinks
|
700
|
-
r.revision rev_with_in_repo_symlinks
|
701
|
-
end
|
702
|
-
end
|
703
|
-
|
704
|
-
it "should not raise an exception calling File.utime on symlinks" do
|
705
|
-
expect { deploy_with_in_repo_symlinks.run_action(:deploy) }.not_to raise_error
|
706
|
-
end
|
707
|
-
end
|
708
|
-
|
709
|
-
context "when a previously deployed application has been nuked" do
|
710
|
-
|
711
|
-
shared_examples_for "a redeployed application" do
|
712
|
-
|
713
|
-
it "should redeploy the application" do
|
714
|
-
expect(File).to be_directory(rel_path("releases"))
|
715
|
-
expect(File).to be_directory(rel_path("shared"))
|
716
|
-
expect(File).to be_directory(rel_path("releases/#{latest_rev}"))
|
717
|
-
|
718
|
-
expect(File).to be_directory(rel_path("current/tmp"))
|
719
|
-
expect(File).to be_directory(rel_path("current/config"))
|
720
|
-
expect(File).to be_directory(rel_path("current/public"))
|
721
|
-
|
722
|
-
expect(File).to be_symlink(rel_path("current"))
|
723
|
-
expect(File.readlink(rel_path("current"))).to eq(rel_path("releases/#{latest_rev}"))
|
724
|
-
end
|
725
|
-
end
|
726
|
-
|
727
|
-
# background: If a deployment is hosed and the user decides to rm -rf the
|
728
|
-
# deployment dir, deploy resource should detect that and nullify its cache.
|
729
|
-
|
730
|
-
context "by removing the entire deploy directory" do
|
731
|
-
|
732
|
-
before do
|
733
|
-
deploy_to_latest_rev.dup.run_action(:deploy)
|
734
|
-
FileUtils.rm_rf(deploy_directory)
|
735
|
-
deploy_to_latest_rev.dup.run_action(:deploy)
|
736
|
-
end
|
737
|
-
|
738
|
-
include_examples "a redeployed application"
|
739
|
-
|
740
|
-
end
|
741
|
-
|
742
|
-
context "by removing the current/ directory" do
|
743
|
-
|
744
|
-
before do
|
745
|
-
deploy_to_latest_rev.dup.run_action(:deploy)
|
746
|
-
FileUtils.rm(rel_path("current"))
|
747
|
-
deploy_to_latest_rev.dup.run_action(:deploy)
|
748
|
-
end
|
749
|
-
|
750
|
-
include_examples "a redeployed application"
|
751
|
-
|
752
|
-
end
|
753
|
-
end
|
754
|
-
|
755
|
-
context "when a deployment fails" do
|
756
|
-
|
757
|
-
shared_examples_for "a recovered deployment" do
|
758
|
-
|
759
|
-
it "should redeploy the application" do
|
760
|
-
expect(File).to be_directory(rel_path("releases"))
|
761
|
-
expect(File).to be_directory(rel_path("shared"))
|
762
|
-
expect(File).to be_directory(rel_path("releases/#{latest_rev}"))
|
763
|
-
|
764
|
-
expect(File).to be_directory(rel_path("current/tmp"))
|
765
|
-
expect(File).to be_directory(rel_path("current/config"))
|
766
|
-
expect(File).to be_directory(rel_path("current/public"))
|
767
|
-
|
768
|
-
expect(File).to be_symlink(rel_path("current"))
|
769
|
-
expect(File.readlink(rel_path("current"))).to eq(rel_path("releases/#{latest_rev}"))
|
770
|
-
|
771
|
-
# if callbacks ran, we know the app was deployed and not merely rolled
|
772
|
-
# back to a (busted) prior deployment.
|
773
|
-
expect(callback_order).to eq([:before_migrate,
|
774
|
-
:before_symlink,
|
775
|
-
:before_restart,
|
776
|
-
:after_restart ])
|
777
|
-
end
|
778
|
-
end
|
779
|
-
|
780
|
-
let!(:callback_order) { [] }
|
781
|
-
|
782
|
-
let(:deploy_to_latest_with_callback_tracking) do
|
783
|
-
resource = deploy_to_latest_rev.dup
|
784
|
-
tracker = callback_order
|
785
|
-
resource.before_migrate { tracker << :before_migrate }
|
786
|
-
resource.before_symlink { tracker << :before_symlink }
|
787
|
-
resource.before_restart { tracker << :before_restart }
|
788
|
-
resource.after_restart { tracker << :after_restart }
|
789
|
-
resource
|
790
|
-
end
|
791
|
-
|
792
|
-
[:before_migrate, :before_symlink, :before_restart, :after_restart].each do |callback|
|
793
|
-
|
794
|
-
context "in the `#{callback}' callback" do
|
795
|
-
before do
|
796
|
-
expect { deploy_that_fails.run_action(:deploy) }.to raise_error(Exception, %r{I am a failed deploy})
|
797
|
-
deploy_to_latest_with_callback_tracking.run_action(:deploy)
|
798
|
-
end
|
799
|
-
|
800
|
-
let(:deploy_that_fails) do
|
801
|
-
resource = deploy_to_latest_rev.dup
|
802
|
-
errant_callback = lambda { |x| raise Exception, "I am a failed deploy" }
|
803
|
-
resource.send(callback, &errant_callback)
|
804
|
-
resource
|
805
|
-
end
|
806
|
-
|
807
|
-
include_examples "a recovered deployment"
|
808
|
-
|
809
|
-
end
|
810
|
-
|
811
|
-
end
|
812
|
-
|
813
|
-
context "in the service restart step" do
|
814
|
-
|
815
|
-
let(:deploy_that_fails) do
|
816
|
-
resource = deploy_to_latest_rev.dup
|
817
|
-
resource.restart_command("RUBYOPT=\"\" ruby -e 'exit 1'")
|
818
|
-
resource
|
819
|
-
end
|
820
|
-
|
821
|
-
before do
|
822
|
-
expect { deploy_that_fails.run_action(:deploy) }.to raise_error(Mixlib::ShellOut::ShellCommandFailed)
|
823
|
-
deploy_to_latest_with_callback_tracking.run_action(:deploy)
|
824
|
-
end
|
825
|
-
|
826
|
-
include_examples "a recovered deployment"
|
827
|
-
end
|
828
|
-
|
829
|
-
context "when cloning the app code" do
|
830
|
-
|
831
|
-
class BadTimeScmProvider
|
832
|
-
def initialize(new_resource, run_context)
|
833
|
-
end
|
834
|
-
|
835
|
-
def load_current_resource
|
836
|
-
end
|
837
|
-
|
838
|
-
def revision_slug
|
839
|
-
"5"
|
840
|
-
end
|
841
|
-
|
842
|
-
def run_action(action)
|
843
|
-
raise "network error"
|
844
|
-
end
|
845
|
-
end
|
846
|
-
|
847
|
-
let(:deploy_that_fails) do
|
848
|
-
resource = deploy_to_latest_rev.dup
|
849
|
-
resource.scm_provider(BadTimeScmProvider)
|
850
|
-
resource
|
851
|
-
end
|
852
|
-
|
853
|
-
before do
|
854
|
-
expect { deploy_that_fails.run_action(:deploy) }.to raise_error(RuntimeError, /network error/)
|
855
|
-
deploy_to_latest_with_callback_tracking.run_action(:deploy)
|
856
|
-
end
|
857
|
-
|
858
|
-
include_examples "a recovered deployment"
|
859
|
-
end
|
860
|
-
|
861
|
-
context "and then is deployed to a different revision" do
|
862
|
-
|
863
|
-
let(:deploy_that_fails) do
|
864
|
-
resource = deploy_to_previous_rev.dup
|
865
|
-
resource.after_restart { |x| raise Exception, "I am a failed deploy" }
|
866
|
-
resource
|
867
|
-
end
|
868
|
-
|
869
|
-
before do
|
870
|
-
expect { deploy_that_fails.run_action(:deploy) }.to raise_error(Exception, %r{I am a failed deploy})
|
871
|
-
deploy_to_latest_rev.run_action(:deploy)
|
872
|
-
end
|
873
|
-
|
874
|
-
it "removes the unsuccessful deploy after a later successful deploy" do
|
875
|
-
expect(::File).not_to exist(File.join(deploy_directory, "releases", previous_rev))
|
876
|
-
end
|
877
|
-
|
878
|
-
end
|
879
|
-
|
880
|
-
end
|
881
|
-
end
|