chef 13.6.4 → 13.7.16

Sign up to get free protection for your applications and to get access to all the features.
Files changed (257) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/acceptance/Gemfile +2 -2
  4. data/acceptance/top-cookbooks/.acceptance/acceptance-cookbook/libraries/top_cookbooks.rb +1 -6
  5. data/distro/powershell/chef/chef.psm1 +1 -5
  6. data/lib/chef/api_client.rb +5 -5
  7. data/lib/chef/api_client_v1.rb +6 -6
  8. data/lib/chef/application.rb +3 -2
  9. data/lib/chef/application/knife.rb +4 -0
  10. data/lib/chef/chef_class.rb +2 -2
  11. data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +1 -1
  12. data/lib/chef/chef_fs/data_handler/data_handler_base.rb +2 -4
  13. data/lib/chef/client.rb +3 -3
  14. data/lib/chef/cookbook/chefignore.rb +4 -0
  15. data/lib/chef/cookbook/cookbook_collection.rb +2 -2
  16. data/lib/chef/cookbook/metadata.rb +2 -2
  17. data/lib/chef/data_bag.rb +1 -1
  18. data/lib/chef/deprecated.rb +10 -0
  19. data/lib/chef/event_dispatch/base.rb +2 -2
  20. data/lib/chef/http.rb +10 -10
  21. data/lib/chef/knife.rb +16 -15
  22. data/lib/chef/knife/configure.rb +12 -36
  23. data/lib/chef/knife/cookbook_upload.rb +4 -4
  24. data/lib/chef/knife/core/bootstrap_context.rb +1 -1
  25. data/lib/chef/knife/core/status_presenter.rb +6 -2
  26. data/lib/chef/knife/core/ui.rb +1 -1
  27. data/lib/chef/knife/data_bag_secret_options.rb +1 -1
  28. data/lib/chef/knife/data_bag_show.rb +1 -1
  29. data/lib/chef/knife/edit.rb +1 -1
  30. data/lib/chef/knife/ssh.rb +47 -35
  31. data/lib/chef/knife/user_create.rb +2 -0
  32. data/lib/chef/knife/user_delete.rb +2 -0
  33. data/lib/chef/knife/user_edit.rb +2 -0
  34. data/lib/chef/knife/user_reregister.rb +2 -0
  35. data/lib/chef/knife/user_show.rb +2 -0
  36. data/lib/chef/mixin/powershell_out.rb +1 -1
  37. data/lib/chef/node/attribute.rb +46 -70
  38. data/lib/chef/node/attribute_collections.rb +5 -5
  39. data/lib/chef/node/common_api.rb +1 -1
  40. data/lib/chef/node/immutable_collections.rb +180 -23
  41. data/lib/chef/node/mixin/state_tracking.rb +6 -6
  42. data/lib/chef/node_map.rb +63 -45
  43. data/lib/chef/property.rb +8 -8
  44. data/lib/chef/provider.rb +9 -3
  45. data/lib/chef/provider/apt_preference.rb +1 -1
  46. data/lib/chef/provider/apt_repository.rb +1 -1
  47. data/lib/chef/provider/apt_update.rb +1 -1
  48. data/lib/chef/provider/file.rb +1 -1
  49. data/lib/chef/provider/group/dscl.rb +6 -2
  50. data/lib/chef/provider/ifconfig.rb +96 -34
  51. data/lib/chef/provider/launchd.rb +0 -1
  52. data/lib/chef/provider/log.rb +3 -13
  53. data/lib/chef/provider/package/dnf.rb +1 -1
  54. data/lib/chef/provider/package/smartos.rb +2 -2
  55. data/lib/chef/provider/reboot.rb +12 -0
  56. data/lib/chef/provider/remote_directory.rb +1 -1
  57. data/lib/chef/provider/remote_file/http.rb +3 -2
  58. data/lib/chef/provider/service/solaris.rb +6 -2
  59. data/lib/chef/provider/systemd_unit.rb +34 -33
  60. data/lib/chef/provider/user/dscl.rb +1 -1
  61. data/lib/chef/provider/windows_path.rb +6 -7
  62. data/lib/chef/provider/windows_task.rb +89 -33
  63. data/lib/chef/provider/yum_repository.rb +24 -9
  64. data/lib/chef/resource/apt_package.rb +1 -0
  65. data/lib/chef/resource/apt_preference.rb +4 -0
  66. data/lib/chef/resource/apt_repository.rb +4 -0
  67. data/lib/chef/resource/apt_update.rb +3 -0
  68. data/lib/chef/resource/bash.rb +4 -0
  69. data/lib/chef/resource/batch.rb +5 -0
  70. data/lib/chef/resource/bff_package.rb +4 -0
  71. data/lib/chef/resource/breakpoint.rb +6 -0
  72. data/lib/chef/resource/cab_package.rb +6 -6
  73. data/lib/chef/resource/chef_gem.rb +13 -0
  74. data/lib/chef/resource/chocolatey_package.rb +4 -6
  75. data/lib/chef/resource/cookbook_file.rb +13 -15
  76. data/lib/chef/resource/cron.rb +2 -0
  77. data/lib/chef/resource/csh.rb +4 -0
  78. data/lib/chef/resource/directory.rb +8 -26
  79. data/lib/chef/resource/dnf_package.rb +5 -0
  80. data/lib/chef/resource/dpkg_package.rb +2 -0
  81. data/lib/chef/resource/dsc_resource.rb +5 -0
  82. data/lib/chef/resource/dsc_script.rb +6 -0
  83. data/lib/chef/resource/env.rb +3 -0
  84. data/lib/chef/resource/erl_call.rb +5 -0
  85. data/lib/chef/resource/execute.rb +5 -1
  86. data/lib/chef/resource/file.rb +2 -1
  87. data/lib/chef/resource/file/verification.rb +10 -0
  88. data/lib/chef/resource/freebsd_package.rb +10 -2
  89. data/lib/chef/resource/gem_package.rb +2 -0
  90. data/lib/chef/resource/git.rb +2 -0
  91. data/lib/chef/resource/group.rb +1 -0
  92. data/lib/chef/resource/homebrew_package.rb +3 -0
  93. data/lib/chef/resource/http_request.rb +2 -0
  94. data/lib/chef/resource/ifconfig.rb +23 -150
  95. data/lib/chef/resource/ips_package.rb +1 -0
  96. data/lib/chef/resource/ksh.rb +6 -0
  97. data/lib/chef/resource/launchd.rb +5 -4
  98. data/lib/chef/resource/link.rb +10 -0
  99. data/lib/chef/resource/log.rb +19 -46
  100. data/lib/chef/resource/macports_package.rb +1 -0
  101. data/lib/chef/resource/mdadm.rb +4 -0
  102. data/lib/chef/resource/mount.rb +1 -0
  103. data/lib/chef/resource/msu_package.rb +7 -8
  104. data/lib/chef/resource/ohai.rb +2 -0
  105. data/lib/chef/resource/openbsd_package.rb +3 -0
  106. data/lib/chef/resource/osx_profile.rb +10 -40
  107. data/lib/chef/resource/package.rb +6 -0
  108. data/lib/chef/resource/pacman_package.rb +1 -0
  109. data/lib/chef/resource/paludis_package.rb +3 -0
  110. data/lib/chef/resource/perl.rb +4 -0
  111. data/lib/chef/resource/portage_package.rb +1 -0
  112. data/lib/chef/resource/powershell_package.rb +5 -0
  113. data/lib/chef/resource/powershell_script.rb +8 -0
  114. data/lib/chef/resource/python.rb +4 -0
  115. data/lib/chef/resource/reboot.rb +14 -20
  116. data/lib/chef/resource/registry_key.rb +1 -0
  117. data/lib/chef/resource/remote_directory.rb +3 -0
  118. data/lib/chef/resource/remote_file.rb +2 -0
  119. data/lib/chef/resource/resource_notification.rb +17 -0
  120. data/lib/chef/resource/route.rb +1 -0
  121. data/lib/chef/resource/rpm_package.rb +1 -0
  122. data/lib/chef/resource/ruby.rb +4 -0
  123. data/lib/chef/resource/ruby_block.rb +3 -0
  124. data/lib/chef/resource/script.rb +4 -0
  125. data/lib/chef/resource/service.rb +1 -0
  126. data/lib/chef/resource/smartos_package.rb +1 -0
  127. data/lib/chef/resource/solaris_package.rb +1 -0
  128. data/lib/chef/resource/subversion.rb +1 -0
  129. data/lib/chef/resource/systemd_unit.rb +6 -0
  130. data/lib/chef/resource/template.rb +9 -0
  131. data/lib/chef/resource/user.rb +1 -0
  132. data/lib/chef/resource/windows_package.rb +2 -0
  133. data/lib/chef/resource/windows_path.rb +5 -10
  134. data/lib/chef/resource/windows_service.rb +3 -0
  135. data/lib/chef/resource/windows_task.rb +66 -87
  136. data/lib/chef/resource/yum_repository.rb +26 -22
  137. data/lib/chef/resource/zypper_package.rb +2 -0
  138. data/lib/chef/resource/zypper_repository.rb +6 -1
  139. data/lib/chef/run_context.rb +8 -2
  140. data/lib/chef/server_api.rb +1 -0
  141. data/lib/chef/util/selinux.rb +5 -4
  142. data/lib/chef/version.rb +1 -1
  143. data/lib/chef/version/platform.rb +18 -0
  144. data/lib/chef/version_constraint/platform.rb +2 -0
  145. data/spec/data/client.d_00/02-strings.rb +2 -0
  146. data/spec/functional/assets/chefinittest +6 -4
  147. data/spec/functional/knife/ssh_spec.rb +54 -7
  148. data/spec/functional/resource/bff_spec.rb +3 -3
  149. data/spec/functional/resource/ifconfig_spec.rb +1 -1
  150. data/spec/functional/resource/mount_spec.rb +7 -3
  151. data/spec/functional/resource/user/useradd_spec.rb +4 -4
  152. data/spec/functional/resource/windows_task_spec.rb +6 -6
  153. data/spec/functional/win32/security_spec.rb +7 -33
  154. data/spec/integration/knife/data_bag_show_spec.rb +1 -1
  155. data/spec/integration/recipes/noop_resource_spec.rb +1 -1
  156. data/spec/integration/recipes/recipe_dsl_spec.rb +30 -30
  157. data/spec/integration/recipes/resource_action_spec.rb +2 -2
  158. data/spec/integration/recipes/resource_converge_if_changed_spec.rb +71 -15
  159. data/spec/spec_helper.rb +19 -0
  160. data/spec/support/shared/functional/execute_resource.rb +1 -1
  161. data/spec/support/shared/unit/application_dot_d.rb +2 -0
  162. data/spec/support/shared/unit/execute_resource.rb +8 -1
  163. data/spec/support/shared/unit/provider/file.rb +9 -1
  164. data/spec/unit/chef_fs/data_handler/data_bag_item_data_handler.rb +10 -7
  165. data/spec/unit/chef_fs/file_system/repository/directory_spec.rb +2 -2
  166. data/spec/unit/client_spec.rb +1 -1
  167. data/spec/unit/deprecated_spec.rb +4 -4
  168. data/spec/unit/http_spec.rb +9 -0
  169. data/spec/unit/knife/bootstrap_spec.rb +5 -0
  170. data/spec/unit/knife/configure_spec.rb +10 -60
  171. data/spec/unit/knife/data_bag_create_spec.rb +40 -2
  172. data/spec/unit/knife/data_bag_show_spec.rb +16 -2
  173. data/spec/unit/knife/ssh_spec.rb +85 -39
  174. data/spec/unit/knife_spec.rb +2 -0
  175. data/spec/unit/lwrp_spec.rb +5 -3
  176. data/spec/unit/mixin/powershell_type_coercions_spec.rb +7 -6
  177. data/spec/unit/node/attribute_spec.rb +55 -24
  178. data/spec/unit/node/immutable_collections_spec.rb +28 -14
  179. data/spec/unit/node/vivid_mash_spec.rb +27 -10
  180. data/spec/unit/node_map_spec.rb +34 -0
  181. data/spec/unit/property_spec.rb +13 -13
  182. data/spec/unit/provider/group/dscl_spec.rb +14 -5
  183. data/spec/unit/provider/ifconfig_spec.rb +10 -3
  184. data/spec/unit/provider/remote_file/http_spec.rb +23 -19
  185. data/spec/unit/provider/service/solaris_smf_service_spec.rb +6 -5
  186. data/spec/unit/provider/user/dscl_spec.rb +26 -0
  187. data/spec/unit/provider/windows_task_spec.rb +148 -4
  188. data/spec/unit/provider_spec.rb +1 -1
  189. data/spec/unit/resource/apt_package_spec.rb +1 -1
  190. data/spec/unit/resource/bash_spec.rb +8 -10
  191. data/spec/unit/resource/batch_spec.rb +1 -1
  192. data/spec/unit/resource/cab_package_spec.rb +19 -1
  193. data/spec/unit/resource/chef_gem_spec.rb +3 -3
  194. data/spec/unit/resource/chocolatey_package_spec.rb +10 -10
  195. data/spec/unit/resource/conditional_spec.rb +2 -2
  196. data/spec/unit/resource/cookbook_file_spec.rb +24 -30
  197. data/spec/unit/resource/cron_spec.rb +79 -82
  198. data/spec/unit/resource/csh_spec.rb +8 -10
  199. data/spec/unit/resource/deploy_spec.rb +1 -1
  200. data/spec/unit/resource/directory_spec.rb +28 -31
  201. data/spec/unit/resource/dnf_package_spec.rb +9 -9
  202. data/spec/unit/resource/env_spec.rb +7 -7
  203. data/spec/unit/resource/erl_call_spec.rb +9 -9
  204. data/spec/unit/resource/execute_spec.rb +6 -6
  205. data/spec/unit/resource/file/verification_spec.rb +18 -4
  206. data/spec/unit/resource/file_spec.rb +53 -56
  207. data/spec/unit/resource/freebsd_package_spec.rb +7 -7
  208. data/spec/unit/resource/gem_package_spec.rb +1 -1
  209. data/spec/unit/resource/git_spec.rb +7 -9
  210. data/spec/unit/resource/group_spec.rb +60 -70
  211. data/spec/unit/resource/http_request_spec.rb +16 -19
  212. data/spec/unit/resource/ifconfig_spec.rb +3 -3
  213. data/spec/unit/resource/ips_package_spec.rb +3 -5
  214. data/spec/unit/resource/ksh_spec.rb +8 -10
  215. data/spec/unit/resource/launchd_spec.rb +17 -10
  216. data/spec/unit/resource/link_spec.rb +53 -53
  217. data/spec/unit/resource/log_spec.rb +24 -28
  218. data/spec/unit/resource/mdadm_spec.rb +42 -44
  219. data/spec/unit/resource/mount_spec.rb +97 -99
  220. data/spec/unit/resource/msu_package_spec.rb +14 -8
  221. data/spec/unit/resource/ohai_spec.rb +15 -17
  222. data/spec/unit/resource/openbsd_package_spec.rb +3 -3
  223. data/spec/unit/resource/osx_profile_spec.rb +7 -7
  224. data/spec/unit/resource/package_spec.rb +36 -40
  225. data/spec/unit/resource/perl_spec.rb +8 -11
  226. data/spec/unit/resource/portage_package_spec.rb +8 -10
  227. data/spec/unit/resource/powershell_package_spec.rb +9 -9
  228. data/spec/unit/resource/python_spec.rb +8 -11
  229. data/spec/unit/resource/reboot_spec.rb +50 -0
  230. data/spec/unit/resource/registry_key_spec.rb +84 -98
  231. data/spec/unit/resource/remote_directory_spec.rb +40 -42
  232. data/spec/unit/resource/remote_file_spec.rb +78 -80
  233. data/spec/unit/resource/route_spec.rb +42 -44
  234. data/spec/unit/resource/rpm_package_spec.rb +5 -7
  235. data/spec/unit/resource/ruby_block_spec.rb +14 -16
  236. data/spec/unit/resource/ruby_spec.rb +8 -12
  237. data/spec/unit/resource/scm_spec.rb +66 -69
  238. data/spec/unit/resource/script_spec.rb +1 -1
  239. data/spec/unit/resource/service_spec.rb +80 -83
  240. data/spec/unit/resource/smartos_package_spec.rb +5 -0
  241. data/spec/unit/resource/solaris_package_spec.rb +3 -5
  242. data/spec/unit/resource/subversion_spec.rb +18 -16
  243. data/spec/unit/resource/systemd_unit_spec.rb +50 -54
  244. data/spec/unit/resource/template_spec.rb +56 -61
  245. data/spec/unit/resource/user_spec.rb +47 -53
  246. data/spec/unit/resource/windows_package_spec.rb +1 -1
  247. data/spec/unit/resource/windows_path_spec.rb +11 -8
  248. data/spec/unit/resource/windows_task_spec.rb +129 -33
  249. data/spec/unit/resource/yum_package_spec.rb +1 -1
  250. data/spec/unit/resource/yum_repository_spec.rb +61 -8
  251. data/spec/unit/resource/zypper_repository_spec.rb +17 -18
  252. data/spec/unit/util/selinux_spec.rb +3 -6
  253. data/tasks/dependencies.rb +0 -5
  254. data/tasks/rspec.rb +1 -1
  255. metadata +6 -6
  256. data/acceptance/top-cookbooks/.kitchen.docker.yml +0 -13
  257. data/acceptance/top-cookbooks/.kitchen.git.yml +0 -11
