Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .rubocop_cc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ plugins:
require:
- ./spec/linters/migration/add_constraint_name.rb
- ./spec/linters/migration/include_string_size.rb
- ./spec/linters/migration/no_model_in_specs.rb
- ./spec/linters/migration/require_primary_key.rb
- ./spec/linters/migration/too_many_migration_runs.rb
- ./spec/linters/match_requires_with_includes.rb
Expand Down Expand Up @@ -67,6 +68,12 @@ Migration/IncludeStringSize: # Exclude for old Migrations
Exclude:
- !ruby/regexp /db/migrations/201([0-9]).+\.rb$/
- !ruby/regexp /db/migrations/202([0-2]).+\.rb$/
Migration/NoModelInSpecs:
Include:
- spec/migrations/**/*
Exclude:
# Uses custom tmp_migrations_dir so schema is never rolled back
- spec/migrations/20190712210940_backfill_status_for_deployments_spec.rb
Migration/RequirePrimaryKey: # Exclude for old Migrations
Include:
- db/migrations/**/*
Expand Down
3 changes: 2 additions & 1 deletion app/actions/app_create.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ def create(message, lifecycle)
app = AppModel.create(
name: message.name,
space_guid: message.space_guid,
environment_variables: message.environment_variables
environment_variables: message.environment_variables,
lifecycle_type: lifecycle.type
)

lifecycle.create_lifecycle_data_model(app)
Expand Down
1 change: 1 addition & 0 deletions app/actions/droplet_copy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ def initialize(source_droplet)

def copy(destination_app, user_audit_info)
raise InvalidCopyError.new('source droplet is not staged') unless @source_droplet.staged?
raise InvalidCopyError.new('source and destination lifecycle types do not match') unless @source_droplet.lifecycle_type == destination_app.lifecycle_type

new_droplet = DropletModel.new(state: DropletModel::COPYING_STATE, app: destination_app)

Expand Down
6 changes: 3 additions & 3 deletions app/actions/droplet_create.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,15 @@ def create(app, message, user_audit_info)
end

droplet = DropletModel.new(
app_guid: app.guid,
app: app,
state: DropletModel::AWAITING_UPLOAD_STATE,
process_types: message.process_types || DEFAULT_PROCESS_TYPES,
execution_metadata: ''
)

