bolt 3.14.1 → 3.17.0
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.
Potentially problematic release.
This version of bolt might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Puppetfile +1 -1
- data/bolt-modules/boltlib/lib/puppet/functions/apply_prep.rb +137 -104
- 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 +2 -19
- data/lib/bolt/application.rb +634 -0
- data/lib/bolt/bolt_option_parser.rb +28 -4
- data/lib/bolt/cli.rb +592 -788
- data/lib/bolt/fiber_executor.rb +7 -3
- data/lib/bolt/inventory/inventory.rb +68 -39
- data/lib/bolt/inventory.rb +2 -9
- data/lib/bolt/module_installer/puppetfile.rb +24 -10
- data/lib/bolt/outputter/human.rb +83 -32
- data/lib/bolt/outputter/json.rb +63 -38
- data/lib/bolt/pal/yaml_plan/transpiler.rb +1 -1
- data/lib/bolt/pal.rb +31 -11
- data/lib/bolt/plan_creator.rb +84 -25
- data/lib/bolt/plan_future.rb +11 -6
- data/lib/bolt/plan_result.rb +1 -1
- data/lib/bolt/plugin/task.rb +1 -1
- data/lib/bolt/plugin.rb +11 -17
- data/lib/bolt/project.rb +0 -7
- data/lib/bolt/result_set.rb +2 -1
- data/lib/bolt/transport/local/connection.rb +17 -1
- data/lib/bolt/transport/orch/connection.rb +13 -1
- data/lib/bolt/version.rb +1 -1
- data/lib/bolt_server/file_cache.rb +12 -0
- data/lib/bolt_server/schemas/action-apply.json +32 -0
- data/lib/bolt_server/schemas/action-apply_prep.json +19 -0
- data/lib/bolt_server/transport_app.rb +113 -24
- data/lib/bolt_spec/bolt_context.rb +1 -1
- data/lib/bolt_spec/run.rb +1 -1
- metadata +14 -3
- data/lib/bolt/secret.rb +0 -37
    
        data/lib/bolt/project.rb
    CHANGED
    
    | @@ -209,12 +209,5 @@ module Bolt | |
| 209 209 | 
             
                    Bolt::Logger.warn("missing_project_name", message)
         | 
| 210 210 | 
             
                  end
         | 
| 211 211 | 
             
                end
         | 
| 212 | 
            -
             | 
| 213 | 
            -
                def check_deprecated_file
         | 
| 214 | 
            -
                  if (@path + 'project.yaml').file?
         | 
| 215 | 
            -
                    msg = "Project configuration file 'project.yaml' is deprecated; use 'bolt-project.yaml' instead."
         | 
| 216 | 
            -
                    Bolt::Logger.warn("project_yaml", msg)
         | 
| 217 | 
            -
                  end
         | 
| 218 | 
            -
                end
         | 
| 219 212 | 
             
              end
         | 
| 220 213 | 
             
            end
         | 
    
        data/lib/bolt/result_set.rb
    CHANGED
    
    
| @@ -10,6 +10,8 @@ module Bolt | |
| 10 10 | 
             
              module Transport
         | 
| 11 11 | 
             
                class Local < Simple
         | 
| 12 12 | 
             
                  class Connection
         | 
| 13 | 
            +
                    RUBY_ENV_VARS = %w[GEM_PATH GEM_HOME RUBYLIB RUBYLIB_PREFIX RUBYOPT RUBYPATH RUBYSHELL].freeze
         | 
| 14 | 
            +
             | 
| 13 15 | 
             
                    attr_accessor :user, :logger, :target
         | 
| 14 16 |  | 
| 15 17 | 
             
                    def initialize(target)
         | 
| @@ -68,7 +70,21 @@ module Bolt | |
| 68 70 | 
             
                        end
         | 
| 69 71 | 
             
                      end
         | 
| 70 72 |  | 
| 71 | 
            -
                       | 
| 73 | 
            +
                      # Only do this if bundled-ruby is set to false, not nil
         | 
| 74 | 
            +
                      ruby_env_vars = if target.transport_config['bundled-ruby'] == false
         | 
