chef 16.18.30-universal-mingw32 → 17.0.242-universal-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (881) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +9 -22
  3. data/README.md +1 -1
  4. data/Rakefile +2 -2
  5. data/chef-universal-mingw32.gemspec +1 -2
  6. data/chef.gemspec +7 -10
  7. data/distro/ruby_bin_folder/AMD64/Chef.PowerShell.Wrapper.dll +0 -0
  8. data/distro/ruby_bin_folder/AMD64/Chef.PowerShell.dll +0 -0
  9. data/distro/ruby_bin_folder/AMD64/Ijwhost.dll +0 -0
  10. data/distro/ruby_bin_folder/AMD64/concrt140.dll +0 -0
  11. data/distro/ruby_bin_folder/AMD64/host/fxr/5.0.0/hostfxr.dll +0 -0
  12. data/distro/ruby_bin_folder/AMD64/msvcp140.dll +0 -0
  13. data/distro/ruby_bin_folder/AMD64/msvcp140_1.dll +0 -0
  14. data/distro/ruby_bin_folder/AMD64/msvcp140_2.dll +0 -0
  15. data/distro/ruby_bin_folder/AMD64/msvcp140_atomic_wait.dll +0 -0
  16. data/distro/ruby_bin_folder/AMD64/msvcp140_codecvt_ids.dll +0 -0
  17. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/Chef.PowerShell.Wrapper.Core.dll +0 -0
  18. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/Chef.Powershell.Core.dll +0 -0
  19. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/Chef.Powershell.Core.pdb +0 -0
  20. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/Ijwhost.dll +0 -0
  21. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/Microsoft.CSharp.dll +0 -0
  22. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/Microsoft.NETCore.App.deps.json +180 -180
  23. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/Microsoft.VisualBasic.Core.dll +0 -0
  24. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/Microsoft.VisualBasic.dll +0 -0
  25. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/Microsoft.Win32.Primitives.dll +0 -0
  26. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/Microsoft.Win32.Registry.dll +0 -0
  27. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.AppContext.dll +0 -0
  28. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Buffers.dll +0 -0
  29. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Collections.Concurrent.dll +0 -0
  30. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Collections.Immutable.dll +0 -0
  31. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Collections.NonGeneric.dll +0 -0
  32. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Collections.Specialized.dll +0 -0
  33. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Collections.dll +0 -0
  34. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.ComponentModel.Annotations.dll +0 -0
  35. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.ComponentModel.DataAnnotations.dll +0 -0
  36. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.ComponentModel.EventBasedAsync.dll +0 -0
  37. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.ComponentModel.Primitives.dll +0 -0
  38. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.ComponentModel.TypeConverter.dll +0 -0
  39. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.ComponentModel.dll +0 -0
  40. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Configuration.dll +0 -0
  41. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Console.dll +0 -0
  42. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Core.dll +0 -0
  43. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Data.Common.dll +0 -0
  44. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Data.DataSetExtensions.dll +0 -0
  45. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Data.dll +0 -0
  46. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Diagnostics.Contracts.dll +0 -0
  47. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Diagnostics.Debug.dll +0 -0
  48. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Diagnostics.DiagnosticSource.dll +0 -0
  49. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Diagnostics.FileVersionInfo.dll +0 -0
  50. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Diagnostics.Process.dll +0 -0
  51. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Diagnostics.StackTrace.dll +0 -0
  52. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Diagnostics.TextWriterTraceListener.dll +0 -0
  53. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Diagnostics.Tools.dll +0 -0
  54. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Diagnostics.TraceSource.dll +0 -0
  55. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Diagnostics.Tracing.dll +0 -0
  56. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Drawing.Primitives.dll +0 -0
  57. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Drawing.dll +0 -0
  58. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Dynamic.Runtime.dll +0 -0
  59. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Formats.Asn1.dll +0 -0
  60. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Globalization.Calendars.dll +0 -0
  61. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Globalization.Extensions.dll +0 -0
  62. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Globalization.dll +0 -0
  63. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.IO.Compression.Brotli.dll +0 -0
  64. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.IO.Compression.FileSystem.dll +0 -0
  65. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.IO.Compression.ZipFile.dll +0 -0
  66. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.IO.Compression.dll +0 -0
  67. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.IO.FileSystem.AccessControl.dll +0 -0
  68. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.IO.FileSystem.DriveInfo.dll +0 -0
  69. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.IO.FileSystem.Primitives.dll +0 -0
  70. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.IO.FileSystem.Watcher.dll +0 -0
  71. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.IO.FileSystem.dll +0 -0
  72. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.IO.IsolatedStorage.dll +0 -0
  73. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.IO.MemoryMappedFiles.dll +0 -0
  74. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.IO.Pipes.AccessControl.dll +0 -0
  75. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.IO.Pipes.dll +0 -0
  76. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.IO.UnmanagedMemoryStream.dll +0 -0
  77. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.IO.dll +0 -0
  78. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Linq.Expressions.dll +0 -0
  79. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Linq.Parallel.dll +0 -0
  80. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Linq.Queryable.dll +0 -0
  81. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Linq.dll +0 -0
  82. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Memory.dll +0 -0
  83. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Net.Http.Json.dll +0 -0
  84. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Net.Http.dll +0 -0
  85. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Net.HttpListener.dll +0 -0
  86. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Net.Mail.dll +0 -0
  87. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Net.NameResolution.dll +0 -0
  88. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Net.NetworkInformation.dll +0 -0
  89. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Net.Ping.dll +0 -0
  90. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Net.Primitives.dll +0 -0
  91. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Net.Requests.dll +0 -0
  92. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Net.Security.dll +0 -0
  93. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Net.ServicePoint.dll +0 -0
  94. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Net.Sockets.dll +0 -0
  95. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Net.WebClient.dll +0 -0
  96. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Net.WebHeaderCollection.dll +0 -0
  97. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Net.WebProxy.dll +0 -0
  98. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Net.WebSockets.Client.dll +0 -0
  99. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Net.WebSockets.dll +0 -0
  100. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Net.dll +0 -0
  101. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Numerics.Vectors.dll +0 -0
  102. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Numerics.dll +0 -0
  103. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.ObjectModel.dll +0 -0
  104. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Private.CoreLib.dll +0 -0
  105. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Private.DataContractSerialization.dll +0 -0
  106. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Private.Uri.dll +0 -0
  107. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Private.Xml.Linq.dll +0 -0
  108. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Private.Xml.dll +0 -0
  109. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Reflection.DispatchProxy.dll +0 -0
  110. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Reflection.Emit.ILGeneration.dll +0 -0
  111. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Reflection.Emit.Lightweight.dll +0 -0
  112. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Reflection.Emit.dll +0 -0
  113. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Reflection.Extensions.dll +0 -0
  114. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Reflection.Metadata.dll +0 -0
  115. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Reflection.Primitives.dll +0 -0
  116. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Reflection.TypeExtensions.dll +0 -0
  117. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Reflection.dll +0 -0
  118. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Resources.Reader.dll +0 -0
  119. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Resources.ResourceManager.dll +0 -0
  120. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Resources.Writer.dll +0 -0
  121. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Runtime.CompilerServices.Unsafe.dll +0 -0
  122. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Runtime.CompilerServices.VisualC.dll +0 -0
  123. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Runtime.Extensions.dll +0 -0
  124. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Runtime.Handles.dll +0 -0
  125. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Runtime.InteropServices.RuntimeInformation.dll +0 -0
  126. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Runtime.InteropServices.dll +0 -0
  127. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Runtime.Intrinsics.dll +0 -0
  128. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Runtime.Loader.dll +0 -0
  129. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Runtime.Numerics.dll +0 -0
  130. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Runtime.Serialization.Formatters.dll +0 -0
  131. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Runtime.Serialization.Json.dll +0 -0
  132. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Runtime.Serialization.Primitives.dll +0 -0
  133. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Runtime.Serialization.Xml.dll +0 -0
  134. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Runtime.Serialization.dll +0 -0
  135. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Runtime.dll +0 -0
  136. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Security.AccessControl.dll +0 -0
  137. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Security.Claims.dll +0 -0
  138. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Security.Cryptography.Algorithms.dll +0 -0
  139. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Security.Cryptography.Cng.dll +0 -0
  140. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Security.Cryptography.Csp.dll +0 -0
  141. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Security.Cryptography.Encoding.dll +0 -0
  142. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Security.Cryptography.OpenSsl.dll +0 -0
  143. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Security.Cryptography.Primitives.dll +0 -0
  144. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Security.Cryptography.X509Certificates.dll +0 -0
  145. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Security.Principal.Windows.dll +0 -0
  146. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Security.Principal.dll +0 -0
  147. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Security.SecureString.dll +0 -0
  148. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Security.dll +0 -0
  149. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.ServiceModel.Web.dll +0 -0
  150. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.ServiceProcess.dll +0 -0
  151. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Text.Encoding.CodePages.dll +0 -0
  152. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Text.Encoding.Extensions.dll +0 -0
  153. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Text.Encoding.dll +0 -0
  154. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Text.Encodings.Web.dll +0 -0
  155. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Text.Json.dll +0 -0
  156. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Text.RegularExpressions.dll +0 -0
  157. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Threading.Channels.dll +0 -0
  158. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Threading.Overlapped.dll +0 -0
  159. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Threading.Tasks.Dataflow.dll +0 -0
  160. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Threading.Tasks.Extensions.dll +0 -0
  161. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Threading.Tasks.Parallel.dll +0 -0
  162. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Threading.Tasks.dll +0 -0
  163. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Threading.Thread.dll +0 -0
  164. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Threading.ThreadPool.dll +0 -0
  165. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Threading.Timer.dll +0 -0
  166. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Threading.dll +0 -0
  167. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Transactions.Local.dll +0 -0
  168. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Transactions.dll +0 -0
  169. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.ValueTuple.dll +0 -0
  170. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Web.HttpUtility.dll +0 -0
  171. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Web.dll +0 -0
  172. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Windows.dll +0 -0
  173. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Xml.Linq.dll +0 -0
  174. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Xml.ReaderWriter.dll +0 -0
  175. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Xml.Serialization.dll +0 -0
  176. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Xml.XDocument.dll +0 -0
  177. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Xml.XPath.XDocument.dll +0 -0
  178. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Xml.XPath.dll +0 -0
  179. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Xml.XmlDocument.dll +0 -0
  180. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Xml.XmlSerializer.dll +0 -0
  181. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.Xml.dll +0 -0
  182. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/System.dll +0 -0
  183. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/WindowsBase.dll +0 -0
  184. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/clrcompression.dll +0 -0
  185. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/clretwrc.dll +0 -0
  186. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/clrjit.dll +0 -0
  187. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/coreclr.dll +0 -0
  188. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/createdump.exe +0 -0
  189. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/dbgshim.dll +0 -0
  190. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/hostfxr.dll +0 -0
  191. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/hostpolicy.dll +0 -0
  192. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/mscordaccore.dll +0 -0
  193. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/mscordbi.dll +0 -0
  194. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/mscorlib.dll +0 -0
  195. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/mscorrc.dll +0 -0
  196. data/distro/ruby_bin_folder/AMD64/shared/Microsoft.NETCore.App/5.0.0/netstandard.dll +0 -0
  197. data/distro/ruby_bin_folder/AMD64/vccorlib140.dll +0 -0
  198. data/distro/ruby_bin_folder/AMD64/vcruntime140.dll +0 -0
  199. data/distro/ruby_bin_folder/AMD64/vcruntime140_1.dll +0 -0
  200. data/distro/ruby_bin_folder/x86/Chef.PowerShell.dll +0 -0
  201. data/distro/ruby_bin_folder/x86/Chef.Powershell.Wrapper.dll +0 -0
  202. data/distro/ruby_bin_folder/x86/concrt140.dll +0 -0
  203. data/distro/ruby_bin_folder/x86/msvcp140.dll +0 -0
  204. data/distro/ruby_bin_folder/x86/msvcp140_1.dll +0 -0
  205. data/distro/ruby_bin_folder/x86/msvcp140_2.dll +0 -0
  206. data/distro/ruby_bin_folder/x86/msvcp140_atomic_wait.dll +0 -0
  207. data/distro/ruby_bin_folder/x86/msvcp140_codecvt_ids.dll +0 -0
  208. data/distro/ruby_bin_folder/x86/shared/Microsoft.NETCore.App/5.0.0/Chef.PowerShell.Wrapper.Core.dll +0 -0
  209. data/distro/ruby_bin_folder/x86/shared/Microsoft.NETCore.App/5.0.0/Chef.Powershell.Core.dll +0 -0
  210. data/distro/ruby_bin_folder/x86/shared/Microsoft.NETCore.App/5.0.0/Chef.Powershell.Core.pdb +0 -0
  211. data/distro/ruby_bin_folder/x86/vccorlib140.dll +0 -0
  212. data/distro/ruby_bin_folder/x86/vcruntime140.dll +0 -0
  213. data/lib/chef/action_collection.rb +1 -1
  214. data/lib/chef/application/base.rb +1 -1
  215. data/lib/chef/application.rb +1 -1
  216. data/lib/chef/applications.rb +0 -1
  217. data/lib/chef/chef_fs/command_line.rb +5 -2
  218. data/lib/chef/chef_fs/file_system.rb +9 -10
  219. data/lib/chef/client.rb +5 -5
  220. data/lib/chef/compliance/default_attributes.rb +4 -3
  221. data/lib/chef/compliance/fetcher/automate.rb +0 -7
  222. data/lib/chef/compliance/reporter/automate.rb +17 -7
  223. data/lib/chef/compliance/reporter/chef_server_automate.rb +11 -6
  224. data/lib/chef/compliance/reporter/cli.rb +77 -0
  225. data/lib/chef/compliance/reporter/compliance_enforcer.rb +4 -0
  226. data/lib/chef/compliance/reporter/json_file.rb +8 -1
  227. data/lib/chef/compliance/runner.rb +65 -27
  228. data/lib/chef/cookbook/gem_installer.rb +1 -5
  229. data/lib/chef/cookbook/synchronizer.rb +3 -5
  230. data/lib/chef/cookbook_loader.rb +2 -4
  231. data/lib/chef/cookbook_uploader.rb +0 -1
  232. data/lib/chef/cookbook_version.rb +4 -26
  233. data/lib/chef/data_bag_item.rb +11 -2
  234. data/lib/chef/data_collector/run_end_message.rb +2 -2
  235. data/lib/chef/delayed_evaluator.rb +4 -0
  236. data/lib/chef/deprecated.rb +6 -12
  237. data/lib/chef/dsl/chef_vault.rb +6 -6
  238. data/lib/chef/dsl/reboot_pending.rb +1 -2
  239. data/lib/chef/exceptions.rb +0 -3
  240. data/lib/chef/formatters/error_inspectors/resource_failure_inspector.rb +20 -22
  241. data/lib/chef/formatters/error_mapper.rb +2 -2
  242. data/lib/chef/group.rb +75 -0
  243. data/lib/chef/http.rb +5 -5
  244. data/lib/chef/mixin/checksum.rb +0 -6
  245. data/lib/chef/mixin/get_source_from_package.rb +1 -1
  246. data/lib/chef/mixin/powershell_exec.rb +26 -7
  247. data/lib/chef/node/attribute.rb +9 -24
  248. data/lib/chef/node/immutable_collections.rb +13 -0
  249. data/lib/chef/node/mixin/deep_merge_cache.rb +14 -10
  250. data/lib/chef/node.rb +19 -20
  251. data/lib/chef/org.rb +3 -2
  252. data/lib/chef/platform/query_helpers.rb +2 -2
  253. data/lib/chef/policy_builder/policyfile.rb +0 -5
  254. data/lib/chef/property.rb +18 -0
  255. data/lib/chef/provider/cron.rb +2 -6
  256. data/lib/chef/provider/execute.rb +2 -1
  257. data/lib/chef/provider/file.rb +3 -3
  258. data/lib/chef/provider/git.rb +5 -7
  259. data/lib/chef/provider/group/dscl.rb +1 -1
  260. data/lib/chef/provider/group/groupadd.rb +3 -3
  261. data/lib/chef/provider/group/groupmod.rb +3 -3
  262. data/lib/chef/provider/group/pw.rb +3 -3
  263. data/lib/chef/provider/ifconfig.rb +2 -2
  264. data/lib/chef/provider/link.rb +2 -2
  265. data/lib/chef/provider/mount/aix.rb +3 -3
  266. data/lib/chef/provider/mount/mount.rb +5 -5
  267. data/lib/chef/provider/mount/windows.rb +1 -1
  268. data/lib/chef/provider/mount.rb +5 -5
  269. data/lib/chef/provider/package/apt.rb +27 -1
  270. data/lib/chef/provider/package/deb.rb +3 -3
  271. data/lib/chef/provider/package/dnf/dnf_helper.py +1 -1
  272. data/lib/chef/provider/package/portage.rb +2 -2
  273. data/lib/chef/provider/package/powershell.rb +0 -5
  274. data/lib/chef/provider/package/rubygems.rb +9 -15
  275. data/lib/chef/provider/package/windows.rb +3 -5
  276. data/lib/chef/provider/package/yum/yum_helper.py +11 -1
  277. data/lib/chef/provider/package.rb +17 -21
  278. data/lib/chef/provider/route.rb +2 -2
  279. data/lib/chef/provider/service/aixinit.rb +1 -1
  280. data/lib/chef/provider/service/debian.rb +1 -1
  281. data/lib/chef/provider/service/freebsd.rb +15 -21
  282. data/lib/chef/provider/service/macosx.rb +4 -4
  283. data/lib/chef/provider/service/systemd.rb +43 -14
  284. data/lib/chef/provider/service/upstart.rb +2 -13
  285. data/lib/chef/provider/service/windows.rb +12 -12
  286. data/lib/chef/provider/service.rb +6 -6
  287. data/lib/chef/provider/subversion.rb +10 -12
  288. data/lib/chef/provider/systemd_unit.rb +36 -10
  289. data/lib/chef/provider/template/content.rb +3 -7
  290. data/lib/chef/provider/user/dscl.rb +1 -1
  291. data/lib/chef/provider/user/mac.rb +17 -20
  292. data/lib/chef/provider/user/pw.rb +1 -1
  293. data/lib/chef/provider/user/windows.rb +1 -1
  294. data/lib/chef/provider/user.rb +2 -2
  295. data/lib/chef/provider/zypper_repository.rb +2 -2
  296. data/lib/chef/provider.rb +1 -1
  297. data/lib/chef/providers.rb +0 -1
  298. data/lib/chef/resource/alternatives.rb +6 -6
  299. data/lib/chef/resource/apt_package.rb +1 -1
  300. data/lib/chef/resource/apt_preference.rb +2 -2
  301. data/lib/chef/resource/apt_repository.rb +6 -6
  302. data/lib/chef/resource/apt_update.rb +3 -2
  303. data/lib/chef/resource/archive_file.rb +8 -9
  304. data/lib/chef/resource/breakpoint.rb +1 -1
  305. data/lib/chef/resource/build_essential.rb +2 -6
  306. data/lib/chef/resource/chef_client_config.rb +2 -2
  307. data/lib/chef/resource/chef_client_cron.rb +4 -4
  308. data/lib/chef/resource/chef_client_launchd.rb +3 -3
  309. data/lib/chef/resource/chef_client_scheduled_task.rb +1 -1
  310. data/lib/chef/resource/chef_client_systemd_timer.rb +2 -2
  311. data/lib/chef/resource/chef_client_trusted_certificate.rb +0 -1
  312. data/lib/chef/resource/chef_handler.rb +3 -7
  313. data/lib/chef/resource/chef_sleep.rb +1 -1
  314. data/lib/chef/resource/chef_vault_secret.rb +3 -8
  315. data/lib/chef/resource/chocolatey_config.rb +2 -6
  316. data/lib/chef/resource/chocolatey_feature.rb +2 -6
  317. data/lib/chef/resource/chocolatey_source.rb +4 -10
  318. data/lib/chef/resource/cron/_cron_shared.rb +2 -2
  319. data/lib/chef/resource/cron_access.rb +2 -4
  320. data/lib/chef/resource/dmg_package.rb +6 -10
  321. data/lib/chef/resource/dpkg_package.rb +1 -1
  322. data/lib/chef/resource/execute.rb +6 -1
  323. data/lib/chef/resource/file.rb +1 -1
  324. data/lib/chef/resource/group.rb +2 -2
  325. data/lib/chef/resource/homebrew_cask.rb +5 -15
  326. data/lib/chef/resource/homebrew_tap.rb +2 -6
  327. data/lib/chef/resource/hostname.rb +21 -17
  328. data/lib/chef/resource/http_request.rb +1 -1
  329. data/lib/chef/resource/kernel_module.rb +6 -17
  330. data/lib/chef/resource/locale.rb +3 -4
  331. data/lib/chef/resource/lwrp_base.rb +4 -0
  332. data/lib/chef/resource/macos_userdefaults.rb +10 -14
  333. data/lib/chef/resource/mdadm.rb +53 -7
  334. data/lib/chef/resource/mount.rb +3 -2
  335. data/lib/chef/resource/openssl_ec_private_key.rb +2 -2
  336. data/lib/chef/resource/openssl_rsa_private_key.rb +1 -1
  337. data/lib/chef/resource/openssl_x509_certificate.rb +2 -2
  338. data/lib/chef/resource/plist.rb +7 -7
  339. data/lib/chef/resource/powershell_script.rb +1 -1
  340. data/lib/chef/resource/remote_file.rb +1 -1
  341. data/lib/chef/resource/rhsm_errata.rb +16 -1
  342. data/lib/chef/resource/rhsm_errata_level.rb +10 -1
  343. data/lib/chef/resource/rhsm_register.rb +12 -23
  344. data/lib/chef/resource/rhsm_repo.rb +2 -6
  345. data/lib/chef/resource/rhsm_subscription.rb +7 -11
  346. data/lib/chef/resource/scm/git.rb +1 -1
  347. data/lib/chef/resource/sudo.rb +6 -6
  348. data/lib/chef/resource/support/client.erb +2 -6
  349. data/lib/chef/resource/sysctl.rb +2 -6
  350. data/lib/chef/resource/systemd_unit.rb +3 -3
  351. data/lib/chef/resource/template.rb +1 -1
  352. data/lib/chef/resource/timezone.rb +1 -3
  353. data/lib/chef/resource/user/mac_user.rb +1 -1
  354. data/lib/chef/resource/user_ulimit.rb +2 -3
  355. data/lib/chef/resource/windows_ad_join.rb +2 -6
  356. data/lib/chef/resource/windows_audit_policy.rb +1 -1
  357. data/lib/chef/resource/windows_auto_run.rb +2 -5
  358. data/lib/chef/resource/windows_certificate.rb +207 -73
  359. data/lib/chef/resource/windows_dfs_folder.rb +2 -6
  360. data/lib/chef/resource/windows_dfs_namespace.rb +2 -6
  361. data/lib/chef/resource/windows_dfs_server.rb +1 -3
  362. data/lib/chef/resource/windows_dns_record.rb +2 -6
  363. data/lib/chef/resource/windows_dns_zone.rb +2 -6
  364. data/lib/chef/resource/windows_env.rb +5 -4
  365. data/lib/chef/resource/windows_feature.rb +3 -9
  366. data/lib/chef/resource/windows_feature_dism.rb +2 -6
  367. data/lib/chef/resource/windows_feature_powershell.rb +3 -3
  368. data/lib/chef/resource/windows_firewall_profile.rb +4 -4
  369. data/lib/chef/resource/windows_firewall_rule.rb +2 -5
  370. data/lib/chef/resource/windows_font.rb +2 -4
  371. data/lib/chef/resource/windows_pagefile.rb +2 -6
  372. data/lib/chef/resource/windows_path.rb +2 -2
  373. data/lib/chef/resource/windows_printer.rb +4 -4
  374. data/lib/chef/resource/windows_printer_port.rb +6 -6
  375. data/lib/chef/resource/windows_security_policy.rb +9 -12
  376. data/lib/chef/resource/windows_share.rb +14 -21
  377. data/lib/chef/resource/windows_shortcut.rb +4 -6
  378. data/lib/chef/resource/windows_task.rb +17 -5
  379. data/lib/chef/resource/windows_uac.rb +2 -4
  380. data/lib/chef/resource/windows_user_privilege.rb +26 -36
  381. data/lib/chef/resource/windows_workgroup.rb +1 -2
  382. data/lib/chef/resource.rb +1 -1
  383. data/lib/chef/resource_reporter.rb +1 -1
  384. data/lib/chef/resources.rb +0 -1
  385. data/lib/chef/shell/ext.rb +3 -3
  386. data/lib/chef/user.rb +0 -1
  387. data/lib/chef/user_v1.rb +3 -4
  388. data/lib/chef/util/dsc/configuration_generator.rb +1 -0
  389. data/lib/chef/util/dsc/local_configuration_manager.rb +1 -1
  390. data/lib/chef/version.rb +1 -1
  391. data/lib/chef/win32/api.rb +2 -9
  392. data/lib/chef/win32/registry.rb +4 -2
  393. data/lib/chef/win32/version.rb +2 -4
  394. data/spec/data/cookbooks/openldap/libraries/openldap.rb +1 -1
  395. data/spec/data/lwrp/resources/bar.rb +2 -0
  396. data/spec/data/lwrp/resources/buck_passer.rb +1 -0
  397. data/spec/data/lwrp/resources/buck_passer_2.rb +1 -0
  398. data/spec/data/lwrp/resources/embedded_resource_accesses_providers_scope.rb +1 -0
  399. data/spec/data/lwrp/resources/foo.rb +2 -0
  400. data/spec/data/lwrp/resources/inline_compiler.rb +1 -0
  401. data/spec/data/lwrp/resources/monkey_name_printer.rb +1 -0
  402. data/spec/data/lwrp/resources/paint_drying_watcher.rb +1 -0
  403. data/spec/data/lwrp/resources/thumb_twiddler.rb +1 -0
  404. data/spec/data/lwrp/resources_with_default_attributes/nodeattr.rb +2 -0
  405. data/spec/data/lwrp_const_scoping/resources/conflict.rb +1 -0
  406. data/spec/data/lwrp_override/resources/foo.rb +1 -0
  407. data/spec/data/rubygems.org/nonexistent_gem-info +1 -0
  408. data/spec/data/rubygems.org/sexp_processor-info +49 -0
  409. data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -0
  410. data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -0
  411. data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -0
  412. data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -0
  413. data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -0
  414. data/spec/data/run_context/cookbooks/test/resources/resource.rb +2 -0
  415. data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +2 -0
  416. data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -0
  417. data/spec/functional/assets/yumrepo/repodata/4632d67cb92636e7575d911c24f0e04d3505a944e97c483abe0c3e73a7c62d33-filelists.sqlite.bz2 +0 -0
  418. data/spec/functional/assets/yumrepo/repodata/74599b793e54d877323837d2d81a1c3c594c44e4335f9528234bb490f7b9b439-other.xml.gz +0 -0
  419. data/spec/functional/assets/yumrepo/repodata/a845d418f919d2115ab95a56b2c76f6825ad0d0bede49181a55c04f58995d057-primary.sqlite.bz2 +0 -0
  420. data/spec/functional/assets/yumrepo/repodata/af9b7cf9ef23bd7b43068d74a460f3b5d06753d638e58e4a0c9edc35bfb9cdc4-other.sqlite.bz2 +0 -0
  421. data/spec/functional/assets/yumrepo/repodata/bdb4f5f1492a3b9532f22c43110a81500dd744f23da0aec5c33b2a41317c737d-filelists.xml.gz +0 -0
  422. data/spec/functional/assets/yumrepo/repodata/c10d1d34ce99e02f12ec96ef68360543ab1bb7c3cb81a4a2bf78df7d8597e9df-primary.xml.gz +0 -0
  423. data/spec/functional/dsl/registry_helper_spec.rb +1 -1
  424. data/spec/functional/resource/aixinit_service_spec.rb +7 -7
  425. data/spec/functional/resource/apt_package_spec.rb +1 -1
  426. data/spec/functional/resource/chocolatey_package_spec.rb +9 -0
  427. data/spec/functional/resource/dnf_package_spec.rb +4 -1
  428. data/spec/functional/resource/dsc_script_spec.rb +1 -1
  429. data/spec/functional/resource/group_spec.rb +1 -5
  430. data/spec/functional/resource/link_spec.rb +0 -8
  431. data/spec/functional/resource/registry_spec.rb +8 -8
  432. data/spec/functional/resource/user/mac_user_spec.rb +2 -2
  433. data/spec/functional/resource/windows_certificate_spec.rb +92 -35
  434. data/spec/functional/resource/windows_font_spec.rb +1 -2
  435. data/spec/functional/resource/yum_package_spec.rb +0 -12
  436. data/spec/functional/shell_spec.rb +0 -5
  437. data/spec/functional/version_spec.rb +1 -1
  438. data/spec/functional/win32/registry_spec.rb +1 -1
  439. data/spec/integration/client/client_spec.rb +5 -2
  440. data/spec/integration/client/exit_code_spec.rb +1 -1
  441. data/spec/integration/client/ipv6_spec.rb +1 -1
  442. data/spec/integration/compliance/compliance_spec.rb +1 -1
  443. data/spec/integration/ohai/ohai_spec.rb +7 -6
  444. data/spec/integration/recipes/accumulator_spec.rb +13 -1
  445. data/spec/integration/recipes/lwrp_inline_resources_spec.rb +5 -1
  446. data/spec/integration/recipes/lwrp_spec.rb +3 -1
  447. data/spec/integration/recipes/notifies_spec.rb +15 -1
  448. data/spec/integration/recipes/notifying_block_spec.rb +2 -1
  449. data/spec/integration/recipes/recipe_dsl_spec.rb +9 -9
  450. data/spec/integration/recipes/unified_mode_spec.rb +1 -1
  451. data/spec/integration/recipes/use_partial_spec.rb +4 -1
  452. data/spec/spec_helper.rb +10 -17
  453. data/spec/support/chef_helpers.rb +0 -16
  454. data/spec/support/lib/chef/resource/with_state.rb +0 -1
  455. data/spec/support/lib/chef/resource/zen_follower.rb +0 -1
  456. data/spec/support/lib/chef/resource/zen_master.rb +0 -1
  457. data/spec/support/matchers/leak.rb +7 -9
  458. data/spec/support/platform_helpers.rb +1 -12
  459. data/spec/support/shared/integration/integration_helper.rb +0 -1
  460. data/spec/support/shared/unit/script_resource.rb +2 -2
  461. data/spec/unit/application/solo_spec.rb +2 -2
  462. data/spec/unit/chef_fs/diff_spec.rb +1 -1
  463. data/spec/unit/chef_fs/file_system_spec.rb +1 -1
  464. data/spec/unit/client_spec.rb +4 -4
  465. data/spec/unit/compliance/fetcher/automate_spec.rb +0 -16
  466. data/spec/unit/compliance/reporter/automate_spec.rb +26 -2
  467. data/spec/unit/compliance/reporter/chef_server_automate_spec.rb +20 -0
  468. data/spec/unit/compliance/reporter/compliance_enforcer_spec.rb +1 -0
  469. data/spec/unit/compliance/runner_spec.rb +30 -4
  470. data/spec/unit/cookbook_version_spec.rb +0 -52
  471. data/spec/unit/daemon_spec.rb +5 -1
  472. data/spec/unit/data_bag_item_spec.rb +1 -6
  473. data/spec/unit/data_collector_spec.rb +2 -71
  474. data/spec/unit/dsl/reboot_pending_spec.rb +2 -2
  475. data/spec/unit/dsl/registry_helper_spec.rb +1 -1
  476. data/spec/unit/lwrp_spec.rb +1 -1
  477. data/spec/unit/mixin/checksum_spec.rb +0 -28
  478. data/spec/unit/mixin/params_validate_spec.rb +4 -3
  479. data/spec/unit/mixin/powershell_exec_spec.rb +9 -9
  480. data/spec/unit/mixin/powershell_out_spec.rb +2 -2
  481. data/spec/unit/node/attribute_spec.rb +1 -1
  482. data/spec/unit/node_spec.rb +78 -0
  483. data/spec/unit/org_group_spec.rb +45 -0
  484. data/spec/unit/platform/query_helpers_spec.rb +5 -5
  485. data/spec/unit/policy_builder/policyfile_spec.rb +1 -11
  486. data/spec/unit/property_spec.rb +23 -22
  487. data/spec/unit/provider/cron_spec.rb +1 -35
  488. data/spec/unit/provider/group/gpasswd_spec.rb +2 -2
  489. data/spec/unit/provider/group/groupmod_spec.rb +2 -2
  490. data/spec/unit/provider/group/pw_spec.rb +2 -2
  491. data/spec/unit/provider/group_spec.rb +1 -1
  492. data/spec/unit/provider/package/apt_spec.rb +84 -18
  493. data/spec/unit/provider/package/deb_spec.rb +3 -3
  494. data/spec/unit/provider/package/powershell_spec.rb +12 -74
  495. data/spec/unit/provider/package/rubygems_spec.rb +18 -30
  496. data/spec/unit/provider/service/arch_service_spec.rb +1 -0
  497. data/spec/unit/provider/service/debian_service_spec.rb +1 -0
  498. data/spec/unit/provider/service/macosx_spec.rb +2 -2
  499. data/spec/unit/provider/service/systemd_service_spec.rb +138 -23
  500. data/spec/unit/provider/service/upstart_service_spec.rb +0 -29
  501. data/spec/unit/provider/service/windows_spec.rb +2 -2
  502. data/spec/unit/provider/subversion_spec.rb +2 -2
  503. data/spec/unit/provider/systemd_unit_spec.rb +79 -60
  504. data/spec/unit/provider/zypper_repository_spec.rb +2 -2
  505. data/spec/unit/provider_spec.rb +0 -8
  506. data/spec/unit/resource/archive_file_spec.rb +1 -13
  507. data/spec/unit/resource/chef_client_trusted_certificate_spec.rb +0 -14
  508. data/spec/unit/resource/homebrew_cask_spec.rb +11 -29
  509. data/spec/unit/resource/mount_spec.rb +0 -10
  510. data/spec/unit/resource/powershell_script_spec.rb +2 -2
  511. data/spec/unit/resource/rhsm_subscription_spec.rb +3 -50
  512. data/spec/unit/resource/systemd_unit_spec.rb +1 -1
  513. data/spec/unit/resource/user_ulimit_spec.rb +1 -14
  514. data/spec/unit/resource/windows_task_spec.rb +1 -1
  515. data/spec/unit/resource_spec.rb +2 -7
  516. data/spec/unit/user_spec.rb +1 -1
  517. data/spec/unit/user_v1_spec.rb +6 -4
  518. data/spec/unit/util/dsc/local_configuration_manager_spec.rb +2 -2
  519. data/tasks/rspec.rb +15 -7
  520. metadata +45 -404
  521. data/bin/knife +0 -24
  522. data/lib/chef/application/knife.rb +0 -234
  523. data/lib/chef/application/windows_service.rb +0 -338
  524. data/lib/chef/application/windows_service_manager.rb +0 -205
  525. data/lib/chef/chef_fs/knife.rb +0 -160
  526. data/lib/chef/chef_fs/parallelizer/flatten_enumerable.rb +0 -35
  527. data/lib/chef/chef_fs/parallelizer/parallel_enumerable.rb +0 -278
  528. data/lib/chef/chef_fs/parallelizer.rb +0 -102
  529. data/lib/chef/cookbook_site_streaming_uploader.rb +0 -244
  530. data/lib/chef/knife/acl_add.rb +0 -57
  531. data/lib/chef/knife/acl_base.rb +0 -183
  532. data/lib/chef/knife/acl_bulk_add.rb +0 -78
  533. data/lib/chef/knife/acl_bulk_remove.rb +0 -83
  534. data/lib/chef/knife/acl_remove.rb +0 -62
  535. data/lib/chef/knife/acl_show.rb +0 -56
  536. data/lib/chef/knife/bootstrap/chef_vault_handler.rb +0 -162
  537. data/lib/chef/knife/bootstrap/client_builder.rb +0 -212
  538. data/lib/chef/knife/bootstrap/templates/README.md +0 -11
  539. data/lib/chef/knife/bootstrap/templates/chef-full.erb +0 -242
  540. data/lib/chef/knife/bootstrap/templates/windows-chef-client-msi.erb +0 -278
  541. data/lib/chef/knife/bootstrap/train_connector.rb +0 -336
  542. data/lib/chef/knife/bootstrap.rb +0 -1192
  543. data/lib/chef/knife/client_bulk_delete.rb +0 -104
  544. data/lib/chef/knife/client_create.rb +0 -101
  545. data/lib/chef/knife/client_delete.rb +0 -62
  546. data/lib/chef/knife/client_edit.rb +0 -52
  547. data/lib/chef/knife/client_key_create.rb +0 -73
  548. data/lib/chef/knife/client_key_delete.rb +0 -80
  549. data/lib/chef/knife/client_key_edit.rb +0 -83
  550. data/lib/chef/knife/client_key_list.rb +0 -73
  551. data/lib/chef/knife/client_key_show.rb +0 -80
  552. data/lib/chef/knife/client_list.rb +0 -41
  553. data/lib/chef/knife/client_reregister.rb +0 -58
  554. data/lib/chef/knife/client_show.rb +0 -48
  555. data/lib/chef/knife/config_get.rb +0 -39
  556. data/lib/chef/knife/config_get_profile.rb +0 -37
  557. data/lib/chef/knife/config_list.rb +0 -139
  558. data/lib/chef/knife/config_list_profiles.rb +0 -37
  559. data/lib/chef/knife/config_show.rb +0 -127
  560. data/lib/chef/knife/config_use.rb +0 -61
  561. data/lib/chef/knife/config_use_profile.rb +0 -47
  562. data/lib/chef/knife/configure.rb +0 -150
  563. data/lib/chef/knife/configure_client.rb +0 -48
  564. data/lib/chef/knife/cookbook_bulk_delete.rb +0 -71
  565. data/lib/chef/knife/cookbook_delete.rb +0 -151
  566. data/lib/chef/knife/cookbook_download.rb +0 -142
  567. data/lib/chef/knife/cookbook_list.rb +0 -47
  568. data/lib/chef/knife/cookbook_metadata.rb +0 -106
  569. data/lib/chef/knife/cookbook_metadata_from_file.rb +0 -49
  570. data/lib/chef/knife/cookbook_show.rb +0 -98
  571. data/lib/chef/knife/cookbook_upload.rb +0 -292
  572. data/lib/chef/knife/core/bootstrap_context.rb +0 -264
  573. data/lib/chef/knife/core/cookbook_scm_repo.rb +0 -159
  574. data/lib/chef/knife/core/formatting_options.rb +0 -49
  575. data/lib/chef/knife/core/gem_glob_loader.rb +0 -138
  576. data/lib/chef/knife/core/generic_presenter.rb +0 -232
  577. data/lib/chef/knife/core/hashed_command_loader.rb +0 -100
  578. data/lib/chef/knife/core/node_editor.rb +0 -130
  579. data/lib/chef/knife/core/node_presenter.rb +0 -133
  580. data/lib/chef/knife/core/object_loader.rb +0 -115
  581. data/lib/chef/knife/core/status_presenter.rb +0 -147
  582. data/lib/chef/knife/core/subcommand_loader.rb +0 -203
  583. data/lib/chef/knife/core/text_formatter.rb +0 -85
  584. data/lib/chef/knife/core/ui.rb +0 -338
  585. data/lib/chef/knife/core/windows_bootstrap_context.rb +0 -405
  586. data/lib/chef/knife/data_bag_create.rb +0 -81
  587. data/lib/chef/knife/data_bag_delete.rb +0 -49
  588. data/lib/chef/knife/data_bag_edit.rb +0 -74
  589. data/lib/chef/knife/data_bag_from_file.rb +0 -113
  590. data/lib/chef/knife/data_bag_list.rb +0 -42
  591. data/lib/chef/knife/data_bag_secret_options.rb +0 -122
  592. data/lib/chef/knife/data_bag_show.rb +0 -69
  593. data/lib/chef/knife/delete.rb +0 -125
  594. data/lib/chef/knife/deps.rb +0 -156
  595. data/lib/chef/knife/diff.rb +0 -83
  596. data/lib/chef/knife/download.rb +0 -84
  597. data/lib/chef/knife/edit.rb +0 -88
  598. data/lib/chef/knife/environment_compare.rb +0 -128
  599. data/lib/chef/knife/environment_create.rb +0 -52
  600. data/lib/chef/knife/environment_delete.rb +0 -44
  601. data/lib/chef/knife/environment_edit.rb +0 -44
  602. data/lib/chef/knife/environment_from_file.rb +0 -84
  603. data/lib/chef/knife/environment_list.rb +0 -41
  604. data/lib/chef/knife/environment_show.rb +0 -47
  605. data/lib/chef/knife/exec.rb +0 -99
  606. data/lib/chef/knife/group_add.rb +0 -55
  607. data/lib/chef/knife/group_create.rb +0 -49
  608. data/lib/chef/knife/group_destroy.rb +0 -53
  609. data/lib/chef/knife/group_list.rb +0 -43
  610. data/lib/chef/knife/group_remove.rb +0 -56
  611. data/lib/chef/knife/group_show.rb +0 -49
  612. data/lib/chef/knife/key_create.rb +0 -112
  613. data/lib/chef/knife/key_create_base.rb +0 -50
  614. data/lib/chef/knife/key_delete.rb +0 -55
  615. data/lib/chef/knife/key_edit.rb +0 -118
  616. data/lib/chef/knife/key_edit_base.rb +0 -55
  617. data/lib/chef/knife/key_list.rb +0 -90
  618. data/lib/chef/knife/key_list_base.rb +0 -45
  619. data/lib/chef/knife/key_show.rb +0 -53
  620. data/lib/chef/knife/list.rb +0 -177
  621. data/lib/chef/knife/node_bulk_delete.rb +0 -75
  622. data/lib/chef/knife/node_create.rb +0 -47
  623. data/lib/chef/knife/node_delete.rb +0 -46
  624. data/lib/chef/knife/node_edit.rb +0 -70
  625. data/lib/chef/knife/node_environment_set.rb +0 -53
  626. data/lib/chef/knife/node_from_file.rb +0 -51
  627. data/lib/chef/knife/node_list.rb +0 -44
  628. data/lib/chef/knife/node_policy_set.rb +0 -79
  629. data/lib/chef/knife/node_run_list_add.rb +0 -104
  630. data/lib/chef/knife/node_run_list_remove.rb +0 -67
  631. data/lib/chef/knife/node_run_list_set.rb +0 -66
  632. data/lib/chef/knife/node_show.rb +0 -63
  633. data/lib/chef/knife/null.rb +0 -12
  634. data/lib/chef/knife/raw.rb +0 -123
  635. data/lib/chef/knife/recipe_list.rb +0 -32
  636. data/lib/chef/knife/rehash.rb +0 -50
  637. data/lib/chef/knife/role_bulk_delete.rb +0 -66
  638. data/lib/chef/knife/role_create.rb +0 -53
  639. data/lib/chef/knife/role_delete.rb +0 -46
  640. data/lib/chef/knife/role_edit.rb +0 -45
  641. data/lib/chef/knife/role_env_run_list_add.rb +0 -87
  642. data/lib/chef/knife/role_env_run_list_clear.rb +0 -55
  643. data/lib/chef/knife/role_env_run_list_remove.rb +0 -57
  644. data/lib/chef/knife/role_env_run_list_replace.rb +0 -60
  645. data/lib/chef/knife/role_env_run_list_set.rb +0 -70
  646. data/lib/chef/knife/role_from_file.rb +0 -51
  647. data/lib/chef/knife/role_list.rb +0 -42
  648. data/lib/chef/knife/role_run_list_add.rb +0 -87
  649. data/lib/chef/knife/role_run_list_clear.rb +0 -55
  650. data/lib/chef/knife/role_run_list_remove.rb +0 -56
  651. data/lib/chef/knife/role_run_list_replace.rb +0 -60
  652. data/lib/chef/knife/role_run_list_set.rb +0 -69
  653. data/lib/chef/knife/role_show.rb +0 -48
  654. data/lib/chef/knife/search.rb +0 -194
  655. data/lib/chef/knife/serve.rb +0 -65
  656. data/lib/chef/knife/show.rb +0 -72
  657. data/lib/chef/knife/ssh.rb +0 -645
  658. data/lib/chef/knife/ssl_check.rb +0 -284
  659. data/lib/chef/knife/ssl_fetch.rb +0 -161
  660. data/lib/chef/knife/status.rb +0 -95
  661. data/lib/chef/knife/supermarket_download.rb +0 -121
  662. data/lib/chef/knife/supermarket_install.rb +0 -192
  663. data/lib/chef/knife/supermarket_list.rb +0 -76
  664. data/lib/chef/knife/supermarket_search.rb +0 -53
  665. data/lib/chef/knife/supermarket_share.rb +0 -166
  666. data/lib/chef/knife/supermarket_show.rb +0 -66
  667. data/lib/chef/knife/supermarket_unshare.rb +0 -61
  668. data/lib/chef/knife/tag_create.rb +0 -52
  669. data/lib/chef/knife/tag_delete.rb +0 -60
  670. data/lib/chef/knife/tag_list.rb +0 -47
  671. data/lib/chef/knife/upload.rb +0 -86
  672. data/lib/chef/knife/user_create.rb +0 -107
  673. data/lib/chef/knife/user_delete.rb +0 -44
  674. data/lib/chef/knife/user_dissociate.rb +0 -42
  675. data/lib/chef/knife/user_edit.rb +0 -52
  676. data/lib/chef/knife/user_invite_add.rb +0 -43
  677. data/lib/chef/knife/user_invite_list.rb +0 -34
  678. data/lib/chef/knife/user_invite_rescind.rb +0 -63
  679. data/lib/chef/knife/user_key_create.rb +0 -73
  680. data/lib/chef/knife/user_key_delete.rb +0 -80
  681. data/lib/chef/knife/user_key_edit.rb +0 -83
  682. data/lib/chef/knife/user_key_list.rb +0 -73
  683. data/lib/chef/knife/user_key_show.rb +0 -80
  684. data/lib/chef/knife/user_list.rb +0 -42
  685. data/lib/chef/knife/user_reregister.rb +0 -59
  686. data/lib/chef/knife/user_show.rb +0 -48
  687. data/lib/chef/knife/xargs.rb +0 -282
  688. data/lib/chef/knife/yaml_convert.rb +0 -91
  689. data/lib/chef/knife.rb +0 -665
  690. data/lib/chef/resource/user/dscl_user.rb +0 -35
  691. data/spec/data/knife-home/.chef/plugins/knife/example_home_subcommand.rb +0 -0
  692. data/spec/data/knife-site-subcommands/plugins/knife/example_subcommand.rb +0 -0
  693. data/spec/data/knife_subcommand/test_explicit_category.rb +0 -7
  694. data/spec/data/knife_subcommand/test_name_mapping.rb +0 -4
  695. data/spec/data/knife_subcommand/test_yourself.rb +0 -21
  696. data/spec/functional/assets/yumrepo-empty/repodata/01a3b-filelists.sqlite.bz2 +0 -0
  697. data/spec/functional/assets/yumrepo-empty/repodata/401dc-filelists.xml.gz +0 -0
  698. data/spec/functional/assets/yumrepo-empty/repodata/5dc1e-primary.sqlite.bz2 +0 -0
  699. data/spec/functional/assets/yumrepo-empty/repodata/6bf96-other.xml.gz +0 -0
  700. data/spec/functional/assets/yumrepo-empty/repodata/7c365-other.sqlite.bz2 +0 -0
  701. data/spec/functional/assets/yumrepo-empty/repodata/dabe2-primary.xml.gz +0 -0
  702. data/spec/functional/assets/yumrepo-empty/repodata/repomd.xml +0 -55
  703. data/spec/functional/knife/configure_spec.rb +0 -33
  704. data/spec/functional/knife/cookbook_delete_spec.rb +0 -156
  705. data/spec/functional/knife/exec_spec.rb +0 -55
  706. data/spec/functional/knife/rehash_spec.rb +0 -39
  707. data/spec/functional/knife/smoke_test.rb +0 -42
  708. data/spec/functional/knife/ssh_spec.rb +0 -352
  709. data/spec/functional/resource/user/dscl_spec.rb +0 -188
  710. data/spec/functional/resource/windows_service_spec.rb +0 -105
  711. data/spec/functional/win32/service_manager_spec.rb +0 -220
  712. data/spec/integration/client/fips_spec.rb +0 -21
  713. data/spec/integration/knife/chef_fs_data_store_spec.rb +0 -557
  714. data/spec/integration/knife/chef_repo_path_spec.rb +0 -962
  715. data/spec/integration/knife/chef_repository_file_system_spec.rb +0 -200
  716. data/spec/integration/knife/chefignore_spec.rb +0 -301
  717. data/spec/integration/knife/client_bulk_delete_spec.rb +0 -131
  718. data/spec/integration/knife/client_create_spec.rb +0 -70
  719. data/spec/integration/knife/client_delete_spec.rb +0 -64
  720. data/spec/integration/knife/client_key_create_spec.rb +0 -66
  721. data/spec/integration/knife/client_key_delete_spec.rb +0 -43
  722. data/spec/integration/knife/client_key_list_spec.rb +0 -61
  723. data/spec/integration/knife/client_key_show_spec.rb +0 -45
  724. data/spec/integration/knife/client_list_spec.rb +0 -49
  725. data/spec/integration/knife/client_show_spec.rb +0 -37
  726. data/spec/integration/knife/common_options_spec.rb +0 -174
  727. data/spec/integration/knife/config_list_spec.rb +0 -220
  728. data/spec/integration/knife/config_show_spec.rb +0 -192
  729. data/spec/integration/knife/config_use_spec.rb +0 -198
  730. data/spec/integration/knife/cookbook_api_ipv6_spec.rb +0 -113
  731. data/spec/integration/knife/cookbook_bulk_delete_spec.rb +0 -65
  732. data/spec/integration/knife/cookbook_download_spec.rb +0 -72
  733. data/spec/integration/knife/cookbook_list_spec.rb +0 -55
  734. data/spec/integration/knife/cookbook_show_spec.rb +0 -149
  735. data/spec/integration/knife/cookbook_upload_spec.rb +0 -128
  736. data/spec/integration/knife/data_bag_create_spec.rb +0 -125
  737. data/spec/integration/knife/data_bag_delete_spec.rb +0 -59
  738. data/spec/integration/knife/data_bag_edit_spec.rb +0 -105
  739. data/spec/integration/knife/data_bag_from_file_spec.rb +0 -116
  740. data/spec/integration/knife/data_bag_list_spec.rb +0 -44
  741. data/spec/integration/knife/data_bag_show_spec.rb +0 -95
  742. data/spec/integration/knife/delete_spec.rb +0 -1018
  743. data/spec/integration/knife/deps_spec.rb +0 -703
  744. data/spec/integration/knife/diff_spec.rb +0 -605
  745. data/spec/integration/knife/download_spec.rb +0 -1336
  746. data/spec/integration/knife/environment_compare_spec.rb +0 -75
  747. data/spec/integration/knife/environment_create_spec.rb +0 -41
  748. data/spec/integration/knife/environment_delete_spec.rb +0 -37
  749. data/spec/integration/knife/environment_from_file_spec.rb +0 -116
  750. data/spec/integration/knife/environment_list_spec.rb +0 -42
  751. data/spec/integration/knife/environment_show_spec.rb +0 -77
  752. data/spec/integration/knife/list_spec.rb +0 -1060
  753. data/spec/integration/knife/node_bulk_delete_spec.rb +0 -52
  754. data/spec/integration/knife/node_create_spec.rb +0 -47
  755. data/spec/integration/knife/node_delete_spec.rb +0 -48
  756. data/spec/integration/knife/node_environment_set_spec.rb +0 -46
  757. data/spec/integration/knife/node_from_file_spec.rb +0 -59
  758. data/spec/integration/knife/node_list_spec.rb +0 -45
  759. data/spec/integration/knife/node_run_list_add_spec.rb +0 -54
  760. data/spec/integration/knife/node_run_list_remove_spec.rb +0 -36
  761. data/spec/integration/knife/node_run_list_set_spec.rb +0 -41
  762. data/spec/integration/knife/node_show_spec.rb +0 -36
  763. data/spec/integration/knife/raw_spec.rb +0 -297
  764. data/spec/integration/knife/redirection_spec.rb +0 -64
  765. data/spec/integration/knife/role_bulk_delete_spec.rb +0 -52
  766. data/spec/integration/knife/role_create_spec.rb +0 -41
  767. data/spec/integration/knife/role_delete_spec.rb +0 -48
  768. data/spec/integration/knife/role_from_file_spec.rb +0 -96
  769. data/spec/integration/knife/role_list_spec.rb +0 -45
  770. data/spec/integration/knife/role_show_spec.rb +0 -51
  771. data/spec/integration/knife/search_node_spec.rb +0 -40
  772. data/spec/integration/knife/serve_spec.rb +0 -92
  773. data/spec/integration/knife/show_spec.rb +0 -197
  774. data/spec/integration/knife/upload_spec.rb +0 -1616
  775. data/spec/support/shared/functional/knife.rb +0 -37
  776. data/spec/support/shared/functional/win32_service.rb +0 -57
  777. data/spec/support/shared/integration/knife_support.rb +0 -192
  778. data/spec/support/shared/unit/knife_shared.rb +0 -39
  779. data/spec/unit/application/knife_spec.rb +0 -241
  780. data/spec/unit/chef_fs/parallelizer_spec.rb +0 -479
  781. data/spec/unit/cookbook_site_streaming_uploader_spec.rb +0 -198
  782. data/spec/unit/knife/bootstrap/chef_vault_handler_spec.rb +0 -152
  783. data/spec/unit/knife/bootstrap/client_builder_spec.rb +0 -207
  784. data/spec/unit/knife/bootstrap/train_connector_spec.rb +0 -244
  785. data/spec/unit/knife/bootstrap_spec.rb +0 -2220
  786. data/spec/unit/knife/client_bulk_delete_spec.rb +0 -166
  787. data/spec/unit/knife/client_create_spec.rb +0 -169
  788. data/spec/unit/knife/client_delete_spec.rb +0 -99
  789. data/spec/unit/knife/client_edit_spec.rb +0 -53
  790. data/spec/unit/knife/client_list_spec.rb +0 -34
  791. data/spec/unit/knife/client_reregister_spec.rb +0 -62
  792. data/spec/unit/knife/client_show_spec.rb +0 -52
  793. data/spec/unit/knife/configure_client_spec.rb +0 -81
  794. data/spec/unit/knife/configure_spec.rb +0 -190
  795. data/spec/unit/knife/cookbook_bulk_delete_spec.rb +0 -87
  796. data/spec/unit/knife/cookbook_delete_spec.rb +0 -239
  797. data/spec/unit/knife/cookbook_download_spec.rb +0 -255
  798. data/spec/unit/knife/cookbook_list_spec.rb +0 -88
  799. data/spec/unit/knife/cookbook_metadata_from_file_spec.rb +0 -72
  800. data/spec/unit/knife/cookbook_metadata_spec.rb +0 -182
  801. data/spec/unit/knife/cookbook_show_spec.rb +0 -253
  802. data/spec/unit/knife/cookbook_upload_spec.rb +0 -364
  803. data/spec/unit/knife/core/bootstrap_context_spec.rb +0 -287
  804. data/spec/unit/knife/core/cookbook_scm_repo_spec.rb +0 -187
  805. data/spec/unit/knife/core/gem_glob_loader_spec.rb +0 -209
  806. data/spec/unit/knife/core/hashed_command_loader_spec.rb +0 -112
  807. data/spec/unit/knife/core/node_editor_spec.rb +0 -211
  808. data/spec/unit/knife/core/object_loader_spec.rb +0 -81
  809. data/spec/unit/knife/core/status_presenter_spec.rb +0 -54
  810. data/spec/unit/knife/core/subcommand_loader_spec.rb +0 -64
  811. data/spec/unit/knife/core/ui_spec.rb +0 -656
  812. data/spec/unit/knife/core/windows_bootstrap_context_spec.rb +0 -238
  813. data/spec/unit/knife/data_bag_create_spec.rb +0 -175
  814. data/spec/unit/knife/data_bag_edit_spec.rb +0 -126
  815. data/spec/unit/knife/data_bag_from_file_spec.rb +0 -174
  816. data/spec/unit/knife/data_bag_secret_options_spec.rb +0 -173
  817. data/spec/unit/knife/data_bag_show_spec.rb +0 -139
  818. data/spec/unit/knife/environment_compare_spec.rb +0 -112
  819. data/spec/unit/knife/environment_create_spec.rb +0 -91
  820. data/spec/unit/knife/environment_delete_spec.rb +0 -71
  821. data/spec/unit/knife/environment_edit_spec.rb +0 -79
  822. data/spec/unit/knife/environment_from_file_spec.rb +0 -90
  823. data/spec/unit/knife/environment_list_spec.rb +0 -54
  824. data/spec/unit/knife/environment_show_spec.rb +0 -52
  825. data/spec/unit/knife/key_create_spec.rb +0 -223
  826. data/spec/unit/knife/key_delete_spec.rb +0 -133
  827. data/spec/unit/knife/key_edit_spec.rb +0 -264
  828. data/spec/unit/knife/key_helper.rb +0 -74
  829. data/spec/unit/knife/key_list_spec.rb +0 -216
  830. data/spec/unit/knife/key_show_spec.rb +0 -126
  831. data/spec/unit/knife/node_bulk_delete_spec.rb +0 -94
  832. data/spec/unit/knife/node_delete_spec.rb +0 -77
  833. data/spec/unit/knife/node_edit_spec.rb +0 -116
  834. data/spec/unit/knife/node_environment_set_spec.rb +0 -61
  835. data/spec/unit/knife/node_from_file_spec.rb +0 -59
  836. data/spec/unit/knife/node_list_spec.rb +0 -62
  837. data/spec/unit/knife/node_policy_set_spec.rb +0 -122
  838. data/spec/unit/knife/node_run_list_add_spec.rb +0 -145
  839. data/spec/unit/knife/node_run_list_remove_spec.rb +0 -106
  840. data/spec/unit/knife/node_run_list_set_spec.rb +0 -115
  841. data/spec/unit/knife/node_show_spec.rb +0 -65
  842. data/spec/unit/knife/raw_spec.rb +0 -43
  843. data/spec/unit/knife/role_bulk_delete_spec.rb +0 -80
  844. data/spec/unit/knife/role_create_spec.rb +0 -80
  845. data/spec/unit/knife/role_delete_spec.rb +0 -67
  846. data/spec/unit/knife/role_edit_spec.rb +0 -77
  847. data/spec/unit/knife/role_env_run_list_add_spec.rb +0 -217
  848. data/spec/unit/knife/role_env_run_list_clear_spec.rb +0 -94
  849. data/spec/unit/knife/role_env_run_list_remove_spec.rb +0 -102
  850. data/spec/unit/knife/role_env_run_list_replace_spec.rb +0 -105
  851. data/spec/unit/knife/role_env_run_list_set_spec.rb +0 -99
  852. data/spec/unit/knife/role_from_file_spec.rb +0 -69
  853. data/spec/unit/knife/role_list_spec.rb +0 -54
  854. data/spec/unit/knife/role_run_list_add_spec.rb +0 -179
  855. data/spec/unit/knife/role_run_list_clear_spec.rb +0 -84
  856. data/spec/unit/knife/role_run_list_remove_spec.rb +0 -92
  857. data/spec/unit/knife/role_run_list_replace_spec.rb +0 -98
  858. data/spec/unit/knife/role_run_list_set_spec.rb +0 -89
  859. data/spec/unit/knife/role_show_spec.rb +0 -59
  860. data/spec/unit/knife/ssh_spec.rb +0 -403
  861. data/spec/unit/knife/ssl_check_spec.rb +0 -256
  862. data/spec/unit/knife/ssl_fetch_spec.rb +0 -222
  863. data/spec/unit/knife/status_spec.rb +0 -112
  864. data/spec/unit/knife/supermarket_download_spec.rb +0 -152
  865. data/spec/unit/knife/supermarket_install_spec.rb +0 -202
  866. data/spec/unit/knife/supermarket_list_spec.rb +0 -70
  867. data/spec/unit/knife/supermarket_search_spec.rb +0 -85
  868. data/spec/unit/knife/supermarket_share_spec.rb +0 -208
  869. data/spec/unit/knife/supermarket_unshare_spec.rb +0 -78
  870. data/spec/unit/knife/tag_create_spec.rb +0 -23
  871. data/spec/unit/knife/tag_delete_spec.rb +0 -25
  872. data/spec/unit/knife/tag_list_spec.rb +0 -23
  873. data/spec/unit/knife/user_create_spec.rb +0 -184
  874. data/spec/unit/knife/user_delete_spec.rb +0 -46
  875. data/spec/unit/knife/user_edit_spec.rb +0 -48
  876. data/spec/unit/knife/user_list_spec.rb +0 -36
  877. data/spec/unit/knife/user_reregister_spec.rb +0 -56
  878. data/spec/unit/knife/user_show_spec.rb +0 -46
  879. data/spec/unit/knife_spec.rb +0 -634
  880. data/spec/unit/provider/user/dscl_spec.rb +0 -699
  881. data/spec/unit/windows_service_spec.rb +0 -118
