diff --git a/bin/codedeploy-agent b/bin/codedeploy-agent index 6e7d4a4b..8f3560a2 100755 --- a/bin/codedeploy-agent +++ b/bin/codedeploy-agent @@ -2,7 +2,7 @@ $:.unshift File.join(File.dirname(File.expand_path('..', __FILE__)), 'lib') -ruby_versions = ["2.7", "2.6", "2.5", "2.4", "2.3", "2.2", "2.1", "2.0"] +ruby_versions = ["3.0", "2.7", "2.6", "2.5", "2.4", "2.3", "2.2", "2.1", "2.0"] actual_ruby_version = RUBY_VERSION.split('.').map{|s|s.to_i} left_bound = '2.0.0'.split('.').map{|s|s.to_i} ruby_bin = nil diff --git a/bin/install b/bin/install index 24820ebb..bfc25a88 100755 --- a/bin/install +++ b/bin/install @@ -213,10 +213,10 @@ EOF end def supported_ruby_versions - ['2.7', '2.6', '2.5', '2.4', '2.3', '2.2', '2.1', '2.0'] + ['3.0', '2.7', '2.6', '2.5', '2.4', '2.3', '2.2', '2.1', '2.0'] end - # check ruby version, only version 2.x works + # check ruby version, only version 2.x 3.x works def check_ruby_version_and_symlink @log.info("Starting Ruby version check.") actual_ruby_version = RUBY_VERSION.split('.').map{|s|s.to_i}[0,2] @@ -241,9 +241,9 @@ EOF end def unsupported_ruby_version_error - @log.error("Current running Ruby version for "+ENV['USER']+" is "+RUBY_VERSION+", but Ruby version 2.x needs to be installed.") + @log.error("Current running Ruby version for "+ENV['USER']+" is "+RUBY_VERSION+", but Ruby version 2.x, 3.x needs to be installed.") @log.error('If you already have the proper Ruby version installed, please either create a symlink to /usr/bin/ruby2.x,') - @log.error( "or run this install script with right interpreter. Otherwise please install Ruby 2.x for "+ENV['USER']+" user.") + @log.error( "or run this install script with right interpreter. Otherwise please install Ruby 2.x, 3.x for "+ENV['USER']+" user.") @log.error('You can get more information by running the script with --help option.') end @@ -295,15 +295,14 @@ EOF end @type = ARGV.shift.downcase; end - def force_ruby2x(ruby_interpreter_path) # change interpreter when symlink /usr/bin/ruby2.x exists, but running with non-supported ruby version actual_ruby_version = RUBY_VERSION.split('.').map{|s|s.to_i} left_bound = '2.0.0'.split('.').map{|s|s.to_i} - right_bound = '2.7.0'.split('.').map{|s|s.to_i} + right_bound = '3.0.0'.split('.').map{|s|s.to_i} if (actual_ruby_version <=> left_bound) < 0 if(!@reexeced) - @log.info("The current Ruby version is not 2.x! Restarting the installer with #{ruby_interpreter_path}") + @log.info("The current Ruby version is not 2.x or 3.0.x! Restarting the installer with #{ruby_interpreter_path}") exec("#{ruby_interpreter_path}", __FILE__, '--re-execed' , *@args) else unsupported_ruby_version_error diff --git a/codedeploy_agent.gemspec b/codedeploy_agent.gemspec index 6b3e81bd..799ac5fe 100644 --- a/codedeploy_agent.gemspec +++ b/codedeploy_agent.gemspec @@ -1,6 +1,6 @@ Gem::Specification.new do |spec| spec.name = 'aws_codedeploy_agent' - spec.version = '1.4.1' + spec.version = '1.5.0' spec.summary = 'Packages AWS CodeDeploy agent libraries' spec.description = 'AWS CodeDeploy agent is responsible for doing the actual work of deploying software on an individual EC2 instance' spec.author = 'Amazon Web Services' @@ -17,7 +17,6 @@ Gem::Specification.new do |spec| spec.add_dependency('rubyzip', '~> 1.3.0') spec.add_dependency('logging', '~> 1.8') spec.add_dependency('aws-sdk-core', '~> 3') - spec.add_dependency('aws-sdk-code-generator', '~> 0.2.2.pre') spec.add_dependency('aws-sdk-s3', '~> 1') spec.add_dependency('simple_pid', '~> 0.2.1') spec.add_dependency('docopt', '~> 0.5.0') diff --git a/lib/instance_agent/plugins/codedeploy/command_acknowledgement_request_builder.rb b/lib/instance_agent/plugins/codedeploy/command_acknowledgement_request_builder.rb new file mode 100644 index 00000000..2810c15b --- /dev/null +++ b/lib/instance_agent/plugins/codedeploy/command_acknowledgement_request_builder.rb @@ -0,0 +1,47 @@ +module InstanceAgent; module Plugins; module CodeDeployPlugin +class CommandAcknowledgementRequestBuilder + @@MIN_ACK_TIMEOUT = 60 + @@MAX_ACK_TIMEOUT = 4200 + + def initialize(logger) + @logger = logger + end + + def build(diagnostics, host_command_identifier, timeout) + result = build_default(diagnostics, host_command_identifier) + if timeout && timeout > 0 + result[:host_command_max_duration_in_seconds] = correct_timeout(timeout) + end + + result + end + + private + + def build_default(diagnostics, host_command_identifier) + { + :diagnostics => diagnostics, + :host_command_identifier => host_command_identifier + } + end + + def correct_timeout(timeout) + result = timeout + if timeout < @@MIN_ACK_TIMEOUT + log(:info, "Command timeout of #{timeout} is below minimum value of #{@@MIN_ACK_TIMEOUT} " + + "seconds. Sending #{@@MIN_ACK_TIMEOUT} to the service instead.") + result = @@MIN_ACK_TIMEOUT + elsif timeout > @@MAX_ACK_TIMEOUT + log(:warn, "Command timeout of #{timeout} exceeds maximum accepted value #{@@MAX_ACK_TIMEOUT} " + + "seconds. Sending #{@@MAX_ACK_TIMEOUT} to the service instead. Commands may time out.") + result = @@MAX_ACK_TIMEOUT + end + + result + end + + def log(severity, message) + raise ArgumentError, "Unknown severity #{severity.inspect}" unless InstanceAgent::Log::SEVERITIES.include?(severity.to_s) + @logger.send(severity.to_sym, "#{self.class.to_s}: #{message}") + end +end end end end diff --git a/lib/instance_agent/plugins/codedeploy/command_executor.rb b/lib/instance_agent/plugins/codedeploy/command_executor.rb index 8910cc75..a54bc9d5 100644 --- a/lib/instance_agent/plugins/codedeploy/command_executor.rb +++ b/lib/instance_agent/plugins/codedeploy/command_executor.rb @@ -79,6 +79,28 @@ def is_command_noop?(command_name, deployment_spec) return true end + def total_timeout_for_all_lifecycle_events(command_name, deployment_spec) + parsed_spec = InstanceAgent::Plugins::CodeDeployPlugin::DeploymentSpecification.parse(deployment_spec) + timeout_sums = ((@hook_mapping || {command_name => []})[command_name] || []).map do |lifecycle_event| + create_hook_executor(lifecycle_event, parsed_spec).total_timeout_for_all_scripts + end + + total_timeout = nil + if timeout_sums.empty? + log(:info, "Command #{command_name} has no script timeouts specified in appspec.") + # If any lifecycle events' scripts don't specify a timeout, don't set a value. + # The default will be the maximum at the server. + elsif timeout_sums.include?(nil) + log(:info, "Command #{command_name} has at least one script that does not specify a timeout. " + + "No timeout override will be sent.") + else + total_timeout = timeout_sums.reduce(0) {|running_sum, item| running_sum + item} + log(:info, "Command #{command_name} has total script timeout #{total_timeout} in appspec.") + end + + total_timeout + end + def execute_command(command, deployment_specification) method_name = command_method(command.command_name) log(:debug, "Command #{command.command_name} maps to method #{method_name}") diff --git a/lib/instance_agent/plugins/codedeploy/command_poller.rb b/lib/instance_agent/plugins/codedeploy/command_poller.rb index 101915fd..40b67cae 100644 --- a/lib/instance_agent/plugins/codedeploy/command_poller.rb +++ b/lib/instance_agent/plugins/codedeploy/command_poller.rb @@ -67,6 +67,29 @@ def validate end end + # Called during initialization of the child process + def recover_from_crash? + begin + if DeploymentCommandTracker.check_deployment_event_inprogress?() then + log(:warn, "Deployment tracking file found: #{DeploymentCommandTracker.deployment_dir_path()}. The agent likely restarted while running a customer-supplied script. Failing the lifecycle event.") + host_command_identifier = DeploymentCommandTracker.most_recent_host_command_identifier() + + log(:info, "Calling PutHostCommandComplete: 'Failed' #{host_command_identifier}") + @deploy_control_client.put_host_command_complete( + :command_status => "Failed", + :diagnostics => {:format => "JSON", :payload => gather_diagnostics_from_failure_after_restart("Failing in-progress lifecycle event after an agent restart.")}, + :host_command_identifier => host_command_identifier) + + DeploymentCommandTracker.clean_ongoing_deployment_dir() + return true + end + # We want to catch-all exceptions so that the child process always can startup succesfully. + rescue Exception => e + log(:error, "Exception thrown during restart recovery: #{e}") + return nil + end + end + def perform return unless command = next_command @@ -109,7 +132,7 @@ def process_command(command, spec) log(:debug, "Calling #{@plugin.to_s}.execute_command") begin deployment_id = InstanceAgent::Plugins::CodeDeployPlugin::DeploymentSpecification.parse(spec).deployment_id - DeploymentCommandTracker.create_ongoing_deployment_tracking_file(deployment_id) + DeploymentCommandTracker.create_ongoing_deployment_tracking_file(deployment_id, command.host_command_identifier) #Successful commands will complete without raising an exception @plugin.execute_command(command, spec) @@ -232,6 +255,16 @@ def gather_diagnostics_from_error(error) gather_diagnostics_from_script_error(script_error) end + private + def gather_diagnostics_from_failure_after_restart(msg = "") + begin + raise ScriptError.new(ScriptError::FAILED_AFTER_RESTART_CODE, "", ScriptLog.new), "Failed: #{msg}" + rescue ScriptError => e + script_error = e + end + gather_diagnostics_from_script_error(script_error) + end + private def gather_diagnostics(msg = "") begin diff --git a/lib/instance_agent/plugins/codedeploy/deployment_command_tracker.rb b/lib/instance_agent/plugins/codedeploy/deployment_command_tracker.rb index 1bc2c473..4aa7ea67 100644 --- a/lib/instance_agent/plugins/codedeploy/deployment_command_tracker.rb +++ b/lib/instance_agent/plugins/codedeploy/deployment_command_tracker.rb @@ -13,13 +13,13 @@ class FileDoesntExistException < Exception; end class DeploymentCommandTracker DEPLOYMENT_EVENT_FILE_STALE_TIMELIMIT_SECONDS = 86400 # 24 hour limit in secounds - def self.create_ongoing_deployment_tracking_file(deployment_id) + def self.create_ongoing_deployment_tracking_file(deployment_id, host_command_identifier) FileUtils.mkdir_p(deployment_dir_path()) - FileUtils.touch(deployment_event_tracking_file_path(deployment_id)); + File.write(deployment_event_tracking_file_path(deployment_id), host_command_identifier) end def self.delete_deployment_tracking_file_if_stale?(deployment_id, timeout) - if(Time.now - File.ctime(deployment_event_tracking_file_path(deployment_id)) > timeout) + if(Time.now - File.mtime(deployment_event_tracking_file_path(deployment_id)) > timeout) delete_deployment_command_tracking_file(deployment_id) return true; end @@ -27,7 +27,7 @@ def self.delete_deployment_tracking_file_if_stale?(deployment_id, timeout) end def self.check_deployment_event_inprogress? - if(File.exists?deployment_dir_path()) + if(File.exist?(deployment_dir_path())) return directories_and_files_inside(deployment_dir_path()).any?{|deployment_id| check_if_lifecycle_event_is_stale?(deployment_id)} else return false @@ -36,7 +36,7 @@ def self.check_deployment_event_inprogress? def self.delete_deployment_command_tracking_file(deployment_id) ongoing_deployment_event_file_path = deployment_event_tracking_file_path(deployment_id) - if File.exists?ongoing_deployment_event_file_path + if File.exist?(ongoing_deployment_event_file_path) File.delete(ongoing_deployment_event_file_path); else InstanceAgent::Log.warn("the tracking file does not exist") @@ -46,8 +46,18 @@ def self.delete_deployment_command_tracking_file(deployment_id) def self.directories_and_files_inside(directory) Dir.entries(directory) - %w(.. .) end - - private + + def self.most_recent_host_command_identifier + # check_deployment_event_inprogress handles deleting stale files for us. + if check_deployment_event_inprogress? then + most_recent_id = directories_and_files_inside(deployment_dir_path()).max_by{ |filename| File.mtime(deployment_event_tracking_file_path(filename)) } + most_recent_file = deployment_event_tracking_file_path(most_recent_id) + return File.read(most_recent_file) + else + return nil + end + end + def self.deployment_dir_path File.join(InstanceAgent::Config.config[:root_dir], InstanceAgent::Config.config[:ongoing_deployment_tracking]) end @@ -57,8 +67,12 @@ def self.check_if_lifecycle_event_is_stale?(deployment_id) end def self.deployment_event_tracking_file_path(deployment_id) - ongoing_deployment_file_path = File.join(deployment_dir_path(), deployment_id) - end + return File.join(deployment_dir_path(), deployment_id) + end + + def self.clean_ongoing_deployment_dir + FileUtils.rm_r(InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.deployment_dir_path()) rescue Errno::ENOENT + end end end end diff --git a/lib/instance_agent/plugins/codedeploy/hook_executor.rb b/lib/instance_agent/plugins/codedeploy/hook_executor.rb index acc769dd..a4414121 100644 --- a/lib/instance_agent/plugins/codedeploy/hook_executor.rb +++ b/lib/instance_agent/plugins/codedeploy/hook_executor.rb @@ -48,6 +48,8 @@ class ScriptError < StandardError SCRIPT_FAILED_CODE = 4 UNKNOWN_ERROR_CODE = 5 OUTPUTS_LEFT_OPEN_CODE = 6 + FAILED_AFTER_RESTART_CODE = 7 + def initialize(error_code, script_name, log) @error_code = error_code @script_name = script_name @@ -113,6 +115,12 @@ def is_noop? return @app_spec.nil? || @app_spec.hooks[@lifecycle_event].nil? || @app_spec.hooks[@lifecycle_event].empty? end + def total_timeout_for_all_scripts + return nil if is_noop? + timeouts = @app_spec.hooks[@lifecycle_event].map {|script| script.timeout} + timeouts.reduce(0) {|running_sum, item| running_sum + item} + end + def execute return if @app_spec.nil? if (hooks = @app_spec.hooks[@lifecycle_event]) && diff --git a/lib/instance_agent/runner/child.rb b/lib/instance_agent/runner/child.rb index ac96a293..aad67f2e 100644 --- a/lib/instance_agent/runner/child.rb +++ b/lib/instance_agent/runner/child.rb @@ -8,6 +8,8 @@ class Child < ProcessManager::Daemon::Child attr_accessor :runner + @prepare_run_done = false + def load_plugins(plugins) ProcessManager::Log.debug("Registering Plugins: #{plugins.inspect}.") plugins.each do |plugin| @@ -31,7 +33,10 @@ def prepare_run with_error_handling do @runner = @plugins[index].runner ProcessManager.set_program_name(description) + @runner.recover_from_crash?() end + + @prepare_run_done = true end def run @@ -39,16 +44,19 @@ def run runner.run end end - + # Stops the master after recieving the kill signal - # is overriden from ProcessManager::Daemon::Child + # is overriden from ProcessManager::Daemon::Child def stop - @runner.graceful_shutdown + if @prepare_run_done + @runner.graceful_shutdown + end + ProcessManager::Log.info('agent exiting now') super end - # Catches the trap signals and does a default or custom action + # Catches the trap signals and does a default or custom action # is overriden from ProcessManager::Daemon::Child def trap_signals [:INT, :QUIT, :TERM].each do |sig| diff --git a/lib/winagent.rb b/lib/winagent.rb index 344b73e3..b1f47dd3 100644 --- a/lib/winagent.rb +++ b/lib/winagent.rb @@ -41,6 +41,7 @@ def service_main begin @polling_mutex.synchronize do @runner ||= InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller.runner + @runner.recover_from_crash? @runner.run end rescue SystemExit diff --git a/spec/add_service_wrapper_spec.rb b/spec/add_service_wrapper_spec.rb deleted file mode 100644 index cddb7ce1..00000000 --- a/spec/add_service_wrapper_spec.rb +++ /dev/null @@ -1,63 +0,0 @@ -# frozen_string_literal: true -package_root = File.dirname(File.dirname(__FILE__)) - -require "#{package_root}/vendor/gems/codedeploy-commands-1.0.0/lib/aws/add_service_wrapper" - -RSpec.describe 'add_service_wrapper' do - - # This test is taken from the AwsSdkRubyCodeGenWrapper - # https://code.amazon.com/packages/AwsSdkRubyCodeGenWrapper/blobs/mainline/--/spec/add_service_wrapper_spec.rb - describe '#add_service' do - before(:all) do - @service_file = File.expand_path('../fixtures/sample_service.json', __FILE__) - @api = JSON.parse(File.read(@service_file)) - @svc_class = Aws.add_service('GeneratedService', api: @api) - end - - let(:client) {Aws::GeneratedService::Client.new(stub_responses: true) } - - it 'can create a valid client' do - expect(client).to be_instance_of(Aws::GeneratedService::Client) - end - - it 'can create a client from the returned namespace' do - expect(@svc_class::Client.new(stub_responses: true)) - .to be_instance_of(Aws::GeneratedService::Client) - end - - it 'can set constants on the returned namespace' do - @svc_class.const_set(:VERSION, '1.1.42') - expect(Aws::GeneratedService::VERSION).to eq('1.1.42') - end - - it 'can add plugins to the generated client' do - class MyPlugin; end - Aws::GeneratedService::Client.add_plugin(MyPlugin) - expect(Aws::GeneratedService::Client.plugins).to include(MyPlugin) - end - - it 'can generate a whitelabel (non-Aws) service' do - Aws.add_service('MyService', api: @api, whitelabel: true) - expect(MyService::Client.new(stub_responses: true)) - .to be_instance_of(MyService::Client) - end - - it 'loads the model from a string path' do - Aws.add_service('StringPathService', api: @service_file) - expect(Aws::StringPathService::Client.new(stub_responses: true)) - .to be_instance_of(Aws::StringPathService::Client) - end - - it 'loads the model from a PathName' do - Aws.add_service('PathService', api: Pathname.new(@service_file)) - expect(Aws::PathService::Client.new(stub_responses: true)) - .to be_instance_of(Aws::PathService::Client) - end - - it 'raises an ArgumentError if api is not provided' do - expect do - Aws.add_service('NoApiService') - end.to raise_exception(ArgumentError) - end - end -end \ No newline at end of file diff --git a/spec/aws/codedeploy/plugins/deployment_command_tracker_spec.rb b/spec/aws/codedeploy/plugins/deployment_command_tracker_spec.rb index d602194d..a3bec4bb 100644 --- a/spec/aws/codedeploy/plugins/deployment_command_tracker_spec.rb +++ b/spec/aws/codedeploy/plugins/deployment_command_tracker_spec.rb @@ -7,12 +7,13 @@ describe InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker do describe '.create_ongoing_deployment_tracking_file' do $deployment_id = 'D-123' + $host_command_identifier = 'test-host-command-identifier' deployment_command_tracker = InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker; context "when the deployment life cycle event is in progress" do before do InstanceAgent::Config.config[:root_dir] = File.join(Dir.tmpdir(), 'codeDeploytest') - InstanceAgent::Config.config[:ongoing_deployment_tracking] = 'ongoing-deployment' - InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.create_ongoing_deployment_tracking_file($deployment_id) + InstanceAgent::Config.config[:ongoing_deployment_tracking] = 'ongoing-deployment' + InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.create_ongoing_deployment_tracking_file($deployment_id, $host_command_identifier) end it 'tries to create ongoing-deployment folder' do directories_in_deployment_root_folder = deployment_command_tracker.directories_and_files_inside(InstanceAgent::Config.config[:root_dir]); @@ -21,13 +22,17 @@ it 'creates ongoing-deployment file in the tracking folder' do files_in_deployment_tracking_folder = deployment_command_tracker.directories_and_files_inside(File.join(InstanceAgent::Config.config[:root_dir], InstanceAgent::Config.config[:ongoing_deployment_tracking])) expect(files_in_deployment_tracking_folder).to include($deployment_id); - end + end + it 'writes the host command identifier to the file' do + path = InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.deployment_event_tracking_file_path($deployment_id) + expect(File.read(path)).to eq($host_command_identifier) + end end end describe '.check_deployment_event_inprogress' do context 'when no deployment life cycle event is in progress' do - before do - InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.delete_deployment_command_tracking_file($deployment_id) + before do + InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.clean_ongoing_deployment_dir() end it 'checks if any deployment event is in progress' do expect(InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.check_deployment_event_inprogress?).to equal(false); @@ -35,15 +40,15 @@ end context 'when deployment life cycle event is in progress' do before do - InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.create_ongoing_deployment_tracking_file($deployment_id) + InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.create_ongoing_deployment_tracking_file($deployment_id, $host_command_identifier) end it 'checks if any deployment life cycle event is in progress ' do expect(InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.check_deployment_event_inprogress?).to equal(true) end end context 'when the agent starts for the first time' do - before do - FileUtils.rm_r(File.join(InstanceAgent::Config.config[:root_dir], InstanceAgent::Config.config[:ongoing_deployment_tracking])) + before do + InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.clean_ongoing_deployment_dir() end it 'checks if any deployment life cycle event is in progress ' do expect(InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.check_deployment_event_inprogress?).to equal(false) @@ -53,7 +58,7 @@ describe '.delete_deployment_tracking_file_if_stale' do context 'when deployment life cycle event is in progress' do before do - InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.create_ongoing_deployment_tracking_file($deployment_id) + InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.create_ongoing_deployment_tracking_file($deployment_id, $host_command_identifier) end it 'checks if the file is stale or not' do expect(InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.delete_deployment_tracking_file_if_stale?($deployment_id, 2000)).to equal(false) @@ -61,9 +66,50 @@ end context 'when the wait-time has been more than the timeout time' do it 'checks if the file is stale after the timeout' do - sleep 10 - expect(InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.delete_deployment_tracking_file_if_stale?($deployment_id, 5)).to equal(true) + sleep 4 + expect(InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.delete_deployment_tracking_file_if_stale?($deployment_id, 2)).to equal(true) + end + end + end + describe '.most_recent_host_command_identifier' do + context 'when there are no entries in the directory' do + before do + InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.clean_ongoing_deployment_dir() + end + it 'returns nil' do + expect(InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.most_recent_host_command_identifier()).to eq(nil) + end + end + context 'when there is a single stale tracking file in the directory' do + before do + InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.clean_ongoing_deployment_dir() + InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.create_ongoing_deployment_tracking_file($deployment_id, "incorrect-host-command-identifier") + path = InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.deployment_event_tracking_file_path($deployment_id) + FileUtils.touch(path, :mtime => Time.new(2000)) + end + it 'returns nil' do + expect(InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.most_recent_host_command_identifier()).to eq(nil) + end + end + context 'when there is a single non-stale tracking file in the directory' do + before do + InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.clean_ongoing_deployment_dir() + InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.create_ongoing_deployment_tracking_file($deployment_id, $host_command_identifier) + end + it 'should return the file\'s contents' do + expect(InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.most_recent_host_command_identifier()).to eq($host_command_identifier) end end - end -end \ No newline at end of file + context 'when there are multiple tracking files in the directory' do + before do + InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.create_ongoing_deployment_tracking_file("d-one", "incorrect-host-command-identifier") + InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.create_ongoing_deployment_tracking_file("d-two", "incorrect-host-command-identifier") + sleep 2 + InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.create_ongoing_deployment_tracking_file("d-three", $host_command_identifier) + end + it 'should return the most recently edited file\'s contents' do + expect(InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.most_recent_host_command_identifier()).to eq($host_command_identifier) + end + end + end +end \ No newline at end of file diff --git a/test/instance_agent/plugins/codedeploy/command_acknowledgement_request_builder_test.rb b/test/instance_agent/plugins/codedeploy/command_acknowledgement_request_builder_test.rb new file mode 100644 index 00000000..0491f8ba --- /dev/null +++ b/test/instance_agent/plugins/codedeploy/command_acknowledgement_request_builder_test.rb @@ -0,0 +1,69 @@ +require 'instance_agent' +require 'instance_agent/plugins/codedeploy/command_acknowledgement_request_builder' +require 'test_helper' + +class CommandAcknowledgementRequestBuilderTest < Test::Unit::TestCase + include ActiveSupport::Testing::Assertions + include InstanceAgent::Plugins::CodeDeployPlugin + + @@MIN_ACK_TIMEOUT = 60 + @@MAX_ACK_TIMEOUT = 4200 + @@HOST_IDENTIFIER = 'i-123' + @@DIAGNOSTICS = {:format => 'JSON', :payload => {'IsCommandNoop' => true}.to_json()} + @@DEFAULT_REQUEST = {:diagnostics => @@DIAGNOSTICS, :host_command_identifier => @@HOST_IDENTIFIER} + + context 'The Command Acknowledgement Request Builder' do + setup do + @request_builder = InstanceAgent::Plugins::CodeDeployPlugin::CommandAcknowledgementRequestBuilder.new( + stub(:info => nil, :warn => nil)) + end + + context 'nil timeout provided' do + should 'exclude timeout' do + assert_equal(@@DEFAULT_REQUEST, call_request_builder(nil)) + end + end + + context 'timeout of zero provided' do + should 'exclude timeout' do + assert_equal(@@DEFAULT_REQUEST, call_request_builder(0)) + end + end + + context '0 < timeout < 60' do + should 'include timeout with value 60' do + [1, 15, @@MIN_ACK_TIMEOUT-1].each do |timeout| + assert_equal(build_expected_request(@@MIN_ACK_TIMEOUT), call_request_builder(timeout)) + end + end + end + + context '60 <= timeout <= 4200' do + should 'include timeout as provided' do + [@@MIN_ACK_TIMEOUT+1, 3600, @@MAX_ACK_TIMEOUT-1].each do |timeout| + assert_equal(build_expected_request(timeout), call_request_builder(timeout)) + end + end + end + + context 'timeout > 4200' do + should 'include timeout with value 4200' do + assert_equal(build_expected_request(@@MAX_ACK_TIMEOUT), call_request_builder(@@MAX_ACK_TIMEOUT+1)) + end + end + end + + private + + def call_request_builder(timeout) + @request_builder.build(@@DIAGNOSTICS, @@HOST_IDENTIFIER, timeout) + end + + def build_expected_request(expected_timeout) + result = @@DEFAULT_REQUEST.clone + result[:host_command_max_duration_in_seconds] = expected_timeout + + result + end + +end diff --git a/test/instance_agent/plugins/codedeploy/command_executor_test.rb b/test/instance_agent/plugins/codedeploy/command_executor_test.rb index 1d6e4cdf..07fa1a7d 100644 --- a/test/instance_agent/plugins/codedeploy/command_executor_test.rb +++ b/test/instance_agent/plugins/codedeploy/command_executor_test.rb @@ -135,6 +135,12 @@ def github_env_vars() should "be a noop" do assert_true @command_executor.is_command_noop?(@command.command_name, @deployment_spec) end + + should "have a total timeout of nil" do + assert_nil( + @command_executor.total_timeout_for_all_lifecycle_events(@command.command_name, @deployment_spec), + "Unknown command should have a total timeout of nil") + end end context "when executing a valid non-hardcoded command" do @@ -702,7 +708,7 @@ def github_env_vars() @command_executor.execute_command(@command, @deployment_spec) end end - + context "handle bundle from local directory" do setup do @command.command_name = "DownloadBundle" @@ -795,6 +801,12 @@ def github_env_vars() @mock_hook_executor.expects(:is_noop?).returns(true) assert_true @command_executor.is_command_noop?(@command.command_name, @deployment_spec) end + + should "have a total script timeout of nil" do + assert_nil( + @command_executor.total_timeout_for_all_lifecycle_events(@command, @deployment_spec), + "Total timeout should be whatever's returned by HookExecutor") + end end context "AfterBlockTraffic" do @@ -993,6 +1005,30 @@ def github_env_vars() assert_false @command_executor.is_command_noop?(@command.command_name, @deployment_spec) end + should "have a total timeout of 900 seconds" do + HookExecutor.expects(:new).with(@hook_executor_constructor_hash_1).returns(@mock_hook_executor) + HookExecutor.expects(:new).with(@hook_executor_constructor_hash_2).returns(@mock_hook_executor) + + @mock_hook_executor.expects(:total_timeout_for_all_scripts).twice.returns(300, 600) + + assert_equal( + 900, + @command_executor.total_timeout_for_all_lifecycle_events(@command.command_name, @deployment_spec), + "Timeout should be the sum of the appspec timeouts for the scripts for all lifecycle events" + ) + end + + should "have a total timeout of nil when one command has no timeout" do + HookExecutor.expects(:new).with(@hook_executor_constructor_hash_1).returns(@mock_hook_executor) + HookExecutor.expects(:new).with(@hook_executor_constructor_hash_2).returns(@mock_hook_executor) + + @mock_hook_executor.expects(:total_timeout_for_all_scripts).twice.returns(600, nil) + + assert_nil( + @command_executor.total_timeout_for_all_lifecycle_events(@command.command_name, @deployment_spec), + "Timeout should be nil if any script's timeout is nil") + end + context "when the first script is forced to fail" do setup do HookExecutor.stubs(:new).with(@hook_executor_constructor_hash_1).raises("failed to create hook command") diff --git a/test/instance_agent/plugins/codedeploy/command_poller_test.rb b/test/instance_agent/plugins/codedeploy/command_poller_test.rb index e505b873..ec6bb7d5 100644 --- a/test/instance_agent/plugins/codedeploy/command_poller_test.rb +++ b/test/instance_agent/plugins/codedeploy/command_poller_test.rb @@ -14,6 +14,11 @@ def gather_diagnostics(script_output, msg = "") {'error_code' => InstanceAgent::Plugins::CodeDeployPlugin::ScriptError::SUCCEEDED_CODE, 'script_name' => "", 'message' => "Succeeded: #{msg}", 'log' => script_output}.to_json end + def gather_diagnostics_from_failure_after_restart(script_output, msg = "") + script_output ||= "" + {'error_code' => InstanceAgent::Plugins::CodeDeployPlugin::ScriptError::FAILED_AFTER_RESTART_CODE, 'script_name' => "", 'message' => "Failed: #{msg}", 'log' => script_output}.to_json + end + def get_ack_diagnostics(is_command_noop) return {:format => "JSON", :payload => {'IsCommandNoop' => is_command_noop}.to_json()} end @@ -405,6 +410,43 @@ def get_ack_diagnostics(is_command_noop) end + context 'calling recover_from_crash when a lifecycle event is in-progress' do + + setup do + InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.stubs(:check_deployment_event_inprogress?).returns(true) + InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.stubs(:deployment_dir_path).returns("deployment-path") + InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.stubs(:most_recent_host_command_identifier).returns("i-123") + InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.stubs(:clean_ongoing_deployment_dir) + end + + should 'call PutHostCommandComplete' do + @deploy_control_client.expects(:put_host_command_complete). + with(:command_status => "Failed", + :diagnostics => {:format => "JSON", :payload => gather_diagnostics_from_failure_after_restart("", "Failing in-progress lifecycle event after an agent restart.")}, + :host_command_identifier => "i-123") + + @poller.recover_from_crash? + end + end + + context 'calling recover_from_crash when a lifecycle event is not in-progress' do + + setup do + InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.stubs(:check_deployment_event_inprogress?).returns(false) + InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.stubs(:deployment_dir_path).returns("deployment-path") + InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.stubs(:most_recent_host_command_identifier).returns("i-123") + InstanceAgent::Plugins::CodeDeployPlugin::DeploymentCommandTracker.stubs(:clean_ongoing_deployment_dir) + end + + should 'not call PutHostCommandComplete' do + @put_host_command_complete_state.become('never') + @deploy_control_client.expects(:put_host_command_complete).never. + when(@put_host_command_complete_state.is('never')) + + @poller.recover_from_crash? + end + end + context 'when no deployment specification is given by GetDeploymentSpecification' do setup do @@ -442,7 +484,7 @@ def get_ack_diagnostics(is_command_noop) should 'allow exceptions from execute_command to propagate to caller' do @executor.expects(:execute_command). - raises("some error") + raises("some error") @deploy_control_client.expects(:put_host_command_complete). with(:command_status => "Failed", :diagnostics => {:format => "JSON", :payload => gather_diagnostics_from_error(RuntimeError.new("some error"))}, diff --git a/test/instance_agent/plugins/codedeploy/hook_executor_test.rb b/test/instance_agent/plugins/codedeploy/hook_executor_test.rb index eb091a67..edd9fa37 100644 --- a/test/instance_agent/plugins/codedeploy/hook_executor_test.rb +++ b/test/instance_agent/plugins/codedeploy/hook_executor_test.rb @@ -163,11 +163,18 @@ def create_hook_executor(revision_envs = nil) should "be a noop command" do assert_true @hook_executor.is_noop? end + + should "have a total timeout of nil" do + assert_nil(@hook_executor.total_timeout_for_all_scripts) + end end context "running with a single basic script" do setup do - @app_spec = {"version" => 0.0, "os" => "linux", "hooks" => {'ValidateService'=>[{'location'=>'test'}]}} + @app_spec = { + "version" => 0.0, + "os" => "linux", + "hooks" => {'ValidateService'=>[{'location'=>'test', 'timeout'=>300}]}} YAML.stubs(:load).returns(@app_spec) @script_location = File.join(@deployment_root_dir, 'deployment-archive', 'test') @hook_executor = create_hook_executor @@ -177,6 +184,10 @@ def create_hook_executor(revision_envs = nil) assert_false @hook_executor.is_noop? end + should "have a total timeout of 300" do + assert_equal 300, @hook_executor.total_timeout_for_all_scripts + end + context "when hook script doesn't exist" do setup do File.stubs(:exist?).with(@script_location).returns(false) @@ -452,6 +463,54 @@ def create_hook_executor(revision_envs = nil) end end end + + context "running with two scripts with timeouts" do + setup do + @app_spec = { + "version" => 0.0, + "os" => "linux", + "hooks" => {'ValidateService'=>[ + {'location'=>'test', 'timeout'=>300}, + {'location'=>'test2', 'timeout'=>150} + ]} + } + YAML.stubs(:load).returns(@app_spec) + @script_location = File.join(@deployment_root_dir, 'deployment-archive', 'test') + @hook_executor = create_hook_executor + end + + should "not be a noop" do + assert_false @hook_executor.is_noop? + end + + should "have a total timeout of 450" do + assert_equal 450, @hook_executor.total_timeout_for_all_scripts + end + end + + context "running with two scripts, one with timeout" do + setup do + @app_spec = { + "version" => 0.0, + "os" => "linux", + "hooks" => {'ValidateService'=>[ + {'location'=>'test', 'timeout'=>300}, + {'location'=>'test2'} + ]} + } + YAML.stubs(:load).returns(@app_spec) + @script_location = File.join(@deployment_root_dir, 'deployment-archive', 'test') + @hook_executor = create_hook_executor + end + + should "not be a noop" do + assert_false @hook_executor.is_noop? + end + + should "have a total timeout of 3900" do + assert_equal 3900, @hook_executor.total_timeout_for_all_scripts + end + end end end end diff --git a/test/instance_agent/runner/child_test.rb b/test/instance_agent/runner/child_test.rb index 5ce2f47b..0f635af5 100644 --- a/test/instance_agent/runner/child_test.rb +++ b/test/instance_agent/runner/child_test.rb @@ -6,7 +6,8 @@ class RunnerChildTest < InstanceAgentTestCase context 'The runner child' do setup do @dir = Dir.tmpdir() - @agent = mock() + @agent = mock('agent') + @agent.stubs(:recover_from_crash?).returns(true) InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller.stubs(:new).returns(@agent) @agent.stubs(:description).returns("CommandPoller") InstanceAgent::Runner::Child.any_instance.stubs(:trap_signals) @@ -18,6 +19,9 @@ class RunnerChildTest < InstanceAgentTestCase InstanceAgent::Config.config[:wait_between_spawning_children] = 0 SimplePid.stubs(:drop) ProcessManager.reset_on_error_callbacks + @runner = mock('runner') + @runner.stubs(:description).returns 'master-process' + @child.stubs(:runner).returns(@runner) end context 'when preparing the run' do @@ -41,23 +45,23 @@ class RunnerChildTest < InstanceAgentTestCase end end + should 'call recover_from_crash' do + @agent.expects(:recover_from_crash?) + @child.prepare_run() + end + context 'sets the process description' do should 'set it for the running children' do - @child.stubs(:runner).returns(runner = mock('runner')) - runner.stubs(:description).returns 'master-process' assert_equal 'master-process of master 777', @child.description end should 'set it for the booting children' do + @child.stubs(:runner).returns(nil) assert_equal 'booting child', @child.description end end context 'handle exceptions' do - setup do - @child.stubs(:runner).returns(runner = mock('runner')) - runner.stubs(:description).returns 'master-process' - end should 'handle SocketErrors during the run and exit cleanly' do InstanceAgent::Config.config[:wait_after_connection_problem] = 0 @child.expects(:runner).raises(SocketError) diff --git a/vendor/gems/codedeploy-commands-1.0.0/lib/aws/add_service_wrapper.rb b/vendor/gems/codedeploy-commands-1.0.0/lib/aws/add_service_wrapper.rb deleted file mode 100644 index 813a6fc9..00000000 --- a/vendor/gems/codedeploy-commands-1.0.0/lib/aws/add_service_wrapper.rb +++ /dev/null @@ -1,60 +0,0 @@ -require 'aws-sdk-code-generator' -require 'aws-sdk-core' - -module Aws - - # Registers a new service. - # - # Aws.add_service('SvcName', api: '/path/to/svc.api.json') - # - # Aws::SvcName::Client.new - # #=> # - # - # This implementation is taken from the AwsSdkRubyCodeGenWrapper: - # https://code.amazon.com/packages/AwsSdkRubyCodeGenWrapper/blobs/mainline/--/lib/add_service_wrapper.rb - # - # @param [String] svc_name The name of the service. This will also be - # the namespace under {Aws} unless options[:whitelabel] is true. - # This must be a valid constant name. - # @option options[Required, String,Pathname,Hash] :api A a path to a valid - # Coral2JSON model or a hash of a parsed model. - # @option options[Boolean, nil] :whitelabel If true do not prepend - # "Aws" to the generated module namespace. - # @option options[String, nil] :core_path The path to the aws-sdk-core libs - # if unset it will be inferred from the currently loaded aws-sdk-core. - # @option options[Hash,nil] :waiters - # @option options[Hash,nil] :resources - # @return [Module] Returns the new service module. - def self.add_service(name, options = {}) - api_hash = - case options[:api] - when String,Pathname then JSON.parse(File.read(options[:api])) - when Hash then options[:api] - else raise ArgumentError, 'Missing or invalid api: must be a path to a ' \ - 'valid Coral2JSON model or a hash of a parsed model.' - end - module_name = options[:whitelabel] ? name : "Aws::#{name}" - core_path = options[:core_path] || File.dirname($LOADED_FEATURES.find { |f| f.include? 'aws-sdk-core.rb' }) - - code = AwsSdkCodeGenerator::CodeBuilder.new( - aws_sdk_core_lib_path: core_path, - service: AwsSdkCodeGenerator::Service.new( - name: name, - module_name: module_name, - api: api_hash, - paginators: options[:paginators], - waiters: options[:waiters], - resources: options[:resources], - gem_dependencies: { 'aws-sdk-core' => '3' }, - gem_version: '1.0.0', - ) - ) - begin - Object.module_eval(code.source) - rescue => err - puts(code.source) - raise err - end - Object.const_get(module_name) - end -end diff --git a/vendor/gems/codedeploy-commands-1.0.0/lib/aws/codedeploy_commands.rb b/vendor/gems/codedeploy-commands-1.0.0/lib/aws/codedeploy_commands.rb index 0e8e2a13..e8882f74 100644 --- a/vendor/gems/codedeploy-commands-1.0.0/lib/aws/codedeploy_commands.rb +++ b/vendor/gems/codedeploy-commands-1.0.0/lib/aws/codedeploy_commands.rb @@ -1,32 +1,18 @@ gem_root = File.dirname(File.dirname(File.dirname(__FILE__))) -require 'aws-sdk-core' -require "#{gem_root}/lib/aws/add_service_wrapper" require "#{gem_root}/lib/aws/plugins/certificate_authority" require "#{gem_root}/lib/aws/plugins/deploy_control_endpoint" require "#{gem_root}/lib/aws/plugins/deploy_agent_version" -version = '1.0.0' -SERVICE_CLASS_NAME = 'CodeDeployCommand' - if InstanceAgent::Config.config[:enable_auth_policy] - bundled_apis = Dir.glob(File.join(gem_root, 'apis', 'CodeDeployCommandSecure.api.json')).group_by do |path| - File.basename(path).split('.').first - end + require "#{gem_root}/sdks/codedeploy_commands_secure_sdk" elsif InstanceAgent::Config.config[:use_mock_command_service] - bundled_apis = Dir.glob(File.join(gem_root, 'apis', 'ApolloDeployControlService_mock.api.json')).group_by do |path| - File.basename(path).split('.').first - end + require "#{gem_root}/sdks/codedeploy_commands_mock_sdk" else - bundled_apis = Dir.glob(File.join(gem_root, 'apis', 'CodeDeployCommand.api.json')).group_by do |path| - File.basename(path).split('.').first - end + require "#{gem_root}/sdks/codedeploy_commands_sdk" end -bundled_apis.each do |svc_class_name, api_versions| - svc_class = Aws.add_service(SERVICE_CLASS_NAME, api: JSON.parse(File.read(api_versions.first), max_nesting: false)) - svc_class.const_set(:VERSION, version) - Aws::CodeDeployCommand::Client.add_plugin(Aws::Plugins::CertificateAuthority) - Aws::CodeDeployCommand::Client.add_plugin(Aws::Plugins::DeployControlEndpoint) - Aws::CodeDeployCommand::Client.add_plugin(Aws::Plugins::DeployAgentVersion) -end +Aws::CodeDeployCommand::Client.add_plugin(Aws::Plugins::CertificateAuthority) +Aws::CodeDeployCommand::Client.add_plugin(Aws::Plugins::DeployControlEndpoint) +Aws::CodeDeployCommand::Client.add_plugin(Aws::Plugins::DeployAgentVersion) + diff --git a/vendor/gems/codedeploy-commands-1.0.0/sdks/codedeploy_commands_mock_sdk.rb b/vendor/gems/codedeploy-commands-1.0.0/sdks/codedeploy_commands_mock_sdk.rb new file mode 100644 index 00000000..e2268125 --- /dev/null +++ b/vendor/gems/codedeploy-commands-1.0.0/sdks/codedeploy_commands_mock_sdk.rb @@ -0,0 +1,1099 @@ +require 'aws-sdk-core' +# frozen_string_literal: true + +# WARNING ABOUT GENERATED CODE +# +# This file is generated. See the contributing guide for more information: +# https://github.com/aws/aws-sdk-ruby/blob/version-3/CONTRIBUTING.md +# +# WARNING ABOUT GENERATED CODE + +module Aws::CodeDeployCommand + module Types + + # This exception indicates that the request failed due to the fault of + # the customer (either an invalid request was provided, referred to a + # non-existant object, or another reason within the client's control). + # + class ClientException < Aws::EmptyStructure; end + + # The DeploymentSpecification contains an envelope for the generic + # client metadata, and if there is variant-specific metadata, the ID of + # the variant for the host and the envelope containing that variant's + # metadata. All fields are optional, though an empty + # DeploymentSpecification is likely indicative of an error. + # + # @!attribute [rw] generic_envelope + # For an Envelope used for host command diagnostics, Format is limited + # to 64 characters and Payload is limited to 8192 characters. + # @return [Types::Envelope] + # + # @!attribute [rw] variant_id + # @return [String] + # + # @!attribute [rw] variant_envelope + # For an Envelope used for host command diagnostics, Format is limited + # to 64 characters and Payload is limited to 8192 characters. + # @return [Types::Envelope] + # + class DeploymentSpecification < Struct.new( + :generic_envelope, + :variant_id, + :variant_envelope) + SENSITIVE = [] + include Aws::Structure + end + + # For an Envelope used for host command diagnostics, Format is limited + # to 64 characters and Payload is limited to 8192 characters. + # + # @note When making an API call, you may pass Envelope + # data as a hash: + # + # { + # format: "Format", + # payload: "Payload", + # } + # + # @!attribute [rw] format + # @return [String] + # + # @!attribute [rw] payload + # @return [String] + # + class Envelope < Struct.new( + :format, + :payload) + SENSITIVE = [] + include Aws::Structure + end + + # @note When making an API call, you may pass GetDeploymentSpecificationInput + # data as a hash: + # + # { + # deployment_execution_id: "DeploymentExecutionId", # required + # host_identifier: "HostIdentifier", # required + # } + # + # @!attribute [rw] deployment_execution_id + # @return [String] + # + # @!attribute [rw] host_identifier + # An identifier for referring to a unit of capacity. + # @return [String] + # + class GetDeploymentSpecificationInput < Struct.new( + :deployment_execution_id, + :host_identifier) + SENSITIVE = [] + include Aws::Structure + end + + # @!attribute [rw] deployment_system + # @return [String] + # + # @!attribute [rw] deployment_specification + # The DeploymentSpecification contains an envelope for the generic + # client metadata, and if there is variant-specific metadata, the ID + # of the variant for the host and the envelope containing that + # variant's metadata. All fields are optional, though an empty + # DeploymentSpecification is likely indicative of an error. + # @return [Types::DeploymentSpecification] + # + class GetDeploymentSpecificationOutput < Struct.new( + :deployment_system, + :deployment_specification) + SENSITIVE = [] + include Aws::Structure + end + + # @!attribute [rw] host_command_identifier + # @return [String] + # + # @!attribute [rw] host_identifier + # An identifier for referring to a unit of capacity. + # @return [String] + # + # @!attribute [rw] deployment_execution_id + # @return [String] + # + # @!attribute [rw] command_name + # @return [String] + # + # @!attribute [rw] nonce + # @return [Integer] + # + class HostCommandInstance < Struct.new( + :host_command_identifier, + :host_identifier, + :deployment_execution_id, + :command_name, + :nonce) + SENSITIVE = [] + include Aws::Structure + end + + # @note When making an API call, you may pass PollHostCommandInput + # data as a hash: + # + # { + # host_identifier: "HostIdentifier", # required + # } + # + # @!attribute [rw] host_identifier + # An identifier for referring to a unit of capacity. + # @return [String] + # + class PollHostCommandInput < Struct.new( + :host_identifier) + SENSITIVE = [] + include Aws::Structure + end + + # @!attribute [rw] host_command + # @return [Types::HostCommandInstance] + # + class PollHostCommandOutput < Struct.new( + :host_command) + SENSITIVE = [] + include Aws::Structure + end + + # @note When making an API call, you may pass PostHostCommandUpdateInput + # data as a hash: + # + # { + # host_command_identifier: "HostCommandIdentifier", # required + # estimated_completion_time: Time.now, + # diagnostics: { + # format: "Format", + # payload: "Payload", + # }, + # } + # + # @!attribute [rw] host_command_identifier + # @return [String] + # + # @!attribute [rw] estimated_completion_time + # @return [Time] + # + # @!attribute [rw] diagnostics + # For an Envelope used for host command diagnostics, Format is limited + # to 64 characters and Payload is limited to 8192 characters. + # @return [Types::Envelope] + # + class PostHostCommandUpdateInput < Struct.new( + :host_command_identifier, + :estimated_completion_time, + :diagnostics) + SENSITIVE = [] + include Aws::Structure + end + + # @!attribute [rw] command_status + # @return [String] + # + class PostHostCommandUpdateOutput < Struct.new( + :command_status) + SENSITIVE = [] + include Aws::Structure + end + + # @note When making an API call, you may pass PutHostCommandAcknowledgementInput + # data as a hash: + # + # { + # host_command_identifier: "HostCommandIdentifier", # required + # diagnostics: { + # format: "Format", + # payload: "Payload", + # }, + # } + # + # @!attribute [rw] host_command_identifier + # @return [String] + # + # @!attribute [rw] diagnostics + # For an Envelope used for host command diagnostics, Format is limited + # to 64 characters and Payload is limited to 8192 characters. + # @return [Types::Envelope] + # + class PutHostCommandAcknowledgementInput < Struct.new( + :host_command_identifier, + :diagnostics) + SENSITIVE = [] + include Aws::Structure + end + + # @!attribute [rw] command_status + # @return [String] + # + class PutHostCommandAcknowledgementOutput < Struct.new( + :command_status) + SENSITIVE = [] + include Aws::Structure + end + + # @note When making an API call, you may pass PutHostCommandCompleteInput + # data as a hash: + # + # { + # host_command_identifier: "HostCommandIdentifier", # required + # command_status: "Pending", # required, accepts Pending, InProgress, Succeeded, Failed + # diagnostics: { + # format: "Format", + # payload: "Payload", + # }, + # } + # + # @!attribute [rw] host_command_identifier + # @return [String] + # + # @!attribute [rw] command_status + # @return [String] + # + # @!attribute [rw] diagnostics + # For an Envelope used for host command diagnostics, Format is limited + # to 64 characters and Payload is limited to 8192 characters. + # @return [Types::Envelope] + # + class PutHostCommandCompleteInput < Struct.new( + :host_command_identifier, + :command_status, + :diagnostics) + SENSITIVE = [] + include Aws::Structure + end + + # This exception indicates that the request failed due to a problem on + # the server, or with the server's dependencies. + # + class ServerException < Aws::EmptyStructure; end + + end +end + +# frozen_string_literal: true + +# WARNING ABOUT GENERATED CODE +# +# This file is generated. See the contributing guide for more information: +# https://github.com/aws/aws-sdk-ruby/blob/version-3/CONTRIBUTING.md +# +# WARNING ABOUT GENERATED CODE + +module Aws::CodeDeployCommand + # @api private + module ClientApi + + include Seahorse::Model + + ClientException = Shapes::StructureShape.new(name: 'ClientException') + DeploymentCommandName = Shapes::StringShape.new(name: 'DeploymentCommandName') + DeploymentCommandStatus = Shapes::StringShape.new(name: 'DeploymentCommandStatus') + DeploymentExecutionId = Shapes::StringShape.new(name: 'DeploymentExecutionId') + DeploymentSpecification = Shapes::StructureShape.new(name: 'DeploymentSpecification') + Envelope = Shapes::StructureShape.new(name: 'Envelope') + Format = Shapes::StringShape.new(name: 'Format') + GenericDateTimestamp = Shapes::TimestampShape.new(name: 'GenericDateTimestamp') + GenericLong = Shapes::IntegerShape.new(name: 'GenericLong') + GenericString = Shapes::StringShape.new(name: 'GenericString') + GetDeploymentSpecificationInput = Shapes::StructureShape.new(name: 'GetDeploymentSpecificationInput') + GetDeploymentSpecificationOutput = Shapes::StructureShape.new(name: 'GetDeploymentSpecificationOutput') + HostCommandIdentifier = Shapes::StringShape.new(name: 'HostCommandIdentifier') + HostCommandInstance = Shapes::StructureShape.new(name: 'HostCommandInstance') + HostIdentifier = Shapes::StringShape.new(name: 'HostIdentifier') + Payload = Shapes::StringShape.new(name: 'Payload') + PollHostCommandInput = Shapes::StructureShape.new(name: 'PollHostCommandInput') + PollHostCommandOutput = Shapes::StructureShape.new(name: 'PollHostCommandOutput') + PostHostCommandUpdateInput = Shapes::StructureShape.new(name: 'PostHostCommandUpdateInput') + PostHostCommandUpdateOutput = Shapes::StructureShape.new(name: 'PostHostCommandUpdateOutput') + PutHostCommandAcknowledgementInput = Shapes::StructureShape.new(name: 'PutHostCommandAcknowledgementInput') + PutHostCommandAcknowledgementOutput = Shapes::StructureShape.new(name: 'PutHostCommandAcknowledgementOutput') + PutHostCommandCompleteInput = Shapes::StructureShape.new(name: 'PutHostCommandCompleteInput') + ServerException = Shapes::StructureShape.new(name: 'ServerException') + VariantId = Shapes::StringShape.new(name: 'VariantId') + + ClientException.struct_class = Types::ClientException + + DeploymentSpecification.add_member(:generic_envelope, Shapes::ShapeRef.new(shape: Envelope, location_name: "GenericEnvelope")) + DeploymentSpecification.add_member(:variant_id, Shapes::ShapeRef.new(shape: VariantId, location_name: "VariantId")) + DeploymentSpecification.add_member(:variant_envelope, Shapes::ShapeRef.new(shape: Envelope, location_name: "VariantEnvelope")) + DeploymentSpecification.struct_class = Types::DeploymentSpecification + + Envelope.add_member(:format, Shapes::ShapeRef.new(shape: Format, location_name: "Format")) + Envelope.add_member(:payload, Shapes::ShapeRef.new(shape: Payload, location_name: "Payload")) + Envelope.struct_class = Types::Envelope + + GetDeploymentSpecificationInput.add_member(:deployment_execution_id, Shapes::ShapeRef.new(shape: DeploymentExecutionId, required: true, location_name: "DeploymentExecutionId")) + GetDeploymentSpecificationInput.add_member(:host_identifier, Shapes::ShapeRef.new(shape: HostIdentifier, required: true, location_name: "HostIdentifier")) + GetDeploymentSpecificationInput.struct_class = Types::GetDeploymentSpecificationInput + + GetDeploymentSpecificationOutput.add_member(:deployment_system, Shapes::ShapeRef.new(shape: GenericString, location_name: "DeploymentSystem")) + GetDeploymentSpecificationOutput.add_member(:deployment_specification, Shapes::ShapeRef.new(shape: DeploymentSpecification, location_name: "DeploymentSpecification")) + GetDeploymentSpecificationOutput.struct_class = Types::GetDeploymentSpecificationOutput + + HostCommandInstance.add_member(:host_command_identifier, Shapes::ShapeRef.new(shape: HostCommandIdentifier, location_name: "HostCommandIdentifier")) + HostCommandInstance.add_member(:host_identifier, Shapes::ShapeRef.new(shape: HostIdentifier, location_name: "HostIdentifier")) + HostCommandInstance.add_member(:deployment_execution_id, Shapes::ShapeRef.new(shape: DeploymentExecutionId, location_name: "DeploymentExecutionId")) + HostCommandInstance.add_member(:command_name, Shapes::ShapeRef.new(shape: DeploymentCommandName, location_name: "CommandName")) + HostCommandInstance.add_member(:nonce, Shapes::ShapeRef.new(shape: GenericLong, location_name: "Nonce")) + HostCommandInstance.struct_class = Types::HostCommandInstance + + PollHostCommandInput.add_member(:host_identifier, Shapes::ShapeRef.new(shape: HostIdentifier, required: true, location_name: "HostIdentifier")) + PollHostCommandInput.struct_class = Types::PollHostCommandInput + + PollHostCommandOutput.add_member(:host_command, Shapes::ShapeRef.new(shape: HostCommandInstance, location_name: "HostCommand")) + PollHostCommandOutput.struct_class = Types::PollHostCommandOutput + + PostHostCommandUpdateInput.add_member(:host_command_identifier, Shapes::ShapeRef.new(shape: HostCommandIdentifier, required: true, location_name: "HostCommandIdentifier")) + PostHostCommandUpdateInput.add_member(:estimated_completion_time, Shapes::ShapeRef.new(shape: GenericDateTimestamp, location_name: "EstimatedCompletionTime")) + PostHostCommandUpdateInput.add_member(:diagnostics, Shapes::ShapeRef.new(shape: Envelope, location_name: "Diagnostics")) + PostHostCommandUpdateInput.struct_class = Types::PostHostCommandUpdateInput + + PostHostCommandUpdateOutput.add_member(:command_status, Shapes::ShapeRef.new(shape: DeploymentCommandStatus, location_name: "CommandStatus")) + PostHostCommandUpdateOutput.struct_class = Types::PostHostCommandUpdateOutput + + PutHostCommandAcknowledgementInput.add_member(:host_command_identifier, Shapes::ShapeRef.new(shape: HostCommandIdentifier, required: true, location_name: "HostCommandIdentifier")) + PutHostCommandAcknowledgementInput.add_member(:diagnostics, Shapes::ShapeRef.new(shape: Envelope, location_name: "Diagnostics")) + PutHostCommandAcknowledgementInput.struct_class = Types::PutHostCommandAcknowledgementInput + + PutHostCommandAcknowledgementOutput.add_member(:command_status, Shapes::ShapeRef.new(shape: DeploymentCommandStatus, location_name: "CommandStatus")) + PutHostCommandAcknowledgementOutput.struct_class = Types::PutHostCommandAcknowledgementOutput + + PutHostCommandCompleteInput.add_member(:host_command_identifier, Shapes::ShapeRef.new(shape: HostCommandIdentifier, required: true, location_name: "HostCommandIdentifier")) + PutHostCommandCompleteInput.add_member(:command_status, Shapes::ShapeRef.new(shape: DeploymentCommandStatus, required: true, location_name: "CommandStatus")) + PutHostCommandCompleteInput.add_member(:diagnostics, Shapes::ShapeRef.new(shape: Envelope, location_name: "Diagnostics")) + PutHostCommandCompleteInput.struct_class = Types::PutHostCommandCompleteInput + + ServerException.struct_class = Types::ServerException + + + # @api private + API = Seahorse::Model::Api.new.tap do |api| + + api.version = "2014-10-06" + + api.metadata = { + "apiVersion" => "2014-10-06", + "endpointPrefix" => "codedeploy-commands", + "jsonVersion" => "1.1", + "protocol" => "json", + "serviceAbbreviation" => "CodeDeployCommand", + "serviceFullName" => "AWS CodeDeploy Command Service", + "signatureVersion" => "v4", + "targetPrefix" => "ApolloDeployControlService_mock", + } + + api.add_operation(:get_deployment_specification, Seahorse::Model::Operation.new.tap do |o| + o.name = "GetDeploymentSpecification" + o.http_method = "POST" + o.http_request_uri = "/" + o.input = Shapes::ShapeRef.new(shape: GetDeploymentSpecificationInput) + o.output = Shapes::ShapeRef.new(shape: GetDeploymentSpecificationOutput) + o.errors << Shapes::ShapeRef.new(shape: ClientException) + o.errors << Shapes::ShapeRef.new(shape: ServerException) + end) + + api.add_operation(:poll_host_command, Seahorse::Model::Operation.new.tap do |o| + o.name = "PollHostCommand" + o.http_method = "POST" + o.http_request_uri = "/" + o.input = Shapes::ShapeRef.new(shape: PollHostCommandInput) + o.output = Shapes::ShapeRef.new(shape: PollHostCommandOutput) + o.errors << Shapes::ShapeRef.new(shape: ClientException) + o.errors << Shapes::ShapeRef.new(shape: ServerException) + end) + + api.add_operation(:post_host_command_update, Seahorse::Model::Operation.new.tap do |o| + o.name = "PostHostCommandUpdate" + o.http_method = "POST" + o.http_request_uri = "/" + o.input = Shapes::ShapeRef.new(shape: PostHostCommandUpdateInput) + o.output = Shapes::ShapeRef.new(shape: PostHostCommandUpdateOutput) + o.errors << Shapes::ShapeRef.new(shape: ClientException) + o.errors << Shapes::ShapeRef.new(shape: ServerException) + end) + + api.add_operation(:put_host_command_acknowledgement, Seahorse::Model::Operation.new.tap do |o| + o.name = "PutHostCommandAcknowledgement" + o.http_method = "POST" + o.http_request_uri = "/" + o.input = Shapes::ShapeRef.new(shape: PutHostCommandAcknowledgementInput) + o.output = Shapes::ShapeRef.new(shape: PutHostCommandAcknowledgementOutput) + o.errors << Shapes::ShapeRef.new(shape: ClientException) + o.errors << Shapes::ShapeRef.new(shape: ServerException) + end) + + api.add_operation(:put_host_command_complete, Seahorse::Model::Operation.new.tap do |o| + o.name = "PutHostCommandComplete" + o.http_method = "POST" + o.http_request_uri = "/" + o.input = Shapes::ShapeRef.new(shape: PutHostCommandCompleteInput) + o.output = Shapes::ShapeRef.new(shape: Shapes::StructureShape.new(struct_class: Aws::EmptyStructure)) + o.errors << Shapes::ShapeRef.new(shape: ClientException) + o.errors << Shapes::ShapeRef.new(shape: ServerException) + end) + end + + end +end + +# frozen_string_literal: true + +# WARNING ABOUT GENERATED CODE +# +# This file is generated. See the contributing guide for more information: +# https://github.com/aws/aws-sdk-ruby/blob/version-3/CONTRIBUTING.md +# +# WARNING ABOUT GENERATED CODE + +require 'seahorse/client/plugins/content_length.rb' +require 'aws-sdk-core/plugins/credentials_configuration.rb' +require 'aws-sdk-core/plugins/logging.rb' +require 'aws-sdk-core/plugins/param_converter.rb' +require 'aws-sdk-core/plugins/param_validator.rb' +require 'aws-sdk-core/plugins/user_agent.rb' +require 'aws-sdk-core/plugins/helpful_socket_errors.rb' +require 'aws-sdk-core/plugins/retry_errors.rb' +require 'aws-sdk-core/plugins/global_configuration.rb' +require 'aws-sdk-core/plugins/regional_endpoint.rb' +require 'aws-sdk-core/plugins/endpoint_discovery.rb' +require 'aws-sdk-core/plugins/endpoint_pattern.rb' +require 'aws-sdk-core/plugins/response_paging.rb' +require 'aws-sdk-core/plugins/stub_responses.rb' +require 'aws-sdk-core/plugins/idempotency_token.rb' +require 'aws-sdk-core/plugins/jsonvalue_converter.rb' +require 'aws-sdk-core/plugins/client_metrics_plugin.rb' +require 'aws-sdk-core/plugins/client_metrics_send_plugin.rb' +require 'aws-sdk-core/plugins/transfer_encoding.rb' +require 'aws-sdk-core/plugins/http_checksum.rb' +require 'aws-sdk-core/plugins/signature_v4.rb' +require 'aws-sdk-core/plugins/protocols/json_rpc.rb' + +Aws::Plugins::GlobalConfiguration.add_identifier(:codedeploycommand) + +module Aws::CodeDeployCommand + # An API client for CodeDeployCommand. To construct a client, you need to configure a `:region` and `:credentials`. + # + # client = Aws::CodeDeployCommand::Client.new( + # region: region_name, + # credentials: credentials, + # # ... + # ) + # + # For details on configuring region and credentials see + # the [developer guide](/sdk-for-ruby/v3/developer-guide/setup-config.html). + # + # See {#initialize} for a full list of supported configuration options. + class Client < Seahorse::Client::Base + + include Aws::ClientStubs + + @identifier = :codedeploycommand + + set_api(ClientApi::API) + + add_plugin(Seahorse::Client::Plugins::ContentLength) + add_plugin(Aws::Plugins::CredentialsConfiguration) + add_plugin(Aws::Plugins::Logging) + add_plugin(Aws::Plugins::ParamConverter) + add_plugin(Aws::Plugins::ParamValidator) + add_plugin(Aws::Plugins::UserAgent) + add_plugin(Aws::Plugins::HelpfulSocketErrors) + add_plugin(Aws::Plugins::RetryErrors) + add_plugin(Aws::Plugins::GlobalConfiguration) + add_plugin(Aws::Plugins::RegionalEndpoint) + add_plugin(Aws::Plugins::EndpointDiscovery) + add_plugin(Aws::Plugins::EndpointPattern) + add_plugin(Aws::Plugins::ResponsePaging) + add_plugin(Aws::Plugins::StubResponses) + add_plugin(Aws::Plugins::IdempotencyToken) + add_plugin(Aws::Plugins::JsonvalueConverter) + add_plugin(Aws::Plugins::ClientMetricsPlugin) + add_plugin(Aws::Plugins::ClientMetricsSendPlugin) + add_plugin(Aws::Plugins::TransferEncoding) + add_plugin(Aws::Plugins::HttpChecksum) + add_plugin(Aws::Plugins::SignatureV4) + add_plugin(Aws::Plugins::Protocols::JsonRpc) + + # @overload initialize(options) + # @param [Hash] options + # @option options [required, Aws::CredentialProvider] :credentials + # Your AWS credentials. This can be an instance of any one of the + # following classes: + # + # * `Aws::Credentials` - Used for configuring static, non-refreshing + # credentials. + # + # * `Aws::SharedCredentials` - Used for loading static credentials from a + # shared file, such as `~/.aws/config`. + # + # * `Aws::AssumeRoleCredentials` - Used when you need to assume a role. + # + # * `Aws::AssumeRoleWebIdentityCredentials` - Used when you need to + # assume a role after providing credentials via the web. + # + # * `Aws::SSOCredentials` - Used for loading credentials from AWS SSO using an + # access token generated from `aws login`. + # + # * `Aws::ProcessCredentials` - Used for loading credentials from a + # process that outputs to stdout. + # + # * `Aws::InstanceProfileCredentials` - Used for loading credentials + # from an EC2 IMDS on an EC2 instance. + # + # * `Aws::ECSCredentials` - Used for loading credentials from + # instances running in ECS. + # + # * `Aws::CognitoIdentityCredentials` - Used for loading credentials + # from the Cognito Identity service. + # + # When `:credentials` are not configured directly, the following + # locations will be searched for credentials: + # + # * `Aws.config[:credentials]` + # * The `:access_key_id`, `:secret_access_key`, and `:session_token` options. + # * ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY'] + # * `~/.aws/credentials` + # * `~/.aws/config` + # * EC2/ECS IMDS instance profile - When used by default, the timeouts + # are very aggressive. Construct and pass an instance of + # `Aws::InstanceProfileCredentails` or `Aws::ECSCredentials` to + # enable retries and extended timeouts. + # + # @option options [required, String] :region + # The AWS region to connect to. The configured `:region` is + # used to determine the service `:endpoint`. When not passed, + # a default `:region` is searched for in the following locations: + # + # * `Aws.config[:region]` + # * `ENV['AWS_REGION']` + # * `ENV['AMAZON_REGION']` + # * `ENV['AWS_DEFAULT_REGION']` + # * `~/.aws/credentials` + # * `~/.aws/config` + # + # @option options [String] :access_key_id + # + # @option options [Boolean] :active_endpoint_cache (false) + # When set to `true`, a thread polling for endpoints will be running in + # the background every 60 secs (default). Defaults to `false`. + # + # @option options [Boolean] :adaptive_retry_wait_to_fill (true) + # Used only in `adaptive` retry mode. When true, the request will sleep + # until there is sufficent client side capacity to retry the request. + # When false, the request will raise a `RetryCapacityNotAvailableError` and will + # not retry instead of sleeping. + # + # @option options [Boolean] :client_side_monitoring (false) + # When `true`, client-side metrics will be collected for all API requests from + # this client. + # + # @option options [String] :client_side_monitoring_client_id ("") + # Allows you to provide an identifier for this client which will be attached to + # all generated client side metrics. Defaults to an empty string. + # + # @option options [String] :client_side_monitoring_host ("127.0.0.1") + # Allows you to specify the DNS hostname or IPv4 or IPv6 address that the client + # side monitoring agent is running on, where client metrics will be published via UDP. + # + # @option options [Integer] :client_side_monitoring_port (31000) + # Required for publishing client metrics. The port that the client side monitoring + # agent is running on, where client metrics will be published via UDP. + # + # @option options [Aws::ClientSideMonitoring::Publisher] :client_side_monitoring_publisher (Aws::ClientSideMonitoring::Publisher) + # Allows you to provide a custom client-side monitoring publisher class. By default, + # will use the Client Side Monitoring Agent Publisher. + # + # @option options [Boolean] :convert_params (true) + # When `true`, an attempt is made to coerce request parameters into + # the required types. + # + # @option options [Boolean] :correct_clock_skew (true) + # Used only in `standard` and adaptive retry modes. Specifies whether to apply + # a clock skew correction and retry requests with skewed client clocks. + # + # @option options [Boolean] :disable_host_prefix_injection (false) + # Set to true to disable SDK automatically adding host prefix + # to default service endpoint when available. + # + # @option options [String] :endpoint + # The client endpoint is normally constructed from the `:region` + # option. You should only configure an `:endpoint` when connecting + # to test or custom endpoints. This should be a valid HTTP(S) URI. + # + # @option options [Integer] :endpoint_cache_max_entries (1000) + # Used for the maximum size limit of the LRU cache storing endpoints data + # for endpoint discovery enabled operations. Defaults to 1000. + # + # @option options [Integer] :endpoint_cache_max_threads (10) + # Used for the maximum threads in use for polling endpoints to be cached, defaults to 10. + # + # @option options [Integer] :endpoint_cache_poll_interval (60) + # When :endpoint_discovery and :active_endpoint_cache is enabled, + # Use this option to config the time interval in seconds for making + # requests fetching endpoints information. Defaults to 60 sec. + # + # @option options [Boolean] :endpoint_discovery (false) + # When set to `true`, endpoint discovery will be enabled for operations when available. + # + # @option options [Aws::Log::Formatter] :log_formatter (Aws::Log::Formatter.default) + # The log formatter. + # + # @option options [Symbol] :log_level (:info) + # The log level to send messages to the `:logger` at. + # + # @option options [Logger] :logger + # The Logger instance to send log messages to. If this option + # is not set, logging will be disabled. + # + # @option options [Integer] :max_attempts (3) + # An integer representing the maximum number attempts that will be made for + # a single request, including the initial attempt. For example, + # setting this value to 5 will result in a request being retried up to + # 4 times. Used in `standard` and `adaptive` retry modes. + # + # @option options [String] :profile ("default") + # Used when loading credentials from the shared credentials file + # at HOME/.aws/credentials. When not specified, 'default' is used. + # + # @option options [Proc] :retry_backoff + # A proc or lambda used for backoff. Defaults to 2**retries * retry_base_delay. + # This option is only used in the `legacy` retry mode. + # + # @option options [Float] :retry_base_delay (0.3) + # The base delay in seconds used by the default backoff function. This option + # is only used in the `legacy` retry mode. + # + # @option options [Symbol] :retry_jitter (:none) + # A delay randomiser function used by the default backoff function. + # Some predefined functions can be referenced by name - :none, :equal, :full, + # otherwise a Proc that takes and returns a number. This option is only used + # in the `legacy` retry mode. + # + # @see https://www.awsarchitectureblog.com/2015/03/backoff.html + # + # @option options [Integer] :retry_limit (3) + # The maximum number of times to retry failed requests. Only + # ~ 500 level server errors and certain ~ 400 level client errors + # are retried. Generally, these are throttling errors, data + # checksum errors, networking errors, timeout errors, auth errors, + # endpoint discovery, and errors from expired credentials. + # This option is only used in the `legacy` retry mode. + # + # @option options [Integer] :retry_max_delay (0) + # The maximum number of seconds to delay between retries (0 for no limit) + # used by the default backoff function. This option is only used in the + # `legacy` retry mode. + # + # @option options [String] :retry_mode ("legacy") + # Specifies which retry algorithm to use. Values are: + # + # * `legacy` - The pre-existing retry behavior. This is default value if + # no retry mode is provided. + # + # * `standard` - A standardized set of retry rules across the AWS SDKs. + # This includes support for retry quotas, which limit the number of + # unsuccessful retries a client can make. + # + # * `adaptive` - An experimental retry mode that includes all the + # functionality of `standard` mode along with automatic client side + # throttling. This is a provisional mode that may change behavior + # in the future. + # + # + # @option options [String] :secret_access_key + # + # @option options [String] :session_token + # + # @option options [Boolean] :simple_json (false) + # Disables request parameter conversion, validation, and formatting. + # Also disable response data type conversions. This option is useful + # when you want to ensure the highest level of performance by + # avoiding overhead of walking request parameters and response data + # structures. + # + # When `:simple_json` is enabled, the request parameters hash must + # be formatted exactly as the DynamoDB API expects. + # + # @option options [Boolean] :stub_responses (false) + # Causes the client to return stubbed responses. By default + # fake responses are generated and returned. You can specify + # the response data to return or errors to raise by calling + # {ClientStubs#stub_responses}. See {ClientStubs} for more information. + # + # ** Please note ** When response stubbing is enabled, no HTTP + # requests are made, and retries are disabled. + # + # @option options [Boolean] :validate_params (true) + # When `true`, request parameters are validated before + # sending the request. + # + # @option options [URI::HTTP,String] :http_proxy A proxy to send + # requests through. Formatted like 'http://proxy.com:123'. + # + # @option options [Float] :http_open_timeout (15) The number of + # seconds to wait when opening a HTTP session before raising a + # `Timeout::Error`. + # + # @option options [Integer] :http_read_timeout (60) The default + # number of seconds to wait for response data. This value can + # safely be set per-request on the session. + # + # @option options [Float] :http_idle_timeout (5) The number of + # seconds a connection is allowed to sit idle before it is + # considered stale. Stale connections are closed and removed + # from the pool before making a request. + # + # @option options [Float] :http_continue_timeout (1) The number of + # seconds to wait for a 100-continue response before sending the + # request body. This option has no effect unless the request has + # "Expect" header set to "100-continue". Defaults to `nil` which + # disables this behaviour. This value can safely be set per + # request on the session. + # + # @option options [Boolean] :http_wire_trace (false) When `true`, + # HTTP debug output will be sent to the `:logger`. + # + # @option options [Boolean] :ssl_verify_peer (true) When `true`, + # SSL peer certificates are verified when establishing a + # connection. + # + # @option options [String] :ssl_ca_bundle Full path to the SSL + # certificate authority bundle file that should be used when + # verifying peer certificates. If you do not pass + # `:ssl_ca_bundle` or `:ssl_ca_directory` the the system default + # will be used if available. + # + # @option options [String] :ssl_ca_directory Full path of the + # directory that contains the unbundled SSL certificate + # authority files for verifying peer certificates. If you do + # not pass `:ssl_ca_bundle` or `:ssl_ca_directory` the the + # system default will be used if available. + # + def initialize(*args) + super + end + + # @!group API Operations + + # Retrieve the deployment specification for the deployment and host, + # consisting of the client metadata provided when the deployment was + # created. The generic client metadata will be provided, as well as the + # client metadata for the host's variant (if variant-specific metadata + # was provided). Throws DeploymentNotFoundException if the + # DeploymentExecutionId does not identify a current deployment. Throws + # HostNotFoundException if the host is not recognized by the deployment + # engine. Throws ServerException for failures caused by the deployment + # system or its dependencies. + # + # @option params [required, String] :deployment_execution_id + # + # @option params [required, String] :host_identifier + # An identifier for referring to a unit of capacity. + # + # @return [Types::GetDeploymentSpecificationOutput] Returns a {Seahorse::Client::Response response} object which responds to the following methods: + # + # * {Types::GetDeploymentSpecificationOutput#deployment_system #deployment_system} => String + # * {Types::GetDeploymentSpecificationOutput#deployment_specification #deployment_specification} => Types::DeploymentSpecification + # + # @example Request syntax with placeholder values + # + # resp = client.get_deployment_specification({ + # deployment_execution_id: "DeploymentExecutionId", # required + # host_identifier: "HostIdentifier", # required + # }) + # + # @example Response structure + # + # resp.deployment_system #=> String + # resp.deployment_specification.generic_envelope.format #=> String + # resp.deployment_specification.generic_envelope.payload #=> String + # resp.deployment_specification.variant_id #=> String + # resp.deployment_specification.variant_envelope.format #=> String + # resp.deployment_specification.variant_envelope.payload #=> String + # + # @overload get_deployment_specification(params = {}) + # @param [Hash] params ({}) + def get_deployment_specification(params = {}, options = {}) + req = build_request(:get_deployment_specification, params) + req.send_request(options) + end + + # This requests a command from the deployment workflow engine. If no + # command is ready to be dispatched, the output will be empty + # (HostCommand will be null). Throws HostNotFoundException if the host + # is not recognized by the deployment engine. Throws ServerException for + # failures caused by the deployment system or its dependencies. + # + # @option params [required, String] :host_identifier + # An identifier for referring to a unit of capacity. + # + # @return [Types::PollHostCommandOutput] Returns a {Seahorse::Client::Response response} object which responds to the following methods: + # + # * {Types::PollHostCommandOutput#host_command #host_command} => Types::HostCommandInstance + # + # @example Request syntax with placeholder values + # + # resp = client.poll_host_command({ + # host_identifier: "HostIdentifier", # required + # }) + # + # @example Response structure + # + # resp.host_command.host_command_identifier #=> String + # resp.host_command.host_identifier #=> String + # resp.host_command.deployment_execution_id #=> String + # resp.host_command.command_name #=> String + # resp.host_command.nonce #=> Integer + # + # @overload poll_host_command(params = {}) + # @param [Hash] params ({}) + def poll_host_command(params = {}, options = {}) + req = build_request(:poll_host_command, params) + req.send_request(options) + end + + # This updates the central workflow engine with the current progress of + # the host command. This will also return the status of the host command + # centrally if possible, so agents can skip processing the command if it + # has been aborted / timed out. However, the status is optional, so if + # no status is returned the agent should treat it as if it was ok to + # continue. Throws ClientException for an invalid HostCommandIdentifier + # or Diagnostics. Throws ServerException for failures caused by the + # deployment system or its dependencies. + # + # @option params [required, String] :host_command_identifier + # + # @option params [Time,DateTime,Date,Integer,String] :estimated_completion_time + # + # @option params [Types::Envelope] :diagnostics + # For an Envelope used for host command diagnostics, Format is limited + # to 64 characters and Payload is limited to 8192 characters. + # + # @return [Types::PostHostCommandUpdateOutput] Returns a {Seahorse::Client::Response response} object which responds to the following methods: + # + # * {Types::PostHostCommandUpdateOutput#command_status #command_status} => String + # + # @example Request syntax with placeholder values + # + # resp = client.post_host_command_update({ + # host_command_identifier: "HostCommandIdentifier", # required + # estimated_completion_time: Time.now, + # diagnostics: { + # format: "Format", + # payload: "Payload", + # }, + # }) + # + # @example Response structure + # + # resp.command_status #=> String, one of "Pending", "InProgress", "Succeeded", "Failed" + # + # @overload post_host_command_update(params = {}) + # @param [Hash] params ({}) + def post_host_command_update(params = {}, options = {}) + req = build_request(:post_host_command_update, params) + req.send_request(options) + end + + # This notifies the central workflow engine that the agent has received + # the specified command and is ready to start execution. This will also + # return the status of the host command centrally if possible, so agents + # can skip processing the command if it has been aborted / timed out. + # However, the status is optional, so if no status is returned the agent + # should treat it as if it was ok to continue. Throws ClientException + # for an invalid HostCommandIdentifier or Diagnostics. Throws + # ServerException for failures caused by the deployment system or its + # dependencies. + # + # @option params [required, String] :host_command_identifier + # + # @option params [Types::Envelope] :diagnostics + # For an Envelope used for host command diagnostics, Format is limited + # to 64 characters and Payload is limited to 8192 characters. + # + # @return [Types::PutHostCommandAcknowledgementOutput] Returns a {Seahorse::Client::Response response} object which responds to the following methods: + # + # * {Types::PutHostCommandAcknowledgementOutput#command_status #command_status} => String + # + # @example Request syntax with placeholder values + # + # resp = client.put_host_command_acknowledgement({ + # host_command_identifier: "HostCommandIdentifier", # required + # diagnostics: { + # format: "Format", + # payload: "Payload", + # }, + # }) + # + # @example Response structure + # + # resp.command_status #=> String, one of "Pending", "InProgress", "Succeeded", "Failed" + # + # @overload put_host_command_acknowledgement(params = {}) + # @param [Hash] params ({}) + def put_host_command_acknowledgement(params = {}, options = {}) + req = build_request(:put_host_command_acknowledgement, params) + req.send_request(options) + end + + # This reports completion of the command back to the workflow engine. + # Throws ClientException for an invalid HostCommandIdentifier or + # Diagnostics. Throws ServerException for failures caused by the + # deployment system or its dependencies. + # + # @option params [required, String] :host_command_identifier + # + # @option params [required, String] :command_status + # + # @option params [Types::Envelope] :diagnostics + # For an Envelope used for host command diagnostics, Format is limited + # to 64 characters and Payload is limited to 8192 characters. + # + # @return [Struct] Returns an empty {Seahorse::Client::Response response}. + # + # @example Request syntax with placeholder values + # + # resp = client.put_host_command_complete({ + # host_command_identifier: "HostCommandIdentifier", # required + # command_status: "Pending", # required, accepts Pending, InProgress, Succeeded, Failed + # diagnostics: { + # format: "Format", + # payload: "Payload", + # }, + # }) + # + # @overload put_host_command_complete(params = {}) + # @param [Hash] params ({}) + def put_host_command_complete(params = {}, options = {}) + req = build_request(:put_host_command_complete, params) + req.send_request(options) + end + + # @!endgroup + + # @param params ({}) + # @api private + def build_request(operation_name, params = {}) + handlers = @handlers.for(operation_name) + context = Seahorse::Client::RequestContext.new( + operation_name: operation_name, + operation: config.api.operation(operation_name), + client: self, + params: params, + config: config) + context[:gem_name] = 'aws-sdk-codedeploycommand' + context[:gem_version] = '1.0.0' + Seahorse::Client::Request.new(handlers, context) + end + + # @api private + # @deprecated + def waiter_names + [] + end + + class << self + + # @api private + attr_reader :identifier + + # @api private + def errors_module + Errors + end + + end + end +end + +# frozen_string_literal: true + +# WARNING ABOUT GENERATED CODE +# +# This file is generated. See the contributing guide for more information: +# https://github.com/aws/aws-sdk-ruby/blob/version-3/CONTRIBUTING.md +# +# WARNING ABOUT GENERATED CODE + +module Aws::CodeDeployCommand + + # When CodeDeployCommand returns an error response, the Ruby SDK constructs and raises an error. + # These errors all extend Aws::CodeDeployCommand::Errors::ServiceError < {Aws::Errors::ServiceError} + # + # You can rescue all CodeDeployCommand errors using ServiceError: + # + # begin + # # do stuff + # rescue Aws::CodeDeployCommand::Errors::ServiceError + # # rescues all CodeDeployCommand API errors + # end + # + # + # ## Request Context + # ServiceError objects have a {Aws::Errors::ServiceError#context #context} method that returns + # information about the request that generated the error. + # See {Seahorse::Client::RequestContext} for more information. + # + # ## Error Classes + # * {ClientException} + # * {ServerException} + # + # Additionally, error classes are dynamically generated for service errors based on the error code + # if they are not defined above. + module Errors + + extend Aws::Errors::DynamicErrors + + class ClientException < ServiceError + + # @param [Seahorse::Client::RequestContext] context + # @param [String] message + # @param [Aws::CodeDeployCommand::Types::ClientException] data + def initialize(context, message, data = Aws::EmptyStructure.new) + super(context, message, data) + end + end + + class ServerException < ServiceError + + # @param [Seahorse::Client::RequestContext] context + # @param [String] message + # @param [Aws::CodeDeployCommand::Types::ServerException] data + def initialize(context, message, data = Aws::EmptyStructure.new) + super(context, message, data) + end + end + + end +end + +# frozen_string_literal: true + +# WARNING ABOUT GENERATED CODE +# +# This file is generated. See the contributing guide for more information: +# https://github.com/aws/aws-sdk-ruby/blob/version-3/CONTRIBUTING.md +# +# WARNING ABOUT GENERATED CODE + +module Aws::CodeDeployCommand + + class Resource + + # @param options ({}) + # @option options [Client] :client + def initialize(options = {}) + @client = options[:client] || Client.new(options) + end + + # @return [Client] + def client + @client + end + + end +end diff --git a/vendor/gems/codedeploy-commands-1.0.0/sdks/codedeploy_commands_sdk.rb b/vendor/gems/codedeploy-commands-1.0.0/sdks/codedeploy_commands_sdk.rb new file mode 100644 index 00000000..e48ab069 --- /dev/null +++ b/vendor/gems/codedeploy-commands-1.0.0/sdks/codedeploy_commands_sdk.rb @@ -0,0 +1,1099 @@ +require 'aws-sdk-core' +# frozen_string_literal: true + +# WARNING ABOUT GENERATED CODE +# +# This file is generated. See the contributing guide for more information: +# https://github.com/aws/aws-sdk-ruby/blob/version-3/CONTRIBUTING.md +# +# WARNING ABOUT GENERATED CODE + +module Aws::CodeDeployCommand + module Types + + # This exception indicates that the request failed due to the fault of + # the customer (either an invalid request was provided, referred to a + # non-existant object, or another reason within the client's control). + # + class ClientException < Aws::EmptyStructure; end + + # The DeploymentSpecification contains an envelope for the generic + # client metadata, and if there is variant-specific metadata, the ID of + # the variant for the host and the envelope containing that variant's + # metadata. All fields are optional, though an empty + # DeploymentSpecification is likely indicative of an error. + # + # @!attribute [rw] generic_envelope + # For an Envelope used for host command diagnostics, Format is limited + # to 64 characters and Payload is limited to 8192 characters. + # @return [Types::Envelope] + # + # @!attribute [rw] variant_id + # @return [String] + # + # @!attribute [rw] variant_envelope + # For an Envelope used for host command diagnostics, Format is limited + # to 64 characters and Payload is limited to 8192 characters. + # @return [Types::Envelope] + # + class DeploymentSpecification < Struct.new( + :generic_envelope, + :variant_id, + :variant_envelope) + SENSITIVE = [] + include Aws::Structure + end + + # For an Envelope used for host command diagnostics, Format is limited + # to 64 characters and Payload is limited to 8192 characters. + # + # @note When making an API call, you may pass Envelope + # data as a hash: + # + # { + # format: "Format", + # payload: "Payload", + # } + # + # @!attribute [rw] format + # @return [String] + # + # @!attribute [rw] payload + # @return [String] + # + class Envelope < Struct.new( + :format, + :payload) + SENSITIVE = [] + include Aws::Structure + end + + # @note When making an API call, you may pass GetDeploymentSpecificationInput + # data as a hash: + # + # { + # deployment_execution_id: "DeploymentExecutionId", # required + # host_identifier: "HostIdentifier", # required + # } + # + # @!attribute [rw] deployment_execution_id + # @return [String] + # + # @!attribute [rw] host_identifier + # An identifier for referring to a unit of capacity. + # @return [String] + # + class GetDeploymentSpecificationInput < Struct.new( + :deployment_execution_id, + :host_identifier) + SENSITIVE = [] + include Aws::Structure + end + + # @!attribute [rw] deployment_system + # @return [String] + # + # @!attribute [rw] deployment_specification + # The DeploymentSpecification contains an envelope for the generic + # client metadata, and if there is variant-specific metadata, the ID + # of the variant for the host and the envelope containing that + # variant's metadata. All fields are optional, though an empty + # DeploymentSpecification is likely indicative of an error. + # @return [Types::DeploymentSpecification] + # + class GetDeploymentSpecificationOutput < Struct.new( + :deployment_system, + :deployment_specification) + SENSITIVE = [] + include Aws::Structure + end + + # @!attribute [rw] host_command_identifier + # @return [String] + # + # @!attribute [rw] host_identifier + # An identifier for referring to a unit of capacity. + # @return [String] + # + # @!attribute [rw] deployment_execution_id + # @return [String] + # + # @!attribute [rw] command_name + # @return [String] + # + # @!attribute [rw] nonce + # @return [Integer] + # + class HostCommandInstance < Struct.new( + :host_command_identifier, + :host_identifier, + :deployment_execution_id, + :command_name, + :nonce) + SENSITIVE = [] + include Aws::Structure + end + + # @note When making an API call, you may pass PollHostCommandInput + # data as a hash: + # + # { + # host_identifier: "HostIdentifier", # required + # } + # + # @!attribute [rw] host_identifier + # An identifier for referring to a unit of capacity. + # @return [String] + # + class PollHostCommandInput < Struct.new( + :host_identifier) + SENSITIVE = [] + include Aws::Structure + end + + # @!attribute [rw] host_command + # @return [Types::HostCommandInstance] + # + class PollHostCommandOutput < Struct.new( + :host_command) + SENSITIVE = [] + include Aws::Structure + end + + # @note When making an API call, you may pass PostHostCommandUpdateInput + # data as a hash: + # + # { + # host_command_identifier: "HostCommandIdentifier", # required + # estimated_completion_time: Time.now, + # diagnostics: { + # format: "Format", + # payload: "Payload", + # }, + # } + # + # @!attribute [rw] host_command_identifier + # @return [String] + # + # @!attribute [rw] estimated_completion_time + # @return [Time] + # + # @!attribute [rw] diagnostics + # For an Envelope used for host command diagnostics, Format is limited + # to 64 characters and Payload is limited to 8192 characters. + # @return [Types::Envelope] + # + class PostHostCommandUpdateInput < Struct.new( + :host_command_identifier, + :estimated_completion_time, + :diagnostics) + SENSITIVE = [] + include Aws::Structure + end + + # @!attribute [rw] command_status + # @return [String] + # + class PostHostCommandUpdateOutput < Struct.new( + :command_status) + SENSITIVE = [] + include Aws::Structure + end + + # @note When making an API call, you may pass PutHostCommandAcknowledgementInput + # data as a hash: + # + # { + # host_command_identifier: "HostCommandIdentifier", # required + # diagnostics: { + # format: "Format", + # payload: "Payload", + # }, + # } + # + # @!attribute [rw] host_command_identifier + # @return [String] + # + # @!attribute [rw] diagnostics + # For an Envelope used for host command diagnostics, Format is limited + # to 64 characters and Payload is limited to 8192 characters. + # @return [Types::Envelope] + # + class PutHostCommandAcknowledgementInput < Struct.new( + :host_command_identifier, + :diagnostics) + SENSITIVE = [] + include Aws::Structure + end + + # @!attribute [rw] command_status + # @return [String] + # + class PutHostCommandAcknowledgementOutput < Struct.new( + :command_status) + SENSITIVE = [] + include Aws::Structure + end + + # @note When making an API call, you may pass PutHostCommandCompleteInput + # data as a hash: + # + # { + # host_command_identifier: "HostCommandIdentifier", # required + # command_status: "Pending", # required, accepts Pending, InProgress, Succeeded, Failed + # diagnostics: { + # format: "Format", + # payload: "Payload", + # }, + # } + # + # @!attribute [rw] host_command_identifier + # @return [String] + # + # @!attribute [rw] command_status + # @return [String] + # + # @!attribute [rw] diagnostics + # For an Envelope used for host command diagnostics, Format is limited + # to 64 characters and Payload is limited to 8192 characters. + # @return [Types::Envelope] + # + class PutHostCommandCompleteInput < Struct.new( + :host_command_identifier, + :command_status, + :diagnostics) + SENSITIVE = [] + include Aws::Structure + end + + # This exception indicates that the request failed due to a problem on + # the server, or with the server's dependencies. + # + class ServerException < Aws::EmptyStructure; end + + end +end + +# frozen_string_literal: true + +# WARNING ABOUT GENERATED CODE +# +# This file is generated. See the contributing guide for more information: +# https://github.com/aws/aws-sdk-ruby/blob/version-3/CONTRIBUTING.md +# +# WARNING ABOUT GENERATED CODE + +module Aws::CodeDeployCommand + # @api private + module ClientApi + + include Seahorse::Model + + ClientException = Shapes::StructureShape.new(name: 'ClientException') + DeploymentCommandName = Shapes::StringShape.new(name: 'DeploymentCommandName') + DeploymentCommandStatus = Shapes::StringShape.new(name: 'DeploymentCommandStatus') + DeploymentExecutionId = Shapes::StringShape.new(name: 'DeploymentExecutionId') + DeploymentSpecification = Shapes::StructureShape.new(name: 'DeploymentSpecification') + Envelope = Shapes::StructureShape.new(name: 'Envelope') + Format = Shapes::StringShape.new(name: 'Format') + GenericDateTimestamp = Shapes::TimestampShape.new(name: 'GenericDateTimestamp') + GenericLong = Shapes::IntegerShape.new(name: 'GenericLong') + GenericString = Shapes::StringShape.new(name: 'GenericString') + GetDeploymentSpecificationInput = Shapes::StructureShape.new(name: 'GetDeploymentSpecificationInput') + GetDeploymentSpecificationOutput = Shapes::StructureShape.new(name: 'GetDeploymentSpecificationOutput') + HostCommandIdentifier = Shapes::StringShape.new(name: 'HostCommandIdentifier') + HostCommandInstance = Shapes::StructureShape.new(name: 'HostCommandInstance') + HostIdentifier = Shapes::StringShape.new(name: 'HostIdentifier') + Payload = Shapes::StringShape.new(name: 'Payload') + PollHostCommandInput = Shapes::StructureShape.new(name: 'PollHostCommandInput') + PollHostCommandOutput = Shapes::StructureShape.new(name: 'PollHostCommandOutput') + PostHostCommandUpdateInput = Shapes::StructureShape.new(name: 'PostHostCommandUpdateInput') + PostHostCommandUpdateOutput = Shapes::StructureShape.new(name: 'PostHostCommandUpdateOutput') + PutHostCommandAcknowledgementInput = Shapes::StructureShape.new(name: 'PutHostCommandAcknowledgementInput') + PutHostCommandAcknowledgementOutput = Shapes::StructureShape.new(name: 'PutHostCommandAcknowledgementOutput') + PutHostCommandCompleteInput = Shapes::StructureShape.new(name: 'PutHostCommandCompleteInput') + ServerException = Shapes::StructureShape.new(name: 'ServerException') + VariantId = Shapes::StringShape.new(name: 'VariantId') + + ClientException.struct_class = Types::ClientException + + DeploymentSpecification.add_member(:generic_envelope, Shapes::ShapeRef.new(shape: Envelope, location_name: "GenericEnvelope")) + DeploymentSpecification.add_member(:variant_id, Shapes::ShapeRef.new(shape: VariantId, location_name: "VariantId")) + DeploymentSpecification.add_member(:variant_envelope, Shapes::ShapeRef.new(shape: Envelope, location_name: "VariantEnvelope")) + DeploymentSpecification.struct_class = Types::DeploymentSpecification + + Envelope.add_member(:format, Shapes::ShapeRef.new(shape: Format, location_name: "Format")) + Envelope.add_member(:payload, Shapes::ShapeRef.new(shape: Payload, location_name: "Payload")) + Envelope.struct_class = Types::Envelope + + GetDeploymentSpecificationInput.add_member(:deployment_execution_id, Shapes::ShapeRef.new(shape: DeploymentExecutionId, required: true, location_name: "DeploymentExecutionId")) + GetDeploymentSpecificationInput.add_member(:host_identifier, Shapes::ShapeRef.new(shape: HostIdentifier, required: true, location_name: "HostIdentifier")) + GetDeploymentSpecificationInput.struct_class = Types::GetDeploymentSpecificationInput + + GetDeploymentSpecificationOutput.add_member(:deployment_system, Shapes::ShapeRef.new(shape: GenericString, location_name: "DeploymentSystem")) + GetDeploymentSpecificationOutput.add_member(:deployment_specification, Shapes::ShapeRef.new(shape: DeploymentSpecification, location_name: "DeploymentSpecification")) + GetDeploymentSpecificationOutput.struct_class = Types::GetDeploymentSpecificationOutput + + HostCommandInstance.add_member(:host_command_identifier, Shapes::ShapeRef.new(shape: HostCommandIdentifier, location_name: "HostCommandIdentifier")) + HostCommandInstance.add_member(:host_identifier, Shapes::ShapeRef.new(shape: HostIdentifier, location_name: "HostIdentifier")) + HostCommandInstance.add_member(:deployment_execution_id, Shapes::ShapeRef.new(shape: DeploymentExecutionId, location_name: "DeploymentExecutionId")) + HostCommandInstance.add_member(:command_name, Shapes::ShapeRef.new(shape: DeploymentCommandName, location_name: "CommandName")) + HostCommandInstance.add_member(:nonce, Shapes::ShapeRef.new(shape: GenericLong, location_name: "Nonce")) + HostCommandInstance.struct_class = Types::HostCommandInstance + + PollHostCommandInput.add_member(:host_identifier, Shapes::ShapeRef.new(shape: HostIdentifier, required: true, location_name: "HostIdentifier")) + PollHostCommandInput.struct_class = Types::PollHostCommandInput + + PollHostCommandOutput.add_member(:host_command, Shapes::ShapeRef.new(shape: HostCommandInstance, location_name: "HostCommand")) + PollHostCommandOutput.struct_class = Types::PollHostCommandOutput + + PostHostCommandUpdateInput.add_member(:host_command_identifier, Shapes::ShapeRef.new(shape: HostCommandIdentifier, required: true, location_name: "HostCommandIdentifier")) + PostHostCommandUpdateInput.add_member(:estimated_completion_time, Shapes::ShapeRef.new(shape: GenericDateTimestamp, location_name: "EstimatedCompletionTime")) + PostHostCommandUpdateInput.add_member(:diagnostics, Shapes::ShapeRef.new(shape: Envelope, location_name: "Diagnostics")) + PostHostCommandUpdateInput.struct_class = Types::PostHostCommandUpdateInput + + PostHostCommandUpdateOutput.add_member(:command_status, Shapes::ShapeRef.new(shape: DeploymentCommandStatus, location_name: "CommandStatus")) + PostHostCommandUpdateOutput.struct_class = Types::PostHostCommandUpdateOutput + + PutHostCommandAcknowledgementInput.add_member(:host_command_identifier, Shapes::ShapeRef.new(shape: HostCommandIdentifier, required: true, location_name: "HostCommandIdentifier")) + PutHostCommandAcknowledgementInput.add_member(:diagnostics, Shapes::ShapeRef.new(shape: Envelope, location_name: "Diagnostics")) + PutHostCommandAcknowledgementInput.struct_class = Types::PutHostCommandAcknowledgementInput + + PutHostCommandAcknowledgementOutput.add_member(:command_status, Shapes::ShapeRef.new(shape: DeploymentCommandStatus, location_name: "CommandStatus")) + PutHostCommandAcknowledgementOutput.struct_class = Types::PutHostCommandAcknowledgementOutput + + PutHostCommandCompleteInput.add_member(:host_command_identifier, Shapes::ShapeRef.new(shape: HostCommandIdentifier, required: true, location_name: "HostCommandIdentifier")) + PutHostCommandCompleteInput.add_member(:command_status, Shapes::ShapeRef.new(shape: DeploymentCommandStatus, required: true, location_name: "CommandStatus")) + PutHostCommandCompleteInput.add_member(:diagnostics, Shapes::ShapeRef.new(shape: Envelope, location_name: "Diagnostics")) + PutHostCommandCompleteInput.struct_class = Types::PutHostCommandCompleteInput + + ServerException.struct_class = Types::ServerException + + + # @api private + API = Seahorse::Model::Api.new.tap do |api| + + api.version = "2014-10-06" + + api.metadata = { + "apiVersion" => "2014-10-06", + "endpointPrefix" => "codedeploy-commands", + "jsonVersion" => "1.1", + "protocol" => "json", + "serviceAbbreviation" => "CodeDeployCommand", + "serviceFullName" => "AWS CodeDeploy Command Service", + "signatureVersion" => "v4", + "targetPrefix" => "CodeDeployCommandService_v20141006", + } + + api.add_operation(:get_deployment_specification, Seahorse::Model::Operation.new.tap do |o| + o.name = "GetDeploymentSpecification" + o.http_method = "POST" + o.http_request_uri = "/" + o.input = Shapes::ShapeRef.new(shape: GetDeploymentSpecificationInput) + o.output = Shapes::ShapeRef.new(shape: GetDeploymentSpecificationOutput) + o.errors << Shapes::ShapeRef.new(shape: ClientException) + o.errors << Shapes::ShapeRef.new(shape: ServerException) + end) + + api.add_operation(:poll_host_command, Seahorse::Model::Operation.new.tap do |o| + o.name = "PollHostCommand" + o.http_method = "POST" + o.http_request_uri = "/" + o.input = Shapes::ShapeRef.new(shape: PollHostCommandInput) + o.output = Shapes::ShapeRef.new(shape: PollHostCommandOutput) + o.errors << Shapes::ShapeRef.new(shape: ClientException) + o.errors << Shapes::ShapeRef.new(shape: ServerException) + end) + + api.add_operation(:post_host_command_update, Seahorse::Model::Operation.new.tap do |o| + o.name = "PostHostCommandUpdate" + o.http_method = "POST" + o.http_request_uri = "/" + o.input = Shapes::ShapeRef.new(shape: PostHostCommandUpdateInput) + o.output = Shapes::ShapeRef.new(shape: PostHostCommandUpdateOutput) + o.errors << Shapes::ShapeRef.new(shape: ClientException) + o.errors << Shapes::ShapeRef.new(shape: ServerException) + end) + + api.add_operation(:put_host_command_acknowledgement, Seahorse::Model::Operation.new.tap do |o| + o.name = "PutHostCommandAcknowledgement" + o.http_method = "POST" + o.http_request_uri = "/" + o.input = Shapes::ShapeRef.new(shape: PutHostCommandAcknowledgementInput) + o.output = Shapes::ShapeRef.new(shape: PutHostCommandAcknowledgementOutput) + o.errors << Shapes::ShapeRef.new(shape: ClientException) + o.errors << Shapes::ShapeRef.new(shape: ServerException) + end) + + api.add_operation(:put_host_command_complete, Seahorse::Model::Operation.new.tap do |o| + o.name = "PutHostCommandComplete" + o.http_method = "POST" + o.http_request_uri = "/" + o.input = Shapes::ShapeRef.new(shape: PutHostCommandCompleteInput) + o.output = Shapes::ShapeRef.new(shape: Shapes::StructureShape.new(struct_class: Aws::EmptyStructure)) + o.errors << Shapes::ShapeRef.new(shape: ClientException) + o.errors << Shapes::ShapeRef.new(shape: ServerException) + end) + end + + end +end + +# frozen_string_literal: true + +# WARNING ABOUT GENERATED CODE +# +# This file is generated. See the contributing guide for more information: +# https://github.com/aws/aws-sdk-ruby/blob/version-3/CONTRIBUTING.md +# +# WARNING ABOUT GENERATED CODE + +require 'seahorse/client/plugins/content_length.rb' +require 'aws-sdk-core/plugins/credentials_configuration.rb' +require 'aws-sdk-core/plugins/logging.rb' +require 'aws-sdk-core/plugins/param_converter.rb' +require 'aws-sdk-core/plugins/param_validator.rb' +require 'aws-sdk-core/plugins/user_agent.rb' +require 'aws-sdk-core/plugins/helpful_socket_errors.rb' +require 'aws-sdk-core/plugins/retry_errors.rb' +require 'aws-sdk-core/plugins/global_configuration.rb' +require 'aws-sdk-core/plugins/regional_endpoint.rb' +require 'aws-sdk-core/plugins/endpoint_discovery.rb' +require 'aws-sdk-core/plugins/endpoint_pattern.rb' +require 'aws-sdk-core/plugins/response_paging.rb' +require 'aws-sdk-core/plugins/stub_responses.rb' +require 'aws-sdk-core/plugins/idempotency_token.rb' +require 'aws-sdk-core/plugins/jsonvalue_converter.rb' +require 'aws-sdk-core/plugins/client_metrics_plugin.rb' +require 'aws-sdk-core/plugins/client_metrics_send_plugin.rb' +require 'aws-sdk-core/plugins/transfer_encoding.rb' +require 'aws-sdk-core/plugins/http_checksum.rb' +require 'aws-sdk-core/plugins/signature_v4.rb' +require 'aws-sdk-core/plugins/protocols/json_rpc.rb' + +Aws::Plugins::GlobalConfiguration.add_identifier(:codedeploycommand) + +module Aws::CodeDeployCommand + # An API client for CodeDeployCommand. To construct a client, you need to configure a `:region` and `:credentials`. + # + # client = Aws::CodeDeployCommand::Client.new( + # region: region_name, + # credentials: credentials, + # # ... + # ) + # + # For details on configuring region and credentials see + # the [developer guide](/sdk-for-ruby/v3/developer-guide/setup-config.html). + # + # See {#initialize} for a full list of supported configuration options. + class Client < Seahorse::Client::Base + + include Aws::ClientStubs + + @identifier = :codedeploycommand + + set_api(ClientApi::API) + + add_plugin(Seahorse::Client::Plugins::ContentLength) + add_plugin(Aws::Plugins::CredentialsConfiguration) + add_plugin(Aws::Plugins::Logging) + add_plugin(Aws::Plugins::ParamConverter) + add_plugin(Aws::Plugins::ParamValidator) + add_plugin(Aws::Plugins::UserAgent) + add_plugin(Aws::Plugins::HelpfulSocketErrors) + add_plugin(Aws::Plugins::RetryErrors) + add_plugin(Aws::Plugins::GlobalConfiguration) + add_plugin(Aws::Plugins::RegionalEndpoint) + add_plugin(Aws::Plugins::EndpointDiscovery) + add_plugin(Aws::Plugins::EndpointPattern) + add_plugin(Aws::Plugins::ResponsePaging) + add_plugin(Aws::Plugins::StubResponses) + add_plugin(Aws::Plugins::IdempotencyToken) + add_plugin(Aws::Plugins::JsonvalueConverter) + add_plugin(Aws::Plugins::ClientMetricsPlugin) + add_plugin(Aws::Plugins::ClientMetricsSendPlugin) + add_plugin(Aws::Plugins::TransferEncoding) + add_plugin(Aws::Plugins::HttpChecksum) + add_plugin(Aws::Plugins::SignatureV4) + add_plugin(Aws::Plugins::Protocols::JsonRpc) + + # @overload initialize(options) + # @param [Hash] options + # @option options [required, Aws::CredentialProvider] :credentials + # Your AWS credentials. This can be an instance of any one of the + # following classes: + # + # * `Aws::Credentials` - Used for configuring static, non-refreshing + # credentials. + # + # * `Aws::SharedCredentials` - Used for loading static credentials from a + # shared file, such as `~/.aws/config`. + # + # * `Aws::AssumeRoleCredentials` - Used when you need to assume a role. + # + # * `Aws::AssumeRoleWebIdentityCredentials` - Used when you need to + # assume a role after providing credentials via the web. + # + # * `Aws::SSOCredentials` - Used for loading credentials from AWS SSO using an + # access token generated from `aws login`. + # + # * `Aws::ProcessCredentials` - Used for loading credentials from a + # process that outputs to stdout. + # + # * `Aws::InstanceProfileCredentials` - Used for loading credentials + # from an EC2 IMDS on an EC2 instance. + # + # * `Aws::ECSCredentials` - Used for loading credentials from + # instances running in ECS. + # + # * `Aws::CognitoIdentityCredentials` - Used for loading credentials + # from the Cognito Identity service. + # + # When `:credentials` are not configured directly, the following + # locations will be searched for credentials: + # + # * `Aws.config[:credentials]` + # * The `:access_key_id`, `:secret_access_key`, and `:session_token` options. + # * ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY'] + # * `~/.aws/credentials` + # * `~/.aws/config` + # * EC2/ECS IMDS instance profile - When used by default, the timeouts + # are very aggressive. Construct and pass an instance of + # `Aws::InstanceProfileCredentails` or `Aws::ECSCredentials` to + # enable retries and extended timeouts. + # + # @option options [required, String] :region + # The AWS region to connect to. The configured `:region` is + # used to determine the service `:endpoint`. When not passed, + # a default `:region` is searched for in the following locations: + # + # * `Aws.config[:region]` + # * `ENV['AWS_REGION']` + # * `ENV['AMAZON_REGION']` + # * `ENV['AWS_DEFAULT_REGION']` + # * `~/.aws/credentials` + # * `~/.aws/config` + # + # @option options [String] :access_key_id + # + # @option options [Boolean] :active_endpoint_cache (false) + # When set to `true`, a thread polling for endpoints will be running in + # the background every 60 secs (default). Defaults to `false`. + # + # @option options [Boolean] :adaptive_retry_wait_to_fill (true) + # Used only in `adaptive` retry mode. When true, the request will sleep + # until there is sufficent client side capacity to retry the request. + # When false, the request will raise a `RetryCapacityNotAvailableError` and will + # not retry instead of sleeping. + # + # @option options [Boolean] :client_side_monitoring (false) + # When `true`, client-side metrics will be collected for all API requests from + # this client. + # + # @option options [String] :client_side_monitoring_client_id ("") + # Allows you to provide an identifier for this client which will be attached to + # all generated client side metrics. Defaults to an empty string. + # + # @option options [String] :client_side_monitoring_host ("127.0.0.1") + # Allows you to specify the DNS hostname or IPv4 or IPv6 address that the client + # side monitoring agent is running on, where client metrics will be published via UDP. + # + # @option options [Integer] :client_side_monitoring_port (31000) + # Required for publishing client metrics. The port that the client side monitoring + # agent is running on, where client metrics will be published via UDP. + # + # @option options [Aws::ClientSideMonitoring::Publisher] :client_side_monitoring_publisher (Aws::ClientSideMonitoring::Publisher) + # Allows you to provide a custom client-side monitoring publisher class. By default, + # will use the Client Side Monitoring Agent Publisher. + # + # @option options [Boolean] :convert_params (true) + # When `true`, an attempt is made to coerce request parameters into + # the required types. + # + # @option options [Boolean] :correct_clock_skew (true) + # Used only in `standard` and adaptive retry modes. Specifies whether to apply + # a clock skew correction and retry requests with skewed client clocks. + # + # @option options [Boolean] :disable_host_prefix_injection (false) + # Set to true to disable SDK automatically adding host prefix + # to default service endpoint when available. + # + # @option options [String] :endpoint + # The client endpoint is normally constructed from the `:region` + # option. You should only configure an `:endpoint` when connecting + # to test or custom endpoints. This should be a valid HTTP(S) URI. + # + # @option options [Integer] :endpoint_cache_max_entries (1000) + # Used for the maximum size limit of the LRU cache storing endpoints data + # for endpoint discovery enabled operations. Defaults to 1000. + # + # @option options [Integer] :endpoint_cache_max_threads (10) + # Used for the maximum threads in use for polling endpoints to be cached, defaults to 10. + # + # @option options [Integer] :endpoint_cache_poll_interval (60) + # When :endpoint_discovery and :active_endpoint_cache is enabled, + # Use this option to config the time interval in seconds for making + # requests fetching endpoints information. Defaults to 60 sec. + # + # @option options [Boolean] :endpoint_discovery (false) + # When set to `true`, endpoint discovery will be enabled for operations when available. + # + # @option options [Aws::Log::Formatter] :log_formatter (Aws::Log::Formatter.default) + # The log formatter. + # + # @option options [Symbol] :log_level (:info) + # The log level to send messages to the `:logger` at. + # + # @option options [Logger] :logger + # The Logger instance to send log messages to. If this option + # is not set, logging will be disabled. + # + # @option options [Integer] :max_attempts (3) + # An integer representing the maximum number attempts that will be made for + # a single request, including the initial attempt. For example, + # setting this value to 5 will result in a request being retried up to + # 4 times. Used in `standard` and `adaptive` retry modes. + # + # @option options [String] :profile ("default") + # Used when loading credentials from the shared credentials file + # at HOME/.aws/credentials. When not specified, 'default' is used. + # + # @option options [Proc] :retry_backoff + # A proc or lambda used for backoff. Defaults to 2**retries * retry_base_delay. + # This option is only used in the `legacy` retry mode. + # + # @option options [Float] :retry_base_delay (0.3) + # The base delay in seconds used by the default backoff function. This option + # is only used in the `legacy` retry mode. + # + # @option options [Symbol] :retry_jitter (:none) + # A delay randomiser function used by the default backoff function. + # Some predefined functions can be referenced by name - :none, :equal, :full, + # otherwise a Proc that takes and returns a number. This option is only used + # in the `legacy` retry mode. + # + # @see https://www.awsarchitectureblog.com/2015/03/backoff.html + # + # @option options [Integer] :retry_limit (3) + # The maximum number of times to retry failed requests. Only + # ~ 500 level server errors and certain ~ 400 level client errors + # are retried. Generally, these are throttling errors, data + # checksum errors, networking errors, timeout errors, auth errors, + # endpoint discovery, and errors from expired credentials. + # This option is only used in the `legacy` retry mode. + # + # @option options [Integer] :retry_max_delay (0) + # The maximum number of seconds to delay between retries (0 for no limit) + # used by the default backoff function. This option is only used in the + # `legacy` retry mode. + # + # @option options [String] :retry_mode ("legacy") + # Specifies which retry algorithm to use. Values are: + # + # * `legacy` - The pre-existing retry behavior. This is default value if + # no retry mode is provided. + # + # * `standard` - A standardized set of retry rules across the AWS SDKs. + # This includes support for retry quotas, which limit the number of + # unsuccessful retries a client can make. + # + # * `adaptive` - An experimental retry mode that includes all the + # functionality of `standard` mode along with automatic client side + # throttling. This is a provisional mode that may change behavior + # in the future. + # + # + # @option options [String] :secret_access_key + # + # @option options [String] :session_token + # + # @option options [Boolean] :simple_json (false) + # Disables request parameter conversion, validation, and formatting. + # Also disable response data type conversions. This option is useful + # when you want to ensure the highest level of performance by + # avoiding overhead of walking request parameters and response data + # structures. + # + # When `:simple_json` is enabled, the request parameters hash must + # be formatted exactly as the DynamoDB API expects. + # + # @option options [Boolean] :stub_responses (false) + # Causes the client to return stubbed responses. By default + # fake responses are generated and returned. You can specify + # the response data to return or errors to raise by calling + # {ClientStubs#stub_responses}. See {ClientStubs} for more information. + # + # ** Please note ** When response stubbing is enabled, no HTTP + # requests are made, and retries are disabled. + # + # @option options [Boolean] :validate_params (true) + # When `true`, request parameters are validated before + # sending the request. + # + # @option options [URI::HTTP,String] :http_proxy A proxy to send + # requests through. Formatted like 'http://proxy.com:123'. + # + # @option options [Float] :http_open_timeout (15) The number of + # seconds to wait when opening a HTTP session before raising a + # `Timeout::Error`. + # + # @option options [Integer] :http_read_timeout (60) The default + # number of seconds to wait for response data. This value can + # safely be set per-request on the session. + # + # @option options [Float] :http_idle_timeout (5) The number of + # seconds a connection is allowed to sit idle before it is + # considered stale. Stale connections are closed and removed + # from the pool before making a request. + # + # @option options [Float] :http_continue_timeout (1) The number of + # seconds to wait for a 100-continue response before sending the + # request body. This option has no effect unless the request has + # "Expect" header set to "100-continue". Defaults to `nil` which + # disables this behaviour. This value can safely be set per + # request on the session. + # + # @option options [Boolean] :http_wire_trace (false) When `true`, + # HTTP debug output will be sent to the `:logger`. + # + # @option options [Boolean] :ssl_verify_peer (true) When `true`, + # SSL peer certificates are verified when establishing a + # connection. + # + # @option options [String] :ssl_ca_bundle Full path to the SSL + # certificate authority bundle file that should be used when + # verifying peer certificates. If you do not pass + # `:ssl_ca_bundle` or `:ssl_ca_directory` the the system default + # will be used if available. + # + # @option options [String] :ssl_ca_directory Full path of the + # directory that contains the unbundled SSL certificate + # authority files for verifying peer certificates. If you do + # not pass `:ssl_ca_bundle` or `:ssl_ca_directory` the the + # system default will be used if available. + # + def initialize(*args) + super + end + + # @!group API Operations + + # Retrieve the deployment specification for the deployment and host, + # consisting of the client metadata provided when the deployment was + # created. The generic client metadata will be provided, as well as the + # client metadata for the host's variant (if variant-specific metadata + # was provided). Throws DeploymentNotFoundException if the + # DeploymentExecutionId does not identify a current deployment. Throws + # HostNotFoundException if the host is not recognized by the deployment + # engine. Throws ServerException for failures caused by the deployment + # system or its dependencies. + # + # @option params [required, String] :deployment_execution_id + # + # @option params [required, String] :host_identifier + # An identifier for referring to a unit of capacity. + # + # @return [Types::GetDeploymentSpecificationOutput] Returns a {Seahorse::Client::Response response} object which responds to the following methods: + # + # * {Types::GetDeploymentSpecificationOutput#deployment_system #deployment_system} => String + # * {Types::GetDeploymentSpecificationOutput#deployment_specification #deployment_specification} => Types::DeploymentSpecification + # + # @example Request syntax with placeholder values + # + # resp = client.get_deployment_specification({ + # deployment_execution_id: "DeploymentExecutionId", # required + # host_identifier: "HostIdentifier", # required + # }) + # + # @example Response structure + # + # resp.deployment_system #=> String + # resp.deployment_specification.generic_envelope.format #=> String + # resp.deployment_specification.generic_envelope.payload #=> String + # resp.deployment_specification.variant_id #=> String + # resp.deployment_specification.variant_envelope.format #=> String + # resp.deployment_specification.variant_envelope.payload #=> String + # + # @overload get_deployment_specification(params = {}) + # @param [Hash] params ({}) + def get_deployment_specification(params = {}, options = {}) + req = build_request(:get_deployment_specification, params) + req.send_request(options) + end + + # This requests a command from the deployment workflow engine. If no + # command is ready to be dispatched, the output will be empty + # (HostCommand will be null). Throws HostNotFoundException if the host + # is not recognized by the deployment engine. Throws ServerException for + # failures caused by the deployment system or its dependencies. + # + # @option params [required, String] :host_identifier + # An identifier for referring to a unit of capacity. + # + # @return [Types::PollHostCommandOutput] Returns a {Seahorse::Client::Response response} object which responds to the following methods: + # + # * {Types::PollHostCommandOutput#host_command #host_command} => Types::HostCommandInstance + # + # @example Request syntax with placeholder values + # + # resp = client.poll_host_command({ + # host_identifier: "HostIdentifier", # required + # }) + # + # @example Response structure + # + # resp.host_command.host_command_identifier #=> String + # resp.host_command.host_identifier #=> String + # resp.host_command.deployment_execution_id #=> String + # resp.host_command.command_name #=> String + # resp.host_command.nonce #=> Integer + # + # @overload poll_host_command(params = {}) + # @param [Hash] params ({}) + def poll_host_command(params = {}, options = {}) + req = build_request(:poll_host_command, params) + req.send_request(options) + end + + # This updates the central workflow engine with the current progress of + # the host command. This will also return the status of the host command + # centrally if possible, so agents can skip processing the command if it + # has been aborted / timed out. However, the status is optional, so if + # no status is returned the agent should treat it as if it was ok to + # continue. Throws ClientException for an invalid HostCommandIdentifier + # or Diagnostics. Throws ServerException for failures caused by the + # deployment system or its dependencies. + # + # @option params [required, String] :host_command_identifier + # + # @option params [Time,DateTime,Date,Integer,String] :estimated_completion_time + # + # @option params [Types::Envelope] :diagnostics + # For an Envelope used for host command diagnostics, Format is limited + # to 64 characters and Payload is limited to 8192 characters. + # + # @return [Types::PostHostCommandUpdateOutput] Returns a {Seahorse::Client::Response response} object which responds to the following methods: + # + # * {Types::PostHostCommandUpdateOutput#command_status #command_status} => String + # + # @example Request syntax with placeholder values + # + # resp = client.post_host_command_update({ + # host_command_identifier: "HostCommandIdentifier", # required + # estimated_completion_time: Time.now, + # diagnostics: { + # format: "Format", + # payload: "Payload", + # }, + # }) + # + # @example Response structure + # + # resp.command_status #=> String, one of "Pending", "InProgress", "Succeeded", "Failed" + # + # @overload post_host_command_update(params = {}) + # @param [Hash] params ({}) + def post_host_command_update(params = {}, options = {}) + req = build_request(:post_host_command_update, params) + req.send_request(options) + end + + # This notifies the central workflow engine that the agent has received + # the specified command and is ready to start execution. This will also + # return the status of the host command centrally if possible, so agents + # can skip processing the command if it has been aborted / timed out. + # However, the status is optional, so if no status is returned the agent + # should treat it as if it was ok to continue. Throws ClientException + # for an invalid HostCommandIdentifier or Diagnostics. Throws + # ServerException for failures caused by the deployment system or its + # dependencies. + # + # @option params [required, String] :host_command_identifier + # + # @option params [Types::Envelope] :diagnostics + # For an Envelope used for host command diagnostics, Format is limited + # to 64 characters and Payload is limited to 8192 characters. + # + # @return [Types::PutHostCommandAcknowledgementOutput] Returns a {Seahorse::Client::Response response} object which responds to the following methods: + # + # * {Types::PutHostCommandAcknowledgementOutput#command_status #command_status} => String + # + # @example Request syntax with placeholder values + # + # resp = client.put_host_command_acknowledgement({ + # host_command_identifier: "HostCommandIdentifier", # required + # diagnostics: { + # format: "Format", + # payload: "Payload", + # }, + # }) + # + # @example Response structure + # + # resp.command_status #=> String, one of "Pending", "InProgress", "Succeeded", "Failed" + # + # @overload put_host_command_acknowledgement(params = {}) + # @param [Hash] params ({}) + def put_host_command_acknowledgement(params = {}, options = {}) + req = build_request(:put_host_command_acknowledgement, params) + req.send_request(options) + end + + # This reports completion of the command back to the workflow engine. + # Throws ClientException for an invalid HostCommandIdentifier or + # Diagnostics. Throws ServerException for failures caused by the + # deployment system or its dependencies. + # + # @option params [required, String] :host_command_identifier + # + # @option params [required, String] :command_status + # + # @option params [Types::Envelope] :diagnostics + # For an Envelope used for host command diagnostics, Format is limited + # to 64 characters and Payload is limited to 8192 characters. + # + # @return [Struct] Returns an empty {Seahorse::Client::Response response}. + # + # @example Request syntax with placeholder values + # + # resp = client.put_host_command_complete({ + # host_command_identifier: "HostCommandIdentifier", # required + # command_status: "Pending", # required, accepts Pending, InProgress, Succeeded, Failed + # diagnostics: { + # format: "Format", + # payload: "Payload", + # }, + # }) + # + # @overload put_host_command_complete(params = {}) + # @param [Hash] params ({}) + def put_host_command_complete(params = {}, options = {}) + req = build_request(:put_host_command_complete, params) + req.send_request(options) + end + + # @!endgroup + + # @param params ({}) + # @api private + def build_request(operation_name, params = {}) + handlers = @handlers.for(operation_name) + context = Seahorse::Client::RequestContext.new( + operation_name: operation_name, + operation: config.api.operation(operation_name), + client: self, + params: params, + config: config) + context[:gem_name] = 'aws-sdk-codedeploycommand' + context[:gem_version] = '1.0.0' + Seahorse::Client::Request.new(handlers, context) + end + + # @api private + # @deprecated + def waiter_names + [] + end + + class << self + + # @api private + attr_reader :identifier + + # @api private + def errors_module + Errors + end + + end + end +end + +# frozen_string_literal: true + +# WARNING ABOUT GENERATED CODE +# +# This file is generated. See the contributing guide for more information: +# https://github.com/aws/aws-sdk-ruby/blob/version-3/CONTRIBUTING.md +# +# WARNING ABOUT GENERATED CODE + +module Aws::CodeDeployCommand + + # When CodeDeployCommand returns an error response, the Ruby SDK constructs and raises an error. + # These errors all extend Aws::CodeDeployCommand::Errors::ServiceError < {Aws::Errors::ServiceError} + # + # You can rescue all CodeDeployCommand errors using ServiceError: + # + # begin + # # do stuff + # rescue Aws::CodeDeployCommand::Errors::ServiceError + # # rescues all CodeDeployCommand API errors + # end + # + # + # ## Request Context + # ServiceError objects have a {Aws::Errors::ServiceError#context #context} method that returns + # information about the request that generated the error. + # See {Seahorse::Client::RequestContext} for more information. + # + # ## Error Classes + # * {ClientException} + # * {ServerException} + # + # Additionally, error classes are dynamically generated for service errors based on the error code + # if they are not defined above. + module Errors + + extend Aws::Errors::DynamicErrors + + class ClientException < ServiceError + + # @param [Seahorse::Client::RequestContext] context + # @param [String] message + # @param [Aws::CodeDeployCommand::Types::ClientException] data + def initialize(context, message, data = Aws::EmptyStructure.new) + super(context, message, data) + end + end + + class ServerException < ServiceError + + # @param [Seahorse::Client::RequestContext] context + # @param [String] message + # @param [Aws::CodeDeployCommand::Types::ServerException] data + def initialize(context, message, data = Aws::EmptyStructure.new) + super(context, message, data) + end + end + + end +end + +# frozen_string_literal: true + +# WARNING ABOUT GENERATED CODE +# +# This file is generated. See the contributing guide for more information: +# https://github.com/aws/aws-sdk-ruby/blob/version-3/CONTRIBUTING.md +# +# WARNING ABOUT GENERATED CODE + +module Aws::CodeDeployCommand + + class Resource + + # @param options ({}) + # @option options [Client] :client + def initialize(options = {}) + @client = options[:client] || Client.new(options) + end + + # @return [Client] + def client + @client + end + + end +end diff --git a/vendor/gems/codedeploy-commands-1.0.0/sdks/codedeploy_commands_secure_sdk.rb b/vendor/gems/codedeploy-commands-1.0.0/sdks/codedeploy_commands_secure_sdk.rb new file mode 100644 index 00000000..a47ad317 --- /dev/null +++ b/vendor/gems/codedeploy-commands-1.0.0/sdks/codedeploy_commands_secure_sdk.rb @@ -0,0 +1,1099 @@ +require 'aws-sdk-core' +# frozen_string_literal: true + +# WARNING ABOUT GENERATED CODE +# +# This file is generated. See the contributing guide for more information: +# https://github.com/aws/aws-sdk-ruby/blob/version-3/CONTRIBUTING.md +# +# WARNING ABOUT GENERATED CODE + +module Aws::CodeDeployCommand + module Types + + # This exception indicates that the request failed due to the fault of + # the customer (either an invalid request was provided, referred to a + # non-existant object, or another reason within the client's control). + # + class ClientException < Aws::EmptyStructure; end + + # The DeploymentSpecification contains an envelope for the generic + # client metadata, and if there is variant-specific metadata, the ID of + # the variant for the host and the envelope containing that variant's + # metadata. All fields are optional, though an empty + # DeploymentSpecification is likely indicative of an error. + # + # @!attribute [rw] generic_envelope + # For an Envelope used for host command diagnostics, Format is limited + # to 64 characters and Payload is limited to 8192 characters. + # @return [Types::Envelope] + # + # @!attribute [rw] variant_id + # @return [String] + # + # @!attribute [rw] variant_envelope + # For an Envelope used for host command diagnostics, Format is limited + # to 64 characters and Payload is limited to 8192 characters. + # @return [Types::Envelope] + # + class DeploymentSpecification < Struct.new( + :generic_envelope, + :variant_id, + :variant_envelope) + SENSITIVE = [] + include Aws::Structure + end + + # For an Envelope used for host command diagnostics, Format is limited + # to 64 characters and Payload is limited to 8192 characters. + # + # @note When making an API call, you may pass Envelope + # data as a hash: + # + # { + # format: "Format", + # payload: "Payload", + # } + # + # @!attribute [rw] format + # @return [String] + # + # @!attribute [rw] payload + # @return [String] + # + class Envelope < Struct.new( + :format, + :payload) + SENSITIVE = [] + include Aws::Structure + end + + # @note When making an API call, you may pass GetDeploymentSpecificationInput + # data as a hash: + # + # { + # deployment_execution_id: "DeploymentExecutionId", # required + # host_identifier: "HostIdentifier", # required + # } + # + # @!attribute [rw] deployment_execution_id + # @return [String] + # + # @!attribute [rw] host_identifier + # An identifier for referring to a unit of capacity. + # @return [String] + # + class GetDeploymentSpecificationInput < Struct.new( + :deployment_execution_id, + :host_identifier) + SENSITIVE = [] + include Aws::Structure + end + + # @!attribute [rw] deployment_system + # @return [String] + # + # @!attribute [rw] deployment_specification + # The DeploymentSpecification contains an envelope for the generic + # client metadata, and if there is variant-specific metadata, the ID + # of the variant for the host and the envelope containing that + # variant's metadata. All fields are optional, though an empty + # DeploymentSpecification is likely indicative of an error. + # @return [Types::DeploymentSpecification] + # + class GetDeploymentSpecificationOutput < Struct.new( + :deployment_system, + :deployment_specification) + SENSITIVE = [] + include Aws::Structure + end + + # @!attribute [rw] host_command_identifier + # @return [String] + # + # @!attribute [rw] host_identifier + # An identifier for referring to a unit of capacity. + # @return [String] + # + # @!attribute [rw] deployment_execution_id + # @return [String] + # + # @!attribute [rw] command_name + # @return [String] + # + # @!attribute [rw] nonce + # @return [Integer] + # + class HostCommandInstance < Struct.new( + :host_command_identifier, + :host_identifier, + :deployment_execution_id, + :command_name, + :nonce) + SENSITIVE = [] + include Aws::Structure + end + + # @note When making an API call, you may pass PollHostCommandInput + # data as a hash: + # + # { + # host_identifier: "HostIdentifier", # required + # } + # + # @!attribute [rw] host_identifier + # An identifier for referring to a unit of capacity. + # @return [String] + # + class PollHostCommandInput < Struct.new( + :host_identifier) + SENSITIVE = [] + include Aws::Structure + end + + # @!attribute [rw] host_command + # @return [Types::HostCommandInstance] + # + class PollHostCommandOutput < Struct.new( + :host_command) + SENSITIVE = [] + include Aws::Structure + end + + # @note When making an API call, you may pass PostHostCommandUpdateInput + # data as a hash: + # + # { + # host_command_identifier: "HostCommandIdentifier", # required + # estimated_completion_time: Time.now, + # diagnostics: { + # format: "Format", + # payload: "Payload", + # }, + # } + # + # @!attribute [rw] host_command_identifier + # @return [String] + # + # @!attribute [rw] estimated_completion_time + # @return [Time] + # + # @!attribute [rw] diagnostics + # For an Envelope used for host command diagnostics, Format is limited + # to 64 characters and Payload is limited to 8192 characters. + # @return [Types::Envelope] + # + class PostHostCommandUpdateInput < Struct.new( + :host_command_identifier, + :estimated_completion_time, + :diagnostics) + SENSITIVE = [] + include Aws::Structure + end + + # @!attribute [rw] command_status + # @return [String] + # + class PostHostCommandUpdateOutput < Struct.new( + :command_status) + SENSITIVE = [] + include Aws::Structure + end + + # @note When making an API call, you may pass PutHostCommandAcknowledgementInput + # data as a hash: + # + # { + # host_command_identifier: "HostCommandIdentifier", # required + # diagnostics: { + # format: "Format", + # payload: "Payload", + # }, + # } + # + # @!attribute [rw] host_command_identifier + # @return [String] + # + # @!attribute [rw] diagnostics + # For an Envelope used for host command diagnostics, Format is limited + # to 64 characters and Payload is limited to 8192 characters. + # @return [Types::Envelope] + # + class PutHostCommandAcknowledgementInput < Struct.new( + :host_command_identifier, + :diagnostics) + SENSITIVE = [] + include Aws::Structure + end + + # @!attribute [rw] command_status + # @return [String] + # + class PutHostCommandAcknowledgementOutput < Struct.new( + :command_status) + SENSITIVE = [] + include Aws::Structure + end + + # @note When making an API call, you may pass PutHostCommandCompleteInput + # data as a hash: + # + # { + # host_command_identifier: "HostCommandIdentifier", # required + # command_status: "Pending", # required, accepts Pending, InProgress, Succeeded, Failed + # diagnostics: { + # format: "Format", + # payload: "Payload", + # }, + # } + # + # @!attribute [rw] host_command_identifier + # @return [String] + # + # @!attribute [rw] command_status + # @return [String] + # + # @!attribute [rw] diagnostics + # For an Envelope used for host command diagnostics, Format is limited + # to 64 characters and Payload is limited to 8192 characters. + # @return [Types::Envelope] + # + class PutHostCommandCompleteInput < Struct.new( + :host_command_identifier, + :command_status, + :diagnostics) + SENSITIVE = [] + include Aws::Structure + end + + # This exception indicates that the request failed due to a problem on + # the server, or with the server's dependencies. + # + class ServerException < Aws::EmptyStructure; end + + end +end + +# frozen_string_literal: true + +# WARNING ABOUT GENERATED CODE +# +# This file is generated. See the contributing guide for more information: +# https://github.com/aws/aws-sdk-ruby/blob/version-3/CONTRIBUTING.md +# +# WARNING ABOUT GENERATED CODE + +module Aws::CodeDeployCommand + # @api private + module ClientApi + + include Seahorse::Model + + ClientException = Shapes::StructureShape.new(name: 'ClientException') + DeploymentCommandName = Shapes::StringShape.new(name: 'DeploymentCommandName') + DeploymentCommandStatus = Shapes::StringShape.new(name: 'DeploymentCommandStatus') + DeploymentExecutionId = Shapes::StringShape.new(name: 'DeploymentExecutionId') + DeploymentSpecification = Shapes::StructureShape.new(name: 'DeploymentSpecification') + Envelope = Shapes::StructureShape.new(name: 'Envelope') + Format = Shapes::StringShape.new(name: 'Format') + GenericDateTimestamp = Shapes::TimestampShape.new(name: 'GenericDateTimestamp') + GenericLong = Shapes::IntegerShape.new(name: 'GenericLong') + GenericString = Shapes::StringShape.new(name: 'GenericString') + GetDeploymentSpecificationInput = Shapes::StructureShape.new(name: 'GetDeploymentSpecificationInput') + GetDeploymentSpecificationOutput = Shapes::StructureShape.new(name: 'GetDeploymentSpecificationOutput') + HostCommandIdentifier = Shapes::StringShape.new(name: 'HostCommandIdentifier') + HostCommandInstance = Shapes::StructureShape.new(name: 'HostCommandInstance') + HostIdentifier = Shapes::StringShape.new(name: 'HostIdentifier') + Payload = Shapes::StringShape.new(name: 'Payload') + PollHostCommandInput = Shapes::StructureShape.new(name: 'PollHostCommandInput') + PollHostCommandOutput = Shapes::StructureShape.new(name: 'PollHostCommandOutput') + PostHostCommandUpdateInput = Shapes::StructureShape.new(name: 'PostHostCommandUpdateInput') + PostHostCommandUpdateOutput = Shapes::StructureShape.new(name: 'PostHostCommandUpdateOutput') + PutHostCommandAcknowledgementInput = Shapes::StructureShape.new(name: 'PutHostCommandAcknowledgementInput') + PutHostCommandAcknowledgementOutput = Shapes::StructureShape.new(name: 'PutHostCommandAcknowledgementOutput') + PutHostCommandCompleteInput = Shapes::StructureShape.new(name: 'PutHostCommandCompleteInput') + ServerException = Shapes::StructureShape.new(name: 'ServerException') + VariantId = Shapes::StringShape.new(name: 'VariantId') + + ClientException.struct_class = Types::ClientException + + DeploymentSpecification.add_member(:generic_envelope, Shapes::ShapeRef.new(shape: Envelope, location_name: "GenericEnvelope")) + DeploymentSpecification.add_member(:variant_id, Shapes::ShapeRef.new(shape: VariantId, location_name: "VariantId")) + DeploymentSpecification.add_member(:variant_envelope, Shapes::ShapeRef.new(shape: Envelope, location_name: "VariantEnvelope")) + DeploymentSpecification.struct_class = Types::DeploymentSpecification + + Envelope.add_member(:format, Shapes::ShapeRef.new(shape: Format, location_name: "Format")) + Envelope.add_member(:payload, Shapes::ShapeRef.new(shape: Payload, location_name: "Payload")) + Envelope.struct_class = Types::Envelope + + GetDeploymentSpecificationInput.add_member(:deployment_execution_id, Shapes::ShapeRef.new(shape: DeploymentExecutionId, required: true, location_name: "DeploymentExecutionId")) + GetDeploymentSpecificationInput.add_member(:host_identifier, Shapes::ShapeRef.new(shape: HostIdentifier, required: true, location_name: "HostIdentifier")) + GetDeploymentSpecificationInput.struct_class = Types::GetDeploymentSpecificationInput + + GetDeploymentSpecificationOutput.add_member(:deployment_system, Shapes::ShapeRef.new(shape: GenericString, location_name: "DeploymentSystem")) + GetDeploymentSpecificationOutput.add_member(:deployment_specification, Shapes::ShapeRef.new(shape: DeploymentSpecification, location_name: "DeploymentSpecification")) + GetDeploymentSpecificationOutput.struct_class = Types::GetDeploymentSpecificationOutput + + HostCommandInstance.add_member(:host_command_identifier, Shapes::ShapeRef.new(shape: HostCommandIdentifier, location_name: "HostCommandIdentifier")) + HostCommandInstance.add_member(:host_identifier, Shapes::ShapeRef.new(shape: HostIdentifier, location_name: "HostIdentifier")) + HostCommandInstance.add_member(:deployment_execution_id, Shapes::ShapeRef.new(shape: DeploymentExecutionId, location_name: "DeploymentExecutionId")) + HostCommandInstance.add_member(:command_name, Shapes::ShapeRef.new(shape: DeploymentCommandName, location_name: "CommandName")) + HostCommandInstance.add_member(:nonce, Shapes::ShapeRef.new(shape: GenericLong, location_name: "Nonce")) + HostCommandInstance.struct_class = Types::HostCommandInstance + + PollHostCommandInput.add_member(:host_identifier, Shapes::ShapeRef.new(shape: HostIdentifier, required: true, location_name: "HostIdentifier")) + PollHostCommandInput.struct_class = Types::PollHostCommandInput + + PollHostCommandOutput.add_member(:host_command, Shapes::ShapeRef.new(shape: HostCommandInstance, location_name: "HostCommand")) + PollHostCommandOutput.struct_class = Types::PollHostCommandOutput + + PostHostCommandUpdateInput.add_member(:host_command_identifier, Shapes::ShapeRef.new(shape: HostCommandIdentifier, required: true, location_name: "HostCommandIdentifier")) + PostHostCommandUpdateInput.add_member(:estimated_completion_time, Shapes::ShapeRef.new(shape: GenericDateTimestamp, location_name: "EstimatedCompletionTime")) + PostHostCommandUpdateInput.add_member(:diagnostics, Shapes::ShapeRef.new(shape: Envelope, location_name: "Diagnostics")) + PostHostCommandUpdateInput.struct_class = Types::PostHostCommandUpdateInput + + PostHostCommandUpdateOutput.add_member(:command_status, Shapes::ShapeRef.new(shape: DeploymentCommandStatus, location_name: "CommandStatus")) + PostHostCommandUpdateOutput.struct_class = Types::PostHostCommandUpdateOutput + + PutHostCommandAcknowledgementInput.add_member(:host_command_identifier, Shapes::ShapeRef.new(shape: HostCommandIdentifier, required: true, location_name: "HostCommandIdentifier")) + PutHostCommandAcknowledgementInput.add_member(:diagnostics, Shapes::ShapeRef.new(shape: Envelope, location_name: "Diagnostics")) + PutHostCommandAcknowledgementInput.struct_class = Types::PutHostCommandAcknowledgementInput + + PutHostCommandAcknowledgementOutput.add_member(:command_status, Shapes::ShapeRef.new(shape: DeploymentCommandStatus, location_name: "CommandStatus")) + PutHostCommandAcknowledgementOutput.struct_class = Types::PutHostCommandAcknowledgementOutput + + PutHostCommandCompleteInput.add_member(:host_command_identifier, Shapes::ShapeRef.new(shape: HostCommandIdentifier, required: true, location_name: "HostCommandIdentifier")) + PutHostCommandCompleteInput.add_member(:command_status, Shapes::ShapeRef.new(shape: DeploymentCommandStatus, required: true, location_name: "CommandStatus")) + PutHostCommandCompleteInput.add_member(:diagnostics, Shapes::ShapeRef.new(shape: Envelope, location_name: "Diagnostics")) + PutHostCommandCompleteInput.struct_class = Types::PutHostCommandCompleteInput + + ServerException.struct_class = Types::ServerException + + + # @api private + API = Seahorse::Model::Api.new.tap do |api| + + api.version = "2019-11-11" + + api.metadata = { + "apiVersion" => "2019-11-11", + "endpointPrefix" => "codedeploy-commands-secure", + "jsonVersion" => "1.1", + "protocol" => "json", + "serviceAbbreviation" => "CodeDeployCommandSecure", + "serviceFullName" => "AWS CodeDeploy Command Service", + "signatureVersion" => "v4", + "targetPrefix" => "CodeDeployCommandService", + } + + api.add_operation(:get_deployment_specification, Seahorse::Model::Operation.new.tap do |o| + o.name = "GetDeploymentSpecification" + o.http_method = "POST" + o.http_request_uri = "/" + o.input = Shapes::ShapeRef.new(shape: GetDeploymentSpecificationInput) + o.output = Shapes::ShapeRef.new(shape: GetDeploymentSpecificationOutput) + o.errors << Shapes::ShapeRef.new(shape: ClientException) + o.errors << Shapes::ShapeRef.new(shape: ServerException) + end) + + api.add_operation(:poll_host_command, Seahorse::Model::Operation.new.tap do |o| + o.name = "PollHostCommand" + o.http_method = "POST" + o.http_request_uri = "/" + o.input = Shapes::ShapeRef.new(shape: PollHostCommandInput) + o.output = Shapes::ShapeRef.new(shape: PollHostCommandOutput) + o.errors << Shapes::ShapeRef.new(shape: ClientException) + o.errors << Shapes::ShapeRef.new(shape: ServerException) + end) + + api.add_operation(:post_host_command_update, Seahorse::Model::Operation.new.tap do |o| + o.name = "PostHostCommandUpdate" + o.http_method = "POST" + o.http_request_uri = "/" + o.input = Shapes::ShapeRef.new(shape: PostHostCommandUpdateInput) + o.output = Shapes::ShapeRef.new(shape: PostHostCommandUpdateOutput) + o.errors << Shapes::ShapeRef.new(shape: ClientException) + o.errors << Shapes::ShapeRef.new(shape: ServerException) + end) + + api.add_operation(:put_host_command_acknowledgement, Seahorse::Model::Operation.new.tap do |o| + o.name = "PutHostCommandAcknowledgement" + o.http_method = "POST" + o.http_request_uri = "/" + o.input = Shapes::ShapeRef.new(shape: PutHostCommandAcknowledgementInput) + o.output = Shapes::ShapeRef.new(shape: PutHostCommandAcknowledgementOutput) + o.errors << Shapes::ShapeRef.new(shape: ClientException) + o.errors << Shapes::ShapeRef.new(shape: ServerException) + end) + + api.add_operation(:put_host_command_complete, Seahorse::Model::Operation.new.tap do |o| + o.name = "PutHostCommandComplete" + o.http_method = "POST" + o.http_request_uri = "/" + o.input = Shapes::ShapeRef.new(shape: PutHostCommandCompleteInput) + o.output = Shapes::ShapeRef.new(shape: Shapes::StructureShape.new(struct_class: Aws::EmptyStructure)) + o.errors << Shapes::ShapeRef.new(shape: ClientException) + o.errors << Shapes::ShapeRef.new(shape: ServerException) + end) + end + + end +end + +# frozen_string_literal: true + +# WARNING ABOUT GENERATED CODE +# +# This file is generated. See the contributing guide for more information: +# https://github.com/aws/aws-sdk-ruby/blob/version-3/CONTRIBUTING.md +# +# WARNING ABOUT GENERATED CODE + +require 'seahorse/client/plugins/content_length.rb' +require 'aws-sdk-core/plugins/credentials_configuration.rb' +require 'aws-sdk-core/plugins/logging.rb' +require 'aws-sdk-core/plugins/param_converter.rb' +require 'aws-sdk-core/plugins/param_validator.rb' +require 'aws-sdk-core/plugins/user_agent.rb' +require 'aws-sdk-core/plugins/helpful_socket_errors.rb' +require 'aws-sdk-core/plugins/retry_errors.rb' +require 'aws-sdk-core/plugins/global_configuration.rb' +require 'aws-sdk-core/plugins/regional_endpoint.rb' +require 'aws-sdk-core/plugins/endpoint_discovery.rb' +require 'aws-sdk-core/plugins/endpoint_pattern.rb' +require 'aws-sdk-core/plugins/response_paging.rb' +require 'aws-sdk-core/plugins/stub_responses.rb' +require 'aws-sdk-core/plugins/idempotency_token.rb' +require 'aws-sdk-core/plugins/jsonvalue_converter.rb' +require 'aws-sdk-core/plugins/client_metrics_plugin.rb' +require 'aws-sdk-core/plugins/client_metrics_send_plugin.rb' +require 'aws-sdk-core/plugins/transfer_encoding.rb' +require 'aws-sdk-core/plugins/http_checksum.rb' +require 'aws-sdk-core/plugins/signature_v4.rb' +require 'aws-sdk-core/plugins/protocols/json_rpc.rb' + +Aws::Plugins::GlobalConfiguration.add_identifier(:codedeploycommand) + +module Aws::CodeDeployCommand + # An API client for CodeDeployCommand. To construct a client, you need to configure a `:region` and `:credentials`. + # + # client = Aws::CodeDeployCommand::Client.new( + # region: region_name, + # credentials: credentials, + # # ... + # ) + # + # For details on configuring region and credentials see + # the [developer guide](/sdk-for-ruby/v3/developer-guide/setup-config.html). + # + # See {#initialize} for a full list of supported configuration options. + class Client < Seahorse::Client::Base + + include Aws::ClientStubs + + @identifier = :codedeploycommand + + set_api(ClientApi::API) + + add_plugin(Seahorse::Client::Plugins::ContentLength) + add_plugin(Aws::Plugins::CredentialsConfiguration) + add_plugin(Aws::Plugins::Logging) + add_plugin(Aws::Plugins::ParamConverter) + add_plugin(Aws::Plugins::ParamValidator) + add_plugin(Aws::Plugins::UserAgent) + add_plugin(Aws::Plugins::HelpfulSocketErrors) + add_plugin(Aws::Plugins::RetryErrors) + add_plugin(Aws::Plugins::GlobalConfiguration) + add_plugin(Aws::Plugins::RegionalEndpoint) + add_plugin(Aws::Plugins::EndpointDiscovery) + add_plugin(Aws::Plugins::EndpointPattern) + add_plugin(Aws::Plugins::ResponsePaging) + add_plugin(Aws::Plugins::StubResponses) + add_plugin(Aws::Plugins::IdempotencyToken) + add_plugin(Aws::Plugins::JsonvalueConverter) + add_plugin(Aws::Plugins::ClientMetricsPlugin) + add_plugin(Aws::Plugins::ClientMetricsSendPlugin) + add_plugin(Aws::Plugins::TransferEncoding) + add_plugin(Aws::Plugins::HttpChecksum) + add_plugin(Aws::Plugins::SignatureV4) + add_plugin(Aws::Plugins::Protocols::JsonRpc) + + # @overload initialize(options) + # @param [Hash] options + # @option options [required, Aws::CredentialProvider] :credentials + # Your AWS credentials. This can be an instance of any one of the + # following classes: + # + # * `Aws::Credentials` - Used for configuring static, non-refreshing + # credentials. + # + # * `Aws::SharedCredentials` - Used for loading static credentials from a + # shared file, such as `~/.aws/config`. + # + # * `Aws::AssumeRoleCredentials` - Used when you need to assume a role. + # + # * `Aws::AssumeRoleWebIdentityCredentials` - Used when you need to + # assume a role after providing credentials via the web. + # + # * `Aws::SSOCredentials` - Used for loading credentials from AWS SSO using an + # access token generated from `aws login`. + # + # * `Aws::ProcessCredentials` - Used for loading credentials from a + # process that outputs to stdout. + # + # * `Aws::InstanceProfileCredentials` - Used for loading credentials + # from an EC2 IMDS on an EC2 instance. + # + # * `Aws::ECSCredentials` - Used for loading credentials from + # instances running in ECS. + # + # * `Aws::CognitoIdentityCredentials` - Used for loading credentials + # from the Cognito Identity service. + # + # When `:credentials` are not configured directly, the following + # locations will be searched for credentials: + # + # * `Aws.config[:credentials]` + # * The `:access_key_id`, `:secret_access_key`, and `:session_token` options. + # * ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY'] + # * `~/.aws/credentials` + # * `~/.aws/config` + # * EC2/ECS IMDS instance profile - When used by default, the timeouts + # are very aggressive. Construct and pass an instance of + # `Aws::InstanceProfileCredentails` or `Aws::ECSCredentials` to + # enable retries and extended timeouts. + # + # @option options [required, String] :region + # The AWS region to connect to. The configured `:region` is + # used to determine the service `:endpoint`. When not passed, + # a default `:region` is searched for in the following locations: + # + # * `Aws.config[:region]` + # * `ENV['AWS_REGION']` + # * `ENV['AMAZON_REGION']` + # * `ENV['AWS_DEFAULT_REGION']` + # * `~/.aws/credentials` + # * `~/.aws/config` + # + # @option options [String] :access_key_id + # + # @option options [Boolean] :active_endpoint_cache (false) + # When set to `true`, a thread polling for endpoints will be running in + # the background every 60 secs (default). Defaults to `false`. + # + # @option options [Boolean] :adaptive_retry_wait_to_fill (true) + # Used only in `adaptive` retry mode. When true, the request will sleep + # until there is sufficent client side capacity to retry the request. + # When false, the request will raise a `RetryCapacityNotAvailableError` and will + # not retry instead of sleeping. + # + # @option options [Boolean] :client_side_monitoring (false) + # When `true`, client-side metrics will be collected for all API requests from + # this client. + # + # @option options [String] :client_side_monitoring_client_id ("") + # Allows you to provide an identifier for this client which will be attached to + # all generated client side metrics. Defaults to an empty string. + # + # @option options [String] :client_side_monitoring_host ("127.0.0.1") + # Allows you to specify the DNS hostname or IPv4 or IPv6 address that the client + # side monitoring agent is running on, where client metrics will be published via UDP. + # + # @option options [Integer] :client_side_monitoring_port (31000) + # Required for publishing client metrics. The port that the client side monitoring + # agent is running on, where client metrics will be published via UDP. + # + # @option options [Aws::ClientSideMonitoring::Publisher] :client_side_monitoring_publisher (Aws::ClientSideMonitoring::Publisher) + # Allows you to provide a custom client-side monitoring publisher class. By default, + # will use the Client Side Monitoring Agent Publisher. + # + # @option options [Boolean] :convert_params (true) + # When `true`, an attempt is made to coerce request parameters into + # the required types. + # + # @option options [Boolean] :correct_clock_skew (true) + # Used only in `standard` and adaptive retry modes. Specifies whether to apply + # a clock skew correction and retry requests with skewed client clocks. + # + # @option options [Boolean] :disable_host_prefix_injection (false) + # Set to true to disable SDK automatically adding host prefix + # to default service endpoint when available. + # + # @option options [String] :endpoint + # The client endpoint is normally constructed from the `:region` + # option. You should only configure an `:endpoint` when connecting + # to test or custom endpoints. This should be a valid HTTP(S) URI. + # + # @option options [Integer] :endpoint_cache_max_entries (1000) + # Used for the maximum size limit of the LRU cache storing endpoints data + # for endpoint discovery enabled operations. Defaults to 1000. + # + # @option options [Integer] :endpoint_cache_max_threads (10) + # Used for the maximum threads in use for polling endpoints to be cached, defaults to 10. + # + # @option options [Integer] :endpoint_cache_poll_interval (60) + # When :endpoint_discovery and :active_endpoint_cache is enabled, + # Use this option to config the time interval in seconds for making + # requests fetching endpoints information. Defaults to 60 sec. + # + # @option options [Boolean] :endpoint_discovery (false) + # When set to `true`, endpoint discovery will be enabled for operations when available. + # + # @option options [Aws::Log::Formatter] :log_formatter (Aws::Log::Formatter.default) + # The log formatter. + # + # @option options [Symbol] :log_level (:info) + # The log level to send messages to the `:logger` at. + # + # @option options [Logger] :logger + # The Logger instance to send log messages to. If this option + # is not set, logging will be disabled. + # + # @option options [Integer] :max_attempts (3) + # An integer representing the maximum number attempts that will be made for + # a single request, including the initial attempt. For example, + # setting this value to 5 will result in a request being retried up to + # 4 times. Used in `standard` and `adaptive` retry modes. + # + # @option options [String] :profile ("default") + # Used when loading credentials from the shared credentials file + # at HOME/.aws/credentials. When not specified, 'default' is used. + # + # @option options [Proc] :retry_backoff + # A proc or lambda used for backoff. Defaults to 2**retries * retry_base_delay. + # This option is only used in the `legacy` retry mode. + # + # @option options [Float] :retry_base_delay (0.3) + # The base delay in seconds used by the default backoff function. This option + # is only used in the `legacy` retry mode. + # + # @option options [Symbol] :retry_jitter (:none) + # A delay randomiser function used by the default backoff function. + # Some predefined functions can be referenced by name - :none, :equal, :full, + # otherwise a Proc that takes and returns a number. This option is only used + # in the `legacy` retry mode. + # + # @see https://www.awsarchitectureblog.com/2015/03/backoff.html + # + # @option options [Integer] :retry_limit (3) + # The maximum number of times to retry failed requests. Only + # ~ 500 level server errors and certain ~ 400 level client errors + # are retried. Generally, these are throttling errors, data + # checksum errors, networking errors, timeout errors, auth errors, + # endpoint discovery, and errors from expired credentials. + # This option is only used in the `legacy` retry mode. + # + # @option options [Integer] :retry_max_delay (0) + # The maximum number of seconds to delay between retries (0 for no limit) + # used by the default backoff function. This option is only used in the + # `legacy` retry mode. + # + # @option options [String] :retry_mode ("legacy") + # Specifies which retry algorithm to use. Values are: + # + # * `legacy` - The pre-existing retry behavior. This is default value if + # no retry mode is provided. + # + # * `standard` - A standardized set of retry rules across the AWS SDKs. + # This includes support for retry quotas, which limit the number of + # unsuccessful retries a client can make. + # + # * `adaptive` - An experimental retry mode that includes all the + # functionality of `standard` mode along with automatic client side + # throttling. This is a provisional mode that may change behavior + # in the future. + # + # + # @option options [String] :secret_access_key + # + # @option options [String] :session_token + # + # @option options [Boolean] :simple_json (false) + # Disables request parameter conversion, validation, and formatting. + # Also disable response data type conversions. This option is useful + # when you want to ensure the highest level of performance by + # avoiding overhead of walking request parameters and response data + # structures. + # + # When `:simple_json` is enabled, the request parameters hash must + # be formatted exactly as the DynamoDB API expects. + # + # @option options [Boolean] :stub_responses (false) + # Causes the client to return stubbed responses. By default + # fake responses are generated and returned. You can specify + # the response data to return or errors to raise by calling + # {ClientStubs#stub_responses}. See {ClientStubs} for more information. + # + # ** Please note ** When response stubbing is enabled, no HTTP + # requests are made, and retries are disabled. + # + # @option options [Boolean] :validate_params (true) + # When `true`, request parameters are validated before + # sending the request. + # + # @option options [URI::HTTP,String] :http_proxy A proxy to send + # requests through. Formatted like 'http://proxy.com:123'. + # + # @option options [Float] :http_open_timeout (15) The number of + # seconds to wait when opening a HTTP session before raising a + # `Timeout::Error`. + # + # @option options [Integer] :http_read_timeout (60) The default + # number of seconds to wait for response data. This value can + # safely be set per-request on the session. + # + # @option options [Float] :http_idle_timeout (5) The number of + # seconds a connection is allowed to sit idle before it is + # considered stale. Stale connections are closed and removed + # from the pool before making a request. + # + # @option options [Float] :http_continue_timeout (1) The number of + # seconds to wait for a 100-continue response before sending the + # request body. This option has no effect unless the request has + # "Expect" header set to "100-continue". Defaults to `nil` which + # disables this behaviour. This value can safely be set per + # request on the session. + # + # @option options [Boolean] :http_wire_trace (false) When `true`, + # HTTP debug output will be sent to the `:logger`. + # + # @option options [Boolean] :ssl_verify_peer (true) When `true`, + # SSL peer certificates are verified when establishing a + # connection. + # + # @option options [String] :ssl_ca_bundle Full path to the SSL + # certificate authority bundle file that should be used when + # verifying peer certificates. If you do not pass + # `:ssl_ca_bundle` or `:ssl_ca_directory` the the system default + # will be used if available. + # + # @option options [String] :ssl_ca_directory Full path of the + # directory that contains the unbundled SSL certificate + # authority files for verifying peer certificates. If you do + # not pass `:ssl_ca_bundle` or `:ssl_ca_directory` the the + # system default will be used if available. + # + def initialize(*args) + super + end + + # @!group API Operations + + # Retrieve the deployment specification for the deployment and host, + # consisting of the client metadata provided when the deployment was + # created. The generic client metadata will be provided, as well as the + # client metadata for the host's variant (if variant-specific metadata + # was provided). Throws DeploymentNotFoundException if the + # DeploymentExecutionId does not identify a current deployment. Throws + # HostNotFoundException if the host is not recognized by the deployment + # engine. Throws ServerException for failures caused by the deployment + # system or its dependencies. + # + # @option params [required, String] :deployment_execution_id + # + # @option params [required, String] :host_identifier + # An identifier for referring to a unit of capacity. + # + # @return [Types::GetDeploymentSpecificationOutput] Returns a {Seahorse::Client::Response response} object which responds to the following methods: + # + # * {Types::GetDeploymentSpecificationOutput#deployment_system #deployment_system} => String + # * {Types::GetDeploymentSpecificationOutput#deployment_specification #deployment_specification} => Types::DeploymentSpecification + # + # @example Request syntax with placeholder values + # + # resp = client.get_deployment_specification({ + # deployment_execution_id: "DeploymentExecutionId", # required + # host_identifier: "HostIdentifier", # required + # }) + # + # @example Response structure + # + # resp.deployment_system #=> String + # resp.deployment_specification.generic_envelope.format #=> String + # resp.deployment_specification.generic_envelope.payload #=> String + # resp.deployment_specification.variant_id #=> String + # resp.deployment_specification.variant_envelope.format #=> String + # resp.deployment_specification.variant_envelope.payload #=> String + # + # @overload get_deployment_specification(params = {}) + # @param [Hash] params ({}) + def get_deployment_specification(params = {}, options = {}) + req = build_request(:get_deployment_specification, params) + req.send_request(options) + end + + # This requests a command from the deployment workflow engine. If no + # command is ready to be dispatched, the output will be empty + # (HostCommand will be null). Throws HostNotFoundException if the host + # is not recognized by the deployment engine. Throws ServerException for + # failures caused by the deployment system or its dependencies. + # + # @option params [required, String] :host_identifier + # An identifier for referring to a unit of capacity. + # + # @return [Types::PollHostCommandOutput] Returns a {Seahorse::Client::Response response} object which responds to the following methods: + # + # * {Types::PollHostCommandOutput#host_command #host_command} => Types::HostCommandInstance + # + # @example Request syntax with placeholder values + # + # resp = client.poll_host_command({ + # host_identifier: "HostIdentifier", # required + # }) + # + # @example Response structure + # + # resp.host_command.host_command_identifier #=> String + # resp.host_command.host_identifier #=> String + # resp.host_command.deployment_execution_id #=> String + # resp.host_command.command_name #=> String + # resp.host_command.nonce #=> Integer + # + # @overload poll_host_command(params = {}) + # @param [Hash] params ({}) + def poll_host_command(params = {}, options = {}) + req = build_request(:poll_host_command, params) + req.send_request(options) + end + + # This updates the central workflow engine with the current progress of + # the host command. This will also return the status of the host command + # centrally if possible, so agents can skip processing the command if it + # has been aborted / timed out. However, the status is optional, so if + # no status is returned the agent should treat it as if it was ok to + # continue. Throws ClientException for an invalid HostCommandIdentifier + # or Diagnostics. Throws ServerException for failures caused by the + # deployment system or its dependencies. + # + # @option params [required, String] :host_command_identifier + # + # @option params [Time,DateTime,Date,Integer,String] :estimated_completion_time + # + # @option params [Types::Envelope] :diagnostics + # For an Envelope used for host command diagnostics, Format is limited + # to 64 characters and Payload is limited to 8192 characters. + # + # @return [Types::PostHostCommandUpdateOutput] Returns a {Seahorse::Client::Response response} object which responds to the following methods: + # + # * {Types::PostHostCommandUpdateOutput#command_status #command_status} => String + # + # @example Request syntax with placeholder values + # + # resp = client.post_host_command_update({ + # host_command_identifier: "HostCommandIdentifier", # required + # estimated_completion_time: Time.now, + # diagnostics: { + # format: "Format", + # payload: "Payload", + # }, + # }) + # + # @example Response structure + # + # resp.command_status #=> String, one of "Pending", "InProgress", "Succeeded", "Failed" + # + # @overload post_host_command_update(params = {}) + # @param [Hash] params ({}) + def post_host_command_update(params = {}, options = {}) + req = build_request(:post_host_command_update, params) + req.send_request(options) + end + + # This notifies the central workflow engine that the agent has received + # the specified command and is ready to start execution. This will also + # return the status of the host command centrally if possible, so agents + # can skip processing the command if it has been aborted / timed out. + # However, the status is optional, so if no status is returned the agent + # should treat it as if it was ok to continue. Throws ClientException + # for an invalid HostCommandIdentifier or Diagnostics. Throws + # ServerException for failures caused by the deployment system or its + # dependencies. + # + # @option params [required, String] :host_command_identifier + # + # @option params [Types::Envelope] :diagnostics + # For an Envelope used for host command diagnostics, Format is limited + # to 64 characters and Payload is limited to 8192 characters. + # + # @return [Types::PutHostCommandAcknowledgementOutput] Returns a {Seahorse::Client::Response response} object which responds to the following methods: + # + # * {Types::PutHostCommandAcknowledgementOutput#command_status #command_status} => String + # + # @example Request syntax with placeholder values + # + # resp = client.put_host_command_acknowledgement({ + # host_command_identifier: "HostCommandIdentifier", # required + # diagnostics: { + # format: "Format", + # payload: "Payload", + # }, + # }) + # + # @example Response structure + # + # resp.command_status #=> String, one of "Pending", "InProgress", "Succeeded", "Failed" + # + # @overload put_host_command_acknowledgement(params = {}) + # @param [Hash] params ({}) + def put_host_command_acknowledgement(params = {}, options = {}) + req = build_request(:put_host_command_acknowledgement, params) + req.send_request(options) + end + + # This reports completion of the command back to the workflow engine. + # Throws ClientException for an invalid HostCommandIdentifier or + # Diagnostics. Throws ServerException for failures caused by the + # deployment system or its dependencies. + # + # @option params [required, String] :host_command_identifier + # + # @option params [required, String] :command_status + # + # @option params [Types::Envelope] :diagnostics + # For an Envelope used for host command diagnostics, Format is limited + # to 64 characters and Payload is limited to 8192 characters. + # + # @return [Struct] Returns an empty {Seahorse::Client::Response response}. + # + # @example Request syntax with placeholder values + # + # resp = client.put_host_command_complete({ + # host_command_identifier: "HostCommandIdentifier", # required + # command_status: "Pending", # required, accepts Pending, InProgress, Succeeded, Failed + # diagnostics: { + # format: "Format", + # payload: "Payload", + # }, + # }) + # + # @overload put_host_command_complete(params = {}) + # @param [Hash] params ({}) + def put_host_command_complete(params = {}, options = {}) + req = build_request(:put_host_command_complete, params) + req.send_request(options) + end + + # @!endgroup + + # @param params ({}) + # @api private + def build_request(operation_name, params = {}) + handlers = @handlers.for(operation_name) + context = Seahorse::Client::RequestContext.new( + operation_name: operation_name, + operation: config.api.operation(operation_name), + client: self, + params: params, + config: config) + context[:gem_name] = 'aws-sdk-codedeploycommand' + context[:gem_version] = '1.0.0' + Seahorse::Client::Request.new(handlers, context) + end + + # @api private + # @deprecated + def waiter_names + [] + end + + class << self + + # @api private + attr_reader :identifier + + # @api private + def errors_module + Errors + end + + end + end +end + +# frozen_string_literal: true + +# WARNING ABOUT GENERATED CODE +# +# This file is generated. See the contributing guide for more information: +# https://github.com/aws/aws-sdk-ruby/blob/version-3/CONTRIBUTING.md +# +# WARNING ABOUT GENERATED CODE + +module Aws::CodeDeployCommand + + # When CodeDeployCommand returns an error response, the Ruby SDK constructs and raises an error. + # These errors all extend Aws::CodeDeployCommand::Errors::ServiceError < {Aws::Errors::ServiceError} + # + # You can rescue all CodeDeployCommand errors using ServiceError: + # + # begin + # # do stuff + # rescue Aws::CodeDeployCommand::Errors::ServiceError + # # rescues all CodeDeployCommand API errors + # end + # + # + # ## Request Context + # ServiceError objects have a {Aws::Errors::ServiceError#context #context} method that returns + # information about the request that generated the error. + # See {Seahorse::Client::RequestContext} for more information. + # + # ## Error Classes + # * {ClientException} + # * {ServerException} + # + # Additionally, error classes are dynamically generated for service errors based on the error code + # if they are not defined above. + module Errors + + extend Aws::Errors::DynamicErrors + + class ClientException < ServiceError + + # @param [Seahorse::Client::RequestContext] context + # @param [String] message + # @param [Aws::CodeDeployCommand::Types::ClientException] data + def initialize(context, message, data = Aws::EmptyStructure.new) + super(context, message, data) + end + end + + class ServerException < ServiceError + + # @param [Seahorse::Client::RequestContext] context + # @param [String] message + # @param [Aws::CodeDeployCommand::Types::ServerException] data + def initialize(context, message, data = Aws::EmptyStructure.new) + super(context, message, data) + end + end + + end +end + +# frozen_string_literal: true + +# WARNING ABOUT GENERATED CODE +# +# This file is generated. See the contributing guide for more information: +# https://github.com/aws/aws-sdk-ruby/blob/version-3/CONTRIBUTING.md +# +# WARNING ABOUT GENERATED CODE + +module Aws::CodeDeployCommand + + class Resource + + # @param options ({}) + # @option options [Client] :client + def initialize(options = {}) + @client = options[:client] || Client.new(options) + end + + # @return [Client] + def client + @client + end + + end +end