Skip to content

Commit 43ded5d

Browse files
committed
Merge branch 'manifest-v3'
2 parents cea9b16 + 81f8eb9 commit 43ded5d

File tree

53 files changed

+2789
-485
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+2789
-485
lines changed

.idea/encodings.xml

Lines changed: 9 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/client/_ReactorCloudFoundryClient.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
import org.cloudfoundry.client.v3.organizations.OrganizationsV3;
6262
import org.cloudfoundry.client.v3.packages.Packages;
6363
import org.cloudfoundry.client.v3.processes.Processes;
64+
import org.cloudfoundry.client.v3.resourcematch.ResourceMatchV3;
6465
import org.cloudfoundry.client.v3.roles.RolesV3;
6566
import org.cloudfoundry.client.v3.routes.RoutesV3;
6667
import org.cloudfoundry.client.v3.serviceinstances.ServiceInstancesV3;
@@ -117,6 +118,7 @@
117118
import org.cloudfoundry.reactor.client.v3.organizations.ReactorOrganizationsV3;
118119
import org.cloudfoundry.reactor.client.v3.packages.ReactorPackages;
119120
import org.cloudfoundry.reactor.client.v3.processes.ReactorProcesses;
121+
import org.cloudfoundry.reactor.client.v3.resourcematch.ReactorResourceMatchV3;
120122
import org.cloudfoundry.reactor.client.v3.roles.ReactorRolesV3;
121123
import org.cloudfoundry.reactor.client.v3.routes.ReactorRoutesV3;
122124
import org.cloudfoundry.reactor.client.v3.servicebindings.ReactorServiceBindingsV3;
@@ -307,6 +309,12 @@ public ResourceMatch resourceMatch() {
307309
return new ReactorResourceMatch(getConnectionContext(), getRootV2(), getTokenProvider(), getRequestTags());
308310
}
309311

