Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
91 commits
Select commit Hold shift + click to select a range
bd08907
6749: Initial maven commit
rtjd6554 Mar 5, 2026
4175a4c
6749: Rest api design framework
rtjd6554 Mar 10, 2026
6cd1287
Merge branch 'develop' into 6749-rest-api-shell
rtjd6554 Mar 10, 2026
2142f36
Merge branch 'develop' into 6749-rest-api-shell
rtjd6554 Mar 10, 2026
744490d
6749: Refactor location of restapi code
rtjd6554 Mar 10, 2026
89168d9
6749: Update config for chunks and names
rtjd6554 Mar 10, 2026
b6a99ec
6749: Update poms
rtjd6554 Mar 10, 2026
3b90ef4
6749: Update chunk-config
rtjd6554 Mar 10, 2026
83ea654
6749: Optional stack option
rtjd6554 Mar 10, 2026
ed4fd08
6749: Refactor restapi stack
rtjd6554 Mar 10, 2026
d29df6f
6749: Update dependency to fix build
rtjd6554 Mar 10, 2026
2a6f90a
6749: Update documentation
rtjd6554 Mar 10, 2026
6fc8cbe
6749: Update versioning number for testing
rtjd6554 Mar 11, 2026
7841ae4
Merge branch 'develop' into 6749-rest-api-shell
rtjd6554 Mar 11, 2026
b7380ed
6749: Update documentation
rtjd6554 Mar 11, 2026
d9e1221
6749: Commented out section
rtjd6554 Mar 11, 2026
06e9f10
Merge branch 'develop' into 6749-rest-api-shell
rtjd6554 Mar 12, 2026
ab33692
6749: Remove extra module and relocate into cdk
rtjd6554 Mar 12, 2026
9d8b904
Merge branch 'develop' into 6749-rest-api-shell
rtjd6554 Mar 12, 2026
143a24f
6749: CfnApi variant
rtjd6554 Mar 17, 2026
e27f8cc
6749: Add integration
rtjd6554 Mar 17, 2026
808de8b
Merge branch 'develop' into 6749-rest-api-shell
rtjd6554 Mar 17, 2026
febe991
6749: Add route
rtjd6554 Mar 17, 2026
5ff81f3
Merge branch 'develop' into 6749-rest-api-shell
rtjd6554 Mar 18, 2026
28b9505
6749: Update default properties for apigateway creation
rtjd6554 Mar 18, 2026
09a1e7c
6749: Update cfnOutput
rtjd6554 Mar 18, 2026
f3a652b
6749: Update for url details
rtjd6554 Mar 18, 2026
54e60b2
6749: Update method signature
rtjd6554 Mar 18, 2026
f2aabdb
6749: Tidy up changes
rtjd6554 Mar 18, 2026
f2c761e
6749: Lambda handlers
rtjd6554 Mar 18, 2026
913b6b0
6749: Resolve spot bugs issue
rtjd6554 Mar 18, 2026
7d3b6ee
6749: Update generated documentation
rtjd6554 Mar 18, 2026
9e57c2c
6749: Simplfy constructor
rtjd6554 Mar 18, 2026
9ee5a37
Merge branch 'develop' into 6749-rest-api-shell
rtjd6554 Mar 19, 2026
3e2fdb4
Merge branch 'develop' into 6749-rest-api-shell
rtjd6554 Mar 20, 2026
6769041
6749: Capitalisations
rtjd6554 Mar 20, 2026
435eaaa
6749: Review comments update
rtjd6554 Mar 20, 2026
dab43dc
Merge branch 'develop' into 6749-rest-api-shell
rtjd6554 Mar 20, 2026
46e677f
6749: Fix dependencies
rtjd6554 Mar 20, 2026
2ac11a7
Merge branch 'develop' into 6749-rest-api-shell
rtjd6554 Mar 20, 2026
1118c90
6749: Add logging group
rtjd6554 Mar 20, 2026
33011e0
6749: Adjust integrationType to not use older import
rtjd6554 Mar 20, 2026
2adc778
6749: Refactor into seperate module
rtjd6554 Mar 23, 2026
72dc22e
Merge branch 'develop' into 6749-rest-api-shell
rtjd6554 Mar 24, 2026
309f5e8
9749: Update pom.xml
rtjd6554 Mar 24, 2026
71c1205
Update pom with copyright
rtjd6554 Mar 24, 2026
1251986
6749: Remove bad character
rtjd6554 Mar 24, 2026
1267df6
6749: Update text description
rtjd6554 Mar 24, 2026
3d9465f
6749: Update chunks
rtjd6554 Mar 24, 2026
e90e1e4
6749: Correct typo
rtjd6554 Mar 24, 2026
7742b60
6749: Basis logic for logging
rtjd6554 Mar 24, 2026
a099766
6749: Switch to HTTPApi
rtjd6554 Mar 24, 2026
11c003a
6749: Correct approval for default instance
rtjd6554 Mar 24, 2026
03ba16c
Merge branch 'develop' into 6749-rest-api-shell
rtjd6554 Mar 24, 2026
c13e3d0
6749: Update pom dependencies
rtjd6554 Mar 24, 2026
637fd10
Merge branch 'develop' into 6749-rest-api-shell
rtjd6554 Mar 24, 2026
dc41bc4
6749: Adjust lambda sample actions
rtjd6554 Mar 24, 2026
40c821e
6749: Update lambda handleEvent
rtjd6554 Mar 24, 2026
2aa5b13
Merge branch 'develop' into 6749-rest-api-shell
rtjd6554 Mar 26, 2026
3423d8b
6749: Adjust scope declaration
rtjd6554 Mar 26, 2026
83f7ad8
6749: Update scopes and ids
rtjd6554 Mar 26, 2026
e7d51a0
6749: Update javadoc
rtjd6554 Mar 26, 2026
d08fa20
6749: Update gateway settings
rtjd6554 Mar 26, 2026
71034d7
6749: Update gateway method arguments
rtjd6554 Mar 26, 2026
9dedbc4
6749: Update log group declaration
rtjd6554 Mar 26, 2026
aa39b67
6749: Typo corrections
rtjd6554 Mar 26, 2026
931d838
6749: Adjust class usages
rtjd6554 Mar 27, 2026
7eabf33
Merge branch 'develop' into 6749-rest-api-shell
rtjd6554 Mar 27, 2026
c901c48
6749: Update arguments
rtjd6554 Mar 27, 2026
79ebead
6749: Update documentation
rtjd6554 Mar 27, 2026
5a8ae71
6749: Update approval
rtjd6554 Mar 27, 2026
6cebc82
Merge branch 'develop' into 6749-rest-api-shell
rtjd6554 Mar 27, 2026
265a53f
Merge branch 'develop' into 6749-rest-api-shell
rtjd6554 Mar 30, 2026
cffed96
6749: Update stub method to provide simple response
rtjd6554 Mar 30, 2026
8de1b83
6749: Replace core dependency with slf4j due to maven warning
rtjd6554 Mar 30, 2026
c56b498
6749: Update system test properties
rtjd6554 Mar 30, 2026
00024b7
6749: Adjusted based on review comments
rtjd6554 Mar 31, 2026
e72b951
6749: Adjust lambda ID
rtjd6554 Mar 31, 2026
b59edcf
Merge branch 'develop' into 6749-rest-api-shell
rtjd6554 Mar 31, 2026
b9725b6
6749: Update based on review comments
rtjd6554 Mar 31, 2026
df41d33
6749: Method simplification
rtjd6554 Mar 31, 2026
f862e5a
6749: Update property group for REST APJ url
rtjd6554 Mar 31, 2026
ca51ce4
6749: Update zip.xml
rtjd6554 Mar 31, 2026
58b5e7c
Merge branch 'develop' into 6749-rest-api-shell
rtjd6554 Apr 1, 2026
4fe1236
6749: Update LambdaJar with RestAPI
rtjd6554 Apr 1, 2026
f20acfc
6749: Update documentation
rtjd6554 Apr 1, 2026
f4ca67b
6749: Update handler
rtjd6554 Apr 1, 2026
f443897
Merge branch 'develop' into 6749-rest-api-shell
patchwork01 Apr 13, 2026
5a48cd0
6749: Relocate rest-api out of deployment module
rtjd6554 Apr 13, 2026
ae61e1b
6749: Remove rest-api reference
rtjd6554 Apr 13, 2026
c35d719
6749: Added missing module reference
rtjd6554 Apr 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/config/chunks.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ chunks:
- deployment/cdk-custom-resources
- deployment/cdk-environment
- deployment/build-uptime-lambda
- rest-api
- system-test/system-test-cdk
- system-test/system-test-configuration
- system-test/system-test-data-generation
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/chunk-clients-cdk.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ on:
- 'java/deployment/cdk-custom-resources/**'
- 'java/deployment/cdk-environment/**'
- 'java/deployment/build-uptime-lambda/**'
- 'java/rest-api/**'
- 'java/system-test/system-test-cdk/**'
- 'java/system-test/system-test-configuration/**'
- 'java/system-test/system-test-data-generation/**'
Expand Down
1 change: 1 addition & 0 deletions docs/deployment/docker-images.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ Docker image for each lambda jar.
| cdk-custom-resources-`<version-number>`.jar | custom-resources-lambda | false |
| metrics-`<version-number>`.jar | metrics-lambda | false |
| statestore-lambda-`<version-number>`.jar | statestore-lambda | false |
| rest-api-`<version-number>`.jar | rest-api-lambda | false |


