mixlib-install 0.8.0.alpha.2 → 0.8.0.alpha.3

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 (32) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +9 -2
  3. data/Rakefile +5 -0
  4. data/acceptance/Gemfile +3 -1
  5. data/acceptance/Gemfile.lock +37 -5
  6. data/acceptance/current/.acceptance/acceptance-cookbook/recipes/provision.rb +3 -1
  7. data/acceptance/current/.kitchen.yml +18 -23
  8. data/acceptance/unstable/.acceptance/acceptance-cookbook/.gitignore +2 -0
  9. data/acceptance/unstable/.acceptance/acceptance-cookbook/metadata.rb +1 -0
  10. data/acceptance/unstable/.acceptance/acceptance-cookbook/recipes/destroy.rb +3 -0
  11. data/acceptance/unstable/.acceptance/acceptance-cookbook/recipes/provision.rb +3 -0
  12. data/acceptance/unstable/.acceptance/acceptance-cookbook/recipes/verify.rb +3 -0
  13. data/acceptance/unstable/.kitchen.yml +40 -0
  14. data/lib/mixlib/install.rb +35 -3
  15. data/lib/mixlib/install/backend/artifactory.rb +108 -34
  16. data/lib/mixlib/install/backend/omnitruck.rb +2 -2
  17. data/lib/mixlib/install/generator.rb +6 -1
  18. data/lib/mixlib/install/generator/base.rb +65 -0
  19. data/lib/mixlib/install/generator/bourne.rb +23 -14
  20. data/lib/mixlib/install/generator/bourne/scripts/artifactory_urls.sh.erb +31 -0
  21. data/lib/mixlib/install/generator/bourne/scripts/{fetch_metadata.sh → fetch_metadata.sh.erb} +1 -1
  22. data/lib/mixlib/install/generator/bourne/scripts/helpers.sh +7 -2
  23. data/lib/mixlib/install/generator/bourne/scripts/platform_detection.sh +8 -0
  24. data/lib/mixlib/install/generator/bourne/scripts/script_cli_parameters.sh +36 -0
  25. data/lib/mixlib/install/generator/powershell.rb +94 -0
  26. data/lib/mixlib/install/generator/powershell/scripts/get_project_metadata.ps1.erb +87 -0
  27. data/lib/mixlib/install/generator/powershell/scripts/get_project_metadata_for_artifactory.ps1.erb +83 -0
  28. data/lib/mixlib/install/generator/powershell/scripts/helpers.ps1 +69 -0
  29. data/lib/mixlib/install/generator/powershell/scripts/install_project.ps1 +96 -0
  30. data/lib/mixlib/install/options.rb +86 -23
  31. data/lib/mixlib/install/version.rb +1 -1
  32. metadata +17 -4
@@ -24,7 +24,7 @@ module Mixlib
24
24
  class Install
25
25
  class Backend
26
26
  class Omnitruck
27
- OMNITRUCK_ENDPOINT = "https://omnitruck.chef.io"
27
+ ENDPOINT = "https://omnitruck.chef.io/".freeze
28
28
 
29
29
  attr_accessor :options
30
30
 
@@ -55,7 +55,7 @@ module Mixlib
55
55
  private
56
56
 
57
57
  def omnitruck_get(resource, parameters)
58
- uri = URI.parse(OMNITRUCK_ENDPOINT)
58
+ uri = URI.parse(ENDPOINT)
59
59
  http = Net::HTTP.new(uri.host, uri.port)
60
60
  http.use_ssl = (uri.scheme == "https")
61
61
 
@@ -16,12 +16,17 @@
16
16
  #
17
17
 
18
18
  require "mixlib/install/generator/bourne"
19
+ require "mixlib/install/generator/powershell"
19
20
 
20
21
  module Mixlib
21
22
  class Install
22
23
  class Generator
23
24
  def self.install_command(options)
24
- Bourne.new(options).install_command
25
+ if options.for_ps1?
26
+ PowerShell.new(options).install_command
27
+ else
28
+ Bourne.new(options).install_command
29
+ end
25
30
  end
26
31
  end
27
32
  end
