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

[LTS]: new resource opentelekomcloud_logtank_transfer_v2 #2183

Merged
merged 3 commits into from May 31, 2023
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
96 changes: 96 additions & 0 deletions docs/resources/lts_logtransfer.md
@@ -0,0 +1,96 @@
---
subcategory: "Log Tank Service (LTS)"
---

Up-to-date reference of API arguments for LTS log transfer you can get at
`https://docs.otc.t-systems.com/log-tank-service/api-ref/log_transfer/index.html`.

# opentelekomcloud_logtank_transfer_v2

Manage a log transfer resource within OpenTelekomCloud.

## Example Usage

```hcl
resource "opentelekomcloud_obs_bucket" "bucket" {
bucket = "test-bucket"
storage_class = "STANDARD"
acl = "private"
}

resource "opentelekomcloud_logtank_group_v2" "testacc_group" {
group_name = "test_group"
ttl_in_days = 7
}

resource "opentelekomcloud_logtank_topic_v2" "testacc_topic" {
group_id = opentelekomcloud_logtank_group_v2.testacc_group.id
topic_name = "test-topic-1"
}

resource "opentelekomcloud_logtank_topic_v2" "testacc_topic-2" {
group_id = opentelekomcloud_logtank_group_v2.testacc_group.id
topic_name = "test-topic-2"
}

resource "opentelekomcloud_logtank_transfer_v2" "transfer" {
log_group_id = opentelekomcloud_logtank_group_v2.testacc_group.id
log_stream_ids = [opentelekomcloud_logtank_topic_v2.testacc_topic.id, opentelekomcloud_logtank_topic_v2.testacc_topic-2.id]
obs_bucket_name = opentelekomcloud_obs_bucket.bucket.bucket
storage_format = "JSON"
switch_on = false
period = 30
period_unit = "min"
prefix_name = "prefix"
dir_prefix_name = "dir"
}
```

## Argument Reference

The following arguments are supported:

* `log_group_id` - (Required) Specifies the ID of a log transfer.

* `log_stream_ids` - (Required) Specifies the log topics(streams) ids.

* `obs_bucket_name` - (Required) Specifies the name of an OBS bucket.

* `storage_format` - (Required) Indicates storage format for logs. Possible values are: `RAW`, `JSON`.

* `period` - (Required) Indicates the length of the log transfer interval.
Possible values: `1`, `2`, `3`, `5`, `6`, `12`, and `30`.

* `period_unit` - (Required) Indicates the unit of the log transfer interval.
Possible values: `min`, `hour`.

~> **Warning** The log transfer interval is specified by the combination of the values of `obs_period` and `obs_period_unit`,
and must be set to one of the following: `2 min`, `5 min`, `30 min`, `1 hour`, `3 hours`, `6 hours`, and `12 hours`.

* `switch_on` - (Optional) Indicates whether the log transfer is enabled. Default: `true`.

* `prefix_name` - (Optional) Indicates the file name prefix of the log files transferred to an OBS bucket.

* `dir_prefix_name` - (Optional) Indicates a custom path to store the log files.

## Attributes Reference

The following attributes are exported:

* `id` - The log transfer ID.

* `log_group_name` - The name of log group.

* `log_transfer_mode` - The log transfer mode. `cycle` indicates periodical transfer.

* `status` - The log transfer status.
`ENABLE`/`DISABLE` indicates that log transfer is enabled/disabled.
`EXCEPTION` indicates that log transfer is abnormal.

* `log_transfer_type` - The log transfer type.

* `create_time` - Specifies the time when a log transfer was created.

* `obs_encryption_id` - Specifies the KMS key ID for an OBS transfer task.

