Skip to content

Commit

Permalink
Add support for remote tier and ILM transition (#565)
Browse files Browse the repository at this point in the history
  • Loading branch information
s2thudry committed Jun 14, 2024
1 parent 87d930a commit 1034b3b
Show file tree
Hide file tree
Showing 6 changed files with 640 additions and 4 deletions.
23 changes: 20 additions & 3 deletions docs/resources/ilm_policy.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,31 @@ resource "minio_ilm_policy" "bucket-lifecycle-rules" {
<a id="nestedblock--rule"></a>
### Nested Schema for `rule`

Required:

- `id` (String)

Optional:

- `expiration` (String)
- `expiration` (String) Value may be duration (5d), date (1970-01-01), or "DeleteMarker" to expire delete markers if `noncurrent_version_expiration_days` is used
- `filter` (String)
- `noncurrent_version_expiration_days` (Int)
- `noncurrent_version_expiration_days` (Number)
- `noncurrent_version_transition_days` (Number)
- `tags` (Map of String)
- `transition` (Block List, Max: 1) (see [below for nested schema](#nestedblock--rule--transition))

Read-Only:

- `id` (String) The ID of this resource.
- `status` (String)

<a id="nestedblock--rule--transition"></a>
### Nested Schema for `rule.transition`

Required:

- `storage_class` (String)

Optional:

- `date` (String)
- `days` (String)
72 changes: 72 additions & 0 deletions docs/resources/ilm_tier.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
---
# generated by https://github.com/hashicorp/terraform-plugin-docs
page_title: "minio_ilm_tier Resource - terraform-provider-minio"
subcategory: ""
description: |-
minio_ilm_tier handles remote tiers
---

# minio_ilm_tier (Resource)

`minio_ilm_tier` handles remote tiers



<!-- schema generated by tfplugindocs -->
## Schema

### Required

- `bucket` (String)
- `name` (String)
- `type` (String)

### Optional

- `azure_config` (Block List, Max: 1) (see [below for nested schema](#nestedblock--azure_config))
- `endpoint` (String)
- `force_new_credentials` (Boolean)
- `gcs_config` (Block List, Max: 1) (see [below for nested schema](#nestedblock--gcs_config))
- `minio_config` (Block List, Max: 1) (see [below for nested schema](#nestedblock--minio_config))
- `prefix` (String)
- `region` (String)
- `s3_config` (Block List, Max: 1) (see [below for nested schema](#nestedblock--s3_config))

### Read-Only

- `id` (String) The ID of this resource.

<a id="nestedblock--azure_config"></a>
### Nested Schema for `azure_config`

Optional:

- `account_key` (String, Sensitive)
- `container` (String)


<a id="nestedblock--gcs_config"></a>
### Nested Schema for `gcs_config`

Optional:

- `credentials` (String, Sensitive)


<a id="nestedblock--minio_config"></a>
### Nested Schema for `minio_config`

Optional:

- `access_key` (String)
- `secret_key` (String, Sensitive)


<a id="nestedblock--s3_config"></a>
### Nested Schema for `s3_config`

Optional:

- `access_key` (String)
- `secret_key` (String, Sensitive)
- `storage_class` (String)
1 change: 1 addition & 0 deletions minio/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@ func newProvider(envvarPrefixed ...string) *schema.Provider {
"minio_iam_group_user_attachment": resourceMinioIAMGroupUserAttachment(),
"minio_ilm_policy": resourceMinioILMPolicy(),
"minio_kms_key": resourceMinioKMSKey(),
"minio_ilm_tier": resourceMinioILMTier(),
},

ConfigureContextFunc: providerConfigure,
Expand Down
82 changes: 81 additions & 1 deletion minio/resource_minio_ilm_policy.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,38 @@ func resourceMinioILMPolicy() *schema.Resource {
Description: "Value may be duration (5d), date (1970-01-01), or \"DeleteMarker\" to expire delete markers if `noncurrent_version_expiration_days` is used",
ValidateDiagFunc: validateILMExpiration,
},

"transition": {
Type: schema.TypeList,
MaxItems: 1,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"days": {
Type: schema.TypeString,
Optional: true,
},
"date": {
Type: schema.TypeString,
Optional: true,
},
"storage_class": {
Type: schema.TypeString,
Required: true,
},
},
},
},
"noncurrent_version_expiration_days": {
Type: schema.TypeInt,
Optional: true,
ValidateDiagFunc: validateILMNoncurrentVersionExpiration,
},
"noncurrent_version_transition_days": {
Type: schema.TypeInt,
Optional: true,
ValidateDiagFunc: validateILMNoncurrentVersionTransition,
},
"status": {
Type: schema.TypeString,
Computed: true,
Expand Down Expand Up @@ -90,6 +117,16 @@ func validateILMNoncurrentVersionExpiration(v interface{}, p cty.Path) (errors d
return
}

func validateILMNoncurrentVersionTransition(v interface{}, p cty.Path) (errors diag.Diagnostics) {
value := v.(int)

if value < 1 {
return diag.Errorf("noncurrent_version_transition_days must be strictly positive")
}

return
}

func minioCreateILMPolicy(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
c := meta.(*S3MinioClient).S3Client

Expand All @@ -103,7 +140,7 @@ func minioCreateILMPolicy(ctx context.Context, d *schema.ResourceData, meta inte
var filter lifecycle.Filter

noncurrentVersionExpirationDays := lifecycle.NoncurrentVersionExpiration{NoncurrentDays: lifecycle.ExpirationDays(rule["noncurrent_version_expiration_days"].(int))}

noncurrentVersionTransitionDays := lifecycle.NoncurrentVersionTransition{NoncurrentDays: lifecycle.ExpirationDays(rule["noncurrent_version_transition_days"].(int))}
tags := map[string]string{}
for k, v := range rule["tags"].(map[string]interface{}) {
tags[k] = v.(string)
Expand All @@ -121,10 +158,13 @@ func minioCreateILMPolicy(ctx context.Context, d *schema.ResourceData, meta inte
r := lifecycle.Rule{
ID: rule["id"].(string),
Expiration: parseILMExpiration(rule["expiration"].(string)),
Transition: parseILMTransition(rule["transition"].([]interface{})),
NoncurrentVersionExpiration: noncurrentVersionExpirationDays,
NoncurrentVersionTransition: noncurrentVersionTransitionDays,
Status: "Enabled",
RuleFilter: filter,
}

config.Rules = append(config.Rules, r)
}

Expand Down Expand Up @@ -155,6 +195,7 @@ func minioReadILMPolicy(ctx context.Context, d *schema.ResourceData, meta interf

for _, r := range config.Rules {
var expiration string

if r.Expiration.DeleteMarker {
expiration = "DeleteMarker"
} else if r.Expiration.Days != 0 {
Expand All @@ -163,11 +204,30 @@ func minioReadILMPolicy(ctx context.Context, d *schema.ResourceData, meta interf
expiration = r.Expiration.Date.Format("2006-01-02")
}

transitions := make([]map[string]string, 0)

if !r.Transition.IsNull() {
transition := map[string]string{}
if !r.Transition.IsDaysNull() {
transition["days"] = fmt.Sprintf("%dd", r.Transition.Days)
} else if !r.Transition.IsDateNull() {
transition["date"] = r.Transition.Date.Format("2006-01-02")
}
transition["storage_class"] = r.Transition.StorageClass
transitions = append(transitions, transition)

}

var noncurrentVersionExpirationDays int
if r.NoncurrentVersionExpiration.NoncurrentDays != 0 {
noncurrentVersionExpirationDays = int(r.NoncurrentVersionExpiration.NoncurrentDays)
}

var noncurrentVersionTransitionDays int
if r.NoncurrentVersionTransition.NoncurrentDays != 0 {
noncurrentVersionTransitionDays = int(r.NoncurrentVersionTransition.NoncurrentDays)
}

var prefix string
tags := map[string]string{}
if len(r.RuleFilter.And.Tags) > 0 {
Expand All @@ -182,11 +242,14 @@ func minioReadILMPolicy(ctx context.Context, d *schema.ResourceData, meta interf
rule := map[string]interface{}{
"id": r.ID,
"expiration": expiration,
"transition": transitions,
"noncurrent_version_expiration_days": noncurrentVersionExpirationDays,
"noncurrent_version_transition_days": noncurrentVersionTransitionDays,
"status": r.Status,
"filter": prefix,
"tags": tags,
}

rules = append(rules, rule)
}

Expand Down Expand Up @@ -233,3 +296,20 @@ func parseILMExpiration(s string) lifecycle.Expiration {

return lifecycle.Expiration{}
}

func parseILMTransition(transition interface{}) lifecycle.Transition {
transitions := transition.([]interface{})
if len(transitions) == 0 {
return lifecycle.Transition{}
}
t := transitions[0].(map[string]interface{})
var days int
if _, err := fmt.Sscanf(t["days"].(string), "%dd", &days); err == nil {
return lifecycle.Transition{Days: lifecycle.ExpirationDays(days), StorageClass: t["storage_class"].(string)}
}
if date, err := time.Parse("2006-01-02", t["date"].(string)); err == nil {
return lifecycle.Transition{Date: lifecycle.ExpirationDate{Time: date}, StorageClass: t["storage_class"].(string)}
}

return lifecycle.Transition{}
}
Loading

0 comments on commit 1034b3b

Please sign in to comment.