Skip to content

Commit ed6b1ec

Browse files
committed
Implement Manifest V3 objects and deployment
1 parent dcba939 commit ed6b1ec

File tree

52 files changed

+2584
-469
lines changed

Some content is hidden

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

52 files changed

+2584
-469
lines changed

.idea/misc.xml

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/runConfigurations.xml

Lines changed: 0 additions & 10 deletions
This file was deleted.

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: 16 additions & 0 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;
@@ -149,6 +150,21 @@ protected final <T> Mono<HttpClientResponseWithParsedBody<T>> postWithResponse(O
149150
.response()
150151
.parseBodyWithResponse(responseType));
151152
}
153+
protected <T> Mono<HttpClientResponseWithParsedBody<T>> postRawWithResponse(byte[] requestPayload, String contentType, Class<T> responseType, Function<UriComponentsBuilder, UriComponentsBuilder> uriTransformer) {
154+
return createOperator()
155+
.flatMap(operator -> operator.post()
156+
.uri(queryTransformer(requestPayload).andThen(uriTransformer))
157+
.send((request, outbound) -> {
158+
String contentLength = String.valueOf(requestPayload.length);
159+
Mono<byte[]> body = Mono.just(requestPayload);
160+
161+
request.header(HttpHeaderNames.CONTENT_LENGTH, contentLength);
162+
request.header(HttpHeaderNames.CONTENT_TYPE, contentType);
163+
return outbound.sendByteArray(body);
164+
})
165+
.response()
166+
.parseBodyWithResponse(responseType));
167+
}
152168

153169
protected final Mono<String> post(Object requestPayload, Function<UriComponentsBuilder, UriComponentsBuilder> uriTransformer) {
154170
return createOperator()

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/routes/ReactorRoutesV3.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
/**
2828
* The Reactor-based implementation of {@link RoutesV3}
2929
*/
30-
public class ReactorRoutesV3 extends AbstractClientV3Operations implements RoutesV3 {
30+
public class ReactorRoutesV3 extends AbstractClientV3Operations implements RoutesV3 {
3131

3232
/**
3333
* Creates an instance

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616

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

19+
import org.cloudfoundry.client.v3.servicebrokers.UpdateServiceBrokerResponse;
20+
import org.cloudfoundry.client.v3.spaces.ApplyManifestRequest;
21+
import org.cloudfoundry.client.v3.spaces.ApplyManifestResponse;
1922
import org.cloudfoundry.client.v3.spaces.AssignSpaceIsolationSegmentRequest;
2023
import org.cloudfoundry.client.v3.spaces.AssignSpaceIsolationSegmentResponse;
2124
import org.cloudfoundry.client.v3.spaces.CreateSpaceRequest;
@@ -37,6 +40,7 @@
3740
import reactor.core.publisher.Mono;
3841

3942
import java.util.Map;
43+
import java.util.Optional;
4044

4145
/**
4246
* The Reactor-based implementation of {@link SpacesV3}
@@ -103,4 +107,12 @@ public Mono<UpdateSpaceResponse> update(UpdateSpaceRequest request) {
103107
.checkpoint();
104108
}
105109

110+
@Override
111+
public Mono<ApplyManifestResponse> applyManifest(ApplyManifestRequest request) {
112+
return postRawWithResponse(request.manifest(), "application/x-yaml", ApplyManifestResponse.class, builder -> builder.pathSegment("spaces", request.getSpaceId(), "actions", "apply_manifest"))
113+
.map(responseTuple -> ApplyManifestResponse.builder()
114+
.jobId(Optional.ofNullable(
115+
extractJobId(responseTuple.getResponse())))
116+
.build());
117+
}
106118
}

cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/util/Operator.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,8 @@ private BiFunction<HttpClientRequest, NettyOutbound, Publisher<Void>> serialized
140140
return JsonCodec.encode(this.context.getConnectionContext().getObjectMapper(), payload);
141141
}
142142

143+
//TODO yaml coded
144+
143145
}
144146

145147
public static class ResponseReceiver extends OperatorContextAware {

0 commit comments

Comments
 (0)