chef 12.4.0 → 12.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. checksums.yaml +4 -4
  2. data/lib/chef/api_client.rb +31 -129
  3. data/lib/chef/api_client_v1.rb +325 -0
  4. data/lib/chef/chef_class.rb +15 -7
  5. data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +2 -2
  6. data/lib/chef/dsl/resources.rb +6 -4
  7. data/lib/chef/exceptions.rb +2 -2
  8. data/lib/chef/guard_interpreter/resource_guard_interpreter.rb +2 -1
  9. data/lib/chef/knife/bootstrap/templates/chef-full.erb +4 -4
  10. data/lib/chef/knife/client_bulk_delete.rb +2 -2
  11. data/lib/chef/knife/client_create.rb +4 -4
  12. data/lib/chef/knife/client_delete.rb +3 -3
  13. data/lib/chef/knife/client_edit.rb +10 -2
  14. data/lib/chef/knife/client_list.rb +2 -2
  15. data/lib/chef/knife/client_reregister.rb +2 -2
  16. data/lib/chef/knife/client_show.rb +2 -2
  17. data/lib/chef/knife/osc_user_create.rb +3 -3
  18. data/lib/chef/knife/osc_user_delete.rb +2 -2
  19. data/lib/chef/knife/osc_user_edit.rb +3 -3
  20. data/lib/chef/knife/osc_user_list.rb +2 -2
  21. data/lib/chef/knife/osc_user_reregister.rb +2 -2
  22. data/lib/chef/knife/osc_user_show.rb +2 -2
  23. data/lib/chef/knife/user_create.rb +3 -3
  24. data/lib/chef/knife/user_delete.rb +4 -4
  25. data/lib/chef/knife/user_edit.rb +3 -3
  26. data/lib/chef/knife/user_list.rb +2 -2
  27. data/lib/chef/knife/user_reregister.rb +2 -2
  28. data/lib/chef/knife/user_show.rb +2 -2
  29. data/lib/chef/node_map.rb +14 -18
  30. data/lib/chef/platform/handler_map.rb +45 -0
  31. data/lib/chef/platform/priority_map.rb +19 -32
  32. data/lib/chef/platform/provider_handler_map.rb +29 -0
  33. data/lib/chef/platform/provider_mapping.rb +3 -2
  34. data/lib/chef/platform/resource_handler_map.rb +29 -0
  35. data/lib/chef/platform/resource_priority_map.rb +0 -6
  36. data/lib/chef/provider.rb +1 -1
  37. data/lib/chef/provider/dsc_resource.rb +2 -2
  38. data/lib/chef/provider/dsc_script.rb +1 -1
  39. data/lib/chef/provider/mount/aix.rb +1 -1
  40. data/lib/chef/provider/package.rb +0 -31
  41. data/lib/chef/provider/package/aix.rb +1 -0
  42. data/lib/chef/provider/package/apt.rb +1 -0
  43. data/lib/chef/provider/package/homebrew.rb +1 -0
  44. data/lib/chef/provider/package/ips.rb +1 -0
  45. data/lib/chef/provider/package/macports.rb +1 -0
  46. data/lib/chef/provider/package/openbsd.rb +1 -0
  47. data/lib/chef/provider/package/pacman.rb +1 -0
  48. data/lib/chef/provider/package/paludis.rb +1 -0
  49. data/lib/chef/provider/package/portage.rb +2 -0
  50. data/lib/chef/provider/package/smartos.rb +1 -0
  51. data/lib/chef/provider/package/solaris.rb +2 -0
  52. data/lib/chef/provider/package/yum.rb +1 -0
  53. data/lib/chef/provider/package/zypper.rb +1 -0
  54. data/lib/chef/provider/service.rb +4 -22
  55. data/lib/chef/provider/service/debian.rb +2 -0
  56. data/lib/chef/provider/service/insserv.rb +2 -0
  57. data/lib/chef/provider/service/invokercd.rb +2 -0
  58. data/lib/chef/provider/service/openbsd.rb +1 -1
  59. data/lib/chef/provider/service/redhat.rb +2 -0
  60. data/lib/chef/provider/service/upstart.rb +3 -0
  61. data/lib/chef/provider_resolver.rb +59 -53
  62. data/lib/chef/resource.rb +22 -73
  63. data/lib/chef/resource/dsc_script.rb +1 -1
  64. data/lib/chef/resource/ips_package.rb +1 -0
  65. data/lib/chef/resource/mount.rb +8 -0
  66. data/lib/chef/resource/openbsd_package.rb +0 -11
  67. data/lib/chef/resource/solaris_package.rb +1 -4
  68. data/lib/chef/resource_resolver.rb +54 -26
  69. data/lib/chef/run_list/versioned_recipe_list.rb +6 -5
  70. data/lib/chef/user.rb +52 -188
  71. data/lib/chef/user_v1.rb +335 -0
  72. data/lib/chef/version.rb +1 -1
  73. data/spec/data/trusted_certs/opscode.pem +53 -56
  74. data/spec/functional/provider/whyrun_safe_ruby_block_spec.rb +1 -1
  75. data/spec/functional/resource/package_spec.rb +0 -2
  76. data/spec/integration/recipes/recipe_dsl_spec.rb +661 -126
  77. data/spec/spec_helper.rb +19 -13
  78. data/spec/support/shared/unit/api_versioning.rb +2 -2
  79. data/spec/unit/api_client_spec.rb +22 -201
  80. data/spec/unit/api_client_v1_spec.rb +457 -0
  81. data/spec/unit/knife/client_bulk_delete_spec.rb +4 -4
  82. data/spec/unit/knife/client_create_spec.rb +1 -1
  83. data/spec/unit/knife/client_delete_spec.rb +3 -3
  84. data/spec/unit/knife/client_edit_spec.rb +14 -1
  85. data/spec/unit/knife/client_list_spec.rb +1 -1
  86. data/spec/unit/knife/client_reregister_spec.rb +2 -2
  87. data/spec/unit/knife/client_show_spec.rb +2 -2
  88. data/spec/unit/knife/osc_user_create_spec.rb +5 -5
  89. data/spec/unit/knife/osc_user_delete_spec.rb +1 -1
  90. data/spec/unit/knife/osc_user_edit_spec.rb +1 -1
  91. data/spec/unit/knife/osc_user_list_spec.rb +1 -1
  92. data/spec/unit/knife/osc_user_reregister_spec.rb +1 -1
  93. data/spec/unit/knife/osc_user_show_spec.rb +1 -1
  94. data/spec/unit/knife/user_create_spec.rb +1 -1
  95. data/spec/unit/knife/user_delete_spec.rb +2 -2
  96. data/spec/unit/knife/user_edit_spec.rb +2 -2
  97. data/spec/unit/knife/user_list_spec.rb +1 -1
  98. data/spec/unit/knife/user_reregister_spec.rb +1 -1
  99. data/spec/unit/knife/user_show_spec.rb +2 -2
  100. data/spec/unit/lwrp_spec.rb +146 -134
  101. data/spec/unit/node_map_spec.rb +12 -0
  102. data/spec/unit/platform_spec.rb +1 -1
  103. data/spec/unit/provider/deploy_spec.rb +1 -1
  104. data/spec/unit/provider/dsc_resource_spec.rb +3 -3
  105. data/spec/unit/provider/dsc_script_spec.rb +2 -2
  106. data/spec/unit/provider_resolver_spec.rb +170 -135
  107. data/spec/unit/recipe_spec.rb +3 -3
  108. data/spec/unit/resource/breakpoint_spec.rb +1 -1
  109. data/spec/unit/resource/cron_spec.rb +1 -1
  110. data/spec/unit/resource/directory_spec.rb +1 -1
  111. data/spec/unit/resource/dsc_resource_spec.rb +1 -1
  112. data/spec/unit/resource/dsc_script_spec.rb +2 -2
  113. data/spec/unit/resource/env_spec.rb +1 -1
  114. data/spec/unit/resource/erl_call_spec.rb +1 -1
  115. data/spec/unit/resource/file_spec.rb +1 -1
  116. data/spec/unit/resource/group_spec.rb +1 -1
  117. data/spec/unit/resource/link_spec.rb +1 -1
  118. data/spec/unit/resource/mdadm_spec.rb +1 -1
  119. data/spec/unit/resource/mount_spec.rb +1 -1
  120. data/spec/unit/resource/ohai_spec.rb +1 -1
  121. data/spec/unit/resource/registry_key_spec.rb +1 -1
  122. data/spec/unit/resource/route_spec.rb +1 -1
  123. data/spec/unit/resource/ruby_block_spec.rb +3 -3
  124. data/spec/unit/resource/user_spec.rb +1 -1
  125. data/spec/unit/resource/windows_service_spec.rb +1 -1
  126. data/spec/unit/resource_resolver_spec.rb +8 -4
  127. data/spec/unit/resource_spec.rb +89 -3
  128. data/spec/unit/run_list/versioned_recipe_list_spec.rb +115 -48
  129. data/spec/unit/user_spec.rb +97 -405
  130. data/spec/unit/user_v1_spec.rb +584 -0
  131. metadata +11 -6
  132. data/lib/chef/osc_user.rb +0 -194
  133. data/spec/unit/osc_user_spec.rb +0 -276