@@ -46,8 +46,8 @@ describe Chef::Knife::DataBagCreate do
46
46
  allow(knife).to receive(:config).and_return(config)
47
47
  end
48
48
 
49
- context "when data_bag already exist" do
50
- it "doesn't creates a data bag" do
49
+ context "when data_bag already exists" do
50
+ it "doesn't create a data bag" do
51
51
  expect(knife).to receive(:create_object).and_yield(raw_hash)
52
52
  expect(rest).to receive(:get).with("data/#{bag_name}")
53
53
  expect(rest).to_not receive(:post).with("data", { "name" => bag_name })
@@ -80,6 +80,27 @@ describe Chef::Knife::DataBagCreate do
80
80
  end
81
81
  end
82
82
 
83
+ context "when part of the name is a reserved name" do
84
+ before do
85
+ exception = double("404 error", :code => "404")
86
+ %w{node role client environment}.each do |name|
87
+ allow(rest).to receive(:get)
88
+ .with("data/sudoing_#{name}_admins")
89
+ .and_raise(Net::HTTPServerException.new("404", exception))
90
+ end
91
+ end
92
+
93
+ it "will create a data bag containing a reserved word" do
94
+ %w{node role client environment}.each do |name|
95
+ knife.name_args = ["sudoing_#{name}_admins"]
96
+ expect(rest).to receive(:post).with("data", { "name" => knife.name_args[0] })
97
+ expect(knife.ui).to receive(:info).with("Created data_bag[#{knife.name_args[0]}]")
98
+
99
+ knife.run
100
+ end
101
+ end
102
+ end
103
+
83
104
  context "when given one argument" do
