mixlib-install 1.1.0 → 1.2.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e0af20fe8cef0f2c9e3b55eaff4c7c36add075d5
4
- data.tar.gz: 81fbbba78d8ac828c86c2e41adc61db3d0f9475f
3
+ metadata.gz: af96827b91f93939e6376192d760548132394e7e
4
+ data.tar.gz: 39e849c94aebecb08b7f0f5e4328aeb8a45cb038
5
5
  SHA512:
6
- metadata.gz: d6ed09120e13ddd6bb012b9ba981c9e4e134ce281b4cffff2d1d665b0421775c5c9f2ee150ebe2ffc700411406d7e4cff9d1d1cea0d3f9c2fd4df0e5ef8584b1
7
- data.tar.gz: cbb47489c619ad045f36c518003ff886d7889054896a69f1abf92792b47c2ae798aac9d87ceef09cb3c86d2bdf787fe33707924a453bfea91c2d5f3d0e4b5fd4
6
+ metadata.gz: 0cb34501343fb8891d181076ef8c213d034cdcbad866fc758754fdf24830883660bbca4c77282b0006118d48f1c22748a74ec6aba3935482349ed0fe446ed8af
7
+ data.tar.gz: 7320f109233968d75a508f959fc3a5c71964c40eb7921563dd21a5c1cf353ed5a2a8103e04b2770755d1e05981c356f7504a5948c4eb9229453250cffceb656c
@@ -3,6 +3,5 @@ sudo: false
3
3
  rvm:
4
4
  - 2.2
5
5
  - 2.1
6
- - 1.9.3
7
6
 
8
7
  script: bundle exec rake ci
@@ -1,5 +1,14 @@
1
1
  # Change Log
2
2
 
3
+ ## [1.2.0]
4
+ - Fix omnibus project mappings
5
+ - Add `available_versions` method to API
6
+ - Add `chef-automate` product
7
+ - Add install support for Arista EOS
8
+ - Add p5p package support
9
+ - Add s390x architecture support
10
+ - Add Nano support
11
+
3
12
  ## [1.1.0]
4
13
  - Remove delivery-cli from Product Matrix since we are now shipping it within ChefDK
5
14
 
data/Gemfile CHANGED
@@ -1,5 +1,3 @@
1
1
  source "https://rubygems.org"
2
2
 
3
- gem "chefstyle", github: "chef/chefstyle"
4
-
5
3
  gemspec
@@ -3,6 +3,7 @@
3
3
  | Analytics Platform | analytics |
4
4
  | Angry Omnibus Toolchain | angry-omnibus-toolchain |
5
5
  | Angry Chef Client | angrychef |
6
+ | Chef Automate | automate |
6
7
  | Chef Client | chef |
7
8
  | Chef Backend | chef-backend |
8
9
  | Chef Server | chef-server |
@@ -15,7 +16,7 @@
15
16
  | Chef Cloud Marketplace addon | marketplace |
16
17
  | Omnibus Toolchain | omnibus-toolchain |
17
18
  | Enterprise Chef (legacy) | private-chef |
18
- | Chef Push Server | push-jobs-client |
19
+ | Chef Push Client | push-jobs-client |
19
20
  | Chef Push Server | push-jobs-server |
20
21
  | Chef Server Reporting addon | reporting |
21
22
  | Supermarket | supermarket |
data/README.md CHANGED
@@ -67,9 +67,28 @@ artifact.platform # => "ubuntu"
67
67
  artifact.platform_version # => "14.04"
