Skip to content

Commit 9727e18

Browse files
authored
Update the REST API endpoint for creating snapshots (#4718)
* Update the REST API endpoint for creating snapshots * Fix REST Api due to constructor issues on generated code * Fix client usage due to rest api rename * Fix incorrect redirect at UI root
1 parent 4e39f94 commit 9727e18

File tree

11 files changed

+220
-279
lines changed

11 files changed

+220
-279
lines changed

app/src/main/java/io/apicurio/registry/rest/v3/AdminResourceImpl.java

+31-30
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,5 @@
11
package io.apicurio.registry.rest.v3;
22

3-
import static io.apicurio.common.apps.logging.audit.AuditingConstants.KEY_FOR_BROWSER;
4-
import static io.apicurio.common.apps.logging.audit.AuditingConstants.KEY_NAME;
5-
import static io.apicurio.common.apps.logging.audit.AuditingConstants.KEY_PRINCIPAL_ID;
6-
import static io.apicurio.common.apps.logging.audit.AuditingConstants.KEY_ROLE_MAPPING;
7-
import static io.apicurio.common.apps.logging.audit.AuditingConstants.KEY_RULE;
8-
import static io.apicurio.common.apps.logging.audit.AuditingConstants.KEY_RULE_TYPE;
9-
import static io.apicurio.common.apps.logging.audit.AuditingConstants.KEY_UPDATE_ROLE;
10-
import static io.apicurio.registry.util.DtoUtil.appAuthPropertyToRegistry;
11-
import static io.apicurio.registry.util.DtoUtil.registryAuthPropertyToApp;
12-
13-
import java.io.IOException;
14-
import java.io.InputStream;
15-
import java.math.BigInteger;
16-
import java.nio.charset.StandardCharsets;
17-
import java.util.HashMap;
18-
import java.util.List;
19-
import java.util.Map;
20-
import java.util.function.Supplier;
21-
import java.util.stream.Collectors;
22-
import java.util.stream.Stream;
23-
import java.util.zip.ZipInputStream;
24-
25-
import org.eclipse.microprofile.config.Config;
26-
import org.eclipse.microprofile.config.inject.ConfigProperty;
27-
import org.slf4j.Logger;
28-
293
import io.apicurio.common.apps.config.Dynamic;
304
import io.apicurio.common.apps.config.DynamicConfigPropertyDef;
315
import io.apicurio.common.apps.config.DynamicConfigPropertyDto;
@@ -46,6 +20,7 @@
4620
import io.apicurio.registry.rest.v3.beans.RoleMapping;
4721
import io.apicurio.registry.rest.v3.beans.RoleMappingSearchResults;
4822
import io.apicurio.registry.rest.v3.beans.Rule;
23+
import io.apicurio.registry.rest.v3.beans.SnapshotMetaData;
4924
import io.apicurio.registry.rest.v3.beans.UpdateConfigurationProperty;
5025
import io.apicurio.registry.rest.v3.beans.UpdateRole;
5126
import io.apicurio.registry.rest.v3.shared.DataExporter;
@@ -73,6 +48,31 @@
7348
import jakarta.ws.rs.core.Context;
7449
import jakarta.ws.rs.core.MediaType;
7550
import jakarta.ws.rs.core.Response;
51+
import org.eclipse.microprofile.config.Config;
52+
import org.eclipse.microprofile.config.inject.ConfigProperty;
53+
import org.slf4j.Logger;
54+
55+
import java.io.IOException;
56+
import java.io.InputStream;
57+
import java.math.BigInteger;
58+
import java.nio.charset.StandardCharsets;
59+
import java.util.HashMap;
60+
import java.util.List;
61+
import java.util.Map;
62+
import java.util.function.Supplier;
63+
import java.util.stream.Collectors;
64+
import java.util.stream.Stream;
65+
import java.util.zip.ZipInputStream;
66+
67+
import static io.apicurio.common.apps.logging.audit.AuditingConstants.KEY_FOR_BROWSER;
68+
import static io.apicurio.common.apps.logging.audit.AuditingConstants.KEY_NAME;
69+
import static io.apicurio.common.apps.logging.audit.AuditingConstants.KEY_PRINCIPAL_ID;
70+
import static io.apicurio.common.apps.logging.audit.AuditingConstants.KEY_ROLE_MAPPING;
71+
import static io.apicurio.common.apps.logging.audit.AuditingConstants.KEY_RULE;
72+
import static io.apicurio.common.apps.logging.audit.AuditingConstants.KEY_RULE_TYPE;
73+
import static io.apicurio.common.apps.logging.audit.AuditingConstants.KEY_UPDATE_ROLE;
74+
import static io.apicurio.registry.util.DtoUtil.appAuthPropertyToRegistry;
75+
import static io.apicurio.registry.util.DtoUtil.registryAuthPropertyToApp;
7676

7777
@ApplicationScoped
7878
@Interceptors({ResponseErrorLivenessCheck.class, ResponseTimeoutReadinessCheck.class})
@@ -109,7 +109,7 @@ public class AdminResourceImpl implements AdminResource {
109109
@Info(category = "download", description = "Download link expiry", availableSince = "2.1.2.Final")
110110
Supplier<Long> downloadHrefTtl;
111111

112-
private static final void requireParameter(String parameterName, Object parameterValue) {
112+
private static void requireParameter(String parameterName, Object parameterValue) {
113113
if (parameterValue == null) {
114114
throw new MissingRequiredParameterException(parameterName);
115115
}
@@ -135,8 +135,9 @@ public List<ArtifactTypeInfo> listArtifactTypes() {
135135

136136
@Override
137137
@Authorized(style=AuthorizedStyle.None, level=AuthorizedLevel.Admin)
138-
public void triggerSnapshot() {
138+
public SnapshotMetaData triggerSnapshot() {
139139
storage.triggerSnapshotCreation();
140+
return SnapshotMetaData.builder().build();
140141
}
141142

142143
/**
@@ -381,7 +382,7 @@ public List<ConfigurationProperty> listConfigProperties() {
381382
// Return value is the set of all dynamic config properties, with either configured or default values (depending
382383
// on whether the value is actually configured and stored in the DB or not).
383384
return dynamicPropertyIndex.getAcceptedPropertyNames().stream()
384-
.sorted((pname1, pname2) -> pname1.compareTo(pname2))
385+
.sorted(String::compareTo)
385386
.map(pname -> propsI.containsKey(pname) ? V3ApiUtil.dtoToConfigurationProperty(dynamicPropertyIndex.getProperty(pname), propsI.get(pname)) : defToConfigurationProperty(dynamicPropertyIndex.getProperty(pname)))
386387
.collect(Collectors.toList());
387388
}
@@ -454,7 +455,7 @@ private ConfigurationProperty defToConfigurationProperty(DynamicConfigPropertyDe
454455

455456
/**
456457
* Lookup the dynamic configuration property being set. Ensure that it exists (throws
457-
* a {@link NotFoundException} if it does not.
458+
* a {@link io.apicurio.registry.storage.error.NotFoundException} if it does not.
458459
* @param propertyName the name of the dynamic property
459460
* @return the dynamic config property definition
460461
*/

common/src/main/resources/META-INF/openapi.json

+25-4
Original file line numberDiff line numberDiff line change
@@ -2482,18 +2482,24 @@
24822482
"description": "Gets a list of all the configured artifact types.\n\nThis operation can fail for the following reasons:\n\n* A server error occurred (HTTP error `500`)\n"
24832483
}
24842484
},
2485-
"/admin/config/triggerSnapshot": {
2485+
"/admin/snapshots": {
24862486
"summary": "Triggers a snapshot of the Registry storage. Only supported in KafkaSQL storage",
2487-
"get": {
2487+
"post": {
24882488
"tags": [
24892489
"KafkaSQL",
24902490
"Admin",
24912491
"Snapshot"
24922492
],
24932493
"responses": {
24942494
"200": {
2495-
"content": {},
2496-
"description": "Empty content. A 200 means that the snapshot has been successfully triggered."
2495+
"content": {
2496+
"application/json": {
2497+
"schema": {
2498+
"$ref": "#/components/schemas/SnapshotMetaData"
2499+
}
2500+
}
2501+
},
2502+
"description": "The snapshot has been successfully triggered."
24972503
},
24982504
"500": {
24992505
"$ref": "#/components/responses/ServerError"
@@ -4442,6 +4448,21 @@
44424448
"createdOn"
44434449
],
44444450
"type": "string"
4451+
},
4452+
"SnapshotMetaData": {
4453+
"title": "Root Type for SnapshotMetaData",
4454+
"description": "",
4455+
"required": [
4456+
"snapshotId"
4457+
],
4458+
"type": "object",
4459+
"properties": {
4460+
"snapshotId": {
4461+
"description": "",
4462+
"type": "string"
4463+
}
4464+
},
4465+
"example": {}
44454466
}
44464467
},
44474468
"responses": {

go-sdk/pkg/registryclient-v2/models/new_comment_escaped.go

-86
This file was deleted.

go-sdk/pkg/registryclient-v3/admin/admin_request_builder.go

+5
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,8 @@ func (m *AdminRequestBuilder) RoleMappings() *RoleMappingsRequestBuilder {
4848
func (m *AdminRequestBuilder) Rules() *RulesRequestBuilder {
4949
return NewRulesRequestBuilderInternal(m.BaseRequestBuilder.PathParameters, m.BaseRequestBuilder.RequestAdapter)
5050
}
51+
52+
// Snapshots triggers a snapshot of the Registry storage. Only supported in KafkaSQL storage
53+
func (m *AdminRequestBuilder) Snapshots() *SnapshotsRequestBuilder {
54+
return NewSnapshotsRequestBuilderInternal(m.BaseRequestBuilder.PathParameters, m.BaseRequestBuilder.RequestAdapter)
55+
}

go-sdk/pkg/registryclient-v3/admin/config_trigger_snapshot_request_builder.go

-70
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package admin
2+
3+
import (
4+
"context"
5+
i00eb2e63d156923d00d8e86fe16b5d74daf30e363c9f185a8165cb42aa2f2c71 "github.com/apicurio/apicurio-registry/go-sdk/pkg/registryclient-v3/models"
6+
i2ae4187f7daee263371cb1c977df639813ab50ffa529013b7437480d1ec0158f "github.com/microsoft/kiota-abstractions-go"
7+
)
8+
9+
// SnapshotsRequestBuilder triggers a snapshot of the Registry storage. Only supported in KafkaSQL storage
10+
type SnapshotsRequestBuilder struct {
11+
i2ae4187f7daee263371cb1c977df639813ab50ffa529013b7437480d1ec0158f.BaseRequestBuilder
12+
}
13+
14+
// SnapshotsRequestBuilderPostRequestConfiguration configuration for the request such as headers, query parameters, and middleware options.
15+
type SnapshotsRequestBuilderPostRequestConfiguration struct {
16+
// Request headers
17+
Headers *i2ae4187f7daee263371cb1c977df639813ab50ffa529013b7437480d1ec0158f.RequestHeaders
18+
// Request options
19+
Options []i2ae4187f7daee263371cb1c977df639813ab50ffa529013b7437480d1ec0158f.RequestOption
20+
}
21+
22+
// NewSnapshotsRequestBuilderInternal instantiates a new SnapshotsRequestBuilder and sets the default values.
23+
func NewSnapshotsRequestBuilderInternal(pathParameters map[string]string, requestAdapter i2ae4187f7daee263371cb1c977df639813ab50ffa529013b7437480d1ec0158f.RequestAdapter) *SnapshotsRequestBuilder {
24+
m := &SnapshotsRequestBuilder{
25+
BaseRequestBuilder: *i2ae4187f7daee263371cb1c977df639813ab50ffa529013b7437480d1ec0158f.NewBaseRequestBuilder(requestAdapter, "{+baseurl}/admin/snapshots", pathParameters),
26+
}
27+
return m
28+
}
29+
30+
// NewSnapshotsRequestBuilder instantiates a new SnapshotsRequestBuilder and sets the default values.
31+
func NewSnapshotsRequestBuilder(rawUrl string, requestAdapter i2ae4187f7daee263371cb1c977df639813ab50ffa529013b7437480d1ec0158f.RequestAdapter) *SnapshotsRequestBuilder {
32+
urlParams := make(map[string]string)
33+
urlParams["request-raw-url"] = rawUrl
34+
return NewSnapshotsRequestBuilderInternal(urlParams, requestAdapter)
35+
}
36+
37+
// Post triggers the creation of a snapshot of the internal database for compatible storages.This operation can fail for the following reasons:* A server error occurred (HTTP error `500`)
38+
func (m *SnapshotsRequestBuilder) Post(ctx context.Context, requestConfiguration *SnapshotsRequestBuilderPostRequestConfiguration) (i00eb2e63d156923d00d8e86fe16b5d74daf30e363c9f185a8165cb42aa2f2c71.SnapshotMetaDataable, error) {
39+
requestInfo, err := m.ToPostRequestInformation(ctx, requestConfiguration)
40+
if err != nil {
41+
return nil, err
42+
}
43+
errorMapping := i2ae4187f7daee263371cb1c977df639813ab50ffa529013b7437480d1ec0158f.ErrorMappings{
44+
"500": i00eb2e63d156923d00d8e86fe16b5d74daf30e363c9f185a8165cb42aa2f2c71.CreateErrorFromDiscriminatorValue,
45+
}
46+
res, err := m.BaseRequestBuilder.RequestAdapter.Send(ctx, requestInfo, i00eb2e63d156923d00d8e86fe16b5d74daf30e363c9f185a8165cb42aa2f2c71.CreateSnapshotMetaDataFromDiscriminatorValue, errorMapping)
47+
if err != nil {
48+
return nil, err
49+
}
50+
if res == nil {
51+
return nil, nil
52+
}
53+
return res.(i00eb2e63d156923d00d8e86fe16b5d74daf30e363c9f185a8165cb42aa2f2c71.SnapshotMetaDataable), nil
54+
}
55+
56+
// ToPostRequestInformation triggers the creation of a snapshot of the internal database for compatible storages.This operation can fail for the following reasons:* A server error occurred (HTTP error `500`)
57+
func (m *SnapshotsRequestBuilder) ToPostRequestInformation(ctx context.Context, requestConfiguration *SnapshotsRequestBuilderPostRequestConfiguration) (*i2ae4187f7daee263371cb1c977df639813ab50ffa529013b7437480d1ec0158f.RequestInformation, error) {
58+
requestInfo := i2ae4187f7daee263371cb1c977df639813ab50ffa529013b7437480d1ec0158f.NewRequestInformationWithMethodAndUrlTemplateAndPathParameters(i2ae4187f7daee263371cb1c977df639813ab50ffa529013b7437480d1ec0158f.POST, m.BaseRequestBuilder.UrlTemplate, m.BaseRequestBuilder.PathParameters)
59+
if requestConfiguration != nil {
60+
requestInfo.Headers.AddAll(requestConfiguration.Headers)
61+
requestInfo.AddRequestOptions(requestConfiguration.Options)
62+
}
63+
requestInfo.Headers.TryAdd("Accept", "application/json")
64+
return requestInfo, nil
65+
}
66+
67+
// WithUrl returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
68+
func (m *SnapshotsRequestBuilder) WithUrl(rawUrl string) *SnapshotsRequestBuilder {
69+
return NewSnapshotsRequestBuilder(rawUrl, m.BaseRequestBuilder.RequestAdapter)
70+
}

0 commit comments

Comments
 (0)