Skip to content

Commit 589765e

Browse files
committed
Fix issues with processes_sync:
* Exclude docker apps from sync if diego_docker is disabled * ensure CNB apps are still synced if diego_docker is disabled
1 parent 49902f6 commit 589765e

File tree

4 files changed

+111
-36
lines changed

4 files changed

+111
-36
lines changed

app/models/runtime/process_model.rb

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -98,16 +98,6 @@ def runnable
9898
def diego
9999
where(diego: true)
100100
end
101-
102-
def buildpack_type
103-
inner_join(BuildpackLifecycleDataModel.table_name, app_guid: :app_guid).
104-
select_all(:processes)
105-
end
106-
107-
def non_docker_type
108-
inner_join(BuildpackLifecycleDataModel.table_name, app_guid: :app_guid).
109-
select_all(:processes)
110-
end
111101
end
112102

113103
one_through_many :organization,

lib/cloud_controller/diego/processes_sync.rb

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def sync
2626
batched_processes_for_sync do |processes|
2727
processes.each do |process|
2828
process_guid = ProcessGuid.from_process(process)
29-
diego_lrp = diego_lrps.delete(process_guid)
29+
diego_lrp = diego_lrps.delete(process_guid)
3030

3131
if diego_lrp.nil?
3232
to_desire.append(process.id)
@@ -143,16 +143,10 @@ def batched_processes(ids)
143143

144144
def processes(ids)
145145
processes = ProcessModel.
146-
diego.
147-
runnable.
148146
where(Sequel.lit("#{ProcessModel.table_name}.id IN ?", ids)).
149147
eager(:desired_droplet, :space, :service_bindings, { routes: :domain }, { app: :buildpack_lifecycle_data })
150-
if FeatureFlag.enabled?(:diego_docker)
151-
processes.select_all(ProcessModel.table_name)
152-
else
153-
# `select_all` is called by `non_docker_type`
154-
processes.non_docker_type
155-
end
148+
149+
processes.select_all(ProcessModel.table_name)
156150
end
157151

158152
def processes_for_sync(last_id)
@@ -163,6 +157,12 @@ def processes_for_sync(last_id)
163157
order(:"#{ProcessModel.table_name}__id").
164158
limit(BATCH_SIZE)
165159

160+
unless FeatureFlag.enabled?(:diego_docker)
161+
non_docker_app_guids = BuildpackLifecycleDataModel.select(:app_guid).
162+
union(CNBLifecycleDataModel.select(:app_guid))
163+
processes = processes.where(Sequel.qualify(ProcessModel.table_name, :app_guid) => non_docker_app_guids)
164+
end
165+
166166
processes.select(:"#{ProcessModel.table_name}__id", :"#{ProcessModel.table_name}__guid", :"#{ProcessModel.table_name}__version",
167167
:"#{ProcessModel.table_name}__updated_at")
168168
end

spec/isolated_specs/processes_sync_spec.rb

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,42 @@ module Diego
5656
expect(bbs_apps_client).not_to have_received(:stop_app)
5757
expect(bbs_apps_client).to have_received(:bump_freshness).once
5858
end
59+
60+
context 'when the process is a docker app' do
61+
let(:app) { AppModel.make(:docker, droplet: DropletModel.make(:docker)) }
62+
let(:good_process) { ProcessModel.make(:docker, state: 'STARTED', app: app) }
63+
64+
context 'when diego_docker is enabled' do
65+
before do
66+
FeatureFlag.create(name: 'diego_docker', enabled: true)
67+
end
68+
69+
it 'does not touch lrps that are up to date and correct' do
70+
allow(bbs_apps_client).to receive(:desire_app)
71+
allow(bbs_apps_client).to receive(:update_app)
72+
allow(bbs_apps_client).to receive(:stop_app)
73+
74+
subject.sync
75+
76+
expect(bbs_apps_client).not_to have_received(:desire_app)
77+
expect(bbs_apps_client).not_to have_received(:update_app)
78+
expect(bbs_apps_client).not_to have_received(:stop_app)
79+
expect(bbs_apps_client).to have_received(:bump_freshness).once
80+
end
81+
end
82+
83+
context 'when diego_docker is disabled' do
84+
before do
85+
FeatureFlag.create(name: 'diego_docker', enabled: false)
86+
end
87+
88+
it 'deletes the LRP' do
89+
allow(bbs_apps_client).to receive(:stop_app)
90+
subject.sync
91+
expect(bbs_apps_client).to have_received(:stop_app).with(ProcessGuid.from_process(good_process))
92+
end
93+
end
94+
end
5995
end
6096