@@ -22,7 +22,7 @@ class Chef
22
22
  class Resource
23
23
  class DscScript < Chef::Resource
24
24
 
25
- provides :dsc_script, platform: "windows"
25
+ provides :dsc_script, os: "windows"
26
26
 
27
27
  default_action :run
28
28
 
@@ -23,6 +23,7 @@ class Chef
23
23
  class Resource
24
24
  class IpsPackage < ::Chef::Resource::Package
25
25
 
26
+ provides :package, os: "solaris2"
26
27
  provides :ips_package, os: "solaris2"
27
28
 
28
29
  allowed_actions :install, :remove, :upgrade
@@ -174,6 +174,14 @@ class Chef
174
174
  )
175
175
  end
176
176
 
177
+ private
178
+
179
+ # Used by the AIX provider to set fstype to nil.
180
+ # TODO use property to make nil a valid value for fstype
181
+ def clear_fstype
182
+ @fstype = nil
183
+ end
184
+
177
185
  end
178
186
  end
179
187
  end
@@ -29,17 +29,6 @@ class Chef
29
29
  include Chef::Mixin::ShellOut
30
30
 
31
31
  provides :package, os: "openbsd"
32
-
33
- def after_created
34
- assign_provider
35
- end
36
-
37
- private
38
-
39
- def assign_provider
40
- @provider = Chef::Provider::Package::Openbsd
41
- end
42
-
43
32
  end