DropletModel.db.transaction do
droplet.save
VCAP::CloudController::BuildpackLifecycleDataModel.create(
droplet.buildpack_lifecycle_data = VCAP::CloudController::BuildpackLifecycleDataModel.create(
droplet:
)
end
Expand Down Expand Up @@ -84,7 +84,7 @@ def find_or_create_buildpack_droplet(build)

def droplet_from_build(build)
DropletModel.new(
app_guid: build.app_guid,
app: build.app,
package_guid: build.package_guid,
state: DropletModel::STAGING_STATE,
build: build
Expand Down
3 changes: 2 additions & 1 deletion app/actions/v2/app_create.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ def create(request_attrs)
name: request_attrs['name'],
space_guid: request_attrs['space_guid'],
environment_variables: request_attrs['environment_json'],
enable_ssh: request_attrs['enable_ssh']
enable_ssh: request_attrs['enable_ssh'],
lifecycle_type: (request_attrs.key?('docker_image') ? DockerLifecycleDataModel::LIFECYCLE_TYPE : BuildpackLifecycleDataModel::LIFECYCLE_TYPE)
)

validate_lifecycle!(request_attrs)
Expand Down
1 change: 0 additions & 1 deletion app/models.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
require 'models/runtime/droplet_model'
require 'models/runtime/buildpack_lifecycle_data_model'
require 'models/runtime/buildpack_lifecycle_buildpack_model'
require 'models/runtime/kpack_lifecycle_data_model'
require 'models/runtime/cnb_lifecycle_data_model'
require 'models/runtime/docker_lifecycle_data_model'
require 'models/runtime/task_model'
Expand Down
15 changes: 7 additions & 8 deletions app/models/runtime/app_model.rb
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,6 @@ class AppModel < Sequel::Model(:apps)
key: :app_guid,
primary_key: :guid

one_to_one :kpack_lifecycle_data,
class: 'VCAP::CloudController::KpackLifecycleDataModel',
key: :app_guid,
primary_key: :guid

one_to_one :cnb_lifecycle_data,
class: 'VCAP::CloudController::CNBLifecycleDataModel',
key: :app_guid,
Expand All @@ -66,7 +61,6 @@ class AppModel < Sequel::Model(:apps)
serializes_via_json :environment_variables

add_association_dependencies buildpack_lifecycle_data: :destroy
add_association_dependencies kpack_lifecycle_data: :destroy
add_association_dependencies cnb_lifecycle_data: :destroy
add_association_dependencies labels: :destroy
add_association_dependencies annotations: :destroy
Expand Down Expand Up @@ -99,18 +93,23 @@ def validate
validates_format APP_NAME_REGEX, :name
validate_environment_variables
validate_droplet_is_staged

validates_includes %w[buildpack cnb docker], :lifecycle_type
end

def lifecycle_type
return self[:lifecycle_type] if self[:lifecycle_type].present?

# Fallback for records without lifecycle_type column value
return BuildpackLifecycleDataModel::LIFECYCLE_TYPE if buildpack_lifecycle_data
return CNBLifecycleDataModel::LIFECYCLE_TYPE if cnb_lifecycle_data

DockerLifecycleDataModel::LIFECYCLE_TYPE
end

def lifecycle_data
return buildpack_lifecycle_data if buildpack_lifecycle_data
return cnb_lifecycle_data if cnb_lifecycle_data
return buildpack_lifecycle_data if lifecycle_type == BuildpackLifecycleDataModel::LIFECYCLE_TYPE
return cnb_lifecycle_data if lifecycle_type == CNBLifecycleDataModel::LIFECYCLE_TYPE

DockerLifecycleDataModel.new
end
Expand Down
35 changes: 23 additions & 12 deletions app/models/runtime/build_model.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,6 @@ class BuildModel < Sequel::Model(:builds)
class: 'VCAP::CloudController::BuildpackLifecycleDataModel',
key: :build_guid,
primary_key: :guid
one_to_one :kpack_lifecycle_data,
class: 'VCAP::CloudController::KpackLifecycleDataModel',
key: :build_guid,
primary_key: :guid
one_to_one :cnb_lifecycle_data,
class: 'VCAP::CloudController::CNBLifecycleDataModel',
key: :build_guid,
Expand All @@ -49,29 +45,44 @@ class BuildModel < Sequel::Model(:builds)
one_to_many :labels, class: 'VCAP::CloudController::BuildLabelModel', key: :resource_guid, primary_key: :guid
one_to_many :annotations, class: 'VCAP::CloudController::BuildAnnotationModel', key: :resource_guid, primary_key: :guid

add_association_dependencies buildpack_lifecycle_data: :destroy, kpack_lifecycle_data: :destroy, cnb_lifecycle_data: :destroy
add_association_dependencies buildpack_lifecycle_data: :destroy, cnb_lifecycle_data: :destroy

add_association_dependencies labels: :destroy
add_association_dependencies annotations: :destroy

def validate
super
validates_includes %w[buildpack cnb docker], :lifecycle_type
end

def before_create
# Inherit lifecycle_type from associated app if not explicitly set
self[:lifecycle_type] = app&.lifecycle_type if self[:lifecycle_type].blank?

super
end

def lifecycle_type
return Lifecycles::BUILDPACK if buildpack_lifecycle_data
return Lifecycles::CNB if cnb_lifecycle_data
return self[:lifecycle_type] if self[:lifecycle_type].present?

# Fallback for records without lifecycle_type column value
return BuildpackLifecycleDataModel::LIFECYCLE_TYPE if buildpack_lifecycle_data
return CNBLifecycleDataModel::LIFECYCLE_TYPE if cnb_lifecycle_data

Lifecycles::DOCKER
DockerLifecycleDataModel::LIFECYCLE_TYPE
end

def buildpack_lifecycle?
lifecycle_type == Lifecycles::BUILDPACK
lifecycle_type == BuildpackLifecycleDataModel::LIFECYCLE_TYPE
end

def cnb_lifecycle?
lifecycle_type == Lifecycles::CNB
lifecycle_type == CNBLifecycleDataModel::LIFECYCLE_TYPE
end

def lifecycle_data
return buildpack_lifecycle_data if buildpack_lifecycle_data
return cnb_lifecycle_data if cnb_lifecycle_data
return buildpack_lifecycle_data if lifecycle_type == BuildpackLifecycleDataModel::LIFECYCLE_TYPE
return cnb_lifecycle_data if lifecycle_type == CNBLifecycleDataModel::LIFECYCLE_TYPE

DockerLifecycleDataModel.new
end
Expand Down
20 changes: 13 additions & 7 deletions app/models/runtime/droplet_model.rb
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,6 @@ class DropletModel < Sequel::Model(:droplets)
class: 'VCAP::CloudController::BuildpackLifecycleDataModel',
key: :droplet_guid,
primary_key: :guid
one_to_one :kpack_lifecycle_data,
class: 'VCAP::CloudController::KpackLifecycleDataModel',
key: :droplet_guid,
primary_key: :guid
one_to_one :cnb_lifecycle_data,
class: 'VCAP::CloudController::CNBLifecycleDataModel',
key: :droplet_guid,
Expand All @@ -45,7 +41,6 @@ class DropletModel < Sequel::Model(:droplets)
one_to_many :annotations, class: 'VCAP::CloudController::DropletAnnotationModel', key: :resource_guid, primary_key: :guid

add_association_dependencies buildpack_lifecycle_data: :destroy
add_association_dependencies kpack_lifecycle_data: :destroy
add_association_dependencies cnb_lifecycle_data: :destroy
add_association_dependencies labels: :destroy
add_association_dependencies annotations: :destroy
Expand All @@ -54,6 +49,13 @@ class DropletModel < Sequel::Model(:droplets)
serializes_via_json :process_types
serializes_via_json :sidecars

def before_create
# Inherit lifecycle_type from associated app if not explicitly set
self[:lifecycle_type] = app&.lifecycle_type if self[:lifecycle_type].blank?

super
end

def around_destroy
yield
rescue Sequel::ForeignKeyConstraintViolation => e
Expand All @@ -70,6 +72,7 @@ def error
def validate
super
validates_includes DROPLET_STATES, :state, allow_missing: true
validates_includes %w[buildpack cnb docker], :lifecycle_type
end

def set_buildpack_receipt(buildpack_key:, detect_output:, requested_buildpack:, buildpack_url: nil)
Expand Down Expand Up @@ -173,15 +176,18 @@ def fail_to_stage!(reason='StagingError', details='staging failed')
end

def lifecycle_type
return self[:lifecycle_type] if self[:lifecycle_type].present?

# Fallback for records without lifecycle_type column value
return BuildpackLifecycleDataModel::LIFECYCLE_TYPE if buildpack_lifecycle_data
return CNBLifecycleDataModel::LIFECYCLE_TYPE if cnb_lifecycle_data

DockerLifecycleDataModel::LIFECYCLE_TYPE
end

def lifecycle_data
return buildpack_lifecycle_data if buildpack_lifecycle_data
return cnb_lifecycle_data if cnb_lifecycle_data
return buildpack_lifecycle_data if lifecycle_type == BuildpackLifecycleDataModel::LIFECYCLE_TYPE
return cnb_lifecycle_data if lifecycle_type == CNBLifecycleDataModel::LIFECYCLE_TYPE

DockerLifecycleDataModel.new
end
Expand Down
54 changes: 0 additions & 54 deletions app/models/runtime/kpack_lifecycle_data_model.rb

This file was deleted.

29 changes: 29 additions & 0 deletions db/migrations/20260428120000_add_lifecycle_type_to_apps.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
Sequel.migration do
no_transaction # to use the 'concurrently' option

up do
if database_type == :postgres
add_column :apps, :lifecycle_type, String, null: true, size: 255, if_not_exists: true
VCAP::Migration.with_concurrent_timeout(self) do
add_index :apps, :lifecycle_type, name: :apps_lifecycle_type_index, concurrently: true, if_not_exists: true
end
else
# MySQL
add_column :apps, :lifecycle_type, String, null: true, size: 255 unless schema(:apps).map(&:first).include?(:lifecycle_type)
add_index :apps, :lifecycle_type, name: :apps_lifecycle_type_index, concurrently: false unless indexes(:apps).include?(:apps_lifecycle_type_index)
end
end

down do
if database_type == :postgres
VCAP::Migration.with_concurrent_timeout(self) do
drop_index :apps, :lifecycle_type, name: :apps_lifecycle_type_index, concurrently: true, if_exists: true
end
drop_column :apps, :lifecycle_type, if_exists: true
else
# MySQL
drop_index :apps, :lifecycle_type, name: :apps_lifecycle_type_index, concurrently: false if indexes(:apps).include?(:apps_lifecycle_type_index)
drop_column :apps, :lifecycle_type if schema(:apps).map(&:first).include?(:lifecycle_type)
end
end
end
29 changes: 29 additions & 0 deletions db/migrations/20260428120100_add_lifecycle_type_to_droplets.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
Sequel.migration do
no_transaction # to use the 'concurrently' option

up do
if database_type == :postgres
add_column :droplets, :lifecycle_type, String, null: true, size: 255, if_not_exists: true
VCAP::Migration.with_concurrent_timeout(self) do
add_index :droplets, :lifecycle_type, name: :droplets_lifecycle_type_index, concurrently: true, if_not_exists: true
end
else
# MySQL
add_column :droplets, :lifecycle_type, String, null: true, size: 255 unless schema(:droplets).map(&:first).include?(:lifecycle_type)
add_index :droplets, :lifecycle_type, name: :droplets_lifecycle_type_index, concurrently: false unless indexes(:droplets).include?(:droplets_lifecycle_type_index)
end
end

down do
if database_type == :postgres
VCAP::Migration.with_concurrent_timeout(self) do
drop_index :droplets, :lifecycle_type, name: :droplets_lifecycle_type_index, concurrently: true, if_exists: true
end
drop_column :droplets, :lifecycle_type, if_exists: true
else
# MySQL
drop_index :droplets, :lifecycle_type, name: :droplets_lifecycle_type_index, concurrently: false if indexes(:droplets).include?(:droplets_lifecycle_type_index)
drop_column :droplets, :lifecycle_type if schema(:droplets).map(&:first).include?(:lifecycle_type)
end
end
end
Loading
Loading