diff --git a/src/main/java/org/opensearch/ad/rest/AbstractSearchAction.java b/src/main/java/org/opensearch/ad/rest/AbstractSearchAction.java index db0ee3315..c60aa504e 100644 --- a/src/main/java/org/opensearch/ad/rest/AbstractSearchAction.java +++ b/src/main/java/org/opensearch/ad/rest/AbstractSearchAction.java @@ -15,6 +15,8 @@ import static org.opensearch.common.xcontent.XContentFactory.jsonBuilder; import static org.opensearch.common.xcontent.XContentParserUtils.ensureExpectedToken; import static org.opensearch.core.xcontent.ToXContent.EMPTY_PARAMS; +import static org.opensearch.rest.RestRequest.Method.GET; +import static org.opensearch.rest.RestRequest.Method.POST; import java.io.IOException; import java.util.ArrayList; @@ -45,8 +47,10 @@ import org.opensearch.core.xcontent.XContentParser; import org.opensearch.extensions.rest.ExtensionRestResponse; import org.opensearch.rest.BytesRestResponse; +import org.opensearch.rest.NamedRoute; import org.opensearch.rest.RestChannel; import org.opensearch.rest.RestRequest; +import org.opensearch.rest.RestResponse; import org.opensearch.rest.RestStatus; import org.opensearch.sdk.ExtensionsRunner; import org.opensearch.sdk.SDKClient.SDKRestClient; @@ -88,7 +92,7 @@ public AbstractSearchAction( this.extensionsRunner = extensionsRunner; } - private Function handleRequest = (request) -> { + private Function handleRequest = (request) -> { try { return prepareRequest(request); } catch (Exception e) { @@ -170,11 +174,13 @@ protected ExtensionRestResponse search(RestRequest request, SearchResponse respo return new ExtensionRestResponse(request, RestStatus.OK, response.toXContent(JsonXContent.contentBuilder(), EMPTY_PARAMS)); } - public List routeHandlers() { - List routes = new ArrayList<>(); + @Override + public List routes() { + List routes = new ArrayList<>(); for (String path : urlPaths) { - routes.add(new RouteHandler(RestRequest.Method.POST, path, handleRequest)); - routes.add(new RouteHandler(RestRequest.Method.GET, path, handleRequest)); + routes + .add(new NamedRoute.Builder().method(POST).path(path).uniqueName(addRouteNamePrefix(path)).handler(handleRequest).build()); + routes.add(new NamedRoute.Builder().method(GET).path(path).uniqueName(addRouteNamePrefix(path)).handler(handleRequest).build()); } return routes; } @@ -183,16 +189,7 @@ public List routeHandlers() { public List replacedRouteHandlers() { List replacedRoutes = new ArrayList<>(); for (Pair deprecatedPath : deprecatedPaths) { - replacedRoutes - .add( - new ReplacedRouteHandler( - RestRequest.Method.POST, - deprecatedPath.getKey(), - RestRequest.Method.POST, - deprecatedPath.getValue(), - handleRequest - ) - ); + replacedRoutes.add(new ReplacedRouteHandler(POST, deprecatedPath.getKey(), POST, deprecatedPath.getValue(), handleRequest)); replacedRoutes .add( new ReplacedRouteHandler( diff --git a/src/main/java/org/opensearch/ad/rest/RestAnomalyDetectorJobAction.java b/src/main/java/org/opensearch/ad/rest/RestAnomalyDetectorJobAction.java index 3f6505609..29ed0189a 100644 --- a/src/main/java/org/opensearch/ad/rest/RestAnomalyDetectorJobAction.java +++ b/src/main/java/org/opensearch/ad/rest/RestAnomalyDetectorJobAction.java @@ -56,6 +56,7 @@ import org.opensearch.jobscheduler.JobSchedulerPlugin; import org.opensearch.jobscheduler.rest.request.GetJobDetailsRequest; import org.opensearch.rest.RestRequest; +import org.opensearch.rest.RestResponse; import org.opensearch.rest.RestStatus; import org.opensearch.sdk.ExtensionsRunner; import org.opensearch.sdk.SDKClient.SDKRestClient; @@ -173,7 +174,7 @@ public List replacedRouteHandlers() { ); } - private Function handleRequest = (request) -> { + private Function handleRequest = (request) -> { try { return prepareRequest(request); } catch (Exception e) { diff --git a/src/main/java/org/opensearch/ad/rest/RestDeleteAnomalyDetectorAction.java b/src/main/java/org/opensearch/ad/rest/RestDeleteAnomalyDetectorAction.java index 1566d5b96..d01462b48 100644 --- a/src/main/java/org/opensearch/ad/rest/RestDeleteAnomalyDetectorAction.java +++ b/src/main/java/org/opensearch/ad/rest/RestDeleteAnomalyDetectorAction.java @@ -36,6 +36,7 @@ import org.opensearch.core.xcontent.ToXContent; import org.opensearch.extensions.rest.ExtensionRestResponse; import org.opensearch.rest.RestRequest; +import org.opensearch.rest.RestResponse; import org.opensearch.rest.RestStatus; import org.opensearch.sdk.ExtensionsRunner; import org.opensearch.sdk.SDKClient.SDKRestClient; @@ -105,7 +106,7 @@ public List replacedRouteHandlers() { ); } - private Function handleRequest = (request) -> { + private Function handleRequest = (request) -> { try { return prepareRequest(request); } catch (Exception e) { diff --git a/src/main/java/org/opensearch/ad/rest/RestDeleteAnomalyResultsAction.java b/src/main/java/org/opensearch/ad/rest/RestDeleteAnomalyResultsAction.java index 9bd0ce8d0..ba5556665 100644 --- a/src/main/java/org/opensearch/ad/rest/RestDeleteAnomalyResultsAction.java +++ b/src/main/java/org/opensearch/ad/rest/RestDeleteAnomalyResultsAction.java @@ -12,6 +12,7 @@ package org.opensearch.ad.rest; import static org.opensearch.ad.indices.AnomalyDetectionIndices.ALL_AD_RESULTS_INDEX_PATTERN; +import static org.opensearch.rest.RestRequest.Method.DELETE; import java.io.IOException; import java.util.List; @@ -34,7 +35,9 @@ import org.opensearch.extensions.rest.ExtensionRestResponse; import org.opensearch.index.reindex.BulkByScrollResponse; import org.opensearch.index.reindex.DeleteByQueryRequest; +import org.opensearch.rest.NamedRoute; import org.opensearch.rest.RestRequest; +import org.opensearch.rest.RestResponse; import org.opensearch.rest.RestStatus; import org.opensearch.sdk.ExtensionsRunner; import org.opensearch.sdk.SDKClient.SDKRestClient; @@ -71,7 +74,7 @@ public String getName() { return DELETE_AD_RESULTS_ACTION; } - private Function handleRequest = (request) -> { + private Function handleRequest = (request) -> { try { return prepareRequest(request); } catch (Exception e) { @@ -112,8 +115,16 @@ protected ExtensionRestResponse prepareRequest(RestRequest request) throws IOExc } @Override - public List routeHandlers() { + public List routes() { + String path = AnomalyDetectorExtension.AD_BASE_DETECTORS_URI + "/results"; return ImmutableList - .of(new RouteHandler(RestRequest.Method.DELETE, AnomalyDetectorExtension.AD_BASE_DETECTORS_URI + "/results", handleRequest)); + .of( + new NamedRoute.Builder() + .method(DELETE) + .path(path) + .uniqueName(addRouteNamePrefix("detectors/results")) + .handler(handleRequest) + .build() + ); } } diff --git a/src/main/java/org/opensearch/ad/rest/RestExecuteAnomalyDetectorAction.java b/src/main/java/org/opensearch/ad/rest/RestExecuteAnomalyDetectorAction.java index b5028ba6c..1e43924ce 100644 --- a/src/main/java/org/opensearch/ad/rest/RestExecuteAnomalyDetectorAction.java +++ b/src/main/java/org/opensearch/ad/rest/RestExecuteAnomalyDetectorAction.java @@ -41,6 +41,7 @@ import org.opensearch.core.xcontent.XContentParser; import org.opensearch.extensions.rest.ExtensionRestResponse; import org.opensearch.rest.RestRequest; +import org.opensearch.rest.RestResponse; import org.opensearch.rest.RestStatus; import org.opensearch.sdk.ExtensionsRunner; import org.opensearch.sdk.SDKClient.SDKRestClient; @@ -110,7 +111,7 @@ protected ExtensionRestResponse prepareRequest(RestRequest request) throws IOExc ); } - private Function handleRequest = (request) -> { + private Function handleRequest = (request) -> { try { return prepareRequest(request); } catch (Exception e) { diff --git a/src/main/java/org/opensearch/ad/rest/RestGetAnomalyDetectorAction.java b/src/main/java/org/opensearch/ad/rest/RestGetAnomalyDetectorAction.java index 00ff8af22..779b7e82f 100644 --- a/src/main/java/org/opensearch/ad/rest/RestGetAnomalyDetectorAction.java +++ b/src/main/java/org/opensearch/ad/rest/RestGetAnomalyDetectorAction.java @@ -14,6 +14,7 @@ import static org.opensearch.ad.util.RestHandlerUtils.DETECTOR_ID; import static org.opensearch.ad.util.RestHandlerUtils.PROFILE; import static org.opensearch.ad.util.RestHandlerUtils.TYPE; +import static org.opensearch.rest.RestRequest.Method.POST; import java.io.IOException; import java.util.List; @@ -40,7 +41,9 @@ import org.opensearch.core.common.Strings; import org.opensearch.core.xcontent.ToXContent; import org.opensearch.extensions.rest.ExtensionRestResponse; +import org.opensearch.rest.NamedRoute; import org.opensearch.rest.RestRequest; +import org.opensearch.rest.RestResponse; import org.opensearch.rest.RestStatus; import org.opensearch.rest.action.RestActions; import org.opensearch.sdk.ExtensionsRunner; @@ -109,7 +112,7 @@ protected ExtensionRestResponse prepareRequest(RestRequest request) throws IOExc return getAnomalyDetectorResponse(request, response); } - private Function handleRequest = (request) -> { + private Function handleRequest = (request) -> { try { return prepareRequest(request); } catch (Exception e) { @@ -119,21 +122,22 @@ protected ExtensionRestResponse prepareRequest(RestRequest request) throws IOExc }; @Override - public List routeHandlers() { + public List routes() { return ImmutableList .of( // Opensearch-only API. Considering users may provide entity in the search body, support POST as well. - new RouteHandler( - RestRequest.Method.POST, - String.format(Locale.ROOT, "%s/{%s}/%s", AnomalyDetectorExtension.AD_BASE_DETECTORS_URI, DETECTOR_ID, PROFILE), - handleRequest - ), - new RouteHandler( - RestRequest.Method.POST, - String - .format(Locale.ROOT, "%s/{%s}/%s/{%s}", AnomalyDetectorExtension.AD_BASE_DETECTORS_URI, DETECTOR_ID, PROFILE, TYPE), - handleRequest - ) + new NamedRoute.Builder() + .method(POST) + .path(String.format(Locale.ROOT, "%s/{%s}/%s", AnomalyDetectorExtension.AD_BASE_DETECTORS_URI, DETECTOR_ID, PROFILE)) + .uniqueName(addRouteNamePrefix("detectors/profile")) + .handler(handleRequest) + .build(), + new NamedRoute.Builder() + .method(POST) + .path(String.format(Locale.ROOT, "%s/{%s}/%s", AnomalyDetectorExtension.AD_BASE_DETECTORS_URI, DETECTOR_ID, TYPE)) + .uniqueName(addRouteNamePrefix("detectors/type")) + .handler(handleRequest) + .build() ); } diff --git a/src/main/java/org/opensearch/ad/rest/RestIndexAnomalyDetectorAction.java b/src/main/java/org/opensearch/ad/rest/RestIndexAnomalyDetectorAction.java index 66369b0e4..12117826c 100644 --- a/src/main/java/org/opensearch/ad/rest/RestIndexAnomalyDetectorAction.java +++ b/src/main/java/org/opensearch/ad/rest/RestIndexAnomalyDetectorAction.java @@ -43,6 +43,7 @@ import org.opensearch.extensions.rest.ExtensionRestResponse; import org.opensearch.index.seqno.SequenceNumbers; import org.opensearch.rest.RestRequest; +import org.opensearch.rest.RestResponse; import org.opensearch.rest.RestStatus; import org.opensearch.sdk.ExtensionsRunner; import org.opensearch.sdk.SDKClient.SDKRestClient; @@ -154,7 +155,7 @@ public List replacedRouteHandlers() { ); } - private Function handleRequest = (request) -> { + private Function handleRequest = (request) -> { try { return prepareRequest(request); } catch (Exception e) { diff --git a/src/main/java/org/opensearch/ad/rest/RestPreviewAnomalyDetectorAction.java b/src/main/java/org/opensearch/ad/rest/RestPreviewAnomalyDetectorAction.java index aba55ac41..6ed659b05 100644 --- a/src/main/java/org/opensearch/ad/rest/RestPreviewAnomalyDetectorAction.java +++ b/src/main/java/org/opensearch/ad/rest/RestPreviewAnomalyDetectorAction.java @@ -13,6 +13,7 @@ import static org.opensearch.ad.util.RestHandlerUtils.PREVIEW; import static org.opensearch.common.xcontent.XContentParserUtils.ensureExpectedToken; +import static org.opensearch.rest.RestRequest.Method.POST; import java.io.IOException; import java.util.List; @@ -40,7 +41,9 @@ import org.opensearch.core.xcontent.ToXContent; import org.opensearch.core.xcontent.XContentParser; import org.opensearch.extensions.rest.ExtensionRestResponse; +import org.opensearch.rest.NamedRoute; import org.opensearch.rest.RestRequest; +import org.opensearch.rest.RestResponse; import org.opensearch.rest.RestStatus; import org.opensearch.sdk.ExtensionsRunner; import org.opensearch.sdk.SDKClient.SDKRestClient; @@ -67,7 +70,7 @@ public String getName() { return PREVIEW_ANOMALY_DETECTOR_ACTION; } - private Function handleRequest = (request) -> { + private Function handleRequest = (request) -> { try { return prepareRequest(request); } catch (Exception e) { @@ -138,15 +141,16 @@ private String validateAdExecutionInput(AnomalyDetectorExecutionInput input) { } @Override - public List routeHandlers() { + public List routes() { return ImmutableList .of( // preview detector - new RouteHandler( - RestRequest.Method.POST, - String.format(Locale.ROOT, "%s/%s", AnomalyDetectorExtension.AD_BASE_DETECTORS_URI, PREVIEW), - handleRequest - ) + new NamedRoute.Builder() + .method(POST) + .path(String.format(String.format(Locale.ROOT, "%s/%s", AnomalyDetectorExtension.AD_BASE_DETECTORS_URI, PREVIEW))) + .uniqueName(addRouteNamePrefix("detectors/preview")) + .handler(handleRequest) + .build() ); } diff --git a/src/main/java/org/opensearch/ad/rest/RestSearchAnomalyDetectorInfoAction.java b/src/main/java/org/opensearch/ad/rest/RestSearchAnomalyDetectorInfoAction.java index 02b4af691..51a06f159 100644 --- a/src/main/java/org/opensearch/ad/rest/RestSearchAnomalyDetectorInfoAction.java +++ b/src/main/java/org/opensearch/ad/rest/RestSearchAnomalyDetectorInfoAction.java @@ -34,8 +34,9 @@ import org.opensearch.common.xcontent.json.JsonXContent; import org.opensearch.core.xcontent.ToXContent; import org.opensearch.extensions.rest.ExtensionRestResponse; -import org.opensearch.rest.RestHandler; +import org.opensearch.rest.NamedRoute; import org.opensearch.rest.RestRequest; +import org.opensearch.rest.RestResponse; import org.opensearch.rest.RestStatus; import org.opensearch.sdk.ExtensionsRunner; import org.opensearch.sdk.SDKClient.SDKRestClient; @@ -61,7 +62,7 @@ public String getName() { return SEARCH_ANOMALY_DETECTOR_INFO_ACTION; } - private Function handleRequest = (request) -> { + private Function handleRequest = (request) -> { try { return prepareRequest(request); } catch (Exception e) { @@ -105,7 +106,7 @@ protected ExtensionRestResponse prepareRequest(RestRequest request) throws IOExc } @Override - public List routes() { + public List routes() { return ImmutableList.of(); } diff --git a/src/main/java/org/opensearch/ad/rest/RestSearchTopAnomalyResultAction.java b/src/main/java/org/opensearch/ad/rest/RestSearchTopAnomalyResultAction.java index 2a5296140..ffd2f4ad0 100644 --- a/src/main/java/org/opensearch/ad/rest/RestSearchTopAnomalyResultAction.java +++ b/src/main/java/org/opensearch/ad/rest/RestSearchTopAnomalyResultAction.java @@ -12,6 +12,8 @@ package org.opensearch.ad.rest; import static org.opensearch.common.xcontent.XContentParserUtils.ensureExpectedToken; +import static org.opensearch.rest.RestRequest.Method.GET; +import static org.opensearch.rest.RestRequest.Method.POST; import java.io.IOException; import java.util.List; @@ -33,7 +35,9 @@ import org.opensearch.core.xcontent.ToXContent; import org.opensearch.core.xcontent.XContentParser; import org.opensearch.extensions.rest.ExtensionRestResponse; +import org.opensearch.rest.NamedRoute; import org.opensearch.rest.RestRequest; +import org.opensearch.rest.RestResponse; import org.opensearch.rest.RestStatus; import org.opensearch.sdk.ExtensionsRunner; import org.opensearch.sdk.SDKClient.SDKRestClient; @@ -68,7 +72,7 @@ public String getName() { return SEARCH_TOP_ANOMALY_DETECTOR_ACTION; } - private Function handleRequest = (request) -> { + private Function handleRequest = (request) -> { try { return prepareRequest(request); } catch (Exception e) { @@ -131,11 +135,21 @@ private SearchTopAnomalyResultRequest getSearchTopAnomalyResultRequest(RestReque } @Override - public List routeHandlers() { + public List routes() { return ImmutableList .of( - new RouteHandler(RestRequest.Method.POST, URL_PATH, handleRequest), - new RouteHandler(RestRequest.Method.GET, URL_PATH, handleRequest) + new NamedRoute.Builder() + .method(POST) + .path(URL_PATH) + .uniqueName(addRouteNamePrefix("search/post/topresults")) + .handler(handleRequest) + .build(), + new NamedRoute.Builder() + .method(GET) + .path(URL_PATH) + .uniqueName(addRouteNamePrefix("search/read/topresults")) + .handler(handleRequest) + .build() ); } } diff --git a/src/main/java/org/opensearch/ad/rest/RestStatsAnomalyDetectorAction.java b/src/main/java/org/opensearch/ad/rest/RestStatsAnomalyDetectorAction.java index a343dad00..57b857cfb 100644 --- a/src/main/java/org/opensearch/ad/rest/RestStatsAnomalyDetectorAction.java +++ b/src/main/java/org/opensearch/ad/rest/RestStatsAnomalyDetectorAction.java @@ -44,6 +44,7 @@ import org.opensearch.core.xcontent.XContentBuilder; import org.opensearch.extensions.rest.ExtensionRestResponse; import org.opensearch.rest.RestRequest; +import org.opensearch.rest.RestResponse; import org.opensearch.rest.RestStatus; import org.opensearch.sdk.ExtensionsRunner; import org.opensearch.sdk.SDKClient.SDKRestClient; @@ -115,7 +116,7 @@ public List replacedRouteHandlers() { ); } - private Function handleRequest = (request) -> { + private Function handleRequest = (request) -> { try { return prepareRequest(request); } catch (Exception e) { diff --git a/src/main/java/org/opensearch/ad/rest/RestValidateAnomalyDetectorAction.java b/src/main/java/org/opensearch/ad/rest/RestValidateAnomalyDetectorAction.java index 66078e384..c336dc6fc 100644 --- a/src/main/java/org/opensearch/ad/rest/RestValidateAnomalyDetectorAction.java +++ b/src/main/java/org/opensearch/ad/rest/RestValidateAnomalyDetectorAction.java @@ -14,6 +14,7 @@ import static org.opensearch.ad.util.RestHandlerUtils.TYPE; import static org.opensearch.ad.util.RestHandlerUtils.VALIDATE; import static org.opensearch.common.xcontent.XContentParserUtils.ensureExpectedToken; +import static org.opensearch.rest.RestRequest.Method.POST; import java.io.IOException; import java.util.Arrays; @@ -45,7 +46,9 @@ import org.opensearch.core.xcontent.ToXContent; import org.opensearch.core.xcontent.XContentParser; import org.opensearch.extensions.rest.ExtensionRestResponse; +import org.opensearch.rest.NamedRoute; import org.opensearch.rest.RestRequest; +import org.opensearch.rest.RestResponse; import org.opensearch.rest.RestStatus; import org.opensearch.sdk.ExtensionsRunner; import org.opensearch.sdk.SDKClient.SDKRestClient; @@ -78,23 +81,25 @@ public String getName() { } @Override - public List routeHandlers() { + public List routes() { return ImmutableList .of( - new RouteHandler( - RestRequest.Method.POST, - String.format(Locale.ROOT, "%s/%s", AnomalyDetectorExtension.AD_BASE_DETECTORS_URI, VALIDATE), - handleRequest - ), - new RouteHandler( - RestRequest.Method.POST, - String.format(Locale.ROOT, "%s/%s/{%s}", AnomalyDetectorExtension.AD_BASE_DETECTORS_URI, VALIDATE, TYPE), - handleRequest - ) + new NamedRoute.Builder() + .method(POST) + .path(String.format(Locale.ROOT, "%s/%s", AnomalyDetectorExtension.AD_BASE_DETECTORS_URI, VALIDATE)) + .uniqueName(addRouteNamePrefix("detectors/validate")) + .handler(handleRequest) + .build(), + new NamedRoute.Builder() + .method(POST) + .path(String.format(Locale.ROOT, "%s/%s/{%s}", AnomalyDetectorExtension.AD_BASE_DETECTORS_URI, VALIDATE, TYPE)) + .uniqueName(addRouteNamePrefix("detectors/validate/type")) + .handler(handleRequest) + .build() ); } - private Function handleRequest = (request) -> { + private Function handleRequest = (request) -> { try { return prepareRequest(request); } catch (Exception e) { diff --git a/src/main/resources/ad-extension.yml b/src/main/resources/ad-extension.yml index cb6e52265..001d2dbe1 100644 --- a/src/main/resources/ad-extension.yml +++ b/src/main/resources/ad-extension.yml @@ -3,3 +3,4 @@ hostAddress: 127.0.0.1 hostPort: 4532 opensearchAddress: 127.0.0.1 opensearchPort: 9200 +routeNamePrefix: ad