Skip to content

add resources of cam #170

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

Merged
merged 26 commits into from Oct 15, 2019
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
19 changes: 19 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,24 @@

FEATURES:

* **New Data Source**: `tencentcloud_cam_users`
* **New Data Source**: `tencentcloud_cam_groups`
* **New Data Source**: `tencentcloud_cam_policies`
* **New Data Source**: `tencentcloud_cam_roles`
* **New Data Source**: `tencentcloud_cam_user_policy_attachments`
* **New Data Source**: `tencentcloud_cam_group_policy_attachments`
* **New Data Source**: `tencentcloud_cam_role_policy_attachments`
* **New Data Source**: `tencentcloud_cam_group_memberships`
* **New Data Source**: `tencentcloud_cam_SAML_providers`
* **New Resource**: `tencentcloud_cam_user`
* **New Resource**: `tencentcloud_cam_group`
* **New Resource**: `tencentcloud_cam_role`
* **New Resource**: `tencentcloud_cam_policy`
* **New Resource**: `tencentcloud_cam_user_policy_attachment`
* **New Resource**: `tencentcloud_cam_group_policy_attachment`
* **New Resource**: `tencentcloud_cam_role_policy_attachment`
* **New Resource**: `tencentcloud_cam_group_membership`
* **New Resource**: `tencentcloud_cam_SAML_provider`
* **New Data Source**: `tencentcloud_reserved_instance_configs`
* **New Data Source**: `tencentcloud_reserved_instances`
* **New Resource**: `tencentcloud_reserved_instance`
Expand All @@ -15,6 +33,7 @@ BUG FIXES:

* Resource: `tencentcloud_gaap_http_domain` fix sometimes can't enable realserver auth


## 1.20.1 (October 08, 2019)

ENHANCEMENTS:
Expand Down
90 changes: 90 additions & 0 deletions examples/tencentcloud-cam/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
resource "tencentcloud_cam_group" "example" {
name = "example"
remark = "example"
}

resource "tencentcloud_cam_user" "example" {
name = "example"
remark = "example"
console_login = true
use_api = true
need_reset_password = true
password = "${var.password}"
phone_num = "${var.phone_num}"
country_code = "${var.country_code}"
email = "${var.email}"
}

resource "tencentcloud_cam_policy" "example" {
name = "example"
document = "${var.policy_document}"
}

resource "tencentcloud_cam_role" "example" {
name = "example"
document = "${var.role_document}"
description = "test"
console_login = true
}

resource "tencentcloud_cam_group_membership" "example" {
group_id = "${tencentcloud_cam_group.example.id}"
user_ids = ["${tencentcloud_cam_user.example.id}"]
}

resource "tencentcloud_cam_role_policy_attachment" "example" {
role_id = "${tencentcloud_cam_role.example.id}"
policy_id = "${tencentcloud_cam_policy.example.id}"
}

resource "tencentcloud_cam_user_policy_attachment" "example" {
user_id = "${tencentcloud_cam_user.example.id}"
policy_id = "${tencentcloud_cam_policy.example.id}"
}

resource "tencentcloud_cam_group_policy_attachment" "example" {
group_id = "${tencentcloud_cam_group.example.id}"
policy_id = "${tencentcloud_cam_policy.example.id}"
}

resource "tencentcloud_cam_saml_provider" "example" {
name = "example"
meta_data = "${var.meta_data}"
description = "test"
}

data "tencentcloud_cam_users" "users" {
name = "${tencentcloud_cam_user.example.id}"
}

data "tencentcloud_cam_roles" "roles" {
role_id = "${tencentcloud_cam_role.example.id}"
}

data "tencentcloud_cam_policies" "policies" {
policy_id = "${tencentcloud_cam_policy.example.id}"
}

data "tencentcloud_cam_groups" "groups" {
group_id = "${tencentcloud_cam_group.example.id}"
}

data "tencentcloud_cam_group_memberships" "memberships" {
group_id = "${tencentcloud_cam_group_membership.example.id}"
}

data "tencentcloud_cam_user_policy_attachments" "user_policy_attachments" {
user_id = "${tencentcloud_cam_user_policy_attachment.example.user_id}"
}

data "tencentcloud_cam_role_policy_attachments" "role_policy_attachments" {
role_id = "${tencentcloud_cam_role_policy_attachment.example.role_id}"
}

data "tencentcloud_cam_group_policy_attachments" "group_policy_attachments" {
group_id = "${tencentcloud_cam_group_policy_attachment.example.group_id}"
}

