Skip to content

Commit

Permalink
Merge pull request petoju#1 from Giphy/feat-binlog-retention
Browse files Browse the repository at this point in the history
Feat binlog retention
  • Loading branch information
cemdorst authored Jan 17, 2023
2 parents 2af7c56 + f9d0980 commit 56e6f33
Show file tree
Hide file tree
Showing 3 changed files with 200 additions and 8 deletions.
51 changes: 51 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# This GitHub action can publish assets for release when a tag is created.
# Currently its setup to run on any tag that matches the pattern "v*" (ie. v0.1.0).
#
# This uses an action (hashicorp/ghaction-import-gpg) that assumes you set your
# private key in the `GPG_PRIVATE_KEY` secret and passphrase in the `PASSPHRASE`
# secret. If you would rather own your own GPG handling, please fork this action
# or use an alternative one for key handling.
#
# You will need to pass the `--batch` flag to `gpg` in your signing step
# in `goreleaser` to indicate this is being used in a non-interactive mode.
#
name: release
on:
push:
tags:
- 'v*'
permissions:
contents: write
jobs:
goreleaser:
runs-on: ubuntu-latest
steps:
-
name: Checkout
uses: actions/checkout@v3
-
name: Unshallow
run: git fetch --prune --unshallow
-
name: Set up Go
uses: actions/setup-go@v3
with:
go-version-file: 'go.mod'
cache: true
-
name: Import GPG key
uses: crazy-max/ghaction-import-gpg@v5
id: import_gpg
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
passphrase: ${{ secrets.PASSPHRASE }}
-
name: Run GoReleaser
uses: goreleaser/goreleaser-action@v4.1.0
with:
version: latest
args: release --rm-dist
env:
GPG_FINGERPRINT: ${{ steps.import_gpg.outputs.fingerprint }}
# GitHub sets this automatically
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
17 changes: 9 additions & 8 deletions mysql/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,14 +141,15 @@ func Provider() *schema.Provider {
},

ResourcesMap: map[string]*schema.Resource{
"mysql_database": resourceDatabase(),
"mysql_global_variable": resourceGlobalVariable(),
"mysql_grant": resourceGrant(),
"mysql_role": resourceRole(),
"mysql_sql": resourceSql(),
"mysql_user_password": resourceUserPassword(),
"mysql_user": resourceUser(),
"mysql_ti_config": resourceTiConfigVariable(),
"mysql_database": resourceDatabase(),
"mysql_global_variable": resourceGlobalVariable(),
"mysql_grant": resourceGrant(),
"mysql_role": resourceRole(),
"mysql_sql": resourceSql(),
"mysql_user_password": resourceUserPassword(),
"mysql_user": resourceUser(),
"mysql_ti_config": resourceTiConfigVariable(),
"mysql_binlog_retention": resourceBinLog(),
},

ConfigureContextFunc: providerConfigure,
Expand Down
140 changes: 140 additions & 0 deletions mysql/resource_binlog.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
package mysql

import (
"context"
"database/sql"
"fmt"
"log"
"strconv"
"time"

"github.com/hashicorp/terraform-plugin-sdk/v2/diag"

"github.com/go-sql-driver/mysql"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)

func resourceBinLog() *schema.Resource {
return &schema.Resource{
CreateContext: CreateBinLog,
UpdateContext: UpdateBinLog,
ReadContext: ReadBinLog,
DeleteContext: DeleteBinLog,
Importer: &schema.ResourceImporter{
StateContext: ImportDatabase,
},
Schema: map[string]*schema.Schema{
"retention_period": {
Type: schema.TypeInt,
Optional: true,
Default: 0,
Description: "Retention period in hours. 0 value disables binlog retention",
},
},
}
}

func CreateBinLog(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
db, err := getDatabaseFromMeta(ctx, meta)
if err != nil {
return diag.FromErr(err)
}

stmtSQL := binlogConfigSQL(d)
log.Println("Executing statement:", stmtSQL)

_, err = db.ExecContext(ctx, stmtSQL)
if err != nil {
return diag.Errorf("failed running SQL to set binlog retention period: %v", err)
}

id := strconv.FormatInt(time.Now().UTC().UnixNano(), 10)

d.SetId(id)

return nil
}

func UpdateBinLog(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
db, err := getDatabaseFromMeta(ctx, meta)
if err != nil {
return diag.FromErr(err)
}

stmtSQL := binlogConfigSQL(d)
log.Println("Executing statement:", stmtSQL)

_, err = db.ExecContext(ctx, stmtSQL)
if err != nil {
return diag.Errorf("failed updating binlog retention period: %v", err)
}

return nil
}

func ReadBinLog(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
db, err := getDatabaseFromMeta(ctx, meta)
if err != nil {
return diag.FromErr(err)
}

stmtSQL := "call mysql.rds_show_configuration"

log.Println("Executing query:", stmtSQL)
rows, err := db.QueryContext(ctx, stmtSQL)
if err != nil {
if mysqlErr, ok := err.(*mysql.MySQLError); ok {
if mysqlErr.Number == unknownDatabaseErrCode {
d.SetId("")
return nil
}
}
return diag.Errorf("Error verifying binlog retention period: %s", err)
}

results := make(map[string]interface{})
for rows.Next() {
var name, description string
var value sql.NullString

if err := rows.Scan(&name, &value, &description); err != nil {
return diag.Errorf("failed reading binlog retention period: %v", err)
}
results[name] = value
}
if results["binlog retention hours"] == "NULL" {
results["binlog retention hours"] = "0"
}

d.Set("retention_period", fmt.Sprintf("%d", results["binlog retention hours"]))

return nil
}

func DeleteBinLog(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
db, err := getDatabaseFromMeta(ctx, meta)
if err != nil {
return diag.FromErr(err)
}

stmtSQL := "call mysql.rds_set_configuration('binlog retention hours', NULL)"
log.Println("Executing statement:", stmtSQL)

_, err = db.ExecContext(ctx, stmtSQL)
if err != nil {
return diag.Errorf("failed unsetting binlog retention period: %v", err)
}

d.SetId("")
return nil
}

func binlogConfigSQL(d *schema.ResourceData) string {
retention_period := strconv.Itoa(d.Get("retention_period").(int))
if retention_period == "0" {
retention_period = "NULL"
}
return fmt.Sprintf(
"call mysql.rds_set_configuration('binlog retention hours', %s)",
retention_period)
}

0 comments on commit 56e6f33

Please sign in to comment.