Module: Chef::Mixin::VersionedAPIFactory

Included in:
CookbookManifestVersions
Defined in:
lib/chef/mixin/versioned_api.rb

Instance Method Summary collapse

Instance Method Details

#add_versioned_api_class(klass) ⇒ Object


38
39
40
# File 'lib/chef/mixin/versioned_api.rb', line 38

def add_versioned_api_class(klass)
  versioned_interfaces << klass
end

#best_request_versionObject

When teeing up an HTTP request, we need to be able to ask which API version we should use. Something in Net::HTTP seems to expect to strip headers, so we return this as a string.


68
69
70
71
# File 'lib/chef/mixin/versioned_api.rb', line 68

def best_request_version
  klass = get_class_for(:max_server_version)
  klass.minimum_api_version.to_s
end

#def_versioned_delegator(method) ⇒ Object


57
58
59
60
61
62
63
64
# File 'lib/chef/mixin/versioned_api.rb', line 57

def def_versioned_delegator(method)
  line_no = __LINE__; str = %{
    def self.#{method}(*args, &block)
      versioned_api_class.__send__(:#{method}, *args, &block)
    end
  }
  module_eval(str, __FILE__, line_no)
end

#get_class_for(type) ⇒ Object


46
47
48
49
50
51
52
53
54
55
# File 'lib/chef/mixin/versioned_api.rb', line 46

def get_class_for(type)
  versioned_interfaces.select do |klass|
    version = klass.send(:minimum_api_version)
    # min and max versions will be nil if we've not made a request to the server yet,
    # in which case we'll just start with the highest version and see what happens
    ServerAPIVersions.instance.min_server_version.nil? || (version >= ServerAPIVersions.instance.min_server_version && version <= ServerAPIVersions.instance.send(type))
  end
    .sort { |a, b| a.send(:minimum_api_version) <=> b.send(:minimum_api_version) }
    .last
end

#new(*args) ⇒ Object


77
78
79
80
81
# File 'lib/chef/mixin/versioned_api.rb', line 77

def new(*args)
  object = versioned_api_class.allocate
  object.send(:initialize, *args)
  object
end

#possible_requestsObject


73
74
75
# File 'lib/chef/mixin/versioned_api.rb', line 73

def possible_requests
  versioned_interfaces.length
end

#versioned_api_classObject


42
43
44
# File 'lib/chef/mixin/versioned_api.rb', line 42

def versioned_api_class
  get_class_for(:max_server_version)
end

#versioned_interfacesObject


34
35
36
# File 'lib/chef/mixin/versioned_api.rb', line 34

def versioned_interfaces
  @versioned_interfaces ||= []
end