| 75 | 
            +
                                        RUBY_ENV_VARS.each_with_object({}) do |e, acc|
         | 
| 76 | 
            +
                                          acc[e] = ENV["BOLT_ORIG_#{e}"] if ENV["BOLT_ORIG_#{e}"]
         | 
| 77 | 
            +
                                        end
         | 
| 78 | 
            +
                                      end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                      if target.transport_config['bundled-ruby'] == false &&
         | 
| 81 | 
            +
                         Gem.loaded_specs.keys.include?('bundler')
         | 
| 82 | 
            +
                        Bundler.with_unbundled_env do
         | 
| 83 | 
            +
                          Open3.popen3(ruby_env_vars || {}, *command)
         | 
| 84 | 
            +
                        end
         | 
| 85 | 
            +
                      else
         | 
| 86 | 
            +
                        Open3.popen3(ruby_env_vars || {}, *command)
         | 
| 87 | 
            +
                      end
         | 
| 72 88 | 
             
                    end
         | 
| 73 89 |  | 
| 74 90 | 
             
                    # This is used by the Bash shell to decide whether to `cd` before
         | 
| @@ -36,7 +36,8 @@ module Bolt | |
| 36 36 | 
             
                      end
         | 
| 37 37 | 
             
                      logger.debug("Creating orchestrator client for #{client_opts}")
         | 
| 38 38 | 
             
                      @client = OrchestratorClient.new(client_opts, true)
         | 
| 39 | 
            -
                      @ | 
| 39 | 
            +
                      @plan_context = plan_context
         | 
| 40 | 
            +
                      @plan_job = start_plan(@plan_context)
         | 
| 40 41 | 
             
                      logger.debug("Started plan #{@plan_job}")
         | 
| 41 42 | 
             
                      @environment = opts["task-environment"]
         | 
| 42 43 | 
             
                    end
         | 
| @@ -87,6 +88,17 @@ module Bolt | |
| 87 88 | 
             
                    def run_task(targets, task, arguments, options)
         | 
| 88 89 | 
             
                      body = build_request(targets, task, arguments, options[:description])
         | 
| 89 90 | 
             
                      @client.run_task(body)
         | 
| 91 | 
            +
                    rescue OrchestratorClient::ApiError => e
         | 
| 92 | 
            +
                      if e.data['kind'] == 'puppetlabs.orchestrator/plan-already-finished'
         | 
| 93 | 
            +
                        @logger.debug("Retrying the task")
         | 
| 94 | 
            +
                        # Instead of recursing, just retry once
         | 
| 95 | 
            +
                        @plan_job = start_plan(@plan_context)
         | 
| 96 | 
            +
                        # Rebuild the request with the new plan job ID
         | 
| 97 | 
            +
                        body = build_request(targets, task, arguments, options[:description])
         | 
| 98 | 
            +
                        @client.run_task(body)
         | 
| 99 | 
            +
                      else
         | 
| 100 | 
            +
                        raise e
         | 
| 101 | 
            +
                      end
         | 
| 90 102 | 
             
                    end
         | 
| 91 103 |  | 
| 92 104 | 
             
                    def query_inventory(targets)
         | 
    
        data/lib/bolt/version.rb
    CHANGED
    
    
| @@ -182,5 +182,17 @@ module BoltServer | |
| 182 182 | 
             
                    end
         | 
| 183 183 | 
             
                  end
         | 
| 184 184 | 
             
                end
         | 
| 185 | 
            +
             | 
| 186 | 
            +
                def get_cached_project_file(versioned_project, file_name)
         | 
| 187 | 
            +
                  file_dir = create_cache_dir(versioned_project)
         | 
| 188 | 
            +
                  file_path = File.join(file_dir, file_name)
         | 
| 189 | 
            +
                  serial_execute { File.read(file_path) if File.exist?(file_path) }
         | 
| 190 | 
            +
                end
         | 
| 191 | 
            +
             | 
| 192 | 
            +
                def cache_project_file(versioned_project, file_name, data)
         | 
| 193 | 
            +
                  file_dir = create_cache_dir(versioned_project)
         | 
| 194 | 
            +
                  file_path = File.join(file_dir, file_name)
         | 
