Deprecation: Chef::Platform methods (CHEF-13)

[edit on GitHub]

Several methods under Chef::Platform that were previously public APIs to control resolution of provider classes were replaced by the dynamic Chef::ProviderResolver work and the provides keyword.

This deprecation warning was added in Chef Client 12.18.x, and using these APIs will become a hard error in Chef Client 13.

Remediation

Code which used to use Chef::Platform.provider_for_resource or Chef::Platform.find_provider to create providers for a resource:

resource = Chef::Resource::File.new("/tmp/foo.xyz", run_context)
provider = Chef::Platform.provider_for_resource(resource, :create)

resource = Chef::Resource::File.new("/tmp/foo.xyz", run_context)
provider = Chef::Platform.find_provider("ubuntu", "16.04", resource)

resource = Chef::Resource::File.new("/tmp/foo.xyz", run_context)
provider = Chef::Platform.find_provider_for_node(node, resource)

Should instead use the Chef::Resource#provider_for_action API on the instance of the resource:

resource = Chef::Resource::File.new("/tmp/foo.xyz", run_context)
provider = resource.provider_for_action(:create)

As the internal resources and providers in core chef have been ported over to use the Chef::ProviderResolver dynamic resolution the use of the old Chef::Platform class methods have actually been broken. Tools like chefspec and chef-minitest-handler were ported over to the new APIs in Chef Client 12.0. The Chef::Resource#provider_for_action API dates back to before Chef Client 11.0.0 and is fully backwards compatible, any remaining code using the old APIs should be exceedingly buggy at this point.

Also, code which used to use Chef::Platform.set to register providers for a platform/platform_version should use the provides keyword on the provider instead:

Chef::Platform.set platform: :fedora, version: '>= 19', resource: :mysql_service, provider: Chef::Provider::MysqlServiceSystemd

Should be replaced by:

class Chef::Provider::MysqlServiceSystemd
provides :mysql_service, platform: "fedora", platform_version: ">= 19"

This can also be directly sent to the provider class in library code, although this form is less encouraged (which does not mean the same thing as discouraged – but you gain better code organization with the prior code):

Chef::Provider::MysqlSserviceSystemd.provides :mysql_service, platform: "fedora", platform_version: ">= 19"

The provides API on providers is only supported in Chef Client 12.0 or later. This change will create a hard backwards compatibility break between Chef Client 13 and Chef Client 11 without the cookbook doing the work to check the Chef::VERSION and switch between these APIs. This API is supported back to Chef Client 12.0, although some more advanced forms of the provides syntax were only introduced in Chef Client 12.5.1.

Also you may have found this web page due to deprecation of library-based resources and providers that do not declare provides in which case your Chef Infra Client run is likely full of a compilation of warnings and deprecations:

* foo[it] action doit[2016-12-07T14:28:59-08:00] WARN: Class Chef::Provider::Foo does not declare 'provides :foo'.
  [2016-12-07T14:28:59-08:00] WARN: This will no longer work in Chef Client 13: you must use 'provides' to use the resource's DSL.
  (up to date)

Running handlers:
Running handlers complete

Deprecated features used!
Class.find_provider_for_node is deprecated at 1 location:
- /Users/lamont/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/forwardable.rb:189:in 'execute_each_resource'
  See /deprecations_chef_platform_methods.html for further details.
Class.find_provider is deprecated at 1 location:
- /Users/lamont/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/forwardable.rb:189:in 'execute_each_resource'
  See /deprecations_chef_platform_methods.html for further details.
Class.find is deprecated at 1 location:
- /Users/lamont/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/forwardable.rb:189:in 'execute_each_resource'
  See /deprecations_chef_platform_methods.html for further details.

In this case, the initial warning that Class Chef::Provider::Foo does not declare 'provides :foo' is accurate and gives the remediation.

Code that looks like this:

class Chef::Provider::Foo < Chef::Provider::LWRPBase
  use_inline_resources

  action :doit do
    [ ... stuff ... ]
  end
end

Must be changed to explicitly declare the resource it provides:

class Chef::Provider::Foo < Chef::Provider::LWRPBase
  provides :foo

  use_inline_resources

  action :doit do
    [ ... stuff ... ]
  end
end

The use of custom resources over library class providers that inherit from LWRPBase is also encouraged.

© Chef Software, Inc.
Licensed under the Creative Commons Attribution 3.0 Unported License.
The Chef™ Mark and Chef Logo are either registered trademarks/service marks or trademarks/servicemarks of Chef, in the United States and other countries and are used with Chef Inc's permission.
We are not affiliated with, endorsed or sponsored by Chef Inc.
https://docs.chef.io/deprecations_chef_platform_methods/