6197
context 'when a diego LRP is stale' do
@@ -85,6 +121,72 @@ module Diego
85121
expect(bbs_apps_client).to have_received(:bump_freshness).once
86122
end
87123

124+
context 'when the process is a cnb app' do
125+
let(:app) { AppModel.make(:cnb, droplet: DropletModel.make(:cnb)) }
126+
let!(:stale_process) { ProcessModel.make(:cnb, state: 'STARTED', app: app) }
127+
128+
before do
129+
FeatureFlag.create(name: 'diego_cnb', enabled: true)
130+
end
131+
132+
context 'when diego_docker is disabled' do
133+
before do
134+
FeatureFlag.create(name: 'diego_docker', enabled: false)
135+
end
136+
137+
it 'updates the stale lrp' do
138+
allow(bbs_apps_client).to receive(:update_app)
139+
subject.sync
140+
expect(bbs_apps_client).to have_received(:update_app).with(stale_process, stale_lrp_scheduling_info)
141+
expect(bbs_apps_client).to have_received(:bump_freshness).once
142+
end
143+
end
144+
145+
context 'when diego_docker is enabled' do
146+
before do
147+
FeatureFlag.create(name: 'diego_docker', enabled: true)
148+
end
149+
150+
it 'updates the stale lrp' do
151+
allow(bbs_apps_client).to receive(:update_app)
152+
subject.sync
153+
expect(bbs_apps_client).to have_received(:update_app).with(stale_process, stale_lrp_scheduling_info)
154+
expect(bbs_apps_client).to have_received(:bump_freshness).once
155+
end
156+
end
157+
end
158+
159+
context 'when the process is a docker app' do
160+
let(:app) { AppModel.make(:docker, droplet: DropletModel.make(:docker)) }
161+
let!(:stale_process) { ProcessModel.make(:docker, state: 'STARTED', app: app) }
162+
163+
context 'when diego_docker is enabled' do
164+
before do
165+
FeatureFlag.create(name: 'diego_docker', enabled: true)
166+
end
167+
168+
it 'updates the stale lrp' do
169+
allow(bbs_apps_client).to receive(:update_app)
170+
subject.sync
171+
expect(bbs_apps_client).to have_received(:update_app).with(stale_process, stale_lrp_scheduling_info)
172+
expect(bbs_apps_client).to have_received(:bump_freshness).once
173+
end
174+
end
175+
176+
context 'when diego_docker is disabled' do
177+
before do
178+
FeatureFlag.create(name: 'diego_docker', enabled: false)
179+
end
180+
181+
it 'deletes the lrp' do
182+
allow(bbs_apps_client).to receive(:stop_app)
183+
subject.sync
184+
expect(bbs_apps_client).to have_received(:stop_app).with(ProcessGuid.from_process(stale_process))
185+
expect(bbs_apps_client).to have_received(:bump_freshness).once
186+
end
187+
end
188+
end
189+
88190
context 'when updating app fails' do
89191
# bbs_apps_client will raise ApiErrors as of right now, we should think about factoring that out so that
90192
# the background job doesn't have to deal with API concerns

spec/unit/models/runtime/process_model_spec.rb

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,23 +30,6 @@ def expect_no_validator(validator_class)
3030
VCAP::CloudController::Seeds.create_seed_stacks
3131
end
3232

33-
describe 'dataset module' do
34-
let!(:buildpack_process) { ProcessModel.make }
35-
let!(:docker_process) { ProcessModel.make(:docker) }
36-
37-
describe '#buildpack_type' do
38-
it 'only returns processes associated with a buildpack app' do
39-
expect(ProcessModel.buildpack_type.map(&:name)).to contain_exactly(buildpack_process.name)
40-
end
41-
end
42-
43-
describe '#non_docker_type' do
44-
it 'only returns processes not associated with a docker app' do
45-
expect(ProcessModel.non_docker_type.map(&:name)).to contain_exactly(buildpack_process.name)
46-
end
47-
end
48-
end
49-
5033
describe 'Creation' do
5134
subject(:process) { ProcessModel.new }
5235

0 commit comments

Comments
 (0)