* `obs_encryption_enable` - Specifies whether OBS bucket encryption is enabled.
2 changes: 1 addition & 1 deletion go.mod
Expand Up @@ -14,7 +14,7 @@ require (
github.com/jinzhu/copier v0.3.5
github.com/keybase/go-crypto v0.0.0-20200123153347-de78d2cb44f4
github.com/mitchellh/go-homedir v1.1.0
github.com/opentelekomcloud/gophertelekomcloud v0.6.2-0.20230518143824-a9d5cf05c8ed
github.com/opentelekomcloud/gophertelekomcloud v0.6.2
github.com/unknwon/com v1.0.1
golang.org/x/crypto v0.1.0
golang.org/x/sync v0.1.0
Expand Down
6 changes: 2 additions & 4 deletions go.sum
Expand Up @@ -209,10 +209,8 @@ github.com/nsf/jsondiff v0.0.0-20200515183724-f29ed568f4ce h1:RPclfga2SEJmgMmz2k
github.com/nsf/jsondiff v0.0.0-20200515183724-f29ed568f4ce/go.mod h1:uFMI8w+ref4v2r9jz+c9i1IfIttS/OkmLfrk1jne5hs=
github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw=
github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
github.com/opentelekomcloud/gophertelekomcloud v0.6.2-0.20230428115358-3343441b3036 h1:1GBcKmY74ngt+ZNI48mBsZbOUFyTqJk+yCzV7cvS4r8=
github.com/opentelekomcloud/gophertelekomcloud v0.6.2-0.20230428115358-3343441b3036/go.mod h1:9Deb3q2gJvq5dExV+aX+iO+G+mD9Zr9uFt+YY9ONmq0=
github.com/opentelekomcloud/gophertelekomcloud v0.6.2-0.20230518143824-a9d5cf05c8ed h1:FKpjzEpu4aGzPseMdxYelXVp3XIO3M/ZbI47yX0U1Jc=
github.com/opentelekomcloud/gophertelekomcloud v0.6.2-0.20230518143824-a9d5cf05c8ed/go.mod h1:9Deb3q2gJvq5dExV+aX+iO+G+mD9Zr9uFt+YY9ONmq0=
github.com/opentelekomcloud/gophertelekomcloud v0.6.2 h1:o/KLTU7BTYJJdZQewxarLsNEP2pc7qUHHvJRpDZ2bWE=
github.com/opentelekomcloud/gophertelekomcloud v0.6.2/go.mod h1:9Deb3q2gJvq5dExV+aX+iO+G+mD9Zr9uFt+YY9ONmq0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
Expand Down
@@ -0,0 +1,232 @@
package acceptance

import (
"fmt"
"testing"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
"github.com/opentelekomcloud/gophertelekomcloud/openstack/lts/v2/transfers"

"github.com/opentelekomcloud/terraform-provider-opentelekomcloud/opentelekomcloud/acceptance/common"
"github.com/opentelekomcloud/terraform-provider-opentelekomcloud/opentelekomcloud/acceptance/env"
"github.com/opentelekomcloud/terraform-provider-opentelekomcloud/opentelekomcloud/common/cfg"
)

func TestAccLogTankTransferV2_basic(t *testing.T) {
var transfer transfers.Transfer
resource.Test(t, resource.TestCase{
PreCheck: func() { common.TestAccPreCheck(t) },
ProviderFactories: common.TestAccProviderFactories,
CheckDestroy: testAccCheckLogTankTopicV2Destroy,
Steps: []resource.TestStep{
{
Config: testAccLogTankTransferV2_basic,
Check: resource.ComposeTestCheckFunc(
testAccCheckLogTankTransferV2Exists(
"opentelekomcloud_logtank_transfer_v2.transfer", &transfer),
resource.TestCheckResourceAttr(
"opentelekomcloud_logtank_transfer_v2.transfer", "period", "12"),
resource.TestCheckResourceAttr(
"opentelekomcloud_logtank_transfer_v2.transfer", "switch_on", "true"),
resource.TestCheckResourceAttr(
"opentelekomcloud_logtank_transfer_v2.transfer", "obs_bucket_name", "tf-test-bucket-lts"),
resource.TestCheckResourceAttr(
"opentelekomcloud_logtank_transfer_v2.transfer", "period_unit", "hour"),
resource.TestCheckResourceAttr(
"opentelekomcloud_logtank_transfer_v2.transfer", "storage_format", "RAW"),
),
},
{
Config: testAccLogTankTransferV2_update,
Check: resource.ComposeTestCheckFunc(
testAccCheckLogTankTransferV2Exists(
"opentelekomcloud_logtank_transfer_v2.transfer", &transfer),
resource.TestCheckResourceAttr(
"opentelekomcloud_logtank_transfer_v2.transfer", "period", "30"),
resource.TestCheckResourceAttr(
"opentelekomcloud_logtank_transfer_v2.transfer", "switch_on", "false"),
resource.TestCheckResourceAttr(
"opentelekomcloud_logtank_transfer_v2.transfer", "obs_bucket_name", "tf-test-bucket-lts"),
resource.TestCheckResourceAttr(
"opentelekomcloud_logtank_transfer_v2.transfer", "period_unit", "min"),
resource.TestCheckResourceAttr(
"opentelekomcloud_logtank_transfer_v2.transfer", "storage_format", "JSON"),
resource.TestCheckResourceAttr(
"opentelekomcloud_logtank_transfer_v2.transfer", "prefix_name", "prefix"),
resource.TestCheckResourceAttr(
"opentelekomcloud_logtank_transfer_v2.transfer", "dir_prefix_name", "dir"),
),
},
},
})
}

func TestAccLogTankTransferV2_encryptedBucket(t *testing.T) {
var transfer transfers.Transfer
resource.Test(t, resource.TestCase{
PreCheck: func() { common.TestAccPreCheck(t) },
ProviderFactories: common.TestAccProviderFactories,
CheckDestroy: testAccCheckLogTankTopicV2Destroy,
Steps: []resource.TestStep{
{
Config: testAccLogTankTransferV2_encrypted(),
Check: resource.ComposeTestCheckFunc(
testAccCheckLogTankTransferV2Exists(
"opentelekomcloud_logtank_transfer_v2.transfer", &transfer),
resource.TestCheckResourceAttr(
"opentelekomcloud_logtank_transfer_v2.transfer", "period", "30"),
resource.TestCheckResourceAttr(
"opentelekomcloud_logtank_transfer_v2.transfer", "switch_on", "false"),
resource.TestCheckResourceAttr(
"opentelekomcloud_logtank_transfer_v2.transfer", "obs_bucket_name", "tf-test-bucket-lts-encrypted"),
resource.TestCheckResourceAttr(
"opentelekomcloud_logtank_transfer_v2.transfer", "period_unit", "min"),
resource.TestCheckResourceAttr(
"opentelekomcloud_logtank_transfer_v2.transfer", "storage_format", "JSON"),
),
},
},
})
}

func testAccCheckLogTankTransferV2Exists(n string, transfer *transfers.Transfer) resource.TestCheckFunc {
return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[n]
if !ok {
return fmt.Errorf("not found: %s", n)
}

if rs.Primary.ID == "" {
return fmt.Errorf("no ID is set")
}

config := common.TestAccProvider.Meta().(*cfg.Config)
ltsclient, err := config.LtsV2Client(env.OS_REGION_NAME)
if err != nil {
return fmt.Errorf("error creating OpenTelekomCloud LTS client: %s", err)
}

allTransfers, err := transfers.ListTransfers(ltsclient, transfers.ListTransfersOpts{})
if err != nil {
return err
}

for _, transferRaw := range allTransfers {
if transferRaw.LogTransferId == rs.Primary.ID {
*transfer = transferRaw
break
}
}

return nil
}
}