@@ -0,0 +1,65 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2015 Chef, Inc.
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ require "erb"
19
+ require "ostruct"
20
+ require "mixlib/install/backend/omnitruck"
21
+
22
+ module Mixlib
23
+ class Install
24
+ class Generator
25
+ class Base
26
+ attr_reader :options
27
+
28
+ def initialize(options)
29
+ @options = options
30
+ end
31
+
32
+ #
33
+ # Returns the base path where the script fragments are located for
34
+ # the generator as a String.
35
+ #
36
+ def self.script_base_path
37
+ raise "You must define a script_base_path for your Generator::Base class."
38
+ end
39
+
40
+ #
41
+ # Gets the contents of the given script.
42
+ #
43
+ def self.get_script(name, context = {})
44
+ script_path = File.join(script_base_path, name)
45
+
46
+ # If there is an erb template we render it, otherwise we just read
47
+ # and returnt the contents of the script
48
+ if File.exist? "#{script_path}.erb"
49
+ # Default values to use incase they are not set in the context
50
+ context[:base_url] ||= Mixlib::Install::Backend::Omnitruck::ENDPOINT
51
+
52
+ context_object = OpenStruct.new(context).instance_eval { binding }
53
+ ERB.new(File.read("#{script_path}.erb")).result(context_object)
54
+ else
55
+ File.read(script_path)
56
+ end
57
+ end
58
+
59
+ def get_script(name, context = {})
60
+ self.class.get_script(name, context)
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -15,28 +15,40 @@
15
15
  # limitations under the License.
16
16
  #
17
17
 
18
+ require "mixlib/install/generator/base"
19
+ require "mixlib/install/backend/artifactory"
20
+
18
21
  module Mixlib
19
22
  class Install
20
23
  class Generator
21
- class Bourne
22
- attr_reader :options
24
+ class Bourne < Base
25
+ def self.install_sh(context)
26
+ install_command = []
27
+ install_command << get_script("helpers.sh")
28
+ install_command << get_script("script_cli_parameters.sh")
29
+ install_command << get_script("platform_detection.sh")
30
+ install_command << get_script("fetch_metadata.sh", context)
31
+ install_command << get_script("fetch_package.sh")
32
+ install_command << get_script("install_package.sh")
33
+ install_command.join("\n\n")
34
+ end
23
35
 
24
- def initialize(options)
25
- @options = options
36
+ def self.script_base_path
37
+ File.join(File.dirname(__FILE__), "bourne/scripts")
26
38
  end
27
39
 
28
40
  def install_command
29
41
  install_command = []
30
- install_command << get_script(:helpers)
42
+ install_command << get_script("helpers.sh")
31
43
  install_command << render_variables
32
- install_command << get_script(:platform_detection)
44
+ install_command << get_script("platform_detection.sh")
33
45
  if options.for_artifactory?
34
46
  install_command << artifactory_urls
35
47
  else
36
- install_command << get_script(:fetch_metadata)
48
+ install_command << get_script("fetch_metadata.sh")
37
49
  end
38
- install_command << get_script(:fetch_package)
39
- install_command << get_script(:install_package)
50
+ install_command << get_script("fetch_package.sh")
51
+ install_command << get_script("install_package.sh")
40
52
 
41
53
  install_command.join("\n\n")
42
54
  end
@@ -50,11 +62,8 @@ EOS
50
62
  end
51
63
 
52
64
  def artifactory_urls
53
- raise "not implemented yet"
54
- end
55
-
56
- def get_script(name)
57
- File.read(File.join(File.dirname(__FILE__), "bourne/scripts/#{name}.sh"))
65
+ artifacts = Mixlib::Install::Backend::Artifactory.new(options).info
66
+ get_script("artifactory_urls.sh", artifacts: artifacts)
58
67
  end
59
68
  end
60
69
  end
@@ -0,0 +1,31 @@
1
+ # artifactory_urls.sh
2
+ ############
3
+ # This section sets up the information for a build to be installed from artifactory
4
+ # then uses $platform, $platform_version and $machine to select the correct
5
+ # version.
6
+ #
7
+ # Inputs:
8
+ # $platform:
9
+ # $platform_version:
10
+ # $machine:
11
+ #
12
+ # Outputs:
13
+ # $download_url:
14
+ # $sha256:
15
+ # $md5:
16
+ ############
17
+
18
+ <% artifacts.each do |artifact| %>
19
+ artifact_info_dir="$tmp_dir/artifact_info/<%= File.join(artifact.platform, artifact.platform_version, artifact.architecture)%>"
20
+ mkdir -p $artifact_info_dir
21
+ touch "$artifact_info_dir/artifact_info"
22
+ echo "url <%= artifact.url%>" >> "$artifact_info_dir/artifact_info"
23
+ echo "md5 <%= artifact.md5%>" >> "$artifact_info_dir/artifact_info"
24
+ echo "sha256 <%= artifact.sha256%>" >> "$artifact_info_dir/artifact_info"
25
+ <% end %>
26
+
27
+ artifact_info_for_platform="$tmp_dir/artifact_info/$platform/$platform_version/$machine/artifact_info"
28
+
29
+ download_url=`awk '$1 == "url" { print $2 }' "$artifact_info_for_platform"`
30
+ sha256=`awk '$1 == "sha256" { print $2 }' "$artifact_info_for_platform"`
31
+ md5=`awk '$1 == "md5" { print $2 }' "$artifact_info_for_platform"`
@@ -21,7 +21,7 @@
21
21
  echo "Getting information for $project $channel $version for $platform..."
