Skip to content

Commit

Permalink
update to kpack v0.1.2
Browse files Browse the repository at this point in the history
- major breaking changes in this kpack version
that renamed many of the kpack resources and api groups

[#174413920]

Co-authored-by: Jaskanwal Pawar <[email protected]>
Co-authored-by: Tim Downey <[email protected]>
  • Loading branch information
Jaskanwal Pawar and tcdowney committed Sep 22, 2020
1 parent 1ea8e8b commit 6a3186a
Show file tree
Hide file tree
Showing 26 changed files with 189 additions and 170 deletions.
2 changes: 1 addition & 1 deletion app/actions/app_delete.rb
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ def delete(apps, record_event: true)
app.guid,
VCAP::CloudController::Config.config.kpack_builder_namespace,
)
k8s_api_client.delete_custom_builder(
k8s_api_client.delete_builder(
"app-#{app.guid}",
VCAP::CloudController::Config.config.kpack_builder_namespace,
)
Expand Down
2 changes: 1 addition & 1 deletion app/fetchers/kpack_buildpack_list_fetcher.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ module VCAP::CloudController
class KpackBuildpackListFetcher
def fetch_all(message=EmptyBuildpackListMessage)
staging_namespace = VCAP::CloudController::Config.config.kpack_builder_namespace
default_builder = k8s_api_client.get_custom_builder('cf-default-builder', staging_namespace)
default_builder = k8s_api_client.get_builder('cf-default-builder', staging_namespace)

version_map = default_builder.status.builderMetadata.each.with_object({}) do |metadata, h|
h[metadata.id] = metadata.version
Expand Down
4 changes: 2 additions & 2 deletions errors/v2.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1310,6 +1310,6 @@
message: "Failed to %s Image resource for staging: '%s'"

400003:
name: KpackCustomBuilderError
name: KpackBuilderError
http_code: 422
message: "Failed to %s CustomBuilder resource: '%s'"
message: "Failed to %s Builder resource: '%s'"
4 changes: 2 additions & 2 deletions lib/cloud_controller/dependency_locator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -374,14 +374,14 @@ def statsd_client
def k8s_api_client
config = VCAP::CloudController::Config.config
build_kube_client = Kubernetes::KubeClientBuilder.build(
api_group_url: "#{config.kubernetes_host_url}/apis/build.pivotal.io",
api_group_url: "#{config.kubernetes_host_url}/apis/kpack.io",
version: 'v1alpha1',
service_account_token: config.kubernetes_service_account_token,
ca_crt: config.kubernetes_ca_cert,
)

kpack_kube_client = Kubernetes::KubeClientBuilder.build(
api_group_url: "#{config.kubernetes_host_url}/apis/experimental.kpack.pivotal.io",
api_group_url: "#{config.kubernetes_host_url}/apis/kpack.io",
version: 'v1alpha1',
service_account_token: config.kubernetes_service_account_token,
ca_crt: config.kubernetes_ca_cert,
Expand Down
34 changes: 17 additions & 17 deletions lib/cloud_controller/kpack/stager.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ module Kpack
class Stager
CF_DEFAULT_BUILDER_REFERENCE = {
name: 'cf-default-builder',
kind: 'CustomBuilder'
kind: 'Builder'
}.freeze
APP_GUID_LABEL_KEY = 'cloudfoundry.org/app_guid'.freeze
BUILD_GUID_LABEL_KEY = 'cloudfoundry.org/build_guid'.freeze
Expand Down Expand Up @@ -111,33 +111,33 @@ def get_environment_variables(staging_details)
def find_or_create_builder_reference(staging_details)
return CF_DEFAULT_BUILDER_REFERENCE unless staging_details.lifecycle.buildpack_infos.present?

custom_builder_name = "app-#{staging_details.package.app.guid}"
create_or_update_custom_builder(custom_builder_name, staging_details)
builder_name = "app-#{staging_details.package.app.guid}"
create_or_update_builder(builder_name, staging_details)

{
name: custom_builder_name,
kind: 'CustomBuilder'
name: builder_name,
kind: 'Builder'
}
end

def create_or_update_custom_builder(name, staging_details)
desired_custom_builder = generate_custom_builder_from_default(name, staging_details)
def create_or_update_builder(name, staging_details)
desired_builder = generate_builder_from_default(name, staging_details)

unless client.get_custom_builder(name, builder_namespace).present?
return client.create_custom_builder(desired_custom_builder)
unless client.get_builder(name, builder_namespace).present?
return client.create_builder(desired_builder)
end

reapply_client.apply_custom_builder_update(name, builder_namespace) do |existing_custom_builder|
desired_custom_builder.metadata.resourceVersion = existing_custom_builder.metadata.resourceVersion
desired_custom_builder.apiVersion = existing_custom_builder.apiVersion
desired_custom_builder
reapply_client.apply_builder_update(name, builder_namespace) do |existing_builder|
desired_builder.metadata.resourceVersion = existing_builder.metadata.resourceVersion
desired_builder.apiVersion = existing_builder.apiVersion
desired_builder
end
end

def generate_custom_builder_from_default(name, staging_details)
default_builder = client.get_custom_builder(CF_DEFAULT_BUILDER_REFERENCE[:name], builder_namespace)
def generate_builder_from_default(name, staging_details)
default_builder = client.get_builder(CF_DEFAULT_BUILDER_REFERENCE[:name], builder_namespace)
Kubeclient::Resource.new({
kind: 'CustomBuilder',
kind: 'Builder',
metadata: {
name: name,
namespace: builder_namespace,
Expand All @@ -151,7 +151,7 @@ def generate_custom_builder_from_default(name, staging_details)
serviceAccount: default_builder.spec.serviceAccount,
stack: default_builder.spec.stack,
store: default_builder.spec.store,
tag: "#{registry_tag_base}/#{staging_details.package.app.guid}-custom-builder",
tag: "#{registry_tag_base}/#{staging_details.package.app.guid}-builder",
order: [
group: staging_details.lifecycle.buildpack_infos.map { |buildpack| { id: buildpack } }
]
Expand Down
32 changes: 16 additions & 16 deletions lib/kubernetes/api_client.rb
Original file line number Diff line number Diff line change
Expand Up @@ -89,45 +89,45 @@ def delete_route(name, namespace)
raise error
end

def update_custom_builder(resource_config)
@kpack_kube_client.update_custom_builder(resource_config)
def update_builder(resource_config)
@kpack_kube_client.update_builder(resource_config)
rescue Kubeclient::HttpError => e
logger.error('update_custom_builder', error: e.inspect, response: e.response, backtrace: e.backtrace)
logger.error('update_builder', error: e.inspect, response: e.response, backtrace: e.backtrace)

raise ConflictError.new("Conflict on update of #{resource_name(resource_config)}") if e.error_code == 409

error = CloudController::Errors::ApiError.new_from_details('KpackCustomBuilderError', 'update', e.message)
error = CloudController::Errors::ApiError.new_from_details('KpackBuilderError', 'update', e.message)
error.set_backtrace(e.backtrace)
raise error
end

def create_custom_builder(resource_config)
@kpack_kube_client.create_custom_builder(resource_config)
def create_builder(resource_config)
@kpack_kube_client.create_builder(resource_config)
rescue Kubeclient::HttpError => e
logger.error('create_custom_builder', error: e.inspect, response: e.response, backtrace: e.backtrace)
error = CloudController::Errors::ApiError.new_from_details('KpackCustomBuilderError', 'create', e.message)
logger.error('create_builder', error: e.inspect, response: e.response, backtrace: e.backtrace)
error = CloudController::Errors::ApiError.new_from_details('KpackBuilderError', 'create', e.message)
error.set_backtrace(e.backtrace)
raise error
end

def delete_custom_builder(name, namespace)
@kpack_kube_client.delete_custom_builder(name, namespace)
def delete_builder(name, namespace)
@kpack_kube_client.delete_builder(name, namespace)
rescue Kubeclient::ResourceNotFoundError
nil
rescue Kubeclient::HttpError => e
logger.error('delete_custom_builder', error: e.inspect, response: e.response, backtrace: e.backtrace)
error = CloudController::Errors::ApiError.new_from_details('KpackCustomBuilderError', 'delete', e.message)
logger.error('delete_builder', error: e.inspect, response: e.response, backtrace: e.backtrace)
error = CloudController::Errors::ApiError.new_from_details('KpackBuilderError', 'delete', e.message)
error.set_backtrace(e.backtrace)
raise error
end

def get_custom_builder(name, namespace)
@kpack_kube_client.get_custom_builder(name, namespace)
def get_builder(name, namespace)
@kpack_kube_client.get_builder(name, namespace)
rescue Kubeclient::ResourceNotFoundError
nil
rescue Kubeclient::HttpError => e
logger.error('get_custom_builder', error: e.inspect, response: e.response, backtrace: e.backtrace)
error = CloudController::Errors::ApiError.new_from_details('KpackCustomBuilderError', 'get', e.message)
logger.error('get_builder', error: e.inspect, response: e.response, backtrace: e.backtrace)
error = CloudController::Errors::ApiError.new_from_details('KpackBuilderError', 'get', e.message)
error.set_backtrace(e.backtrace)
raise error
end
Expand Down
4 changes: 2 additions & 2 deletions lib/kubernetes/update_reapply_client.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,11 @@ def apply_image_update(name, namespace, &block)
end
end

def apply_custom_builder_update(name, namespace, &block)
def apply_builder_update(name, namespace, &block)
raise MalformedBlockError if block.arity != 1

retry_on_conflict do
@client.update_custom_builder(block.call(@client.get_custom_builder(name, namespace)))
@client.update_builder(block.call(@client.get_builder(name, namespace)))
end
end

Expand Down
2 changes: 1 addition & 1 deletion spec/api/documentation/apps_api_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ def self.fields_info(required)
end

describe 'Standard endpoints' do
let(:k8s_api_client) { instance_double(Kubernetes::ApiClient, delete_image: nil, delete_custom_builder: nil) }
let(:k8s_api_client) { instance_double(Kubernetes::ApiClient, delete_image: nil, delete_builder: nil) }

before do
allow(CloudController::DependencyLocator.instance).to receive(:k8s_api_client).and_return(k8s_api_client)
Expand Down
57 changes: 29 additions & 28 deletions spec/kubernetes/update_reapply_client_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -141,31 +141,32 @@ module Kubernetes
end
end

describe '#apply_custom_builder_update' do
let(:name) { 'custom_builder' }
let(:remote_custom_builder) { Kubeclient::Resource.new(
kind: 'CustomBuilder',
metadata: {
'cloudfoundry.org/bogus_guid' => 'bogus',
},
spec: {
host: 'internet',
},
)
}
describe '#apply_builder_update' do
let(:name) { 'builder' }
let(:remote_builder) do
Kubeclient::Resource.new(
kind: 'Builder',
metadata: {
'cloudfoundry.org/bogus_guid' => 'bogus',
},
spec: {
host: 'internet',
},
)
end

before do
allow(api_client).to receive(:get_custom_builder).with(name, namespace).and_return(remote_custom_builder)
allow(api_client).to receive(:update_custom_builder)
allow(api_client).to receive(:get_builder).with(name, namespace).and_return(remote_builder)
allow(api_client).to receive(:update_builder)
end

it 'applies the update in the block' do
reapply_client.apply_custom_builder_update(name, namespace) do |remote_custom_builder|
remote_custom_builder.spec.domain = 'website.biz'
remote_custom_builder
reapply_client.apply_builder_update(name, namespace) do |remote_builder|
remote_builder.spec.domain = 'website.biz'
remote_builder
end

expect(api_client).to have_received(:update_custom_builder) do |update|
expect(api_client).to have_received(:update_builder) do |update|
expect(update.spec.domain).to eq('website.biz')
expect(update.spec.host).to eq('internet')
end
Expand All @@ -176,32 +177,32 @@ module Kubernetes

before do
# raise a 409 twice, then succeed
expect(api_client).to receive(:update_custom_builder).once.with(any_args).and_raise(error)
expect(api_client).to receive(:update_custom_builder).once.with(any_args).and_raise(error)
expect(api_client).to receive(:update_custom_builder).once.with(any_args)
expect(api_client).to receive(:update_builder).once.with(any_args).and_raise(error)
expect(api_client).to receive(:update_builder).once.with(any_args).and_raise(error)
expect(api_client).to receive(:update_builder).once.with(any_args)
end

it 'retries 3 times, fetching the custom_builder to patch each time' do
it 'retries 3 times, fetching the builder to patch each time' do
expect {
reapply_client.apply_custom_builder_update(name, namespace) do |custom_builder|
custom_builder.spec = {}
custom_builder
reapply_client.apply_builder_update(name, namespace) do |builder|
builder.spec = {}
builder
end
}.not_to raise_error

expect(api_client).to have_received(:get_custom_builder).exactly(3).times
expect(api_client).to have_received(:get_builder).exactly(3).times
end
end

it 'errors when no block is provided' do
expect do
reapply_client.apply_custom_builder_update(name, namespace)
reapply_client.apply_builder_update(name, namespace)
end.to raise_error(NoMethodError)
end

it 'errors when the block provided doesnt take an arg' do
expect do
reapply_client.apply_custom_builder_update(name, namespace) do
reapply_client.apply_builder_update(name, namespace) do
puts 'lul'
end
end.to raise_error(UpdateReapplyClient::MalformedBlockError)
Expand Down
2 changes: 1 addition & 1 deletion spec/request/apps_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1519,7 +1519,7 @@
let!(:process) { VCAP::CloudController::ProcessModel.make(app: app_model) }
let!(:deployment) { VCAP::CloudController::DeploymentModel.make(app: app_model) }
let(:user_email) { nil }
let(:k8s_api_client) { instance_double(Kubernetes::ApiClient, delete_image: nil, delete_custom_builder: nil) }
let(:k8s_api_client) { instance_double(Kubernetes::ApiClient, delete_image: nil, delete_builder: nil) }

before do
space.organization.add_user(user)
Expand Down
26 changes: 13 additions & 13 deletions spec/request/buildpacks_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -282,19 +282,19 @@
let(:kubernetes_api_url) { 'https://kube.example.com' }

before do
stub_request(:get, "#{kubernetes_api_url}/apis/experimental.kpack.pivotal.io/v1alpha1").to_return(
stub_request(:get, "#{kubernetes_api_url}/apis/kpack.io/v1alpha1").to_return(
status: 200,
body: '
{
"kind": "APIResourceList",
"apiVersion": "v1",
"groupVersion": "experimental.kpack.pivotal.io/v1alpha1",
"groupVersion": "kpack.io/v1alpha1",
"resources": [
{
"name": "custombuilders",
"singularName": "custombuilder",
"name": "builders",
"singularName": "builder",
"namespaced": true,
"kind": "CustomBuilder",
"kind": "Builder",
"verbs": [
"delete",
"deletecollection",
Expand All @@ -314,10 +314,10 @@
"storageVersionHash": "2afHeqawAfQ="
},
{
"name": "custombuilders/status",
"name": "builders/status",
"singularName": "",
"namespaced": true,
"kind": "CustomBuilder",
"kind": "Builder",
"verbs": [
"get",
"patch",
Expand All @@ -328,18 +328,18 @@
}
'
)
stub_request(:get, "#{kubernetes_api_url}/apis/experimental.kpack.pivotal.io/v1alpha1/namespaces/cf-workloads-staging/custombuilders/cf-default-builder").
stub_request(:get, "#{kubernetes_api_url}/apis/kpack.io/v1alpha1/namespaces/cf-workloads-staging/builders/cf-default-builder").
to_return(
status: 200,
# rubocop:disable Layout/LineLength
body: '
{
"apiVersion": "experimental.kpack.pivotal.io/v1alpha1",
"kind": "CustomBuilder",
"apiVersion": "kpack.io/v1alpha1",
"kind": "Builder",
"metadata": {
"annotations": {
"kapp.k14s.io/identity": "v1;cf-workloads-staging/experimental.kpack.pivotal.io/CustomBuilder/cf-default-builder;experimental.kpack.pivotal.io/v1alpha1",
"kapp.k14s.io/original": "{\"apiVersion\":\"experimental.kpack.pivotal.io/v1alpha1\",\"kind\":\"CustomBuilder\",\"metadata\":{\"labels\":{\"kapp.k14s.io/app\":\"1593227539339407000\",\"kapp.k14s.io/association\":\"v1.b29251cc7bb0f9e1950aad9f9ea1d82a\"},\"name\":\"cf-default-builder\",\"namespace\":\"cf-workloads-staging\"},\"spec\":{\"order\":[{\"group\":[{\"id\":\"paketo-community/ruby\"}]},{\"group\":[{\"id\":\"paketo-community/python\"}]},{\"group\":[{\"id\":\"paketo-buildpacks/java\"}]},{\"group\":[{\"id\":\"paketo-buildpacks/nodejs\"}]},{\"group\":[{\"id\":\"paketo-buildpacks/go\"}]},{\"group\":[{\"id\":\"paketo-buildpacks/dotnet-core\"}]},{\"group\":[{\"id\":\"paketo-buildpacks/php\"}]},{\"group\":[{\"id\":\"paketo-buildpacks/httpd\"}]},{\"group\":[{\"id\":\"paketo-buildpacks/nginx\"}]},{\"group\":[{\"id\":\"paketo-buildpacks/procfile\"}]}],\"serviceAccount\":\"cc-kpack-registry-service-account\",\"stack\":\"cflinuxfs3-stack\",\"store\":\"cf-buildpack-store\",\"tag\":\"gcr.io/cf-capi-arya/cf-workloads/cf-default-builder\"}}",
"kapp.k14s.io/identity": "v1;cf-workloads-staging/kpack.io/Builder/cf-default-builder;kpack.io/v1alpha1",
"kapp.k14s.io/original": "{\"apiVersion\":\"kpack.io/v1alpha1\",\"kind\":\"Builder\",\"metadata\":{\"labels\":{\"kapp.k14s.io/app\":\"1593227539339407000\",\"kapp.k14s.io/association\":\"v1.b29251cc7bb0f9e1950aad9f9ea1d82a\"},\"name\":\"cf-default-builder\",\"namespace\":\"cf-workloads-staging\"},\"spec\":{\"order\":[{\"group\":[{\"id\":\"paketo-community/ruby\"}]},{\"group\":[{\"id\":\"paketo-community/python\"}]},{\"group\":[{\"id\":\"paketo-buildpacks/java\"}]},{\"group\":[{\"id\":\"paketo-buildpacks/nodejs\"}]},{\"group\":[{\"id\":\"paketo-buildpacks/go\"}]},{\"group\":[{\"id\":\"paketo-buildpacks/dotnet-core\"}]},{\"group\":[{\"id\":\"paketo-buildpacks/php\"}]},{\"group\":[{\"id\":\"paketo-buildpacks/httpd\"}]},{\"group\":[{\"id\":\"paketo-buildpacks/nginx\"}]},{\"group\":[{\"id\":\"paketo-buildpacks/procfile\"}]}],\"serviceAccount\":\"cc-kpack-registry-service-account\",\"stack\":\"cflinuxfs3-stack\",\"store\":\"cf-buildpack-store\",\"tag\":\"gcr.io/cf-capi-arya/cf-workloads/cf-default-builder\"}}",
"kapp.k14s.io/original-diff-md5": "c6e94dc94aed3401b5d0f26ed6c0bff3"
},
"creationTimestamp": "2020-06-27T03:13:07Z",
Expand All @@ -351,7 +351,7 @@
"name": "cf-default-builder",
"namespace": "cf-workloads-staging",
"resourceVersion": "5467789",
"selfLink": "/apis/experimental.kpack.pivotal.io/v1alpha1/namespaces/cf-workloads-staging/custombuilders/cf-default-builder",
"selfLink": "/apis/kpack.io/v1alpha1/namespaces/cf-workloads-staging/builders/cf-default-builder",
"uid": "82ede34e-20ae-4d81-8813-ac57134d4062"
},
"spec": {
Expand Down
8 changes: 4 additions & 4 deletions spec/request/builds_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -141,10 +141,10 @@
before do
allow(CloudController::DependencyLocator.instance).to receive(:k8s_api_client).and_return(k8s_api_client)
allow(k8s_api_client).to receive(:create_image)
allow(k8s_api_client).to receive(:create_custom_builder)
allow(k8s_api_client).to receive(:update_custom_builder)
allow(k8s_api_client).to receive(:create_builder)
allow(k8s_api_client).to receive(:update_builder)
allow(k8s_api_client).to receive(:get_image)
allow(k8s_api_client).to receive(:get_custom_builder).and_return(Kubeclient::Resource.new({
allow(k8s_api_client).to receive(:get_builder).and_return(Kubeclient::Resource.new({
metadata: {
creationTimestamp: '1/1',
},
Expand Down Expand Up @@ -209,7 +209,7 @@
expect(parsed_response['lifecycle']['data']['buildpacks']).to eq ['paketo-buildpacks/java', 'paketo-community/ruby']
expect(parsed_response['state']).to eq 'STAGING'

expect(k8s_api_client).to have_received(:update_custom_builder)
expect(k8s_api_client).to have_received(:update_builder)
end
end

Expand Down
Loading

0 comments on commit 6a3186a

Please sign in to comment.