68
68
  ```
69
69
 
70
+ ### List the available versions for a product and channel
71
+ ```ruby
72
+ # Note that this feature currently only works for :unstable channel
73
+ options = {
74
+ channel: :unstable,
75
+ product_name: 'chef',
76
+ }
77
+
78
+ Mixlib::Install.new(options).available_versions
79
+
80
+ # => ["12.13.3", "12.13.7", "12.13.8+20160721014124", "12.13.11+20160721165202"]
81
+ ```
82
+
70
83
  ## Unstable channel
71
84
  The `:unstable` channel is currently only available when connected to Chef's internal network.
72
85
 
86
+ ## Feature Flags
87
+
88
+ Below are the environment variables you can set to tune certain aspects of mixlib-install. They enable some features that are currently under development. You should use these features with care.
89
+
90
+ `MIXLIB_INSTALL_UNIFIED_BACKEND` => Enables unified backend feature which uses Artifactory backend for all available channels.
91
+
73
92
  ## Development
74
93
  Since mixlib-install needs to interact with Bintray and Artifactory and since Artifactory instances are only available in Chef's network, this project uses [vcr](https://github.com/vcr/vcr).
75
94
 
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rspec/core/rake_task"
3
3
 
4
- task default: :test
4
+ task default: :ci
5
5
 
6
6
  desc "Run specs"
7
7
  RSpec::Core::RakeTask.new(:spec) do |spec|
@@ -18,11 +18,21 @@ rescue LoadError
18
18
  puts "chefstyle/rubocop is not available. gem install chefstyle to do style checking."
19
19
  end
20
20
 
21
+ desc "Run specs for unified_backend (artifactory)"
22
+ task :unified_backend do
23
+ ENV["MIXLIB_INSTALL_UNIFIED_BACKEND"] = "true"
24
+ ENV["ARTIFACTORY_ENDPOINT"] = "https://packages-acceptance.chef.io"
25
+ Rake::Task["spec"].reenable
26
+ Rake::Task["spec"].invoke
27
+ ENV.delete "MIXLIB_INSTALL_UNIFIED_BACKEND"
28
+ ENV.delete "ARTIFACTORY_ENDPOINT"
29
+ end
30
+
21
31
  desc "Run all tests"
22
- task test: [:style, :spec]
32
+ task test: [:style, :spec, :unified_backend]
23
33
 
24
34
  desc "Run tests for Travis CI"
25
- task ci: [:style, :spec]
35
+ task ci: [:style, :spec, :unified_backend]
26
36
 
27
37
  desc "Render product matrix documentation"
28
38
  task "matrix" do
@@ -42,3 +52,11 @@ task "matrix" do
42
52
  f.puts("Do not modify this file manually. It is automatically rendered via a rake task.")
43
53
  end
44
54
  end
55
+
56
+ task :console do
57
+ require "irb"
58
+ require "irb/completion"
59
+ require "mixlib/install"
60
+ ARGV.clear
61
+ IRB.start
62
+ end
@@ -46,6 +46,15 @@ module Mixlib
46
46
  Backend.info(options)
47
47
  end
48
48
 
49
+ #
50
+ # List available versions
51
+ #
52
+ # @return [Array<String>] list of available versions for the given
53
+ # product_name and channel.
54
+ def available_versions
55
+ Backend.available_versions(options)
56
+ end
57
+
49
58
  #
50
59
  # Returns an install script for the given options
51
60
  #
@@ -174,5 +183,13 @@ module Mixlib
174
183
  def self.install_ps1(context = {})
175
184
  Mixlib::Install::Generator::PowerShell.install_ps1(context)
176
185
  end
186
+
187
+ #
188
+ # Returns if unified_backend feature flag for mixlib-install is enabled
189
+ #
190
+ # @return [Boolean] true if feature is enabled, false otherwise.
191
+ def self.unified_backend?
192
+ !ENV["MIXLIB_INSTALL_UNIFIED_BACKEND"].nil?
193
+ end
177
194
  end
178
195
  end
@@ -22,14 +22,20 @@ require "mixlib/install/backend/bintray"
22
22
  module Mixlib
23
23
  class Install
24
24
  class Backend
25
+ def self.available_versions(options)
26
+ backend(options).available_versions
27
+ end
28
+
25
29
  def self.info(options)
26
- backend = if options.for_artifactory?
27
- Backend::Artifactory.new(options)
28
- else
29
- Backend::Bintray.new(options)
30
- end
30
+ backend(options).info
31
+ end
31
32
 
32
- backend.info
33
+ def self.backend(options)
34
+ if options.for_artifactory?
35
+ Backend::Artifactory.new(options)
36
+ else
37
+ Backend::Bintray.new(options)
38
+ end
33
39
  end
34
40
  end
35
41
  end
@@ -43,11 +43,45 @@ module Mixlib
43
43
  # @return [Array<ArtifactInfo>] list of artifacts for the configured
44
44
  # channel, product name, and product version.
45
45
  def available_artifacts
46
- if options.latest_version?
47
- artifactory_latest
48
- else
49
- artifactory_artifacts(options.product_version)
46
+ artifacts = if options.latest_version?
47
+ artifactory_latest
48
+ else
49
+ artifactory_artifacts(options.product_version)
50
+ end
51
+
52
+ windows_artifact_fixup!(artifacts)
53
+ end
54
+
55
+ #
56
+ # Gets available versions from Artifactory via AQL.
57
+ #
58
+ # @return [Array<String>] Array of available versions
59
+ def available_versions
60
+ query = <<-QUERY
61
+ items.find(
62
+ {"repo": "omnibus-#{options.channel}-local"},
63
+ {"@omnibus.project": "#{omnibus_project}"},
64
+ {"name": {"$nmatch": "*.metadata.json" }}
65
+ ).include("@omnibus.version", "artifact.module.build")
66
+ QUERY
67
+ items = artifactory_query(query)
68
+
69
+ # Filter out the partial builds if we are in :unstable channel
70
+ # In other channels we do not need to do this since all builds are
71
+ # always complete. Infact we should not do this since for some arcane
72
+ # builds like Chef Client 10.X we do not have build record created in
73
+ # artifactory.
74
+ if options.channel == :unstable
75
+ # We check if "artifacts" field contains something since it is only
76
+ # populated with the build record if "artifact.module.build" exists.
77
+ items.reject! { |i| i["artifacts"].nil? }
50
78
  end
79
+
80
+ # We are only including a single property, version and that exists
81
+ # under the properties in the following structure:
82
+ # "properties" => [ {"key"=>"omnibus.version", "value"=>"12.13.3"} ]
83
+ items.map! { |i| i["properties"].first["value"] }
84
+ items.uniq
51
85
  end
52
86
 
53
87
  #
@@ -58,7 +92,7 @@ module Mixlib
58
92
  # Get the list of builds from the REST api.
59
93
  # We do this because a user in the readers group does not have
60
94
  # permissions to run aql against builds.
61
- builds = client.get("/api/build/#{package_name}")
95
+ builds = client.get("/api/build/#{omnibus_project}")
62
96
 
63
97
  if builds.nil?
64
98
  raise NoArtifactsError, <<-MSG
@@ -100,16 +134,19 @@ Can not find any builds for #{options.product_name} in #{::Artifactory.endpoint}
100
134
  results = artifactory_query(<<-QUERY
101
135
  items.find(
102
136
  {"repo": "omnibus-#{options.channel}-local"},
103
- {"@omnibus.project": "#{package_name}"},
137
+ {"@omnibus.project": "#{omnibus_project}"},
104
138
  {"@omnibus.version": "#{version}"},
105
139
  {"name": {"$nmatch": "*.metadata.json" }}
106
140
  ).include("repo", "path", "name", "property")
107
141
  QUERY
108
142
  )
109
143
 
110
- # Merge artifactory properties and downloadUri to a flat Hash
144
+ # Merge artifactory properties to a flat Hash
111
145
  results.collect! do |result|
112
- { "downloadUri" => generate_download_uri(result) }.merge(
146
+ {
147
+ "artifactory_standard_path" => generate_artifactory_standard_path(result),
148
+ "filename" => result["name"],
149
+ }.merge(
113
150
  map_properties(result["properties"])
114
151
  )
115
152
  end
@@ -130,15 +167,42 @@ items.find(
130
167
  results["results"]
131
168
  end
132
169
 
170
+ #
171
+ # Artifactory GET request
172
+ #
173
+ def get(url)
174
+ results = artifactory_request do
175
+ client.get(url)
176
+ end
177
+
178
+ results["results"]
179
+ end
180
+
133
181
  def create_artifact(artifact_map)
182
+ platform, platform_version = normalize_platform(artifact_map["omnibus.platform"],
183
+ artifact_map["omnibus.platform_version"])
184
+
185
+ chef_standard_path = generate_chef_standard_path(options.channel,
186
+ platform,
187
+ platform_version,
188
+ artifact_map["filename"]
189
+ )
190
+
134
191
  ArtifactInfo.new(
135
192
  md5: artifact_map["omnibus.md5"],
136
193
  sha256: artifact_map["omnibus.sha256"],
194
+ sha1: artifact_map["omnibus.sha1"],
137
195
  version: artifact_map["omnibus.version"],
138
- platform: artifact_map["omnibus.platform"],
139
- platform_version: artifact_map["omnibus.platform_version"],
140
- architecture: artifact_map["omnibus.architecture"],
141
- url: artifact_map["downloadUri"]
196
+ platform: platform,
197
+ platform_version: platform_version,
198
+ architecture: normalize_architecture(artifact_map["omnibus.architecture"]),
199
+ # Select what type of url we are going to display based on the enabled
200
+ # feature flags.
201
+ url: if Mixlib::Install.unified_backend?
202
+ chef_standard_path
203
+ else
204
+ artifact_map["artifactory_standard_path"]
205
+ end
142
206
  )
143
207
  end
144
208
 
@@ -154,9 +218,20 @@ items.find(
154
218
  end
155
219
  end
156
220
 
157
- # Construct the downloadUri from raw artifactory data
158
- #
159
- def generate_download_uri(result)
221
+ # Generates a chef standard download uri in the form of
222
+ # http://endpoint/channel/platform/platform_version/filename
223
+ def generate_chef_standard_path(channel, platform, platform_version, filename)
224
+ uri = []
225
+ uri << endpoint.sub(/\/$/, "")
226
+ uri << channel
227
+ uri << platform
228
+ uri << platform_version
229
+ uri << filename
230
+ uri.join("/")
231
+ end
232
+
233
+ # Generates an artifactory standard download uri
234
+ def generate_artifactory_standard_path(result)
160
235
  uri = []
161
236
  uri << endpoint.sub(/\/$/, "")
162
237
  uri << result["repo"]
@@ -196,8 +271,22 @@ the endpoint is correct and there is an open connection to Chef's private networ
196
271
  results
197
272
  end
198
273
 
199
- def package_name
200
- @package_name ||= PRODUCT_MATRIX.lookup(options.product_name, options.product_version).package_name
274
+ def omnibus_project
275
+ @omnibus_project ||= PRODUCT_MATRIX.lookup(options.product_name, options.product_version).omnibus_project
276
+ end
277
+
278
+ #
279
+ # Normalizes architecture information that we receive.
280
+ #
281
+ # @param [String] architecture
282
+ #
283
+ # @return String [architecture]
284
+ def normalize_architecture(architecture)
285
+ if %w{ sun4u sun4v }.include?(architecture)
286
+ architecture = "sparc"
287
+ end
288
+
289
+ architecture
201
290
  end
202
291
  end
203
292
  end
@@ -38,6 +38,20 @@ module Mixlib
38
38
  raise "Must implement available_artifacts method that returns Array<ArtifactInfo>"
39
39
  end
40
40
 
41
+ #
42
+ # Returns the list of available versions for a given product_name
43
+ # and channel.
44
+ #
45
+ # @abstract Subclasses should define this method.
46
+ # Currently this method is only available in the Artifactory
47
+ # subclass.
48
+ #
49
+ # @return Array<String>
50
+ # List of available versions as strings.
51
+ def available_versions
52
+ raise "available_versions API is only available for Artifactory backend."
53
+ end
54
+
41
55
  #
42
56
  # See #filter_artifacts
43
57
  def info
@@ -106,6 +120,61 @@ module Mixlib
106
120
  return []
107
121
  end
108
122
 
123
+ # On windows, if we do not have a native 64-bit package available
124
+ # in the discovered artifacts, we will make 32-bit artifacts available
125
+ # for 64-bit architecture.
126
+ def windows_artifact_fixup!(artifacts)
127
+ new_artifacts = [ ]
128
+ native_artifacts = [ ]
129
+
130
+ artifacts.each do |r|
131
+ next if r.platform != "windows"
132
+
133
+ # Store all native 64-bit artifacts and clone 32-bit artifacts to
134
+ # be used as 64-bit.
135
+ case r.architecture
136
+ when "i386"
137
+ new_artifacts << r.clone_with(architecture: "x86_64")
138
+ when "x86_64"
139
+ native_artifacts << r.clone
140
+ else
141
+ puts "Unknown architecture '#{r.architecture}' for windows."
142
+ end
143
+ end
144
+
145
+ # Now discard the cloned artifacts if we find an equivalent native
146
+ # artifact
147
+ native_artifacts.each do |r|
148
+ new_artifacts.delete_if do |x|
149
+ x.platform_version == r.platform_version
150
+ end
151
+ end
152
+
153
+ # add the remaining cloned artifacts to the original set
154
+ artifacts += new_artifacts
155
+ end
156
+
157
+ #
158
+ # Normalizes platform and platform_version information that we receive.
159
+ # There are a few entries that we historically published
160
+ # that we need to normalize. They are:
161
+ # * solaris -> solaris2 & 10 -> 5.10 for solaris.
162
+ #
163
+ # @param [String] platform
164
+ # @param [String] platform_version
165
+ #
166
+ # @return Array<String> [platform, platform_version]
167
+ def normalize_platform(platform, platform_version)
168
+ if platform == "solaris"
169
+ platform = "solaris2"
170
+
171
+ # Here platform_version is set to either 10 or 11 and we would like
172
+ # to normalize that to 5.10 and 5.11.
173
+ platform_version = "5.#{platform_version}"
174
+ end
175
+
176
+ [platform, platform_version]
177
+ end
109
178
  end
110
179
  end
111
180
  end
@@ -81,7 +81,7 @@ module Mixlib
81
81
  # @return [String] latest version value
82
82
  #
83
83
  def latest_version
84
- result = bintray_get("#{options.channel}/#{options.product_name}/versions/_latest")
84
+ result = bintray_get("#{options.channel}/#{bintray_product_name}/versions/_latest")
85
85
  result["name"]
86
86
  end
87
87
 
@@ -93,11 +93,11 @@ module Mixlib
93
93
  def available_artifacts
94
94
  version = options.latest_version? ? latest_version : options.product_version
95
95
  begin
96
- results = bintray_get("#{options.channel}/#{options.product_name}/versions/#{version}/files")
96
+ results = bintray_get("#{options.channel}/#{bintray_product_name}/versions/#{version}/files")
97
97
  rescue Net::HTTPServerException => e
98
98
  if e.message =~ /404 "Not Found"/
99
99
  raise VersionNotFound,
100
- "Specified version (#{version}) not found for #{options.product_name} in #{options.channel} channel."
100
+ "Specified version (#{version}) not found for #{bintray_product_name} in #{options.channel} channel."
101
101
  else
102
102
  raise
103
103
  end
@@ -119,40 +119,6 @@ module Mixlib
119
119
  windows_artifact_fixup!(results)
120
120
  end
121
121
 
122
- # On windows, if we do not have a native 64-bit package available
123
- # in the discovered artifacts, we will make 32-bit artifacts available
124
- # for 64-bit architecture.
125
- def windows_artifact_fixup!(artifacts)
126
- new_artifacts = [ ]
127
- native_artifacts = [ ]
128
-
129
- artifacts.each do |r|
130
- next if r.platform != "windows"
131
-
132
- # Store all native 64-bit artifacts and clone 32-bit artifacts to
133
- # be used as 64-bit.
134
- case r.architecture
135
- when "i386"
136
- new_artifacts << r.clone_with(architecture: "x86_64")
137
- when "x86_64"
138
- native_artifacts << r.clone
139
- else
140
- puts "Unknown architecture '#{r.architecture}' for windows."
141
- end
142
- end
143
-
144
- # Now discard the cloned artifacts if we find an equivalent native
145
- # artifact
146
- native_artifacts.each do |r|
147
- new_artifacts.delete_if do |x|
148
- x.platform_version == r.platform_version
149
- end
150
- end
151
-
152
- # add the remaining cloned artifacts to the original set
153
- artifacts += new_artifacts
154
- end
155
-
156
122
  #
157
123
  # Creates an instance of ArtifactInfo
158
124
  #
@@ -238,29 +204,6 @@ module Mixlib
238
204
  }
239
205
  end
240
206
 
241
- #
242
- # Normalizes platform and platform_version information that we receive
243
- # from bintray. There are a few entries that we historically published
244
- # that we need to normalize. They are:
245
- # * solaris -> solaris2 & 10 -> 5.10 for solaris.
246
- #
247
- # @param [String] platform
248
- # @param [String] platform_version
249
- #
250
- # @return Array<String> [platform, platform_version]
251
- def normalize_platform(platform, platform_version)
252
- if platform == "solaris"
253
- platform = "solaris2"
254
-
255
- # Here platform_version is set to either 10 or 11 and we would like
256
- # to normalize that to 5.10 and 5.11.
257
-
258
- platform_version = "5.#{platform_version}"
259
- end
260
-
261
- [platform, platform_version]
262
- end
263
-
264
207
  #
265
208
  # Determines the architecture for which a file is published from from
266
209
  # filename.
@@ -290,6 +233,8 @@ module Mixlib
290
233
  "powerpc"
291
234
  elsif %w{ sparc sun4u sun4v }.fuzzy_include?(filename)
292
235
  "sparc"
236
+ elsif %w{ s390x }.fuzzy_include?(filename)
237
+ "s390x"
293
238
  # Note that ppc64le should come before ppc64 otherwise our search
294
239
  # will think ppc64le matches ppc64. Ubuntu also calls it ppc64el.
295
240
  elsif %w{ ppc64le ppc64el }.fuzzy_include?(filename)
@@ -332,6 +277,21 @@ module Mixlib
332
277
  "architecture can not be determined for '#{filename}'"
333
278
  end
334
279
  end
280
+
281
+ private
282
+
283
+ #
284
+ # This is a temporary workaround until we move to the unified backend
285
+ # for all channels. Some products are published to Bintray using their
286
+ # Omnibus project name as opposed to their mixlib-install product key.
287
+ #
288
+ def bintray_product_name
289
+ if %w{automate}.include?(options.product_name)
290
+ PRODUCT_MATRIX.lookup(options.product_name).omnibus_project
291
+ else
292
+ options.product_name
293
+ end
294
+ end
335
295
  end
336
296
  end
337
297
  end
@@ -46,7 +46,9 @@ module Mixlib
46
46
  install_command << get_script("helpers.sh")
47
47
  install_command << render_variables
48
48
  install_command << get_script("platform_detection.sh")
49
- if options.for_artifactory?
49
+ # Since omnitruck can not resolve unstable we need to inject direct
50
+ # urls for the packages here.
51
+ if options.for_unstable?
50
52
  install_command << artifactory_urls
51
53
  else
52
54
  install_command << get_script("fetch_metadata.sh")
@@ -304,6 +304,10 @@ install_file() {
304
304
  echo "installing with sh..."
305
305
  sh "$2"
306
306
  ;;
307
+ "p5p" )
308
+ echo "installing p5p package..."
309
+ pkg install -g "$2" $project
310
+ ;;
307
311
  *)
308
312
  echo "Unknown filetype: $1"
309
313
  report_bug
@@ -96,6 +96,10 @@ elif test "x$os" = "xAIX"; then
96
96
  platform="aix"
97
97
  platform_version="`uname -v`.`uname -r`"
98
98
  machine="powerpc"
99
+ elif test -f "/etc/Eos-release"; then
100
+ platform=arista_eos
101
+ platform_version=`awk '{print $4}' /etc/Eos-release`
102
+ machine="i386"
99
103
  elif test -f "/etc/os-release"; then
100
104
  . /etc/os-release
101
105
  if test "x$CISCO_RELEASE_INFO" != "x"; then
@@ -46,7 +46,9 @@ module Mixlib
46
46
  def install_command
47
47
  install_project_module = []
48
48
  install_project_module << get_script("helpers.ps1")
49
- install_project_module << if options.for_artifactory?
49
+ # Since omnitruck can not resolve unstable we need to inject direct
50
+ # urls for the packages here.
51
+ install_project_module << if options.for_unstable?
50
52
  artifactory_urls
51
53
  else
52
54
  get_script("get_project_metadata.ps1")
@@ -73,7 +75,7 @@ module Mixlib
73
75
 
74
76
  def artifactory_urls
75
77
  get_script("get_project_metadata_for_artifactory.ps1",
76
- artifacts: artifacts)
78
+ artifacts: Array(artifacts))
77
79
  end
78
80
 
79
81
  def artifacts
@@ -81,7 +83,7 @@ module Mixlib
81
83
  end
82
84
 
83
85
  def product_version
84
- if options.for_artifactory?
86
+ if options.for_unstable?
85
87
  artifacts.first.version
86
88
  else
87
89
  options.product_version
@@ -1,16 +1,22 @@
1
1
  function Get-PlatformVersion {
2
- switch -regex ((get-wmiobject win32_operatingsystem).version) {
3
- '10\.0\.\d+' {$platform_version = '2012r2'}
2
+ switch -regex ((Get-WMIQuery win32_operatingsystem).version) {
3
+ '10\.0\.\d+' {$platform_version = '2016'}
4
4
  '6\.3\.\d+' {$platform_version = '2012r2'}
5
5
  '6\.2\.\d+' {$platform_version = '2012'}
6
6
  '6\.1\.\d+' {$platform_version = '2008r2'}
7
7
  '6\.0\.\d+' {$platform_version = '2008'}
8
8
  }
9
+
10
+ if(Test-Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Server\ServerLevels') {
11
+ $levels = Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Server\ServerLevels'
12
+ if($levels.NanoServer -eq 1) { $platform_version += 'nano' }
13
+ }
14
+
9
15
  return $platform_version
10
16
  }
11
17
 
12
18
  function Get-PlatformArchitecture {
13
- if ((get-wmiobject win32_operatingsystem).osarchitecture -like '64-bit') {
19
+ if ((Get-WMIQuery win32_operatingsystem).osarchitecture -like '64-bit') {
14
20
  $architecture = 'x86_64'
15
21
  } else {
16
22
  $architecture = 'i386'
@@ -22,7 +28,8 @@ function New-Uri {
22
28
  param ($baseuri, $newuri)
23
29
 
24
30
  try {
25
- new-object System.Uri $baseuri, $newuri
31
+ $base = new-object System.Uri $baseuri
32
+ new-object System.Uri $base, $newuri
26
33
  }
27
34
  catch [System.Management.Automation.MethodInvocationException]{
28
35
  Write-Error "$($_.exception.message)"
@@ -32,17 +39,13 @@ function New-Uri {
32
39
 
33
40
  function Get-WebContent {
34
41
  param ($uri, $filepath)
35
- $proxy = New-Object -TypeName System.Net.WebProxy
36
- $wc = new-object System.Net.WebClient
37
- $proxy.Address = $env:http_proxy
38
- $wc.Proxy = $proxy
39
42
 
40
43
  try {
41
- if ([string]::IsNullOrEmpty($filepath)) {
42
- $wc.downloadstring($uri)
44
+ if($PSVersionTable.PSEdition -eq 'Core') {
45
+ Get-WebContentOnCore $uri $filepath
43
46
  }
44
47
  else {
45
- $wc.downloadfile($uri, $filepath)
48
+ Get-WebContentOnFullNet $uri $filepath
46
49
  }
47
50
  }
48
51
  catch {
@@ -56,17 +59,61 @@ function Get-WebContent {
56
59
  }
57
60
  }
58
61
 
62
+ function Get-WebContentOnFullNet {
63
+ param ($uri, $filepath)
64
+
65
+ $proxy = New-Object -TypeName System.Net.WebProxy
66
+ $wc = new-object System.Net.WebClient
67
+ $proxy.Address = $env:http_proxy
68
+ $wc.Proxy = $proxy
69
+
70
+ if ([string]::IsNullOrEmpty($filepath)) {
71
+ $wc.downloadstring($uri)
72
+ }
73
+ else {
74
+ $wc.downloadfile($uri, $filepath)
75
+ }
76
+ }
77
+
78
+ function Get-WebContentOnCore {
79
+ param ($uri, $filepath)
80
+
81
+ $handler = New-Object System.Net.Http.HttpClientHandler
82
+ $client = New-Object System.Net.Http.HttpClient($handler)
83
+ $client.Timeout = New-Object System.TimeSpan(0, 30, 0)
84
+ $cancelTokenSource = [System.Threading.CancellationTokenSource]::new()
85
+ $responseMsg = $client.GetAsync([System.Uri]::new($uri), $cancelTokenSource.Token)
86
+ $responseMsg.Wait()
87
+ if (!$responseMsg.IsCanceled) {
88
+ $response = $responseMsg.Result
89
+ if ($response.IsSuccessStatusCode) {
90
+ if ([string]::IsNullOrEmpty($filepath)) {
91
+ $response.Content.ReadAsStringAsync().Result
92
+ }
93
+ else {
94
+ $downloadedFileStream = [System.IO.FileStream]::new($filepath, [System.IO.FileMode]::Create, [System.IO.FileAccess]::Write)
95
+ $copyStreamOp = $response.Content.CopyToAsync($downloadedFileStream)
96
+ $copyStreamOp.Wait()
97
+ $downloadedFileStream.Close()
98
+ if ($copyStreamOp.Exception -ne $null) {
99
+ throw $copyStreamOp.Exception
100
+ }
101
+ }
102
+ }
103
+ }
104
+ }
105
+
59
106
  function Test-ProjectPackage {
60
107
  [cmdletbinding()]
61
108
  param ($Path, $Algorithm = 'SHA256', $Hash)
62
109
 
63
- if (-not (get-command get-filehash)) {
110
+ if (-not (get-command get-filehash -ErrorAction 'SilentlyContinue')) {
64
111
  function disposable($o){($o -is [IDisposable]) -and (($o | get-member | foreach-object {$_.name}) -contains 'Dispose')}
65
112
  function use($obj, [scriptblock]$sb){try {& $sb} catch [exception]{throw $_} finally {if (disposable $obj) {$obj.Dispose()}} }
66
113
  function Get-FileHash ($Path, $Algorithm) {
67
114
  $Path = (resolve-path $path).providerpath
68
115
  $hash = @{Algorithm = $Algorithm; Path = $Path}
69
- use ($c = New-Object -TypeName Security.Cryptography.SHA256Managed) {
116
+ use ($c = Get-SHA256Converter) {
70
117
  use ($in = (gi $path).OpenRead()) {
71
118
  $hash.Hash = ([BitConverter]::ToString($c.ComputeHash($in))).Replace("-", "").ToUpper()
72
119
  }
@@ -84,3 +131,23 @@ function Test-ProjectPackage {
84
131
  }
85
132
  return $Valid
86
133
  }
134
+
135
+ function Get-SHA256Converter {
136
+ if($PSVersionTable.PSEdition -eq 'Core') {
137
+ [System.Security.Cryptography.SHA256]::Create()
138
+ }
139
+ else {
140
+ New-Object -TypeName Security.Cryptography.SHA256Managed
141
+ }
142
+ }
143
+
144
+ function Get-WMIQuery {
145
+ param ($class)
146
+
147
+ if(Get-Command -Name Get-CimInstance -ErrorAction SilentlyContinue) {
148
+ Get-CimInstance $class
149
+ }
150
+ else {
151
+ Get-WmiObject $class
152
+ }
153
+ }
@@ -83,14 +83,15 @@ function Install-Project {
83
83
  $installingProject = $True
84
84
  $installAttempts = 0
85
85
  while ($installingProject) {
86
- $p = Start-Process -FilePath "msiexec" -ArgumentList "/qn /i $download_destination" -Passthru -Wait
87
- $p.WaitForExit()
88
- if ($p.ExitCode -eq 1618) {
89
- Write-Host "Another msi install is in progress (exit code 1618), retrying ($($installAttempts))..."
90
- continue
91
- } elseif ($p.ExitCode -ne 0) {
92
- throw "msiexec was not successful. Received exit code $($p.ExitCode)"
86
+ $installAttempts++
87
+ $result = $false
88
+ if($download_destination.EndsWith(".appx")) {
89
+ $result = Install-ChefAppx $download_destination $project
93
90
  }
91
+ else {
92
+ $result = Install-ChefMsi $download_destination
93
+ }
94
+ if(!$result) { continue }
94
95
  $installingProject = $False
95
96
  }
96
97
  }
@@ -100,4 +101,39 @@ function Install-Project {
100
101
  }
101
102
  }
102
103
  set-alias install -value Install-Project
104
+
105
+ Function Install-ChefMsi($msi) {
106
+ $p = Start-Process -FilePath "msiexec.exe" -ArgumentList "/qn /i $msi" -Passthru -Wait
107
+ $p.WaitForExit()
108
+ if ($p.ExitCode -eq 1618) {
109
+ Write-Host "Another msi install is in progress (exit code 1618), retrying ($($installAttempts))..."
110
+ return $false
111
+ } elseif ($p.ExitCode -ne 0) {
112
+ throw "msiexec was not successful. Received exit code $($p.ExitCode)"
113
+ }
114
+ return $true
115
+ }
116
+
117
+ Function Install-ChefAppx($appx, $project) {
118
+ Add-AppxPackage -Path $appx -ErrorAction Stop
119
+ $package = (Get-AppxPackage -Name $project).InstallLocation
120
+ $installRoot = "$env:SystemDrive/opscode"
121
+ $link = Join-Path $installRoot $project
122
+
123
+ # Remove link from a previous install
124
+ # There is currently a bug in removing symbolic links from Powershell
125
+ # so we use the fisher-price cmd shell to do it
126
+ if(Test-Path $link) {
127
+ cmd /c rmdir $link
128
+ }
129
+
130
+ if(!(Test-Path $installRoot)) {
131
+ New-Item -ItemType Directory -Path $installRoot
132
+ }
133
+ push-Location $installRoot
134
+ New-Item -ItemType SymbolicLink -Name $project -Target $package
135
+ Pop-Location
136
+ return $true
137
+ }
138
+
103
139
  export-modulemember -function 'Install-Project','Get-ProjectMetadata' -alias 'install'
@@ -71,11 +71,11 @@ module Mixlib
71
71
  end
72
72
 
73
73
  def for_artifactory?
74
- ARTIFACTORY_CHANNELS.include?(channel)
74
+ Mixlib::Install.unified_backend? || ARTIFACTORY_CHANNELS.include?(channel)
75
75
  end
76
76
 
77
- def for_bintray?
78
- [:stable, :current].include?(channel)
77
+ def for_unstable?
78
+ channel == :unstable
79
79
  end
80
80
 
81
81
  def for_omnitruck?
@@ -109,6 +109,7 @@ module Mixlib
109
109
  {
110
110
  shell_type: :sh,
111
111
  platform_version_compatibility_mode: false,
112
+ product_version: :latest,
112
113
  }
113
114
  end
114
115
 
@@ -66,6 +66,33 @@ module Mixlib
66
66
  end
67
67
  end
68
68
 
69
+ #
70
+ # Set omnibus_project when configured, otherwise fall back to
71
+ # package_name
72
+ #
73
+ def omnibus_project(value = nil)
74
+ if value.nil?
75
+ @omnibus_project || package_name
76
+ else
77
+ @omnibus_project = value
78
+ end
79
+ end
80
+
81
+ #
82
+ # Return all known omnibus project names for a product
83
+ #
84
+ def known_omnibus_projects
85
+ # iterate through min/max versions for all product names
86
+ # and collect the name for both versions
87
+ projects = %w{ 0.0.0 1000.1000.1000 }.collect do |v|
88
+ @version = v
89
+ omnibus_project
90
+ end
91
+ # remove duplicates and return multiple known names or return the single
92
+ # project name
93
+ projects.uniq || projects
94
+ end
95
+
69
96
  #
70
97
  # Sets or retrieves the version for the product. This is used later
71
98
  # when we are reading the value of a property if a Proc is specified
@@ -160,6 +187,13 @@ PRODUCT_MATRIX = Mixlib::Install::ProductMatrix.new do
160
187
  package_name "angrychef"
161
188
  end
162
189
 
190
+ product "automate" do
191
+ product_name "Chef Automate"
192
+ package_name "delivery"
193
+ ctl_command "delivery-ctl"
194
+ config_file "/etc/delivery/delivery.rb"
195
+ end
196
+
163
197
  product "chef" do
164
198
  product_name "Chef Client"
165
199
  package_name "chef"
@@ -181,6 +215,7 @@ PRODUCT_MATRIX = Mixlib::Install::ProductMatrix.new do
181
215
  "chef-server-core"
182
216
  end
183
217
  end
218
+ omnibus_project "chef-server"
184
219
  ctl_command "chef-server-ctl"
185
220
  config_file "/etc/opscode/chef-server.rb"
186
221
  end
@@ -252,7 +287,7 @@ PRODUCT_MATRIX = Mixlib::Install::ProductMatrix.new do
252
287
  end
253
288
 
254
289
  product "push-jobs-client" do
255
- product_name "Chef Push Server"
290
+ product_name "Chef Push Client"
256
291
  package_name do |v|
257
292
  v < version_for("1.3.0") ? "opscode-push-jobs-client" : "push-jobs-client"
258
293
  end
@@ -132,8 +132,7 @@ module Mixlib
132
132
  def install_command_vars_for_powershell
133
133
  [
134
134
  shell_var("chef_omnibus_root", root),
135
- shell_var("msi", "$env:TEMP\\chef-#{version}.msi"),
136
- ].tap { |vars|
135
+ ].tap do |vars|
137
136
  if install_msi_url
138
137
  vars << shell_var("chef_msi_url", install_msi_url)
139
138
  else
@@ -141,7 +140,7 @@ module Mixlib
141
140
  vars << shell_var("pretty_version", Util.pretty_version(version))
142
141
  vars << shell_var("version", version)
143
142
  end
144
- }.join("\n")
143
+ end.join("\n")
145
144
  end
146
145
 
147
146
  def validate_opts!(opt)
@@ -1,5 +1,5 @@
1
1
  module Mixlib
2
2
  class Install
3
- VERSION = "1.1.0"
3
+ VERSION = "1.2.0"
4
4
  end
5
5
  end
@@ -25,6 +25,8 @@ Gem::Specification.new do |spec|
25
25
  spec.add_development_dependency "rake", "~> 10.0"
26
26
  spec.add_development_dependency "rspec", "~> 3.3"
27
27
  spec.add_development_dependency "pry"
28
+ spec.add_development_dependency "rb-readline"
28
29
  spec.add_development_dependency "vcr"
29
30
  spec.add_development_dependency "webmock", "~> 1.0"
31
+ spec.add_development_dependency "chefstyle", "~> 0.3"
30
32
  end
@@ -1,5 +1,5 @@
1
1
  Function Check-UpdateChef($root, $version) {
2
- if (-Not (Test-Path $root)) { return $true }
2
+ if (-Not (Test-Path "$root\embedded")) { return $true }
3
3
  elseif ("$version" -eq "true") { return $false }
4
4
  elseif ("$version" -eq "latest") { return $true }
5
5
 
@@ -14,8 +14,7 @@ Function Check-UpdateChef($root, $version) {
14
14
  }
15
15
 
16
16
  Function Get-ChefMetadata($url) {
17
- Try { $response = ($c = Make-WebClient).DownloadString($url) }
18
- Finally { if ($c -ne $null) { $c.Dispose() } }
17
+ $response = Get-WebContent $url
19
18
 
20
19
  $md = ConvertFrom-StringData $response.Replace("`t", "=")
