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

Commit 60a874d

Browse files
Jaskanwal PawarAlex Standkesethboyleschristianangndhanushkodi
committed
Create route CRDs when a route is mapped
- Removed a few calls to deprecated Copilot component - Applies to v2 route mapping and v3 route mappings (destinations) [#171826991] Co-authored-by: Alex Standke <astandke@vmware.com> Co-authored-by: Seth Boyles <sboyles@pivotal.io> Co-authored-by: Christian Ang <cang@pivotal.io> Co-authored-by: Nitya Dhanushkodi <ndhanushkodi@pivotal.io> Co-authored-by: Renee Chu <rchu@pivotal.io> Co-authored-by: Piyali Banerjee <pbanerjee@pivotal.io> Co-authored-by: Tim Downey <tdowney@vmware.com>
1 parent 1ebab1c commit 60a874d

32 files changed

Lines changed: 675 additions & 100 deletions

app/actions/route_create.rb

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ def create(message:, space:, domain:)
1111
route = Route.new(
1212
host: message.host || '',
1313
path: message.path || '',
14-
space_guid: message.space_guid,
15-
domain_guid: message.domain_guid
14+
space: space,
15+
domain: domain,
1616
)
1717

1818
Route.db.transaction do
@@ -27,13 +27,26 @@ def create(message:, space:, domain:)
2727
message.audit_hash,
2828
manifest_triggered: false,
2929
)
30+
31+
if kubernetes_api_configured?
32+
route_crd_client.create_route(route)
33+
end
34+
3035
route
3136
rescue Sequel::ValidationFailed => e
3237
validation_error!(e, route.host, route.path, space, domain)
3338
end
3439

3540
private
3641

42+
def route_crd_client
43+
@route_crd_client ||= CloudController::DependencyLocator.instance.route_crd_client
44+
end
45+
46+
def kubernetes_api_configured?
47+
!!VCAP::CloudController::Config.config.get(:kubernetes, :host_url)
48+
end
49+
3750
def validation_error!(error, host, path, space, domain)
3851
if error.errors.on(:domain)&.include?(:invalid_relation)
3952
error!("Invalid domain. Domain '#{domain.name}' is not available in organization '#{space.organization.name}'.")

app/actions/update_route_destinations.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,13 @@ def update(route, to_add, to_delete, user_audit_info, manifest_triggered)
9696
end
9797

9898
route.reload
99+
100+
if kubernetes_api_configured?
101+
client = route_crd_client
102+
client.update_destinations(route)
103+
end
104+
105+
route
99106
end
100107

101108
def update_processes(processes_to_ports_map)
@@ -160,6 +167,14 @@ def destination_to_mapping_hash(route, destination)
160167
}
161168
end
162169

170+
def route_crd_client
171+
CloudController::DependencyLocator.instance.route_crd_client
172+
end
173+
174+
def kubernetes_api_configured?
175+
!!VCAP::CloudController::Config.config.get(:kubernetes, :host_url)
176+
end
177+
163178
def validate_unique!(new_route_mappings)
164179
raise DuplicateDestinationError.new('Destinations cannot contain duplicate entries') if new_route_mappings.any? { |rm| new_route_mappings.count(rm) > 1 }
165180
end

app/actions/v2/route_create.rb

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,30 @@ def initialize(access_validator:, logger:)
77
end
88

99
def create_route(route_hash:)
10-
Route.db.transaction do
11-
route = Route.create_from_hash(route_hash)
12-
@access_validator.validate_access(:create, route)
10+
route = Route.db.transaction do
11+
r = Route.create_from_hash(route_hash)
12+
access_validator.validate_access(:create, r)
1313

14-
Copilot::Adapter.create_route(route)
14+
r
15+
end
1516

16-
route
17+
if kubernetes_api_configured?
18+
route_crd_client.create_route(route)
1719
end
20+
21+
route
22+
end
23+
24+
private
25+
26+
attr_reader :access_validator
27+
28+
def route_crd_client
29+
@route_crd_client ||= CloudController::DependencyLocator.instance.route_crd_client
30+
end
31+
32+
def kubernetes_api_configured?
33+
!!VCAP::CloudController::Config.config.get(:kubernetes, :host_url)
1834
end
1935
end
2036
end

app/actions/v2/route_mapping_create.rb

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,16 @@ def add
4242
route_mapping.save
4343
route_handler.update_route_information
4444

45-
Copilot::Adapter.map_route(route_mapping)
46-
4745
app_event_repository.record_map_route(
4846
user_audit_info,
4947
route_mapping
5048
)
5149
end
5250

51+
if kubernetes_api_configured?
52+
route_crd_client.update_destinations(route_mapping.route)
53+
end
54+
5355
route_mapping
5456
rescue Sequel::ValidationFailed => e
5557
if e.errors && e.errors.on([:app_guid, :route_guid, :process_type, :app_port]) && e.errors.on([:app_guid, :route_guid, :process_type, :app_port]).include?(:unique)
@@ -63,6 +65,10 @@ def add
6365

6466
attr_reader :request_attrs, :user_audit_info, :app, :route, :process
6567