## Building and pushing
Expand Down
1 change: 1 addition & 0 deletions docs/usage/properties/instance/cdk/common.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,4 @@ The following instance properties are commonly used throughout Sleeper.
| sleeper.statestore.committer.dlq.arn | The ARN of the dead letter queue for statestore commit requests. |
| sleeper.statestore.committer.log.group | The name of the log group for the state store committer. |
| sleeper.statestore.committer.event.source.id | The UUID of the event source mapping for the state store committer. |
| sleeper.rest.api.url | The URL for the Sleeper REST API. |
2 changes: 1 addition & 1 deletion docs/usage/properties/instance/user/common.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ The following instance properties are commonly used throughout Sleeper.
| sleeper.retain.logs.after.destroy | Whether to keep the sleeper log groups when the instance is destroyed. | true | true |
| sleeper.default.table.retain.after.removal | This property is used when applying an instance configuration and a table has been removed.<br>If this is true (default), removing the table from the configuration will just take the table offline.<br>If this is false, it will delete all data associated with the table when the table is removed.<br>Be aware that if a table is renamed in the configuration, the CDK will see it as a delete of the old table name and a create of the new table name. If this is set to false when that happens it will remove the table's data.<br>This property isn't currently in use but will be in https://github.com/gchq/sleeper/issues/5870. | true | false |
| sleeper.default.table.reuse.existing | This property is used when applying an instance configuration and a table has been added.<br>By default, or if this property is false, when a table is added to an instance configuration it's created in the instance. If it already exists the update will fail.<br>If this property is true, the existing table will be reused and imported as part of the instance configuration. If it doesn't exist the update will fail. | false | false |
| sleeper.optional.stacks | The optional stacks to deploy. Not case sensitive.<br>Valid values: [IngestStack, IngestBatcherStack, EmrServerlessBulkImportStack, EmrBulkImportStack, PersistentEmrBulkImportStack, EksBulkImportStack, EmrStudioStack, BulkExportStack, QueryStack, WebSocketQueryStack, AthenaStack, KeepLambdaWarmStack, CompactionStack, GarbageCollectorStack, PartitionSplittingStack, DashboardStack, TableMetricsStack] | IngestStack,IngestBatcherStack,EmrServerlessBulkImportStack,EmrStudioStack,QueryStack,CompactionStack,GarbageCollectorStack,PartitionSplittingStack,DashboardStack,TableMetricsStack | true |
| sleeper.optional.stacks | The optional stacks to deploy. Not case sensitive.<br>Valid values: [IngestStack, IngestBatcherStack, EmrServerlessBulkImportStack, EmrBulkImportStack, PersistentEmrBulkImportStack, EksBulkImportStack, EmrStudioStack, BulkExportStack, QueryStack, WebSocketQueryStack, AthenaStack, KeepLambdaWarmStack, CompactionStack, GarbageCollectorStack, PartitionSplittingStack, RestApiStack, DashboardStack, TableMetricsStack] | IngestStack,IngestBatcherStack,EmrServerlessBulkImportStack,EmrStudioStack,QueryStack,CompactionStack,GarbageCollectorStack,PartitionSplittingStack,DashboardStack,TableMetricsStack | true |
| sleeper.lambda.deploy.type | The deployment type for AWS Lambda. Not case sensitive.<br>There are two types of Lambda deployments, jar and container.<br>If the size of the jar file is too large, it will always be deployed as a container.<br>Valid values: [jar, container] | jar | true |
| sleeper.endpoint.url | The AWS endpoint URL. This should only be set for a non-standard service endpoint. Usually this is used to set the URL to LocalStack for a locally deployed instance. | | false |
| sleeper.vpc | The id of the VPC to deploy to. This property may be passed as an argument during deployment. If using the Sleeper CDK app, you can set the context variable "vpc". If using your own CDK app, you can set this in SleeperInstanceProps under networking. | | false |
Expand Down
2 changes: 1 addition & 1 deletion example/basic/instance.properties
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ sleeper.id=basic-example
# Valid values: [IngestStack, IngestBatcherStack, EmrServerlessBulkImportStack, EmrBulkImportStack,
# PersistentEmrBulkImportStack, EksBulkImportStack, EmrStudioStack, BulkExportStack, QueryStack,
# WebSocketQueryStack, AthenaStack, KeepLambdaWarmStack, CompactionStack, GarbageCollectorStack,
# PartitionSplittingStack, DashboardStack, TableMetricsStack]
# PartitionSplittingStack, RestApiStack, DashboardStack, TableMetricsStack]
# (default value shown below, uncomment to set a value)
# sleeper.optional.stacks=IngestStack,IngestBatcherStack,EmrServerlessBulkImportStack,EmrStudioStack,QueryStack,CompactionStack,GarbageCollectorStack,PartitionSplittingStack,DashboardStack,TableMetricsStack