44
33
  end
45
34
  end
@@ -24,10 +24,7 @@ class Chef
24
24
  class Resource
25
25
  class SolarisPackage < Chef::Resource::Package
26
26
  provides :package, os: "solaris2", platform_family: "nexentacore"
27
- provides :package, os: "solaris2", platform_family: "solaris2" do |node|
28
- # on >= Solaris 11 we default to IPS packages instead
29
- node[:platform_version].to_f <= 5.10
30
- end
27
+ provides :package, os: "solaris2", platform_family: "solaris2", platform_version: "<= 5.10"
31
28
  end
32
29
  end
33
30
  end
@@ -105,52 +105,80 @@ class Chef
105
105
  #
106
106
  # Whether this DSL is provided by the given resource_class.
107
107
  #
108
+ # Does NOT call provides? on the resource (it is assumed this is being
109
+ # called *from* provides?).
110
+ #
108
111
  # @api private
109
112
  def provided_by?(resource_class)
110
- !prioritized_handlers.include?(resource_class)
113
+ potential_handlers.include?(resource_class)
114
+ end
115
+
116
+ #
117
+ # Whether the given handler attempts to provide the resource class at all.
118
+ #
119
+ # @api private
120
+ def self.includes_handler?(resource_name, resource_class)
121
+ handler_map.list(nil, resource_name).include?(resource_class)
111
122
  end
