2020import java .time .Duration ;
2121import java .util .Optional ;
2222import org .cloudfoundry .client .CloudFoundryClient ;
23- import org .cloudfoundry .client .v2 .buildpacks .BuildpackEntity ;
24- import org .cloudfoundry .client .v2 .buildpacks .BuildpackResource ;
25- import org .cloudfoundry .client .v2 .buildpacks .CreateBuildpackResponse ;
26- import org .cloudfoundry .client .v2 .buildpacks .DeleteBuildpackResponse ;
27- import org .cloudfoundry .client .v2 .buildpacks .ListBuildpacksRequest ;
28- import org .cloudfoundry .client .v2 .buildpacks .UpdateBuildpackResponse ;
29- import org .cloudfoundry .client .v2 .buildpacks .UploadBuildpackRequest ;
30- import org .cloudfoundry .client .v2 .buildpacks .UploadBuildpackResponse ;
23+ import org .cloudfoundry .client .v3 .buildpacks .BuildpackResource ;
24+ import org .cloudfoundry .client .v3 .buildpacks .BuildpackState ;
25+ import org .cloudfoundry .client .v3 .buildpacks .CreateBuildpackResponse ;
26+ import org .cloudfoundry .client .v3 .buildpacks .GetBuildpackRequest ;
27+ import org .cloudfoundry .client .v3 .buildpacks .GetBuildpackResponse ;
28+ import org .cloudfoundry .client .v3 .buildpacks .ListBuildpacksRequest ;
29+ import org .cloudfoundry .client .v3 .buildpacks .UpdateBuildpackResponse ;
30+ import org .cloudfoundry .client .v3 .buildpacks .UploadBuildpackRequest ;
31+ import org .cloudfoundry .client .v3 .buildpacks .UploadBuildpackResponse ;
3132import org .cloudfoundry .operations .util .OperationsLogging ;
3233import org .cloudfoundry .util .ExceptionUtils ;
3334import org .cloudfoundry .util .JobUtils ;
3435import org .cloudfoundry .util .PaginationUtils ;
35- import org .cloudfoundry .util .ResourceUtils ;
3636import reactor .core .publisher .Flux ;
3737import reactor .core .publisher .Mono ;
3838import reactor .core .scheduler .Schedulers ;
39+ import reactor .util .retry .Retry ;
3940
4041public final class DefaultBuildpacks implements Buildpacks {
4142
@@ -66,8 +67,9 @@ public Mono<Void> create(CreateBuildpackRequest request) {
6667 .flatMap (
6768 response ->
6869 requestUploadBuildpackBits (
69- ResourceUtils .getId (response ), request .getBuildpack ()))
70- .then ()
70+ response .getId (), request .getBuildpack ()))
71+ .map (UploadBuildpackResponse ::getId )
72+ .flatMap (this ::waitForBuildpackReady )
7173 .transform (OperationsLogging .log ("Create Buildpack" ))
7274 .checkpoint ();
7375 }
@@ -77,7 +79,6 @@ public Mono<Void> delete(DeleteBuildpackRequest request) {
7779 return getBuildPackId (request .getName ())
7880 .flatMap (
7981 buildpackId -> deleteBuildpack (buildpackId , request .getCompletionTimeout ()))
80- .then ()
8182 .transform (OperationsLogging .log ("Delete Buildpack" ))
8283 .checkpoint ();
8384 }
@@ -105,8 +106,10 @@ public Mono<Void> update(UpdateBuildpackRequest request) {
105106 .flatMap (
106107 buildpackId ->
107108 Mono .when (
108- requestUpdateBuildpack (buildpackId , request ),
109- uploadBuildpackBits (buildpackId , request )))
109+ requestUpdateBuildpack (buildpackId , request ),
110+ uploadBuildpackBits (buildpackId , request ))
111+ .then (Mono .just (buildpackId )))
112+ .flatMap (this ::waitForBuildpackReady )
110113 .then ()
111114 .transform (OperationsLogging .log ("Update Buildpack" ))
112115 .checkpoint ();
@@ -120,23 +123,23 @@ private Mono<Void> deleteBuildpack(String buildpackId, Duration timeout) {
120123 private Mono <String > getBuildPackId (String name ) {
121124 return requestBuildpacks (name )
122125 .singleOrEmpty ()
123- .map (ResourceUtils ::getId )
126+ .map (BuildpackResource ::getId )
124127 .switchIfEmpty (ExceptionUtils .illegalArgument ("Buildpack %s not found" , name ));
125128 }
126129
127130 private Flux <BuildpackResource > requestBuildpacks (CloudFoundryClient cloudFoundryClient ) {
128- return PaginationUtils .requestClientV2Resources (
131+ return PaginationUtils .requestClientV3Resources (
129132 page ->
130133 cloudFoundryClient
131- .buildpacks ()
134+ .buildpacksV3 ()
132135 .list (ListBuildpacksRequest .builder ().page (page ).build ()));
133136 }
134137
135138 private Flux <BuildpackResource > requestBuildpacks (String name ) {
136- return PaginationUtils .requestClientV2Resources (
139+ return PaginationUtils .requestClientV3Resources (
137140 page ->
138141 cloudFoundryClient
139- .buildpacks ()
142+ .buildpacksV3 ()
140143 .list (
141144 ListBuildpacksRequest .builder ()
142145 .name (name )
@@ -150,31 +153,30 @@ private Mono<CreateBuildpackResponse> requestCreateBuildpack(
150153 Integer position ,
151154 Boolean enable ) {
152155 return cloudFoundryClient
153- .buildpacks ()
156+ .buildpacksV3 ()
154157 .create (
155- org .cloudfoundry .client .v2 .buildpacks .CreateBuildpackRequest .builder ()
158+ org .cloudfoundry .client .v3 .buildpacks .CreateBuildpackRequest .builder ()
156159 .name (buildpackName )
157160 .position (position )
158161 .enabled (Optional .ofNullable (enable ).orElse (true ))
159162 .build ());
160163 }
161164
162- private Mono <DeleteBuildpackResponse > requestDeleteBuildpack (String buildpackId ) {
165+ private Mono <String > requestDeleteBuildpack (String buildpackId ) {
163166 return cloudFoundryClient
164- .buildpacks ()
167+ .buildpacksV3 ()
165168 .delete (
166- org .cloudfoundry .client .v2 .buildpacks .DeleteBuildpackRequest .builder ()
167- .async (true )
169+ org .cloudfoundry .client .v3 .buildpacks .DeleteBuildpackRequest .builder ()
168170 .buildpackId (buildpackId )
169171 .build ());
170172 }
171173
172174 private Mono <UpdateBuildpackResponse > requestUpdateBuildpack (
173175 String buildpackId , UpdateBuildpackRequest request ) {
174176 return cloudFoundryClient
175- .buildpacks ()
177+ .buildpacksV3 ()
176178 .update (
177- org .cloudfoundry .client .v2 .buildpacks .UpdateBuildpackRequest .builder ()
179+ org .cloudfoundry .client .v3 .buildpacks .UpdateBuildpackRequest .builder ()
178180 .buildpackId (buildpackId )
179181 .enabled (request .getEnable ())
180182 .locked (request .getLock ())
@@ -184,9 +186,9 @@ private Mono<UpdateBuildpackResponse> requestUpdateBuildpack(
184186
185187 private Mono <UpdateBuildpackResponse > requestUpdateBuildpack (String buildpackId , String name ) {
186188 return cloudFoundryClient
187- .buildpacks ()
189+ .buildpacksV3 ()
188190 .update (
189- org .cloudfoundry .client .v2 .buildpacks .UpdateBuildpackRequest .builder ()
191+ org .cloudfoundry .client .v3 .buildpacks .UpdateBuildpackRequest .builder ()
190192 .buildpackId (buildpackId )
191193 .name (name )
192194 .build ());
@@ -195,22 +197,19 @@ private Mono<UpdateBuildpackResponse> requestUpdateBuildpack(String buildpackId,
195197 private Mono <UploadBuildpackResponse > requestUploadBuildpackBits (
196198 String buildpackId , Path buildpack ) {
197199 return cloudFoundryClient
198- .buildpacks ()
200+ .buildpacksV3 ()
199201 .upload (
200202 UploadBuildpackRequest .builder ()
201203 .buildpackId (buildpackId )
202- .filename (buildpack .getFileName ().toString ())
203- .buildpack (buildpack )
204+ .bits (buildpack )
204205 .build ());
205206 }
206207
207- private Buildpack toBuildpackResource (BuildpackResource resource ) {
208- BuildpackEntity entity = ResourceUtils .getEntity (resource );
209-
208+ private Buildpack toBuildpackResource (BuildpackResource entity ) {
210209 return Buildpack .builder ()
211210 .enabled (entity .getEnabled ())
212211 .filename (entity .getFilename ())
213- .id (ResourceUtils .getId (resource ))
212+ .id (entity .getId ())
214213 .locked (entity .getLocked ())
215214 .name (entity .getName ())
216215 .position (entity .getPosition ())
@@ -226,4 +225,23 @@ private Mono<Void> uploadBuildpackBits(String buildpackId, UpdateBuildpackReques
226225
227226 return Mono .empty ();
228227 }
228+
229+ private Mono <Void > waitForBuildpackReady (String buildpackId ) {
230+ return requestBuildpack (buildpackId )
231+ .flatMap (
232+ buildpack -> {
233+ if (!buildpack .getState ().equals (BuildpackState .READY )) {
234+ return Mono .error (new IllegalStateException ("Not ready" ));
235+ }
236+ return Mono .empty ();
237+ })
238+ .retryWhen (Retry .backoff (3 , Duration .ofSeconds (1 )))
239+ .then ();
240+ }
241+
242+ private Mono <GetBuildpackResponse > requestBuildpack (String buildpackId ) {
243+ return cloudFoundryClient
244+ .buildpacksV3 ()
245+ .get (GetBuildpackRequest .builder ().buildpackId (buildpackId ).build ());
246+ }
229247}
0 commit comments