diff --git a/app/actions/deployment_create.rb b/app/actions/deployment_create.rb index 3a1bce39f99..0d2b3727490 100644 --- a/app/actions/deployment_create.rb +++ b/app/actions/deployment_create.rb @@ -25,7 +25,7 @@ def create(app:, user_audit_info:, message:) if target_state.rollback_target_revision revision = RevisionResolver.rollback_app_revision(app, target_state.rollback_target_revision, user_audit_info) - log_rollback_event(app.guid, user_audit_info.user_guid, target_state.rollback_target_revision.guid, message.strategy) + log_rollback_event(app.guid, user_audit_info.user_guid, target_state.rollback_target_revision.guid, message.strategy, message.max_in_flight, message.canary_steps) else revision = RevisionResolver.update_app_revision(app, user_audit_info) end @@ -201,7 +201,7 @@ def create_deployment(app, message, previous_deployment, previous_droplet, revis memory_in_mb: message.memory_in_mb, disk_in_mb: message.disk_in_mb, log_rate_limit_in_bytes_per_second: message.log_rate_limit_in_bytes_per_second, - canary_steps: message.options&.dig(:canary, :steps), + canary_steps: message.canary_steps, web_instances: message.web_instances ) MetadataUpdate.update(deployment, message) @@ -251,7 +251,7 @@ def starting_process_instances(deployment, desired_instances) [deployment.max_in_flight, starting_process_count].min end - def log_rollback_event(app_guid, user_id, revision_id, strategy) + def log_rollback_event(app_guid, user_id, revision_id, strategy, max_in_flight, canary_steps) TelemetryLogger.v3_emit( 'rolled-back-app', { @@ -259,7 +259,11 @@ def log_rollback_event(app_guid, user_id, revision_id, strategy) 'user-id' => user_id, 'revision-id' => revision_id }, - { 'strategy' => strategy } + { + 'strategy' => strategy, + 'max-in-flight' => max_in_flight, + 'canary-steps' => canary_steps + } ) end end diff --git a/app/controllers/v3/deployments_controller.rb b/app/controllers/v3/deployments_controller.rb index 327659e7bcf..7fa8c6b94ad 100644 --- a/app/controllers/v3/deployments_controller.rb +++ b/app/controllers/v3/deployments_controller.rb @@ -58,7 +58,11 @@ def create 'app-id' => app.guid, 'user-id' => current_user.guid }, - { 'strategy' => deployment.strategy } + { + 'strategy' => deployment.strategy, + 'max-in-flight' => deployment.max_in_flight, + 'canary-steps' => deployment.canary_steps + } ) rescue DeploymentCreate::Error => e unprocessable!(e.message) diff --git a/app/messages/deployment_create_message.rb b/app/messages/deployment_create_message.rb index f1ee39cde03..070d81ac14f 100644 --- a/app/messages/deployment_create_message.rb +++ b/app/messages/deployment_create_message.rb @@ -64,6 +64,10 @@ def log_rate_limit_in_bytes_per_second options&.dig(:log_rate_limit_in_bytes_per_second) end + def canary_steps + options&.dig(:canary, :steps) + end + private def mutually_exclusive_droplet_sources diff --git a/spec/request/deployments_spec.rb b/spec/request/deployments_spec.rb index 4ec66e94845..f4ed42758ba 100644 --- a/spec/request/deployments_spec.rb +++ b/spec/request/deployments_spec.rb @@ -580,6 +580,12 @@ let(:create_request) do { strategy: 'canary', + options: { + max_in_flight: 10, + canary: { + steps: [{ instance_weight: 1 }, { instance_weight: 2 }] + } + }, relationships: { app: { data: { @@ -594,6 +600,13 @@ revision: { guid: revision.guid }, + strategy: 'canary', + options: { + max_in_flight: 10, + canary: { + steps: [{ instance_weight: 1 }, { instance_weight: 2 }] + } + }, relationships: { app: { data: { @@ -612,6 +625,8 @@ 'create-deployment' => { 'api-version' => 'v3', 'strategy' => 'canary', + 'max-in-flight' => 10, + 'canary-steps' => [{ 'instance_weight' => 1 }, { 'instance_weight' => 2 }], 'app-id' => OpenSSL::Digest::SHA256.hexdigest(app_model.guid), 'user-id' => OpenSSL::Digest::SHA256.hexdigest(user.guid) } @@ -632,6 +647,8 @@ 'rolled-back-app' => { 'api-version' => 'v3', 'strategy' => 'canary', + 'max-in-flight' => 10, + 'canary-steps' => [{ 'instance_weight' => 1 }, { 'instance_weight' => 2 }], 'app-id' => OpenSSL::Digest::SHA256.hexdigest(app_model.guid), 'user-id' => OpenSSL::Digest::SHA256.hexdigest(user.guid), 'revision-id' => OpenSSL::Digest::SHA256.hexdigest(revision.guid) diff --git a/spec/unit/messages/deployment_create_message_spec.rb b/spec/unit/messages/deployment_create_message_spec.rb index b8292ef12e1..c0abcbd97a4 100644 --- a/spec/unit/messages/deployment_create_message_spec.rb +++ b/spec/unit/messages/deployment_create_message_spec.rb @@ -598,5 +598,29 @@ module VCAP::CloudController end end end + + describe 'canary steps' do + context 'when options is not specified' do + before do + body['options'] = nil + end + + it 'returns nil' do + message = DeploymentCreateMessage.new(body) + expect(message.canary_steps).to be_nil + end + end + + context 'when canary and steps are specified' do + before do + body['options'] = { canary: { steps: [{ instance_weight: 1 }] } } + end + + it 'returns the passed value' do + message = DeploymentCreateMessage.new(body) + expect(message.canary_steps).to eq [{ instance_weight: 1 }] + end + end + end end end