68+
def route_crd_client
69+
@route_crd_client ||= CloudController::DependencyLocator.instance.route_crd_client
70+
end
71+
6672
def requested_port
6773
@requested_port ||= request_attrs.key?('app_port') ? request_attrs['app_port'] : process.ports.try(:first)
6874
end
@@ -123,6 +129,10 @@ def validate_routing_api_enabled!
123129
raise RoutingApiDisabledError.new('Routing API is disabled')
124130
end
125131
end
132+
133+
def kubernetes_api_configured?
134+
!!VCAP::CloudController::Config.config.get(:kubernetes, :host_url)
135+
end
126136
end
127137
end
128138
end

app/actions/v3/route_create.rb

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,23 @@ class RouteCreate
44
class << self
55
def create_route(route_hash:, logger:, user_audit_info:, manifest_triggered: false)
66
route = Route.create_from_hash(route_hash)
7-
8-
Copilot::Adapter.create_route(route)
7+
if kubernetes_api_configured?
8+
client = route_crd_client
9+
client.create_route(route)
10+
end
911

1012
Repositories::RouteEventRepository.new.record_route_create(route, user_audit_info, route_hash, manifest_triggered: manifest_triggered)
1113

1214
route
1315
end
16+
17+
def route_crd_client
18+
CloudController::DependencyLocator.instance.route_crd_client
19+
end
20+
21+
def kubernetes_api_configured?
22+
!!VCAP::CloudController::Config.config.get(:kubernetes, :host_url)
23+
end
1424
end
1525
end
1626
end

config/cloud_controller.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ kubernetes:
296296
service_account:
297297
token_file: "spec/fixtures/service_accounts/k8s.token"
298298
ca_file: "spec/fixtures/certs/kubernetes_ca.crt"
299+
workloads_namespace: 'cf-workloads'
299300
kpack:
300301
builder_namespace: 'cf-workloads'
301302
registry_service_account_name: 'fake-registry-service-account'

lib/cloud_controller/config_schemas/api_schema.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,7 @@ class ApiSchema < VCAP::Config
360360
token_file: String,
361361
},
362362
ca_file: String,
363+
workloads_namespace: String,
363364
optional(:kpack) => {
364365
builder_namespace: String,
365366
registry_service_account_name: String,

lib/cloud_controller/config_schemas/deployment_updater_schema.rb

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -95,16 +95,14 @@ class DeploymentUpdaterSchema < VCAP::Config
9595
key_file: String
9696
},
9797

98-
optional(:copilot) => {
99-
enabled: bool,
100-
optional(:host) => String,
101-
optional(:port) => Integer,
102-
optional(:client_ca_file) => String,
103-
optional(:client_key_file) => String,
104-
optional(:client_chain_file) => String,
105-
optional(:temporary_istio_domains) => Array,
98+
optional(:kubernetes) => {
99+
host_url: String,
100+
service_account: {
101+
token_file: String,
102+
},
103+
ca_file: String,
104+
workloads_namespace: String,
106105
},
107-
108106
staging: {
109107
timeout_in_seconds: Integer,
110108
auth: {

lib/cloud_controller/config_schemas/worker_schema.rb

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -197,20 +197,21 @@ class WorkerSchema < VCAP::Config
197197
optional(:diego_sync) => { timeout_in_seconds: Integer },
198198
},
199199

200-
optional(:copilot) => {
201-
enabled: bool,
202-
optional(:host) => String,
203-
optional(:port) => Integer,
204-
optional(:client_ca_file) => String,
205-
optional(:client_key_file) => String,
206-
optional(:client_chain_file) => String,
207-
},
208200
volume_services_enabled: bool,
209201
route_services_enabled: bool,
210202

211203
max_labels_per_resource: Integer,
212204
max_annotations_per_resource: Integer,
213205
internal_route_vip_range: String,
206+
207+
optional(:kubernetes) => {
208+
host_url: String,
209+
service_account: {
210+
token_file: String,
211+
},
212+
ca_file: String,
213+
workloads_namespace: String,
214+
},
214215
}
215216
end
216217
# rubocop:enable Metrics/BlockLength

lib/cloud_controller/dependency_locator.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
require 'repositories/route_event_repository'
66
require 'repositories/user_event_repository'
77
require 'kubernetes/kpack_client'
8+
require 'kubernetes/route_crd_client'
89
require 'cloud_controller/rest_controller/object_renderer'
910
require 'cloud_controller/rest_controller/paginated_collection_renderer'
1011
require 'cloud_controller/upload_handler'
@@ -379,6 +380,18 @@ def kpack_client
379380
Kubernetes::KpackClient.new(kube_client)
380381
end
381382

383+
def route_crd_client
384+
kubernetes_config = VCAP::CloudController::Config.config.get(:kubernetes)
385+
kube_client = Kubernetes::KubeClientBuilder.build({
386+
api_group_url: "#{kubernetes_config[:host_url]}/apis/networking.cloudfoundry.org",
387+
version: 'v1alpha1',
388+
service_account_token: File.open(kubernetes_config[:service_account][:token_file]).read,
389+
ca_crt: File.open(kubernetes_config[:ca_file]).read
390+
})
391+
392+
Kubernetes::RouteCrdClient.new(kube_client)
393+
end
394+
382395
private
383396

384397
def build_stager_client

0 commit comments

Comments
 (0)