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

Commit bea1a6c

Browse files
committed
Validate that app buildpack is ready
The new validation method on AppModel caused a few problems regarding the buildpack_lifecycle_data relationshiop (and the lifecycle_data) method, since it loads the relationship at creation/validation time. Previously the relationship was lazy loaded when it was first referenced. Co-authored-by: Matt Royal <mroyal@pivotal.io> Co-authored-by: Jaskanwal Pawar <jpawar@pivotal.io> Co-authored-by: Piyali Banerjee <pbanerjee@pivotal.io> [#173038631]
1 parent 2de7cd0 commit bea1a6c

5 files changed

Lines changed: 39 additions & 4 deletions

File tree

app/models/runtime/app_model.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ def validate
7272
super
7373
validates_presence :name
7474
validates_format APP_NAME_REGEX, :name
75+
validate_buildpacks_are_ready
7576
validate_environment_variables
7677
validate_droplet_is_staged
7778

@@ -160,6 +161,20 @@ def validate_environment_variables
160161
validate_each(self, :environment_variables, environment_variables)
161162
end
162163

164+
def validate_buildpacks_are_ready
165+
return unless self.buildpack_lifecycle_data
166+
167+
self.buildpack_lifecycle_data.buildpack_lifecycle_buildpacks.each do |blb|
168+
unless blb.custom?
169+
buildpack = Buildpack.find(name: blb.admin_buildpack_name)
170+
171+
if buildpack && buildpack.state != Buildpack::READY_STATE
172+
errors.add(:buildpack, 'must be in ready state')
173+
end
174+
end
175+
end
176+
end
177+
163178
def validate_droplet_is_staged
164179
if droplet && droplet.state != DropletModel::STAGED_STATE
165180
errors.add(:droplet, 'must be in staged state')

lib/cloud_controller/diego/lifecycles/app_buildpack_lifecycle.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def initialize(message)
1717
delegate :valid?, :errors, to: :validator
1818

1919
def create_lifecycle_data_model(app)
20-
BuildpackLifecycleDataModel.create(
20+
app.buildpack_lifecycle_data = BuildpackLifecycleDataModel.create(
2121
buildpacks: buildpacks,
2222
stack: stack,
2323
app: app

lib/cloud_controller/diego/lifecycles/app_kpack_lifecycle.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ class AppKpackLifecycle
33
def initialize(*_message); end
44

55
def create_lifecycle_data_model(app)
6-
KpackLifecycleDataModel.create(app: app)
6+
app.kpack_lifecycle_data = KpackLifecycleDataModel.create(app: app)
77
end
88

99
def update_lifecycle_data_model(_); end

spec/unit/actions/app_find_or_create_skeleton_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ module VCAP::CloudController
2929

3030
expect(app.name).to eq(name)
3131
expect(app.space).to eq(space)
32-
expect(app.lifecycle_type).to eq(Lifecycles::BUILDPACK)
32+
expect(app.reload.lifecycle_type).to eq(Lifecycles::BUILDPACK)
3333
end
3434
end
3535

spec/unit/models/runtime/app_model_spec.rb

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,13 +264,33 @@ module VCAP::CloudController
264264
expect(app_model).to be_valid
265265
end
266266
end
267+
268+
describe 'buildpacks' do
269+
let(:ready_buildpack) { Buildpack.make(filename: 'some-file') }
270+
let(:unready_buildpack) { Buildpack.make(filename: nil) }
271+
let!(:buildpack_lifecycle_data) { BuildpackLifecycleDataModel.make(app: app_model, buildpacks: [ready_buildpack.name, unready_buildpack.name]) }
272+
273+
it 'does not allow buildpacks that are not READY' do
274+
expect {
275+
app_model.buildpack_lifecycle_data = buildpack_lifecycle_data
276+
app_model.save
277+
}.to raise_error(Sequel::ValidationFailed, /must be in ready state/)
278+
end
279+
280+
it 'is valid with buildpacks that are READY' do
281+
buildpack_lifecycle_data.buildpacks = [ready_buildpack.name]
282+
app_model.buildpack_lifecycle_data = buildpack_lifecycle_data
283+
expect(app_model).to be_valid
284+
end
285+
end
267286
end
268287

269288
describe '#lifecycle_type' do
270289
context 'the model contains buildpack_lifecycle_data' do
271290
before { BuildpackLifecycleDataModel.make(app: app_model) }
272291

273292
it 'returns the string "buildpack" if buildpack_lifecycle_data is on the model' do
293+
app_model.reload
274294
expect(app_model.lifecycle_type).to eq('buildpack')
275295
end
276296
end
@@ -301,7 +321,7 @@ module VCAP::CloudController
301321
let!(:buildpack_lifecycle_data) { BuildpackLifecycleDataModel.make(app: app_model) }
302322

303323
it 'returns buildpack_lifecycle_data if it is on the model' do
304-
expect(app_model.lifecycle_data).to eq(buildpack_lifecycle_data)
324+
expect(app_model.reload.lifecycle_data).to eq(buildpack_lifecycle_data)
305325
end
306326

307327
it 'is a persistable hash' do

0 commit comments

Comments
 (0)