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

Commit 98b3ed7

Browse files
matt-royalSannidhi Jalukar
authored andcommitted
/v3/buildpacks returns Cloud Native Buildpacks
- Add KpackBuildpackListFetcher to translate K8s CRs into buildpack objects - Add request spec - Add new Kubeclient for interacting with experimental.kpack.pivotal.io api - NOTE: Filtering does not work for CNBs [#169924422] Co-authored-by: Matt Royal <mroyal@pivotal.io> Co-authored-by: Sannidhi Jalukar <sjalukar@pivotal.io>
1 parent 7eecaa1 commit 98b3ed7

12 files changed

Lines changed: 750 additions & 56 deletions

File tree

app/controllers/v3/buildpacks_controller.rb

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
require 'messages/buildpacks_list_message'
33
require 'messages/buildpack_update_message'
44
require 'messages/buildpack_upload_message'
5+
require 'fetchers/kpack_buildpack_list_fetcher'
56
require 'fetchers/buildpack_list_fetcher'
67
require 'actions/buildpack_create'
78
require 'actions/buildpack_delete'
@@ -14,14 +15,23 @@ def index
1415
message = BuildpacksListMessage.from_params(query_params)
1516
invalid_param!(message.errors.full_messages) unless message.valid?
1617

17-
dataset = BuildpackListFetcher.new.fetch_all(message, eager_loaded_associations: Presenters::V3::BuildpackPresenter.associated_resources)
18-
19-
render status: :ok, json: Presenters::V3::PaginatedListPresenter.new(
20-
presenter: Presenters::V3::BuildpackPresenter,
21-
paginated_result: SequelPaginator.new.get_page(dataset, message.try(:pagination_options)),
22-
path: '/v3/buildpacks',
23-
message: message
24-
)
18+
if VCAP::CloudController::Config.kubernetes_api_configured?
19+
dataset = KpackBuildpackListFetcher.new.fetch_all(message)
20+
render status: :ok, json: Presenters::V3::PaginatedListPresenter.new(
21+
presenter: Presenters::V3::BuildpackPresenter,
22+
paginated_result: ListPaginator.new.get_page(dataset, message.try(:pagination_options)),
23+
path: '/v3/buildpacks',
24+
message: message
25+
)
26+
else
27+
dataset = BuildpackListFetcher.new.fetch_all(message, eager_loaded_associations: Presenters::V3::BuildpackPresenter.associated_resources)
28+
render status: :ok, json: Presenters::V3::PaginatedListPresenter.new(
29+
presenter: Presenters::V3::BuildpackPresenter,
30+
paginated_result: SequelPaginator.new.get_page(dataset, message.try(:pagination_options)),
31+
path: '/v3/buildpacks',
32+
message: message
33+
)
34+
end
2535
end
2636

2737
def show
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
require 'cloud_controller/paging/sequel_paginator'
2+
require 'cloud_controller/paging/paginated_result'
3+
require 'fetchers/null_filter_query_generator'
4+
5+
module VCAP::CloudController
6+
class KpackBuildpackListFetcher
7+
def fetch_all(message)
8+
staging_namespace = VCAP::CloudController::Config.config.get(:kubernetes, :kpack, :builder_namespace)
9+
default_builder = kpack_client.get_custom_builder('cf-default-builder', staging_namespace)
10+
11+
version_map = default_builder.status.builderMetadata.each.with_object({}) do |metadata, h|
12+
h[metadata.id] = metadata.version
13+
end
14+
stack = default_builder.spec.stack
15+
created_at = Time.parse(default_builder.metadata.creationTimestamp)
16+
17+
latest_condition = default_builder.status.conditions[0]
18+
if latest_condition
19+
state = Buildpack::READY_STATE
20+
updated_at = Time.parse(latest_condition.lastTransitionTime)
21+
else
22+
state = Buildpack::CREATED_STATE
23+
updated_at = created_at
24+
end
25+
26+
default_builder.spec.order.map do |entry|
27+
name = entry.group.first.id
28+
version = version_map.fetch(name, 'unknown')
29+
KpackBuildpack.new(
30+
id: "#{name}@#{version}",
31+
name: name,
32+
filename: "#{name}@#{version}",
33+
stack: stack,
34+
state: state,
35+
created_at: created_at,
36+
updated_at: updated_at,
37+
)
38+
end
39+
end
40+
41+
private
42+
43+
def kpack_client
44+
@kpack_client ||= CloudController::DependencyLocator.instance.kpack_client
45+
end
46+
47+
class KpackBuildpack
48+
attr_reader :filename, :id, :name, :stack, :state, :created_at, :updated_at
49+
50+
def initialize(filename:, id:, name:, stack:, state:, created_at:, updated_at:)
51+
@filename = filename
52+
@id = id
53+
@name = name
54+
@stack = stack
55+
@state = state
56+
@created_at = created_at
57+
@updated_at = updated_at
58+
end
59+
60+
def guid
61+
nil
62+
end
63+
64+
def position
65+
0
66+
end
67+
68+
def enabled?
69+
true
70+
end
71+
alias_method :enabled, :enabled?
72+
73+
def locked?
74+
false
75+
end
76+
alias_method :locked, :locked?
77+
78+
def labels
79+
[]
80+
end
81+
82+
def annotations
83+
[]
84+
end
85+
end
86+
end
87+
end

config/cloud_controller.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ kubernetes:
300300
ca_file: "spec/fixtures/certs/kubernetes_ca.crt"
301301
workloads_namespace: 'cf-workloads'
302302
kpack:
303-
builder_namespace: 'cf-workloads'
303+
builder_namespace: 'cf-workloads-staging'
304304
registry_service_account_name: 'fake-registry-service-account'
305305
registry_tag_base: 'gcr.io/fake-image-repository'
306306

lib/cloud_controller/dependency_locator.rb

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -370,14 +370,23 @@ def statsd_client
370370

371371
def kpack_client
372372
kubernetes_config = VCAP::CloudController::Config.config.get(:kubernetes)
373-
kube_client = Kubernetes::KubeClientBuilder.build({
373+
service_account_token = File.open(kubernetes_config[:service_account][:token_file]).read
374+
ca_crt = File.open(kubernetes_config[:ca_file]).read
375+
build_kube_client = Kubernetes::KubeClientBuilder.build({
374376
api_group_url: "#{kubernetes_config[:host_url]}/apis/build.pivotal.io",
375377
version: 'v1alpha1',
376-
service_account_token: File.open(kubernetes_config[:service_account][:token_file]).read,
377-
ca_crt: File.open(kubernetes_config[:ca_file]).read
378+
service_account_token: service_account_token,
379+
ca_crt: ca_crt,
380+
})
381+
382+
kpack_kube_client = Kubernetes::KubeClientBuilder.build({
383+
api_group_url: "#{kubernetes_config[:host_url]}/apis/experimental.kpack.pivotal.io",
384+
version: 'v1alpha1',
385+
service_account_token: service_account_token,
386+
ca_crt: ca_crt,
378387
})
379388

380-
Kubernetes::KpackClient.new(kube_client)
389+
Kubernetes::KpackClient.new(build_kube_client: build_kube_client, kpack_kube_client: kpack_kube_client)
381390
end
382391

383392
def route_crd_client

lib/kubernetes/kpack_client.rb

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,45 @@
22

33
module Kubernetes
44
class KpackClient
5-
def initialize(kube_client)
6-
@client = kube_client
5+
def initialize(build_kube_client:, kpack_kube_client:)
6+
@build_kube_client = build_kube_client
7+
@kpack_kube_client = kpack_kube_client
78
end
89

910
def create_image(*args)
10-
@client.create_image(*args)
11+
@build_kube_client.create_image(*args)
1112
rescue Kubeclient::HttpError => e
1213
raise CloudController::Errors::ApiError.new_from_details('KpackImageError', 'create', e.message)
1314
end
1415

1516
def get_image(name, namespace)
16-
@client.get_image(name, namespace)
17+
@build_kube_client.get_image(name, namespace)
1718
rescue Kubeclient::ResourceNotFoundError
1819
nil
1920
rescue Kubeclient::HttpError => e
2021
raise CloudController::Errors::ApiError.new_from_details('KpackImageError', 'get', e.message)
2122
end
2223

2324
def update_image(*args)
24-
@client.update_image(*args)
25+
@build_kube_client.update_image(*args)
2526
rescue Kubeclient::HttpError => e
2627
raise CloudController::Errors::ApiError.new_from_details('KpackImageError', 'update', e.message)
2728
end
2829

2930
def delete_image(name, namespace)
30-
@client.delete_image(name, namespace)
31+
@build_kube_client.delete_image(name, namespace)
3132
rescue Kubeclient::ResourceNotFoundError
3233
nil
3334
rescue Kubeclient::HttpError => e
3435
raise CloudController::Errors::ApiError.new_from_details('KpackImageError', 'delete', e.message)
3536
end
37+
38+
def get_custom_builder(name, namespace)
39+
@kpack_kube_client.get_custom_builder(name, namespace)
40+
rescue Kubeclient::ResourceNotFoundError
41+
nil
42+
rescue Kubeclient::HttpError => e
43+
raise CloudController::Errors::ApiError.new_from_details('KpackCustomBuilderError', 'get', e.message)
44+
end
3645
end
3746
end

0 commit comments

Comments
 (0)