const testAccLogTankTransferV2_basic = `
resource "opentelekomcloud_obs_bucket" "bucket" {
bucket = "tf-test-bucket-lts"
storage_class = "STANDARD"
acl = "private"
}

resource "opentelekomcloud_logtank_group_v2" "testacc_group" {
group_name = "testacc_group"
ttl_in_days = 7
}

resource "opentelekomcloud_logtank_topic_v2" "testacc_topic" {
group_id = opentelekomcloud_logtank_group_v2.testacc_group.id
topic_name = "testacc_topic"
}

resource "opentelekomcloud_logtank_topic_v2" "testacc_topic-2" {
group_id = opentelekomcloud_logtank_group_v2.testacc_group.id
topic_name = "testacc_topic-2"
}

resource "opentelekomcloud_logtank_transfer_v2" "transfer" {
log_group_id = opentelekomcloud_logtank_group_v2.testacc_group.id
log_stream_ids = [opentelekomcloud_logtank_topic_v2.testacc_topic.id, opentelekomcloud_logtank_topic_v2.testacc_topic-2.id]
obs_bucket_name = opentelekomcloud_obs_bucket.bucket.bucket
storage_format = "RAW"
period = 12
period_unit = "hour"
}
`

const testAccLogTankTransferV2_update = `
resource "opentelekomcloud_obs_bucket" "bucket" {
bucket = "tf-test-bucket-lts"
storage_class = "STANDARD"
acl = "private"
}

resource "opentelekomcloud_logtank_group_v2" "testacc_group" {
group_name = "testacc_group"
ttl_in_days = 7
}

resource "opentelekomcloud_logtank_topic_v2" "testacc_topic" {
group_id = opentelekomcloud_logtank_group_v2.testacc_group.id
topic_name = "testacc_topic"
}

resource "opentelekomcloud_logtank_topic_v2" "testacc_topic-2" {
group_id = opentelekomcloud_logtank_group_v2.testacc_group.id
topic_name = "testacc_topic-2"
}

resource "opentelekomcloud_logtank_transfer_v2" "transfer" {
log_group_id = opentelekomcloud_logtank_group_v2.testacc_group.id
log_stream_ids = [opentelekomcloud_logtank_topic_v2.testacc_topic.id, opentelekomcloud_logtank_topic_v2.testacc_topic-2.id]
obs_bucket_name = opentelekomcloud_obs_bucket.bucket.bucket
storage_format = "JSON"
switch_on = false
period = 30
period_unit = "min"
prefix_name = "prefix"
dir_prefix_name = "dir"
}
`