84
105
  before do
85
106
  knife.name_args = [bag_name]
@@ -93,6 +114,23 @@ describe Chef::Knife::DataBagCreate do
93
114
  end
94
115
  end
95
116
 
117
+ context "when given a data bag name partially matching a reserved name for search" do
118
+ %w{xnode rolex xenvironmentx xclientx}.each do |name|
119
+ let(:bag_name) { name }
120
+
121
+ before do
122
+ knife.name_args = [bag_name]
123
+ end
124
+
125
+ it "creates a data bag named '#{name}'" do
126
+ expect(rest).to receive(:post).with("data", { "name" => bag_name })
127
+ expect(knife.ui).to receive(:info).with("Created data_bag[#{bag_name}]")
128
+
129
+ knife.run
130
+ end
131
+ end
132
+ end
133
+
96
134
  context "no secret is specified for encryption" do
97
135
  let(:item) do
98
136
  item = Chef::DataBagItem.from_hash(raw_hash)
@@ -91,12 +91,11 @@ qux: http://localhost:4000/data/bag_o_data/qux}
91
91
  context "Data bag to show is not encrypted" do
92
92
  before do
93
93
  allow(knife).to receive(:encrypted?).and_return(false)
94
- expect(knife).to receive(:read_secret).exactly(0).times
95
94
  end
