Skip to content
This repository was archived by the owner on Jun 2, 2021. It is now read-only.

Commit c83d293

Browse files
author
Derik Evangelista
authored
v3(bindings): fix audit hash for create bindings (cloudfoundry#1869)
[#174090447](https://www.pivotaltracker.com/story/show/174090447)
1 parent 81eeeb1 commit c83d293

8 files changed

Lines changed: 49 additions & 13 deletions

app/actions/service_credential_binding_create.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@ class UnprocessableCreate < StandardError
1010
class Unimplemented < StandardError
1111
end
1212

13-
def initialize(user_audit_info)
13+
def initialize(user_audit_info, audit_hash)
1414
@user_audit_info = user_audit_info
15+
@audit_hash = audit_hash
1516
end
1617

1718
def precursor(service_instance, app: nil, name: nil, volume_mount_services_enabled: false)
@@ -46,7 +47,7 @@ def bind(binding, parameters: {}, accepts_incomplete: false)
4647
save_incomplete_binding(binding, details[:operation])
4748
else
4849
binding.save_with_new_operation(operation_succeeded, attributes: details[:binding])
49-
event_repository.record_create(binding, @user_audit_info, manifest_triggered: false)
50+
event_repository.record_create(binding, @user_audit_info, @audit_hash, manifest_triggered: false)
5051
end
5152
rescue => e
5253
binding.save_with_new_operation({

app/controllers/v3/service_credential_bindings_controller.rb

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,12 @@ def create
4949
resource_not_accessible!('app', message.app_guid) unless can_access_resource?(app)
5050
unauthorized! unless can_write_to_space?(app.space)
5151

52-
action = V3::ServiceCredentialBindingCreate.new(user_audit_info)
52+
action = V3::ServiceCredentialBindingCreate.new(user_audit_info, message.audit_hash)
5353
binding = action.precursor(service_instance, app: app, name: message.name, volume_mount_services_enabled: volume_services_enabled?)
5454

5555
case service_instance
5656
when ManagedServiceInstance
57-
pollable_job_guid = enqueue_bind_job(binding.guid, message.parameters)
57+
pollable_job_guid = enqueue_bind_job(binding.guid, message)
5858
head :accepted, 'Location' => url_builder.build_url(path: "/v3/jobs/#{pollable_job_guid}")
5959
when UserProvidedServiceInstance
6060
action.bind(binding)
@@ -111,11 +111,12 @@ def parameters
111111

112112
private
113113

114-
def enqueue_bind_job(binding_guid, parameters)
114+
def enqueue_bind_job(binding_guid, message)
115115
bind_job = VCAP::CloudController::V3::CreateServiceCredentialBindingJob.new(
116116
binding_guid,
117117
user_audit_info: user_audit_info,
118-
parameters: parameters
118+
audit_hash: message.audit_hash,
119+
parameters: message.parameters
119120
)
120121
pollable_job = Jobs::Enqueuer.new(bind_job, queue: Jobs::Queues.generic).enqueue_pollable
121122
pollable_job.guid

app/jobs/v3/create_service_credential_binding_job.rb

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55
module VCAP::CloudController
66
module V3
77
class CreateServiceCredentialBindingJob < Jobs::ReoccurringJob
8-
def initialize(binding_guid, parameters:, user_audit_info:)
8+
def initialize(binding_guid, parameters:, user_audit_info:, audit_hash:)
99
super()
1010
@binding_guid = binding_guid
1111
@user_audit_info = user_audit_info
1212
@parameters = parameters
13+
@audit_hash = audit_hash
1314
@first_time = true
1415
end
1516

@@ -34,14 +35,14 @@ def resource_guid
3435
end
3536

3637
def resource_type
37-
'service_binding'
38+
'service_credential_binding'
3839
end
3940

4041
def perform
4142
binding = ServiceBinding.first(guid: @binding_guid)
4243
gone! unless binding
4344

44-
action = V3::ServiceCredentialBindingCreate.new(@user_audit_info)
45+
action = V3::ServiceCredentialBindingCreate.new(@user_audit_info, @audit_hash)
4546

4647
if @first_time
4748
@first_time = false

app/models/runtime/pollable_job_model.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ def resource_exists?
2626
SpaceQuotaDefinition
2727
when 'service_route_binding'
2828
RouteBinding
29+
when 'service_credential_binding'
30+
ServiceBinding
2931
else
3032
Sequel::Model(ActiveSupport::Inflector.pluralize(resource_type).to_sym)
3133
end

spec/request/service_credential_bindings_spec.rb

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -911,11 +911,13 @@ def check_filtered_bindings(*bindings)
911911
expect(job.state).to eq(VCAP::CloudController::PollableJobModel::PROCESSING_STATE)
912912
expect(job.operation).to eq('service_bindings.create')
913913
expect(job.resource_guid).to eq(binding.guid)
914-
expect(job.resource_type).to eq('service_binding')
914+
expect(job.resource_type).to eq('service_credential_binding')
915915

916916
get "/v3/jobs/#{job.guid}", nil, admin_headers
917917
expect(last_response).to have_status_code(200)
918918
expect(parsed_response['guid']).to eq(job.guid)
919+
binding_link = parsed_response.dig('links', 'service_credential_binding', 'href')
920+
expect(binding_link).to end_with("/v3/service_credential_bindings/#{binding.guid}")
919921
end
920922

921923
describe 'the pollable job' do
@@ -992,6 +994,17 @@ def check_filtered_bindings(*bindings)
992994

993995
expect(job.state).to eq(VCAP::CloudController::PollableJobModel::COMPLETE_STATE)
994996
end
997+
998+
it 'logs an audit event' do
999+
execute_all_jobs(expected_successes: 1, expected_failures: 0)
1000+
1001+
event = VCAP::CloudController::Event.find(type: 'audit.service_binding.create')
1002+
expect(event).to be
1003+
expect(event.actee).to eq(binding.guid)
1004+
expect(event.data).to include({
1005+
'request' => create_body.with_indifferent_access
1006+
})
1007+
end
9951008
end
9961009

9971010
context 'when the broker fails to bind' do

spec/unit/actions/service_credential_binding_create_spec.rb

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
module VCAP::CloudController
66
module V3
77
RSpec.describe ServiceCredentialBindingCreate do
8-
subject(:action) { described_class.new(user_audit_info) }
8+
subject(:action) { described_class.new(user_audit_info, audit_hash) }
99

10+
let(:audit_hash) { { some_info: 'some_value' } }
1011
let(:volume_mount_services_enabled) { true }
1112
let(:space) { Space.make }
1213
let(:app) { AppModel.make(space: space) }
@@ -176,7 +177,12 @@ module V3
176177

177178
it 'creates an audit event' do
178179
action.bind(precursor)
179-
expect(@service_binding_event_repository).to have_received(:record_create).with(precursor, user_audit_info, manifest_triggered: false)
180+
expect(@service_binding_event_repository).to have_received(:record_create).with(
181+
precursor,
182+
user_audit_info,
183+
audit_hash,
184+
manifest_triggered: false,
185+
)
180186
end
181187

182188
context 'when saving to the db fails' do

spec/unit/jobs/v3/create_service_credential_binding_job_spec.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ module V3
2929
binding.guid,
3030
parameters: parameters,
3131
user_audit_info: user_info,
32+
audit_hash: { some_key: 'some_info' }
3233
)
3334
end
3435

@@ -123,7 +124,7 @@ module V3
123124

124125
describe '#resource_type' do
125126
it 'returns "service_binding"' do
126-
expect(subject.resource_type).to eq('service_binding')
127+
expect(subject.resource_type).to eq('service_credential_binding')
127128
end
128129
end
129130
end

spec/unit/models/runtime/pollable_job_model_spec.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,17 @@ module VCAP::CloudController
9595
job = PollableJobModel.make(resource_type: 'service_route_binding', resource_guid: 'not-a-real-guid')
9696
expect(job.resource_exists?).to be(false)
9797
end
98+
99+
it 'returns true if the resource exists' do
100+
binding = ServiceBinding.make
101+
job = PollableJobModel.make(resource_type: 'service_credential_binding', resource_guid: binding.guid)
102+
expect(job.resource_exists?).to be(true)
103+
end
104+
105+
it 'returns false if the resource does NOT exist' do
106+
job = PollableJobModel.make(resource_type: 'service_credential_binding', resource_guid: 'not-a-real-guid')
107+
expect(job.resource_exists?).to be(false)
108+
end
98109
end
99110
end
100111

0 commit comments

Comments
 (0)