Expand Down
2 changes: 1 addition & 1 deletion example/full/instance.properties
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ sleeper.logging.root.level=INFO
# Valid values: [IngestStack, IngestBatcherStack, EmrServerlessBulkImportStack, EmrBulkImportStack,
# PersistentEmrBulkImportStack, EksBulkImportStack, EmrStudioStack, BulkExportStack, QueryStack,
# WebSocketQueryStack, AthenaStack, KeepLambdaWarmStack, CompactionStack, GarbageCollectorStack,
# PartitionSplittingStack, DashboardStack, TableMetricsStack]
# PartitionSplittingStack, RestApiStack, DashboardStack, TableMetricsStack]
# (default value shown below, uncomment to set a value)
# sleeper.optional.stacks=IngestStack,IngestBatcherStack,EmrServerlessBulkImportStack,EmrStudioStack,QueryStack,CompactionStack,GarbageCollectorStack,PartitionSplittingStack,DashboardStack,TableMetricsStack

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,10 @@ public class LambdaHandler {
.jar(LambdaJar.STATESTORE)
.handler("sleeper.statestore.lambda.transaction.TransactionLogFollowerLambda::handleRequest")
.core().add();
public static final LambdaHandler REST_API_HANDLER = builder()
.jar(LambdaJar.REST_API)
.handler("sleeper.restapi.RestApiLambda::handleEvent")
.core().add();

private final LambdaJar jar;
private final String handler;
Expand Down
3 changes: 3 additions & 0 deletions java/core/src/main/java/sleeper/core/deploy/LambdaJar.java
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,9 @@ public class LambdaJar {
public static final LambdaJar STATESTORE = builder().filenameFormat("statestore-lambda-%s.jar")
.imageName("statestore-lambda")
.artifactId("statestore-lambda").add();
public static final LambdaJar REST_API = builder().filenameFormat("rest-api-%s.jar")
.imageName("rest-api-lambda")
.artifactId("rest-api").add();

private final String filenameFormat;
private final String imageName;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -781,6 +781,12 @@ static List<CdkDefinedInstanceProperty> getAllInGroup(PropertyGroup group) {
.propertyGroup(InstancePropertyGroup.BULK_IMPORT)
.build();

// REST API
CdkDefinedInstanceProperty REST_API_URL = Index.propertyBuilder("sleeper.rest.api.url")
.description("The URL for the Sleeper REST API.")
.propertyGroup(InstancePropertyGroup.COMMON)
.build();

@Override
default boolean isSetByCdk() {
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ public enum OptionalStack {
GarbageCollectorStack,
PartitionSplittingStack,

// Rest Api
RestApiStack,

// Metrics
DashboardStack,
TableMetricsStack;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
/*
* Copyright 2022-2026 Crown Copyright
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package sleeper.cdk.stack;

import software.amazon.awscdk.CfnOutput;
import software.amazon.awscdk.CfnOutputProps;
import software.amazon.awscdk.Duration;
import software.amazon.awscdk.NestedStack;
import software.amazon.awscdk.aws_apigatewayv2_integrations.HttpLambdaIntegration;
import software.amazon.awscdk.services.apigatewayv2.AddRoutesOptions;
import software.amazon.awscdk.services.apigatewayv2.HttpApi;
import software.amazon.awscdk.services.apigatewayv2.HttpMethod;
import software.amazon.awscdk.services.lambda.IFunction;
import software.constructs.Construct;

import sleeper.cdk.artefacts.SleeperInstanceArtefacts;
import sleeper.cdk.lambda.SleeperLambdaCode;
import sleeper.cdk.stack.core.LoggingStack.LogGroupRef;
import sleeper.cdk.util.Utils;
import sleeper.core.deploy.LambdaHandler;
import sleeper.core.properties.instance.CdkDefinedInstanceProperty;
import sleeper.core.properties.instance.InstanceProperties;
import sleeper.core.util.EnvironmentUtils;

import java.util.List;
import java.util.Map;

import static sleeper.core.properties.instance.CommonProperty.ID;

/**
* REST API for interacting with the Sleeper instance.
* Utilises API Gateway.
*/
public class RestApiStack extends NestedStack {

public RestApiStack(Construct scope, String id, InstanceProperties instanceProperties,
SleeperInstanceArtefacts artefacts, SleeperCoreStacks coreStacks) {
super(scope, id);
setUpRestApi(instanceProperties, artefacts, coreStacks);
}

private void setUpRestApi(InstanceProperties instanceProperties, SleeperInstanceArtefacts artefacts,
SleeperCoreStacks coreStacks) {
String instanceId = Utils.cleanInstanceId(instanceProperties.get(ID));
SleeperLambdaCode lambdaCode = artefacts.lambdaCodeAtScope(this);
Map<String, String> env = EnvironmentUtils.createDefaultEnvironment(instanceProperties);
String functionName = String.join("-", "sleeper", instanceId, "rest-api-handler");
IFunction lambda = lambdaCode.buildFunction(LambdaHandler.REST_API_HANDLER, "RestApiHandlerlambda", builder -> builder
.functionName(functionName)
.description("Implements a REST API for interacting with Sleeper")
.environment(env)
.memorySize(1024)
.logGroup(coreStacks.getLogGroup(LogGroupRef.REST_API_HANDLER))
.timeout(Duration.seconds(29)));
Comment thread
patchwork01 marked this conversation as resolved.

HttpApi restHttpApi = HttpApi.Builder.create(this, "RestApi")
.description("Sleeper REST API")
.apiName(lambda.getFunctionName())
.build();

HttpLambdaIntegration integration = HttpLambdaIntegration.Builder.create(instanceId, lambda).build();
restHttpApi.addRoutes(AddRoutesOptions.builder()
.path("/sleeper")
.methods(List.of(HttpMethod.GET))
.integration(integration).build());

new CfnOutput(this, "RestApiUrl", CfnOutputProps.builder()
.value(restHttpApi.getApiEndpoint())
.build());
instanceProperties.set(CdkDefinedInstanceProperty.REST_API_URL, restHttpApi.getApiEndpoint());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,11 @@ public static void create(
new IngestBatcherStack(scope, "IngestBatcher", props, coreStacks, ingestStacks);
}

// Stack to provide a Rest API for sleeper
if (optionalStacks.contains(OptionalStack.RestApiStack)) {
new RestApiStack(scope, "RestApi", instanceProperties, artefacts, coreStacks);
}

if (optionalStacks.contains(OptionalStack.DashboardStack)) {
new DashboardStack(scope, "Dashboard",
ingestStack,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,8 @@ public enum LogGroupRef {
QUERY_WEBSOCKET_HANDLER("query-websocket-handler"),
QUERY_KEEP_WARM("query-keep-warm"),
SIMPLE_ATHENA_HANDLER("Simple-athena-handler"),
ITERATOR_APPLYING_ATHENA_HANDLER("IteratorApplying-athena-handler");
ITERATOR_APPLYING_ATHENA_HANDLER("IteratorApplying-athena-handler"),
REST_API_HANDLER("rest-api-handler");

private final String shortName;
private final String prefix;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,18 @@
"UpdateReplacePolicy": "Delete",
"DeletionPolicy": "Delete"
},
"Repositoryrestapilambda2BEFC68A": {
"Type": "AWS::ECR::Repository",
"Properties": {
"EmptyOnDelete": true,
"LifecyclePolicy": {
"LifecyclePolicyText": "{\"rules\":[{\"rulePriority\":1,\"description\":\"Delete untagged images\",\"selection\":{\"tagStatus\":\"untagged\",\"countType\":\"sinceImagePushed\",\"countNumber\":1,\"countUnit\":\"days\"},\"action\":{\"type\":\"expire\"}},{\"rulePriority\":2,\"description\":\"Keep images for 365 days\",\"selection\":{\"tagStatus\":\"any\",\"countType\":\"sinceImagePushed\",\"countNumber\":365,\"countUnit\":\"days\"},\"action\":{\"type\":\"expire\"}}]}"
},
"RepositoryName": "test-deployment/rest-api-lambda"
},
"UpdateReplacePolicy": "Delete",
"DeletionPolicy": "Delete"
},
"Repositoryingest2C547FF9": {
"Type": "AWS::ECR::Repository",
"Properties": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3283,6 +3283,25 @@
]
}
},
"restapihandler6C03CFA2": {
"Type": "AWS::Logs::LogGroup",
"DeletionPolicy": "Retain",
"UpdateReplacePolicy": "Retain",
"Properties": {
"RetentionInDays": 30,
"LogGroupName": "sleeper-test-instance-rest-api-handler",
"Tags": [
{
"Key": "DeploymentStack",
"Value": "Logging"
},
{
"Key": "InstanceID",
"Value": "test-instance"
}
]
}
},
"partitionsplittinghandler1B821F8F": {
"Type": "AWS::Logs::LogGroup",
"DeletionPolicy": "Retain",
Expand Down Expand Up @@ -26419,4 +26438,4 @@
}
}
}
}
}
Loading
Loading