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

Commit d622d92

Browse files
matt-royaltcdowney
andcommitted
DeleteExpiredPackageBlob handles packages in registry
[#175080280] Co-authored-by: Matt Royal <mroyal@pivotal.io> Co-authored-by: Tim Downey <tdowney@vmware.com>
1 parent 02cc6ce commit d622d92

13 files changed

Lines changed: 230 additions & 27 deletions

File tree

app/actions/app_delete.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
require 'jobs/runtime/blobstore_delete.rb'
1+
require 'jobs/runtime/blobstore_delete'
22
require 'jobs/v3/buildpack_cache_delete'
33
require 'actions/package_delete'
44
require 'actions/task_delete'
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
module VCAP::CloudController
2+
module Jobs
3+
module Kubernetes
4+
class RegistryDelete < VCAP::CloudController::Jobs::CCJob
5+
def initialize(image_reference)
6+
@image_reference = image_reference
7+
end
8+
9+
attr_reader :image_reference
10+
11+
def perform
12+
client = CloudController::DependencyLocator.instance.registry_buddy_client
13+
client.delete_image(image_reference)
14+
end
15+
16+
def max_attempts
17+
3
18+
end
19+
end
20+
end
21+
end
22+
end

app/jobs/runtime/delete_expired_package_blob.rb

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
require 'jobs/kubernetes/registry_delete'
2+
require 'jobs/runtime/blobstore_delete'
3+
14
module VCAP::CloudController
25
module Jobs
36
module Runtime
@@ -14,8 +17,11 @@ def perform
1417
package = PackageModel.find(guid: package_guid)
1518
return unless package
1619

17-
# TODO: skip this if we're using an image registry?
18-
BlobstoreDelete.new(package_guid, :package_blobstore).perform
20+
if VCAP::CloudController::Config.config.package_image_registry_configured?
21+
VCAP::CloudController::Jobs::Kubernetes::RegistryDelete.new(package.bits_image_reference).perform
22+
else
23+
BlobstoreDelete.new(package_guid, :package_blobstore).perform
24+
end
1925
package.update(package_hash: nil, sha256_checksum: nil)
2026
end
2127

app/models/runtime/package_model.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,16 @@ def image
4040
docker_image
4141
end
4242

43+
def bits_image_reference
44+
config = VCAP::CloudController::Config.config
45+
raise 'Package Registry is not configured' unless config.package_image_registry_configured?
46+
raise 'Package type must be bits' unless bits?
47+
48+
package_registry_base_path = config.get(:packages, :image_registry, :base_path)
49+
50+
"#{package_registry_base_path}/#{guid}@sha256:#{sha256_checksum}"
51+
end
52+
4353
def bits?
4454
type == BITS_TYPE
4555
end

lib/cloud_controller/config_schemas/worker_schema.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,11 @@ class WorkerSchema < VCAP::Config
101101
fog_aws_storage_options: Hash
102102
},
103103

104+
optional(:package_image_uploader) => {
105+
host: String,
106+
port: Integer
107+
},
108+
104109
db_encryption_key: enum(String, NilClass),
105110

106111
optional(:database_encryption) => {

lib/cloud_controller/dependency_locator.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,13 @@ def packer
366366
end
367367
end
368368

369+
def registry_buddy_client
370+
PackageImageUploader::Client.new(
371+
VCAP::CloudController::Config.config.get(:package_image_uploader, :host),
372+
VCAP::CloudController::Config.config.get(:package_image_uploader, :port),
373+
)
374+
end
375+
369376
def statsd_client
370377
@dependencies[:statsd_client] ||
371378
register(:statsd_client, Statsd.new(config.get(:statsd_host), config.get(:statsd_port)))

lib/cloud_controller/kpack/stager.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,8 @@ def image_resource(staging_details, builder_spec)
9393

9494
def configure_source(staging_details)
9595
if config.package_image_registry_configured?
96-
package_registry_base_path = config.get(:packages, :image_registry, :base_path)
9796
{ registry: {
98-
image: "#{package_registry_base_path}/#{staging_details.package.guid}@sha256:#{staging_details.package.sha256_checksum}"
97+
image: staging_details.package.bits_image_reference
9998
} }
10099
else
101100
{ blob: { url: blobstore_url_generator.package_download_url(staging_details.package) } }

lib/cloud_controller/packager/registry_bits_packer.rb

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,7 @@ class RegistryBitsPacker
1111
def send_package_to_blobstore(package_guid, uploaded_package_zip, cached_files_fingerprints)
1212
Dir.mktmpdir('registry_bits_packer', packages_tmp_dir) do |root_path|
1313
complete_package_path = match_resources_and_validate_package(root_path, uploaded_package_zip, cached_files_fingerprints)
14-
15-
client = PackageImageUploader::Client.new(
16-
VCAP::CloudController::Config.config.get(:package_image_uploader, :host),
17-
VCAP::CloudController::Config.config.get(:package_image_uploader, :port),
18-
)
14+
client = CloudController::DependencyLocator.instance.registry_buddy_client
1915

2016
registry = VCAP::CloudController::Config.config.get(:packages, :image_registry, :base_path)
2117
response = client.post_package(package_guid, complete_package_path, registry)

lib/package_image_uploader/client.rb

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,30 @@ def initialize(host, port)
77
end
88

99
def post_package(package_guid, zip_file_path, registry)
10-
response = with_request_error_handling do
10+
response = with_request_error_handling 200 do
1111
client.post('/packages',
12-
body: { 'package_zip_path' => zip_file_path,
12+
body: {
1313
'package_guid' => package_guid,
14-
'registry_base_path' => registry }
14+
'package_zip_path' => zip_file_path,
15+
'registry_base_path' => registry,
16+
}
1517
)
1618
end
1719
JSON.parse(response.body)
1820
end
1921

22+
def delete_image(image_reference)
23+
with_request_error_handling 202 do
24+
client.delete('/images',
25+
body: {
26+
image_reference: image_reference
27+
}
28+
)
29+
end
30+
31+
nil
32+
end
33+
2034
private
2135

2236
def client
@@ -27,11 +41,11 @@ def logger
2741
@logger ||= Steno.logger('cc.package_image_uploader')
2842
end
2943

30-
def with_request_error_handling(&_block)
44+
def with_request_error_handling(successful_status)
3145
response = yield
3246

3347
case response.status
34-
when 200
48+
when successful_status
3549
response
3650
when 400
3751
logger.error("PackageImageUploader returned: #{response.status} with #{response.body}")
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
require 'spec_helper'
2+
3+
module VCAP::CloudController
4+
module Jobs::Kubernetes
5+
RSpec.describe RegistryDelete, job_context: :worker do
6+
let(:image_reference) { 'path/to/image' }
7+
let(:registry_buddy_client) { instance_double(PackageImageUploader::Client) }
8+
9+
subject(:job) do
10+
RegistryDelete.new(image_reference)
11+
end
12+
13+
describe '#perform' do
14+
it 'sends a request to the registry buddy to delete the package' do
15+
allow(CloudController::DependencyLocator.instance).to receive(:registry_buddy_client).
16+
and_return(registry_buddy_client)
17+
allow(registry_buddy_client).to receive(:delete_image)
18+
19+
job.perform
20+
21+
expect(registry_buddy_client).to have_received(:delete_image).with(image_reference)
22+
end
23+
end
24+
end
25+
end
26+
end

0 commit comments

Comments
 (0)