class Luban::Deployment::Package::Base

Attributes

current_version[R]

Public Class Methods

apply_to(version, &blk) click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 23
def apply_to(version, &blk)
  dependencies.apply_to(version, &blk)
end
decompose_version(version) click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 51
def decompose_version(version)
  { major_version: version, patch_level: '' }
end
dependencies() click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 19
def dependencies
  @dependencies ||= DependencySet.new
end
get_latest_version() click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 63
def get_latest_version
  raise NotImplementedError, "#{self.class.name}#get_latest_version is an abstract method."
end
inherited(subclass) click to toggle source
Calls superclass method Luban::Deployment::Command::inherited
# File lib/luban/deployment/cli/package/base.rb, line 8
def inherited(subclass)
  super
  # Ensure package dependencies from base class
  # got inherited to its subclasses

  subclass.instance_variable_set(
    '@dependencies',
    Marshal.load(Marshal.dump(dependencies))
  )
end
latest_version() click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 57
def latest_version
  version_mutex.synchronize do
    @latest_version ||= get_latest_version
  end
end
package_class(package) click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 31
def package_class(package)
  require_path = package_require_path(package)
  require require_path.to_s
  package_base_class(require_path)
rescue LoadError => e
  abort "Aborted! Failed to load package #{require_path}: #{e.message}"
end
required_packages_for(version) click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 27
def required_packages_for(version)
  dependencies.dependencies_for(version)
end
version_mutex() click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 55
def version_mutex; @version_mutex ||= Mutex.new; end
worker_class(worker, package: self) click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 39
def worker_class(worker, package: self)
  if package.is_a?(Class)
    if package == self
      super(worker)
    else
      package.worker_class(worker)
    end
  else
    package_class(package).worker_class(worker)
  end
end

Protected Class Methods

package_base_class(path) click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 77
def package_base_class(path)
  Object.const_get(path.to_s.camelcase, false)
end
package_require_path(package_name) click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 69
def package_require_path(package_name)
  package_require_root.join(package_name.to_s.gsub(':', '/'))
end
package_require_root() click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 73
def package_require_root
  @default_package_root ||= Pathname.new("luban/deployment/packages")
end

Public Instance Methods

binstubs(args:, opts:) click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 163
def binstubs(args:, opts:)
  if current_version
    update_binstubs(args: args, opts: opts.merge(version: current_version))
  else
    versions.each do |v|
      update_binstubs(args: args, opts: opts.merge(version: v))
    end
  end
end
cleanup(args:, opts:) click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 157
def cleanup(args:, opts:)
  versions.each do |v|
    cleanup_all(args: args, opts: opts.merge(version: v))
  end
end
deprecated_versions() click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 112
def deprecated_versions; package_options.select { |v, o| o[:deprecated] }.keys; end
find_application(name = nil) click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 89
def find_application(name = nil)
  name.nil? ? parent : find_project.apps[name.to_sym]
end
find_project() click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 88
def find_project; parent.parent; end
has_version?(version) click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 107
def has_version?(version)
  package_options.has_key?(version)
end
install(args:, opts:) click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 123
def install(args:, opts:)
  result = download_package(args: args, opts: opts)
  unless result.nil? or result.status == :failed
    install_package(args: args, opts: opts)
  end
end
install_all(args:, opts:) click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 130
def install_all(args:, opts:)
  installable_versions.each do |v| 
    install(args: args, opts: opts.merge(version: v))
  end
  deprecated_versions.each do |v| 
    uninstall(args: args, opts: opts.merge(version: v))
  end
end
installable_versions() click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 113
def installable_versions; package_options.select { |v, o| !o[:deprecated] }.keys; end
monitorable?() click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 86
def monitorable?; false; end
package_options() click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 95
def package_options; @package_options ||= {}; end
show_current(args:, opts:) click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 173
def show_current(args:, opts:)
  if current_version
    print_summary(get_summary(args: args, opts: opts.merge(version: current_version)))
  else
    puts "    Warning! No current version of #{display_name} is specified."
  end
