Skip to content

Commit

Permalink
A new resource for PrivateZone ZoneManage
Browse files Browse the repository at this point in the history
  • Loading branch information
chushenmeshile committed May 9, 2020
1 parent 39db7fb commit 8e70580
Show file tree
Hide file tree
Showing 8 changed files with 420 additions and 0 deletions.
1 change: 1 addition & 0 deletions alicloud/connectivity/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ type AliyunClient struct {
dms_enterpriseConn *dms_enterprise.Client
waf_openapiConn *waf_openapi.Client
resourcemanagerConn *resourcemanager.Client
pvtzConn *pvtz.Client
}

type ApiVersion string
Expand Down
1 change: 1 addition & 0 deletions alicloud/connectivity/endpoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
type ServiceCode string

const (
PvtzCode = ServiceCode("PVTZ")
ResourcemanagerCode = ServiceCode("RESOURCEMANAGER")
WafOpenapiCode = ServiceCode("WAFOPENAPI")
DmsEnterpriseCode = ServiceCode("DMSENTERPRISE")
Expand Down
1 change: 1 addition & 0 deletions alicloud/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -496,6 +496,7 @@ func Provider() terraform.ResourceProvider {
"alicloud_resource_manager_folder": resourceAlicloudResourceManagerFolder(),
"alicloud_resource_manager_handshake": resourceAlicloudResourceManagerHandshake(),
"alicloud_cen_private_zone": resourceAlicloudCenPrivateZone(),
"alicloud_private_zone_zone_manage": resourceAlicloudPrivateZoneZoneManage(),
},

ConfigureFunc: providerConfigure,
Expand Down
216 changes: 216 additions & 0 deletions alicloud/resource_alicloud_private_zone_zone_manage.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,216 @@
package alicloud

import (
"fmt"
"time"

"github.com/aliyun/alibaba-cloud-sdk-go/services/pvtz"
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/helper/validation"
"github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity"
)

func resourceAlicloudPrivateZoneZoneManage() *schema.Resource {
return &schema.Resource{
Create: resourceAlicloudPrivateZoneZoneManageCreate,
Read: resourceAlicloudPrivateZoneZoneManageRead,
Update: resourceAlicloudPrivateZoneZoneManageUpdate,
Delete: resourceAlicloudPrivateZoneZoneManageDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},
Schema: map[string]*schema.Schema{
"lang": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: validation.StringInSlice([]string{"zh", "en", "ja"}, false),
},
"proxy_pattern": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: validation.StringInSlice([]string{"ZONE", "RECORD"}, false),
},
"remark": {
Type: schema.TypeString,
Optional: true,
},
"resource_group_id": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
},
"user_client_ip": {
Type: schema.TypeString,
Optional: true,
},
"zone_name": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
},
},
}
}

func resourceAlicloudPrivateZoneZoneManageCreate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)

request := pvtz.CreateAddZoneRequest()
if v, ok := d.GetOk("lang"); ok {
request.Lang = v.(string)
}
if v, ok := d.GetOk("proxy_pattern"); ok {
request.ProxyPattern = v.(string)
}
if v, ok := d.GetOk("resource_group_id"); ok {
request.ResourceGroupId = v.(string)
}
if v, ok := d.GetOk("user_client_ip"); ok {
request.UserClientIp = v.(string)
}
if v, ok := d.GetOk("zone_name"); ok {
request.ZoneName = v.(string)
}
wait := incrementalWait(3*time.Second, 5*time.Second)
err := resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError {
raw, err := client.WithPvtzClient(func(pvtzClient *pvtz.Client) (interface{}, error) {
return pvtzClient.AddZone(request)
})
if err != nil {
if IsExpectedErrors(err, []string{"System.Busy"}) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(request.GetActionName(), raw)
response, _ := raw.(*pvtz.AddZoneResponse)
d.SetId(fmt.Sprintf("%v", response.ZoneId))
return nil
})
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, "alicloud_private_zone_zone_manage", request.GetActionName(), AlibabaCloudSdkGoERROR)
}