21
20
  return @($md.url, $md.sha256)
@@ -23,52 +22,154 @@ Function Get-ChefMetadata($url) {
23
22
 
24
23
  Function Get-SHA256($src) {
25
24
  Try {
26
- $c = New-Object -TypeName System.Security.Cryptography.SHA256Managed
25
+ $c = Get-SHA256Converter
27
26
  $bytes = $c.ComputeHash(($in = (Get-Item $src).OpenRead()))
28
27
  return ([System.BitConverter]::ToString($bytes)).Replace("-", "").ToLower()
29
28
  } Finally { if (($c -ne $null) -and ($c.GetType().GetMethod("Dispose") -ne $null)) { $c.Dispose() }; if ($in -ne $null) { $in.Dispose() } }
30
29
  }
31
30
 
31
+ function Get-SHA256Converter {
32
+ if($PSVersionTable.PSEdition -eq 'Core') {
33
+ [System.Security.Cryptography.SHA256]::Create()
34
+ }
35
+ else {
36
+ New-Object -TypeName Security.Cryptography.SHA256Managed
37
+ }
38
+ }
39
+
32
40
  Function Download-Chef($url, $sha256, $dst) {
33
- Try {
34
- Log "Downloading package from $url"
35
- ($c = Make-WebClient).DownloadFile($url, $dst)
36
- Log "Download complete."
37
- } Finally { if ($c -ne $null) { $c.Dispose() } }
41
+ Log "Downloading package from $url"
42
+ Get-WebContent $url $dst
43
+ Log "Download complete."
38
44
 
39
45
  if ($sha256 -eq $null) { Log "Skipping sha256 verification" }
40
46
  elseif (($dsha256 = Get-SHA256 $dst) -eq $sha256) { Log "Successfully verified $dst" }
41
47
  else { throw "SHA256 for $dst $dsha256 does not match $sha256" }
42
48
  }
43
49
 
44
- Function Install-Chef($msi) {
50
+ Function Install-Chef($msi, $chef_omnibus_root) {
45
51
  Log "Installing Chef Omnibus package $msi"
46
52
  $installingChef = $True
47
53
  $installAttempts = 0
48
54
  while ($installingChef) {
49
55
  $installAttempts++
50
- $p = Start-Process -FilePath "msiexec.exe" -ArgumentList "/qn /i $msi" -Passthru -Wait
51
- $p.WaitForExit()
52
- if ($p.ExitCode -eq 1618) {
53
- Log "Another msi install is in progress (exit code 1618), retrying ($($installAttempts))..."
54
- continue
55
- } elseif ($p.ExitCode -ne 0) {
56
- throw "msiexec was not successful. Received exit code $($p.ExitCode)"
56
+ $result = $false
57
+ if($msi.EndsWith(".appx")) {
58
+ $result = Install-ChefAppx $msi $chef_omnibus_root
57
59
  }
60
+ else {
61
+ $result = Install-ChefMsi $msi
62
+ }
63
+ if(!$result) { continue }
58
64
  $installingChef = $False
59
65
  }
60
66
  Remove-Item $msi -Force
61
67
  Log "Installation complete"
62
68
  }
63
69
 
70
+ Function Install-ChefMsi($msi) {
71
+ $p = Start-Process -FilePath "msiexec.exe" -ArgumentList "/qn /i $msi" -Passthru -Wait
72
+ $p.WaitForExit()
73
+ if ($p.ExitCode -eq 1618) {
74
+ Log "Another msi install is in progress (exit code 1618), retrying ($($installAttempts))..."
75
+ return $false
76
+ } elseif ($p.ExitCode -ne 0) {
77
+ throw "msiexec was not successful. Received exit code $($p.ExitCode)"
78
+ }
79
+ return $true
80
+ }
81
+
82
+ Function Install-ChefAppx($appx, $chef_omnibus_root) {
83
+ Add-AppxPackage -Path $appx -ErrorAction Stop
84
+
85
+ $rootParent = Split-Path $chef_omnibus_root -Parent
86
+ $rootFolder = Split-Path $chef_omnibus_root -Leaf
87
+ $link = Join-Path $rootParent $rootFolder
88
+
89
+ # Remove link from a previous install
90
+ # There is currently a bug in removing symbolic links from Powershell
91
+ # so we use the fisher-price cmd shell to do it
92
+ if(Test-Path $link) {
93
+ cmd /c rmdir $link
94
+ }
95
+
96
+ $package = (Get-AppxPackage -Name chef).InstallLocation
97
+ if(!(Test-Path $rootParent)) {
98
+ New-Item -ItemType Directory -Path $rootParent
99
+ }
100
+ push-Location $rootParent
101
+ New-Item -ItemType SymbolicLink -Name $rootFolder -Target $package
102
+ Pop-Location
103
+
104
+ return $true
105
+ }
106
+
64
107
  Function Log($m) { Write-Host " $m`n" }
65
108
 
66
- Function Make-WebClient {
109
+ function Get-WebContent {
110
+ param ($uri, $filepath)
111
+
112
+ try {
113
+ if($PSVersionTable.PSEdition -eq 'Core') {
114
+ Get-WebContentOnCore $uri $filepath
115
+ }
116
+ else {
117
+ Get-WebContentOnFullNet $uri $filepath
118
+ }
119
+ }
120
+ catch {
121
+ $exception = $_.Exception
122
+ Write-Host "There was an error: "
123
+ do {
124
+ Write-Host "`t$($exception.message)"
125
+ $exception = $exception.innerexception
126
+ } while ($exception)
127
+ throw "Failed to download from $uri."
128
+ }
129
+ }
130
+
131
+ function Get-WebContentOnFullNet {
132
+ param ($uri, $filepath)
133
+
67
134
  $proxy = New-Object -TypeName System.Net.WebProxy
135
+ $wc = new-object System.Net.WebClient
68
136
  $proxy.Address = $env:http_proxy
69
- $client = New-Object -TypeName System.Net.WebClient
70
- $client.Proxy = $proxy
71
- return $client
137
+ $wc.Proxy = $proxy
138
+
139
+ if ([string]::IsNullOrEmpty($filepath)) {
140
+ $wc.downloadstring($uri)
141
+ }
142
+ else {
143
+ $wc.downloadfile($uri, $filepath)
144
+ }
145
+ }
146
+
147
+ function Get-WebContentOnCore {
148
+ param ($uri, $filepath)
149
+
150
+ $handler = New-Object System.Net.Http.HttpClientHandler
151
+ $client = New-Object System.Net.Http.HttpClient($handler)
152
+ $client.Timeout = New-Object System.TimeSpan(0, 30, 0)
153
+ $cancelTokenSource = [System.Threading.CancellationTokenSource]::new()
154
+ $responseMsg = $client.GetAsync([System.Uri]::new($uri), $cancelTokenSource.Token)
155
+ $responseMsg.Wait()
156
+ if (!$responseMsg.IsCanceled) {
157
+ $response = $responseMsg.Result
158
+ if ($response.IsSuccessStatusCode) {
159
+ if ([string]::IsNullOrEmpty($filepath)) {
160
+ $response.Content.ReadAsStringAsync().Result
161
+ }
162
+ else {
163
+ $downloadedFileStream = [System.IO.FileStream]::new($filepath, [System.IO.FileMode]::Create, [System.IO.FileAccess]::Write)
164
+ $copyStreamOp = $response.Content.CopyToAsync($downloadedFileStream)
165
+ $copyStreamOp.Wait()
166
+ $downloadedFileStream.Close()
167
+ if ($copyStreamOp.Exception -ne $null) {
168
+ throw $copyStreamOp.Exception
169
+ }
170
+ }
171
+ }
172
+ }
72
173
  }
73
174
 
74
175
  Function Unresolve-Path($p) {
@@ -77,7 +178,6 @@ Function Unresolve-Path($p) {
77
178
  }
78
179
 
79
180
  $chef_omnibus_root = Unresolve-Path $chef_omnibus_root
80
- $msi = Unresolve-Path $msi
81
181
 
82
182
  if (Check-UpdateChef $chef_omnibus_root $version) {
83
183
  Write-Host "-----> Installing Chef Omnibus ($pretty_version)`n"
@@ -87,8 +187,10 @@ if (Check-UpdateChef $chef_omnibus_root $version) {
87
187
  $url = $chef_msi_url
88
188
  $sha256 = $null
89
189
  }
190
+ $msi = Join-Path $env:temp "$url".Split("/")[-1]
191
+ $msi = Unresolve-Path $msi
90
192
  Download-Chef "$url" $sha256 $msi
91
- Install-Chef $msi
193
+ Install-Chef $msi $chef_omnibus_root
92
194
  } else {
93
195
  Write-Host "-----> Chef Omnibus installation detected ($pretty_version)`n"
94
196
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mixlib-install
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thom May
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-06-24 00:00:00.000000000 Z
12
+ date: 2016-09-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: artifactory
@@ -109,6 +109,20 @@ dependencies:
109
109
  - - ">="
110
110
  - !ruby/object:Gem::Version
111
111
  version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: rb-readline
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
112
126
  - !ruby/object:Gem::Dependency
113
127
  name: vcr
114
128
  requirement: !ruby/object:Gem::Requirement
@@ -137,6 +151,20 @@ dependencies:
137
151
  - - "~>"
138
152
  - !ruby/object:Gem::Version
139
153
  version: '1.0'
154
+ - !ruby/object:Gem::Dependency
155
+ name: chefstyle
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - "~>"
159
+ - !ruby/object:Gem::Version
160
+ version: '0.3'
161
+ type: :development
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - "~>"
166
+ - !ruby/object:Gem::Version
167
+ version: '0.3'
140
168
  description:
141
169
  email:
142
170
  - thom@chef.io
@@ -147,7 +175,6 @@ extra_rdoc_files: []
147
175
  files:
148
176
  - ".gitignore"
149
177
  - ".rspec"
150
- - ".rubocop.yml"
151
178
  - ".travis.yml"
152
179
  - CHANGELOG.md
153
180
  - CONTRIBUTING.md
@@ -222,7 +249,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
222
249
  version: '0'
223
250
  requirements: []
224
251
  rubyforge_project:
225
- rubygems_version: 2.4.5.1
252
+ rubygems_version: 2.6.6
226
253
  signing_key:
227
254
  specification_version: 4
228
255
  summary: A mixin to help with omnitruck installs
@@ -1,10 +0,0 @@
1
- AllCops:
2
- Exclude:
3
- - mixlib-install.gemspec
4
- Style/AlignParameters:
5
- EnforcedStyle: with_first_parameter
6
- Style/HashSyntax:
7
- EnforcedStyle: ruby19
8
- Metrics/LineLength:
9
- Exclude:
10
- - spec/**/*.rb