| 195 | 
            +
                  serial_execute { File.open(file_path, 'w') { |f| f.write(data) } }
         | 
| 196 | 
            +
                end
         | 
| 185 197 | 
             
              end
         | 
| 186 198 | 
             
            end
         | 
| @@ -0,0 +1,32 @@ | |
| 1 | 
            +
            {
         | 
| 2 | 
            +
              "$schema": "http://json-schema.org/draft-04/schema#",
         | 
| 3 | 
            +
              "title": "apply request",
         | 
| 4 | 
            +
              "description": "POST <transport>/apply request schema",
         | 
| 5 | 
            +
              "type": "object",
         | 
| 6 | 
            +
              "properties": {
         | 
| 7 | 
            +
                "versioned_project": {
         | 
| 8 | 
            +
                  "type": "string",
         | 
| 9 | 
            +
                  "description": "Project from which to load code"
         | 
| 10 | 
            +
                },
         | 
| 11 | 
            +
                "parameters": {
         | 
| 12 | 
            +
                  "type": "object",
         | 
| 13 | 
            +
                  "properties": {
         | 
| 14 | 
            +
                    "catalog": {
         | 
| 15 | 
            +
                      "type": "object",
         | 
| 16 | 
            +
                      "description": "Compiled catalog to apply"
         | 
| 17 | 
            +
                    },
         | 
| 18 | 
            +
                    "apply_options": {
         | 
| 19 | 
            +
                      "type": "object",
         | 
| 20 | 
            +
                      "description": "Options for application of a catalog"
         | 
| 21 | 
            +
                    }
         | 
| 22 | 
            +
                  }
         | 
| 23 | 
            +
                },
         | 
| 24 | 
            +
                "job_id": {
         | 
| 25 | 
            +
                  "type": "integer",
         | 
| 26 | 
            +
                  "description": "job-id associated with request"
         | 
| 27 | 
            +
                },
         | 
| 28 | 
            +
                "target": { "$ref": "partial:target-any" }
         | 
| 29 | 
            +
              },
         | 
| 30 | 
            +
              "required": ["target", "versioned_project", "parameters", "job_id"],
         | 
| 31 | 
            +
              "additionalProperties": false
         | 
| 32 | 
            +
            }
         | 
| @@ -0,0 +1,19 @@ | |
| 1 | 
            +
            {
         | 
| 2 | 
            +
              "$schema": "http://json-schema.org/draft-04/schema#",
         | 
| 3 | 
            +
              "title": "apply_prep request",
         | 
| 4 | 
            +
              "description": "POST <transport>/apply_prep request schema",
         | 
| 5 | 
            +
              "type": "object",
         | 
| 6 | 
            +
              "properties": {
         | 
| 7 | 
            +
                "versioned_project": {
         | 
| 8 | 
            +
                  "type": "String",
         | 
| 9 | 
            +
                  "description": "Project from which to load code"
         | 
| 10 | 
            +
                },
         | 
| 11 | 
            +
                "target": { "$ref": "partial:target-any" },
         | 
| 12 | 
            +
                "job_id": {
         | 
| 13 | 
            +
                  "type": "integer",
         | 
| 14 | 
            +
                  "description": "job-id associated with request"
         | 
| 15 | 
            +
                }
         | 
| 16 | 
            +
              },
         | 
| 17 | 
            +
              "required": ["target", "versioned_project", "job_id"],
         | 
| 18 | 
            +
              "additionalProperties": false
         | 
| 19 | 
            +
            }
         | 
| @@ -43,6 +43,8 @@ module BoltServer | |
| 43 43 | 
             
                  transport-ssh
         | 
| 44 44 | 
             
                  transport-winrm
         | 
| 45 45 | 
             
                  connect-data
         | 
| 46 | 
            +
                  action-apply_prep
         | 
| 47 | 
            +
                  action-apply
         | 
| 46 48 | 
             
                ].freeze
         | 
| 47 49 |  | 
| 48 50 | 
             
                # PE_BOLTLIB_PATH is intended to function exactly like the BOLTLIB_PATH used
         | 
