class Chef::Provider::Package::Habitat

Public Instance Methods

install_package(names, versions) click to toggle source
# File lib/chef/provider/package/habitat.rb, line 41
def install_package(names, versions)
  # License acceptance needed outside of local Chef Client
  shell_out!("hab license accept") if Chef::Config.target_mode?

  names.zip(versions).map do |n, v|
    opts = ["pkg", "install", "--channel", new_resource.channel, "--url", new_resource.bldr_url]
    opts += ["--auth", new_resource.auth_token] if new_resource.auth_token
    opts += ["#{strip_version(n)}/#{v}", new_resource.options]
    opts += ["--binlink"] if new_resource.binlink
    opts += ["--force"] if new_resource.binlink.eql? :force
    hab(opts)
  end
end
Also aliased as: upgrade_package
load_current_resource() click to toggle source
# File lib/chef/provider/package/habitat.rb, line 31
def load_current_resource
  @current_resource = Chef::Resource::HabitatPackage.new(new_resource.name)
  current_resource.package_name(strip_version(new_resource.package_name))

  @candidate_version = candidate_versions
  current_resource.version(current_versions)

  current_resource
end
purge_package(names, versions)
Alias for: remove_package
remove_package(names, versions) click to toggle source
# File lib/chef/provider/package/habitat.rb, line 57
def remove_package(names, versions)
  # raise 'It is too dangerous to :remove packages with the habitat_package resource right now. This functionality should be deferred to the hab cli.'
  names.zip(versions).map do |n, v|
    opts = %w{pkg uninstall}
    opts += ["--keep-latest", new_resource.keep_latest ] if new_resource.keep_latest
    opts += ["#{strip_version(n).chomp("/")}#{v}", new_resource.options]
    opts += ["--exclude"] if new_resource.exclude
    opts += ["--no-deps"] if new_resource.no_deps
    hab(opts)
    # action :remove
  end
end
Also aliased as: purge_package
upgrade_package(names, versions)
Alias for: install_package

Private Instance Methods

candidate_versions() click to toggle source
# File lib/chef/provider/package/habitat.rb, line 128
def candidate_versions
  package_name_array.zip(new_version_array).map do |n, v|
    package_version(n, v)
  end
end
current_versions() click to toggle source
# File lib/chef/provider/package/habitat.rb, line 134
def current_versions
  package_name_array.map do |n|
    installed_version(n)
  end
end
depot_package(name, version = nil) click to toggle source
# File lib/chef/provider/package/habitat.rb, line 95
def depot_package(name, version = nil)
  @depot_package ||= {}
  @depot_package[name] ||=
    begin
      origin, pkg_name = name.split("/")
      name_version = [pkg_name, version].compact.join("/").squeeze("/").chomp("/").sub(%r{^\/}, "")
      url = if new_resource.bldr_url.include?("/v1/")
              "#{new_resource.bldr_url.chomp("/")}/depot/channels/#{origin}/#{new_resource.channel}/pkgs/#{name_version}"
            else
              "#{new_resource.bldr_url.chomp("/")}/v1/depot/channels/#{origin}/#{new_resource.channel}/pkgs/#{name_version}"
            end
      url << "/latest" unless name_version.count("/") >= 2
      url << "?#{platform_target}" unless platform_target.empty?

      headers = {}
      headers["Authorization"] = "Bearer #{new_resource.auth_token}" if new_resource.auth_token

      Chef::JSONCompat.parse(http.get(url, headers))
    rescue Net::HTTPClientException
      nil
    end
end
http() click to toggle source
# File lib/chef/provider/package/habitat.rb, line 123
def http
  # FIXME: use SimpleJSON when the depot mime-type is fixed
  @http ||= TargetIO::HTTP.new(new_resource.bldr_url.to_s)
end
installed_version(ident) click to toggle source
# File lib/chef/provider/package/habitat.rb, line 140
def installed_version(ident)
  hab("pkg", "path", ident).stdout.chomp.split(windows? ? "\\" : "/")[-2..-1].join("/")
rescue Mixlib::ShellOut::ShellCommandFailed
  nil
end
package_version(name, version = nil) click to toggle source
# File lib/chef/provider/package/habitat.rb, line 118
def package_version(name, version = nil)
  p = depot_package(name, version)
  "#{p["ident"]["version"]}/#{p["ident"]["release"]}" unless p.nil?
end
platform_target() click to toggle source
# File lib/chef/provider/package/habitat.rb, line 85
def platform_target
  if windows?
    "target=x86_64-windows"
  elsif node["kernel"]["release"].to_i < 3
    "target=x86_64-linux-kernel2"
  else
    ""
  end
end
strip_version(name) click to toggle source
# File lib/chef/provider/package/habitat.rb, line 78
def strip_version(name)
  validate_name!(name)
  n = name.squeeze("/").chomp("/").sub(%r{^\/}, "")
  n = n[0..(n.rindex("/") - 1)] while n.count("/") >= 2
  n
end
validate_name!(name) click to toggle source
# File lib/chef/provider/package/habitat.rb, line 74
def validate_name!(name)
  raise ArgumentError, "package name must be specified as 'origin/name', use the 'version' property to specify a version" unless name.squeeze("/").count("/") < 2
end
version_compare(v1, v2) click to toggle source

This is used by the superclass Chef::Provider::Package

# File lib/chef/provider/package/habitat.rb, line 160
def version_compare(v1, v2)
  require "mixlib/versioning" unless defined?(Mixlib::Versioning)
  # Convert the package version (X.Y.Z/DATE) into a version that Mixlib::Versioning understands (X.Y.Z+DATE)
  hab_v1 = Mixlib::Versioning.parse(v1.tr("/", "+"))
  hab_v2 = Mixlib::Versioning.parse(v2.tr("/", "+"))
  hab_v1 <=> hab_v2
end
version_requirement_satisfied?(current_version, new_version) click to toggle source

This is used by the superclass Chef::Provider::Package

# File lib/chef/provider/package/habitat.rb, line 147
def version_requirement_satisfied?(current_version, new_version)
  return false if new_version.nil? || current_version.nil?

  nv_parts = new_version.squeeze("/").split("/")

  if nv_parts.count < 2
    current_version.squeeze("/").split("/")[0] == new_version.squeeze("/")
  else
    current_version.squeeze("/") == new_resource.version.squeeze("/")
  end
end