class Kontena::Stacks::ChangeResolver

Attributes

new_data[R]
old_data[R]

Public Class Methods

new(old_data, new_data) click to toggle source

Creates a change analysis from two sets of stack data. The format is a flat hash of all related stacks.

@param old_data [DataSet,Hash] @param new_data [DataSet,Hash]

# File lib/kontena/stacks/change_resolver.rb, line 13
def initialize(old_data, new_data)
  @old_data = old_data.is_a?(StackDataSet) ? old_data : StackDataSet.new(old_data)
  @new_data = new_data.is_a?(StackDataSet) ? new_data : StackDataSet.new(new_data)
  analyze
end

Public Instance Methods

added_services() click to toggle source

@return [Array<String>] an array of services that should be added

# File lib/kontena/stacks/change_resolver.rb, line 20
def added_services
  @added_services ||= []
end
added_stacks() click to toggle source

@return [Array<String>] an array of stack installation names that should be removed

# File lib/kontena/stacks/change_resolver.rb, line 40
def added_stacks
  @added_stacks ||= []
end
analyze() click to toggle source
# File lib/kontena/stacks/change_resolver.rb, line 64
def analyze
  old_names = old_data.stack_names
  new_names = new_data.stack_names

  removed_stacks.concat(old_names - new_names)
  added_stacks.concat(new_names - old_names)
  (new_names & old_names).each do |candidate|
    upgraded_stacks << candidate if stack_upgraded?(candidate)
  end

  removed_stacks.each do |removed_stack|
    removed_services.concat(
      old_data.stack(removed_stack).service_names.map { |name| "#{removed_stack}/#{name}"}
    )
  end

  added_stacks.each do |added_stack|
    added_services.concat(
      new_data.stack(added_stack).service_names.map { |name| "#{added_stack}/#{name}"}
    )
  end

  upgraded_stacks.each do |upgraded_stack|
    old_stack = old_data.stack(upgraded_stack).stack_name
    new_stack = new_data.stack(upgraded_stack).stack_name

    unless old_stack == new_stack
      replaced_stacks[upgraded_stack] = { from: old_stack, to: new_stack }
    end

    old_services = old_data.stack(upgraded_stack).service_names.map { |name| "#{upgraded_stack}/#{name}" }
    new_services = new_data.stack(upgraded_stack).service_names.map { |name| "#{upgraded_stack}/#{name}" }

    removed_services.concat(old_services - new_services)
    added_services.concat(new_services - old_services)
    upgraded_services.concat(new_services & old_services)
  end
end
remaining_stacks() click to toggle source

@return [Array<String>] an array of installed stack names that should exist after upgrade

# File lib/kontena/stacks/change_resolver.rb, line 55
def remaining_stacks
  @remaining_stacks ||= added_stacks + upgraded_stacks
end
removed_services() click to toggle source

@return [Array<String>] an array of services that should be removed

# File lib/kontena/stacks/change_resolver.rb, line 25
def removed_services
  @removed_services ||= []
end
removed_stacks() click to toggle source

@return [Array<String>] an array of stack installation names that should be removed

# File lib/kontena/stacks/change_resolver.rb, line 35
def removed_stacks
  @removed_stacks ||= []
end
replaced_stacks() click to toggle source

@return [Hash] a hash of “installed-stack-name” => { :from => 'stackname', :to => 'new-stackname' }

# File lib/kontena/stacks/change_resolver.rb, line 50
def replaced_stacks
  @replaced_stacks ||= {}
end
safe?() click to toggle source

@return [Boolean]

# File lib/kontena/stacks/change_resolver.rb, line 60
def safe?
  removed_stacks.empty? && replaced_stacks.empty? && removed_services.empty?
end
stack_upgraded?(name) click to toggle source

Stack is upgraded if version, stack name, variables change or stack is root

@param name [String] @return [Boolean]

# File lib/kontena/stacks/change_resolver.rb, line 107
def stack_upgraded?(name)
  old_stack = old_data.stack(name)
  new_stack = new_data.stack(name)
  return true if new_stack.root?
  return true if old_stack.version != new_stack.version
  return true if old_stack.stack_name != new_stack.stack_name
  return true if old_stack.variables != new_stack.variables

  false
end
upgraded_services() click to toggle source

@return [Array<String>] an array of services that should be upgraded

# File lib/kontena/stacks/change_resolver.rb, line 30
def upgraded_services
  @upgraded_services ||= []
end
upgraded_stacks() click to toggle source

@return [Array<String>] an array of stack installation names that should be upgraded

# File lib/kontena/stacks/change_resolver.rb, line 45
def upgraded_stacks
  @upgraded_stacks ||= []
end