| @@ -75,6 +77,12 @@ module BoltServer | |
| 75 77 | 
             
                  # This is needed until the PAL is threadsafe.
         | 
| 76 78 | 
             
                  @pal_mutex = Mutex.new
         | 
| 77 79 |  | 
| 80 | 
            +
                  # Avoid redundant plugin tarbal construction
         | 
| 81 | 
            +
                  @plugin_mutex = Mutex.new
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                  # Avoid redundant project_task metadata construction
         | 
| 84 | 
            +
                  @task_metadata_mutex = Mutex.new
         | 
| 85 | 
            +
             | 
| 78 86 | 
             
                  @logger = Bolt::Logger.logger(self)
         | 
| 79 87 |  | 
| 80 88 | 
             
                  super(nil)
         | 
| @@ -118,12 +126,7 @@ module BoltServer | |
| 118 126 | 
             
                  end
         | 
| 119 127 | 
             
                end
         | 
| 120 128 |  | 
| 121 | 
            -
                def  | 
| 122 | 
            -
                  validate_schema(@schemas["action-run_task"], body)
         | 
| 123 | 
            -
             | 
| 124 | 
            -
                  task_data = body['task']
         | 
| 125 | 
            -
                  task = Bolt::Task::PuppetServer.new(task_data['name'], task_data['metadata'], task_data['files'], @file_cache)
         | 
| 126 | 
            -
                  parameters = body['parameters'] || {}
         | 
| 129 | 
            +
                def task_helper(target, task, parameters)
         | 
| 127 130 | 
             
                  # Wrap parameters marked with '"sensitive": true' in the task metadata with a
         | 
| 128 131 | 
             
                  # Sensitive wrapper type. This way it's not shown in logs.
         | 
| 129 132 | 
             
                  if (param_spec = task.parameters)
         | 
| @@ -142,6 +145,101 @@ module BoltServer | |
| 142 145 | 
             
                  end
         | 
| 143 146 | 
             
                end
         | 
| 144 147 |  | 
| 148 | 
            +
                def run_task(target, body)
         | 
| 149 | 
            +
                  validate_schema(@schemas["action-run_task"], body)
         | 
| 150 | 
            +
             | 
| 151 | 
            +
                  task_data = body['task']
         | 
| 152 | 
            +
                  task = Bolt::Task::PuppetServer.new(task_data['name'], task_data['metadata'], task_data['files'], @file_cache)
         | 
| 153 | 
            +
                  task_helper(target, task, body['parameters'] || {})
         | 
| 154 | 
            +
                end
         | 
| 155 | 
            +
             | 
| 156 | 
            +
                def extract_install_task(target)
         | 
| 157 | 
            +
                  unless target.plugin_hooks['puppet_library']['task']
         | 
| 158 | 
            +
                    raise BoltServer::RequestError,
         | 
| 159 | 
            +
                          "Target must have 'task' plugin hook"
         | 
| 160 | 
            +
                  end
         | 
| 161 | 
            +
                  install_task = target.plugin_hooks['puppet_library']['task'].split('::', 2)
         | 
| 162 | 
            +
                  install_task << 'init' if install_task.count == 1
         | 
| 163 | 
            +
                  install_task
         | 
| 164 | 
            +
                end
         | 
| 165 | 
            +
             | 
| 166 | 
            +
                # This helper is responsible for computing or retrieving from the cache a plugin tarball. There are
         | 
| 167 | 
            +
                # two supported plugin types 'fact_plugins', and 'all_plugins'. Note that this is cached based on
         | 
| 168 | 
            +
                # versioned_project as there are no plugins in the "builtin content" directory
         | 
| 169 | 
            +
                def plugin_tarball(versioned_project, tarball_type)
         | 
| 170 | 
            +
                  tarball_types = %w[fact_plugins all_plugins]
         | 
| 171 | 
            +
                  unless tarball_types.include?(tarball_type)
         | 
| 172 | 
            +
                    raise ArgumentError,
         | 
| 173 | 
            +
                          "tarball_type must be one of: #{tarball_types.join(', ')}"
         | 
| 174 | 
            +
                  end
         | 