22
22
 
23
23
  metadata_filename="$tmp_dir/metadata.txt"
24
- metadata_url="https://omnitruck.chef.io/$channel/$project/metadata?v=$version&p=$platform&pv=$platform_version&m=$machine"
24
+ metadata_url="<%= base_url %>$channel/$project/metadata?v=$version&p=$platform&pv=$platform_version&m=$machine"
25
25
 
26
26
  do_download "$metadata_url" "$metadata_filename"
27
27
 
@@ -274,8 +274,13 @@ install_file() {
274
274
  echo "Installing $project $version"
275
275
  case "$1" in
276
276
  "rpm")
277
- echo "installing with rpm..."
278
- rpm -Uvh --oldpackage --replacepkgs "$2"
277
+ if test "x$platform" = "xnexus" || test "x$platform" = "xios_xr"; then
278
+ echo "installing with yum..."
279
+ yum install -yv "$2"
280
+ else
281
+ echo "installing with rpm..."
282
+ rpm -Uvh --oldpackage --replacepkgs "$2"
283
+ fi
279
284
  ;;
280
285
  "deb")
281
286
  echo "installing with dpkg..."
@@ -96,6 +96,14 @@ 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/os-release"; then
100
+ . /etc/os-release
101
+ if test "x$CISCO_RELEASE_INFO" != "x"; then
102
+ . $CISCO_RELEASE_INFO
103
+ fi
104
+
105
+ platform=$ID
106
+ platform_version=$VERSION
99
107
  fi
100
108
 
101
109
  if test "x$platform" = "x"; then