data "tencentcloud_cam_saml_providers" "saml_providers" {
name = "${tencentcloud_cam_saml_provider.example.id}"
}
28 changes: 28 additions & 0 deletions examples/tencentcloud-cam/variables.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
variable "password" {
default = "Gail@1234"
}

variable "phone_num" {
default = "13631555963"
}

variable "country_code" {
default = "86"
}

variable "email" {
default = "[email protected]"
}

variable "policy_document" {
default = "{\"version\":\"2.0\",\"statement\":[{\"action\":[\"name/sts:AssumeRole\"],\"effect\":\"allow\",\"resource\":[\"*\"]},{\"action\":[\"name/cos:PutObject\"],\"effect\":\"allow\",\"resource\":[\"*\"]}]}"
}

variable "role_document" {
default = "{\"version\":\"2.0\",\"statement\":[{\"action\":[\"name/sts:AssumeRole\"],\"effect\":\"allow\",\"principal\":{\"qcs\":[\"qcs::cam::uin/100009461222:uin/100009461222\"]}}]}"
}

variable "meta_data" {
default = "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48bWQ6RW50aXR5RGVzY3JpcHRvciBlbnRpdHlJRD0iaHR0cDovL3d3dy5va3RhLmNvbS9leGsxa3F4bWNqUW1HQURNeTM1NyIgeG1sbnM6bWQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDptZXRhZGF0YSI+PG1kOklEUFNTT0Rlc2NyaXB0b3IgV2FudEF1dGhuUmVxdWVzdHNTaWduZWQ9ImZhbHNlIiBwcm90b2NvbFN1cHBvcnRFbnVtZXJhdGlvbj0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnByb3RvY29sIj48bWQ6S2V5RGVzY3JpcHRvciB1c2U9InNpZ25pbmciPjxkczpLZXlJbmZvIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48ZHM6WDUwOURhdGE+PGRzOlg1MDlDZXJ0aWZpY2F0ZT5NSUlEb0RDQ0FvaWdBd0lCQWdJR0FXM0lTcExvTUEwR0NTcUdTSWIzRFFFQkN3VUFNSUdRTVFzd0NRWURWUVFHRXdKVlV6RVRNQkVHDQpBMVVFQ0F3S1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ3d05VMkZ1SUVaeVlXNWphWE5qYnpFTk1Bc0dBMVVFQ2d3RVQydDBZVEVVDQpNQklHQTFVRUN3d0xVMU5QVUhKdmRtbGtaWEl4RVRBUEJnTlZCQU1NQ0dsa2VIVmxkblJoTVJ3d0dnWUpLb1pJaHZjTkFRa0JGZzFwDQpibVp2UUc5cmRHRXVZMjl0TUI0WERURTVNVEF4TkRBek1qSXhNMW9YRFRJNU1UQXhOREF6TWpNeE0xb3dnWkF4Q3pBSkJnTlZCQVlUDQpBbFZUTVJNd0VRWURWUVFJREFwRFlXeHBabTl5Ym1saE1SWXdGQVlEVlFRSERBMVRZVzRnUm5KaGJtTnBjMk52TVEwd0N3WURWUVFLDQpEQVJQYTNSaE1SUXdFZ1lEVlFRTERBdFRVMDlRY205MmFXUmxjakVSTUE4R0ExVUVBd3dJYVdSNGRXVjJkR0V4SERBYUJna3Foa2lHDQo5dzBCQ1FFV0RXbHVabTlBYjJ0MFlTNWpiMjB3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ2g4b3dqDQpZK2dQSUM3blQvNTduLzdmeXJzcDlHMXdxa2UxdXhjMHVrTndnQXozOVNpelY3QVhLMWRReTFLaThXWjJJMzFEczJkT0FNQ1FKR2pWDQpUWWNNbnA3KzhqUzNLdmxNUkRJamk5cmxuUi9vcnBvMll1RHVWby9jVzdidlRIS2h2REo1QWZRaWxzYlNPTXdUOWM2TVlYZGhBNVBwDQpzelFsK1UrdHJmcXUrdUorSER4SVQxdlhWaVI5YlY2SUFRSzZpbWZoc2wxWmVSUytjbVFVNEpjQWlYT0xtTnFVVWM2UkpxUzhrMW1mDQpBLzhmb2VyMGc3SG4xZDVXclpCc2gyUlR2Vzh1ZVdadHQ3dmh4QTlGdE5kSVlEcXJ0eElmMlZXcXhrSHM3WFZDSm5wTnJITVovT1BRDQpGY21YSGVxNlJJMlB3Q1RlOW8zZHZpM0hqeXBaOEl4dkFnTUJBQUV3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUFHaHk1bG9nbGtTDQoyVHg2YS90MnF5VEx0YVV5cEwrNGhySGJoMVAweVVMc0NrSnFsM2wrWG9VZDZCY2FJaFNSVGFPQk95ODViL0UzelJ4K3JzQXJwTjVVDQp5ZThuUEM4a05PYW5vTk9wWnZvYmhpTzFlMFIvYmxEcnRBL0o5UlBwMWtmdlhmS2NSTTU3TlRCWXppTURlbnFQUTRFOWN1U2lGdFFxDQpJYmpIbThaM1B1YXgwRitldkZ3U1pJMDNCWXNISGw1d1EraEJBS3hTdTJINEZRdU93Zmpnb2EveEN6Z1NKYjJ2UXdEc1MxMk9mSkNiDQpSRm1ZL1VYZXQramFhdEVORktLZStZSUJpU0J2WG1adTN0MHN5NDZTNzlPVzBacXJ0NUh2bElsT2lpTFpaN1FZamxjM1kxeG1LZ1luDQpXM2M2WGZkdmhGWHo0ZDdkbWYvTUdpNGY0enM9PC9kczpYNTA5Q2VydGlmaWNhdGU+PC9kczpYNTA5RGF0YT48L2RzOktleUluZm8+PC9tZDpLZXlEZXNjcmlwdG9yPjxtZDpOYW1lSURGb3JtYXQ+dXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6MS4xOm5hbWVpZC1mb3JtYXQ6dW5zcGVjaWZpZWQ8L21kOk5hbWVJREZvcm1hdD48bWQ6TmFtZUlERm9ybWF0PnVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMTpuYW1laWQtZm9ybWF0OmVtYWlsQWRkcmVzczwvbWQ6TmFtZUlERm9ybWF0PjxtZDpTaW5nbGVTaWduT25TZXJ2aWNlIEJpbmRpbmc9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpiaW5kaW5nczpIVFRQLVBPU1QiIExvY2F0aW9uPSJodHRwczovL2lkeHVldnRhLm9rdGEuY29tL2FwcC9pZHh1ZW9yZzYzNzM1OF90ZXN0XzEvZXhrMWtxeG1jalFtR0FETXkzNTcvc3NvL3NhbWwiLz48bWQ6U2luZ2xlU2lnbk9uU2VydmljZSBCaW5kaW5nPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YmluZGluZ3M6SFRUUC1SZWRpcmVjdCIgTG9jYXRpb249Imh0dHBzOi8vaWR4dWV2dGEub2t0YS5jb20vYXBwL2lkeHVlb3JnNjM3MzU4X3Rlc3RfMS9leGsxa3F4bWNqUW1HQURNeTM1Ny9zc28vc2FtbCIvPjwvbWQ6SURQU1NPRGVzY3JpcHRvcj48L21kOkVudGl0eURlc2NyaXB0b3I+"
}