96
95
 
97
96
  it "displays the data bag" do
97
+ expect(knife).to receive(:read_secret).exactly(0).times
98
98
  expect(Chef::DataBagItem).to receive(:load).with(bag_name, item_name).and_return(data_bag)
99
- expect(knife.ui).to receive(:warn).with("Unencrypted data bag detected, ignoring any provided secret options.")
100
99
 
101
100
  expected = %q{baz: http://localhost:4000/data/bag_o_data/baz
102
101
  id: id
@@ -104,6 +103,21 @@ qux: http://localhost:4000/data/bag_o_data/qux}
104
103
  knife.run
105
104
  expect(stdout.string.strip).to eq(expected)
106
105
  end
106
+
107
+ context "when a secret is given" do
108
+ it "displays the data bag" do
109
+ expect(knife).to receive(:encryption_secret_provided_ignore_encrypt_flag?).and_return(true)
110
+ expect(knife).to receive(:read_secret).and_return(secret)
111
+ expect(Chef::DataBagItem).to receive(:load).with(bag_name, item_name).and_return(data_bag)
112
+ expect(knife.ui).to receive(:warn).with("Unencrypted data bag detected, ignoring any provided secret options.")
113
+
114
+ expected = %q{baz: http://localhost:4000/data/bag_o_data/baz
115
+ id: id
116
+ qux: http://localhost:4000/data/bag_o_data/qux}
117
+ knife.run
118
+ expect(stdout.string.strip).to eq(expected)
119
+ end
120
+ end
107
121
  end
108
122
 
109
123
  it "displays the list of items in the data bag when only one @name_arg is provided" do
@@ -49,28 +49,36 @@ describe Chef::Knife::Ssh do
49
49
 
50
50
  def self.should_return_specified_attributes
51
51
  it "returns an array of the attributes specified on the command line OR config file, if only one is set" do
52
- @node_bar["config"] = "10.0.0.2"
53
- @node_foo["config"] = "10.0.0.1"
54
- @knife.config[:attribute] = "ipaddress"
52
+ @node_bar["target"] = "10.0.0.2"
53
+ @node_foo["target"] = "10.0.0.1"
54
+ @node_bar["prefix"] = "bar"
55
+ @node_foo["prefix"] = "foo"
56
+ @knife.config[:ssh_attribute] = "ipaddress"
57
+ @knife.config[:prefix_attribute] = "name"
55
58
  Chef::Config[:knife][:ssh_attribute] = "ipaddress" # this value will be in the config file
56
- expect(@knife).to receive(:session_from_list).with([["10.0.0.1", nil], ["10.0.0.2", nil]])
59
+ Chef::Config[:knife][:prefix_attribute] = "name" # this value will be in the config file
60
+ expect(@knife).to receive(:session_from_list).with([["10.0.0.1", nil, "foo"], ["10.0.0.2", nil, "bar"]])
57
61
  @knife.configure_session
58
62
  end
59
63
 
60
64
  it "returns an array of the attributes specified on the command line even when a config value is set" do
61
- @node_bar["config"] = "10.0.0.2"
62
- @node_foo["config"] = "10.0.0.1"
65
+ @node_bar["target"] = "10.0.0.2"
66
+ @node_foo["target"] = "10.0.0.1"
67
+ @node_bar["prefix"] = "bar"
68
+ @node_foo["prefix"] = "foo"
63
69
  Chef::Config[:knife][:ssh_attribute] = "config_file" # this value will be in the config file
64
- @knife.config[:attribute] = "ipaddress" # this is the value of the command line via #configure_attribute
65
- expect(@knife).to receive(:session_from_list).with([["10.0.0.1", nil], ["10.0.0.2", nil]])
70
+ Chef::Config[:knife][:prefix_attribute] = "config_file" # this value will be in the config file
71
+ @knife.config[:ssh_attribute] = "ipaddress" # this is the value of the command line via #configure_attribute
72
+ @knife.config[:prefix_attribute] = "name" # this is the value of the command line via #configure_attribute
73
+ expect(@knife).to receive(:session_from_list).with([["10.0.0.1", nil, "foo"], ["10.0.0.2", nil, "bar"]])
66
74
  @knife.configure_session
67
75
  end
68
76
  end
69
77
 
70
- it "searchs for and returns an array of fqdns" do
78
+ it "searches for and returns an array of fqdns" do
71
79
  expect(@knife).to receive(:session_from_list).with([
72
- ["foo.example.org", nil],
73
- ["bar.example.org", nil],
80
+ ["foo.example.org", nil, nil],
81
+ ["bar.example.org", nil, nil],
74
82
  ])
75
83
  @knife.configure_session
76
84
  end
@@ -84,8 +92,8 @@ describe Chef::Knife::Ssh do
84
92
  end
85
93
  it "returns an array of cloud public hostnames" do
86
94
  expect(@knife).to receive(:session_from_list).with([
87
- ["ec2-10-0-0-1.compute-1.amazonaws.com", nil],
88
- ["ec2-10-0-0-2.compute-1.amazonaws.com", nil],
95
+ ["ec2-10-0-0-1.compute-1.amazonaws.com", nil, nil],
96
+ ["ec2-10-0-0-2.compute-1.amazonaws.com", nil, nil],
89
97
  ])
90
98
  @knife.configure_session
91
99
  end
@@ -101,8 +109,8 @@ describe Chef::Knife::Ssh do
101
109
 
102
110
  it "returns an array of fqdns" do
103
111
  expect(@knife).to receive(:session_from_list).with([
104
- ["foo.example.org", nil],
105
- ["bar.example.org", nil],
112
+ ["foo.example.org", nil, nil],
113
+ ["bar.example.org", nil, nil],
106
114
  ])
107
115
  @knife.configure_session
108
116
  end
@@ -144,15 +152,35 @@ describe Chef::Knife::Ssh do
144
152
  end
145
153
  end
146
154
 
155
+ describe "#get_prefix_attribute" do
156
+ # Order of precedence for prefix
157
+ # 1) config value (cli or knife config)
158
+ # 2) nil
159
+ before do
160
+ Chef::Config[:knife][:prefix_attribute] = nil
161
+ @knife.config[:prefix_attribute] = nil
162
+ @node_foo["cloud"]["public_hostname"] = "ec2-10-0-0-1.compute-1.amazonaws.com"
163
+ @node_bar["cloud"]["public_hostname"] = ""
164
+ end
165
+
166
+ it "should return nil by default" do
167
+ expect(@knife.get_prefix_attribute({})).to eq(nil)
168
+ end
169
+
170
+ it "should favor config over nil" do
171
+ @node_foo["prefix"] = "config"
172
+ expect( @knife.get_prefix_attribute(@node_foo)).to eq("config")
173
+ end
174
+ end
175
+
147
176
  describe "#get_ssh_attribute" do
148
177
  # Order of precedence for ssh target
149
- # 1) command line attribute
150
- # 2) configuration file
151
- # 3) cloud attribute
152
- # 4) fqdn
178
+ # 1) config value (cli or knife config)
179
+ # 2) cloud attribute
180
+ # 3) fqdn
153
181
  before do
154
182
  Chef::Config[:knife][:ssh_attribute] = nil
155
- @knife.config[:attribute] = nil
183
+ @knife.config[:ssh_attribute] = nil
156
184
  @node_foo["cloud"]["public_hostname"] = "ec2-10-0-0-1.compute-1.amazonaws.com"
157
185
  @node_bar["cloud"]["public_hostname"] = ""
158
186
  end
@@ -165,18 +193,9 @@ describe Chef::Knife::Ssh do
165
193
  expect(@knife.get_ssh_attribute(@node_foo)).to eq("ec2-10-0-0-1.compute-1.amazonaws.com")
166
194
  end
167
195
 
168
- it "should favor to attribute_from_cli over config file and cloud" do
169
- @knife.config[:attribute] = "command_line"
170
- Chef::Config[:knife][:ssh_attribute] = "config_file"
171
- @node_foo["config"] = "command_line"
172
- @node_foo["knife_config"] = "config_file"
173
- expect( @knife.get_ssh_attribute(@node_foo)).to eq("command_line")
174
- end
175
-
176
- it "should favor config file over cloud and default" do
177
- Chef::Config[:knife][:ssh_attribute] = "config_file"
178
- @node_foo["knife_config"] = "config_file"
179
- expect( @knife.get_ssh_attribute(@node_foo)).to eq("config_file")
196
+ it "should favor config over cloud and default" do
197
+ @node_foo["target"] = "config"
198
+ expect( @knife.get_ssh_attribute(@node_foo)).to eq("config")
180
199
  end
181
200
 
182
201
  it "should return fqdn if cloud.hostname is empty" do
@@ -192,40 +211,50 @@ describe Chef::Knife::Ssh do
192
211
  end
193
212
 
194
213
  it "uses the port from an ssh config file" do
195
- @knife.session_from_list([["the.b.org", nil]])
214
+ @knife.session_from_list([["the.b.org", nil, nil]])
196
215
  expect(@knife.session.servers[0].port).to eq(23)
197
216
  end
198
217
 
199
218
  it "uses the port from a cloud attr" do
200
- @knife.session_from_list([["the.b.org", 123]])
219
+ @knife.session_from_list([["the.b.org", 123, nil]])
201
220
  expect(@knife.session.servers[0].port).to eq(123)
202
221
  end
203
222
 
223
+ it "uses the prefix from list" do
224
+ @knife.session_from_list([["the.b.org", nil, "b-team"]])
225
+ expect(@knife.session.servers[0][:prefix]).to eq("b-team")
226
+ end
227
+
228
+ it "defaults to a prefix of host" do
229
+ @knife.session_from_list([["the.b.org", nil, nil]])
230
+ expect(@knife.session.servers[0][:prefix]).to eq("the.b.org")
231
+ end
232
+
204
233
  it "defaults to a timeout of 120 seconds" do
205
- @knife.session_from_list([["the.b.org", nil]])
234
+ @knife.session_from_list([["the.b.org", nil, nil]])
206
235
  expect(@knife.session.servers[0].options[:timeout]).to eq(120)
207
236
  end
208
237
 
209
238
  it "uses the timeout from Chef Config" do
210
239
  Chef::Config[:knife][:ssh_timeout] = 5
211
240
  @knife.config[:ssh_timeout] = nil
212
- @knife.session_from_list([["the.b.org", nil]])
241
+ @knife.session_from_list([["the.b.org", nil, nil]])
213
242
  expect(@knife.session.servers[0].options[:timeout]).to eq(5)
214
243
  end
215
244
 
216
245
  it "uses the timeout from knife config" do
217
246
  @knife.config[:ssh_timeout] = 6
218
- @knife.session_from_list([["the.b.org", nil]])
247
+ @knife.session_from_list([["the.b.org", nil, nil]])
219
248
  expect(@knife.session.servers[0].options[:timeout]).to eq(6)
220
249
  end
221
250
 
222
251
  it "uses the user from an ssh config file" do
223
- @knife.session_from_list([["the.b.org", 123]])
252
+ @knife.session_from_list([["the.b.org", 123, nil]])
224
253
  expect(@knife.session.servers[0].user).to eq("locutus")
225
254
  end
226
255
 
227
256
  it "uses keepalive settings from an ssh config file" do
228
- @knife.session_from_list([["the.b.org", 123]])
257
+ @knife.session_from_list([["the.b.org", 123, nil]])
229
258
  expect(@knife.session.servers[0].options[:keepalive]).to be true
230
259
  expect(@knife.session.servers[0].options[:keepalive_interval]).to eq 60
231
260
  end
@@ -295,6 +324,23 @@ describe Chef::Knife::Ssh do
295
324
  end
296
325
  end
297
326
 
327
+ describe "#tmux" do
328
+ before do
329
+ ssh_config = { :timeout => 50, :user => "locutus", :port => 23, :keepalive => true, :keepalive_interval => 60 }
330
+ allow(Net::SSH).to receive(:configuration_for).with("foo.example.org", true).and_return(ssh_config)
331
+ @query = Chef::Search::Query.new
332
+ expect(@query).to receive(:search).and_yield(@node_foo)
333
+ allow(Chef::Search::Query).to receive(:new).and_return(@query)
334
+ allow(@knife).to receive(:exec).and_return(0)
335
+ end
336
+
337
+ it "filters out invalid characters from tmux session name" do
338
+ @knife.name_args = ["name:foo.example.org", "tmux"]
339
+ expect(@knife).to receive(:shell_out!).with("tmux new-session -d -s 'knife ssh name=foo-example-org' -n 'foo.example.org' 'ssh locutus@foo.example.org' ")
340
+ @knife.run
341
+ end
342
+ end
343
+
298
344
  describe "#run" do
299
345
  before do
300
346
  @query = Chef::Search::Query.new
@@ -47,6 +47,7 @@ describe Chef::Knife do
47
47
 
48
48
  allow(Chef::WorkstationConfigLoader).to receive(:new).and_return(config_loader)
49
49
  allow(config_loader).to receive(:explicit_config_file=)
50
+ allow(config_loader).to receive(:profile=)
50
51
 
51
52
  # Prevent gratuitous code reloading:
52
53
  allow(Chef::Knife).to receive(:load_commands)
@@ -331,6 +332,7 @@ describe Chef::Knife do
331
332
  knife.config[:config_file] = fake_config
332
333
  config_loader = double("Chef::WorkstationConfigLoader", :load => true, :no_config_found? => false, :chef_config_dir => "/etc/chef", :config_location => fake_config)
333
334
  allow(config_loader).to receive(:explicit_config_file=).with(fake_config).and_return(fake_config)
335
+ allow(config_loader).to receive(:profile=)
334
336
  allow(Chef::WorkstationConfigLoader).to receive(:new).and_return(config_loader)
335
337
  end
336
338
 
@@ -571,14 +571,16 @@ describe "LWRP" do
571
571
 
572
572
  context "resource class created" do
573
573
  let(:test_lwrp_class) { @test_lwrp_class }
574
- before(:context) do
575
- @tmpdir = Dir.mktmpdir("lwrp_test")
574
+ before(:each) do
575
+ @tmpparent = Dir.mktmpdir("lwrp_test")
576
+ @tmpdir = File.join(@tmpparent, "lwrp")
577
+ Dir.mkdir(@tmpdir)
576
578
  resource_path = File.join(@tmpdir, "once.rb")
577
579
  IO.write(resource_path, "default_action :create")
578
580
  @test_lwrp_class = Chef::Resource::LWRPBase.build_from_file("lwrp", resource_path, nil)
579
581
  end
580
582
 
581
- after(:context) do
583
+ after(:each) do
582
584
  FileUtils.remove_entry @tmpdir
583
585
  end
584
586
 
@@ -1,6 +1,6 @@
1
1
  #
2
2
  # Author:: Jay Mundrawala (<jdm@chef.io>)
3
- # Copyright:: Copyright 2015-2016, Chef Software, Inc.
3
+ # Copyright:: Copyright 2015-2017, 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");
@@ -64,14 +64,15 @@ describe Chef::Mixin::PowershellTypeCoercions do
64
64
  end
65
65
 
66
66
  it "translates a Chef::Node::ImmutableMash like a hash" do
67
- test_mash = Chef::Node::ImmutableMash.new({ "a" => 1, "b" => 1.2,
68
- "c" => false, "d" => true })
69
- expect(test_class.translate_type(test_mash)).to eq("@{a=1;b=1.2;c=$false;d=$true}")
67
+ node = Chef::Node.new
68
+ node.default[:test] = { "a" => 1, "b" => 1.2, "c" => false, "d" => true }
69
+ expect(test_class.translate_type(node[:test])).to eq("@{a=1;b=1.2;c=$false;d=$true}")
70
70
  end
71
71
 
72
72
  it "translates a Chef::Node::ImmutableArray like an array" do
73
- test_array = Chef::Node::ImmutableArray.new([true, false])
74
- expect(test_class.translate_type(test_array)).to eq("@($true,$false)")
73
+ node = Chef::Node.new
74
+ node.default[:test] = [ true, false ]
75
+ expect(test_class.translate_type(node[:test])).to eq("@($true,$false)")
75
76
  end
76
77
 
77
78
  it "falls back :to_psobject if we have not defined at explicit rule" do
@@ -171,6 +171,7 @@ describe Chef::Node::Attribute do
171
171
  }
172
172
  @automatic_hash = { "week" => "friday" }
173
173
  @attributes = Chef::Node::Attribute.new(@attribute_hash, @default_hash, @override_hash, @automatic_hash, node)
174
+ allow(node).to receive(:attributes).and_return(@attributes)
174
175
  end
175
176
 
176
177
  describe "initialize" do
@@ -179,13 +180,14 @@ describe Chef::Node::Attribute do
179
180
  end
180
181
 
181
182
  it "should take an Automatioc, Normal, Default and Override hash" do
182
- expect { Chef::Node::Attribute.new({}, {}, {}, {}) }.not_to raise_error
183
+ expect { Chef::Node::Attribute.new({}, {}, {}, {}, node) }.not_to raise_error
183
184
  end
184
185
 
185
186
  [ :normal, :default, :override, :automatic ].each do |accessor|
186
187
  it "should set #{accessor}" do
187
- na = Chef::Node::Attribute.new({ :normal => true }, { :default => true }, { :override => true }, { :automatic => true })
188
- expect(na.send(accessor)).to eq({ accessor.to_s => true })
188
+ @attributes = Chef::Node::Attribute.new({ :normal => true }, { :default => true }, { :override => true }, { :automatic => true }, node)
189
+ allow(node).to receive(:attributes).and_return(@attributes)
190
+ expect(@attributes.send(accessor)).to eq({ accessor.to_s => true })
189
191
  end
190
192
  end
191
193
 
@@ -330,7 +332,8 @@ describe Chef::Node::Attribute do
330
332
  end
331
333
 
332
334
  it "merges nested hashes between precedence levels" do
333
- @attributes = Chef::Node::Attribute.new({}, {}, {}, {})
335
+ @attributes = Chef::Node::Attribute.new({}, {}, {}, {}, node)
336
+ allow(node).to receive(:attributes).and_return(@attributes)
334
337
  @attributes.env_default = { "a" => { "b" => { "default" => "default" } } }
335
338
  @attributes.normal = { "a" => { "b" => { "normal" => "normal" } } }
336
339
  @attributes.override = { "a" => { "override" => "role" } }
@@ -584,8 +587,10 @@ describe Chef::Node::Attribute do
584
587
  "one" => { "six" => "seven" },
585
588
  "snack" => "cookies",
586
589
  },