return resourceAlicloudPrivateZoneZoneManageUpdate(d, meta)
}
func resourceAlicloudPrivateZoneZoneManageRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
pvtzService := PvtzService{client}
object, err := pvtzService.DescribePrivateZoneZoneManage(d.Id())
if err != nil {
if NotFoundError(err) {
d.SetId("")
return nil
}
return WrapError(err)
}

d.Set("proxy_pattern", object.ProxyPattern)
d.Set("remark", object.Remark)
d.Set("zone_name", object.ZoneName)
return nil
}
func resourceAlicloudPrivateZoneZoneManageUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
d.Partial(true)

update := false
request := pvtz.CreateSetProxyPatternRequest()
request.ZoneId = d.Id()
if !d.IsNewResource() && d.HasChange("proxy_pattern") {
update = true
}
request.ProxyPattern = d.Get("proxy_pattern").(string)
if !d.IsNewResource() && d.HasChange("lang") {
update = true
request.Lang = d.Get("lang").(string)
}
if !d.IsNewResource() && d.HasChange("user_client_ip") {
update = true
request.UserClientIp = d.Get("user_client_ip").(string)
}
if update {
err := resource.Retry(15*time.Second, func() *resource.RetryError {
raw, err := client.WithPvtzClient(func(pvtzClient *pvtz.Client) (interface{}, error) {
return pvtzClient.SetProxyPattern(request)
})
if err != nil {
if IsExpectedErrors(err, []string{"System.Busy"}) {
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(request.GetActionName(), raw)
return nil
})
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), request.GetActionName(), AlibabaCloudSdkGoERROR)
}
d.SetPartial("proxy_pattern")
d.SetPartial("lang")
d.SetPartial("user_client_ip")
}
update = false
updateZoneRemarkReq := pvtz.CreateUpdateZoneRemarkRequest()
updateZoneRemarkReq.ZoneId = d.Id()
updateZoneRemarkReq.Lang = d.Get("lang").(string)
if d.HasChange("remark") {
update = true
updateZoneRemarkReq.Remark = d.Get("remark").(string)
}
updateZoneRemarkReq.UserClientIp = d.Get("user_client_ip").(string)
if update {
err := resource.Retry(15*time.Second, func() *resource.RetryError {
raw, err := client.WithPvtzClient(func(pvtzClient *pvtz.Client) (interface{}, error) {
return pvtzClient.UpdateZoneRemark(updateZoneRemarkReq)
})
if err != nil {
if IsExpectedErrors(err, []string{"System.Busy"}) {
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(updateZoneRemarkReq.GetActionName(), raw)
return nil
})
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), updateZoneRemarkReq.GetActionName(), AlibabaCloudSdkGoERROR)
}
d.SetPartial("remark")
}
d.Partial(false)
return resourceAlicloudPrivateZoneZoneManageRead(d, meta)
}
func resourceAlicloudPrivateZoneZoneManageDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
request := pvtz.CreateDeleteZoneRequest()
request.ZoneId = d.Id()
if v, ok := d.GetOk("lang"); ok {
request.Lang = v.(string)
}
if v, ok := d.GetOk("user_client_ip"); ok {
request.UserClientIp = v.(string)
}
err := resource.Retry(15*time.Second, func() *resource.RetryError {
raw, err := client.WithPvtzClient(func(pvtzClient *pvtz.Client) (interface{}, error) {
return pvtzClient.DeleteZone(request)
})
if err != nil {
if IsExpectedErrors(err, []string{"System.Busy"}) {
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(request.GetActionName(), raw)
return nil
})
if err != nil {
if IsExpectedErrors(err, []string{"Zone.Invalid.Id", "Zone.NotExists"}) {
return nil
}
return WrapErrorf(err, DefaultErrorMsg, d.Id(), request.GetActionName(), AlibabaCloudSdkGoERROR)
}
return nil
}
116 changes: 116 additions & 0 deletions alicloud/resource_alicloud_private_zone_zone_manage_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
package alicloud

import (
"fmt"
"testing"

"github.com/aliyun/alibaba-cloud-sdk-go/services/pvtz"
"github.com/hashicorp/terraform-plugin-sdk/helper/acctest"
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
"github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity"
)

func TestAccAlicloudPrivateZoneZoneManage_basic(t *testing.T) {
var v pvtz.DescribeZoneInfoResponse
resourceId := "alicloud_private_zone_zone_manage.default"
ra := resourceAttrInit(resourceId, PrivateZoneZoneManageMap)
rc := resourceCheckInitWithDescribeMethod(resourceId, &v, func() interface{} {
return &PvtzService{testAccProvider.Meta().(*connectivity.AliyunClient)}
}, "DescribePrivateZoneZoneManage")
rac := resourceAttrCheckInit(rc, ra)
testAccCheck := rac.resourceAttrMapUpdateSet()
rand := acctest.RandIntRange(1000000, 9999999)
name := fmt.Sprintf("tf-testAccPrivateZoneZoneManage%d", rand)
testAccConfig := resourceTestAccConfigFunc(resourceId, name, PrivateZoneZoneManageBasicdependence)
resource.Test(t, resource.TestCase{
PreCheck: func() {
testAccPreCheck(t)
},

IDRefreshName: resourceId,
Providers: testAccProviders,
CheckDestroy: rac.checkResourceDestroy(),
Steps: []resource.TestStep{
{
Config: testAccConfig(map[string]interface{}{
"zone_name": "demo.com",
"proxy_pattern": "ZONE",
}),
Check: resource.ComposeTestCheckFunc(
testAccCheck(map[string]string{
"zone_name": "demo.com",
"proxy_pattern": "ZONE",
}),
),
},
{
ResourceName: resourceId,
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{"ResourceGroupId"},
},
{
Config: testAccConfig(map[string]interface{}{
"lang": "en",
}),
Check: resource.ComposeTestCheckFunc(
testAccCheck(map[string]string{
"lang": "en",
}),
),
},
{
Config: testAccConfig(map[string]interface{}{
"proxy_pattern": "RECORD",
}),
Check: resource.ComposeTestCheckFunc(
testAccCheck(map[string]string{
"proxy_pattern": "RECORD",
}),
),
},
{
Config: testAccConfig(map[string]interface{}{
"remark": "update",
}),
Check: resource.ComposeTestCheckFunc(
testAccCheck(map[string]string{
"remark": "update",
}),
),
},
{
Config: testAccConfig(map[string]interface{}{
"user_client_ip": "1.1.1.1",
}),
Check: resource.ComposeTestCheckFunc(
testAccCheck(map[string]string{
"user_client_ip": "1.1.1.1",
}),
),
},
{
Config: testAccConfig(map[string]interface{}{
"user_client_ip": "1.1.1.2",
"proxy_pattern": "ZONE",
"lang": "zh",
"remark": "lastupdate",
}),
Check: resource.ComposeTestCheckFunc(
testAccCheck(map[string]string{
"user_client_ip": "1.1.1.2",
"proxy_pattern": "ZONE",
"lang": "zh",
"remark": "lastupdate",
}),
),
},
},
})
}

var PrivateZoneZoneManageMap = map[string]string{}

func PrivateZoneZoneManageBasicdependence(name string) string {
return ""
}
22 changes: 22 additions & 0 deletions alicloud/service_alicloud_pvtz.go
Original file line number Diff line number Diff line change
Expand Up @@ -231,3 +231,25 @@ func (s *PvtzService) WaitForPvtzZoneRecord(id string, status Status, timeout in

}
}

func (s *PvtzService) DescribePrivateZoneZoneManage(id string) (object pvtz.DescribeZoneInfoResponse, err error) {
request := pvtz.CreateDescribeZoneInfoRequest()
request.RegionId = s.client.RegionId

request.ZoneId = id

raw, err := s.client.WithPvtzClient(func(pvtzClient *pvtz.Client) (interface{}, error) {
return pvtzClient.DescribeZoneInfo(request)
})
if err != nil {
if IsExpectedErrors(err, []string{"Zone.Invalid.Id", "Zone.NotExists"}) {
err = WrapErrorf(Error(GetNotFoundMessage("PrivateZoneZoneManage", id)), NotFoundMsg, ProviderERROR)
return
}
err = WrapErrorf(err, DefaultErrorMsg, id, request.GetActionName(), AlibabaCloudSdkGoERROR)
return
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
response, _ := raw.(*pvtz.DescribeZoneInfoResponse)
return *response, nil
}
Loading

0 comments on commit 8e70580

Please sign in to comment.