func testAccLogTankTransferV2_encrypted() string {
return fmt.Sprintf(`
resource "opentelekomcloud_obs_bucket" "bucket" {
bucket = "tf-test-bucket-lts-encrypted"
storage_class = "STANDARD"
acl = "private"
server_side_encryption {
algorithm = "kms"
kms_key_id = "%s"
}
}

resource "opentelekomcloud_logtank_group_v2" "testacc_group" {
group_name = "testacc_group-encr"
ttl_in_days = 7
}

resource "opentelekomcloud_logtank_topic_v2" "testacc_topic" {
group_id = opentelekomcloud_logtank_group_v2.testacc_group.id
topic_name = "testacc_topic"
}

resource "opentelekomcloud_logtank_topic_v2" "testacc_topic-2" {
group_id = opentelekomcloud_logtank_group_v2.testacc_group.id
topic_name = "testacc_topic-2"
}

resource "opentelekomcloud_logtank_transfer_v2" "transfer" {
log_group_id = opentelekomcloud_logtank_group_v2.testacc_group.id
log_stream_ids = [opentelekomcloud_logtank_topic_v2.testacc_topic.id, opentelekomcloud_logtank_topic_v2.testacc_topic-2.id]
obs_bucket_name = opentelekomcloud_obs_bucket.bucket.bucket
storage_format = "JSON"
switch_on = false
period = 30
period_unit = "min"
prefix_name = "prefix"
dir_prefix_name = "dir"
}
`, env.OS_KMS_ID)
}
1 change: 1 addition & 0 deletions opentelekomcloud/provider.go
Expand Up @@ -403,6 +403,7 @@ func Provider() *schema.Provider {
"opentelekomcloud_lb_whitelist_v2": elbv2.ResourceWhitelistV2(),
"opentelekomcloud_logtank_group_v2": lts.ResourceLTSGroupV2(),
"opentelekomcloud_logtank_topic_v2": lts.ResourceLTSTopicV2(),
"opentelekomcloud_logtank_transfer_v2": lts.ResourceLTSTransferV2(),
"opentelekomcloud_mrs_cluster_v1": mrs.ResourceMRSClusterV1(),
"opentelekomcloud_mrs_job_v1": mrs.ResourceMRSJobV1(),
"opentelekomcloud_nat_gateway_v2": nat.ResourceNatGatewayV2(),
Expand Down