587
- {}
590
+ {},
591
+ node
588
592
  )
593
+ allow(node).to receive(:attributes).and_return(@attributes)
589
594
  end
590
595
 
591
596
  it "should yield each top level key" do
@@ -632,8 +637,10 @@ describe Chef::Node::Attribute do
632
637
  "one" => "six",
633
638
  "snack" => "cookies",
634
639
  },
635
- {}
640
+ {},
641
+ node
636
642
  )
643
+ allow(node).to receive(:attributes).and_return(@attributes)
637
644
  end
638
645
 
639
646
  it "should yield each top level key and value, post merge rules" do
@@ -670,8 +677,10 @@ describe Chef::Node::Attribute do
670
677
  "one" => "six",
671
678
  "snack" => "cookies",
672
679
  },
673
- {}
680
+ {},
681
+ node
674
682
  )
683
+ allow(node).to receive(:attributes).and_return(@attributes)
675
684
  end
676
685
 
677
686
  it "should respond to each_key" do
@@ -706,8 +715,10 @@ describe Chef::Node::Attribute do
706
715
  "one" => "six",
707
716
  "snack" => "cookies",
708
717
  },
709
- {}
718
+ {},
719
+ node
710
720
  )
721
+ allow(node).to receive(:attributes).and_return(@attributes)
711
722
  end
