Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
3.8.1
3.8.2
2 changes: 1 addition & 1 deletion docs/data-sources/review_config.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ The review config data source.
- `id` (String) The ID of this resource.
- `resource_id` (String) The unique resource id for the review config.
- `resources` (Set of String) Resources using the config. We support attach the review config for environments or projects with format {resurce}/{resource id}. For example, environments/test, projects/sample.
- `rules` (Set of Object) The SQL review rules. (see [below for nested schema](#nestedatt--rules))
- `rules` (List of Object) The SQL review rules. (see [below for nested schema](#nestedatt--rules))
- `title` (String) The title for the review config.

<a id="nestedatt--rules"></a>
Expand Down
2 changes: 1 addition & 1 deletion docs/data-sources/review_config_list.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ Read-Only:
- `enabled` (Boolean)
- `resource_id` (String)
- `resources` (Set of String)
- `rules` (Set of Object) (see [below for nested schema](#nestedobjatt--review_configs--rules))
- `rules` (List of Object) (see [below for nested schema](#nestedobjatt--review_configs--rules))
- `title` (String)

<a id="nestedobjatt--review_configs--rules"></a>
Expand Down
2 changes: 1 addition & 1 deletion docs/data-sources/setting.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ The setting data source.

Required:

- `classifications` (Block Set, Min: 1) (see [below for nested schema](#nestedblock--classification--classifications))
- `classifications` (Block List, Min: 1) (see [below for nested schema](#nestedblock--classification--classifications))
- `id` (String) The classification unique uuid.
- `levels` (Block List, Min: 1) (see [below for nested schema](#nestedblock--classification--levels))
- `title` (String) The classification title. Optional.
Expand Down
2 changes: 1 addition & 1 deletion docs/resources/review_config.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ The review config resource.

- `enabled` (Boolean) Enable the SQL review config
- `resource_id` (String) The unique resource id for the review config.
- `rules` (Block Set, Min: 1) The SQL review rules. (see [below for nested schema](#nestedblock--rules))
- `rules` (Block List, Min: 1) The SQL review rules. (see [below for nested schema](#nestedblock--rules))
- `title` (String) The title for the review config.

### Optional
Expand Down
2 changes: 1 addition & 1 deletion docs/resources/setting.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ Optional:

Required:

- `classifications` (Block Set, Min: 1) (see [below for nested schema](#nestedblock--classification--classifications))
- `classifications` (Block List, Min: 1) (see [below for nested schema](#nestedblock--classification--classifications))
- `id` (String) The classification unique uuid.
- `levels` (Block List, Min: 1) (see [below for nested schema](#nestedblock--classification--levels))
- `title` (String) The classification title. Optional.
Expand Down
2 changes: 1 addition & 1 deletion examples/database/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
terraform {
required_providers {
bytebase = {
version = "3.8.1"
version = "3.8.2"
# For local development, please use "terraform.local/bytebase/bytebase" instead
source = "registry.terraform.io/bytebase/bytebase"
}
Expand Down
2 changes: 1 addition & 1 deletion examples/database_group/main.tf
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
terraform {
required_providers {
bytebase = {
version = "3.8.1"
version = "3.8.2"
# For local development, please use "terraform.local/bytebase/bytebase" instead
source = "registry.terraform.io/bytebase/bytebase"
}
Expand Down
2 changes: 1 addition & 1 deletion examples/environments/main.tf
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
terraform {
required_providers {
bytebase = {
version = "3.8.1"
version = "3.8.2"
# For local development, please use "terraform.local/bytebase/bytebase" instead
source = "registry.terraform.io/bytebase/bytebase"
}
Expand Down
2 changes: 1 addition & 1 deletion examples/groups/main.tf
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
terraform {
required_providers {
bytebase = {
version = "3.8.1"
version = "3.8.2"
# For local development, please use "terraform.local/bytebase/bytebase" instead
source = "registry.terraform.io/bytebase/bytebase"
}
Expand Down
2 changes: 1 addition & 1 deletion examples/iamPolicy/main.tf
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
terraform {
required_providers {
bytebase = {
version = "3.8.1"
version = "3.8.2"
# For local development, please use "terraform.local/bytebase/bytebase" instead
source = "registry.terraform.io/bytebase/bytebase"
}
Expand Down
2 changes: 1 addition & 1 deletion examples/instances/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
terraform {
required_providers {
bytebase = {
version = "3.8.1"
version = "3.8.2"
# For local development, please use "terraform.local/bytebase/bytebase" instead
source = "registry.terraform.io/bytebase/bytebase"
}
Expand Down
2 changes: 1 addition & 1 deletion examples/projects/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
terraform {
required_providers {
bytebase = {
version = "3.8.1"
version = "3.8.2"
# For local development, please use "terraform.local/bytebase/bytebase" instead
source = "registry.terraform.io/bytebase/bytebase"
}
Expand Down
2 changes: 1 addition & 1 deletion examples/risk/main.tf
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
terraform {
required_providers {
bytebase = {
version = "3.8.1"
version = "3.8.2"
# For local development, please use "terraform.local/bytebase/bytebase" instead
source = "registry.terraform.io/bytebase/bytebase"
}
Expand Down
2 changes: 1 addition & 1 deletion examples/roles/main.tf
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
terraform {
required_providers {
bytebase = {
version = "3.8.1"
version = "3.8.2"
# For local development, please use "terraform.local/bytebase/bytebase" instead
source = "registry.terraform.io/bytebase/bytebase"
}
Expand Down
2 changes: 1 addition & 1 deletion examples/settings/main.tf
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
terraform {
required_providers {
bytebase = {
version = "3.8.1"
version = "3.8.2"
# For local development, please use "terraform.local/bytebase/bytebase" instead
source = "registry.terraform.io/bytebase/bytebase"
}
Expand Down
2 changes: 1 addition & 1 deletion examples/setup/main.tf
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
terraform {
required_providers {
bytebase = {
version = "3.8.1"
version = "3.8.2"
# For local development, please use "terraform.local/bytebase/bytebase" instead
source = "registry.terraform.io/bytebase/bytebase"
}
Expand Down
2 changes: 1 addition & 1 deletion examples/sql_review/main.tf
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
terraform {
required_providers {
bytebase = {
version = "3.8.1"
version = "3.8.2"
# For local development, please use "terraform.local/bytebase/bytebase" instead
source = "registry.terraform.io/bytebase/bytebase"
}
Expand Down
2 changes: 1 addition & 1 deletion examples/users/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
terraform {
required_providers {
bytebase = {
version = "3.7.2"
version = "3.8.2"
# For local development, please use "terraform.local/bytebase/bytebase" instead
source = "registry.terraform.io/bytebase/bytebase"
}
Expand Down
2 changes: 1 addition & 1 deletion provider/data_source_database.go
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ func columnHash(rawColumn interface{}) string {
if v, ok := column["classification"].(string); ok {
_, _ = buf.WriteString(fmt.Sprintf("%s-", v))
}
if v, ok := column["classification"].(map[string]interface{}); ok {
if v, ok := column["labels"].(map[string]interface{}); ok {
for key, val := range v {
_, _ = buf.WriteString(fmt.Sprintf("[%s:%s]-", key, val.(string)))
}
Expand Down
3 changes: 1 addition & 2 deletions provider/data_source_review_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ func dataSourceReviewConfig() *schema.Resource {
Description: "Resources using the config. We support attach the review config for environments or projects with format {resurce}/{resource id}. For example, environments/test, projects/sample.",
},
"rules": {
Type: schema.TypeSet,
Type: schema.TypeList,
Computed: true,
Description: "The SQL review rules.",
Elem: &schema.Resource{
Expand Down Expand Up @@ -72,7 +72,6 @@ func dataSourceReviewConfig() *schema.Resource {
},
},
},
Set: reviewRuleHash,
},
},
}
Expand Down
5 changes: 2 additions & 3 deletions provider/data_source_review_config_list.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ func dataSourceReviewConfigList() *schema.Resource {
Description: "Resources using the config. We support attach the review config for environments or projects with format {resurce}/{resource id}. For example, environments/test, projects/sample.",
},
"rules": {
Type: schema.TypeSet,
Type: schema.TypeList,
Computed: true,
Description: "The SQL review rules.",
Elem: &schema.Resource{
Expand Down Expand Up @@ -78,7 +78,6 @@ func dataSourceReviewConfigList() *schema.Resource {
},
},
},
Set: reviewRuleHash,
},
},
},
Expand Down Expand Up @@ -106,7 +105,7 @@ func dataSourceReviewConfigListRead(ctx context.Context, d *schema.ResourceData,
raw["title"] = review.Title
raw["enabled"] = review.Enabled
raw["resources"] = review.Resources
raw["rules"] = schema.NewSet(reviewRuleHash, flattenReviewRules(review.Rules))
raw["rules"] = flattenReviewRules(review.Rules)

reviews = append(reviews, raw)
}
Expand Down
2 changes: 1 addition & 1 deletion provider/data_source_setting.go
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ func getClassificationSetting(computed bool) *schema.Schema {
},
"classifications": {
Required: true,
Type: schema.TypeSet,
Type: schema.TypeList,
MinItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
Expand Down
93 changes: 49 additions & 44 deletions provider/resource_review_config.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package provider

import (
"bytes"
"context"
"fmt"
"strings"
Expand Down Expand Up @@ -54,7 +53,7 @@ func resourceReviewConfig() *schema.Resource {
Description: "Resources using the config. We support attach the review config for environments or projects with format {resurce}/{resource id}. For example, environments/test, projects/sample.",
},
"rules": {
Type: schema.TypeSet,
Type: schema.TypeList,
Required: true,
MinItems: 1,
Description: "The SQL review rules.",
Expand Down Expand Up @@ -95,7 +94,6 @@ func resourceReviewConfig() *schema.Resource {
},
},
},
Set: reviewRuleHash,
},
},
}
Expand Down Expand Up @@ -138,18 +136,10 @@ func resourceReviewConfigUpsert(ctx context.Context, d *schema.ResourceData, m i
reviewID := d.Get("resource_id").(string)
reviewName := fmt.Sprintf("%s%s", internal.ReviewConfigNamePrefix, reviewID)

oldAttachedResources := []string{}
if existedName != "" {
if existedName != reviewName {
return diag.Errorf("cannot change the resource id")
}

existedReview, err := c.GetReviewConfig(ctx, existedName)
if err != nil {
tflog.Debug(ctx, fmt.Sprintf("get review config %s failed with error: %v", existedName, err))
} else if existedReview != nil {
oldAttachedResources = existedReview.Resources
}
}

rules, err := convertToV1RuleList(d)
Expand All @@ -172,13 +162,53 @@ func resourceReviewConfigUpsert(ctx context.Context, d *schema.ResourceData, m i
return diag.FromErr(err)
}

removeReviewConfigTag(ctx, c, oldAttachedResources)
patchTagPolicy(ctx, c, d, review.Name)
pendingDelete, pendingAdd := getResourceDiff(ctx, c, d)
removeReviewConfigTag(ctx, c, pendingDelete)
patchTagPolicy(ctx, c, review.Name, pendingAdd)
d.SetId(review.Name)

return resourceReviewConfigRead(ctx, d, m)
}

// getResourceDiff returns pending delete list and pending add list.
func getResourceDiff(ctx context.Context, client api.Client, d *schema.ResourceData) ([]string, []string) {
existedName := d.Id()
oldAttachedResources := []string{}
if existedName != "" {
existedReview, err := client.GetReviewConfig(ctx, existedName)
if err != nil {
tflog.Debug(ctx, fmt.Sprintf("get review config %s failed with error: %v", existedName, err))
} else if existedReview != nil {
oldAttachedResources = existedReview.Resources
}
}

oldResourceMap := map[string]bool{}
for _, resource := range oldAttachedResources {
oldResourceMap[resource] = true
}

newAttachedResources := getReviewConfigRelatedResources(d)
newResourceMap := map[string]bool{}
for _, resource := range newAttachedResources {
newResourceMap[resource] = true
}

pendingDelete := []string{}
pendingAdd := []string{}
for old := range oldResourceMap {
if !newResourceMap[old] {
pendingDelete = append(pendingDelete, old)
}
}
for new := range newResourceMap {
if !oldResourceMap[new] {
pendingAdd = append(pendingAdd, new)
}
}
return pendingDelete, pendingAdd
}

func getReviewConfigRelatedResources(d *schema.ResourceData) []string {
resources := []string{}
rawSet, ok := d.Get("resources").(*schema.Set)
Expand All @@ -200,13 +230,8 @@ func removeReviewConfigTag(ctx context.Context, client api.Client, resources []s
}
}

func patchTagPolicy(ctx context.Context, client api.Client, d *schema.ResourceData, reviewName string) diag.Diagnostics {
rawSet, ok := d.Get("resources").(*schema.Set)
if !ok || rawSet.Len() == 0 {
return nil
}
for _, raw := range rawSet.List() {
resource := raw.(string)
func patchTagPolicy(ctx context.Context, client api.Client, reviewName string, resources []string) diag.Diagnostics {
for _, resource := range resources {
if !strings.HasPrefix(resource, internal.ProjectNamePrefix) && !strings.HasPrefix(resource, internal.EnvironmentNamePrefix) {
return diag.Errorf("invalid resource, only support projects/{id} or environments/{id}")
}
Expand Down Expand Up @@ -248,7 +273,7 @@ func setReviewConfig(d *schema.ResourceData, review *v1pb.ReviewConfig) diag.Dia
if err := d.Set("resources", review.Resources); err != nil {
return diag.Errorf("cannot set resources for review: %s", err.Error())
}
if err := d.Set("rules", schema.NewSet(reviewRuleHash, flattenReviewRules(review.Rules))); err != nil {
if err := d.Set("rules", flattenReviewRules(review.Rules)); err != nil {
return diag.Errorf("cannot set rules for review: %s", err.Error())
}

Expand All @@ -269,35 +294,15 @@ func flattenReviewRules(rules []*v1pb.SQLReviewRule) []interface{} {
return ruleList
}

func reviewRuleHash(rawRule interface{}) int {
var buf bytes.Buffer
raw := rawRule.(map[string]interface{})

if v, ok := raw["type"].(string); ok {
_, _ = buf.WriteString(fmt.Sprintf("%s-", v))
}
if v, ok := raw["engine"].(string); ok {
_, _ = buf.WriteString(fmt.Sprintf("%s-", v))
}
if v, ok := raw["payload"].(string); ok {
_, _ = buf.WriteString(fmt.Sprintf("%s-", v))
}
if v, ok := raw["level"].(string); ok {
_, _ = buf.WriteString(fmt.Sprintf("%s-", v))
}

return internal.ToHashcodeInt(buf.String())
}

func convertToV1RuleList(d *schema.ResourceData) ([]*v1pb.SQLReviewRule, error) {
ruleSet, ok := d.Get("rules").(*schema.Set)
if !ok || ruleSet.Len() == 0 {
ruleRawList, ok := d.Get("rules").([]interface{})
if !ok || len(ruleRawList) == 0 {
return nil, errors.Errorf("rules is required")
}

ruleList := []*v1pb.SQLReviewRule{}

for _, r := range ruleSet.List() {
for _, r := range ruleRawList {
rawRule := r.(map[string]interface{})
payload := rawRule["payload"].(string)
if payload == "" {
Expand Down
Loading