| 175 | 
            +
                  # lock this so that in the case an apply/apply_prep with multiple targets hits this endpoint
         | 
| 176 | 
            +
                  # the tarball computation only happens once (all the other targets will just need to read the cached data)
         | 
| 177 | 
            +
                  @plugin_mutex.synchronize do
         | 
| 178 | 
            +
                    if (tarball = @file_cache.get_cached_project_file(versioned_project, tarball_type))
         | 
| 179 | 
            +
                      tarball
         | 
| 180 | 
            +
                    else
         | 
| 181 | 
            +
                      new_tarball = build_project_plugins_tarball(versioned_project) do |mod|
         | 
| 182 | 
            +
                        search_dirs = []
         | 
| 183 | 
            +
                        search_dirs << mod.plugins if mod.plugins?
         | 
| 184 | 
            +
                        search_dirs << mod.pluginfacts if mod.pluginfacts?
         | 
| 185 | 
            +
                        if tarball_type == 'all_plugins'
         | 
| 186 | 
            +
                          search_dirs << mod.files if mod.files?
         | 
| 187 | 
            +
                          type_files = "#{mod.path}/types"
         | 
| 188 | 
            +
                          search_dirs << type_files if File.exist?(type_files)
         | 
| 189 | 
            +
                        end
         | 
| 190 | 
            +
                        search_dirs
         | 
| 191 | 
            +
                      end
         | 
| 192 | 
            +
                      @file_cache.cache_project_file(versioned_project, tarball_type, new_tarball)
         | 
| 193 | 
            +
                      new_tarball
         | 
| 194 | 
            +
                    end
         | 
| 195 | 
            +
                  end
         | 
| 196 | 
            +
                end
         | 
| 197 | 
            +
             | 
| 198 | 
            +
                # This helper is responsible for computing or retrieving task metadata for a project.
         | 
| 199 | 
            +
                # It expects task name in segments and uses the combination of task name and versioned_project
         | 
| 200 | 
            +
                # as a unique identifier for caching in addition to the job_id. The job id is added to protect against
         | 
| 201 | 
            +
                # a case where the buildtin content is update (where the apply_helpers would be managed)
         | 
| 202 | 
            +
                def project_task_metadata(versioned_project, task_name_segments, job_id)
         | 
| 203 | 
            +
                  cached_file_name = "#{task_name_segments.join('_')}_#{job_id}"
         | 
| 204 | 
            +
                  # lock this so that in the case an apply/apply_prep with multiple targets hits this endpoint the
         | 
| 205 | 
            +
                  # metadata computation will only be computed once, then the cache will be read.
         | 
| 206 | 
            +
                  @task_metadata_mutex.synchronize do
         | 
| 207 | 
            +
                    if (metadata = @file_cache.get_cached_project_file(versioned_project, cached_file_name))
         | 
| 208 | 
            +
                      JSON.parse(metadata)
         | 
| 209 | 
            +
                    else
         | 
| 210 | 
            +
                      new_metadata = in_bolt_project(versioned_project) do |context|
         | 
| 211 | 
            +
                        ps_parameters = {
         | 
| 212 | 
            +
                          'versioned_project' => versioned_project
         | 
| 213 | 
            +
                        }
         | 
| 214 | 
            +
                        pe_task_info(context[:pal], *task_name_segments, ps_parameters)
         | 
| 215 | 
            +
                      end
         | 
| 216 | 
            +
                      @file_cache.cache_project_file(versioned_project, cached_file_name, new_metadata.to_json)
         | 
| 217 | 
            +
                      new_metadata
         | 
| 218 | 
            +
                    end
         | 
| 219 | 
            +
                  end
         | 
| 220 | 
            +
                end
         | 
| 221 | 
            +
             | 
| 222 | 
            +
                def apply_prep(target, body)
         | 
| 223 | 
            +
                  validate_schema(@schemas["action-apply_prep"], body)
         | 
| 224 | 
            +
                  plugins_tarball = plugin_tarball(body['versioned_project'], 'fact_plugins')
         | 
| 225 | 
            +
                  install_task_segments = extract_install_task(target.first)
         | 