712
723
 
713
724
  it "should respond to each_pair" do
@@ -742,8 +753,10 @@ describe Chef::Node::Attribute do
742
753
  "one" => "six",
743
754
  "snack" => "cookies",
744
755
  },
745
- {}
756
+ {},
757
+ node
746
758
  )
759
+ allow(node).to receive(:attributes).and_return(@attributes)
747
760
  end
748
761
 
749
762
  it "should respond to each_value" do
@@ -786,9 +799,10 @@ describe Chef::Node::Attribute do
786
799
  "one" => "six",
787
800
  "snack" => "cookies",
788
801
  },
789
- {}
802
+ {},
803
+ node
790
804
  )
791
- @empty = Chef::Node::Attribute.new({}, {}, {}, {})
805
+ allow(node).to receive(:attributes).and_return(@attributes)
792
806
  end
793
807
 
794
808
  it "should respond to empty?" do
@@ -796,7 +810,9 @@ describe Chef::Node::Attribute do
796
810
  end
797
811
 
798
812
  it "should return true when there are no keys" do
799
- expect(@empty.empty?).to eq(true)
813
+ @attributes = Chef::Node::Attribute.new({}, {}, {}, {}, node)
814
+ allow(node).to receive(:attributes).and_return(@attributes)
815
+ expect(@attributes.empty?).to eq(true)
800
816
  end
