11module Kpack
22 class Stager
3- CF_DEFAULT_BUILDER_SPEC = {
3+ CF_DEFAULT_BUILDER_REFERENCE = {
44 name : 'cf-default-builder' ,
55 kind : 'CustomBuilder'
66 } . freeze
@@ -15,13 +15,13 @@ def initialize(builder_namespace:, registry_service_account_name:, registry_tag_
1515 end
1616
1717 def stage ( staging_details )
18- builder_spec = get_or_create_builder_spec ( staging_details )
18+ builder_reference = find_or_create_builder_reference ( staging_details )
1919
2020 existing_image = client . get_image ( staging_details . package . app . guid , builder_namespace )
2121 if existing_image . present?
22- client . update_image ( update_image_resource ( existing_image , staging_details , builder_spec ) )
22+ client . update_image ( update_image_resource ( existing_image , staging_details , builder_reference ) )
2323 else
24- client . create_image ( image_resource ( staging_details , builder_spec ) )
24+ client . create_image ( image_resource ( staging_details , builder_reference ) )
2525 end
2626 rescue CloudController ::Errors ::ApiError => e
2727 build = VCAP ::CloudController ::BuildModel . find ( guid : staging_details . staging_guid )
@@ -94,19 +94,36 @@ def get_environment_variables(staging_details)
9494 map { |key , value | { name : key , value : value . to_s } }
9595 end
9696
97- def get_or_create_builder_spec ( staging_details )
98- return create_custom_builder ( staging_details ) if staging_details . lifecycle . buildpack_infos . present?
97+ def find_or_create_builder_reference ( staging_details )
98+ return CF_DEFAULT_BUILDER_REFERENCE unless staging_details . lifecycle . buildpack_infos . present?
9999
100- CF_DEFAULT_BUILDER_SPEC
100+ custom_builder_name = "app-#{ staging_details . package . app . guid } "
101+ create_or_update_custom_builder ( custom_builder_name , staging_details )
102+
103+ {
104+ name : custom_builder_name ,
105+ kind : 'CustomBuilder'
106+ }
101107 end
102108
103- def create_custom_builder ( staging_details )
104- default_builder = client . get_custom_builder ( CF_DEFAULT_BUILDER_SPEC [ :name ] , builder_namespace )
109+ def create_or_update_custom_builder ( name , staging_details )
110+ existing = client . get_custom_builder ( name , builder_namespace )
111+ unless existing . present?
112+ return client . create_custom_builder ( generate_custom_builder_from_default ( name , staging_details ) )
113+ end
105114
106- custom_builder_name = "app-#{ staging_details . package . app . guid } "
107- client . create_custom_builder ( Kubeclient ::Resource . new ( {
115+ desired_custom_builder = generate_custom_builder_from_default ( name , staging_details )
116+ desired_custom_builder . metadata . resourceVersion = existing . metadata . resourceVersion
117+ desired_custom_builder . apiVersion = existing . apiVersion
118+ client . update_custom_builder ( desired_custom_builder )
119+ end
120+
121+ def generate_custom_builder_from_default ( name , staging_details )
122+ default_builder = client . get_custom_builder ( CF_DEFAULT_BUILDER_REFERENCE [ :name ] , builder_namespace )
123+ Kubeclient ::Resource . new ( {
124+ kind : 'CustomBuilder' ,
108125 metadata : {
109- name : custom_builder_name ,
126+ name : name ,
110127 namespace : builder_namespace ,
111128 labels : {
112129 APP_GUID_LABEL_KEY . to_sym => staging_details . package . app . guid ,
@@ -123,12 +140,7 @@ def create_custom_builder(staging_details)
123140 group : staging_details . lifecycle . buildpack_infos . map { |buildpack | { id : buildpack } }
124141 ]
125142 }
126- } ) )
127-
128- {
129- name : custom_builder_name ,
130- kind : 'CustomBuilder'
131- }
143+ } )
132144 end
133145
134146 def logger
0 commit comments