112
123
 
113
124
  protected
114
125
 
126
+ def self.priority_map
127
+ Chef.resource_priority_map
128
+ end
129
+
130
+ def self.handler_map
131
+ Chef.resource_handler_map
132
+ end
133
+
115
134
  def priority_map
116
- Chef::Platform::ResourcePriorityMap.instance
135
+ Chef.resource_priority_map
136
+ end
137
+
138
+ def handler_map
139
+ Chef.resource_handler_map
140
+ end
141
+
142
+ # @api private
143
+ def potential_handlers
144
+ handler_map.list(node, resource_name, canonical: canonical).uniq
145
+ end
146
+
147
+ def enabled_handlers
148
+ potential_handlers.select { |handler| !overrode_provides?(handler) || handler.provides?(node, resource_name) }
117
149
  end
118
150
 
119
151
  def prioritized_handlers
120
- @prioritized_handlers ||=
121
- priority_map.list_handlers(node, resource_name, canonical: canonical)
152
+ @prioritized_handlers ||= begin
153
+ enabled_handlers = self.enabled_handlers
154
+
155
+ prioritized = priority_map.list(node, resource_name, canonical: canonical).flatten(1)
156
+ prioritized &= enabled_handlers # Filter the priority map by the actual enabled handlers
157
+ prioritized |= enabled_handlers # Bring back any handlers that aren't in the priority map, at the *end* (ordered set)
158
+ prioritized
159
+ end
160
+ end
161
+
162
+ def overrode_provides?(handler)
163
+ handler.method(:provides?).owner != Chef::Resource.method(:provides?).owner
122
164
  end
123
165
 
124
166
  module Deprecated
125
167
  # return a deterministically sorted list of Chef::Resource subclasses
126
- # @deprecated Now prioritized_handlers does its own work (more efficiently)
127
168
  def resources
128
169
  Chef::Resource.sorted_descendants
129
170
  end
130
171
 
131
- # A list of all handlers
132
- # @deprecated Now prioritized_handlers does its own work
133
172
  def enabled_handlers
134
- Chef::Log.deprecation("enabled_handlers is deprecated. If you are implementing a ResourceResolver, use provided_handlers. If you are not, use Chef::ResourceResolver.list(#{resource_name.inspect}, node: <node>)")
135
- resources.select { |klass| klass.provides?(node, resource_name) }
136
- end
137
-
138
- protected
139
-
140
- # A list of all handlers for the given DSL. If there are no handlers in
141
- # the map, we still check all descendants of Chef::Resource for backwards
142
- # compatibility purposes.
143
- def prioritized_handlers
144
- @prioritized_handlers ||= super ||
145
- resources.select do |klass|
146
- # Don't bother calling provides? unless it's overridden. We already
147
- # know prioritized_handlers
148
- if klass.method(:provides?).owner != Chef::Resource && klass.provides?(node, resource_name)
149
- Chef::Log.deprecation("Resources #{provided.join(", ")} are marked as providing DSL #{resource_name}, but provides #{resource_name.inspect} was never called!")
150
- Chef::Log.deprecation("In Chef 13, this will break: you must call provides to mark the names you provide, even if you also override provides? yourself.")
151
- true
152
- end
173
+ handlers = super
174
+ if handlers.empty?
175
+ handlers = resources.select { |handler| overrode_provides?(handler) && handler.provides?(node, resource_name) }
176
+ handlers.each do |handler|
177
+ Chef::Log.deprecation("#{handler}.provides? returned true when asked if it provides DSL #{resource_name}, but provides #{resource_name.inspect} was never called!")
178
+ Chef::Log.deprecation("In Chef 13, this will break: you must call provides to mark the names you provide, even if you also override provides? yourself.")
153
179
  end