801
817
 
802
818
  it "should return false when there are keys" do
@@ -820,8 +836,10 @@ describe Chef::Node::Attribute do
820
836
  "one" => "six",
821
837
  "snack" => "cookies",
822
838
  },
823
- {}
839
+ {},
840
+ node
824
841
  )
842
+ allow(node).to receive(:attributes).and_return(@attributes)
825
843
  end
826
844
 
827
845
  it "should respond to fetch" do
@@ -877,8 +895,10 @@ describe Chef::Node::Attribute do
877
895
  "one" => "six",
878
896
  "snack" => "cookies",
879
897
  },
880
- {}
898
+ {},
899
+ node
881
900
  )
901
+ allow(node).to receive(:attributes).and_return(@attributes)
882
902
  end
883
903
 
884
904
  it "should respond to has_value?" do
@@ -922,8 +942,10 @@ describe Chef::Node::Attribute do
922
942
  "one" => "six",
923
943
  "snack" => "cookies",
924
944
  },
925
- {}
945
+ {},
946
+ node
926
947
  )
948
+ allow(node).to receive(:attributes).and_return(@attributes)
927
949
  end
928
950
 
929
951
  it "should respond to index" do
@@ -963,8 +985,10 @@ describe Chef::Node::Attribute do
963
985
  "one" => "six",
