Repository navigation
[STORY-3093] feat(dbng): add firewall rules commands - #1171
Conversation
10d0d9a to
ea3aaaa
Compare
sc-david-voisin
left a comment
There was a problem hiding this comment.
Looks good to me, however I have few questions/suggestions
| } | ||
|
|
||
| io.Statusf("Firewall rule '%s' has been added to database '%s'.\n", rule.ID, databaseID) | ||
| io.Warning("Firewall rules take time to be applied due to infrastructure provisioning.") |
There was a problem hiding this comment.
Maybe reformulate a bit. A proposition:
"Expect some delay for the firewall rules to be applied, due to infrastructure provisioning."
| return cli.ShowCommandHelp(ctx, c, "database-firewall-rules") | ||
| } | ||
|
|
||
| utils.CheckForConsent(ctx, databaseID, utils.ConsentTypeDBs) |
There was a problem hiding this comment.
question: is the consent required here?
There was a problem hiding this comment.
Because I am not sure how the consent should be used in that case. This is for a database setting, not accessing the data?
| } | ||
|
|
||
| io.Statusf("Firewall rule '%s' has been removed from database '%s'.\n", ruleID, databaseID) | ||
| io.Warning("Expect some delay for the firewall rules to be applied, due to infrastructure provisioning.") |
There was a problem hiding this comment.
nitpick: do we want to use applied here?
There was a problem hiding this comment.
@briceamen up here. Is applied applicable for removal?
curzolapierre
left a comment
There was a problem hiding this comment.
Some remarks in addition of @matthieu526-scalingo's ones
Overall, LGTM
| return cli.ShowCommandHelp(ctx, c, "database-firewall-rules") | ||
| } | ||
|
|
||
| utils.CheckForConsent(ctx, databaseID, utils.ConsentTypeDBs) |
| var databaseID, addonID string | ||
| var err error | ||
|
|
||
| switch c.Args().Len() { | ||
| case 0: | ||
| // No positional arg, database from --database flag | ||
| databaseID, addonID = detect.GetCurrentDatabase(ctx, c) | ||
| case 1: | ||
| // database-id provided as positional arg | ||
| databaseID = c.Args().First() | ||
| addonID, err = detect.GetAddonIDFromDatabase(ctx, databaseID) | ||
| if err != nil { |
There was a problem hiding this comment.
Semantically we used database "name" instead of ID. Could you apply the change elsewhere in this file?
Or do I miss something?
| var databaseID, addonID string | |
| var err error | |
| switch c.Args().Len() { | |
| case 0: | |
| // No positional arg, database from --database flag | |
| databaseID, addonID = detect.GetCurrentDatabase(ctx, c) | |
| case 1: | |
| // database-id provided as positional arg | |
| databaseID = c.Args().First() | |
| addonID, err = detect.GetAddonIDFromDatabase(ctx, databaseID) | |
| if err != nil { | |
| var databaseName, addonID string | |
| var err error | |
| switch c.Args().Len() { | |
| case 0: | |
| // No positional arg, database from --database flag | |
| databaseName, addonID = detect.GetCurrentDatabase(ctx, c) | |
| case 1: | |
| // database-name provided as positional arg | |
| databaseName = c.Args().First() | |
| addonID, err = detect.GetAddonIDFromDatabase(ctx, databaseName) | |
| if err != nil { |
| // A DBNG database is modeled as an app with a single addon (itself), | ||
| // whereas an application can have multiple addons (postgresql, redis, etc.). | ||
| // If multiple addons are returned, the ID is likely an application, not a database. | ||
| addons, err := client.AddonsList(ctx, databaseID) |
There was a problem hiding this comment.
Like before, this should be the databaseName
| addons, err := client.AddonsList(ctx, databaseID) | |
| addons, err := client.AddonsList(ctx, databaseName) |
curzolapierre
left a comment
There was a problem hiding this comment.
I've remaining questions
| if err != nil { | ||
| if err == detect.ErrTooManyArguments { | ||
| io.Error(err) | ||
| return cli.ShowCommandHelp(ctx, c, "database-firewall-rules") | ||
| } | ||
| errorQuit(ctx, err) | ||
| } | ||
|
|
There was a problem hiding this comment.
Suggestion: Could be simplified by:
| if err != nil { | |
| if err == detect.ErrTooManyArguments { | |
| io.Error(err) | |
| return cli.ShowCommandHelp(ctx, c, "database-firewall-rules") | |
| } | |
| errorQuit(ctx, err) | |
| } | |
| if errors.Is(err, detect.ErrTooManyArguments) { | |
| io.Error(err) | |
| return cli.ShowCommandHelp(ctx, c, "database-firewall-rules") | |
| } | |
| if err != nil { | |
| errorQuit(ctx, err) | |
| } | |
In addition, this is a good practice to use errors.Is instead of direct comparison.
There was a problem hiding this comment.
Much cleaner indeed. Thanks.
| if managedRange != "" && label != "" { | ||
| io.Warning("--label flag is ignored for managed ranges") | ||
| } |
There was a problem hiding this comment.
Question: are you sure we cannot add label to managed ranges?
There was a problem hiding this comment.
Oups you're right FirewallRuleCreateParams has Label as a general field (not specific to custom ranges), and FirewallRule response also has Label for all types. Will change
| if err != nil { | ||
| if err == detect.ErrTooManyArguments { | ||
| io.Error(err) | ||
| return cli.ShowCommandHelp(ctx, c, "database-firewall-managed-ranges") | ||
| } | ||
| default: | ||
| io.Error("Too many arguments") | ||
| return cli.ShowCommandHelp(ctx, c, "database-firewall-managed-ranges") | ||
| errorQuit(ctx, err) | ||
| } |
| if err != nil { | ||
| if err == detect.ErrTooManyArguments { | ||
| io.Error(err) | ||
| return cli.ShowCommandHelp(ctx, c, "database-firewall-rules-add") | ||
| } | ||
| default: | ||
| io.Error("Too many arguments") | ||
| return cli.ShowCommandHelp(ctx, c, "database-firewall-rules-add") | ||
| errorQuit(ctx, err) |
Summary
Add firewall rules management commands for DBNG databases:
database-firewall-rules- List firewall rulesdatabase-firewall-rules-add- Add custom CIDR or managed range ruledatabase-firewall-rules-remove- Remove a ruledatabase-firewall-managed-ranges- List available managed rangesCommands support both positional arguments and
--databaseflag, matching existing DBNG command patterns (database-info,database-destroy).Usage examples
Changes
GetAddonIDFromDatabasehelper indetect/app.goto resolve addon ID from database IDTest plan
Tested on staging (
osc-st-fr1) with databasetest-firewall-rules-db:Positional argument style:
database-firewall-rules test-firewall-rules-db- List rulesdatabase-firewall-managed-ranges test-firewall-rules-db- List managed rangesdatabase-firewall-rules-add test-firewall-rules-db --cidr 203.0.113.0/24 --label "Test office"- Add custom ruledatabase-firewall-rules-remove test-firewall-rules-db <rule-id>- Remove rule--database flag style:
--database test-firewall-rules-db database-firewall-rules- List rules--database test-firewall-rules-db database-firewall-rules-add --managed-range man-osc-st-fr1-egress- Add managed range--database test-firewall-rules-db database-firewall-rules-remove <rule-id>- Remove rule