Skip to content

Commit

Permalink
Generate OpenAPI paths and methods.
Browse files Browse the repository at this point in the history
Signed-off-by: dblock <[email protected]>
  • Loading branch information
dblock committed Jan 11, 2024
1 parent f577a19 commit 65af048
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,13 @@
import org.opensearch.core.xcontent.XContentBuilder;
import org.opensearch.core.xcontent.XContentParser;
import org.opensearch.rest.RestController;
import org.opensearch.rest.RestHandler;

import java.io.IOException;
import java.util.Objects;

import static org.opensearch.action.main.MainResponse.TAGLINE;

public class APIResponse extends ActionResponse implements ToXContentObject {

private Version version;
Expand Down Expand Up @@ -65,18 +68,17 @@ public void setRestController(RestController restController) {
@Override
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject();
builder.startObject("version")
.field("distribution", build.getDistribution())
.field("number", build.getQualifiedVersion())
.field("build_type", build.type().displayName())
.field("build_hash", build.hash())
.field("build_date", build.date())
.field("build_snapshot", build.isSnapshot())
.field("lucene_version", version.luceneVersion.toString())
.field("minimum_wire_compatibility_version", version.minimumCompatibilityVersion().toString())
.field("minimum_index_compatibility_version", version.minimumIndexCompatibilityVersion().toString())

builder.field("openapi", "3.0.1");

builder.startObject("info")
.field("title", build.getDistribution())
.field("description", TAGLINE)
.field("version", build.getQualifiedVersion())
.endObject();

restController.toXContent(builder, params);

builder.endObject();
return builder;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,11 @@
- do:
api: {}

- match: { version.distribution: "opensearch" }
- match: { version.number: /.*-SNAPSHOT/ }
- match: { info.title: "opensearch" }
- match: { info.version: /.*-SNAPSHOT/ }
- match: { info.description: "The OpenSearch Project: https://opensearch.org/" }

- match: { paths./_plugins/api.get: {} }

- match: { paths./:index/_upgrade.post: {} }
- match: { paths./:index/_upgrade.get: {} }
48 changes: 41 additions & 7 deletions server/src/main/java/org/opensearch/rest/RestController.java
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
import org.opensearch.core.rest.RestStatus;
import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.MediaTypeRegistry;
import org.opensearch.core.xcontent.ToXContentObject;
import org.opensearch.core.xcontent.XContentBuilder;
import org.opensearch.http.HttpServerTransport;
import org.opensearch.identity.IdentityService;
Expand All @@ -65,12 +66,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Supplier;
import java.util.function.UnaryOperator;
Expand All @@ -89,7 +85,7 @@
*
* @opensearch.api
*/
public class RestController implements HttpServerTransport.Dispatcher {
public class RestController implements HttpServerTransport.Dispatcher, ToXContentObject {

private static final Logger logger = LogManager.getLogger(RestController.class);
private static final DeprecationLogger deprecationLogger = DeprecationLogger.getLogger(RestController.class);
Expand All @@ -108,6 +104,11 @@ public class RestController implements HttpServerTransport.Dispatcher {
}

private final PathTrie<MethodHandlers> handlers = new PathTrie<>(RestUtils.REST_DECODER);
private final HashMap<String, Set<RestRequest.Method>> apis = new HashMap<>();

public HashMap<String, Set<RestRequest.Method>> getApis() {
return apis;
}

private final UnaryOperator<RestHandler> handlerWrapper;

Expand Down Expand Up @@ -219,6 +220,15 @@ protected void registerHandler(RestRequest.Method method, String path, RestHandl
}

private void registerHandlerNoWrap(RestRequest.Method method, String path, RestHandler maybeWrappedHandler) {

// TODO: traverse pathtrie
Set<RestRequest.Method> methods = apis.getOrDefault(path, null);
if (methods == null) {
methods = new HashSet<RestRequest.Method>();
apis.put(path, methods);
}
methods.add(method);

handlers.insertOrUpdate(
path,
new MethodHandlers(path, maybeWrappedHandler, method),
Expand Down Expand Up @@ -571,6 +581,30 @@ private Set<RestRequest.Method> getValidHandlerMethodSet(String rawPath) {
return validMethods;
}

@Override
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject("paths");

for (Map.Entry<String, Set<RestRequest.Method>> entry : getApis().entrySet()) {
String key = entry.getKey();
Set<RestRequest.Method> methods = entry.getValue();
builder.startObject(key.replace("{", ":").replace("}", ""));
for(RestRequest.Method method : methods) {
builder
.startObject(method.name().toLowerCase())
//.field("summary", "")
//.field("description", "")
//.startObject("responses", "")
//.endObject())
.endObject();
}
builder.endObject();
}

builder.endObject();
return builder;
}

private static final class ResourceHandlingHttpChannel implements RestChannel {
private final RestChannel delegate;
private final CircuitBreakerService circuitBreakerService;
Expand Down

0 comments on commit 65af048

Please sign in to comment.