180
+ end
181
+ handlers
154
182
  end
155
183
  end
156
184
  prepend Deprecated
@@ -70,15 +70,16 @@ class Chef
70
70
  # @return [Array] Array of strings with fully-qualified recipe names
71
71
  def with_fully_qualified_names_and_version_constraints
72
72
  self.map do |recipe_name|
73
- ret = if recipe_name.include?('::')
73
+ qualified_recipe = if recipe_name.include?('::')
74
74
  recipe_name
75
75
  else
76
76
  "#{recipe_name}::default"
77
77
  end
78
- if @versions[recipe_name]
79
- ret << "@#{@versions[recipe_name]}"
80
- end
81
- ret
78
+
79
+ version = @versions[recipe_name]
80
+ qualified_recipe = "#{qualified_recipe}@#{version}" if version
81
+
82
+ qualified_recipe
82
83
  end
83
84
  end
84
85
  end
@@ -21,85 +21,45 @@ require 'chef/mixin/from_file'
21
21
  require 'chef/mash'
22
22
  require 'chef/json_compat'
23
23
  require 'chef/search/query'
24
- require 'chef/mixin/api_version_request_handling'
25
- require 'chef/exceptions'
26
24
  require 'chef/server_api'
27
25
 
28
- # OSC 11 BACKWARDS COMPATIBILITY NOTE (remove after OSC 11 support ends)
26
+ # TODO
27
+ # DEPRECATION NOTE
28
+ # This class will be replaced by Chef::UserV1 in Chef 13. It is the code to support the User object
29
+ # corrosponding to the Open Source Chef Server 11 and only still exists to support
30
+ # users still on OSC 11.
29
31
  #
30
- # In general, Chef::User is no longer expected to support Open Source Chef 11 Server requests.
31
- # The object that handles those requests has been moved to the Chef::OscUser namespace.
32
+ # Chef::UserV1 now supports Chef Server 12 and will be moved to this namespace in Chef 13.
32
33
  #
33
- # Exception: self.list is backwards compatible with OSC 11
34
+ # New development should occur in Chef::UserV1.
35
+ # This file and corrosponding osc_user knife files
36
+ # should be removed once client support for Open Source Chef Server 11 expires.
34
37
  class Chef
35
38
  class User
36
39
 
37
40
  include Chef::Mixin::FromFile
38
41
  include Chef::Mixin::ParamsValidate
39
- include Chef::Mixin::ApiVersionRequestHandling
40
-
41
- SUPPORTED_API_VERSIONS = [0,1]
42
42
 
43
43
  def initialize
44
- @username = nil
45
- @display_name = nil
46
- @first_name = nil
47
- @middle_name = nil
48
- @last_name = nil
49
- @email = nil
50
- @password = nil
44
+ @name = ''
51
45
  @public_key = nil
52
46
  @private_key = nil
53
- @create_key = nil
54
47
  @password = nil
48
+ @admin = false
55
49
  end
56
50
 
57
- def chef_root_rest_v0
58
- @chef_root_rest_v0 ||= Chef::ServerAPI.new(Chef::Config[:chef_server_root], {:api_version => "0"})
59
- end
60
-
61
- def chef_root_rest_v1
62
- @chef_root_rest_v1 ||= Chef::ServerAPI.new(Chef::Config[:chef_server_root], {:api_version => "1"})
51
+ def chef_rest_v0
52
+ @chef_rest_v0 ||= Chef::ServerAPI.new(Chef::Config[:chef_server_url], {:api_version => "0"})
63
53
  end
64
54
 
