chef 14.5.33 → 14.6.47
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +5 -3
- data/chef-universal-mingw32.gemspec +3 -2
- data/chef.gemspec +3 -4
- data/lib/chef/api_client.rb +5 -3
- data/lib/chef/api_client_v1.rb +6 -4
- data/lib/chef/application.rb +1 -1
- data/lib/chef/audit/audit_reporter.rb +1 -1
- data/lib/chef/audit/control_group_data.rb +12 -6
- data/lib/chef/chef_fs/chef_fs_data_store.rb +2 -2
- data/lib/chef/chef_fs/data_handler/data_handler_base.rb +1 -1
- data/lib/chef/cookbook/manifest_v0.rb +34 -29
- data/lib/chef/cookbook/manifest_v2.rb +15 -11
- data/lib/chef/cookbook/metadata.rb +4 -2
- data/lib/chef/cookbook_manifest.rb +8 -5
- data/lib/chef/cookbook_version.rb +1 -1
- data/lib/chef/data_bag.rb +4 -2
- data/lib/chef/data_bag_item.rb +5 -3
- data/lib/chef/data_collector.rb +2 -2
- data/lib/chef/data_collector/resource_report.rb +4 -4
- data/lib/chef/encrypted_data_bag_item.rb +4 -2
- data/lib/chef/environment.rb +4 -2
- data/lib/chef/file_content_management/deploy/mv_unix.rb +5 -4
- data/lib/chef/handler.rb +2 -2
- data/lib/chef/json_compat.rb +1 -1
- data/lib/chef/key.rb +7 -5
- data/lib/chef/knife/bootstrap.rb +7 -1
- data/lib/chef/knife/client_edit.rb +2 -2
- data/lib/chef/knife/data_bag_show.rb +2 -2
- data/lib/chef/knife/osc_user_edit.rb +2 -2
- data/lib/chef/knife/user_edit.rb +2 -2
- data/lib/chef/mixin/params_validate.rb +4 -2
- data/lib/chef/node/attribute.rb +4 -4
- data/lib/chef/org.rb +6 -4
- data/lib/chef/policy_builder/policyfile.rb +5 -3
- data/lib/chef/provider/package.rb +9 -4
- data/lib/chef/provider/package/windows.rb +23 -1
- data/lib/chef/provider/package/yum/yum_helper.py +3 -2
- data/lib/chef/provider/package/zypper.rb +12 -8
- data/lib/chef/provider/registry_key.rb +15 -6
- data/lib/chef/provider/user/windows.rb +4 -3
- data/lib/chef/provider/windows_task.rb +11 -2
- data/lib/chef/resource.rb +3 -1
- data/lib/chef/resource/locale.rb +1 -1
- data/lib/chef/resource/ohai_hint.rb +4 -4
- data/lib/chef/resource/rhsm_errata_level.rb +1 -1
- data/lib/chef/resource/timezone.rb +91 -0
- data/lib/chef/resource/user/windows_user.rb +4 -0
- data/lib/chef/resource/windows_task.rb +240 -238
- data/lib/chef/resource/zypper_package.rb +5 -0
- data/lib/chef/resource_collection/resource_collection_serialization.rb +4 -2
- data/lib/chef/resources.rb +1 -0
- data/lib/chef/role.rb +4 -2
- data/lib/chef/run_list/run_list_expansion.rb +5 -3
- data/lib/chef/run_status.rb +4 -2
- data/lib/chef/user.rb +7 -5
- data/lib/chef/user_v1.rb +8 -6
- data/lib/chef/version.rb +1 -1
- data/lib/chef/win32/security/sid.rb +39 -0
- data/spec/functional/assets/zypprepo/chef_rpm-1.10-1.aarch64.rpm +0 -0
- data/spec/functional/assets/zypprepo/chef_rpm-1.10-1.i686.rpm +0 -0
- data/spec/functional/assets/zypprepo/chef_rpm-1.10-1.ppc64.rpm +0 -0
- data/spec/functional/assets/zypprepo/chef_rpm-1.10-1.ppc64le.rpm +0 -0
- data/spec/functional/assets/zypprepo/chef_rpm-1.10-1.s390x.rpm +0 -0
- data/spec/functional/assets/zypprepo/chef_rpm-1.10-1.src.rpm +0 -0
- data/spec/functional/assets/zypprepo/chef_rpm-1.10-1.x86_64.rpm +0 -0
- data/spec/functional/assets/zypprepo/chef_rpm-1.2-1.aarch64.rpm +0 -0
- data/spec/functional/assets/zypprepo/chef_rpm-1.2-1.i686.rpm +0 -0
- data/spec/functional/assets/zypprepo/chef_rpm-1.2-1.ppc64.rpm +0 -0
- data/spec/functional/assets/zypprepo/chef_rpm-1.2-1.ppc64le.rpm +0 -0
- data/spec/functional/assets/zypprepo/chef_rpm-1.2-1.s390x.rpm +0 -0
- data/spec/functional/assets/zypprepo/chef_rpm-1.2-1.src.rpm +0 -0
- data/spec/functional/assets/zypprepo/chef_rpm-1.2-1.x86_64.rpm +0 -0
- data/spec/functional/http/simple_spec.rb +2 -2
- data/spec/functional/resource/remote_file_spec.rb +2 -2
- data/spec/functional/resource/user/windows_spec.rb +1 -1
- data/spec/functional/resource/windows_task_spec.rb +1 -1
- data/spec/functional/resource/zypper_package_spec.rb +233 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/unit/audit/audit_reporter_spec.rb +4 -4
- data/spec/unit/audit/control_group_data_spec.rb +17 -17
- data/spec/unit/environment_spec.rb +1 -1
- data/spec/unit/file_content_management/deploy/mv_unix_spec.rb +13 -1
- data/spec/unit/node_spec.rb +33 -0
- data/spec/unit/provider/package/rpm_spec.rb +5 -5
- data/spec/unit/provider/package/zypper_spec.rb +51 -0
- data/spec/unit/provider/package_spec.rb +32 -2
- data/spec/unit/provider/registry_key_spec.rb +74 -0
- data/spec/unit/provider/user/windows_spec.rb +12 -3
- data/spec/unit/provider/windows_task_spec.rb +1 -0
- data/spec/unit/resource/timezone.rb +39 -0
- data/spec/unit/resource/windows_task_spec.rb +1 -1
- data/spec/unit/resource_collection_spec.rb +1 -1
- data/spec/unit/run_context/child_run_context_spec.rb +3 -3
- data/spec/unit/shell/shell_session_spec.rb +3 -2
- metadata +21 -43
- data/CONTRIBUTING.md +0 -152
- data/VERSION +0 -1
- data/distro/powershell/chef/chef.psm1 +0 -459
- data/distro/ruby_bin_folder/Chef.PowerShell.Wrapper.dll +0 -0
- data/distro/ruby_bin_folder/Chef.PowerShell.dll +0 -0
- data/distro/ruby_bin_folder/Newtonsoft.Json.dll +0 -0
@@ -34,6 +34,11 @@ class Chef
|
|
34
34
|
property :allow_downgrade, [ TrueClass, FalseClass ],
|
35
35
|
description: "Allow downgrading a package to satisfy requested version requirements.",
|
36
36
|
default: false, introduced: "13.6"
|
37
|
+
|
38
|
+
property :global_options, [ String, Array ],
|
39
|
+
description: "One (or more) additional options that are passed to the package resource other than options to the command.",
|
40
|
+
coerce: proc { |x| x.is_a?(String) ? x.shellsplit : x },
|
41
|
+
introduced: "14.6"
|
37
42
|
end
|
38
43
|
end
|
39
44
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
#
|
2
2
|
# Author:: Tyler Ball (<tball@chef.io>)
|
3
|
-
# Copyright:: Copyright 2014-
|
3
|
+
# Copyright:: Copyright 2014-2018, Chef Software Inc.
|
4
4
|
# License:: Apache License, Version 2.0
|
5
5
|
#
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -22,7 +22,7 @@ class Chef
|
|
22
22
|
class ResourceCollection
|
23
23
|
module ResourceCollectionSerialization
|
24
24
|
# Serialize this object as a hash
|
25
|
-
def
|
25
|
+
def to_h
|
26
26
|
instance_vars = Hash.new
|
27
27
|
instance_variables.each do |iv|
|
28
28
|
instance_vars[iv] = instance_variable_get(iv)
|
@@ -33,6 +33,8 @@ class Chef
|
|
33
33
|
}
|
34
34
|
end
|
35
35
|
|
36
|
+
alias_method :to_hash, :to_h
|
37
|
+
|
36
38
|
def to_json(*a)
|
37
39
|
Chef::JSONCompat.to_json(to_hash, *a)
|
38
40
|
end
|
data/lib/chef/resources.rb
CHANGED
data/lib/chef/role.rb
CHANGED
@@ -130,7 +130,7 @@ class Chef
|
|
130
130
|
)
|
131
131
|
end
|
132
132
|
|
133
|
-
def
|
133
|
+
def to_h
|
134
134
|
env_run_lists_without_default = @env_run_lists.dup
|
135
135
|
env_run_lists_without_default.delete("_default")
|
136
136
|
result = {
|
@@ -152,9 +152,11 @@ class Chef
|
|
152
152
|
result
|
153
153
|
end
|
154
154
|
|
155
|
+
alias_method :to_hash, :to_h
|
156
|
+
|
155
157
|
# Serialize this object as a hash
|
156
158
|
def to_json(*a)
|
157
|
-
Chef::JSONCompat.to_json(
|
159
|
+
Chef::JSONCompat.to_json(to_h, *a)
|
158
160
|
end
|
159
161
|
|
160
162
|
def update_from!(o)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#
|
2
2
|
# Author:: Daniel DeLeo (<dan@chef.io>)
|
3
3
|
# Author:: Tim Hinderliter (<tim@chef.io>)
|
4
|
-
# Copyright:: Copyright 2010-
|
4
|
+
# Copyright:: Copyright 2010-2018, Chef Software Inc.
|
5
5
|
# License:: Apache License, Version 2.0
|
6
6
|
#
|
7
7
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -144,14 +144,16 @@ class Chef
|
|
144
144
|
end
|
145
145
|
|
146
146
|
def to_json(*a)
|
147
|
-
Chef::JSONCompat.to_json(
|
147
|
+
Chef::JSONCompat.to_json(to_h, *a)
|
148
148
|
end
|
149
149
|
|
150
|
-
def
|
150
|
+
def to_h
|
151
151
|
seen_items = { recipe: {}, role: {} }
|
152
152
|
{ id: @environment, run_list: convert_run_list_trace("top level", seen_items) }
|
153
153
|
end
|
154
154
|
|
155
|
+
alias_method :to_hash, :to_h
|
156
|
+
|
155
157
|
private
|
156
158
|
|
157
159
|
# these methods modifies internal state based on arguments, so hide it.
|
data/lib/chef/run_status.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#
|
2
2
|
# Author:: Daniel DeLeo (<dan@chef.io>)
|
3
|
-
# Copyright:: Copyright 2010-
|
3
|
+
# Copyright:: Copyright 2010-2018, Chef Software Inc.
|
4
4
|
# License:: Apache License, Version 2.0
|
5
5
|
#
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -102,7 +102,7 @@ class Chef::RunStatus
|
|
102
102
|
# * :updated_resources
|
103
103
|
# * :exception
|
104
104
|
# * :backtrace
|
105
|
-
def
|
105
|
+
def to_h
|
106
106
|
# use a flat hash here so we can't errors from intermediate values being nil
|
107
107
|
{ node: node,
|
108
108
|
success: success?,
|
@@ -116,6 +116,8 @@ class Chef::RunStatus
|
|
116
116
|
run_id: run_id }
|
117
117
|
end
|
118
118
|
|
119
|
+
alias_method :to_hash, :to_h
|
120
|
+
|
119
121
|
# Returns a string of the format "ExceptionClass: message" or +nil+ if no
|
120
122
|
# +exception+ is set.
|
121
123
|
def formatted_exception
|
data/lib/chef/user.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#
|
2
2
|
# Author:: Steven Danna (steve@chef.io)
|
3
|
-
# Copyright:: Copyright 2012-
|
3
|
+
# Copyright:: Copyright 2012-2018, Chef Software Inc.
|
4
4
|
# License:: Apache License, Version 2.0
|
5
5
|
#
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -77,7 +77,7 @@ class Chef
|
|
77
77
|
arg, kind_of: String)
|
78
78
|
end
|
79
79
|
|
80
|
-
def
|
80
|
+
def to_h
|
81
81
|
result = {
|
82
82
|
"name" => @name,
|
83
83
|
"public_key" => @public_key,
|
@@ -88,8 +88,10 @@ class Chef
|
|
88
88
|
result
|
89
89
|
end
|
90
90
|
|
91
|
+
alias_method :to_hash, :to_h
|
92
|
+
|
91
93
|
def to_json(*a)
|
92
|
-
Chef::JSONCompat.to_json(
|
94
|
+
Chef::JSONCompat.to_json(to_h, *a)
|
93
95
|
end
|
94
96
|
|
95
97
|
def destroy
|
@@ -100,7 +102,7 @@ class Chef
|
|
100
102
|
payload = { name: name, admin: admin, password: password }
|
101
103
|
payload[:public_key] = public_key if public_key
|
102
104
|
new_user = chef_rest_v0.post("users", payload)
|
103
|
-
Chef::User.from_hash(
|
105
|
+
Chef::User.from_hash(to_h.merge(new_user))
|
104
106
|
end
|
105
107
|
|
106
108
|
def update(new_key = false)
|
@@ -108,7 +110,7 @@ class Chef
|
|
108
110
|
payload[:private_key] = new_key if new_key
|
109
111
|
payload[:password] = password if password
|
110
112
|
updated_user = chef_rest_v0.put("users/#{name}", payload)
|
111
|
-
Chef::User.from_hash(
|
113
|
+
Chef::User.from_hash(to_h.merge(updated_user))
|
112
114
|
end
|
113
115
|
|
114
116
|
def save(new_key = false)
|
data/lib/chef/user_v1.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#
|
2
2
|
# Author:: Steven Danna (steve@chef.io)
|
3
|
-
# Copyright:: Copyright 2012-
|
3
|
+
# Copyright:: Copyright 2012-2018, Chef Software Inc.
|
4
4
|
# License:: Apache License, Version 2.0
|
5
5
|
#
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -112,7 +112,7 @@ class Chef
|
|
112
112
|
arg, kind_of: String)
|
113
113
|
end
|
114
114
|
|
115
|
-
def
|
115
|
+
def to_h
|
116
116
|
result = {
|
117
117
|
"username" => @username,
|
118
118
|
}
|
@@ -128,8 +128,10 @@ class Chef
|
|
128
128
|
result
|
129
129
|
end
|
130
130
|
|
131
|
+
alias_method :to_hash, :to_h
|
132
|
+
|
131
133
|
def to_json(*a)
|
132
|
-
Chef::JSONCompat.to_json(
|
134
|
+
Chef::JSONCompat.to_json(to_h, *a)
|
133
135
|
end
|
134
136
|
|
135
137
|
def destroy
|
@@ -180,7 +182,7 @@ class Chef
|
|
180
182
|
new_user = chef_root_rest_v0.post("users", payload)
|
181
183
|
end
|
182
184
|
|
183
|
-
Chef::UserV1.from_hash(
|
185
|
+
Chef::UserV1.from_hash(to_h.merge(new_user))
|
184
186
|
end
|
185
187
|
|
186
188
|
def update(new_key = false)
|
@@ -213,7 +215,7 @@ class Chef
|
|
213
215
|
end
|
214
216
|
updated_user = chef_root_rest_v0.put("users/#{username}", payload)
|
215
217
|
end
|
216
|
-
Chef::UserV1.from_hash(
|
218
|
+
Chef::UserV1.from_hash(to_h.merge(updated_user))
|
217
219
|
end
|
218
220
|
|
219
221
|
def save(new_key = false)
|
@@ -229,7 +231,7 @@ class Chef
|
|
229
231
|
# Note: remove after API v0 no longer supported by client (and knife command).
|
230
232
|
def reregister
|
231
233
|
begin
|
232
|
-
payload =
|
234
|
+
payload = to_h.merge({ "private_key" => true })
|
233
235
|
reregistered_self = chef_root_rest_v0.put("users/#{username}", payload)
|
234
236
|
private_key(reregistered_self["private_key"])
|
235
237
|
# only V0 supported for reregister
|
data/lib/chef/version.rb
CHANGED
@@ -246,6 +246,45 @@ class Chef
|
|
246
246
|
SID.from_account("#{::ENV['USERDOMAIN']}\\#{::ENV['USERNAME']}")
|
247
247
|
end
|
248
248
|
|
249
|
+
SERVICE_ACCOUNT_USERS = [self.LocalSystem,
|
250
|
+
self.NtLocal,
|
251
|
+
self.NtNetwork].flat_map do |user_type|
|
252
|
+
[user_type.account_simple_name.upcase,
|
253
|
+
user_type.account_name.upcase]
|
254
|
+
end.freeze
|
255
|
+
|
256
|
+
BUILT_IN_GROUPS = [self.BuiltinAdministrators,
|
257
|
+
self.BuiltinUsers, self.Guests].flat_map do |user_type|
|
258
|
+
[user_type.account_simple_name.upcase,
|
259
|
+
user_type.account_name.upcase]
|
260
|
+
end.freeze
|
261
|
+
|
262
|
+
SYSTEM_USER = SERVICE_ACCOUNT_USERS + BUILT_IN_GROUPS
|
263
|
+
|
264
|
+
# Сheck if the user belongs to service accounts category
|
265
|
+
#
|
266
|
+
# @return [Boolean] True or False
|
267
|
+
#
|
268
|
+
def self.service_account_user?(user)
|
269
|
+
SERVICE_ACCOUNT_USERS.include?(user.to_s.upcase)
|
270
|
+
end
|
271
|
+
|
272
|
+
# Сheck if the user is in builtin system group
|
273
|
+
#
|
274
|
+
# @return [Boolean] True or False
|
275
|
+
#
|
276
|
+
def self.group_user?(user)
|
277
|
+
BUILT_IN_GROUPS.include?(user.to_s.upcase)
|
278
|
+
end
|
279
|
+
|
280
|
+
# Сheck if the user belongs to system users category
|
281
|
+
#
|
282
|
+
# @return [Boolean] True or False
|
283
|
+
#
|
284
|
+
def self.system_user?(user)
|
285
|
+
SYSTEM_USER.include?(user.to_s.upcase)
|
286
|
+
end
|
287
|
+
|
249
288
|
# See https://technet.microsoft.com/en-us/library/cc961992.aspx
|
250
289
|
# In practice, this is SID.Administrators if the current_user is an admin (even if not
|
251
290
|
# running elevated), and is current_user otherwise.
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -32,8 +32,8 @@ describe Chef::HTTP::Simple do
|
|
32
32
|
|
33
33
|
before(:each) do
|
34
34
|
Chef::Config[:rest_timeout] = 2
|
35
|
-
Chef::Config[:http_retry_delay] =
|
36
|
-
Chef::Config[:http_retry_count] =
|
35
|
+
Chef::Config[:http_retry_delay] = 1
|
36
|
+
Chef::Config[:http_retry_count] = 2
|
37
37
|
end
|
38
38
|
|
39
39
|
after(:all) do
|
@@ -29,8 +29,8 @@ describe Chef::Resource::RemoteFile do
|
|
29
29
|
@old_file_cache = Chef::Config[:file_cache_path]
|
30
30
|
Chef::Config[:file_cache_path] = file_cache_path
|
31
31
|
Chef::Config[:rest_timeout] = 2
|
32
|
-
Chef::Config[:http_retry_delay] =
|
33
|
-
Chef::Config[:http_retry_count] =
|
32
|
+
Chef::Config[:http_retry_delay] = 1
|
33
|
+
Chef::Config[:http_retry_count] = 2
|
34
34
|
end
|
35
35
|
|
36
36
|
after(:each) do
|
@@ -36,7 +36,7 @@ describe Chef::Provider::User::Windows, :windows_only do
|
|
36
36
|
let(:logger) { double("Mixlib::Log::Child").as_null_object }
|
37
37
|
let(:run_context) { Chef::RunContext.new(node, {}, events) }
|
38
38
|
let(:new_resource) do
|
39
|
-
Chef::Resource::User.new(username, run_context).tap do |r|
|
39
|
+
Chef::Resource::User::WindowsUser.new(username, run_context).tap do |r|
|
40
40
|
r.provider(Chef::Provider::User::Windows)
|
41
41
|
r.password(password)
|
42
42
|
end
|
@@ -1571,7 +1571,7 @@ describe Chef::Resource::WindowsTask, :windows_only do
|
|
1571
1571
|
it "raises error" do
|
1572
1572
|
subject.user "Administrator"
|
1573
1573
|
subject.frequency :onstart
|
1574
|
-
expect { subject.after_created }.to raise_error(%q{Cannot specify a user other than the system users without specifying a password!. Valid passwordless users: 'NT AUTHORITY\SYSTEM', '
|
1574
|
+
expect { subject.after_created }.to raise_error(%q{Cannot specify a user other than the system users without specifying a password!. Valid passwordless users: 'SYSTEM', 'NT AUTHORITY\SYSTEM', 'LOCAL SERVICE', 'NT AUTHORITY\LOCAL SERVICE', 'NETWORK SERVICE', 'NT AUTHORITY\NETWORK SERVICE', 'ADMINISTRATORS', 'BUILTIN\ADMINISTRATORS', 'USERS', 'BUILTIN\USERS', 'GUESTS', 'BUILTIN\GUESTS'})
|
1575
1575
|
end
|
1576
1576
|
end
|
1577
1577
|
|
@@ -0,0 +1,233 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Dheeraj Dubey (<dheeraj.dubey@msystechnologies.com>)
|
3
|
+
# Copyright:: Copyright 2016-2018, 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 "functional/resource/base"
|
21
|
+
require "chef/mixin/shell_out"
|
22
|
+
|
23
|
+
describe Chef::Resource::ZypperPackage, :requires_root, :suse_only do
|
24
|
+
include Chef::Mixin::ShellOut
|
25
|
+
|
26
|
+
# NOTE: every single test here needs to explicitly call preinstall.
|
27
|
+
|
28
|
+
def preinstall(*rpms)
|
29
|
+
rpms.each do |rpm|
|
30
|
+
shell_out!("rpm -ivh #{CHEF_SPEC_ASSETS}/zypprepo/#{rpm}")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
before(:each) do
|
35
|
+
File.open("/etc/zypp/repos.d/chef-zypp-localtesting.repo", "w+") do |f|
|
36
|
+
f.write <<~EOF
|
37
|
+
[chef-zypp-localtesting]
|
38
|
+
name=Chef zypper spec testing repo
|
39
|
+
baseurl=file://#{CHEF_SPEC_ASSETS}/zypprepo
|
40
|
+
enable=1
|
41
|
+
gpgcheck=0
|
42
|
+
EOF
|
43
|
+
end
|
44
|
+
shell_out!("rpm -qa --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm | xargs -r rpm -e")
|
45
|
+
# next line is useful cleanup if you happen to have been testing zypper func tests on the same box and
|
46
|
+
# have some zypper garbage left around
|
47
|
+
# FileUtils.rm_f "/etc/zypp/repos.d/chef-zypp-localtesting.repo"
|
48
|
+
end
|
49
|
+
|
50
|
+
after(:all) do
|
51
|
+
shell_out!("rpm -qa --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm | xargs -r rpm -e")
|
52
|
+
FileUtils.rm_f "/etc/zypp/repos.d/chef-zypp-localtesting.repo"
|
53
|
+
end
|
54
|
+
|
55
|
+
let(:package_name) { "chef_rpm" }
|
56
|
+
let(:zypper_package) do
|
57
|
+
r = Chef::Resource::ZypperPackage.new(package_name, run_context)
|
58
|
+
r.global_options("--no-gpg-checks")
|
59
|
+
r
|
60
|
+
end
|
61
|
+
|
62
|
+
def pkg_arch
|
63
|
+
ohai[:kernel][:machine]
|
64
|
+
end
|
65
|
+
|
66
|
+
context "installing a package" do
|
67
|
+
after { remove_package }
|
68
|
+
it "installs the latest version" do
|
69
|
+
zypper_package.run_action(:install)
|
70
|
+
expect(zypper_package.updated_by_last_action?).to be true
|
71
|
+
expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^chef_rpm-1.10-1.#{pkg_arch}$")
|
72
|
+
end
|
73
|
+
|
74
|
+
it "does not install if the package is installed" do
|
75
|
+
preinstall("chef_rpm-1.10-1.#{pkg_arch}.rpm")
|
76
|
+
zypper_package.run_action(:install)
|
77
|
+
expect(zypper_package.updated_by_last_action?).to be false
|
78
|
+
expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^chef_rpm-1.10-1.#{pkg_arch}$")
|
79
|
+
end
|
80
|
+
|
81
|
+
it "does not install twice" do
|
82
|
+
zypper_package.run_action(:install)
|
83
|
+
expect(zypper_package.updated_by_last_action?).to be true
|
84
|
+
expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^chef_rpm-1.10-1.#{pkg_arch}$")
|
85
|
+
zypper_package.run_action(:install)
|
86
|
+
expect(zypper_package.updated_by_last_action?).to be false
|
87
|
+
expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^chef_rpm-1.10-1.#{pkg_arch}$")
|
88
|
+
end
|
89
|
+
|
90
|
+
it "does not install if the prior version package is installed" do
|
91
|
+
preinstall("chef_rpm-1.2-1.#{pkg_arch}.rpm")
|
92
|
+
zypper_package.run_action(:install)
|
93
|
+
expect(zypper_package.updated_by_last_action?).to be false
|
94
|
+
expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^chef_rpm-1.2-1.#{pkg_arch}$")
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context "with versions" do
|
99
|
+
it "works with a version" do
|
100
|
+
zypper_package.package_name("chef_rpm")
|
101
|
+
zypper_package.version("1.10")
|
102
|
+
zypper_package.run_action(:install)
|
103
|
+
expect(zypper_package.updated_by_last_action?).to be true
|
104
|
+
expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^chef_rpm-1.10-1.#{pkg_arch}$")
|
105
|
+
end
|
106
|
+
|
107
|
+
it "works with an older version" do
|
108
|
+
zypper_package.package_name("chef_rpm")
|
109
|
+
zypper_package.version("1.2")
|
110
|
+
zypper_package.run_action(:install)
|
111
|
+
expect(zypper_package.updated_by_last_action?).to be true
|
112
|
+
expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^chef_rpm-1.2-1.#{pkg_arch}$")
|
113
|
+
end
|
114
|
+
|
115
|
+
it "works with version and release" do
|
116
|
+
zypper_package.package_name("chef_rpm")
|
117
|
+
zypper_package.version("1.2-1")
|
118
|
+
zypper_package.run_action(:install)
|
119
|
+
expect(zypper_package.updated_by_last_action?).to be true
|
120
|
+
expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^chef_rpm-1.2-1.#{pkg_arch}$")
|
121
|
+
end
|
122
|
+
|
123
|
+
it "downgrades when the installed version is higher than the package_name version" do
|
124
|
+
preinstall("chef_rpm-1.10-1.#{pkg_arch}.rpm")
|
125
|
+
zypper_package.allow_downgrade true
|
126
|
+
zypper_package.package_name("chef_rpm")
|
127
|
+
zypper_package.version("1.2-1")
|
128
|
+
zypper_package.run_action(:install)
|
129
|
+
expect(zypper_package.updated_by_last_action?).to be true
|
130
|
+
expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^chef_rpm-1.2-1.#{pkg_arch}$")
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
describe ":remove" do
|
135
|
+
context "vanilla use case" do
|
136
|
+
let(:package_name) { "chef_rpm" }
|
137
|
+
it "does nothing if the package is not installed" do
|
138
|
+
zypper_package.run_action(:remove)
|
139
|
+
expect(zypper_package.updated_by_last_action?).to be false
|
140
|
+
expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^package chef_rpm is not installed$")
|
141
|
+
end
|
142
|
+
|
143
|
+
it "removes the package if the package is installed" do
|
144
|
+
preinstall("chef_rpm-1.10-1.#{pkg_arch}.rpm")
|
145
|
+
zypper_package.run_action(:remove)
|
146
|
+
expect(zypper_package.updated_by_last_action?).to be true
|
147
|
+
expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^package chef_rpm is not installed$")
|
148
|
+
end
|
149
|
+
|
150
|
+
it "does not remove the package twice" do
|
151
|
+
preinstall("chef_rpm-1.10-1.#{pkg_arch}.rpm")
|
152
|
+
zypper_package.run_action(:remove)
|
153
|
+
expect(zypper_package.updated_by_last_action?).to be true
|
154
|
+
expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^package chef_rpm is not installed$")
|
155
|
+
zypper_package.run_action(:remove)
|
156
|
+
expect(zypper_package.updated_by_last_action?).to be false
|
157
|
+
expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^package chef_rpm is not installed$")
|
158
|
+
end
|
159
|
+
|
160
|
+
it "removes the package if the prior version package is installed" do
|
161
|
+
preinstall("chef_rpm-1.2-1.#{pkg_arch}.rpm")
|
162
|
+
zypper_package.run_action(:remove)
|
163
|
+
expect(zypper_package.updated_by_last_action?).to be true
|
164
|
+
expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^package chef_rpm is not installed$")
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
context "with no available version" do
|
169
|
+
it "works when a package is installed" do
|
170
|
+
FileUtils.rm_f "/etc/zypp/repos.d/chef-zypp-localtesting.repo"
|
171
|
+
preinstall("chef_rpm-1.2-1.#{pkg_arch}.rpm")
|
172
|
+
zypper_package.run_action(:remove)
|
173
|
+
expect(zypper_package.updated_by_last_action?).to be true
|
174
|
+
expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^package chef_rpm is not installed$")
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
describe ":lock and :unlock" do
|
180
|
+
before(:each) do
|
181
|
+
shell_out("zypper removelock chef_rpm") # will exit with error when nothing is locked, we don't care
|
182
|
+
end
|
183
|
+
|
184
|
+
it "locks an rpm" do
|
185
|
+
zypper_package.package_name("chef_rpm")
|
186
|
+
zypper_package.run_action(:lock)
|
187
|
+
expect(zypper_package.updated_by_last_action?).to be true
|
188
|
+
expect(shell_out("zypper locks | grep chef_rpm").stdout.chomp).to match("chef_rpm")
|
189
|
+
end
|
190
|
+
|
191
|
+
it "does not lock if its already locked" do
|
192
|
+
shell_out!("zypper addlock chef_rpm")
|
193
|
+
zypper_package.package_name("chef_rpm")
|
194
|
+
zypper_package.run_action(:lock)
|
195
|
+
expect(zypper_package.updated_by_last_action?).to be false
|
196
|
+
expect(shell_out("zypper locks | grep chef_rpm").stdout.chomp).to match("chef_rpm")
|
197
|
+
end
|
198
|
+
|
199
|
+
it "unlocks an rpm" do
|
200
|
+
shell_out!("zypper addlock chef_rpm")
|
201
|
+
zypper_package.package_name("chef_rpm")
|
202
|
+
zypper_package.run_action(:unlock)
|
203
|
+
expect(zypper_package.updated_by_last_action?).to be true
|
204
|
+
expect(shell_out("zypper locks | grep chef_rpm").stdout.chomp).not_to match("chef_rpm")
|
205
|
+
end
|
206
|
+
|
207
|
+
it "does not unlock an already locked rpm" do
|
208
|
+
zypper_package.package_name("chef_rpm")
|
209
|
+
zypper_package.run_action(:unlock)
|
210
|
+
expect(zypper_package.updated_by_last_action?).to be false
|
211
|
+
expect(shell_out("zypper locks | grep chef_rpm").stdout.chomp).not_to match("chef_rpm")
|
212
|
+
end
|
213
|
+
|
214
|
+
it "check that we can lock based on provides" do
|
215
|
+
zypper_package.package_name("chef_rpm_provides")
|
216
|
+
zypper_package.run_action(:lock)
|
217
|
+
expect(zypper_package.updated_by_last_action?).to be true
|
218
|
+
expect(shell_out("zypper locks | grep chef_rpm_provides").stdout.chomp).to match("chef_rpm_provides")
|
219
|
+
end
|
220
|
+
|
221
|
+
it "check that we can unlock based on provides" do
|
222
|
+
shell_out!("zypper addlock chef_rpm_provides")
|
223
|
+
zypper_package.package_name("chef_rpm_provides")
|
224
|
+
zypper_package.run_action(:unlock)
|
225
|
+
expect(zypper_package.updated_by_last_action?).to be true
|
226
|
+
expect(shell_out("zypper locks | grep chef_rpm_provides").stdout.chomp).not_to match("chef_rpm_provides")
|
227
|
+
end
|
228
|
+
end
|
229
|
+
def remove_package
|
230
|
+
pkg_to_remove = Chef::Resource::ZypperPackage.new(package_name, run_context)
|
231
|
+
pkg_to_remove.run_action(:remove)
|
232
|
+
end
|
233
|
+
end
|