| 226 | 
            +
                  task_data = project_task_metadata(body['versioned_project'], install_task_segments, body["job_id"])
         | 
| 227 | 
            +
                  task = Bolt::Task::PuppetServer.new(task_data['name'], task_data['metadata'], task_data['files'], @file_cache)
         | 
| 228 | 
            +
                  install_task_result = task_helper(target, task, target.first.plugin_hooks['puppet_library']['parameters'] || {})
         | 
| 229 | 
            +
                  return install_task_result unless install_task_result.ok
         | 
| 230 | 
            +
                  task_data = project_task_metadata(body['versioned_project'], %w[apply_helpers custom_facts], body["job_id"])
         | 
| 231 | 
            +
                  task = Bolt::Task::PuppetServer.new(task_data['name'], task_data['metadata'], task_data['files'], @file_cache)
         | 
| 232 | 
            +
                  task_helper(target, task, { 'plugins' => plugins_tarball })
         | 
| 233 | 
            +
                end
         | 
| 234 | 
            +
             | 
| 235 | 
            +
                def apply(target, body)
         | 
| 236 | 
            +
                  validate_schema(@schemas["action-apply"], body)
         | 
| 237 | 
            +
                  plugins_tarball = plugin_tarball(body['versioned_project'], 'all_plugins')
         | 
| 238 | 
            +
                  task_data = project_task_metadata(body['versioned_project'], %w[apply_helpers apply_catalog], body["job_id"])
         | 
| 239 | 
            +
                  task = Bolt::Task::PuppetServer.new(task_data['name'], task_data['metadata'], task_data['files'], @file_cache)
         | 
| 240 | 
            +
                  task_helper(target, task, body['parameters'].merge({ 'plugins' => plugins_tarball }))
         | 
| 241 | 
            +
                end
         | 
| 242 | 
            +
             | 
| 145 243 | 
             
                def run_command(target, body)
         | 
| 146 244 | 
             
                  validate_schema(@schemas["action-run_command"], body)
         | 
| 147 245 | 
             
                  command = body['command']
         | 
| @@ -476,6 +574,8 @@ module BoltServer | |
| 476 574 | 
             
                  run_task
         | 
| 477 575 | 
             
                  run_script
         | 
| 478 576 | 
             
                  upload_file
         | 
| 577 | 
            +
                  apply
         | 
| 578 | 
            +
                  apply_prep
         | 
| 479 579 | 
             
                ].freeze
         | 
| 480 580 |  | 
| 481 581 | 
             
                def make_ssh_target(target_hash)
         | 
| @@ -499,7 +599,8 @@ module BoltServer | |
| 499 599 | 
             
                    'config' => {
         | 
| 500 600 | 
             
                      'transport' => 'ssh',
         | 
| 501 601 | 
             
                      'ssh' => opts.slice(*Bolt::Config::Transport::SSH.options)
         | 
| 502 | 
            -
                    }
         | 
| 602 | 
            +
                    },
         | 
| 603 | 
            +
                    'plugin_hooks' => target_hash['plugin_hooks']
         | 
| 503 604 | 
             
                  }
         | 
| 504 605 |  | 
| 505 606 | 
             
                  inventory = Bolt::Inventory.empty
         | 
| @@ -537,7 +638,8 @@ module BoltServer | |
| 537 638 | 
             
                    'config' => {
         | 
| 538 639 | 
             
                      'transport' => 'winrm',
         | 
| 539 640 | 
             
                      'winrm' => opts.slice(*Bolt::Config::Transport::WinRM.options)
         | 
| 540 | 
            -
                    }
         | 
| 641 | 
            +
                    },
         | 
| 642 | 
            +
                    'plugin_hooks' => target_hash['plugin_hooks']
         | 
| 541 643 | 
             
                  }
         | 
| 542 644 |  | 
| 543 645 | 
             
                  inventory = Bolt::Inventory.empty
         | 
| @@ -730,7 +832,7 @@ module BoltServer | |
| 730 832 | 
             
                      }
         | 
| 731 833 |  | 
| 732 834 | 
             
                      connect_plugin = BoltServer::Plugin::PuppetConnectData.new(body['puppet_connect_data'])
         | 
