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

Commit 534a742

Browse files
update image source on build
- including in-place upgrade from package-blobstore to package-registry [#173343000] Co-authored-by: Connor Braa <cbraa@pivotal.io> Co-authored-by: Piyali Banerjee <pbanerjee@pivotal.io>
1 parent 4e53f80 commit 534a742

4 files changed

Lines changed: 57 additions & 98 deletions

File tree

lib/cloud_controller/kpack/stager.rb

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def mark_build_as_failed(build, message)
5757
def update_image_resource(image, staging_details, builder_spec)
5858
image.metadata.labels[DROPLET_GUID_LABEL_KEY.to_sym] = create_droplet_and_get_guid(staging_details)
5959
image.metadata.labels[BUILD_GUID_LABEL_KEY.to_sym] = staging_details.staging_guid
60-
image.spec.source.blob.url = blobstore_url_generator.package_download_url(staging_details.package)
60+
image.spec.source = get_source(staging_details)
6161
image.spec.build.env = get_environment_variables(staging_details)
6262
image.spec.builder = builder_spec
6363

@@ -83,23 +83,21 @@ def image_resource(staging_details, builder_spec)
8383
serviceAccount: registry_service_account_name,
8484
builder: builder_spec,
8585
tag: "#{registry_tag_base}/#{staging_details.package.app.guid}",
86-
source: configure_source(staging_details),
86+
source: get_source(staging_details),
8787
build: {
8888
env: get_environment_variables(staging_details),
8989
}
9090
}
9191
})
9292
end
9393

94-
def configure_source(staging_details)
95-
if registry_configured?
96-
package_registry_base_path = config.get(:packages, :image_registry, :base_path)
97-
{ registry: {
94+
def get_source(staging_details)
95+
package_registry_base_path = config.get(:packages, :image_registry, :base_path)
96+
{
97+
registry: {
9898
image: "#{package_registry_base_path}/#{staging_details.package.guid}@sha256:#{staging_details.package.sha256_checksum}"
99-
} }
100-
else
101-
{ blob: { url: blobstore_url_generator.package_download_url(staging_details.package) } }
102-
end
99+
}
100+
}
103101
end
104102

105103
def get_environment_variables(staging_details)

lib/kubernetes/api_client.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def initialize(build_kube_client:, kpack_kube_client:, route_kube_client:)
1414
def create_image(resource_config)
1515
@build_kube_client.create_image(resource_config)
1616
rescue Kubeclient::HttpError => e
17-
logger.error('create_image', error: e.inspect, response: e.response, backtrace: e.backtrace)
17+
logger.error('create_image', error: e.inspect, response: e.response, backtrace: e.backtrace, resource: resource_config)
1818
raise CloudController::Errors::ApiError.new_from_details('KpackImageError', 'create', e.message)
1919
end
2020

lib/package_image_uploader/client.rb

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
require 'jsonclient'
2+
13
module PackageImageUploader
24
class Client
35
def initialize(host, port)
@@ -7,15 +9,18 @@ def initialize(host, port)
79
def post_package(package_guid, zip_file_path, registry)
810
response = with_request_error_handling do
911
client.post('/packages',
10-
{ package_zip_path: zip_file_path, package_guid: package_guid, registry_base_path: registry })
12+
body: { 'package_zip_path' => zip_file_path,
13+
'package_guid' => package_guid,
14+
'registry_base_path' => registry }
15+
)
1116
end
1217
JSON.parse(response.body)
1318
end
1419

1520
private
1621

1722
def client
18-
HTTPClient.new(base_url: @url)
23+
@client ||= JSONClient.new(base_url: @url)
1924
end
2025

2126
def logger

spec/unit/lib/cloud_controller/kpack/stager_spec.rb

Lines changed: 41 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,9 @@ module Kpack
6060
}
6161
)
6262
}
63+
6364
before do
65+
TestConfig.override({ packages: { image_registry: { base_path: 'hub.example.com/user' } } })
6466
allow(CloudController::DependencyLocator.instance).to receive(:k8s_api_client).and_return(client)
6567
allow(CloudController::DependencyLocator.instance).to receive(:blobstore_url_generator).and_return(blobstore_url_generator)
6668
allow(client).to receive(:get_image).and_return(nil)
@@ -102,95 +104,45 @@ module Kpack
102104
stager.stage(staging_details)
103105
end
104106

