Skip to content

Commit 48db53a

Browse files
authored
[ResourceCluster] Add basic host routes to v1 API. (#197)
* tmp restore * Interface renaming + cleanup * ResouceClusterHostRoute * Fix style error * Move larage test payload to resource * Fix java style
1 parent 066d211 commit 48db53a

28 files changed

+851
-67
lines changed

mantis-control-plane/mantis-control-plane-server/src/main/java/io/mantisrx/control/plane/resource/cluster/ResourceClustersHostManagerActor.java

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,15 @@
2323
import io.mantisrx.control.plane.resource.cluster.proto.GetResourceClusterSpecRequest;
2424
import io.mantisrx.control.plane.resource.cluster.proto.ListResourceClusterRequest;
2525
import io.mantisrx.control.plane.resource.cluster.proto.ProvisionResourceClusterRequest;
26+
import io.mantisrx.control.plane.resource.cluster.proto.ResourceClusterAPIProto.DeleteResourceClusterRequest;
27+
import io.mantisrx.control.plane.resource.cluster.proto.ResourceClusterAPIProto.DeleteResourceClusterResponse;
2628
import io.mantisrx.control.plane.resource.cluster.proto.ResourceClusterAPIProto.GetResourceClusterResponse;
2729
import io.mantisrx.control.plane.resource.cluster.proto.ResourceClusterAPIProto.ListResourceClustersResponse;
2830
import io.mantisrx.control.plane.resource.cluster.proto.ResourceClusterProvisionSubmissionResponse;
2931
import io.mantisrx.control.plane.resource.cluster.proto.ScaleResourceRequest;
30-
import io.mantisrx.control.plane.resource.cluster.resourceprovider.IResourceClusterProvider;
31-
import io.mantisrx.control.plane.resource.cluster.resourceprovider.IResourceClusterStorageProvider;
3232
import io.mantisrx.control.plane.resource.cluster.resourceprovider.InMemoryOnlyResourceClusterStorageProvider;
33+
import io.mantisrx.control.plane.resource.cluster.resourceprovider.ResourceClusterProvider;
34+
import io.mantisrx.control.plane.resource.cluster.resourceprovider.ResourceClusterStorageProvider;
3335
import io.mantisrx.control.plane.resource.cluster.writable.ResourceClusterSpecWritable;
3436
import io.mantisrx.master.jobcluster.proto.BaseResponse.ResponseCode;
3537
import io.mantisrx.shaded.com.google.common.annotations.VisibleForTesting;
@@ -47,26 +49,26 @@ public class ResourceClustersHostManagerActor extends AbstractActorWithTimers {
4749

4850
@VisibleForTesting
4951
static Props props(
50-
final IResourceClusterProvider resourceClusterProvider) {
52+
final ResourceClusterProvider resourceClusterProvider) {
5153
return Props.create(
5254
ResourceClustersHostManagerActor.class,
5355
resourceClusterProvider,
5456
new InMemoryOnlyResourceClusterStorageProvider());
5557
}
5658

5759
public static Props props(
58-
final IResourceClusterProvider resourceClusterProvider,
59-
final IResourceClusterStorageProvider resourceStorageProvider) {
60+
final ResourceClusterProvider resourceClusterProvider,
61+
final ResourceClusterStorageProvider resourceStorageProvider) {
6062
// TODO(andyz): investigate atlas metered-mailbox.
6163
return Props.create(ResourceClustersHostManagerActor.class, resourceClusterProvider, resourceStorageProvider);
6264
}
6365

64-
private final IResourceClusterProvider resourceClusterProvider;
65-
private final IResourceClusterStorageProvider resourceClusterStorageProvider;
66+
private final ResourceClusterProvider resourceClusterProvider;
67+
private final ResourceClusterStorageProvider resourceClusterStorageProvider;
6668

6769
public ResourceClustersHostManagerActor(
68-
final IResourceClusterProvider resourceClusterProvider,
69-
final IResourceClusterStorageProvider resourceStorageProvider) {
70+
final ResourceClusterProvider resourceClusterProvider,
71+
final ResourceClusterStorageProvider resourceStorageProvider) {
7072
this.resourceClusterProvider = resourceClusterProvider;
7173
this.resourceClusterStorageProvider = resourceStorageProvider;
7274
}
@@ -79,9 +81,32 @@ public Receive createReceive() {
7981
.match(ListResourceClusterRequest.class, this::onListResourceClusterRequest)
8082
.match(GetResourceClusterSpecRequest.class, this::onGetResourceClusterSpecRequest)
8183
.match(ResourceClusterProvisionSubmissionResponse.class, this::onResourceClusterProvisionResponse)
84+
.match(DeleteResourceClusterRequest.class, this::onDeleteResourceCluster)
8285
.build();
8386
}
8487

88+
private void onDeleteResourceCluster(DeleteResourceClusterRequest req) {
89+
/**
90+
* Proper cluster deletion requires handling various cleanups e.g.:
91+
* * Migrate existing jobs.
92+
* * Un-provision cluster resources (nodes, network, storage e.g.).
93+
* * Update internal tracking state and persistent data.
94+
* For now this API will only serve the persistence layer update.
95+
*/
96+
97+
pipe(this.resourceClusterStorageProvider.deregisterCluster(req.getClusterId())
98+
.thenApply(clustersW ->
99+
DeleteResourceClusterResponse.builder()
100+
.responseCode(ResponseCode.SUCCESS)
101+
.build())
102+
.exceptionally(err ->
103+
DeleteResourceClusterResponse.builder()
104+
.message(err.getMessage())
105+
.responseCode(ResponseCode.SERVER_ERROR).build()),
106+
getContext().dispatcher())
107+
.to(getSender());
108+
}
109+
85110
private void onResourceClusterProvisionResponse(ResourceClusterProvisionSubmissionResponse resp) {
86111
this.resourceClusterProvider.getResponseHandler().handleProvisionResponse(resp);
87112
}

mantis-control-plane/mantis-control-plane-server/src/main/java/io/mantisrx/control/plane/resource/cluster/proto/MantisResourceClusterSpec.java

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,42 +16,37 @@
1616

1717
package io.mantisrx.control.plane.resource.cluster.proto;
1818

19+
import io.mantisrx.control.plane.resource.cluster.resourceprovider.ResourceClusterProvider;
1920
import io.mantisrx.shaded.com.fasterxml.jackson.annotation.JsonCreator;
2021
import io.mantisrx.shaded.com.fasterxml.jackson.annotation.JsonProperty;
2122
import java.util.Map;
2223
import java.util.Set;
2324
import lombok.Builder;
2425
import lombok.EqualsAndHashCode;
25-
import lombok.NonNull;
2626
import lombok.Singular;
2727
import lombok.Value;
2828

2929
/**
3030
* Contract class to define a Mantis resource cluster. This contract provides the abstraction to provide a generic
3131
* definition from Mantis control perspective, and it's up to the implementations of each
32-
* {@link io.mantisrx.control.plane.resource.cluster.resourceprovider.IResourceClusterProvider} to translate this spec
32+
* {@link ResourceClusterProvider} to translate this spec
3333
* to corresponding framework's cluster/node(s) definition.
3434
*/
3535
@Value
3636
@Builder
3737
public class MantisResourceClusterSpec {
3838

39-
@NonNull
4039
String name;
4140

4241
/**
4342
* ID fields maps to cluster name or spinnaker app name.
4443
*/
45-
@NonNull
4644
String id;
4745

48-
@NonNull
4946
String ownerName;
5047

51-
@NonNull
5248
String ownerEmail;
5349

54-
@NonNull
5550
MantisResourceClusterEnvType envType;
5651

5752
@Singular
@@ -85,14 +80,11 @@ public MantisResourceClusterSpec(
8580
@Value
8681
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
8782
public static class SkuTypeSpec {
88-
@NonNull
8983
@EqualsAndHashCode.Include
9084
String skuId;
9185

92-
@NonNull
9386
SkuCapacity capacity;
9487

95-
@NonNull
9688
String imageId;
9789

9890
int cpuCoreCount;
@@ -127,10 +119,13 @@ public SkuTypeSpec(
127119
}
128120
}
129121

122+
/**
123+
* This class defined the capacity required for the given skuId mapping to hosting framework nodes
124+
* e.g. containers/virtual machines.
125+
*/
130126
@Builder
131127
@Value
132128
public static class SkuCapacity {
133-
@NonNull
134129
String skuId;
135130

136131
int minSize;

mantis-control-plane/mantis-control-plane-server/src/main/java/io/mantisrx/control/plane/resource/cluster/proto/ProvisionResourceClusterRequest.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package io.mantisrx.control.plane.resource.cluster.proto;
1818

1919
import lombok.Builder;
20-
import lombok.NonNull;
2120
import lombok.Value;
2221

2322
/**
@@ -26,7 +25,6 @@
2625
@Builder
2726
@Value
2827
public class ProvisionResourceClusterRequest {
29-
@NonNull
3028
String clusterId;
3129

3230
MantisResourceClusterSpec clusterSpec;

mantis-control-plane/mantis-control-plane-server/src/main/java/io/mantisrx/control/plane/resource/cluster/proto/ResourceClusterAPIProto.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
public class ResourceClusterAPIProto {
2626

2727
@Value
28-
public static final class ListResourceClustersResponse extends BaseResponse {
28+
public static class ListResourceClustersResponse extends BaseResponse {
2929

3030
@Singular
3131
List<RegisteredResourceCluster> registeredResourceClusters;
@@ -49,7 +49,7 @@ public static class RegisteredResourceCluster {
4949
}
5050

5151
@Value
52-
public static final class GetResourceClusterResponse extends BaseResponse {
52+
public static class GetResourceClusterResponse extends BaseResponse {
5353

5454
MantisResourceClusterSpec clusterSpec;
5555

@@ -63,4 +63,21 @@ public GetResourceClusterResponse(
6363
this.clusterSpec = clusterSpec;
6464
}
6565
}
66+
67+
@Value
68+
public static class DeleteResourceClusterResponse extends BaseResponse {
69+
@Builder
70+
public DeleteResourceClusterResponse(
71+
final long requestId,
72+
final ResponseCode responseCode,
73+
final String message) {
74+
super(requestId, responseCode, message);
75+
}
76+
}
77+
78+
@Builder
79+
@Value
80+
public static class DeleteResourceClusterRequest {
81+
String clusterId;
82+
}
6683
}

mantis-control-plane/mantis-control-plane-server/src/main/java/io/mantisrx/control/plane/resource/cluster/proto/ScaleResourceRequest.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,17 @@
1818

1919
import io.mantisrx.shaded.com.google.common.base.Joiner;
2020
import lombok.Builder;
21-
import lombok.NonNull;
2221
import lombok.Value;
2322

2423
@Builder
2524
@Value
2625
public class ScaleResourceRequest {
27-
@NonNull
2826
String clusterId;
2927

30-
@NonNull
3128
String skuId;
3229

33-
@NonNull
3430
String region;
3531

36-
@NonNull
3732
MantisResourceClusterEnvType envType;
3833

3934
int desireSize;

mantis-control-plane/mantis-control-plane-server/src/main/java/io/mantisrx/control/plane/resource/cluster/proto/ScaleResourceResponse.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,16 @@
1818

1919
import io.mantisrx.master.jobcluster.proto.BaseResponse;
2020
import lombok.Builder;
21-
import lombok.NonNull;
2221
import lombok.Value;
2322

2423
@Value
2524
public class ScaleResourceResponse extends BaseResponse {
26-
@NonNull
2725
String clusterId;
2826

29-
@NonNull
3027
String skuId;
3128

32-
@NonNull
3329
String region;
3430

35-
@NonNull
3631
MantisResourceClusterEnvType envType;
3732

3833
int desireSize;

mantis-control-plane/mantis-control-plane-server/src/main/java/io/mantisrx/control/plane/resource/cluster/resourceprovider/InMemoryOnlyResourceClusterStorageProvider.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
/**
2727
* [Test only] Store resource storage data in memroy only for testing.
2828
*/
29-
public class InMemoryOnlyResourceClusterStorageProvider implements IResourceClusterStorageProvider {
29+
public class InMemoryOnlyResourceClusterStorageProvider implements ResourceClusterStorageProvider {
3030
Map<String, ResourceClusterSpecWritable> clusters = new HashMap<>();
3131

3232
@Override
@@ -35,6 +35,12 @@ public CompletionStage<ResourceClusterSpecWritable> registerAndUpdateClusterSpec
3535
return CompletableFuture.completedFuture(spec);
3636
}
3737

38+
@Override
39+
public CompletionStage<RegisteredResourceClustersWritable> deregisterCluster(String clusterId) {
40+
this.clusters.remove(clusterId);
41+
return getRegisteredResourceClustersWritable();
42+
}
43+
3844
@Override
3945
public CompletionStage<RegisteredResourceClustersWritable> getRegisteredResourceClustersWritable() {
4046
RegisteredResourceClustersWritable.RegisteredResourceClustersWritableBuilder builder =

mantis-control-plane/mantis-control-plane-server/src/main/java/io/mantisrx/control/plane/resource/cluster/resourceprovider/NoopResourceClusterResponseHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import lombok.extern.slf4j.Slf4j;
2121

2222
@Slf4j
23-
public class NoopResourceClusterResponseHandler implements IResourceClusterResponseHandler {
23+
public class NoopResourceClusterResponseHandler implements ResourceClusterResponseHandler {
2424
@Override
2525
public void handleProvisionResponse(ResourceClusterProvisionSubmissionResponse resp) {
2626
log.info(resp.toString());
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
* This interface provides the API to connect resource cluster management actor to actual
2727
* implementations of different resource cluster clients e.g. k8s.
2828
*/
29-
public interface IResourceClusterProvider {
29+
public interface ResourceClusterProvider {
3030
/**
3131
* Provision a new resource cluster using the given spec. This operation should be idempotent.
3232
* The returned CompletionStage instance is to indicate whether the provision has been
@@ -44,5 +44,5 @@ CompletionStage<ResourceClusterProvisionSubmissionResponse> provisionClusterIfNo
4444
*/
4545
CompletionStage<ScaleResourceResponse> scaleResource(ScaleResourceRequest scaleRequest);
4646

47-
IResourceClusterResponseHandler getResponseHandler();
47+
ResourceClusterResponseHandler getResponseHandler();
4848
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
import io.mantisrx.control.plane.resource.cluster.proto.ResourceClusterProvisionSubmissionResponse;
2020

2121
/**
22-
* Callback handler for {@link IResouceClusterProvider} responses.
22+
* Callback handler for {@link ResourceClusterProvider} responses.
2323
*/
24-
public interface IResourceClusterResponseHandler {
24+
public interface ResourceClusterResponseHandler {
2525
void handleProvisionResponse(ResourceClusterProvisionSubmissionResponse resp);
2626
}

0 commit comments

Comments
 (0)