end
show_summary(args:, opts:) click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 181
def show_summary(args:, opts:)
  versions.each do |v|
    print_summary(get_summary(args: args, opts: opts.merge(version: v)))
  end
end
uninstall(args:, opts:) click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 146
def uninstall(args:, opts:)
  servers = select_servers(opts[:roles], opts[:hosts])
  apps = parent.other_package_users_for(name, opts[:version], servers: servers)
  if apps.empty? or opts[:force]
    uninstall!(args: args, opts: opts)
  else
    puts "  Skipped! #{name}-#{opts[:version]} is being used by #{apps.join(', ')}. " +
         "use -f to force uninstalling if necessary."
  end
end
Also aliased as: uninstall!
uninstall!(args:, opts:)
Alias for: uninstall
uninstall_all(args:, opts:) click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 139
def uninstall_all(args:, opts:)
  versions.each do |v|
    uninstall(args: args, opts: opts.merge(version: v))
  end
end
update_package_options(version, **opts) click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 97
def update_package_options(version, **opts)
  unless has_version?(version)
    version = self.class.package_class(name).latest_version if version == 'latest'
    package_options[version] = 
      { name: name.to_s }.merge!(self.class.decompose_version(version))
  end
  @current_version = version if opts[:current]
  package_options[version].merge!(opts)
end
versions() click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 111
def versions; package_options.keys; end
whence(args:, opts:) click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 195
def whence(args:, opts:)
  versions.each do |v|
    print_summary(whence_origin(args: args, opts: opts.merge(version: v)))
  end
end
which(args:, opts:) click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 187
def which(args:, opts:)
  if current_version
    print_summary(which_current(args: args, opts: opts.merge(version: current_version)))
  else
    puts "    Warning! No current version of #{display_name} is specified."
  end
end

Protected Instance Methods

compose_task_options(opts) click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 212
def compose_task_options(opts)
  opts = super
  version = opts[:version]
  unless version.nil?
    # Merge package options into task options without nil ones
    opts = package_options[version].merge(opts.reject { |_, v| v.nil? })
  end
  opts
end
print_summary(result) click to toggle source
set_parameters() click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 203
def set_parameters
  self.config = parent.config
end
setup_descriptions() click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 222
def setup_descriptions
  desc "Manage package #{display_name}"
  long_desc "Manage the deployment of package #{display_name} in #{parent.class.name}"
end
setup_provision_tasks() click to toggle source
# File lib/luban/deployment/cli/package/base.rb, line 227
def setup_provision_tasks
  super

  commands[:provision].undef_task :setup
  commands[:provision].undef_task :build
  commands[:provision].undef_task :destroy

  _package = self
  commands[:provision].alter do
    task :install do
      desc "Install a given version"
      long_desc "Install a given version in #{_package.parent.class.name}"
      option :version, "Version to install", short: :v, required: true,
             assure: ->(v){ _package.versions.include?(v) }
      switch :force, "Force to install", short: :f
      action! :install
    end

    task :install_all do
      desc "Install all versions"
      long_desc "Install all versions in #{_package.parent.class.name}"
      switch :force, "Force to install", short: :f
      action! :install_all
    end

    task :uninstall do
      desc "Uninstall a given version"
      long_desc "Uninstall a given version in #{_package.parent.class.name}"
      option :version, "Version to uninstall", short: :v, required: true,
              assure: ->(v){ _package.versions.include?(v) }
      switch :force, "Force to uninstall", short: :f
      action! :uninstall
    end

    task :uninstall_all do
      desc "Uninstall all versions"
      long_desc "Uninstall all versions in #{_package.parent.class.name}"
      switch :force, "Force to uninstall", short: :f, required: true
      action! :uninstall_all
    end
  end
end
setup_tasks() click to toggle source
Calls superclass method Luban::Deployment::Command#setup_tasks
# File lib/luban/deployment/cli/package/base.rb, line 207
def setup_tasks
  super
  setup_provision_tasks
end