65
- def username(arg=nil)
66
- set_or_return(:username, arg,
55
+ def name(arg=nil)
56
+ set_or_return(:name, arg,
67
57
  :regex => /^[a-z0-9\-_]+$/)
68
58
  end
69
59
 
70
- def display_name(arg=nil)
71
- set_or_return(:display_name,
72
- arg, :kind_of => String)
73
- end
74
-
75
- def first_name(arg=nil)
76
- set_or_return(:first_name,
77
- arg, :kind_of => String)
78
- end
79
-
80
- def middle_name(arg=nil)
81
- set_or_return(:middle_name,
82
- arg, :kind_of => String)
83
- end
84
-
85
- def last_name(arg=nil)
86
- set_or_return(:last_name,
87
- arg, :kind_of => String)
88
- end
89
-
90
- def email(arg=nil)
91
- set_or_return(:email,
92
- arg, :kind_of => String)
93
- end
94
-
95
- def password(arg=nil)
96
- set_or_return(:password,
97
- arg, :kind_of => String)
98
- end
99
-
100
- def create_key(arg=nil)
101
- set_or_return(:create_key, arg,
102
- :kind_of => [TrueClass, FalseClass])
60
+ def admin(arg=nil)
61
+ set_or_return(:admin,
62
+ arg, :kind_of => [TrueClass, FalseClass])
103
63
  end
104
64
 
105
65
  def public_key(arg=nil)
@@ -119,17 +79,12 @@ class Chef
119
79
 
120
80
  def to_hash
121
81
  result = {
122
- "username" => @username
82
+ "name" => @name,
83
+ "public_key" => @public_key,
84
+ "admin" => @admin
123
85
  }
124
- result["display_name"] = @display_name unless @display_name.nil?
125
- result["first_name"] = @first_name unless @first_name.nil?
126
- result["middle_name"] = @middle_name unless @middle_name.nil?
127
- result["last_name"] = @last_name unless @last_name.nil?
128
- result["email"] = @email unless @email.nil?
129
- result["password"] = @password unless @password.nil?
130
- result["public_key"] = @public_key unless @public_key.nil?
131
- result["private_key"] = @private_key unless @private_key.nil?
132
- result["create_key"] = @create_key unless @create_key.nil?
86
+ result["private_key"] = @private_key if @private_key
87
+ result["password"] = @password if @password
133
88
  result
134
89
  end
135
90
 
@@ -138,86 +93,21 @@ class Chef
138
93
  end
139
94
 
140
95
  def destroy
141
- # will default to the current API version (Chef::Authenticator::DEFAULT_SERVER_API_VERSION)
142
- Chef::REST.new(Chef::Config[:chef_server_url]).delete("users/#{@username}")
96
+ chef_rest_v0.delete("users/#{@name}")
143
97
  end
144
98
 
145
99
  def create
146
- # try v1, fail back to v0 if v1 not supported
147
- begin
148
- payload = {
149
- :username => @username,
150
- :display_name => @display_name,
151
- :first_name => @first_name,
152
- :last_name => @last_name,
153
- :email => @email,
154
- :password => @password
155
- }
156
- payload[:public_key] = @public_key unless @public_key.nil?
157
- payload[:create_key] = @create_key unless @create_key.nil?
158
- payload[:middle_name] = @middle_name unless @middle_name.nil?
159
- raise Chef::Exceptions::InvalidUserAttribute, "You cannot set both public_key and create_key for create." if !@create_key.nil? && !@public_key.nil?
160
- new_user = chef_root_rest_v1.post("users", payload)
161
-
162
- # get the private_key out of the chef_key hash if it exists
163
- if new_user['chef_key']
164
- if new_user['chef_key']['private_key']
165
- new_user['private_key'] = new_user['chef_key']['private_key']
166
- end
167
- new_user['public_key'] = new_user['chef_key']['public_key']
168
- new_user.delete('chef_key')
169
- end
170
- rescue Net::HTTPServerException => e
171
- # rescue API V0 if 406 and the server supports V0
172
- supported_versions = server_client_api_version_intersection(e, SUPPORTED_API_VERSIONS)
173
- raise e unless supported_versions && supported_versions.include?(0)
174
- payload = {
175
- :username => @username,
176
- :display_name => @display_name,
177
- :first_name => @first_name,
178
- :last_name => @last_name,
179
- :email => @email,
180
- :password => @password
181
- }
182
- payload[:middle_name] = @middle_name unless @middle_name.nil?
183
- payload[:public_key] = @public_key unless @public_key.nil?
184
- # under API V0, the server will create a key pair if public_key isn't passed
185
- new_user = chef_root_rest_v0.post("users", payload)
186
- end
187
-
100
+ payload = {:name => self.name, :admin => self.admin, :password => self.password }
101
+ payload[:public_key] = public_key if public_key
102
+ new_user = chef_rest_v0.post("users", payload)
188
103
  Chef::User.from_hash(self.to_hash.merge(new_user))
189
104
  end
190
105
 
191
106
  def update(new_key=false)
192
- begin
193
- payload = {:username => username}
194
- payload[:display_name] = display_name unless display_name.nil?
195
- payload[:first_name] = first_name unless first_name.nil?
196
- payload[:middle_name] = middle_name unless middle_name.nil?
197
- payload[:last_name] = last_name unless last_name.nil?
198
- payload[:email] = email unless email.nil?
199
- payload[:password] = password unless password.nil?
200
-
201
- # API V1 will fail if these key fields are defined, and try V0 below if relevant 400 is returned
202
- payload[:public_key] = public_key unless public_key.nil?
203
- payload[:private_key] = new_key if new_key
204
-
205
- updated_user = chef_root_rest_v1.put("users/#{username}", payload)
206
- rescue Net::HTTPServerException => e
207
- if e.response.code == "400"
208
- # if a 400 is returned but the error message matches the error related to private / public key fields, try V0
209
- # else, raise the 400
210
- error = Chef::JSONCompat.from_json(e.response.body)["error"].first
211
- error_match = /Since Server API v1, all keys must be updated via the keys endpoint/.match(error)
212
- if error_match.nil?
213
- raise e
214
- end
215
- else # for other types of errors, test for API versioning errors right away
216
- supported_versions = server_client_api_version_intersection(e, SUPPORTED_API_VERSIONS)
217
- raise e unless supported_versions && supported_versions.include?(0)
218
- end
219
- updated_user = chef_root_rest_v0.put("users/#{username}", payload)
220
- end
107
+ payload = {:name => name, :admin => admin}
108
+ payload[:private_key] = new_key if new_key
109
+ payload[:password] = password if password
110
+ updated_user = chef_rest_v0.put("users/#{name}", payload)
221
111
  Chef::User.from_hash(self.to_hash.merge(updated_user))
222
112
  end
223
113
 
@@ -233,47 +123,30 @@ class Chef
233
123
  end
234
124
  end
235
125
 
236
- # Note: remove after API v0 no longer supported by client (and knife command).
237
126
  def reregister
238
- begin
239
- payload = self.to_hash.merge({"private_key" => true})
240
- reregistered_self = chef_root_rest_v0.put("users/#{username}", payload)
241
- private_key(reregistered_self["private_key"])
242
- # only V0 supported for reregister
243
- rescue Net::HTTPServerException => e
244
- # if there was a 406 related to versioning, give error explaining that
245
- # only API version 0 is supported for reregister command
246
- if e.response.code == "406" && e.response["x-ops-server-api-version"]
247
- version_header = Chef::JSONCompat.from_json(e.response["x-ops-server-api-version"])
248
- min_version = version_header["min_version"]
249
- max_version = version_header["max_version"]
250
- error_msg = reregister_only_v0_supported_error_msg(max_version, min_version)
251
- raise Chef::Exceptions::OnlyApiVersion0SupportedForAction.new(error_msg)
252
- else
253
- raise e
254
- end
255
- end
127
+ reregistered_self = chef_rest_v0.put("users/#{name}", { :name => name, :admin => admin, :private_key => true })
128
+ private_key(reregistered_self["private_key"])
256
129
  self
257
130
  end
258
131
 
259
132
  def to_s
260
- "user[#{@username}]"
133
+ "user[#{@name}]"
134
+ end
135
+
136
+ def inspect
137
+ "Chef::User name:'#{name}' admin:'#{admin.inspect}'" +
138
+ "public_key:'#{public_key}' private_key:#{private_key}"
261
139
  end
262
140
 
263
141
  # Class Methods
264
142
 
265
143
  def self.from_hash(user_hash)
266
144
  user = Chef::User.new
267
- user.username user_hash['username']
268
- user.display_name user_hash['display_name'] if user_hash.key?('display_name')
269
- user.first_name user_hash['first_name'] if user_hash.key?('first_name')
270
- user.middle_name user_hash['middle_name'] if user_hash.key?('middle_name')
271
- user.last_name user_hash['last_name'] if user_hash.key?('last_name')
272
- user.email user_hash['email'] if user_hash.key?('email')
273
- user.password user_hash['password'] if user_hash.key?('password')
274
- user.public_key user_hash['public_key'] if user_hash.key?('public_key')
145
+ user.name user_hash['name']
275
146
  user.private_key user_hash['private_key'] if user_hash.key?('private_key')
276
- user.create_key user_hash['create_key'] if user_hash.key?('create_key')
147
+ user.password user_hash['password'] if user_hash.key?('password')
148
+ user.public_key user_hash['public_key']
149
+ user.admin user_hash['admin']
277
150
  user
278
151
  end
279
152
 
@@ -286,19 +159,12 @@ class Chef
286
159
  end
287
160
 
288
161
  def self.list(inflate=false)
289
- response = Chef::REST.new(Chef::Config[:chef_server_url]).get('users')
162
+ response = Chef::ServerAPI.new(Chef::Config[:chef_server_url], {:api_version => "0"}).get('users')
290
163
  users = if response.is_a?(Array)
291
- # EC 11 / CS 12 V0, V1
292
- # GET /organizations/<org>/users
293
- transform_list_response(response)
294
- else
295
- # OSC 11
296
- # GET /users
297
- # EC 11 / CS 12 V0, V1
298
- # GET /users
299
- response # OSC
300
- end
301
-
164
+ transform_ohc_list_response(response) # OHC/OPC
165
+ else
166
+ response # OSC
167
+ end
302
168
  if inflate
303
169
  users.inject({}) do |user_map, (name, _url)|
304
170
  user_map[name] = Chef::User.load(name)
@@ -309,9 +175,8 @@ class Chef
309
175
  end
310
176
  end
311
177
 
312
- def self.load(username)
313
- # will default to the current API version (Chef::Authenticator::DEFAULT_SERVER_API_VERSION)
314
- response = Chef::REST.new(Chef::Config[:chef_server_url]).get("users/#{username}")
178
+ def self.load(name)
179
+ response = Chef::ServerAPI.new(Chef::Config[:chef_server_url], {:api_version => "0"}).get("users/#{name}")
315
180
  Chef::User.from_hash(response)
316
181
  end
317
182
 
@@ -319,7 +184,7 @@ class Chef
319
184
  # [ { "user" => { "username" => USERNAME }}, ...]
320
185
  # into the form
321
186
  # { "USERNAME" => "URI" }
322
- def self.transform_list_response(response)
187
+ def self.transform_ohc_list_response(response)
323
188
  new_response = Hash.new
324
189
  response.each do |u|
325
190
  name = u['user']['username']
@@ -328,7 +193,6 @@ class Chef
328
193
  new_response
329
194
  end
330
195
 
331
- private_class_method :transform_list_response
332
-
196
+ private_class_method :transform_ohc_list_response
333
197
  end
334
198
  end