105-
context 'package image registry is configured' do
106-
before do
107-
TestConfig.override({ packages: { image_registry: { base_path: 'hub.example.com/user' } } })
108-
end
109-
110-
it 'creates an image with an image path from a registry for the source code using the kpack client' do
111-
expect(client).to_not receive(:update_image)
112-
expect(client).to_not receive(:create_custom_builder)
113-
expect(client).to receive(:create_image).with(Kubeclient::Resource.new({
114-
metadata: {
115-
name: package.app.guid,
116-
namespace: 'namespace',
117-
labels: {
118-
Stager::DROPLET_GUID_LABEL_KEY => droplet.guid,
119-
Stager::APP_GUID_LABEL_KEY => package.app.guid,
120-
Stager::BUILD_GUID_LABEL_KEY => build.guid,
121-
Stager::STAGING_SOURCE_LABEL_KEY => 'STG',
122-
},
123-
annotations: {
124-
'sidecar.istio.io/inject' => 'false'
125-
}
107+
it 'creates an image with an image path from a registry for the source code using the kpack client' do
108+
expect(client).to_not receive(:update_image)
109+
expect(client).to_not receive(:create_custom_builder)
110+
expect(client).to receive(:create_image).with(Kubeclient::Resource.new({
111+
metadata: {
112+
name: package.app.guid,
113+
namespace: 'namespace',
114+
labels: {
115+
Stager::DROPLET_GUID_LABEL_KEY => droplet.guid,
116+
Stager::APP_GUID_LABEL_KEY => package.app.guid,
117+
Stager::BUILD_GUID_LABEL_KEY => build.guid,
118+
Stager::STAGING_SOURCE_LABEL_KEY => 'STG',
126119
},
127-
spec: {
128-
tag: "gcr.io/capi-images/#{package.app.guid}",
129-
serviceAccount: 'gcr-service-account',
130-
builder: {
131-
name: 'cf-default-builder',
132-
kind: 'CustomBuilder'
133-
},
134-
source: {
135-
registry: {
136-
image: "hub.example.com/user/#{package.guid}@sha256:#{package.sha256_checksum}",
137-
}
138-
},
139-
build: {
140-
env: [
141-
{ name: 'BP_JAVA_VERSION', value: '8.*' },
142-
{ name: 'BPL_HEAD_ROOM', value: '0' },
143-
]
144-
}
120+
annotations: {
121+
'sidecar.istio.io/inject' => 'false'
145122
}
146-
}))
147-
148-
stager.stage(staging_details)
149-
end
150-
end
151-
152-
context 'package image registry is not configured' do
153-
it 'creates an image with a blobstore url for the source code using the kpack client' do
154-
expect(client).to_not receive(:update_image)
155-
expect(client).to_not receive(:create_custom_builder)
156-
expect(client).to receive(:create_image).with(Kubeclient::Resource.new({
157-
metadata: {
158-
name: package.app.guid,
159-
namespace: 'namespace',
160-
labels: {
161-
Stager::DROPLET_GUID_LABEL_KEY => droplet.guid,
162-
Stager::APP_GUID_LABEL_KEY => package.app.guid,
163-
Stager::BUILD_GUID_LABEL_KEY => build.guid,
164-
Stager::STAGING_SOURCE_LABEL_KEY => 'STG',
165-
},
166-
annotations: {
167-
'sidecar.istio.io/inject' => 'false'
168-
}
123+
},
124+
spec: {
125+
tag: "gcr.io/capi-images/#{package.app.guid}",
126+
serviceAccount: 'gcr-service-account',
127+
builder: {
128+
name: 'cf-default-builder',
129+
kind: 'CustomBuilder'
169130
},
170-
spec: {
171-
tag: "gcr.io/capi-images/#{package.app.guid}",
172-
serviceAccount: 'gcr-service-account',
173-
builder: {
174-
name: 'cf-default-builder',
175-
kind: 'CustomBuilder'
176-
},
177-
source: {
178-
blob: {
179-
url: 'package-download-url',
180-
}
181-
},
182-
build: {
183-
env: [
184-
{ name: 'BP_JAVA_VERSION', value: '8.*' },
185-
{ name: 'BPL_HEAD_ROOM', value: '0' },
186-
]
131+
source: {
132+
registry: {
133+
image: "hub.example.com/user/#{package.guid}@sha256:#{package.sha256_checksum}",
187134
}
135+
},
136+
build: {
137+
env: [
138+
{ name: 'BP_JAVA_VERSION', value: '8.*' },
139+
{ name: 'BPL_HEAD_ROOM', value: '0' },
140+
]
188141
}
189-
}))
142+
}
143+
}))
190144

191-
stager.stage(staging_details)
192-
expect(blobstore_url_generator).to have_received(:package_download_url).with(package)
193-
end
145+
stager.stage(staging_details)
194146
end
195147

196148
context 'when specifying buildpacks for a build' do
@@ -323,7 +275,7 @@ module Kpack
323275
name: 'cf-autodetect-builder', # legacy Builder to verify that image update includes new CustomBuilder
324276
kind: 'Builder'
325277
},
326-
source: {
278+
source: { # here we test that blob sources can be upgraded to registry sources in-place
327279
blob: {
328280
url: 'old-package-url',
329281
}
@@ -347,7 +299,11 @@ module Kpack
347299
updated_image = Kubeclient::Resource.new(existing_image.to_hash)
348300
updated_image.metadata.labels[Kpack::Stager::BUILD_GUID_LABEL_KEY.to_sym] = build.guid
349301
updated_image.metadata.labels[Kpack::Stager::DROPLET_GUID_LABEL_KEY.to_sym] = droplet.guid
350-
updated_image.spec.source.blob.url = 'package-download-url'
302+
updated_image.spec.source = {
303+
registry: {
304+
image: "hub.example.com/user/#{package.guid}@sha256:#{package.sha256_checksum}",
305+
}
306+
}
351307
updated_image.spec.build.env = [
352308
{ name: 'FOO', value: 'BAR' }
353309
]

0 commit comments

Comments
 (0)