@@ -1,2220 +0,0 @@
1
- #
2
- # Author:: Ian Meyer (<ianmmeyer@gmail.com>)
3
- # Copyright:: Copyright 2010-2016, Ian Meyer
4
- # Copyright:: Copyright (c) Chef Software Inc.
5
- # License:: Apache License, Version 2.0
6
- #
7
- # Licensed under the Apache License, Version 2.0 (the "License");
8
- # you may not use this file except in compliance with the License.
9
- # You may obtain a copy of the License at
10
- #
11
- # http://www.apache.org/licenses/LICENSE-2.0
12
- #
13
- # Unless required by applicable law or agreed to in writing, software
14
- # distributed under the License is distributed on an "AS IS" BASIS,
15
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
- # See the License for the specific language governing permissions and
17
- # limitations under the License.
18
- #
19
-
20
- require "spec_helper"
21
-
22
- Chef::Knife::Bootstrap.load_deps
23
-
24
- describe Chef::Knife::Bootstrap do
25
- let(:bootstrap_template) { nil }
26
- let(:stderr) { StringIO.new }
27
- let(:bootstrap_cli_options) { [ ] }
28
- let(:linux_test) { true }
29
- let(:windows_test) { false }
30
- let(:linux_test) { false }
31
- let(:unix_test) { false }
32
- let(:ssh_test) { false }
33
-
34
- let(:connection) do
35
- double("TrainConnector",
36
- windows?: windows_test,
37
- linux?: linux_test,
38
- unix?: unix_test)
39
- end
40
-
41
- let(:knife) do
42
- Chef::Log.logger = Logger.new(StringIO.new)
43
- Chef::Config[:knife][:bootstrap_template] = bootstrap_template unless bootstrap_template.nil?
44
-
45
- k = Chef::Knife::Bootstrap.new(bootstrap_cli_options)
46
- allow(k.ui).to receive(:stderr).and_return(stderr)
47
- allow(k).to receive(:encryption_secret_provided_ignore_encrypt_flag?).and_return(false)
48
- allow(k).to receive(:connection).and_return connection
49
- k.merge_configs
50
- k
51
- end
52
-
53
- context "#check_license" do
54
- let(:acceptor) { instance_double(LicenseAcceptance::Acceptor) }
55
-
56
- before do
57
- expect(LicenseAcceptance::Acceptor).to receive(:new).and_return(acceptor)
58
- end
59
-
60
- describe "when a license is not required" do
61
- it "does not set the chef_license" do
62
- expect(acceptor).to receive(:license_required?).and_return(false)
63
- knife.check_license
64
- expect(Chef::Config[:chef_license]).to eq(nil)
65
- end
66
- end
67
-
68
- describe "when a license is required" do
69
- it "sets the chef_license" do
70
- expect(acceptor).to receive(:license_required?).and_return(true)
71
- expect(acceptor).to receive(:id_from_mixlib).and_return("id")
72
- expect(acceptor).to receive(:check_and_persist)
73
- expect(acceptor).to receive(:acceptance_value).and_return("accept-no-persist")
74
- knife.check_license
75
- expect(Chef::Config[:chef_license]).to eq("accept-no-persist")
76
- end
77
- end
78
- end
79
-
80
- context "#bootstrap_template" do
81
- it "should default to chef-full" do
82
- expect(knife.bootstrap_template).to be_a_kind_of(String)
83
- expect(File.basename(knife.bootstrap_template)).to eq("chef-full")
84
- end
85
- end
86
-
87
- context "#render_template - when using the chef-full default template" do
88
- let(:rendered_template) do
89
- knife.merge_configs
90
- knife.render_template
91
- end
92
-
93
- it "should render client.rb" do
94
- expect(rendered_template).to match("cat > /etc/chef/client.rb <<'EOP'")
95
- expect(rendered_template).to match("chef_server_url \"https://localhost:443\"")
96
- expect(rendered_template).to match("validation_client_name \"chef-validator\"")
97
- expect(rendered_template).to match("log_location STDOUT")
98
- end
99
-
100
- it "should render first-boot.json" do
101
- expect(rendered_template).to match("cat > /etc/chef/first-boot.json <<'EOP'")
102
- expect(rendered_template).to match('{"run_list":\[\]}')
103
- end
104
-
105
- context "and encrypted_data_bag_secret was provided" do
106
- it "should render encrypted_data_bag_secret file" do
107
- expect(knife).to receive(:encryption_secret_provided_ignore_encrypt_flag?).and_return(true)
108
- expect(knife).to receive(:read_secret).and_return("secrets")
109
- expect(rendered_template).to match("cat > /etc/chef/encrypted_data_bag_secret <<'EOP'")
110
- expect(rendered_template).to match('{"run_list":\[\]}')
111
- expect(rendered_template).to match(/secrets/)
112
- end
113
- end
114
- end
115
-
116
- context "with --bootstrap-vault-item" do
117
- let(:bootstrap_cli_options) { [ "--bootstrap-vault-item", "vault1:item1", "--bootstrap-vault-item", "vault1:item2", "--bootstrap-vault-item", "vault2:item1" ] }
118
- it "sets the knife config cli option correctly" do
119
- expect(knife.config[:bootstrap_vault_item]).to eq({ "vault1" => %w{item1 item2}, "vault2" => ["item1"] })
120
- end
121
- end
122
-
123
- context "with --bootstrap-preinstall-command" do
124
- command = "while sudo fuser /var/lib/dpkg/lock >/dev/null 2>&1; do\n echo 'waiting for dpkg lock';\n sleep 1;\n done;"
125
- let(:bootstrap_cli_options) { [ "--bootstrap-preinstall-command", command ] }
126
- let(:rendered_template) do
127
- knife.merge_configs
128
- knife.render_template
129
- end
130
- it "configures the preinstall command in the bootstrap template correctly" do
131
- expect(rendered_template).to match(/command/)
132
- end
133
- end
134
-
135
- context "with --bootstrap-proxy" do
136
- let(:bootstrap_cli_options) { [ "--bootstrap-proxy", "1.1.1.1" ] }
137
- let(:rendered_template) do
138
- knife.merge_configs
139
- knife.render_template
140
- end
141
- it "configures the https_proxy environment variable in the bootstrap template correctly" do
142
- expect(rendered_template).to match(/https_proxy="1.1.1.1" export https_proxy/)
143
- end
144
- end
145
-
146
- context "with --bootstrap-no-proxy" do
147
- let(:bootstrap_cli_options) { [ "--bootstrap-no-proxy", "localserver" ] }
148
- let(:rendered_template) do
149
- knife.merge_configs
150
- knife.render_template
151
- end
152
- it "configures the https_proxy environment variable in the bootstrap template correctly" do
153
- expect(rendered_template).to match(/no_proxy="localserver" export no_proxy/)
154
- end
155
- end
156
-
157
- context "with :bootstrap_template and :template_file cli options" do
158
- let(:bootstrap_cli_options) { [ "--bootstrap-template", "my-template", "other-template" ] }
159
-
160
- it "should select bootstrap template" do
161
- expect(File.basename(knife.bootstrap_template)).to eq("my-template")
162
- end
163
- end
164
-
165
- context "when finding templates" do
166
- context "when :bootstrap_template config is set to a file" do
167
- context "that doesn't exist" do
168
- let(:bootstrap_template) { "/opt/blah/not/exists/template.erb" }
169
-
170
- it "raises an error" do
171
- expect { knife.find_template }.to raise_error(Errno::ENOENT)
172
- end
173
- end
174
-
175
- context "that exists" do
176
- let(:bootstrap_template) { File.expand_path(File.join(CHEF_SPEC_DATA, "bootstrap", "test.erb")) }
177
-
178
- it "loads the given file as the template" do
179
- expect(Chef::Log).to receive(:trace)
180
- expect(knife.find_template).to eq(File.expand_path(File.join(CHEF_SPEC_DATA, "bootstrap", "test.erb")))
181
- end
182
- end
183
- end
184
-
185
- context "when :bootstrap_template config is set to a template name" do
186
- let(:bootstrap_template) { "example" }
187
-
188
- let(:builtin_template_path) { File.expand_path(File.join(__dir__, "../../../lib/chef/knife/bootstrap/templates", "example.erb")) }
189
-
190
- let(:chef_config_dir_template_path) { "/knife/chef/config/bootstrap/example.erb" }
191
-
192
- let(:env_home_template_path) { "/env/home/.chef/bootstrap/example.erb" }
193
-
194
- let(:gem_files_template_path) { "/Users/schisamo/.rvm/gems/ruby-1.9.2-p180@chef-0.10/gems/knife-windows-0.5.4/lib/chef/knife/bootstrap/fake-bootstrap-template.erb" }
195
-
196
- def configure_chef_config_dir
197
- allow(Chef::Knife).to receive(:chef_config_dir).and_return("/knife/chef/config")
198
- end
199
-
200
- def configure_env_home
201
- allow(Chef::Util::PathHelper).to receive(:home).with(".chef", "bootstrap", "example.erb").and_yield(env_home_template_path)
202
- end
203
-
204
- def configure_gem_files
205
- allow(Gem).to receive(:find_files).and_return([ gem_files_template_path ])
206
- end
207
-
208
- before(:each) do
209
- expect(File).to receive(:exist?).with(bootstrap_template).and_return(false)
210
- end
211
-
212
- context "when file is available everywhere" do
213
- before do
214
- configure_chef_config_dir
215
- configure_env_home
216
- configure_gem_files
217
-
218
- expect(File).to receive(:exist?).with(builtin_template_path).and_return(true)
219
- end
220
-
221
- it "should load the template from built-in templates" do
222
- expect(knife.find_template).to eq(builtin_template_path)
223
- end
224
- end
225
-
226
- context "when file is available in chef_config_dir" do
227
- before do
228
- configure_chef_config_dir
229
- configure_env_home
230
- configure_gem_files
231
-
232
- expect(File).to receive(:exist?).with(builtin_template_path).and_return(false)
233
- expect(File).to receive(:exist?).with(chef_config_dir_template_path).and_return(true)
234
-
235
- it "should load the template from chef_config_dir" do
236
- knife.find_template.should eq(chef_config_dir_template_path)
237
- end
238
- end
239
- end
240
-
241
- context "when file is available in home directory" do
242
- before do
243
- configure_chef_config_dir
244
- configure_env_home
245
- configure_gem_files
246
-
247
- expect(File).to receive(:exist?).with(builtin_template_path).and_return(false)
248
- expect(File).to receive(:exist?).with(chef_config_dir_template_path).and_return(false)
249
- expect(File).to receive(:exist?).with(env_home_template_path).and_return(true)
250
- end
251
-
252
- it "should load the template from chef_config_dir" do
253
- expect(knife.find_template).to eq(env_home_template_path)
254
- end
255
- end
256
-
257
- context "when file is available in Gem files" do
258
- before do
259
- configure_chef_config_dir
260
- configure_env_home
261
- configure_gem_files
262
-
263
- expect(File).to receive(:exist?).with(builtin_template_path).and_return(false)
264
- expect(File).to receive(:exist?).with(chef_config_dir_template_path).and_return(false)
265
- expect(File).to receive(:exist?).with(env_home_template_path).and_return(false)
266
- expect(File).to receive(:exist?).with(gem_files_template_path).and_return(true)
267
- end
268
-
269
- it "should load the template from Gem files" do
270
- expect(knife.find_template).to eq(gem_files_template_path)
271
- end
272
- end
273
-
274
- context "when file is available in Gem files and home dir doesn't exist" do
275
- before do
276
- configure_chef_config_dir
277
- configure_gem_files
278
- allow(Chef::Util::PathHelper).to receive(:home).with(".chef", "bootstrap", "example.erb").and_return(nil)
279
-
280
- expect(File).to receive(:exist?).with(builtin_template_path).and_return(false)
281
- expect(File).to receive(:exist?).with(chef_config_dir_template_path).and_return(false)
282
- expect(File).to receive(:exist?).with(gem_files_template_path).and_return(true)
283
- end
284
-
285
- it "should load the template from Gem files" do
286
- expect(knife.find_template).to eq(gem_files_template_path)
287
- end
288
- end
289
- end
290
- end
291
-
292
- ["-t", "--bootstrap-template"].each do |t|
293
- context "when #{t} option is given in the command line" do
294
- it "sets the knife :bootstrap_template config" do
295
- knife.parse_options([t, "blahblah"])
296
- knife.merge_configs
297
- expect(knife.bootstrap_template).to eq("blahblah")
298
- end
299
- end
300
- end
301
-
302
- context "with run_list template" do
303
- let(:bootstrap_template) { File.expand_path(File.join(CHEF_SPEC_DATA, "bootstrap", "test.erb")) }
304
-
305
- it "should return an empty run_list" do
306
- expect(knife.render_template).to eq('{"run_list":[]}')
307
- end
308
-
309
- it "should have role[base] in the run_list" do
310
- knife.parse_options(["-r", "role[base]"])
311
- knife.merge_configs
312
- expect(knife.render_template).to eq('{"run_list":["role[base]"]}')
313
- end
314
-
315
- it "should have role[base] and recipe[cupcakes] in the run_list" do
316
- knife.parse_options(["-r", "role[base],recipe[cupcakes]"])
317
- knife.merge_configs
318
- expect(knife.render_template).to eq('{"run_list":["role[base]","recipe[cupcakes]"]}')
319
- end
320
-
321
- context "with bootstrap_attribute options" do
322
- let(:jsonfile) do
323
- file = Tempfile.new (["node", ".json"])
324
- File.open(file.path, "w") { |f| f.puts '{"foo":{"bar":"baz"}}' }
325
- file
326
- end
327
-
328
- it "should have foo => {bar => baz} in the first_boot from cli" do
329
- knife.parse_options(["-j", '{"foo":{"bar":"baz"}}'])
330
- knife.merge_configs
331
- expected_hash = FFI_Yajl::Parser.new.parse('{"foo":{"bar":"baz"},"run_list":[]}')
332
- actual_hash = FFI_Yajl::Parser.new.parse(knife.render_template)
333
- expect(actual_hash).to eq(expected_hash)
334
- end
335
-
336
- it "should have foo => {bar => baz} in the first_boot from file" do
337
- knife.parse_options(["--json-attribute-file", jsonfile.path])
338
- knife.merge_configs
339
- expected_hash = FFI_Yajl::Parser.new.parse('{"foo":{"bar":"baz"},"run_list":[]}')
340
- actual_hash = FFI_Yajl::Parser.new.parse(knife.render_template)
341
- expect(actual_hash).to eq(expected_hash)
342
- jsonfile.close
343
- end
344
-
345
- it "raises a Chef::Exceptions::BootstrapCommandInputError with the proper error message" do
346
- knife.parse_options(["-j", '{"foo":{"bar":"baz"}}'])
347
- knife.parse_options(["--json-attribute-file", jsonfile.path])
348
- knife.merge_configs
349
- allow(knife).to receive(:validate_name_args!)
350
- expect(knife).to receive(:check_license)
351
-
352
- expect { knife.run }.to raise_error(Chef::Exceptions::BootstrapCommandInputError)
353
- jsonfile.close
354
- end
355
- end
356
- end
357
-
358
- context "with hints template" do
359
- let(:bootstrap_template) { File.expand_path(File.join(CHEF_SPEC_DATA, "bootstrap", "test-hints.erb")) }
360
-
361
- it "should create a hint file when told to" do
362
- knife.parse_options(["--hint", "openstack"])
363
- knife.merge_configs
364
- expect(knife.render_template).to match(%r{/etc/chef/ohai/hints/openstack.json})
365
- end
366
-
367
- it "should populate a hint file with JSON when given a file to read" do
368
- allow(::File).to receive(:read).and_return('{ "foo" : "bar" }')
369
- knife.parse_options(["--hint", "openstack=hints/openstack.json"])
370
- knife.merge_configs
371
- expect(knife.render_template).to match(/\{\"foo\":\"bar\"\}/)
372
- end
373
- end
374
-
375
- describe "specifying no_proxy with various entries" do
376
- subject(:knife) do
377
- k = described_class.new
378
- Chef::Config[:knife][:bootstrap_template] = template_file
379
- allow(k).to receive(:connection).and_return connection
380
- k.parse_options(options)
381
- k.merge_configs
382
- k
383
- end
384
-
385
- let(:options) { ["--bootstrap-no-proxy", setting] }
386
-
387
- let(:template_file) { File.expand_path(File.join(CHEF_SPEC_DATA, "bootstrap", "no_proxy.erb")) }
388
-
389
- let(:rendered_template) do
390
- knife.render_template
391
- end
392
-
393
- context "via --bootstrap-no-proxy" do
394
- let(:setting) { "api.opscode.com" }
395
-
396
- it "renders the client.rb with a single FQDN no_proxy entry" do
397
- expect(rendered_template).to match(/.*no_proxy\s*"api.opscode.com".*/)
398
- end
399
- end
400
-
401
- context "via --bootstrap-no-proxy multiple" do
402
- let(:setting) { "api.opscode.com,172.16.10.*" }
403
-
404
- it "renders the client.rb with comma-separated FQDN and wildcard IP address no_proxy entries" do
405
- expect(rendered_template).to match(/.*no_proxy\s*"api.opscode.com,172.16.10.\*".*/)
406
- end
407
- end
408
-
409
- context "via --ssl-verify-mode none" do
410
- let(:options) { ["--node-ssl-verify-mode", "none"] }
411
-
412
- it "renders the client.rb with ssl_verify_mode set to :verify_none" do
413
- expect(rendered_template).to match(/ssl_verify_mode :verify_none/)
414
- end
415
- end
416
-
417
- context "via --node-ssl-verify-mode peer" do
418
- let(:options) { ["--node-ssl-verify-mode", "peer"] }
419
-
420
- it "renders the client.rb with ssl_verify_mode set to :verify_peer" do
421
- expect(rendered_template).to match(/ssl_verify_mode :verify_peer/)
422
- end
423
- end
424
-
425
- context "via --node-ssl-verify-mode all" do
426
- let(:options) { ["--node-ssl-verify-mode", "all"] }
427
-
428
- it "raises error" do
429
- expect { rendered_template }.to raise_error(RuntimeError)
430
- end
431
- end
432
-
433
- context "via --node-verify-api-cert" do
434
- let(:options) { ["--node-verify-api-cert"] }
435
-
436
- it "renders the client.rb with verify_api_cert set to true" do
437
- expect(rendered_template).to match(/verify_api_cert true/)
438
- end
439
- end
440
-
441
- context "via --no-node-verify-api-cert" do
442
- let(:options) { ["--no-node-verify-api-cert"] }
443
-
444
- it "renders the client.rb with verify_api_cert set to false" do
445
- expect(rendered_template).to match(/verify_api_cert false/)
446
- end
447
- end
448
- end
449
-
450
- describe "specifying the encrypted data bag secret key" do
451
- let(:secret) { "supersekret" }
452
- let(:options) { [] }
453
- let(:bootstrap_template) { File.expand_path(File.join(CHEF_SPEC_DATA, "bootstrap", "secret.erb")) }
454
- let(:rendered_template) do
455
- knife.parse_options(options)
456
- knife.merge_configs
457
- knife.render_template
458
- end
459
-
460
- it "creates a secret file" do
461
- expect(knife).to receive(:encryption_secret_provided_ignore_encrypt_flag?).and_return(true)
462
- expect(knife).to receive(:read_secret).and_return(secret)
463
- expect(rendered_template).to match(/#{secret}/)
464
- end
465
-
466
- it "renders the client.rb with an encrypted_data_bag_secret entry" do
467
- expect(knife).to receive(:encryption_secret_provided_ignore_encrypt_flag?).and_return(true)
468
- expect(knife).to receive(:read_secret).and_return(secret)
469
- expect(rendered_template).to match(%r{encrypted_data_bag_secret\s*"/etc/chef/encrypted_data_bag_secret"})
470
- end
471
-
472
- end
473
-
474
- describe "when transferring trusted certificates" do
475
- let(:rendered_template) do
476
- knife.merge_configs
477
- knife.render_template
478
- end
479
-
480
- before do
481
- Chef::Config[:trusted_certs_dir] = Chef::Util::PathHelper.cleanpath(File.join(CHEF_SPEC_DATA, "trusted_certs"))
482
- end
483
-
484
- it "creates /etc/chef/trusted_certs" do
485
- expect(rendered_template).to match(%r{mkdir -p /etc/chef/trusted_certs})
486
- end
487
-
488
- it "copies the certificates in the directory" do
489
- certificates = Dir[File.join(Chef::Config[:trusted_certs_dir], "*.{crt,pem}")]
490
-
491
- certificates.each do |cert|
492
- expect(rendered_template).to match(%r{cat > /etc/chef/trusted_certs/#{File.basename(cert)} <<'EOP'})
493
- end
494
- end
495
-
496
- it "doesn't create /etc/chef/trusted_certs if :trusted_certs_dir is empty" do
497
- Dir.mktmpdir do |dir|
498
- Chef::Config[:trusted_certs_dir] = dir
499
- expect(rendered_template).not_to match(%r{mkdir -p /etc/chef/trusted_certs})
500
- end
501
- end
502
- end
503
-
504
- context "when doing fips things" do
505
- let(:template_file) { File.expand_path(File.join(CHEF_SPEC_DATA, "bootstrap", "no_proxy.erb")) }
506
-
507
- before do
508
- Chef::Config[:knife][:bootstrap_template] = template_file
509
- knife.merge_configs
510
- end
511
-
512
- let(:rendered_template) do
513
- knife.render_template
514
- end
515
-
516
- context "when knife is in fips mode" do
517
- before do
518
- Chef::Config[:fips] = true
519
- end
520
-
521
- it "renders 'fips true'" do
522
- expect(rendered_template).to match("fips")
523
- end
524
- end
525
-
526
- context "when knife is not in fips mode" do
527
- before do
528
- # This is required because the chef-fips pipeline does
529
- # has a default value of true for fips
530
- Chef::Config[:fips] = false
531
- end
532
-
533
- it "does not render anything about fips" do
534
- expect(rendered_template).not_to match("fips")
535
- end
536
- end
537
- end
538
-
539
- describe "when transferring client.d" do
540
-
541
- let(:rendered_template) do
542
- knife.merge_configs
543
- knife.render_template
544
- end
545
-
546
- before do
547
- Chef::Config[:client_d_dir] = client_d_dir
548
- end
549
-
550
- context "when client_d_dir is nil" do
551
- let(:client_d_dir) { nil }
552
-
553
- it "does not create /etc/chef/client.d" do
554
- expect(rendered_template).not_to match(%r{mkdir -p /etc/chef/client\.d})
555
- end
556
- end
557
-
558
- context "when client_d_dir is set" do
559
- let(:client_d_dir) do
560
- Chef::Util::PathHelper.cleanpath(
561
- File.join(__dir__, "../../data/client.d_00")
562
- )
563
- end
564
-
565
- it "creates /etc/chef/client.d" do
566
- expect(rendered_template).to match("mkdir -p /etc/chef/client\.d")
567
- end
568
-
569
- context "a flat directory structure" do
570
- it "escapes single-quotes" do
571
- expect(rendered_template).to match("cat > /etc/chef/client.d/02-strings.rb <<'EOP'")
572
- expect(rendered_template).to match("something '\\\\''/foo/bar'\\\\''")
573
- end
574
-
575
- it "creates a file 00-foo.rb" do
576
- expect(rendered_template).to match("cat > /etc/chef/client.d/00-foo.rb <<'EOP'")
577
- expect(rendered_template).to match("d6f9b976-289c-4149-baf7-81e6ffecf228")
578
- end
579
- it "creates a file bar" do
580
- expect(rendered_template).to match("cat > /etc/chef/client.d/bar <<'EOP'")
581
- expect(rendered_template).to match("1 / 0")
582
- end
583
- end
584
-
585
- context "a nested directory structure" do
586
- let(:client_d_dir) do
587
- Chef::Util::PathHelper.cleanpath(
588
- File.join(__dir__, "../../data/client.d_01")
589
- )
590
- end
591
- it "creates a file foo/bar.rb" do
592
- expect(rendered_template).to match("cat > /etc/chef/client.d/foo/bar.rb <<'EOP'")
593
- expect(rendered_template).to match("1 / 0")
594
- end
595
- end
596
- end
597
- end
598
-
599
- describe "#connection_protocol" do
600
- let(:host_descriptor) { "example.com" }
601
- let(:config) { {} }
602
- let(:knife_connection_protocol) { nil }
603
- before do
604
- allow(knife).to receive(:config).and_return config
605
- allow(knife).to receive(:host_descriptor).and_return host_descriptor
606
- if knife_connection_protocol
607
- Chef::Config[:knife][:connection_protocol] = knife_connection_protocol
608
- knife.merge_configs
609
- end
610
- end
611
-
612
- context "when protocol is part of the host argument" do
613
- let(:host_descriptor) { "winrm://myhost" }
614
-
615
- it "returns the value provided by the host argument" do
616
- expect(knife.connection_protocol).to eq "winrm"
617
- end
618
- end
619
-
620
- context "when protocol is provided via the CLI flag" do
621
- let(:config) { { connection_protocol: "winrm" } }
622
- it "returns that value" do
623
- expect(knife.connection_protocol).to eq "winrm"
624
- end
625
-
626
- end
627
- context "when protocol is provided via the host argument and the CLI flag" do
628
- let(:host_descriptor) { "ssh://example.com" }
629
- let(:config) { { connection_protocol: "winrm" } }
630
-
631
- it "returns the value provided by the host argument" do
632
- expect(knife.connection_protocol).to eq "ssh"
633
- end
634
- end
635
-
636
- context "when no explicit protocol is provided" do
637
- let(:config) { {} }
638
- let(:host_descriptor) { "example.com" }
639
- let(:knife_connection_protocol) { "winrm" }
640
- it "falls back to knife config" do
641
- expect(knife.connection_protocol).to eq "winrm"
642
- end
643
- context "and there is no knife bootstrap_protocol" do
644
- let(:knife_connection_protocol) { nil }
645
- it "falls back to 'ssh'" do
646
- expect(knife.connection_protocol).to eq "ssh"
647
- end
648
- end
649
- end
650
-
651
- end
652
-
653
- describe "#validate_protocol!" do
654
- let(:host_descriptor) { "example.com" }
655
- let(:config) { {} }
656
- let(:connection_protocol) { "ssh" }
657
- before do
658
- allow(knife).to receive(:config).and_return config
659
- allow(knife).to receive(:connection_protocol).and_return connection_protocol
660
- allow(knife).to receive(:host_descriptor).and_return host_descriptor
661
- end
662
-
663
- context "when protocol is provided both in the URL and via --protocol" do
664
-
665
- context "and they do not match" do
666
- let(:connection_protocol) { "ssh" }
667
- let(:config) { { connection_protocol: "winrm" } }
668
- it "outputs an error and exits" do
669
- expect(knife.ui).to receive(:error)
670
- expect { knife.validate_protocol! }.to raise_error SystemExit
671
- end
672
- end
673
-
674
- context "and they do match" do
675
- let(:connection_protocol) { "winrm" }
676
- let(:config) { { connection_protocol: "winrm" } }
677
- it "returns true" do
678
- expect(knife.validate_protocol!).to eq true
679
- end
680
- end
681
- end
682
-
683
- context "and the protocol is supported" do
684
-
685
- Chef::Knife::Bootstrap::SUPPORTED_CONNECTION_PROTOCOLS.each do |proto|
686
- let(:connection_protocol) { proto }
687
- it "returns true for #{proto}" do
688
- expect(knife.validate_protocol!).to eq true
689
- end
690
- end
691
- end
692
-
693
- context "and the protocol is not supported" do
694
- let(:connection_protocol) { "invalid" }
695
- it "outputs an error and exits" do
696
- expect(knife.ui).to receive(:error).with(/Unsupported protocol '#{connection_protocol}'/)
697
- expect { knife.validate_protocol! }.to raise_error SystemExit
698
- end
699
- end
700
- end
701
-
702
- describe "#validate_policy_options!" do
703
-
704
- context "when only policy_name is given" do
705
-
706
- let(:bootstrap_cli_options) { %w{ --policy-name my-app-server } }
707
-
708
- it "returns an error stating that policy_name and policy_group must be given together" do
709
- expect { knife.validate_policy_options! }.to raise_error(SystemExit)
710
- expect(stderr.string).to include("ERROR: --policy-name and --policy-group must be specified together")
711
- end
712
-
713
- end
714
-
715
- context "when only policy_group is given" do
716
-
717
- let(:bootstrap_cli_options) { %w{ --policy-group staging } }
718
-
719
- it "returns an error stating that policy_name and policy_group must be given together" do
720
- expect { knife.validate_policy_options! }.to raise_error(SystemExit)
721
- expect(stderr.string).to include("ERROR: --policy-name and --policy-group must be specified together")
722
- end
723
-
724
- end
725
-
726
- context "when both policy_name and policy_group are given, but run list is also given" do
727
-
728
- let(:bootstrap_cli_options) { %w{ --policy-name my-app --policy-group staging --run-list cookbook } }
729
-
730
- it "returns an error stating that policyfile and run_list are exclusive" do
731
- expect { knife.validate_policy_options! }.to raise_error(SystemExit)
732
- expect(stderr.string).to include("ERROR: Policyfile options and --run-list are exclusive")
733
- end
734
-
735
- end
736
-
737
- context "when policy_name and policy_group are given with no conflicting options" do
738
-
739
- let(:bootstrap_cli_options) { %w{ --policy-name my-app --policy-group staging } }
740
-
741
- it "passes options validation" do
742
- expect { knife.validate_policy_options! }.to_not raise_error
743
- end
744
-
745
- it "passes them into the bootstrap context" do
746
- expect(knife.bootstrap_context.first_boot).to have_key(:policy_name)
747
- expect(knife.bootstrap_context.first_boot).to have_key(:policy_group)
748
- end
749
-
750
- it "ensures that run_list is not set in the bootstrap context" do
751
- expect(knife.bootstrap_context.first_boot).to_not have_key(:run_list)
752
- end
753
-
754
- end
755
-
756
- # https://github.com/chef/chef/issues/4131
757
- # Arguably a bug in the plugin: it shouldn't be setting this to nil, but it
758
- # worked before, so make it work now.
759
- context "when a plugin sets the run list option to nil" do
760
- before do
761
- knife.config[:run_list] = nil
762
- end
763
-
764
- it "passes options validation" do
765
- expect { knife.validate_policy_options! }.to_not raise_error
766
- end
767
- end
768
- end
769
-
770
- # TODO - this is the only cli option we validate the _option_ itself -
771
- # so we'll know if someone accidentally deletes or renames use_sudo_password
772
- # Is this worht keeping? If so, then it seems we should expand it
773
- # to cover all options.
774
- context "validating use_sudo_password option" do
775
- it "use_sudo_password contains description and long params for help" do
776
- expect(knife.options).to(have_key(:use_sudo_password)) \
777
- && expect(knife.options[:use_sudo_password][:description].to_s).not_to(eq(""))\
778
- && expect(knife.options[:use_sudo_password][:long].to_s).not_to(eq(""))
779
- end
780
- end
781
-
782
- context "#connection_opts" do
783
- let(:connection_protocol) { "ssh" }
784
- before do
785
- allow(knife).to receive(:connection_protocol).and_return connection_protocol
786
- end
787
- context "behavioral test: " do
788
- let(:expected_connection_opts) do
789
- { base_opts: true,
790
- ssh_identity_opts: true,
791
- ssh_opts: true,
792
- gateway_opts: true,
793
- host_verify_opts: true,
794
- sudo_opts: true,
795
- winrm_opts: true }
796
- end
797
-
798
- it "queries and merges only expected configurations" do
799
- expect(knife).to receive(:base_opts).and_return({ base_opts: true })
800
- expect(knife).to receive(:host_verify_opts).and_return({ host_verify_opts: true })
801
- expect(knife).to receive(:gateway_opts).and_return({ gateway_opts: true })
802
- expect(knife).to receive(:sudo_opts).and_return({ sudo_opts: true })
803
- expect(knife).to receive(:winrm_opts).and_return({ winrm_opts: true })
804
- expect(knife).to receive(:ssh_opts).and_return({ ssh_opts: true })
805
- expect(knife).to receive(:ssh_identity_opts).and_return({ ssh_identity_opts: true })
806
- expect(knife.connection_opts).to match expected_connection_opts
807
- end
808
- end
809
-
810
- context "functional test: " do
811
- context "when protocol is winrm" do
812
- let(:connection_protocol) { "winrm" }
813
- # context "and neither CLI nor Chef::Config config entries have been provided"
814
- # end
815
- context "and all supported values are provided as Chef::Config entries" do
816
- before do
817
- # Set everything to easily identifiable and obviously fake values
818
- # to verify that Chef::Config is being sourced instead of knife.config
819
- knife.config = {}
820
- Chef::Config[:knife][:max_wait] = 9999
821
- Chef::Config[:knife][:winrm_user] = "winbob"
822
- Chef::Config[:knife][:winrm_port] = 9999
823
- Chef::Config[:knife][:ca_trust_file] = "trust.me"
824
- Chef::Config[:knife][:kerberos_realm] = "realm"
825
- Chef::Config[:knife][:kerberos_service] = "service"
826
- Chef::Config[:knife][:winrm_auth_method] = "kerberos" # default is negotiate
827
- Chef::Config[:knife][:winrm_basic_auth_only] = true
828
- Chef::Config[:knife][:winrm_no_verify_cert] = true
829
- Chef::Config[:knife][:session_timeout] = 9999
830
- Chef::Config[:knife][:winrm_ssl] = true
831
- Chef::Config[:knife][:winrm_ssl_peer_fingerprint] = "ABCDEF"
832
- end
833
-
834
- context "and no CLI options have been given" do
835
- let(:expected_result) do
836
- {
837
- logger: Chef::Log, # not configurable
838
- ca_trust_path: "trust.me",
839
- max_wait_until_ready: 9999,
840
- operation_timeout: 9999,
841
- ssl_peer_fingerprint: "ABCDEF",
842
- winrm_transport: "kerberos",
843
- winrm_basic_auth_only: true,
844
- user: "winbob",
845
- port: 9999,
846
- self_signed: true,
847
- ssl: true,
848
- kerberos_realm: "realm",
849
- kerberos_service: "service",
850
- }
851
- end
852
-
853
- it "generates a config hash using the Chef::Config values" do
854
- knife.merge_configs
855
- expect(knife.connection_opts).to match expected_result
856
- end
857
-
858
- end
859
-
860
- context "and some CLI options have been given" do
861
- let(:expected_result) do
862
- {
863
- logger: Chef::Log, # not configurable
864
- ca_trust_path: "no trust",
865
- max_wait_until_ready: 9999,
866
- operation_timeout: 9999,
867
- ssl_peer_fingerprint: "ABCDEF",
868
- winrm_transport: "kerberos",
869
- winrm_basic_auth_only: true,
870
- user: "microsoftbob",
871
- port: 12,
872
- self_signed: true,
873
- ssl: true,
874
- kerberos_realm: "realm",
875
- kerberos_service: "service",
876
- password: "lobster",
877
- }
878
- end
879
-
880
- before do
881
- knife.config[:ca_trust_file] = "no trust"
882
- knife.config[:connection_user] = "microsoftbob"
883
- knife.config[:connection_port] = 12
884
- knife.config[:winrm_port] = "13" # indirectly verify we're not looking for the wrong CLI flag
885
- knife.config[:connection_password] = "lobster"
886
- end
887
-
888
- it "generates a config hash using the CLI options when available and falling back to Chef::Config values" do
889
- knife.merge_configs
890
- expect(knife.connection_opts).to match expected_result
891
- end
892
- end
893
-
894
- context "and all CLI options have been given" do
895
- before do
896
- # We'll force kerberos vi knife.config because it
897
- # causes additional options to populate - make sure
898
- # Chef::Config is different so we can be sure that we didn't
899
- # pull in the Chef::Config value
900
- Chef::Config[:knife][:winrm_auth_method] = "negotiate"
901
- knife.config[:connection_password] = "blue"
902
- knife.config[:max_wait] = 1000
903
- knife.config[:connection_user] = "clippy"
904
- knife.config[:connection_port] = 1000
905
- knife.config[:winrm_port] = 1001 # We should not see this value get used
906
-
907
- knife.config[:ca_trust_file] = "trust.the.internet"
908
- knife.config[:kerberos_realm] = "otherrealm"
909
- knife.config[:kerberos_service] = "otherservice"
910
- knife.config[:winrm_auth_method] = "kerberos" # default is negotiate
911
- knife.config[:winrm_basic_auth_only] = false
912
- knife.config[:winrm_no_verify_cert] = false
913
- knife.config[:session_timeout] = 1000
914
- knife.config[:winrm_ssl] = false
915
- knife.config[:winrm_ssl_peer_fingerprint] = "FEDCBA"
916
- end
917
- let(:expected_result) do
918
- {
919
- logger: Chef::Log, # not configurable
920
- ca_trust_path: "trust.the.internet",
921
- max_wait_until_ready: 1000,
922
- operation_timeout: 1000,
923
- ssl_peer_fingerprint: "FEDCBA",
924
- winrm_transport: "kerberos",
925
- winrm_basic_auth_only: false,
926
- user: "clippy",
927
- port: 1000,
928
- self_signed: false,
929
- ssl: false,
930
- kerberos_realm: "otherrealm",
931
- kerberos_service: "otherservice",
932
- password: "blue",
933
- }
934
- end
935
- it "generates a config hash using the CLI options and pulling nothing from Chef::Config" do
936
- knife.merge_configs
937
- expect(knife.connection_opts).to match expected_result
938
- end
939
- end
940
- end # with underlying Chef::Config values
941
-
942
- context "and no values are provided from Chef::Config or CLI" do
943
- before do
944
- # We will use knife's actual config since these tests
945
- # have assumptions based on CLI default values
946
- end
947
- let(:expected_result) do
948
- {
949
- logger: Chef::Log,
950
- operation_timeout: 60,
951
- self_signed: false,
952
- ssl: false,
953
- ssl_peer_fingerprint: nil,
954
- winrm_basic_auth_only: false,
955
- winrm_transport: "negotiate",
956
- }
957
- end
958
- it "populates appropriate defaults" do
959
- knife.merge_configs
960
- expect(knife.connection_opts).to match expected_result
961
- end
962
- end
963
- end # winrm
964
-
965
- context "when protocol is ssh" do
966
- let(:connection_protocol) { "ssh" }
967
- # context "and neither CLI nor Chef::Config config entries have been provided"
968
- # end
969
- context "and all supported values are provided as Chef::Config entries" do
970
- before do
971
- # Set everything to easily identifiable and obviously fake values
972
- # to verify that Chef::Config is being sourced instead of knife.config
973
- knife.config = {}
974
- Chef::Config[:knife][:max_wait] = 9999
975
- Chef::Config[:knife][:session_timeout] = 9999
976
- Chef::Config[:knife][:ssh_user] = "sshbob"
977
- Chef::Config[:knife][:ssh_port] = 9999
978
- Chef::Config[:knife][:host_key_verify] = false
979
- Chef::Config[:knife][:ssh_gateway_identity] = "/gateway.pem"
980
- Chef::Config[:knife][:ssh_gateway] = "admin@mygateway.local:1234"
981
- Chef::Config[:knife][:ssh_identity_file] = "/identity.pem"
982
- Chef::Config[:knife][:use_sudo_password] = false # We have no password.
983
- end
984
-
985
- context "and no CLI options have been given" do
986
- let(:expected_result) do
987
- {
988
- logger: Chef::Log, # not configurable
989
- max_wait_until_ready: 9999.0,
990
- connection_timeout: 9999,
991
- user: "sshbob",
992
- bastion_host: "mygateway.local",
993
- bastion_port: 1234,
994
- bastion_user: "admin",
995
- forward_agent: false,
996
- keys_only: true,
997
- key_files: ["/identity.pem", "/gateway.pem"],
998
- sudo: false,
999
- verify_host_key: "always",
1000
- port: 9999,
1001
- non_interactive: true,
1002
- }
1003
- end
1004
-
1005
- it "generates a correct config hash using the Chef::Config values" do
1006
- knife.merge_configs
1007
- expect(knife.connection_opts).to match expected_result
1008
- end
1009
- end
1010
-
1011
- context "and unsupported Chef::Config options are given in Chef::Config, not in CLI" do
1012
- before do
1013
- Chef::Config[:knife][:password] = "blah"
1014
- Chef::Config[:knife][:ssh_password] = "blah"
1015
- Chef::Config[:knife][:preserve_home] = true
1016
- Chef::Config[:knife][:use_sudo] = true
1017
- Chef::Config[:knife][:ssh_forward_agent] = "blah"
1018
- end
1019
- it "does not include the corresponding option in the connection options" do
1020
- knife.merge_configs
1021
- expect(knife.connection_opts.key?(:password)).to eq false
1022
- expect(knife.connection_opts.key?(:ssh_forward_agent)).to eq false
1023
- expect(knife.connection_opts.key?(:use_sudo)).to eq false
1024
- expect(knife.connection_opts.key?(:preserve_home)).to eq false
1025
- end
1026
- end
1027
-
1028
- context "and some CLI options have been given" do
1029
- before do
1030
- knife.config = {}
1031
- knife.config[:connection_user] = "sshalice"
1032
- knife.config[:connection_port] = 12
1033
- knife.config[:ssh_port] = "13" # canary to indirectly verify we're not looking for the wrong CLI flag
1034
- knife.config[:connection_password] = "feta cheese"
1035
- knife.config[:max_wait] = 150
1036
- knife.config[:session_timeout] = 120
1037
- knife.config[:use_sudo] = true
1038
- knife.config[:use_sudo_pasword] = true
1039
- knife.config[:ssh_forward_agent] = true
1040
- end
1041
-
1042
- let(:expected_result) do
1043
- {
1044
- logger: Chef::Log, # not configurable
1045
- max_wait_until_ready: 150.0, # cli
1046
- connection_timeout: 120, # cli
1047
- user: "sshalice", # cli
1048
- password: "feta cheese", # cli
1049
- bastion_host: "mygateway.local", # Config
1050
- bastion_port: 1234, # Config
1051
- bastion_user: "admin", # Config
1052
- forward_agent: true, # cli
1053
- keys_only: false, # implied false from config password present
1054
- key_files: ["/identity.pem", "/gateway.pem"], # Config
1055
- sudo: true, # ccli
1056
- verify_host_key: "always", # Config
1057
- port: 12, # cli
1058
- non_interactive: true,
1059
- }
1060
- end
1061
-
1062
- it "generates a config hash using the CLI options when available and falling back to Chef::Config values" do
1063
- knife.merge_configs
1064
- expect(knife.connection_opts).to match expected_result
1065
- end
1066
- end
1067
-
1068
- context "and all CLI options have been given" do
1069
- before do
1070
- knife.config = {}
1071
- knife.config[:max_wait] = 150
1072
- knife.config[:session_timeout] = 120
1073
- knife.config[:connection_user] = "sshroot"
1074
- knife.config[:connection_port] = 1000
1075
- knife.config[:connection_password] = "blah"
1076
- knife.config[:forward_agent] = true
1077
- knife.config[:use_sudo] = true
1078
- knife.config[:use_sudo_password] = true
1079
- knife.config[:preserve_home] = true
1080
- knife.config[:use_sudo_pasword] = true
1081
- knife.config[:ssh_forward_agent] = true
1082
- knife.config[:ssh_verify_host_key] = true
1083
- knife.config[:ssh_gateway_identity] = "/gateway-identity.pem"
1084
- knife.config[:ssh_gateway] = "me@example.com:10"
1085
- knife.config[:ssh_identity_file] = "/my-identity.pem"
1086
-
1087
- # We'll set these as canaries - if one of these values shows up
1088
- # in a failed test, then the behavior of not pulling from these keys
1089
- # out of knife.config is broken:
1090
- knife.config[:ssh_user] = "do not use"
1091
- knife.config[:ssh_port] = 1001
1092
- end
1093
- let(:expected_result) do
1094
- {
1095
- logger: Chef::Log, # not configurable
1096
- max_wait_until_ready: 150,
1097
- connection_timeout: 120,
1098
- user: "sshroot",
1099
- password: "blah",
1100
- port: 1000,
1101
- bastion_host: "example.com",
1102
- bastion_port: 10,
1103
- bastion_user: "me",
1104
- forward_agent: true,
1105
- keys_only: false,
1106
- key_files: ["/my-identity.pem", "/gateway-identity.pem"],
1107
- sudo: true,
1108
- sudo_options: "-H",
1109
- sudo_password: "blah",
1110
- verify_host_key: true,
1111
- non_interactive: true,
1112
- }
1113
- end
1114
- it "generates a config hash using the CLI options and pulling nothing from Chef::Config" do
1115
- knife.merge_configs
1116
- expect(knife.connection_opts).to match expected_result
1117
- end
1118
- end
1119
- end
1120
- context "and no values are provided from Chef::Config or CLI" do
1121
- before do
1122
- # We will use knife's actual config since these tests
1123
- # have assumptions based on CLI default values
1124
- config = {}
1125
- end
1126
-
1127
- let(:expected_result) do
1128
- {
1129
- forward_agent: false,
1130
- key_files: [],
1131
- logger: Chef::Log,
1132
- keys_only: false,
1133
- sudo: false,
1134
- verify_host_key: "always",
1135
- non_interactive: true,
1136
- connection_timeout: 60,
1137
- }
1138
- end
1139
- it "populates appropriate defaults" do
1140
- knife.merge_configs
1141
- expect(knife.connection_opts).to match expected_result
1142
- end
1143
- end
1144
-
1145
- end # ssh
1146
- end # functional tests
1147
-
1148
- end # connection_opts
1149
-
1150
- context "#base_opts" do
1151
- let(:connection_protocol) { nil }
1152
-
1153
- before do
1154
- allow(knife).to receive(:connection_protocol).and_return connection_protocol
1155
- end
1156
-
1157
- context "for all protocols" do
1158
- context "when password is provided" do
1159
- before do
1160
- knife.config[:connection_port] = 250
1161
- knife.config[:connection_user] = "test"
1162
- knife.config[:connection_password] = "opscode"
1163
- end
1164
-
1165
- let(:expected_opts) do
1166
- {
1167
- port: 250,
1168
- user: "test",
1169
- logger: Chef::Log,
1170
- password: "opscode",
1171
- }
1172
- end
1173
- it "generates the correct options" do
1174
- expect(knife.base_opts).to eq expected_opts
1175
- end
1176
-
1177
- end
1178
-
1179
- context "when password is not provided" do
1180
- before do
1181
- knife.config[:connection_port] = 250
1182
- knife.config[:connection_user] = "test"
1183
- end
1184
-
1185
- let(:expected_opts) do
1186
- {
1187
- port: 250,
1188
- user: "test",
1189
- logger: Chef::Log,
1190
- }
1191
- end
1192
- it "generates the correct options" do
1193
- expect(knife.base_opts).to eq expected_opts
1194
- end
1195
- end
1196
- end
1197
- end
1198
-
1199
- context "#host_verify_opts" do
1200
- let(:connection_protocol) { nil }
1201
- before do
1202
- allow(knife).to receive(:connection_protocol).and_return connection_protocol
1203
- end
1204
-
1205
- context "for winrm" do
1206
- let(:connection_protocol) { "winrm" }
1207
- it "returns the expected configuration" do
1208
- knife.config[:winrm_no_verify_cert] = true
1209
- expect(knife.host_verify_opts).to eq( { self_signed: true } )
1210
- end
1211
- it "provides a correct default when no option given" do
1212
- expect(knife.host_verify_opts).to eq( { self_signed: false } )
1213
- end
1214
- end
1215
-
1216
- context "for ssh" do
1217
- let(:connection_protocol) { "ssh" }
1218
- it "returns the expected configuration" do
1219
- knife.config[:ssh_verify_host_key] = false
1220
- expect(knife.host_verify_opts).to eq( { verify_host_key: false } )
1221
- end
1222
- it "provides a correct default when no option given" do
1223
- expect(knife.host_verify_opts).to eq( { verify_host_key: "always" } )
1224
- end
1225
- end
1226
- end
1227
-
1228
- # TODO - test keys_only, password, config source behavior
1229
- context "#ssh_identity_opts" do
1230
- let(:connection_protocol) { nil }
1231
- before do
1232
- allow(knife).to receive(:connection_protocol).and_return connection_protocol
1233
- end
1234
-
1235
- context "for winrm" do
1236
- let(:connection_protocol) { "winrm" }
1237
- it "returns an empty hash" do
1238
- expect(knife.ssh_identity_opts).to eq({})
1239
- end
1240
- end
1241
-
1242
- context "for ssh" do
1243
- let(:connection_protocol) { "ssh" }
1244
- context "when an identity file is specified" do
1245
- before do
1246
- knife.config[:ssh_identity_file] = "/identity.pem"
1247
- end
1248
- it "generates the expected configuration" do
1249
- expect(knife.ssh_identity_opts).to eq({
1250
- key_files: [ "/identity.pem" ],
1251
- keys_only: true,
1252
- })
1253
- end
1254
- context "and a password is also specified" do
1255
- before do
1256
- knife.config[:connection_password] = "blah"
1257
- end
1258
- it "generates the expected configuration (key, keys_only false)" do
1259
- expect(knife.ssh_identity_opts).to eq({
1260
- key_files: [ "/identity.pem" ],
1261
- keys_only: false,
1262
- })
1263
- end
1264
- end
1265
-
1266
- context "and a gateway is not specified" do
1267
- context "but a gateway identity file is specified" do
1268
- it "does not include the gateway identity file in keys" do
1269
- expect(knife.ssh_identity_opts).to eq({
1270
- key_files: ["/identity.pem"],
1271
- keys_only: true,
1272
- })
1273
- end
1274
-
1275
- end
1276
-
1277
- end
1278
-
1279
- context "and a gatway is specified" do
1280
- before do
1281
- knife.config[:ssh_gateway] = "example.com"
1282
- end
1283
- context "and a gateway identity file is not specified" do
1284
- it "config includes only identity file and not gateway identity" do
1285
- expect(knife.ssh_identity_opts).to eq({
1286
- key_files: [ "/identity.pem" ],
1287
- keys_only: true,
1288
- })
1289
- end
1290
- end
1291
-
1292
- context "and a gateway identity file is also specified" do
1293
- before do
1294
- knife.config[:ssh_gateway_identity] = "/gateway.pem"
1295
- end
1296
-
1297
- it "generates the expected configuration (both keys, keys_only true)" do
1298
- expect(knife.ssh_identity_opts).to eq({
1299
- key_files: [ "/identity.pem", "/gateway.pem" ],
1300
- keys_only: true,
1301
- })
1302
- end
1303
- end
1304
- end
1305
- end
1306
-
1307
- context "when no identity file is specified" do
1308
- it "generates the expected configuration (no keys, keys_only false)" do
1309
- expect(knife.ssh_identity_opts).to eq( {
1310
- key_files: [ ],
1311
- keys_only: false,
1312
- })
1313
- end
1314
- context "and a gateway with gateway identity file is specified" do
1315
- before do
1316
- knife.config[:ssh_gateway] = "host"
1317
- knife.config[:ssh_gateway_identity] = "/gateway.pem"
1318
- end
1319
-
1320
- it "generates the expected configuration (gateway key, keys_only false)" do
1321
- expect(knife.ssh_identity_opts).to eq({
1322
- key_files: [ "/gateway.pem" ],
1323
- keys_only: false,
1324
- })
1325
- end
1326
- end
1327
- end
1328
- end
1329
- end
1330
-
1331
- context "#gateway_opts" do
1332
- let(:connection_protocol) { nil }
1333
- before do
1334
- allow(knife).to receive(:connection_protocol).and_return connection_protocol
1335
- end
1336
-
1337
- context "for winrm" do
1338
- let(:connection_protocol) { "winrm" }
1339
- it "returns an empty hash" do
1340
- expect(knife.gateway_opts).to eq({})
1341
- end
1342
- end
1343
-
1344
- context "for ssh" do
1345
- let(:connection_protocol) { "ssh" }
1346
- context "and ssh_gateway with hostname, user and port provided" do
1347
- before do
1348
- knife.config[:ssh_gateway] = "testuser@gateway:9021"
1349
- end
1350
- it "returns a proper bastion host config subset" do
1351
- expect(knife.gateway_opts).to eq({
1352
- bastion_user: "testuser",
1353
- bastion_host: "gateway",
1354
- bastion_port: 9021,
1355
- })
1356
- end
1357
- end
1358
- context "and ssh_gateway with only hostname is given" do
1359
- before do
1360
- knife.config[:ssh_gateway] = "gateway"
1361
- end
1362
- it "returns a proper bastion host config subset" do
1363
- expect(knife.gateway_opts).to eq({
1364
- bastion_user: nil,
1365
- bastion_host: "gateway",
1366
- bastion_port: nil,
1367
- })
1368
- end
1369
- end
1370
- context "and ssh_gateway with hostname and user is is given" do
1371
- before do
1372
- knife.config[:ssh_gateway] = "testuser@gateway"
1373
- end
1374
- it "returns a proper bastion host config subset" do
1375
- expect(knife.gateway_opts).to eq({
1376
- bastion_user: "testuser",
1377
- bastion_host: "gateway",
1378
- bastion_port: nil,
1379
- })
1380
- end
1381
- end
1382
-
1383
- context "and ssh_gateway with hostname and port is is given" do
1384
- before do
1385
- knife.config[:ssh_gateway] = "gateway:11234"
1386
- end
1387
- it "returns a proper bastion host config subset" do
1388
- expect(knife.gateway_opts).to eq({
1389
- bastion_user: nil,
1390
- bastion_host: "gateway",
1391
- bastion_port: 11234,
1392
- })
1393
- end
1394
- end
1395
-
1396
- context "and ssh_gateway is not provided" do
1397
- it "returns an empty hash" do
1398
- expect(knife.gateway_opts).to eq({})
1399
- end
1400
- end
1401
- end
1402
- end
1403
-
1404
- context "#sudo_opts" do
1405
- let(:connection_protocol) { nil }
1406
- before do
1407
- allow(knife).to receive(:connection_protocol).and_return connection_protocol
1408
- end
1409
-
1410
- context "for winrm" do
1411
- let(:connection_protocol) { "winrm" }
1412
- it "returns an empty hash" do
1413
- expect(knife.sudo_opts).to eq({})
1414
- end
1415
- end
1416
-
1417
- context "for ssh" do
1418
- let(:connection_protocol) { "ssh" }
1419
- context "when use_sudo is set" do
1420
- before do
1421
- knife.config[:use_sudo] = true
1422
- end
1423
-
1424
- it "returns a config that enables sudo" do
1425
- expect(knife.sudo_opts).to eq( { sudo: true } )
1426
- end
1427
-
1428
- context "when use_sudo_password is also set" do
1429
- before do
1430
- knife.config[:use_sudo_password] = true
1431
- knife.config[:connection_password] = "opscode"
1432
- end
1433
- it "includes :connection_password value in a sudo-enabled configuration" do
1434
- expect(knife.sudo_opts).to eq({
1435
- sudo: true,
1436
- sudo_password: "opscode",
1437
- })
1438
- end
1439
- end
1440
-
1441
- context "when preserve_home is set" do
1442
- before do
1443
- knife.config[:preserve_home] = true
1444
- end
1445
- it "enables sudo with sudo_option to preserve home" do
1446
- expect(knife.sudo_opts).to eq({
1447
- sudo_options: "-H",
1448
- sudo: true,
1449
- })
1450
- end
1451
- end
1452
- end
1453
-
1454
- context "when use_sudo is not set" do
1455
- before do
1456
- knife.config[:use_sudo_password] = true
1457
- knife.config[:preserve_home] = true
1458
- end
1459
- it "returns configuration for sudo off, ignoring other related options" do
1460
- expect(knife.sudo_opts).to eq( { sudo: false } )
1461
- end
1462
- end
1463
- end
1464
- end
1465
-
1466
- context "#ssh_opts" do
1467
- let(:connection_protocol) { nil }
1468
- before do
1469
- allow(knife).to receive(:connection_protocol).and_return connection_protocol
1470
- end
1471
-
1472
- context "for ssh" do
1473
- let(:connection_protocol) { "ssh" }
1474
- let(:default_opts) do
1475
- {
1476
- non_interactive: true,
1477
- forward_agent: false,
1478
- connection_timeout: 60,
1479
- }
1480
- end
1481
-
1482
- context "by default" do
1483
- it "returns a configuration hash with appropriate defaults" do
1484
- expect(knife.ssh_opts).to eq default_opts
1485
- end
1486
- end
1487
-
1488
- context "when ssh_forward_agent has a value" do
1489
- before do
1490
- knife.config[:ssh_forward_agent] = true
1491
- end
1492
- it "returns a default configuration hash with forward_agent set to true" do
1493
- expect(knife.ssh_opts).to eq(default_opts.merge(forward_agent: true))
1494
- end
1495
- end
1496
- context "when session_timeout has a value" do
1497
- before do
1498
- knife.config[:session_timeout] = 120
1499
- end
1500
- it "returns a default configuration hash with updated timeout value." do
1501
- expect(knife.ssh_opts).to eq(default_opts.merge(connection_timeout: 120))
1502
- end
1503
- end
1504
-
1505
- end
1506
-
1507
- context "for winrm" do
1508
- let(:connection_protocol) { "winrm" }
1509
- it "returns an empty has because ssh is not winrm" do
1510
- expect(knife.ssh_opts).to eq({})
1511
- end
1512
- end
1513
-
1514
- end
1515
-
1516
- context "#winrm_opts" do
1517
- let(:connection_protocol) { nil }
1518
- before do
1519
- allow(knife).to receive(:connection_protocol).and_return connection_protocol
1520
- end
1521
-
1522
- context "for winrm" do
1523
- let(:connection_protocol) { "winrm" }
1524
- let(:expected) do
1525
- {
1526
- winrm_transport: "negotiate",
1527
- winrm_basic_auth_only: false,
1528
- ssl: false,
1529
- ssl_peer_fingerprint: nil,
1530
- operation_timeout: 60,
1531
- }
1532
- end
1533
-
1534
- it "generates a correct configuration hash with expected defaults" do
1535
- expect(knife.winrm_opts).to eq expected
1536
- end
1537
-
1538
- context "with ssl_peer_fingerprint" do
1539
- let(:ssl_peer_fingerprint_expected) do
1540
- expected.merge({ ssl_peer_fingerprint: "ABCD" })
1541
- end
1542
-
1543
- before do
1544
- knife.config[:winrm_ssl_peer_fingerprint] = "ABCD"
1545
- end
1546
-
1547
- it "generates a correct options hash with ssl_peer_fingerprint from the config provided" do
1548
- expect(knife.winrm_opts).to eq ssl_peer_fingerprint_expected
1549
- end
1550
- end
1551
-
1552
- context "with winrm_ssl" do
1553
- let(:ssl_expected) do
1554
- expected.merge({ ssl: true })
1555
- end
1556
- before do
1557
- knife.config[:winrm_ssl] = true
1558
- end
1559
-
1560
- it "generates a correct options hash with ssl from the config provided" do
1561
- expect(knife.winrm_opts).to eq ssl_expected
1562
- end
1563
- end
1564
-
1565
- context "with winrm_auth_method" do
1566
- let(:winrm_auth_method_expected) do
1567
- expected.merge({ winrm_transport: "freeaccess" })
1568
- end
1569
-
1570
- before do
1571
- knife.config[:winrm_auth_method] = "freeaccess"
1572
- end
1573
-
1574
- it "generates a correct options hash with winrm_transport from the config provided" do
1575
- expect(knife.winrm_opts).to eq winrm_auth_method_expected
1576
- end
1577
- end
1578
-
1579
- context "with ca_trust_file" do
1580
- let(:ca_trust_expected) do
1581
- expected.merge({ ca_trust_path: "/trust.me" })
1582
- end
1583
- before do
1584
- knife.config[:ca_trust_file] = "/trust.me"
1585
- end
1586
-
1587
- it "generates a correct options hash with ca_trust_file from the config provided" do
1588
- expect(knife.winrm_opts).to eq ca_trust_expected
1589
- end
1590
- end
1591
-
1592
- context "with kerberos auth" do
1593
- let(:kerberos_expected) do
1594
- expected.merge({
1595
- kerberos_service: "testsvc",
1596
- kerberos_realm: "TESTREALM",
1597
- winrm_transport: "kerberos",
1598
- })
1599
- end
1600
-
1601
- before do
1602
- knife.config[:winrm_auth_method] = "kerberos"
1603
- knife.config[:kerberos_service] = "testsvc"
1604
- knife.config[:kerberos_realm] = "TESTREALM"
1605
- end
1606
-
1607
- it "generates a correct options hash containing kerberos auth configuration from the config provided" do
1608
- expect(knife.winrm_opts).to eq kerberos_expected
1609
- end
1610
- end
1611
-
1612
- context "with winrm_basic_auth_only" do
1613
- before do
1614
- knife.config[:winrm_basic_auth_only] = true
1615
- end
1616
- let(:basic_auth_expected) do
1617
- expected.merge( { winrm_basic_auth_only: true } )
1618
- end
1619
- it "generates a correct options hash containing winrm_basic_auth_only from the config provided" do
1620
- expect(knife.winrm_opts).to eq basic_auth_expected
1621
- end
1622
- end
1623
- end
1624
-
1625
- context "for ssh" do
1626
- let(:connection_protocol) { "ssh" }
1627
- it "returns an empty hash because ssh is not winrm" do
1628
- expect(knife.winrm_opts).to eq({})
1629
- end
1630
- end
1631
- end
1632
- describe "#run" do
1633
- it "performs the steps we expect to run a bootstrap" do
1634
- expect(knife).to receive(:check_license)
1635
- expect(knife).to receive(:validate_name_args!).ordered
1636
- expect(knife).to receive(:validate_protocol!).ordered
1637
- expect(knife).to receive(:validate_first_boot_attributes!).ordered
1638
- expect(knife).to receive(:validate_winrm_transport_opts!).ordered
1639
- expect(knife).to receive(:validate_policy_options!).ordered
1640
- expect(knife).to receive(:winrm_warn_no_ssl_verification).ordered
1641
- expect(knife).to receive(:warn_on_short_session_timeout).ordered
1642
- expect(knife).to receive(:connect!).ordered
1643
- expect(knife).to receive(:register_client).ordered
1644
- expect(knife).to receive(:render_template).and_return "content"
1645
- expect(knife).to receive(:upload_bootstrap).with("content").and_return "/remote/path.sh"
1646
- expect(knife).to receive(:perform_bootstrap).with("/remote/path.sh")
1647
- expect(connection).to receive(:del_file!) # Make sure cleanup happens
1648
-
1649
- knife.run
1650
-
1651
- # Post-run verify expected state changes (not many directly in #run)
1652
- expect($stdout.sync).to eq true
1653
- end
1654
- end
1655
-
1656
- describe "#register_client" do
1657
- let(:vault_handler_mock) { double("ChefVaultHandler") }
1658
- let(:client_builder_mock) { double("ClientBuilder") }
1659
- let(:node_name) { nil }
1660
- before do
1661
- allow(knife).to receive(:chef_vault_handler).and_return vault_handler_mock
1662
- allow(knife).to receive(:client_builder).and_return client_builder_mock
1663
- knife.config[:chef_node_name] = node_name
1664
- end
1665
-
1666
- shared_examples_for "creating the client locally" do
1667
- context "when a valid node name is present" do
1668
- let(:node_name) { "test" }
1669
- before do
1670
- allow(client_builder_mock).to receive(:client).and_return "client"
1671
- allow(client_builder_mock).to receive(:client_path).and_return "/key.pem"
1672
- end
1673
-
1674
- it "runs client_builder and vault_handler" do
1675
- expect(client_builder_mock).to receive(:run)
1676
- expect(vault_handler_mock).to receive(:run).with("client")
1677
- knife.register_client
1678
- end
1679
-
1680
- it "sets the path to the client key in the bootstrap context" do
1681
- allow(client_builder_mock).to receive(:run)
1682
- allow(vault_handler_mock).to receive(:run).with("client")
1683
- knife.register_client
1684
- expect(knife.bootstrap_context.client_pem).to eq "/key.pem"
1685
- end
1686
- end
1687
-
1688
- context "when no valid node name is present" do
1689
- let(:node_name) { nil }
1690
- it "shows an error and exits" do
1691
- expect(knife.ui).to receive(:error)
1692
- expect { knife.register_client }.to raise_error(SystemExit)
1693
- end
1694
- end
1695
- end
1696
- context "when chef_vault_handler says we're using vault" do
1697
- let(:vault_handler_mock) { double("ChefVaultHandler") }
1698
- before do
1699
- allow(vault_handler_mock).to receive(:doing_chef_vault?).and_return true
1700
- end
1701
- it_behaves_like "creating the client locally"
1702
- end
1703
-
1704
- context "when an non-existant validation key is specified in chef config" do
1705
- before do
1706
- Chef::Config[:validation_key] = "/blah"
1707
- allow(vault_handler_mock).to receive(:doing_chef_vault?).and_return false
1708
- allow(File).to receive(:exist?).with(%r{/blah}).and_return false
1709
- end
1710
- it_behaves_like "creating the client locally"
1711
- end
1712
-
1713
- context "when a valid validation key is given and we're doing old-style client creation" do
1714
- before do
1715
- Chef::Config[:validation_key] = "/blah"
1716
- allow(File).to receive(:exist?).with(%r{/blah}).and_return true
1717
- allow(vault_handler_mock).to receive(:doing_chef_vault?).and_return false
1718
- end
1719
-
1720
- it "shows a warning message" do
1721
- expect(knife.ui).to receive(:warn).twice
1722
- knife.register_client
1723
- end
1724
- end
1725
- end
1726
-
1727
- describe "#perform_bootstrap" do
1728
- let(:exit_status) { 0 }
1729
- let(:stdout) { "" }
1730
- let(:result_mock) { double("result", exit_status: exit_status, stderr: "A message", stdout: stdout) }
1731
-
1732
- before do
1733
- allow(connection).to receive(:hostname).and_return "testhost"
1734
- end
1735
- it "runs the remote script and logs the output" do
1736
- expect(knife.ui).to receive(:info).with(/Bootstrapping.*/)
1737
- expect(knife).to receive(:bootstrap_command)
1738
- .with("/path.sh")
1739
- .and_return("sh /path.sh")
1740
- expect(connection)
1741
- .to receive(:run_command)
1742
- .with("sh /path.sh")
1743
- .and_yield("output here", nil)
1744
- .and_return result_mock
1745
-
1746
- expect(knife.ui).to receive(:msg).with(/testhost/)
1747
- knife.perform_bootstrap("/path.sh")
1748
- end
1749
-
1750
- context "when the remote command fails" do
1751
- let(:exit_status) { 1 }
1752
- it "shows an error and exits" do
1753
- expect(knife.ui).to receive(:info).with(/Bootstrapping.*/)
1754
- expect(knife).to receive(:bootstrap_command)
1755
- .with("/path.sh")
1756
- .and_return("sh /path.sh")
1757
- expect(connection).to receive(:run_command).with("sh /path.sh").and_return result_mock
1758
- expect { knife.perform_bootstrap("/path.sh") }.to raise_error(SystemExit)
1759
- end
1760
- end
1761
-
1762
- context "when the remote command failed due to su auth error" do
1763
- let(:exit_status) { 1 }
1764
- let(:stdout) { "su: Authentication failure" }
1765
- let(:connection_obj) { double("connection", transport_options: {}) }
1766
- it "shows an error and exits" do
1767
- allow(connection).to receive(:connection).and_return(connection_obj)
1768
- expect(knife.ui).to receive(:info).with(/Bootstrapping.*/)
1769
- expect(knife).to receive(:bootstrap_command)
1770
- .with("/path.sh")
1771
- .and_return("su - USER -c 'sh /path.sh'")
1772
- expect(connection)
1773
- .to receive(:run_command)
1774
- .with("su - USER -c 'sh /path.sh'")
1775
- .and_yield("output here", nil)
1776
- .and_raise(Train::UserError)
1777
- expect { knife.perform_bootstrap("/path.sh") }.to raise_error(Train::UserError)
1778
- end
1779
- end
1780
- end
1781
-
1782
- describe "#connect!" do
1783
- before do
1784
- # These are not required at run-time because train will handle its own
1785
- # protocol loading. In this case, we're simulating train failures and have to load
1786
- # them ourselves.
1787
- require "net/ssh"
1788
- require "train/transports/ssh"
1789
- end
1790
-
1791
- context "in the normal case" do
1792
- it "connects using the connection_opts and notifies the operator of progress" do
1793
- expect(knife.ui).to receive(:info).with(/Connecting to.*/)
1794
- expect(knife).to receive(:connection_opts).and_return( { opts: "here" })
1795
- expect(knife).to receive(:do_connect).with( { opts: "here" } )
1796
- knife.connect!
1797
- end
1798
- end
1799
-
1800
- context "when a general non-auth-failure occurs" do
1801
- let(:expected_error) { RuntimeError.new }
1802
- before do
1803
- allow(knife).to receive(:do_connect).and_raise(expected_error)
1804
- end
1805
- it "re-raises the exception" do
1806
- expect { knife.connect! }.to raise_error(expected_error)
1807
- end
1808
- end
1809
-
1810
- context "when ssh fingerprint is invalid" do
1811
- let(:expected_error) { Train::Error.new("fingerprint AA:BB is unknown for \"blah,127.0.0.1\"") }
1812
- before do
1813
- allow(knife).to receive(:do_connect).and_raise(expected_error)
1814
- end
1815
- it "warns, prompts to accept, then connects with verify_host_key of accept_new" do
1816
- expect(knife).to receive(:do_connect).and_raise(expected_error)
1817
- expect(knife.ui).to receive(:confirm)
1818
- .with(/.*host 'blah \(127.0.0.1\)'.*AA:BB.*Are you sure you want to continue.*/m)
1819
- .and_return(true)
1820
- expect(knife).to receive(:do_connect) do |opts|
1821
- expect(opts[:verify_host_key]).to eq :accept_new
1822
- end
1823
- knife.connect!
1824
- end
1825
- end
1826
-
1827
- context "when an auth failure occurs" do
1828
- let(:expected_error) do
1829
- e = Train::Error.new
1830
- actual = Net::SSH::AuthenticationFailed.new
1831
- # Simulate train's nested error - they wrap
1832
- # ssh/network errors in a TrainError.
1833
- allow(e).to receive(:cause).and_return(actual)
1834
- e
1835
- end
1836
-
1837
- let(:expected_error_password_prompt) do
1838
- e = Train::ClientError.new
1839
- reason = :no_ssh_password_or_key_available
1840
- allow(e).to receive(:reason).and_return(reason)
1841
- e
1842
- end
1843
-
1844
- let(:expected_error_password_prompt_winrm) do
1845
- e = RuntimeError.new
1846
- message = "password is a required option"
1847
- allow(e).to receive(:message).and_return(message)
1848
- e
1849
- end
1850
-
1851
- context "and password auth was used" do
1852
- before do
1853
- allow(connection).to receive(:password_auth?).and_return true
1854
- end
1855
-
1856
- it "re-raises the error so as not to resubmit the same failing password" do
1857
- expect(knife).to receive(:do_connect).and_raise(expected_error)
1858
- expect { knife.connect! }.to raise_error(expected_error)
1859
- end
1860
- end
1861
-
1862
- context "and password auth was not used" do
1863
- before do
1864
- allow(connection).to receive(:password_auth?).and_return false
1865
- allow(connection).to receive(:user).and_return "testuser"
1866
- allow(knife).to receive(:connection_protocol).and_return connection_protocol
1867
- end
1868
-
1869
- context "when using ssh" do
1870
- let(:connection_protocol) { "ssh" }
1871
-
1872
- it "warns, prompts for password, then reconnects with a password-enabled configuration using the new password" do
1873
- expect(knife).to receive(:do_connect).and_raise(expected_error_password_prompt)
1874
- expect(knife.ui).to receive(:warn).with(/Failed to auth.*/)
1875
- expect(knife.ui).to receive(:ask).and_return("newpassword")
1876
- # Ensure that we set echo off to prevent showing password on the screen
1877
- expect(knife).to receive(:do_connect) do |opts|
1878
- expect(opts[:password]).to eq "newpassword"
1879
- end
1880
- knife.connect!
1881
- end
1882
- end
1883
-
1884
- context "when using winrm" do
1885
- let(:connection_protocol) { "winrm" }
1886
-
1887
- it "warns, prompts for password, then reconnects with a password-enabled configuration using the new password for" do
1888
- expect(knife).to receive(:do_connect).and_raise(expected_error_password_prompt_winrm)
1889
- expect(knife.ui).to receive(:warn).with(/Failed to auth.*/)
1890
- expect(knife.ui).to receive(:ask).and_return("newpassword")
1891
- # Ensure that we set echo off to prevent showing password on the screen
1892
- expect(knife).to receive(:do_connect) do |opts|
1893
- expect(opts[:password]).to eq "newpassword"
1894
- end
1895
- knife.connect!
1896
- end
1897
- end
1898
- end
1899
- end
1900
- end
1901
-
1902
- it "verifies that a server to bootstrap was given as a command line arg" do
1903
- knife.name_args = nil
1904
- expect(knife).to receive(:check_license)
1905
- expect { knife.run }.to raise_error(SystemExit)
1906
- expect(stderr.string).to match(/ERROR:.+FQDN or ip/)
1907
- end
1908
-
1909
- describe "#bootstrap_context" do
1910
- context "under Windows" do
1911
- let(:windows_test) { true }
1912
- it "creates a WindowsBootstrapContext" do
1913
- require "chef/knife/core/windows_bootstrap_context"
1914
- expect(knife.bootstrap_context.class).to eq Chef::Knife::Core::WindowsBootstrapContext
1915
- end
1916
- end
1917
-
1918
- context "under linux" do
1919
- let(:linux_test) { true }
1920
- it "creates a BootstrapContext" do
1921
- require "chef/knife/core/bootstrap_context"
1922
- expect(knife.bootstrap_context.class).to eq Chef::Knife::Core::BootstrapContext
1923
- end
1924
- end
1925
- end
1926
-
1927
- describe "#config_value" do
1928
- before do
1929
- knife.config[:test_key_a] = "a from cli"
1930
- knife.config[:test_key_b] = "b from cli"
1931
- Chef::Config[:knife][:test_key_a] = "a from Chef::Config"
1932
- Chef::Config[:knife][:test_key_c] = "c from Chef::Config"
1933
- Chef::Config[:knife][:alt_test_key_c] = "alt c from Chef::Config"
1934
- knife.merge_configs
1935
- Chef::Config[:treat_deprecation_warnings_as_errors] = false
1936
- end
1937
-
1938
- it "returns the Chef::Config value from the cli when the CLI key is set" do
1939
- expect(knife.config_value(:test_key_a, :alt_test_key_c)).to eq "a from cli"
1940
- end
1941
-
1942
- it "returns the Chef::Config value from the alternative key when the CLI key is not set" do
1943
- expect(knife.config_value(:test_key_d, :alt_test_key_c)).to eq "alt c from Chef::Config"
1944
- end
1945
-
1946
- it "returns the default value when the key is not provided by CLI or Chef::Config" do
1947
- expect(knife.config_value(:missing_key, :missing_key, "found")).to eq "found"
1948
- end
1949
- end
1950
-
1951
- describe "#upload_bootstrap" do
1952
- before do
1953
- allow(connection).to receive(:temp_dir).and_return(temp_dir)
1954
- allow(connection).to receive(:normalize_path) { |a| a }
1955
- end
1956
-
1957
- let(:content) { "bootstrap script content" }
1958
- context "under Windows" do
1959
- let(:windows_test) { true }
1960
- let(:temp_dir) { "C:/Temp/bootstrap" }
1961
- it "creates a bat file in the temp dir provided by connection, using given content" do
1962
- expect(connection).to receive(:upload_file_content!).with(content, "C:/Temp/bootstrap/bootstrap.bat")
1963
- expect(knife.upload_bootstrap(content)).to eq "C:/Temp/bootstrap/bootstrap.bat"
1964
- end
1965
- end
1966
-
1967
- context "under Linux" do
1968
- let(:linux_test) { true }
1969
- let(:temp_dir) { "/tmp/bootstrap" }
1970
- it "creates a 'sh file in the temp dir provided by connection, using given content" do
1971
- expect(connection).to receive(:upload_file_content!).with(content, "/tmp/bootstrap/bootstrap.sh")
1972
- expect(knife.upload_bootstrap(content)).to eq "/tmp/bootstrap/bootstrap.sh"
1973
- end
1974
- end
1975
- end
1976
-
1977
- describe "#bootstrap_command" do
1978
- context "under Windows" do
1979
- let(:windows_test) { true }
1980
- it "prefixes the command to run under cmd.exe" do
1981
- expect(knife.bootstrap_command("autoexec.bat")).to eq "cmd.exe /C autoexec.bat"
1982
- end
1983
-
1984
- end
1985
- context "under Linux" do
1986
- let(:linux_test) { true }
1987
- it "prefixes the command to run under sh" do
1988
- expect(knife.bootstrap_command("bootstrap.sh")).to eq "sh bootstrap.sh"
1989
- end
1990
-
1991
- context "with --su-user option" do
1992
- let(:connection_obj) { double("connection", transport_options: {}) }
1993
- before do
1994
- knife.config[:su_user] = "root"
1995
- allow(connection).to receive(:connection).and_return(connection_obj)
1996
- end
1997
- it "prefixes the command to run using su -USER -c" do
1998
- expect(knife.bootstrap_command("bootstrap.sh")).to eq "su - #{knife.config[:su_user]} -c 'sh bootstrap.sh'"
1999
- expect(connection_obj.transport_options.key?(:pty)).to eq true
2000
- end
2001
-
2002
- it "sudo appended if --sudo option enabled" do
2003
- knife.config[:use_sudo] = true
2004
- expect(knife.bootstrap_command("bootstrap.sh")).to eq "sudo su - #{knife.config[:su_user]} -c 'sh bootstrap.sh'"
2005
- expect(connection_obj.transport_options.key?(:pty)).to eq true
2006
- end
2007
- end
2008
- end
2009
- end
2010
-
2011
- describe "#default_bootstrap_template" do
2012
- context "under Windows" do
2013
- let(:windows_test) { true }
2014
- it "is windows-chef-client-msi" do
2015
- expect(knife.default_bootstrap_template).to eq "windows-chef-client-msi"
2016
- end
2017
-
2018
- end
2019
- context "under Linux" do
2020
- let(:linux_test) { true }
2021
- it "is chef-full" do
2022
- expect(knife.default_bootstrap_template).to eq "chef-full"
2023
- end
2024
- end
2025
- end
2026
-
2027
- describe "#do_connect" do
2028
- let(:host_descriptor) { "example.com" }
2029
- let(:connection) { double("TrainConnector") }
2030
- let(:connector_mock) { double("TargetResolver", targets: [ connection ]) }
2031
- before do
2032
- allow(knife).to receive(:host_descriptor).and_return host_descriptor
2033
- end
2034
-
2035
- it "creates a TrainConnector and connects it" do
2036
- expect(Chef::Knife::Bootstrap::TrainConnector).to receive(:new).and_return connection
2037
- expect(connection).to receive(:connect!)
2038
- knife.do_connect({})
2039
- end
2040
-
2041
- context "when sshd configured with requiretty" do
2042
- let(:pty_err_msg) { "Sudo requires a TTY. Please see the README on how to configure sudo to allow for non-interactive usage." }
2043
- let(:expected_error) { Train::UserError.new(pty_err_msg, :sudo_no_tty) }
2044
- before do
2045
- allow(connection).to receive(:connect!).and_raise(expected_error)
2046
- end
2047
- it "retry with pty true request option" do
2048
- expect(Chef::Knife::Bootstrap::TrainConnector).to receive(:new).and_return(connection).exactly(2).times
2049
- expect(knife.ui).to receive(:warn).with("#{pty_err_msg} - trying with pty request")
2050
- expect { knife.do_connect({}) }.to raise_error(expected_error)
2051
- end
2052
- end
2053
- end
2054
-
2055
- describe "validate_winrm_transport_opts!" do
2056
- before do
2057
- allow(knife).to receive(:connection_protocol).and_return connection_protocol
2058
- end
2059
-
2060
- context "when using ssh" do
2061
- let(:connection_protocol) { "ssh" }
2062
- it "returns true" do
2063
- expect(knife.validate_winrm_transport_opts!).to eq true
2064
- end
2065
- end
2066
- context "when using winrm" do
2067
- let(:connection_protocol) { "winrm" }
2068
- context "with plaintext auth" do
2069
- before do
2070
- knife.config[:winrm_auth_method] = "plaintext"
2071
- end
2072
- context "with ssl" do
2073
- before do
2074
- knife.config[:winrm_ssl] = true
2075
- end
2076
- it "will not error because we won't send anything in plaintext regardless" do
2077
- expect(knife.validate_winrm_transport_opts!).to eq true
2078
- end
2079
- end
2080
- context "without ssl" do
2081
- before do
2082
- knife.config[:winrm_ssl] = false
2083
- end
2084
- context "and no validation key exists" do
2085
- before do
2086
- Chef::Config[:validation_key] = "validation_key.pem"
2087
- allow(File).to receive(:exist?).with(/.*validation_key.pem/).and_return false
2088
- end
2089
-
2090
- it "will error because we will generate and send a client key over the wire in plaintext" do
2091
- expect { knife.validate_winrm_transport_opts! }.to raise_error(SystemExit)
2092
- end
2093
-
2094
- end
2095
- context "and a validation key exists" do
2096
- before do
2097
- Chef::Config[:validation_key] = "validation_key.pem"
2098
- allow(File).to receive(:exist?).with(/.*validation_key.pem/).and_return true
2099
- end
2100
- # TODO - don't we still send validation key?
2101
- it "will not error because we don not send client key over the wire" do
2102
- expect(knife.validate_winrm_transport_opts!).to eq true
2103
- end
2104
- end
2105
- end
2106
- end
2107
-
2108
- context "with other auth" do
2109
- before do
2110
- knife.config[:winrm_auth_method] = "kerberos"
2111
- end
2112
-
2113
- context "and no validation key exists" do
2114
- before do
2115
-
2116
- Chef::Config[:validation_key] = "validation_key.pem"
2117
- allow(File).to receive(:exist?).with(/.*validation_key.pem/).and_return false
2118
- end
2119
-
2120
- it "will not error because we're not using plaintext auth" do
2121
- expect(knife.validate_winrm_transport_opts!).to eq true
2122
- end
2123
- end
2124
- context "and a validation key exists" do
2125
- before do
2126
- Chef::Config[:validation_key] = "validation_key.pem"
2127
- allow(File).to receive(:exist?).with(/.*validation_key.pem/).and_return true
2128
- end
2129
-
2130
- it "will not error because a client key won't be sent over the wire in plaintext when a validation key is present" do
2131
- expect(knife.validate_winrm_transport_opts!).to eq true
2132
- end
2133
- end
2134
-
2135
- end
2136
-
2137
- end
2138
-
2139
- end
2140
-
2141
- describe "#winrm_warn_no_ssl_verification" do
2142
- before do
2143
- allow(knife).to receive(:connection_protocol).and_return connection_protocol
2144
- end
2145
-
2146
- context "when using ssh" do
2147
- let(:connection_protocol) { "ssh" }
2148
- it "does not issue a warning" do
2149
- expect(knife.ui).to_not receive(:warn)
2150
- knife.winrm_warn_no_ssl_verification
2151
- end
2152
- end
2153
- context "when using winrm" do
2154
- let(:connection_protocol) { "winrm" }
2155
- context "winrm_no_verify_cert is set" do
2156
- before do
2157
- knife.config[:winrm_no_verify_cert] = true
2158
- end
2159
-
2160
- context "and ca_trust_file is present" do
2161
- before do
2162
- knife.config[:ca_trust_file] = "file"
2163
- end
2164
-
2165
- it "does not issue a warning" do
2166
- expect(knife.ui).to_not receive(:warn)
2167
- knife.winrm_warn_no_ssl_verification
2168
- end
2169
- end
2170
-
2171
- context "and winrm_ssl_peer_fingerprint is present" do
2172
- before do
2173
- knife.config[:winrm_ssl_peer_fingerprint] = "ABCD"
2174
- end
2175
- it "does not issue a warning" do
2176
- expect(knife.ui).to_not receive(:warn)
2177
- knife.winrm_warn_no_ssl_verification
2178
- end
2179
- end
2180
- context "and neither ca_trust_file nor winrm_ssl_peer_fingerprint is present" do
2181
- it "issues a warning" do
2182
- expect(knife.ui).to receive(:warn)
2183
- knife.winrm_warn_no_ssl_verification
2184
- end
2185
- end
2186
- end
2187
- end
2188
- end
2189
-
2190
- describe "#warn_on_short_session_timeout" do
2191
- let(:session_timeout) { 60 }
2192
-
2193
- before do
2194
- allow(knife).to receive(:session_timeout).and_return(session_timeout)
2195
- end
2196
-
2197
- context "timeout is not set at all" do
2198
- let(:session_timeout) { nil }
2199
- it "does not issue a warning" do
2200
- expect(knife.ui).to_not receive(:warn)
2201
- knife.warn_on_short_session_timeout
2202
- end
2203
- end
2204
-
2205
- context "timeout is more than 15" do
2206
- let(:session_timeout) { 16 }
2207
- it "does not issue a warning" do
2208
- expect(knife.ui).to_not receive(:warn)
2209
- knife.warn_on_short_session_timeout
2210
- end
2211
- end
2212
- context "timeout is 15 or less" do
2213
- let(:session_timeout) { 15 }
2214
- it "issues a warning" do
2215
- expect(knife.ui).to receive(:warn)
2216
- knife.warn_on_short_session_timeout
2217
- end
2218
- end
2219
- end
2220
- end