@@ -0,0 +1,36 @@
1
+ # script_cli_parameters.sh
2
+ ############
3
+ # This section reads the CLI parameters for the install script and translates
4
+ # them to the local parameters to be used later by the script.
5
+ #
6
+ # Outputs:
7
+ # $version: Requested version to be installed.
8
+ # $channel: Channel to install the product from
9
+ # $project: Project to be installed
10
+ # $cmdline_filename: Name of the package downloaded on local disk.
11
+ # $cmdline_dl_dir: Name of the directory downloaded package will be saved to on local disk.
12
+ ############
13
+
14
+ # Defaults
15
+ channel="stable"
16
+ project="chef"
17
+
18
+ while getopts pnv:c:f:P:d: opt
19
+ do
20
+ case "$opt" in
21
+
22
+ v) version="$OPTARG";;
23
+ c) channel="$OPTARG";;
24
+ p) channel="current";; # compat for prerelease option
25
+ n) channel="current";; # compat for nightlies option
26
+ f) cmdline_filename="$OPTARG";;
27
+ P) project="$OPTARG";;
28
+ d) cmdline_dl_dir="$OPTARG";;
29
+ \?) # unknown flag
30
+ echo >&2 \
31
+ "usage: $0 [-P project] [-c release_channel] [-v version] [-f filename | -d download_dir]"
32
+ exit 1;;
33
+ esac
34
+ done
35
+
36
+ shift `expr $OPTIND - 1`
@@ -0,0 +1,94 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2015 Chef, Inc.
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ require "mixlib/install/generator/base"
19
+
20
+ module Mixlib
21
+ class Install
22
+ class Generator
23
+ class PowerShell < Base
24
+ def self.install_ps1(context)
25
+ install_project_module = []
26
+ install_project_module << get_script("helpers.ps1")
27
+ install_project_module << get_script("get_project_metadata.ps1", context)
28
+ install_project_module << get_script("install_project.ps1")
29
+
30
+ install_command = []
31
+ install_command << ps1_modularize(install_project_module.join("\n"), "Omnitruck")
32
+ install_command.join("\n\n")
33
+ end
34
+
35
+ def self.script_base_path
36
+ File.join(File.dirname(__FILE__), "powershell/scripts")
37
+ end
38
+
39
+ def install_command
40
+ install_project_module = []
41
+ install_project_module << get_script("helpers.ps1")
42
+ install_project_module << if options.for_artifactory?
43
+ artifactory_urls
44
+ else
45
+ get_script("get_project_metadata.ps1")
46
+ end
47
+ install_project_module << get_script("install_project.ps1")
48
+
49
+ install_command = []
50
+ install_command << ps1_modularize(install_project_module.join("\n"), "Omnitruck")
51
+ install_command << render_command
52
+ install_command.join("\n\n")
53
+ end
54
+
55
+ def self.ps1_modularize(module_body, module_name)
56
+ ps1_module = []
57
+ ps1_module << "new-module -name #{module_name} -scriptblock {"
58
+ ps1_module << module_body
59
+ ps1_module << "}"
60
+ ps1_module.join("\n")
61
+ end
62
+
63
+ def ps1_modularize(module_body, module_name)
64
+ self.class.ps1_modularize(module_body, module_name)
65
+ end
66
+
67
+ def artifactory_urls
68
+ get_script("get_project_metadata_for_artifactory.ps1",
69
+ artifacts: artifacts)
70
+ end
71
+
72
+ def artifacts
73
+ @artifacts ||= Mixlib::Install::Backend::Artifactory.new(options).info
74
+ end
75
+
76
+ def product_version
77
+ if options.for_artifactory?
78
+ options.resolved_version(artifacts)
79
+ else
80
+ options.product_version
81
+ end
82
+ end
83
+
84
+ def render_command
85
+ <<EOS
86
+ install -project #{options.product_name} \
87
+ -version #{product_version} \
88
+ -channel #{options.channel}
89
+ EOS
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,87 @@
1
+ function Get-ProjectMetadata {
2
+ <#
3
+ .SYNOPSIS
4
+ Get metadata for a Chef Software, Inc. project
5
+ .DESCRIPTION
6
+ Get metadata for project
7
+ .EXAMPLE
8
+ iex (new-object net.webclient).downloadstring('https:/omnitruck.chef.io/install.ps1'); Get-ProjectMetadata -project chef -channel stable
9
+
10
+ Gets the download url, MD5 checksum, and SHA256 checksum for the latest stable release of Chef.
11
+ .EXAMPLE
12
+ iex (irm 'https://omnitruck.chef.io/install.ps1'); Get-ProjectMetadata -project chefdk -channel stable -version 0.8.0
13
+
14
+ Gets the download url, MD5 checksum, and SHA256 checksum for ChefDK 0.8.0.
15
+ #>
16
+ [cmdletbinding()]
17
+ param (
18
+ # Base url to retrieve metadata from.
19
+ [uri]$base_server_uri = '<%= base_url %>',
20
+ [string]
21
+ # Project to install
22
+ # chef - Chef Client
23
+ # chefdk - Chef Development Kit
24
+ # angrychef - AngryChef
25
+ # server and container are not valid windows targets
26
+ [validateset('chef', 'chefdk', 'angrychef')]
27
+ [string]
28
+ $project = 'chef',
29
+ # Version of the application to install
30
+ # This parameter is optional, if not supplied it will provide the latest version,
31
+ # and if an iteration number is not specified, it will grab the latest available iteration.
32
+ # Partial version numbers are also acceptable (using v=11
33
+ # will grab the latest 11.x client which matches the other flags).
34
+ [string]
35
+ $version,
36
+ # Release channel to install from
37
+ [validateset('current', 'stable')]
38
+ [string]
39
+ $channel = 'stable',
40
+ # The following legacy switches are just aliases for the current channel
41
+ [switch]
42
+ $prerelease,
43
+ [switch]
44
+ $nightlies
45
+ )
46
+
47
+ # The following legacy switches are just aliases for the current channel
48
+ if (($prerelease -eq $true)) { $channel = 'current'}
49
+ if (($nightlies -eq $true)) { $channel = 'current'}
50
+
51
+ # PowerShell is only on Windows ATM
52
+ $platform = 'windows'
53
+ Write-Verbose "Platform: $platform"
54
+
55
+ # TODO: No Win10 build endpoint yet
56
+ switch -regex ((get-wmiobject win32_operatingsystem).version) {
57
+ '10\.0\.\d+' {$platform_version = '2012r2'}
58
+ '6\.3\.\d+' {$platform_version = '2012r2'}
59
+ '6\.2\.\d+' {$platform_version = '2012'}
60
+ '6\.1\.\d+' {$platform_version = '2008r2'}
61
+ '6\.0\.\d+' {$platform_version = '2008'}
62
+ }
63
+ Write-Verbose "Platform Version: $platform_version"
64
+
65
+ # TODO: When we ship a 64 bit ruby for Windows.
66
+ $machine = 'x86_64'
67
+ Write-Verbose "Machine: $machine"
68
+ Write-Verbose "Project: $project"
69
+
70
+ $metadata_base_url = "$($channel)/$($project)/metadata"
71
+ $metadata_array = ("?v=$($version)",
72
+ "p=$platform",
73
+ "pv=$platform_version",
74
+ "m=$machine")
75
+ $metadata_base_url += [string]::join('&', $metadata_array)
76
+ $metadata_url = new-uri $base_server_uri $metadata_base_url
77
+
78
+ Write-Verbose "Downloading $project details from $metadata_url"
79
+ $package_metadata = (Get-WebContent $metadata_url).trim() -split '\n' |
80
+ foreach { $hash = @{} } {$key, $value = $_ -split '\s+'; $hash.Add($key, $value)} {$hash}
81
+
82
+ Write-Verbose "Project details: "
83
+ foreach ($key in $package_metadata.keys) {
84
+ Write-Verbose "`t$key = $($package_metadata[$key])"
85
+ }
86
+ $package_metadata
87
+ }