26 changes: 26 additions & 0 deletions tencentcloud/connectivity/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
as "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/as/v20180419"
cam "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cam/v20190116"
cbs "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cbs/v20170312"
cdb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdb/v20170320"
clb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb/v20180317"
Expand Down Expand Up @@ -43,6 +44,7 @@ type TencentCloudClient struct {
tagConn *tag.Client
mongodbConn *mongodb.Client
tkeConn *tke.Client
camConn *cam.Client
gaapCoon *gaap.Client
sslCoon *ssl.Client
}
Expand Down Expand Up @@ -401,3 +403,27 @@ func (me *TencentCloudClient) UseSslClient() *ssl.Client {

return me.sslCoon
}

func (me *TencentCloudClient) UseCamClient() *cam.Client {
if me.camConn != nil {
return me.camConn
}

credential := common.NewCredential(
me.SecretId,
me.SecretKey,
)

cpf := profile.NewClientProfile()
cpf.HttpProfile.ReqMethod = "POST"
cpf.HttpProfile.ReqTimeout = 300
cpf.Language = "en-US"

camConn, _ := cam.NewClient(credential, me.Region, cpf)
var round LogRoundTripper

camConn.WithHttpTransport(&round)
me.camConn = camConn

return me.camConn
}
109 changes: 109 additions & 0 deletions tencentcloud/data_source_tc_cam_group_memberships.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
/*
Use this data source to query detailed information of CAM groups

Example Usage

```hcl
data "tencentcloud_cam_group_memberships" "foo" {
group_id = "12515263"
}
```
*/
package tencentcloud

