Skip to content
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

feat: add destinationID to rETL endpoint #4234

Merged
merged 7 commits into from
Jan 9, 2024
Merged

feat: add destinationID to rETL endpoint #4234

merged 7 commits into from
Jan 9, 2024

Conversation

mihir20
Copy link
Contributor

@mihir20 mihir20 commented Dec 13, 2023

Description

Adding Destination ID to rETL endpoint to provide a way for rETL to send an event from a source to a destination. If there are multiple sources rETL will call /retl endpoint multiple times to deliver to multiple destinations.

  • Destination ID will be stored in parameters column along with source ID

Linear Ticket

Pipe-619

Security

  • The code changed/added as part of this pull request won't create any security issues with how the software is being used.

Copy link
Contributor

coderabbitai bot commented Dec 13, 2023

Important

Auto Review Skipped

Auto reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository.

To trigger a single review, invoke the @coderabbitai review command.

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

Share

Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>.
    • Generate unit-tests for this file.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit tests for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai generate interesting stats about this repository from git and render them as a table.
    • @coderabbitai show all the console.log statements in this repository.
    • @coderabbitai read src/utils.ts and generate unit tests.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (invoked as PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger a review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai help to get help.

Additionally, you can add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.

CodeRabbit Configration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • The JSON schema for the configuration file is available here.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/coderabbit-overrides.v2.json

CodeRabbit Discord Community

Join our Discord Community to get help, request features, and share feedback.

Copy link

codecov bot commented Dec 13, 2023

Codecov Report

Attention: 3 lines in your changes are missing coverage. Please review.

Comparison is base (bd365b5) 73.98% compared to head (c32f8fb) 74.01%.

Files Patch % Lines
gateway/handle.go 50.00% 2 Missing and 1 partial ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##           master    #4234      +/-   ##
==========================================
+ Coverage   73.98%   74.01%   +0.03%     
==========================================
  Files         388      389       +1     
  Lines       55127    55179      +52     
==========================================
+ Hits        40784    40843      +59     
+ Misses      12017    12013       -4     
+ Partials     2326     2323       -3     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

gateway/handle.go Outdated Show resolved Hide resolved
gateway/response/response.go Outdated Show resolved Hide resolved
gateway/response/response.go Outdated Show resolved Hide resolved
gateway/response/response.go Outdated Show resolved Hide resolved
gateway/internal/types/types.go Outdated Show resolved Hide resolved
gateway/handle_http_auth.go Outdated Show resolved Hide resolved
}
isValidDestination, isDestinationEnabled := gw.validateDestinationID(destinationID, arctx)
if !isValidDestination {
errorMessage = response.InvalidDestinationID
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't this be DestinationNotFound instead of InvalidDestinationID?

Suggested change
errorMessage = response.InvalidDestinationID
errorMessage = response.DestinationNotFound

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can destination not found can be considered as a case of Invalid destination, similar to what we are doing for Source ID not found?

gateway/handle_http_auth.go Outdated Show resolved Hide resolved
gateway/handle_http_auth.go Outdated Show resolved Hide resolved
gateway/handle_http_auth.go Outdated Show resolved Hide resolved
gateway/handle_http_auth.go Outdated Show resolved Hide resolved
gateway/handle_http_auth.go Outdated Show resolved Hide resolved
gateway/handle_http_auth.go Outdated Show resolved Hide resolved
Comment on lines +10 to +19
func GetRequestTypeFromCtx(ctx context.Context) (string, bool) {
reqType, ok := ctx.Value(gwtypes.CtxParamCallType).(string)
return reqType, ok
}

// GetAuthRequestFromCtx : get auth request from context
func GetAuthRequestFromCtx(ctx context.Context) (*gwtypes.AuthRequestContext, bool) {
authReqCtx, ok := ctx.Value(gwtypes.CtxParamAuthRequestContext).(*gwtypes.AuthRequestContext)
return authReqCtx, ok
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't these be used everywhere now that they exist? What's the point of returning the second value (bool) if nobody cares about it in practice? Would it be more sincere to rename these functions to MustGetXxx and panic if casting fails?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

added handling for bool, we will fail request with ISE if we are not able to get these from context, As we don't want our application to panic in such cases.

@@ -27,6 +27,8 @@ type AuthRequestContext struct {
SourceJobRunID string
SourceTaskRunID string
Source backendconfig.SourceT
// DestinationID is optional param, destination id will be present for rETL Request
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure if we need this comment. SourceJobRunID & SourceTaskRunID are both optional as well & we don't mention when they are going to be present. One reason why we would choose not to include such comments would be change, i.e. at some point we will decide to change (when these will be present) and almost certainly we'll forget to update the relevant comments! So we end up with invalid comments!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IMO its better to keep this comment, and if we start using this field for cases we should update the comment, this way we can keep more readable and intuitive. Or we can just add a comment that this field is optional. That way reading through the code might give us a better understanding that these fields may or many not necessarily
always be available.

@mihir20 mihir20 requested a review from atzoum December 21, 2023 10:10
gw.handleFailureStats(errorMessage, reqType, arctx)
}()
reqType, ok := gwCtx.GetRequestTypeFromCtx(r.Context())
if !ok {
Copy link
Contributor

@atzoum atzoum Dec 27, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Now we need test scenarios for the !ok conditions :)
Another reason why I was proposing to not provide the option to use this method separately without embedding sourceIDAuth in it :)

Copy link
Contributor Author

@mihir20 mihir20 Dec 28, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adding tests should be fine this way we will be able to prevent panics in the server code.

ref: #4234 (comment)

@mihir20 mihir20 requested a review from atzoum December 28, 2023 07:56
@@ -119,6 +123,57 @@ func (gw *Handle) sourceIDAuth(delegate http.HandlerFunc) http.HandlerFunc {
}
}

// authDestIDForSource middleware to authenticate destinationId in the X-Rudder-Destination-Id header.
// If the destinationId is invalid, the request is rejected.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we really need to validate destinationId at the gateway level? The requests will anyways be filtered out in processor and since it is only an internal endpoint don't think sources would send an invalid destinationId. We could just accept whatever we get in the gateway level and move on

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IMO we should not trust what's coming in requests, we should always validate critical inputs.

@mihir20 mihir20 merged commit 2c02dc2 into master Jan 9, 2024
42 checks passed
@achettyiitr achettyiitr deleted the mihir/pipe-619 branch January 12, 2024 06:00
This was referenced Jan 15, 2024
This was referenced Feb 9, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants