Class: Bolt::ModuleInstaller::Resolver

Inherits:
Object
  • Object
show all
Defined in:
lib/bolt/module_installer/resolver.rb

Instance Method Summary collapse

Instance Method Details

#resolve(specs) ⇒ Object

Resolves module specs and returns a Puppetfile object.



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/bolt/module_installer/resolver.rb', line 12

def resolve(specs)
  require 'puppetfile-resolver'

  # Build the document model from the specs.
  document = PuppetfileResolver::Puppetfile::Document.new('')

  specs.specs.each do |spec|
    document.add_module(spec.to_resolver_module)
  end

  # Make sure the document model is valid.
  unless document.valid?
    message = <<~MESSAGE.chomp
      Unable to resolve module specifications:

      #{document.validation_errors.map(&:message).join("\n")}
    MESSAGE

    raise Bolt::Error.new(message, 'bolt/module-resolver-error')
  end

  # Create the resolver using the Puppetfile model. nil disables Puppet
  # version restrictions.
  resolver = PuppetfileResolver::Resolver.new(document, nil)

  # Configure and resolve the dependency graph, catching any errors
  # raised by puppetfile-resolver and re-raising them as Bolt errors.
  begin
    result = resolver.resolve(
      cache:                 nil,
      ui:                    nil,
      module_paths:          [],
      allow_missing_modules: false
    )
  rescue StandardError => e
    raise Bolt::Error.new(e.message, 'bolt/module-resolver-error')
  end

  # Convert the specs returned from the resolver into Bolt module objects.
  modules = result.specifications.values.each_with_object([]) do |mod, acc|
    # Skip over anything that isn't a module spec, such as a Puppet spec.
    next unless mod.is_a? PuppetfileResolver::Models::ModuleSpecification

    case mod.origin
    when :forge
      acc << Bolt::ModuleInstaller::Puppetfile::ForgeModule.new(
        "#{mod.owner}/#{mod.name}",
        mod.version.to_s
      )
    when :git
      spec = specs.specs.find { |s| s.name == mod.name }
      acc << Bolt::ModuleInstaller::Puppetfile::GitModule.new(
        spec.name,
        spec.git,
        spec.sha
      )
    end
  end

  # Create the Puppetfile object.
  Bolt::ModuleInstaller::Puppetfile.new(modules)
end