312+
@Override
313+
@Value.Derived
314+
public ResourceMatchV3 resourceMatchV3() {
315+
return new ReactorResourceMatchV3(getConnectionContext(), getRootV3(), getTokenProvider(), getRequestTags());
316+
}
317+
310318
@Override
311319
@Value.Derived
312320
public RolesV3 rolesV3() {

cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/client/v3/AbstractClientV3Operations.java

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import reactor.netty.http.client.HttpClientRequest;
3838
import reactor.netty.http.client.HttpClientResponse;
3939

40+
import java.nio.charset.Charset;
4041
import java.util.List;
4142
import java.util.Map;
4243
import java.util.function.BiConsumer;
@@ -50,6 +51,16 @@ protected AbstractClientV3Operations(ConnectionContext connectionContext, Mono<S
5051
super(connectionContext, root, tokenProvider, requestTags);
5152
}
5253

54+
protected static String extractJobId(HttpClientResponse response) {
55+
String locationHeader = response.responseHeaders().get(HttpHeaderNames.LOCATION);
56+
if (locationHeader == null) {
57+
return null;
58+
}
59+
60+
List<String> pathSegments = UriComponentsBuilder.fromUriString(locationHeader).build().getPathSegments();
61+
return pathSegments.get(pathSegments.size() - 1);
62+
}
63+
5364
@Override
5465
protected Mono<Operator> createOperator() {
5566
return super.createOperator().map(this::attachErrorPayloadMapper);
@@ -65,23 +76,23 @@ protected final Mono<String> delete(Object requestPayload, Function<UriComponent
6576
.flatMap(response -> Mono.justOrEmpty(extractJobId(response)));
6677
}
6778

68-
protected final <T> Mono<HttpClientResponseWithParsedBody<T>> deleteWithResponse(Object requestPayload, Class<T> responseType,
69-
Function<UriComponentsBuilder, UriComponentsBuilder> uriTransformer) {
79+
protected final <T> Mono<T> delete(Object requestPayload, Class<T> responseType, Function<UriComponentsBuilder, UriComponentsBuilder> uriTransformer) {
7080
return createOperator()
7181
.flatMap(operator -> operator.delete()
7282
.uri(queryTransformer(requestPayload).andThen(uriTransformer))
7383
.send(requestPayload)
7484
.response()
75-
.parseBodyWithResponse(responseType));
85+
.parseBody(responseType));
7686
}
7787

78-
protected final <T> Mono<T> delete(Object requestPayload, Class<T> responseType, Function<UriComponentsBuilder, UriComponentsBuilder> uriTransformer) {
88+
protected final <T> Mono<HttpClientResponseWithParsedBody<T>> deleteWithResponse(Object requestPayload, Class<T> responseType,
89+
Function<UriComponentsBuilder, UriComponentsBuilder> uriTransformer) {
7990
return createOperator()
8091
.flatMap(operator -> operator.delete()
8192
.uri(queryTransformer(requestPayload).andThen(uriTransformer))
8293
.send(requestPayload)
8394
.response()
84-
.parseBody(responseType));
95+
.parseBodyWithResponse(responseType));
8596
}
8697

8798
protected final <T> Flux<T> get(Object requestPayload, Function<UriComponentsBuilder, UriComponentsBuilder> uriTransformer, Function<ByteBufFlux, Flux<T>> bodyTransformer) {
@@ -111,7 +122,7 @@ protected final <T> Mono<T> patch(Object requestPayload, Class<T> responseType,
111122
}
112123

113124
protected final <T> Mono<HttpClientResponseWithParsedBody<T>> patchWithResponse(Object requestPayload, Class<T> responseType,
114-
Function<UriComponentsBuilder, UriComponentsBuilder> uriTransformer) {
125+
Function<UriComponentsBuilder, UriComponentsBuilder> uriTransformer) {
115126
return createOperator()
116127
.flatMap(operator -> operator.patch()
117128
.uri(queryTransformer(requestPayload).andThen(uriTransformer))
@@ -140,24 +151,41 @@ protected <T> Mono<T> post(Object requestPayload, Class<T> responseType, Functio
140151
.parseBody(responseType));
141152
}
142153

143-
protected final <T> Mono<HttpClientResponseWithParsedBody<T>> postWithResponse(Object requestPayload, Class<T> responseType,
144-
Function<UriComponentsBuilder, UriComponentsBuilder> uriTransformer) {
154+
protected final Mono<String> post(Object requestPayload, Function<UriComponentsBuilder, UriComponentsBuilder> uriTransformer) {
145155
return createOperator()
146156
.flatMap(operator -> operator.post()
147157
.uri(queryTransformer(requestPayload).andThen(uriTransformer))
148158
.send(requestPayload)
149159
.response()
160+
.get())
161+
.flatMap(response -> Mono.justOrEmpty(extractJobId(response)));
162+
}
163+
164+
protected <T> Mono<HttpClientResponseWithParsedBody<T>> postRawWithResponse(byte[] requestPayload, String contentType, Class<T> responseType, Function<UriComponentsBuilder,
165+
UriComponentsBuilder> uriTransformer) {
166+
return createOperator()
167+
.flatMap(operator -> operator.post()
168+
.uri(queryTransformer(requestPayload).andThen(uriTransformer))
169+
.send((request, outbound) -> {
170+
String contentLength = String.valueOf(requestPayload.length);
171+
Mono<byte[]> body = Mono.just(requestPayload);
172+
173+
request.header(HttpHeaderNames.CONTENT_LENGTH, contentLength);
174+
request.header(HttpHeaderNames.CONTENT_TYPE, contentType);
175+
return outbound.sendByteArray(body);
176+
})
177+
.response()
150178
.parseBodyWithResponse(responseType));
151179
}
152180

153-
protected final Mono<String> post(Object requestPayload, Function<UriComponentsBuilder, UriComponentsBuilder> uriTransformer) {
181+
protected final <T> Mono<HttpClientResponseWithParsedBody<T>> postWithResponse(Object requestPayload, Class<T> responseType,
182+
Function<UriComponentsBuilder, UriComponentsBuilder> uriTransformer) {
154183
return createOperator()
155184
.flatMap(operator -> operator.post()
156185
.uri(queryTransformer(requestPayload).andThen(uriTransformer))
157186
.send(requestPayload)
158187
.response()
159-
.get())
160-
.flatMap(response -> Mono.justOrEmpty(extractJobId(response)));
188+
.parseBodyWithResponse(responseType));
161189
}
162190

163191
protected final <T> Mono<T> put(Object requestPayload, Class<T> responseType, Function<UriComponentsBuilder, UriComponentsBuilder> uriTransformer) {
@@ -169,16 +197,6 @@ protected final <T> Mono<T> put(Object requestPayload, Class<T> responseType, Fu
169197
.parseBody(responseType));
170198
}
171199

172-
protected static String extractJobId(HttpClientResponse response) {
173-
String locationHeader = response.responseHeaders().get(HttpHeaderNames.LOCATION);
174-
if (locationHeader == null) {
175-
return null;
176-
}
177-
178-
List<String> pathSegments = UriComponentsBuilder.fromUriString(locationHeader).build().getPathSegments();
179-
return pathSegments.get(pathSegments.size() - 1);
180-
}
181-
182200
private Operator attachErrorPayloadMapper(Operator operator) {
183201
return operator.withErrorPayloadMapper(ErrorPayloadMappers.clientV3(this.connectionContext.getObjectMapper()));
184202
}

cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/client/v3/applications/ReactorApplicationsV3.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@
5656
import org.cloudfoundry.client.v3.applications.ListApplicationTasksResponse;
5757
import org.cloudfoundry.client.v3.applications.ListApplicationsRequest;
5858
import org.cloudfoundry.client.v3.applications.ListApplicationsResponse;
59+
import org.cloudfoundry.client.v3.applications.RestartApplicationRequest;
60+
import org.cloudfoundry.client.v3.applications.RestartApplicationResponse;
5961
import org.cloudfoundry.client.v3.applications.ScaleApplicationRequest;
6062
import org.cloudfoundry.client.v3.applications.ScaleApplicationResponse;
6163
import org.cloudfoundry.client.v3.applications.SetApplicationCurrentDropletRequest;
@@ -233,6 +235,12 @@ public Mono<StartApplicationResponse> start(StartApplicationRequest request) {
233235
.checkpoint();
234236
}
235237

238+
@Override
239+
public Mono<RestartApplicationResponse> restart(RestartApplicationRequest request) {
240+
return post(request, RestartApplicationResponse.class, builder -> builder.pathSegment("apps", request.getApplicationId(), "actions", "restart"))
241+
.checkpoint();
242+
}
243+
236244
@Override
237245
public Mono<StopApplicationResponse> stop(StopApplicationRequest request) {
238246
return post(request, StopApplicationResponse.class, builder -> builder.pathSegment("apps", request.getApplicationId(), "actions", "stop"))

cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/client/v3/packages/ReactorPackages.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.cloudfoundry.client.v3.packages.Packages;
3232
import org.cloudfoundry.client.v3.packages.UploadPackageRequest;
3333
import org.cloudfoundry.client.v3.packages.UploadPackageResponse;
34+
import org.cloudfoundry.client.v3.resourcematch.MatchedResource;
3435
import org.cloudfoundry.reactor.ConnectionContext;
3536
import org.cloudfoundry.reactor.TokenProvider;
3637
import org.cloudfoundry.reactor.client.v3.AbstractClientV3Operations;
@@ -44,6 +45,7 @@
4445
import java.io.IOException;
4546
import java.nio.file.Files;
4647
import java.nio.file.Path;
48+
import java.util.List;
4749
import java.util.Map;
4850

4951
/**
@@ -129,15 +131,22 @@ public Mono<UploadPackageResponse> upload(UploadPackageRequest request) {
129131
}
130132

131133
private Mono<UploadPackageResponse> upload(UploadPackageRequest request, Runnable onTerminate) {
132-
return post(request, UploadPackageResponse.class, builder -> builder.pathSegment("packages", request.getPackageId(), "upload"), outbound -> upload(request.getBits(), outbound), onTerminate)
134+
return post(request, UploadPackageResponse.class, builder -> builder.pathSegment("packages", request.getPackageId(), "upload"), outbound -> upload(request.getBits(), request.getResources(), outbound), onTerminate)
133135
.checkpoint();
134136
}
135137

136-
private void upload(Path bits, MultipartHttpClientRequest r) {
137-
r.addPart(part -> part.setName("bits")
138-
.setContentType(APPLICATION_ZIP)
139-
.sendFile(bits))
140-
.done();
141-
}
138+
private void upload(Path bits, List<MatchedResource> resources, MultipartHttpClientRequest r) {
139+
if (bits != null) {
140+
r.addPart(part -> part.setName("bits")
141+
.setContentType(APPLICATION_ZIP)
142+
.sendFile(bits));
143+
}
142144

145+
if (resources != null && !resources.isEmpty()) {
146+
r.addPart(part -> part.setName("resources")
147+
.send(resources));
148+
}
149+
150+
r.done();
151+
}
143152
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/*
2+
* Copyright 2013-2021 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.cloudfoundry.reactor.client.v3.resourcematch;
18+
19+
import org.cloudfoundry.client.v3.resourcematch.ListMatchingResourcesRequest;
20+
import org.cloudfoundry.client.v3.resourcematch.ListMatchingResourcesResponse;
21+
import org.cloudfoundry.client.v3.resourcematch.ResourceMatchV3;
22+
import org.cloudfoundry.reactor.ConnectionContext;
23+
import org.cloudfoundry.reactor.TokenProvider;
24+
import org.cloudfoundry.reactor.client.v3.AbstractClientV3Operations;
25+
import reactor.core.publisher.Mono;
26+
27+
import java.util.Map;
28+
29+
/**
30+
* The Reactor-based implementation of {@link ResourceMatchV3}
31+
*/
32+
public final class ReactorResourceMatchV3 extends AbstractClientV3Operations implements ResourceMatchV3 {
33+
34+
/**
35+
* Creates an instance
36+
*
37+
* @param connectionContext the {@link ConnectionContext} to use when communicating with the server
38+
* @param root the root URI of the server. Typically something like {@code https://api.run.pivotal.io}.
39+
* @param tokenProvider the {@link TokenProvider} to use when communicating with the server
40+
* @param requestTags map with custom http headers which will be added to web request
41+
*/
42+
public ReactorResourceMatchV3(ConnectionContext connectionContext, Mono<String> root, TokenProvider tokenProvider, Map<String, String> requestTags) {
43+
super(connectionContext, root, tokenProvider, requestTags);
44+
}
45+
46+
@Override
47+
public Mono<ListMatchingResourcesResponse> list(ListMatchingResourcesRequest request) {
48+
return post(request, ListMatchingResourcesResponse.class, builder -> builder.pathSegment("resource_matches"))
49+
.checkpoint();
50+
}
51+
}

cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/client/v3/spaces/ReactorSpacesV3.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package org.cloudfoundry.reactor.client.v3.spaces;
1818

19+
import org.cloudfoundry.client.v3.spaces.ApplyManifestRequest;
20+
import org.cloudfoundry.client.v3.spaces.ApplyManifestResponse;
1921
import org.cloudfoundry.client.v3.spaces.AssignSpaceIsolationSegmentRequest;
2022
import org.cloudfoundry.client.v3.spaces.AssignSpaceIsolationSegmentResponse;
2123
import org.cloudfoundry.client.v3.spaces.CreateSpaceRequest;
@@ -37,6 +39,7 @@
3739
import reactor.core.publisher.Mono;
3840

3941
import java.util.Map;
42+
import java.util.Optional;
4043

4144
/**
4245
* The Reactor-based implementation of {@link SpacesV3}
@@ -55,6 +58,16 @@ public ReactorSpacesV3(ConnectionContext connectionContext, Mono<String> root, T
5558
super(connectionContext, root, tokenProvider, requestTags);
5659
}
5760

61+
@Override
62+
public Mono<ApplyManifestResponse> applyManifest(ApplyManifestRequest request) {
63+
return postRawWithResponse(request.getManifest(), "application/x-yaml", ApplyManifestResponse.class, builder -> builder.pathSegment("spaces", request.getSpaceId(), "actions",
64+
"apply_manifest"))
65+
.map(responseTuple -> ApplyManifestResponse.builder()
66+
.jobId(Optional.ofNullable(
67+
extractJobId(responseTuple.getResponse())))
68+
.build());
69+
}
70+
5871
@Override
5972
public Mono<AssignSpaceIsolationSegmentResponse> assignIsolationSegment(AssignSpaceIsolationSegmentRequest request) {
6073
return patch(request, AssignSpaceIsolationSegmentResponse.class, builder -> builder.pathSegment("spaces", request.getSpaceId(), "relationships", "isolation_segment"))
@@ -102,5 +115,4 @@ public Mono<UpdateSpaceResponse> update(UpdateSpaceRequest request) {
102115
return patch(request, UpdateSpaceResponse.class, builder -> builder.pathSegment("spaces", request.getSpaceId()))
103116
.checkpoint();
104117
}
105-
106118
}

cloudfoundry-client/src/main/java/org/cloudfoundry/client/CloudFoundryClient.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
import org.cloudfoundry.client.v3.organizations.OrganizationsV3;
6161
import org.cloudfoundry.client.v3.packages.Packages;
6262
import org.cloudfoundry.client.v3.processes.Processes;
63+
import org.cloudfoundry.client.v3.resourcematch.ResourceMatchV3;
6364
import org.cloudfoundry.client.v3.roles.RolesV3;
6465
import org.cloudfoundry.client.v3.routes.RoutesV3;
6566
import org.cloudfoundry.client.v3.serviceinstances.ServiceInstancesV3;
@@ -216,6 +217,11 @@ public interface CloudFoundryClient {
216217
*/
217218
ResourceMatch resourceMatch();
218219

220+
/**
221+
* Main entry point to the Cloud Foundry Resource Match V3 Client API
222+
*/
223+
ResourceMatchV3 resourceMatchV3();
224+
219225
/**
220226
* Main entry point to the Cloud Foundry Roles V3 Client API
221227
*/

cloudfoundry-client/src/main/java/org/cloudfoundry/client/v2/applications/_UploadApplicationRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
abstract class _UploadApplicationRequest {
3232

3333
/**
34-
* A binary zip file containing the application bits
34+
* A binary zip file or a directory containing the application bits to upload
3535
*/
3636
@JsonIgnore
3737
abstract Path getApplication();

cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/_Checksum.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ abstract class _Checksum {
3232
* The type
3333
*/
3434
@JsonProperty("type")
35+
@Nullable
3536
abstract ChecksumType getType();
3637

3738
/**

0 commit comments

Comments
 (0)