openbolt 5.0.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Puppetfile +52 -0
- data/bolt-modules/boltlib/lib/puppet/datatypes/applyresult.rb +60 -0
- data/bolt-modules/boltlib/lib/puppet/datatypes/containerresult.rb +51 -0
- data/bolt-modules/boltlib/lib/puppet/datatypes/future.rb +25 -0
- data/bolt-modules/boltlib/lib/puppet/datatypes/resourceinstance.rb +71 -0
- data/bolt-modules/boltlib/lib/puppet/datatypes/result.rb +55 -0
- data/bolt-modules/boltlib/lib/puppet/datatypes/resultset.rb +65 -0
- data/bolt-modules/boltlib/lib/puppet/datatypes/target.rb +93 -0
- data/bolt-modules/boltlib/lib/puppet/functions/add_facts.rb +33 -0
- data/bolt-modules/boltlib/lib/puppet/functions/add_to_group.rb +38 -0
- data/bolt-modules/boltlib/lib/puppet/functions/apply_prep.rb +208 -0
- data/bolt-modules/boltlib/lib/puppet/functions/background.rb +62 -0
- data/bolt-modules/boltlib/lib/puppet/functions/catch_errors.rb +57 -0
- data/bolt-modules/boltlib/lib/puppet/functions/download_file.rb +130 -0
- data/bolt-modules/boltlib/lib/puppet/functions/facts.rb +31 -0
- data/bolt-modules/boltlib/lib/puppet/functions/fail_plan.rb +52 -0
- data/bolt-modules/boltlib/lib/puppet/functions/get_resources.rb +87 -0
- data/bolt-modules/boltlib/lib/puppet/functions/get_target.rb +34 -0
- data/bolt-modules/boltlib/lib/puppet/functions/get_targets.rb +35 -0
- data/bolt-modules/boltlib/lib/puppet/functions/parallelize.rb +74 -0
- data/bolt-modules/boltlib/lib/puppet/functions/puppetdb_command.rb +97 -0
- data/bolt-modules/boltlib/lib/puppet/functions/puppetdb_fact.rb +47 -0
- data/bolt-modules/boltlib/lib/puppet/functions/puppetdb_query.rb +52 -0
- data/bolt-modules/boltlib/lib/puppet/functions/remove_from_group.rb +40 -0
- data/bolt-modules/boltlib/lib/puppet/functions/resolve_references.rb +42 -0
- data/bolt-modules/boltlib/lib/puppet/functions/resource.rb +53 -0
- data/bolt-modules/boltlib/lib/puppet/functions/run_command.rb +106 -0
- data/bolt-modules/boltlib/lib/puppet/functions/run_container.rb +162 -0
- data/bolt-modules/boltlib/lib/puppet/functions/run_plan.rb +291 -0
- data/bolt-modules/boltlib/lib/puppet/functions/run_script.rb +145 -0
- data/bolt-modules/boltlib/lib/puppet/functions/run_task.rb +164 -0
- data/bolt-modules/boltlib/lib/puppet/functions/run_task_with.rb +211 -0
- data/bolt-modules/boltlib/lib/puppet/functions/set_config.rb +48 -0
- data/bolt-modules/boltlib/lib/puppet/functions/set_feature.rb +43 -0
- data/bolt-modules/boltlib/lib/puppet/functions/set_resources.rb +145 -0
- data/bolt-modules/boltlib/lib/puppet/functions/set_var.rb +38 -0
- data/bolt-modules/boltlib/lib/puppet/functions/upload_file.rb +101 -0
- data/bolt-modules/boltlib/lib/puppet/functions/vars.rb +29 -0
- data/bolt-modules/boltlib/lib/puppet/functions/wait.rb +131 -0
- data/bolt-modules/boltlib/lib/puppet/functions/wait_until_available.rb +59 -0
- data/bolt-modules/boltlib/lib/puppet/functions/without_default_logging.rb +39 -0
- data/bolt-modules/boltlib/lib/puppet/functions/write_file.rb +50 -0
- data/bolt-modules/boltlib/types/planresult.pp +18 -0
- data/bolt-modules/boltlib/types/targetspec.pp +7 -0
- data/bolt-modules/ctrl/lib/puppet/functions/ctrl/do_until.rb +42 -0
- data/bolt-modules/ctrl/lib/puppet/functions/ctrl/sleep.rb +20 -0
- data/bolt-modules/dir/lib/puppet/functions/dir/children.rb +35 -0
- data/bolt-modules/file/lib/puppet/functions/file/delete.rb +21 -0
- data/bolt-modules/file/lib/puppet/functions/file/exists.rb +28 -0
- data/bolt-modules/file/lib/puppet/functions/file/join.rb +20 -0
- data/bolt-modules/file/lib/puppet/functions/file/read.rb +33 -0
- data/bolt-modules/file/lib/puppet/functions/file/readable.rb +28 -0
- data/bolt-modules/file/lib/puppet/functions/file/write.rb +24 -0
- data/bolt-modules/log/lib/puppet/functions/log/debug.rb +39 -0
- data/bolt-modules/log/lib/puppet/functions/log/error.rb +40 -0
- data/bolt-modules/log/lib/puppet/functions/log/fatal.rb +40 -0
- data/bolt-modules/log/lib/puppet/functions/log/info.rb +39 -0
- data/bolt-modules/log/lib/puppet/functions/log/trace.rb +39 -0
- data/bolt-modules/log/lib/puppet/functions/log/warn.rb +41 -0
- data/bolt-modules/out/lib/puppet/functions/out/message.rb +36 -0
- data/bolt-modules/out/lib/puppet/functions/out/verbose.rb +35 -0
- data/bolt-modules/prompt/lib/puppet/functions/prompt/menu.rb +103 -0
- data/bolt-modules/prompt/lib/puppet/functions/prompt.rb +65 -0
- data/bolt-modules/system/lib/puppet/functions/system/env.rb +20 -0
- data/exe/bolt +17 -0
- data/guides/debugging.yaml +27 -0
- data/guides/inventory.yaml +23 -0
- data/guides/links.yaml +12 -0
- data/guides/logging.yaml +17 -0
- data/guides/module.yaml +18 -0
- data/guides/modulepath.yaml +24 -0
- data/guides/project.yaml +21 -0
- data/guides/targets.yaml +28 -0
- data/guides/transports.yaml +22 -0
- data/lib/bolt/analytics.rb +233 -0
- data/lib/bolt/application.rb +806 -0
- data/lib/bolt/applicator.rb +368 -0
- data/lib/bolt/apply_inventory.rb +93 -0
- data/lib/bolt/apply_result.rb +154 -0
- data/lib/bolt/apply_target.rb +90 -0
- data/lib/bolt/bolt_option_parser.rb +1226 -0
- data/lib/bolt/catalog/logging.rb +15 -0
- data/lib/bolt/catalog.rb +144 -0
- data/lib/bolt/cli.rb +949 -0
- data/lib/bolt/config/modulepath.rb +30 -0
- data/lib/bolt/config/options.rb +673 -0
- data/lib/bolt/config/transport/base.rb +133 -0
- data/lib/bolt/config/transport/docker.rb +34 -0
- data/lib/bolt/config/transport/jail.rb +33 -0
- data/lib/bolt/config/transport/local.rb +39 -0
- data/lib/bolt/config/transport/lxd.rb +34 -0
- data/lib/bolt/config/transport/options.rb +431 -0
- data/lib/bolt/config/transport/orch.rb +41 -0
- data/lib/bolt/config/transport/podman.rb +33 -0
- data/lib/bolt/config/transport/remote.rb +24 -0
- data/lib/bolt/config/transport/ssh.rb +138 -0
- data/lib/bolt/config/transport/winrm.rb +63 -0
- data/lib/bolt/config.rb +515 -0
- data/lib/bolt/container_result.rb +105 -0
- data/lib/bolt/error.rb +194 -0
- data/lib/bolt/executor.rb +539 -0
- data/lib/bolt/fiber_executor.rb +190 -0
- data/lib/bolt/inventory/group.rb +446 -0
- data/lib/bolt/inventory/inventory.rb +391 -0
- data/lib/bolt/inventory/options.rb +139 -0
- data/lib/bolt/inventory/target.rb +293 -0
- data/lib/bolt/inventory.rb +120 -0
- data/lib/bolt/logger.rb +252 -0
- data/lib/bolt/module.rb +54 -0
- data/lib/bolt/module_installer/installer.rb +44 -0
- data/lib/bolt/module_installer/puppetfile/forge_module.rb +54 -0
- data/lib/bolt/module_installer/puppetfile/git_module.rb +37 -0
- data/lib/bolt/module_installer/puppetfile/module.rb +26 -0
- data/lib/bolt/module_installer/puppetfile.rb +131 -0
- data/lib/bolt/module_installer/resolver.rb +129 -0
- data/lib/bolt/module_installer/specs/forge_spec.rb +91 -0
- data/lib/bolt/module_installer/specs/git_spec.rb +150 -0
- data/lib/bolt/module_installer/specs/id/base.rb +116 -0
- data/lib/bolt/module_installer/specs/id/gitclone.rb +120 -0
- data/lib/bolt/module_installer/specs/id/github.rb +90 -0
- data/lib/bolt/module_installer/specs/id/gitlab.rb +92 -0
- data/lib/bolt/module_installer/specs.rb +95 -0
- data/lib/bolt/module_installer.rb +208 -0
- data/lib/bolt/node/errors.rb +55 -0
- data/lib/bolt/node/output.rb +29 -0
- data/lib/bolt/outputter/human.rb +958 -0
- data/lib/bolt/outputter/json.rb +205 -0
- data/lib/bolt/outputter/logger.rb +76 -0
- data/lib/bolt/outputter/rainbow.rb +118 -0
- data/lib/bolt/outputter.rb +57 -0
- data/lib/bolt/pal/issues.rb +19 -0
- data/lib/bolt/pal/logging.rb +17 -0
- data/lib/bolt/pal/yaml_plan/evaluator.rb +83 -0
- data/lib/bolt/pal/yaml_plan/loader.rb +94 -0
- data/lib/bolt/pal/yaml_plan/parameter.rb +63 -0
- data/lib/bolt/pal/yaml_plan/step/command.rb +45 -0
- data/lib/bolt/pal/yaml_plan/step/download.rb +37 -0
- data/lib/bolt/pal/yaml_plan/step/eval.rb +42 -0
- data/lib/bolt/pal/yaml_plan/step/message.rb +31 -0
- data/lib/bolt/pal/yaml_plan/step/plan.rb +42 -0
- data/lib/bolt/pal/yaml_plan/step/resources.rb +170 -0
- data/lib/bolt/pal/yaml_plan/step/script.rb +62 -0
- data/lib/bolt/pal/yaml_plan/step/task.rb +42 -0
- data/lib/bolt/pal/yaml_plan/step/upload.rb +37 -0
- data/lib/bolt/pal/yaml_plan/step/verbose.rb +31 -0
- data/lib/bolt/pal/yaml_plan/step.rb +223 -0
- data/lib/bolt/pal/yaml_plan/transpiler.rb +90 -0
- data/lib/bolt/pal/yaml_plan.rb +172 -0
- data/lib/bolt/pal.rb +847 -0
- data/lib/bolt/plan_creator.rb +219 -0
- data/lib/bolt/plan_future.rb +86 -0
- data/lib/bolt/plan_result.rb +44 -0
- data/lib/bolt/plugin/cache.rb +76 -0
- data/lib/bolt/plugin/env_var.rb +54 -0
- data/lib/bolt/plugin/module.rb +276 -0
- data/lib/bolt/plugin/prompt.rb +36 -0
- data/lib/bolt/plugin/puppet_connect_data.rb +84 -0
- data/lib/bolt/plugin/puppetdb.rb +124 -0
- data/lib/bolt/plugin/task.rb +72 -0
- data/lib/bolt/plugin.rb +380 -0
- data/lib/bolt/project.rb +219 -0
- data/lib/bolt/project_manager/config_migrator.rb +113 -0
- data/lib/bolt/project_manager/inventory_migrator.rb +67 -0
- data/lib/bolt/project_manager/migrator.rb +39 -0
- data/lib/bolt/project_manager/module_migrator.rb +203 -0
- data/lib/bolt/project_manager.rb +221 -0
- data/lib/bolt/puppetdb/client.rb +153 -0
- data/lib/bolt/puppetdb/config.rb +176 -0
- data/lib/bolt/puppetdb/instance.rb +146 -0
- data/lib/bolt/puppetdb.rb +15 -0
- data/lib/bolt/r10k_log_proxy.rb +30 -0
- data/lib/bolt/rerun.rb +55 -0
- data/lib/bolt/resource_instance.rb +133 -0
- data/lib/bolt/result.rb +247 -0
- data/lib/bolt/result_set.rb +128 -0
- data/lib/bolt/shell/bash/tmpdir.rb +62 -0
- data/lib/bolt/shell/bash.rb +516 -0
- data/lib/bolt/shell/powershell/snippets.rb +181 -0
- data/lib/bolt/shell/powershell.rb +365 -0
- data/lib/bolt/shell.rb +105 -0
- data/lib/bolt/target.rb +174 -0
- data/lib/bolt/task/puppet_server.rb +27 -0
- data/lib/bolt/task/run.rb +55 -0
- data/lib/bolt/task.rb +163 -0
- data/lib/bolt/transport/base.rb +252 -0
- data/lib/bolt/transport/docker/connection.rb +150 -0
- data/lib/bolt/transport/docker.rb +23 -0
- data/lib/bolt/transport/jail/connection.rb +81 -0
- data/lib/bolt/transport/jail.rb +21 -0
- data/lib/bolt/transport/local/connection.rb +106 -0
- data/lib/bolt/transport/local.rb +20 -0
- data/lib/bolt/transport/lxd/connection.rb +115 -0
- data/lib/bolt/transport/lxd.rb +26 -0
- data/lib/bolt/transport/orch/connection.rb +111 -0
- data/lib/bolt/transport/orch.rb +271 -0
- data/lib/bolt/transport/podman/connection.rb +102 -0
- data/lib/bolt/transport/podman.rb +19 -0
- data/lib/bolt/transport/remote.rb +41 -0
- data/lib/bolt/transport/simple.rb +54 -0
- data/lib/bolt/transport/ssh/connection.rb +321 -0
- data/lib/bolt/transport/ssh/exec_connection.rb +140 -0
- data/lib/bolt/transport/ssh.rb +48 -0
- data/lib/bolt/transport/winrm/connection.rb +378 -0
- data/lib/bolt/transport/winrm.rb +33 -0
- data/lib/bolt/util/format.rb +68 -0
- data/lib/bolt/util/puppet_log_level.rb +21 -0
- data/lib/bolt/util.rb +465 -0
- data/lib/bolt/validator.rb +227 -0
- data/lib/bolt/version.rb +5 -0
- data/lib/bolt.rb +8 -0
- data/lib/bolt_server/acl.rb +39 -0
- data/lib/bolt_server/base_config.rb +112 -0
- data/lib/bolt_server/config.rb +64 -0
- data/lib/bolt_server/file_cache.rb +200 -0
- data/lib/bolt_server/request_error.rb +11 -0
- data/lib/bolt_server/schemas/action-check_node_connections.json +14 -0
- data/lib/bolt_server/schemas/action-run_command.json +12 -0
- data/lib/bolt_server/schemas/action-run_script.json +47 -0
- data/lib/bolt_server/schemas/action-run_task.json +20 -0
- data/lib/bolt_server/schemas/action-upload_file.json +47 -0
- data/lib/bolt_server/schemas/partials/target-any.json +10 -0
- data/lib/bolt_server/schemas/partials/target-ssh.json +88 -0
- data/lib/bolt_server/schemas/partials/target-winrm.json +67 -0
- data/lib/bolt_server/schemas/partials/task.json +94 -0
- data/lib/bolt_server/schemas/transport-ssh.json +25 -0
- data/lib/bolt_server/schemas/transport-winrm.json +19 -0
- data/lib/bolt_server/transport_app.rb +554 -0
- data/lib/bolt_spec/bolt_context.rb +226 -0
- data/lib/bolt_spec/plans/action_stubs/command_stub.rb +51 -0
- data/lib/bolt_spec/plans/action_stubs/download_stub.rb +66 -0
- data/lib/bolt_spec/plans/action_stubs/plan_stub.rb +55 -0
- data/lib/bolt_spec/plans/action_stubs/script_stub.rb +59 -0
- data/lib/bolt_spec/plans/action_stubs/task_stub.rb +57 -0
- data/lib/bolt_spec/plans/action_stubs/upload_stub.rb +65 -0
- data/lib/bolt_spec/plans/action_stubs.rb +196 -0
- data/lib/bolt_spec/plans/mock_executor.rb +361 -0
- data/lib/bolt_spec/plans/publish_stub.rb +49 -0
- data/lib/bolt_spec/plans.rb +190 -0
- data/lib/bolt_spec/run.rb +246 -0
- data/lib/logging_extensions/logging.rb +13 -0
- data/libexec/apply_catalog.rb +130 -0
- data/libexec/bolt_catalog +68 -0
- data/libexec/custom_facts.rb +63 -0
- data/libexec/query_resources.rb +75 -0
- data/modules/aggregate/lib/puppet/functions/aggregate/count.rb +21 -0
- data/modules/aggregate/lib/puppet/functions/aggregate/nodes.rb +22 -0
- data/modules/aggregate/lib/puppet/functions/aggregate/targets.rb +21 -0
- data/modules/aggregate/plans/count.pp +56 -0
- data/modules/aggregate/plans/targets.pp +56 -0
- data/modules/canary/lib/puppet/functions/canary/merge.rb +13 -0
- data/modules/canary/lib/puppet/functions/canary/random_split.rb +22 -0
- data/modules/canary/lib/puppet/functions/canary/skip.rb +25 -0
- data/modules/canary/plans/init.pp +100 -0
- data/modules/puppet_connect/plans/test_input_data.pp +94 -0
- data/modules/puppetdb_fact/plans/init.pp +20 -0
- data/resources/bolt_bash_completion.sh +214 -0
- metadata +735 -0
@@ -0,0 +1,208 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../bolt/error'
|
4
|
+
require_relative '../bolt/logger'
|
5
|
+
require_relative 'module_installer/installer'
|
6
|
+
require_relative 'module_installer/puppetfile'
|
7
|
+
require_relative 'module_installer/resolver'
|
8
|
+
require_relative 'module_installer/specs'
|
9
|
+
|
10
|
+
module Bolt
|
11
|
+
class ModuleInstaller
|
12
|
+
def initialize(outputter, pal)
|
13
|
+
@outputter = outputter
|
14
|
+
@pal = pal
|
15
|
+
@logger = Bolt::Logger.logger(self)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Adds a single module to the project.
|
19
|
+
#
|
20
|
+
def add(name, specs, puppetfile_path, moduledir, project_file, config)
|
21
|
+
project_specs = Specs.new(specs, config)
|
22
|
+
|
23
|
+
# Exit early if project config already includes a spec with this name.
|
24
|
+
if project_specs.include?(name)
|
25
|
+
@outputter.print_message(
|
26
|
+
"Project configuration file #{project_file} already includes specification "\
|
27
|
+
"with name #{name}. Nothing to do."
|
28
|
+
)
|
29
|
+
return true
|
30
|
+
end
|
31
|
+
|
32
|
+
@outputter.print_message("Adding module #{name} to project\n\n")
|
33
|
+
|
34
|
+
# Generate the specs to resolve from. If a Puppetfile exists, parse it and
|
35
|
+
# convert the modules to specs. Otherwise, use the project specs.
|
36
|
+
resolve_specs = if puppetfile_path.exist?
|
37
|
+
existing_puppetfile = Puppetfile.parse(puppetfile_path)
|
38
|
+
existing_puppetfile.assert_satisfies(project_specs)
|
39
|
+
Specs.from_puppetfile(existing_puppetfile)
|
40
|
+
else
|
41
|
+
project_specs
|
42
|
+
end
|
43
|
+
|
44
|
+
# Resolve module dependencies. Attempt to first resolve with resolve
|
45
|
+
# specss. If that fails, fall back to resolving from project specs.
|
46
|
+
# This prevents Bolt from modifying installed modules unless there is
|
47
|
+
# a version conflict.
|
48
|
+
@outputter.print_action_step("Resolving module dependencies, this might take a moment")
|
49
|
+
|
50
|
+
@outputter.start_spin
|
51
|
+
begin
|
52
|
+
resolve_specs.add_specs('name' => name)
|
53
|
+
puppetfile = Resolver.new.resolve(resolve_specs, config)
|
54
|
+
rescue Bolt::Error
|
55
|
+
project_specs.add_specs('name' => name)
|
56
|
+
puppetfile = Resolver.new.resolve(project_specs, config)
|
57
|
+
end
|
58
|
+
@outputter.stop_spin
|
59
|
+
|
60
|
+
# Display the diff between the existing Puppetfile and the new Puppetfile.
|
61
|
+
print_puppetfile_diff(existing_puppetfile, puppetfile)
|
62
|
+
|
63
|
+
# Add the module to the project configuration.
|
64
|
+
@outputter.print_action_step("Updating project configuration file at #{project_file}")
|
65
|
+
|
66
|
+
data = Bolt::Util.read_yaml_hash(project_file, 'project')
|
67
|
+
data['modules'] ||= []
|
68
|
+
data['modules'] << name.tr('-', '/')
|
69
|
+
|
70
|
+
begin
|
71
|
+
File.write(project_file, data.to_yaml)
|
72
|
+
rescue SystemCallError => e
|
73
|
+
raise Bolt::FileError.new(
|
74
|
+
"Unable to update project configuration file: #{e.message}",
|
75
|
+
project_file
|
76
|
+
)
|
77
|
+
end
|
78
|
+
|
79
|
+
# Write the Puppetfile.
|
80
|
+
@outputter.print_action_step("Writing Puppetfile at #{puppetfile_path}")
|
81
|
+
puppetfile.write(puppetfile_path, moduledir)
|
82
|
+
|
83
|
+
# Install the modules.
|
84
|
+
install_puppetfile(puppetfile_path, moduledir, config)
|
85
|
+
end
|
86
|
+
|
87
|
+
# Outputs a diff of an old Puppetfile and a new Puppetfile.
|
88
|
+
#
|
89
|
+
def print_puppetfile_diff(old, new)
|
90
|
+
# Build hashes mapping the module name to the module object. This makes it
|
91
|
+
# a little easier to determine which modules have been added, removed, or
|
92
|
+
# modified.
|
93
|
+
old = (old&.modules || []).each_with_object({}) do |mod, acc|
|
94
|
+
next unless mod.type == :forge
|
95
|
+
acc[mod.full_name] = mod
|
96
|
+
end
|
97
|
+
|
98
|
+
new = new.modules.each_with_object({}) do |mod, acc|
|
99
|
+
next unless mod.type == :forge
|
100
|
+
acc[mod.full_name] = mod
|
101
|
+
end
|
102
|
+
|
103
|
+
# New modules are those present in new but not in old.
|
104
|
+
added = new.reject { |full_name, _mod| old.include?(full_name) }.values
|
105
|
+
|
106
|
+
if added.any?
|
107
|
+
diff = "Adding the following modules:\n"
|
108
|
+
added.each { |mod| diff += "#{mod.full_name} #{mod.version}\n" }
|
109
|
+
@outputter.print_action_step(diff)
|
110
|
+
end
|
111
|
+
|
112
|
+
# Upgraded modules are those that have a newer version in new than old.
|
113
|
+
upgraded = new.select do |full_name, mod|
|
114
|
+
if old.include?(full_name)
|
115
|
+
mod.version > old[full_name].version
|
116
|
+
end
|
117
|
+
end.keys
|
118
|
+
|
119
|
+
if upgraded.any?
|
120
|
+
diff = "Upgrading the following modules:\n"
|
121
|
+
upgraded.each { |full_name| diff += "#{full_name} #{old[full_name].version} to #{new[full_name].version}\n" }
|
122
|
+
@outputter.print_action_step(diff)
|
123
|
+
end
|
124
|
+
|
125
|
+
# Downgraded modules are those that have an older version in new than old.
|
126
|
+
downgraded = new.select do |full_name, mod|
|
127
|
+
if old.include?(full_name)
|
128
|
+
mod.version < old[full_name].version
|
129
|
+
end
|
130
|
+
end.keys
|
131
|
+
|
132
|
+
if downgraded.any?
|
133
|
+
diff = "Downgrading the following modules: \n"
|
134
|
+
downgraded.each { |full_name| diff += "#{full_name} #{old[full_name].version} to #{new[full_name].version}\n" }
|
135
|
+
@outputter.print_action_step(diff)
|
136
|
+
end
|
137
|
+
|
138
|
+
# Removed modules are those present in old but not in new.
|
139
|
+
removed = old.reject { |full_name, _mod| new.include?(full_name) }.values
|
140
|
+
|
141
|
+
if removed.any?
|
142
|
+
diff = "Removing the following modules:\n"
|
143
|
+
removed.each { |mod| diff += "#{mod.full_name} #{mod.version}\n" }
|
144
|
+
@outputter.print_action_step(diff)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
# Installs a project's module dependencies.
|
149
|
+
#
|
150
|
+
def install(specs, path, moduledir, config = {}, force: false, resolve: true)
|
151
|
+
@outputter.print_message("Installing project modules\n\n")
|
152
|
+
|
153
|
+
if resolve != false
|
154
|
+
specs = Specs.new(specs, config)
|
155
|
+
|
156
|
+
# If forcibly installing or if there is no Puppetfile, resolve
|
157
|
+
# and write a Puppetfile.
|
158
|
+
if force || !path.exist?
|
159
|
+
@outputter.print_action_step("Resolving module dependencies, this might take a moment")
|
160
|
+
|
161
|
+
# This doesn't use the block as it's more testable to just mock *_spin
|
162
|
+
@outputter.start_spin
|
163
|
+
puppetfile = Resolver.new.resolve(specs, config)
|
164
|
+
@outputter.stop_spin
|
165
|
+
|
166
|
+
# We get here either through 'bolt module install' which uses the
|
167
|
+
# managed modulepath (which isn't configurable) or through bolt
|
168
|
+
# project init --modules, which uses the default modulepath. This
|
169
|
+
# should be safe to assume that if `.modules/` is the moduledir the
|
170
|
+
# user is using the new workflow
|
171
|
+
@outputter.print_action_step("Writing Puppetfile at #{path}")
|
172
|
+
if moduledir.basename.to_s == '.modules'
|
173
|
+
puppetfile.write(path, moduledir)
|
174
|
+
else
|
175
|
+
puppetfile.write(path)
|
176
|
+
end
|
177
|
+
# If not forcibly installing and there is a Puppetfile, assert
|
178
|
+
# that it satisfies the specs.
|
179
|
+
else
|
180
|
+
puppetfile = Puppetfile.parse(path)
|
181
|
+
puppetfile.assert_satisfies(specs)
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
# Install the modules.
|
186
|
+
install_puppetfile(path, moduledir, config)
|
187
|
+
end
|
188
|
+
|
189
|
+
# Installs the Puppetfile and generates types.
|
190
|
+
#
|
191
|
+
def install_puppetfile(path, moduledir, config = {})
|
192
|
+
@outputter.print_action_step("Syncing modules from #{path} to #{moduledir}")
|
193
|
+
@outputter.start_spin
|
194
|
+
ok = Installer.new(config).install(path, moduledir)
|
195
|
+
@outputter.stop_spin
|
196
|
+
|
197
|
+
# Automatically generate types after installing modules
|
198
|
+
if ok
|
199
|
+
@outputter.print_action_step("Generating type references")
|
200
|
+
@pal.generate_types(cache: true)
|
201
|
+
end
|
202
|
+
|
203
|
+
@outputter.print_puppetfile_result(ok, path, moduledir)
|
204
|
+
|
205
|
+
ok
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../../bolt/error'
|
4
|
+
|
5
|
+
module Bolt
|
6
|
+
class Node
|
7
|
+
class BaseError < Bolt::Error
|
8
|
+
attr_reader :issue_code
|
9
|
+
|
10
|
+
# TODO: can we just drop issue code here?
|
11
|
+
def initialize(message, issue_code = nil)
|
12
|
+
super(message, kind, nil, issue_code)
|
13
|
+
end
|
14
|
+
|
15
|
+
def kind
|
16
|
+
'puppetlabs.tasks/node-error'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class ConnectError < BaseError
|
21
|
+
def kind
|
22
|
+
'puppetlabs.tasks/connect-error'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class EscalateError < BaseError
|
27
|
+
def kind
|
28
|
+
'puppetlabs.tasks/escalate-error'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class FileError < BaseError
|
33
|
+
def kind
|
34
|
+
'puppetlabs.tasks/task_file_error'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class RemoteError < BaseError
|
39
|
+
def kind
|
40
|
+
'puppetlabs.tasks/remote-task-error'
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class EnvironmentVarError < BaseError
|
45
|
+
def initialize(var, val)
|
46
|
+
message = "Could not set environment variable '#{var}' to '#{val}'"
|
47
|
+
super(message, 'ENVVAR_ERROR')
|
48
|
+
end
|
49
|
+
|
50
|
+
def kind
|
51
|
+
'puppetlabs.tasks/environment-var-error'
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
require_relative '../../bolt/result'
|
5
|
+
|
6
|
+
module Bolt
|
7
|
+
class Node
|
8
|
+
class Output
|
9
|
+
attr_reader :stderr, :stdout, :merged_output
|
10
|
+
attr_accessor :exit_code
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@stdout = StringIO.new
|
14
|
+
@stderr = StringIO.new
|
15
|
+
@merged_output = StringIO.new
|
16
|
+
@exit_code = 'unknown'
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_h
|
20
|
+
{
|
21
|
+
'stdout' => @stdout.string,
|
22
|
+
'stderr' => @stderr.string,
|
23
|
+
'merged_output' => @merged_output.string,
|
24
|
+
'exit_code' => @exit_code
|
25
|
+
}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|