| 733 | 
            -
                      plugins = Bolt::Plugin. | 
| 835 | 
            +
                      plugins = Bolt::Plugin.new(context[:config], context[:pal], load_plugins: false)
         | 
| 734 836 | 
             
                      plugins.add_plugin(connect_plugin)
         | 
| 735 837 | 
             
                      %w[aws_inventory azure_inventory gcloud_inventory].each do |plugin_name|
         | 
| 736 838 | 
             
                        plugins.add_module_plugin(plugin_name) if plugins.known_plugin?(plugin_name)
         | 
| @@ -756,12 +858,7 @@ module BoltServer | |
| 756 858 | 
             
                  raise BoltServer::RequestError, "'versioned_project' is a required argument" if params['versioned_project'].nil?
         | 
| 757 859 | 
             
                  content_type :json
         | 
| 758 860 |  | 
| 759 | 
            -
                  plugins_tarball =  | 
| 760 | 
            -
                    search_dirs = []
         | 
| 761 | 
            -
                    search_dirs << mod.plugins if mod.plugins?
         | 
| 762 | 
            -
                    search_dirs << mod.pluginfacts if mod.pluginfacts?
         | 
| 763 | 
            -
                    search_dirs
         | 
| 764 | 
            -
                  end
         | 
| 861 | 
            +
                  plugins_tarball = plugin_tarball(params['versioned_project'], 'fact_plugins')
         | 
| 765 862 |  | 
| 766 863 | 
             
                  [200, plugins_tarball.to_json]
         | 
| 767 864 | 
             
                end
         | 
| @@ -773,15 +870,7 @@ module BoltServer | |
| 773 870 | 
             
                  raise BoltServer::RequestError, "'versioned_project' is a required argument" if params['versioned_project'].nil?
         | 
| 774 871 | 
             
                  content_type :json
         | 
| 775 872 |  | 
| 776 | 
            -
                  plugins_tarball =  | 
| 777 | 
            -
                    search_dirs = []
         | 
| 778 | 
            -
                    search_dirs << mod.plugins if mod.plugins?
         | 
| 779 | 
            -
                    search_dirs << mod.pluginfacts if mod.pluginfacts?
         | 
| 780 | 
            -
                    search_dirs << mod.files if mod.files?
         | 
| 781 | 
            -
                    type_files = "#{mod.path}/types"
         | 
| 782 | 
            -
                    search_dirs << type_files if File.exist?(type_files)
         | 
| 783 | 
            -
                    search_dirs
         | 
| 784 | 
            -
                  end
         | 
| 873 | 
            +
                  plugins_tarball = plugin_tarball(params['versioned_project'], 'all_plugins')
         | 
| 785 874 |  | 
| 786 875 | 
             
                  [200, plugins_tarball.to_json]
         | 
| 787 876 | 
             
                end
         | 
    
        data/lib/bolt_spec/run.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: bolt
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 3. | 
| 4 | 
            +
              version: 3.17.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Puppet
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2021- | 
| 11 | 
            +
            date: 2021-08-30 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: addressable
         | 
| @@ -466,8 +466,18 @@ files: | |
| 466 466 | 
             
            - bolt-modules/prompt/lib/puppet/functions/prompt/menu.rb
         | 
| 467 467 | 
             
            - bolt-modules/system/lib/puppet/functions/system/env.rb
         | 
| 468 468 | 
             
            - exe/bolt
         | 
| 469 | 
            +
            - guides/debugging.yaml
         | 
| 470 | 
            +
            - guides/inventory.yaml
         | 
| 471 | 
            +
            - guides/links.yaml
         | 
| 472 | 
            +
            - guides/logging.yaml
         | 
| 473 | 
            +
            - guides/module.yaml
         | 
| 474 | 
            +
            - guides/modulepath.yaml
         | 
| 475 | 
            +
            - guides/project.yaml
         | 
| 476 | 
            +
            - guides/targets.yaml
         | 
| 477 | 
            +
            - guides/transports.yaml
         | 
| 469 478 | 
             
            - lib/bolt.rb
         | 
| 470 479 | 
             
            - lib/bolt/analytics.rb
         | 
