Skip to content

Commit c59d646

Browse files
committed
DefaultBuildpacks: use V3 api
Signed-off-by: Daniel Garnier-Moiroux <[email protected]>
1 parent 6d26914 commit c59d646

File tree

4 files changed

+110
-104
lines changed

4 files changed

+110
-104
lines changed

cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/buildpacks/DefaultBuildpacks.java

Lines changed: 54 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,23 @@
2020
import java.time.Duration;
2121
import java.util.Optional;
2222
import 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;
3132
import org.cloudfoundry.operations.util.OperationsLogging;
3233
import org.cloudfoundry.util.ExceptionUtils;
3334
import org.cloudfoundry.util.JobUtils;
3435
import org.cloudfoundry.util.PaginationUtils;
35-
import org.cloudfoundry.util.ResourceUtils;
3636
import reactor.core.publisher.Flux;
3737
import reactor.core.publisher.Mono;
3838
import reactor.core.scheduler.Schedulers;
39+
import reactor.util.retry.Retry;
3940

4041
public 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
}

cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/AbstractOperationsTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import org.cloudfoundry.client.v2.userprovidedserviceinstances.UserProvidedServiceInstances;
4545
import org.cloudfoundry.client.v2.users.Users;
4646
import org.cloudfoundry.client.v3.applications.ApplicationsV3;
47+
import org.cloudfoundry.client.v3.buildpacks.BuildpacksV3;
4748
import org.cloudfoundry.client.v3.domains.DomainsV3;
4849
import org.cloudfoundry.client.v3.jobs.JobsV3;
4950
import org.cloudfoundry.client.v3.organizations.OrganizationsV3;
@@ -92,6 +93,7 @@ public abstract class AbstractOperationsTest {
9293
protected final Authorizations authorizations = mock(Authorizations.class, RETURNS_SMART_NULLS);
9394

9495
protected final Buildpacks buildpacks = mock(Buildpacks.class, RETURNS_SMART_NULLS);
96+
protected final BuildpacksV3 buildpacksV3 = mock(BuildpacksV3.class, RETURNS_SMART_NULLS);
9597

9698
protected final CloudFoundryClient cloudFoundryClient =
9799
mock(CloudFoundryClient.class, RETURNS_SMART_NULLS);
@@ -172,6 +174,7 @@ public final void mockClient() {
172174
when(this.cloudFoundryClient.applicationsV2()).thenReturn(this.applications);
173175
when(this.cloudFoundryClient.applicationsV3()).thenReturn(this.applicationsV3);
174176
when(this.cloudFoundryClient.buildpacks()).thenReturn(this.buildpacks);
177+
when(this.cloudFoundryClient.buildpacksV3()).thenReturn(this.buildpacksV3);
175178
when(this.cloudFoundryClient.domains()).thenReturn(this.domains);
176179
when(this.cloudFoundryClient.domainsV3()).thenReturn(this.domainsV3);
177180
when(this.cloudFoundryClient.events()).thenReturn(this.events);

0 commit comments

Comments
 (0)