964
986
  "snack" => "cookies",
965
987
  },
966
- {}
988
+ {},
989
+ node
967
990
  )
991
+ allow(node).to receive(:attributes).and_return(@attributes)
968
992
  end
969
993
 
970
994
  it "should respond to values" do
@@ -999,8 +1023,10 @@ describe Chef::Node::Attribute do
999
1023
  "one" => "six",
1000
1024
  "snack" => "cookies",
1001
1025
  },
1002
- {}
1026
+ {},
1027
+ node
1003
1028
  )
1029
+ allow(node).to receive(:attributes).and_return(@attributes)
1004
1030
  end
1005
1031
 
1006
1032
  it "should respond to select" do
@@ -1049,10 +1075,11 @@ describe Chef::Node::Attribute do
1049
1075
  "one" => "six",
1050
1076
  "snack" => "cookies",
1051
1077
  },
1052
- {}
1078
+ {},
1079
+ node
1053
1080
  )
1081
+ allow(node).to receive(:attributes).and_return(@attributes)
1054
1082
 
1055
- @empty = Chef::Node::Attribute.new({}, {}, {}, {})
1056
1083
  end
1057
1084
 
1058
1085
  it "should respond to size" do
@@ -1064,7 +1091,9 @@ describe Chef::Node::Attribute do
1064
1091
  end
1065
1092
 
1066
1093
  it "should return 0 for an empty attribute" do
1067
- expect(@empty.size).to eq(0)
1094
+ @attributes = Chef::Node::Attribute.new({}, {}, {}, {}, node)
1095
+ allow(node).to receive(:attributes).and_return(@attributes)
1096
+ expect(@attributes.size).to eq(0)
1068
1097
  end
1069
1098
 
1070
1099
  it "should return the number of pairs" do
@@ -1092,8 +1121,9 @@ describe Chef::Node::Attribute do
1092
1121
 
1093
1122
  describe "to_s" do
1094
1123
  it "should output simple attributes" do
1095
- attributes = Chef::Node::Attribute.new(nil, nil, nil, nil)
1096
- expect(attributes.to_s).to eq("{}")
1124
+ @attributes = Chef::Node::Attribute.new(nil, nil, nil, nil, node)
1125
+ allow(node).to receive(:attributes).and_return(@attributes)
1126
+ expect(@attributes.to_s).to eq("{}")
1097
1127
  end
1098
1128
 
1099
1129
  it "should output merged attributes" do
@@ -1105,8 +1135,9 @@ describe Chef::Node::Attribute do
1105
1135
  "b" => 3,
1106
1136
  "c" => 4,
1107
1137
  }
1108
- attributes = Chef::Node::Attribute.new(nil, default_hash, override_hash, nil)
1109
- expect(attributes.to_s).to eq('{"a"=>1, "b"=>3, "c"=>4}')
1138
+ @attributes = Chef::Node::Attribute.new(nil, default_hash, override_hash, nil, node)
1139
+ allow(node).to receive(:attributes).and_return(@attributes)
1140
+ expect(@attributes.to_s).to eq('{"b"=>3, "c"=>4, "a"=>1}')
1110
1141
  end
1111
1142
  end
1112
1143