import (
"context"
"log"

"github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/helper/schema"
)

func dataSourceTencentCloudCamGroupMemberships() *schema.Resource {
return &schema.Resource{
Read: dataSourceTencentCloudCamGroupMembershipsRead,

Schema: map[string]*schema.Schema{
"group_id": {
Type: schema.TypeString,
Optional: true,
Description: "Id of CAM group to be queried.",
},
"result_output_file": {
Type: schema.TypeString,
Optional: true,
Description: "Used to save results.",
},
"membership_list": {
Type: schema.TypeList,
Computed: true,
Description: "A list of CAM group membership. Each element contains the following attributes:",
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"group_id": {
Type: schema.TypeString,
Computed: true,
Description: "Id of CAM group.",
},
"user_ids": {
Type: schema.TypeSet,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeString,
},
Description: "Id set of the CAM group members.",
},
},
},
},
},
}
}

func dataSourceTencentCloudCamGroupMembershipsRead(d *schema.ResourceData, meta interface{}) error {
defer logElapsed("data_source.tencentcloud_cam_group_memberships.read")()

logId := getLogId(contextNil)
ctx := context.WithValue(context.TODO(), "logId", logId)

groupId := d.Get("group_id").(string)
camService := CamService{
client: meta.(*TencentCloudClient).apiV3Conn,
}
var memberships []*string
err := resource.Retry(readRetryTimeout, func() *resource.RetryError {
results, e := camService.DescribeGroupMembershipById(ctx, groupId)
if e != nil {
return retryError(e)
}
memberships = results
return nil
})
if err != nil {
log.Printf("[CRITAL]%s read CAM group memberships failed, reason:%s\n", logId, err.Error())
return err
}
groupList := make([]map[string]interface{}, 0, 1)
ids := make([]string, 0, 1)
mapping := map[string]interface{}{
"group_id": groupId,
"user_ids": memberships,
}
groupList = append(groupList, mapping)
ids = append(ids, groupId)

d.SetId(dataResourceIdsHash(ids))
if e := d.Set("membership_list", groupList); e != nil {
log.Printf("[CRITAL]%s provider set membershiplist fail, reason:%s\n", logId, e.Error())
return e
}

output, ok := d.GetOk("result_output_file")
if ok && output.(string) != "" {
if e := writeToFile(output.(string), groupList); e != nil {
return e
}
}

return nil
}
54 changes: 54 additions & 0 deletions tencentcloud/data_source_tc_cam_group_memberships_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package tencentcloud

import (
"testing"

"github.com/hashicorp/terraform/helper/resource"
)

func TestAccTencentCloudCamGroupMembershipsDataSource_basic(t *testing.T) {
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckCamGroupMembershipDestroy,
Steps: []resource.TestStep{
{
Config: testAccCamGroupMembershipsDataSource_basic,
Check: resource.ComposeAggregateTestCheckFunc(
testAccCheckCamGroupExists("tencentcloud_cam_group_membership.membership"),
resource.TestCheckResourceAttr("data.tencentcloud_cam_group_memberships.memberships", "membership_list.#", "1"),
resource.TestCheckResourceAttrSet("data.tencentcloud_cam_group_memberships.memberships", "membership_list.0.group_id"),
resource.TestCheckResourceAttr("data.tencentcloud_cam_group_memberships.memberships", "membership_list.0.user_ids.#", "1"),
),
},
},
})
}

const testAccCamGroupMembershipsDataSource_basic = `
resource "tencentcloud_cam_group" "group_basic" {
name = "cam-group-membership-test"
remark = "test"
}

resource "tencentcloud_cam_user" "user_basic" {
name = "cam-user-testj"
remark = "test"
console_login = true
use_api = true
need_reset_password = true
password = "Gail@1234"
phone_num = "13631555963"
country_code = "86"
email = "[email protected]"
}

resource "tencentcloud_cam_group_membership" "membership" {
group_id = "${tencentcloud_cam_group.group_basic.id}"
user_ids = ["${tencentcloud_cam_user.user_basic.id}"]
}

data "tencentcloud_cam_group_memberships" "memberships" {
group_id = "${tencentcloud_cam_group_membership.membership.id}"
}
`
Loading