-
Notifications
You must be signed in to change notification settings - Fork 140
Add cookie based routing for selected paths #188
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
2 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,111 @@ | ||
| **Trino Gateway documentation** | ||
|
|
||
| <table> | ||
| <tr> | ||
| <td> | ||
| <img src="./assets/logos/trino-gateway-v.png"/> | ||
| </td> | ||
| <td> | ||
| <ul> | ||
| <li><a href="quickstart.md">Quickstart</a></li> | ||
| <li><a href="installation.md">Installation</a></li> | ||
| <li><a href="security.md">Security</a></li> | ||
| <li><a href="operation.md">Operation</a></li> | ||
| </ul> | ||
| </td> | ||
| <td> | ||
| <ul> | ||
| <li><a href="gateway-api.md">Gateway API</a></li> | ||
| <li><a href="resource-groups-api.md">Resource groups API</a></li> | ||
| <li><a href="routing-rules.md">Routing rules</a></li> | ||
| <li><a href="routing-logic.md">Routing logic</a></li> | ||
| </ul> | ||
| </td> | ||
| <td> | ||
| <ul> | ||
| <li><a href="design.md">Design</a></li> | ||
| <li><a href="development.md">Development</a></li> | ||
| <li><a href="release-notes.md">Release notes</a></li> | ||
| <li><a href="references.md">References</a></li> | ||
| </ul> | ||
| </td> | ||
| </tr> | ||
| </table> | ||
|
|
||
| # Routing Logic | ||
|
|
||
| ## Overview | ||
|
|
||
| Trino Gateway checks incoming requests to see if they're related to previous | ||
| ones it handled. If they are, then Trino Gateway sends them to the same backend | ||
| that dealt with the earlier requests. | ||
|
|
||
| If it is a new request, the Trino Gateway refers to [Routing rules](routing-rules.md) | ||
| to decide which group of backends, called a 'Routing Group,' should handle it. | ||
| It then picks a backend from that Routing Group to handle the request using | ||
| either an adaptive or round-robin strategy. | ||
|
|
||
|  | ||
|
willmostly marked this conversation as resolved.
|
||
|
|
||
| ## Sticky routing | ||
|
|
||
| A request related to an ongoing process, or to state maintained on a single | ||
| backend cluster, must be routed to that backend for proper handling. Two | ||
| mechanisms for identifying related requests are currently implemented. By default, | ||
| only routing based on query identifier is enabled. | ||
|
|
||
| ### Routing based on query identifier (default) | ||
|
|
||
| When a query is initiated through the Trino Gateway, the query id will be | ||
| extracted from the response and mapped to the backend that provided the | ||
| response. Any subsequent request containing that query id will be forwarded | ||
| to that backend. For example, to retrieve query results, the trino client | ||
| polls a URI of the form | ||
| `v1/statement/executing/queryid/nonce/counter`. The Trino Gateway will extract | ||
| the queryid from this URI. | ||
|
|
||
| ### Routing based on cookies | ||
|
|
||
| OAuth2 authentication requires that the same backend is used for each step of | ||
| the handshake. When `gatewayCookieConfiguration.enabled` is set to true, a cookie | ||
| will be added to requests made to paths beginning with `/oauth2` unless they already have | ||
| a cookie present, which is used to route further `/oauth2/*` requests to the correct backend. | ||
| Cookies are not added to requests to `v1/*` and other Trino endpoints. | ||
|
|
||
| Trino Gateway signs its cookies to ensure that they are not tampered with. You | ||
| must set a `cookieSigningSecret` string in your configuration | ||
| ```yaml | ||
| gatewayCookieConfiguration: | ||
| enabled: true | ||
| cookieSigningSecret: "ahighentropystring" | ||
| ``` | ||
| when making use of this feature. If you load balance request across multiple Trino Gateway | ||
| instances, ensure each instance has the same `cookieSigningSecret`. | ||
|
|
||
| The Trino Gateway handles standard Trino OAuth2 handshakes with no additional | ||
| configuration. If you are using a customized or commercial Trino distribution, then | ||
| the paths used to define the OAuth handshake may be modified. | ||
|
|
||
| `routingPaths`: If the request URI starts with a path in this list, then | ||
| * If no cookie is present, add a routing cookie | ||
| * If a cookie is present, route the request to the backend defined by that cookie | ||
|
|
||
| `deletePaths`: If the request URI starts with a path in this list, | ||
| return a response that instructs the client to delete the cookie. | ||
|
|
||
| Additionally, the `lifetime` property sets the duration for which a cookie remains in | ||
| effect after creation. Ensure that it is greater than | ||
| the time required to complete the handshake. Default `lifetime` is 10 minutes. | ||
|
|
||
| These properties are defined under the `oauth2GatewayCookieConfiguration` node: | ||
|
|
||
| ```yaml | ||
|
willmostly marked this conversation as resolved.
|
||
| oauth2GatewayCookieConfiguration: | ||
| routingPaths: | ||
| - "/oauth2" | ||
| - "/custom/oauth2/callback" | ||
| - "/alternative/oauth2/initiate" | ||
| deletePaths: | ||
| - "/custom/logout" | ||
| lifetime: "5m" | ||
| ``` | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
45 changes: 45 additions & 0 deletions
45
gateway-ha/src/main/java/io/trino/gateway/ha/config/GatewayCookieConfiguration.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,45 @@ | ||
| /* | ||
| * 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 io.trino.gateway.ha.config; | ||
|
|
||
| import javax.crypto.SecretKey; | ||
| import javax.crypto.spec.SecretKeySpec; | ||
|
|
||
| import static java.nio.charset.StandardCharsets.UTF_8; | ||
|
|
||
| public class GatewayCookieConfiguration | ||
| { | ||
| private SecretKey cookieSigningKey; | ||
| private boolean enabled; | ||
|
|
||
| public boolean isEnabled() | ||
| { | ||
| return enabled; | ||
| } | ||
|
|
||
| public void setEnabled(boolean enabled) | ||
| { | ||
| this.enabled = enabled; | ||
| } | ||
|
|
||
| public SecretKey getCookieSigningKey() | ||
| { | ||
| return cookieSigningKey; | ||
| } | ||
|
|
||
| public void setCookieSigningSecret(String cookieSigningSecret) | ||
| { | ||
| cookieSigningKey = new SecretKeySpec(cookieSigningSecret.getBytes(UTF_8), "HmacSHA256"); | ||
| } | ||
| } | ||
|
willmostly marked this conversation as resolved.
|
||
57 changes: 57 additions & 0 deletions
57
...rc/main/java/io/trino/gateway/ha/config/GatewayCookieConfigurationPropertiesProvider.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,57 @@ | ||
| /* | ||
| * 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 io.trino.gateway.ha.config; | ||
|
|
||
| import javax.crypto.SecretKey; | ||
|
|
||
| public class GatewayCookieConfigurationPropertiesProvider | ||
| { | ||
| private static final GatewayCookieConfigurationPropertiesProvider instance = new GatewayCookieConfigurationPropertiesProvider(); | ||
| private GatewayCookieConfiguration gatewayCookieConfiguration; | ||
|
|
||
| private GatewayCookieConfigurationPropertiesProvider() | ||
| {} | ||
|
|
||
| public void initialize(GatewayCookieConfiguration gatewayCookieConfiguration) | ||
| { | ||
| if (gatewayCookieConfiguration.isEnabled() && gatewayCookieConfiguration.getCookieSigningKey() == null) { | ||
| throw new IllegalArgumentException("gatewayCookieConfiguration.cookieSigningSecret must be provided when cookies are enabled"); | ||
| } | ||
| this.gatewayCookieConfiguration = gatewayCookieConfiguration; | ||
| } | ||
|
|
||
| public static GatewayCookieConfigurationPropertiesProvider getInstance() | ||
| { | ||
| return instance; | ||
| } | ||
|
|
||
| public boolean isEnabled() | ||
| { | ||
| ensureInitialized(); | ||
| return gatewayCookieConfiguration.isEnabled(); | ||
| } | ||
|
|
||
| public SecretKey getCookieSigningKey() | ||
| { | ||
| ensureInitialized(); | ||
| return gatewayCookieConfiguration.getCookieSigningKey(); | ||
| } | ||
|
|
||
| private void ensureInitialized() | ||
| { | ||
| if (gatewayCookieConfiguration == null) { | ||
| throw new IllegalStateException("getInstance.initialize(GatewayCookieConfiguration) must be called before use"); | ||
| } | ||
| } | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.