Class: KuberKit::ImageCompiler::ImageDependencyResolver

Inherits:
Object
  • Object
show all
Defined in:
lib/kuber_kit/image_compiler/image_dependency_resolver.rb

Constant Summary collapse

CircularDependencyError =
Class.new(KuberKit::Error)
DependencyNotFoundError =
Class.new(KuberKit::NotFoundError)

Instance Method Summary collapse

Instance Method Details

#each_with_deps(image_names, &block) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/kuber_kit/image_compiler/image_dependency_resolver.rb', line 11

def each_with_deps(image_names, &block)
  compile_limit = configs.compile_simultaneous_limit

  resolved_dependencies = []
  next_dependencies = get_next(image_names, limit: compile_limit)

  while (next_dependencies - resolved_dependencies).any?
    block.call(next_dependencies)
    resolved_dependencies += next_dependencies
    next_dependencies = get_next(image_names, resolved: resolved_dependencies, limit: compile_limit)
  end

  block.call(image_names - resolved_dependencies)
end

#get_deps(image_name) ⇒ Object



57
58
59
# File 'lib/kuber_kit/image_compiler/image_dependency_resolver.rb', line 57

def get_deps(image_name)
  image_store.get_definition(image_name).dependencies
end

#get_next(image_names, resolved: [], limit: nil) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
# File 'lib/kuber_kit/image_compiler/image_dependency_resolver.rb', line 30

def get_next(image_names, resolved: [], limit: nil)
  deps = Array(image_names).map { |i| get_recursive_deps(i) }.flatten.uniq

  ready_to_resolve = deps.select do |dep_name|
    unresolved_deps = get_deps(dep_name) - resolved
    unresolved_deps.empty?
  end
  unresolved_deps = ready_to_resolve - resolved
  unresolved_deps = unresolved_deps.take(limit) if limit
  unresolved_deps
end

#get_recursive_deps(image_name, dependency_tree: []) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/kuber_kit/image_compiler/image_dependency_resolver.rb', line 42

def get_recursive_deps(image_name, dependency_tree: [])
  deps = get_deps(image_name)

  if dependency_tree.include?(image_name)
    raise CircularDependencyError, "Circular dependency found for #{image_name}. Dependency tree: #{dependency_tree.inspect}"
  end

  child_deps = []
  deps.each do |i| 
    child_deps += get_recursive_deps(i, dependency_tree: dependency_tree + [image_name])
  end

  (deps + child_deps).uniq
end