| 480 | 
            +
            - lib/bolt/application.rb
         | 
| 471 481 | 
             
            - lib/bolt/applicator.rb
         | 
| 472 482 | 
             
            - lib/bolt/apply_inventory.rb
         | 
| 473 483 | 
             
            - lib/bolt/apply_result.rb
         | 
| @@ -561,7 +571,6 @@ files: | |
| 561 571 | 
             
            - lib/bolt/resource_instance.rb
         | 
| 562 572 | 
             
            - lib/bolt/result.rb
         | 
| 563 573 | 
             
            - lib/bolt/result_set.rb
         | 
| 564 | 
            -
            - lib/bolt/secret.rb
         | 
| 565 574 | 
             
            - lib/bolt/shell.rb
         | 
| 566 575 | 
             
            - lib/bolt/shell/bash.rb
         | 
| 567 576 | 
             
            - lib/bolt/shell/bash/tmpdir.rb
         | 
| @@ -601,6 +610,8 @@ files: | |
| 601 610 | 
             
            - lib/bolt_server/plugin.rb
         | 
| 602 611 | 
             
            - lib/bolt_server/plugin/puppet_connect_data.rb
         | 
| 603 612 | 
             
            - lib/bolt_server/request_error.rb
         | 
| 613 | 
            +
            - lib/bolt_server/schemas/action-apply.json
         | 
| 614 | 
            +
            - lib/bolt_server/schemas/action-apply_prep.json
         | 
| 604 615 | 
             
            - lib/bolt_server/schemas/action-check_node_connections.json
         | 
| 605 616 | 
             
            - lib/bolt_server/schemas/action-run_command.json
         | 
| 606 617 | 
             
            - lib/bolt_server/schemas/action-run_script.json
         | 
    
        data/lib/bolt/secret.rb
    DELETED
    
    | @@ -1,37 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            require 'bolt/plugin'
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            module Bolt
         | 
| 6 | 
            -
              class Secret
         | 
| 7 | 
            -
                KNOWN_KEYS = {
         | 
| 8 | 
            -
                  'createkeys' => %w[keysize private_key public_key],
         | 
| 9 | 
            -
                  'encrypt'    => %w[public_key],
         | 
| 10 | 
            -
                  'decrypt'    => %w[private_key public_key]
         | 
| 11 | 
            -
                }.freeze
         | 
| 12 | 
            -
             | 
| 13 | 
            -
                def self.execute(plugins, outputter, options)
         | 
| 14 | 
            -
                  name   = options[:plugin] || 'pkcs7'
         | 
| 15 | 
            -
                  plugin = plugins.by_name(name)
         | 
| 16 | 
            -
             | 
| 17 | 
            -
                  unless plugin
         | 
| 18 | 
            -
                    raise Bolt::Plugin::PluginError::Unknown, name
         | 
| 19 | 
            -
                  end
         | 
| 20 | 
            -
             | 
| 21 | 
            -
                  case options[:action]
         | 
| 22 | 
            -
                  when 'createkeys'
         | 
| 23 | 
            -
                    opts = { 'force' => options[:force] }.compact
         | 
| 24 | 
            -
                    result = plugins.get_hook(name, :secret_createkeys).call(opts)
         | 
| 25 | 
            -
                    outputter.print_message(result)
         | 
| 26 | 
            -
                  when 'encrypt'
         | 
| 27 | 
            -
                    encrypted = plugins.get_hook(name, :secret_encrypt).call('plaintext_value' => options[:object])
         | 
| 28 | 
            -
                    outputter.print_message(encrypted)
         | 
| 29 | 
            -
                  when 'decrypt'
         | 
| 30 | 
            -
                    decrypted = plugins.get_hook(name, :secret_decrypt).call('encrypted_value' => options[:object])
         | 
| 31 | 
            -
                    outputter.print_message(decrypted)
         | 
| 32 | 
            -
                  end
         | 
| 33 | 
            -
             | 
| 34 | 
            -
                  0
         | 
| 35 | 
            -
                end
         | 
| 36 | 
            -
              end
         | 
| 37 | 
            -
            end
         |