Skip to content

Commit 97331c2

Browse files
committed
code of ucloud_anti_ddos_* resource is ready
1 parent a83224a commit 97331c2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+7654
-488
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ go 1.19
44

55
require (
66
github.com/hashicorp/terraform-plugin-sdk v1.4.0
7-
github.com/ucloud/ucloud-sdk-go v0.21.19
7+
github.com/ucloud/ucloud-sdk-go v0.21.53
88
)
99

1010
require (

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,10 @@ github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0
173173
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
174174
github.com/ucloud/ucloud-sdk-go v0.21.19 h1:WqD38oLDYxWS3s92DBKR99X3bKktuveTdSigcBynDT4=
175175
github.com/ucloud/ucloud-sdk-go v0.21.19/go.mod h1:dyLmFHmUfgb4RZKYQP9IArlvQ2pxzFthfhwxRzOEPIw=
176+
github.com/ucloud/ucloud-sdk-go v0.21.51 h1:L81eGOfRoEdu3rDeUfOW4PY6nnuqRbObZD/zRiak3B0=
177+
github.com/ucloud/ucloud-sdk-go v0.21.51/go.mod h1:dyLmFHmUfgb4RZKYQP9IArlvQ2pxzFthfhwxRzOEPIw=
178+
github.com/ucloud/ucloud-sdk-go v0.21.53 h1:8tlgdc80Xqe0E+jns9VC+9kT+wmkOzjCzmm96UI9hrw=
179+
github.com/ucloud/ucloud-sdk-go v0.21.53/go.mod h1:dyLmFHmUfgb4RZKYQP9IArlvQ2pxzFthfhwxRzOEPIw=
176180
github.com/ulikunitz/xz v0.5.5 h1:pFrO0lVpTBXLpYw+pnLj6TbvHuyjXMfjGeCwSqCVwok=
177181
github.com/ulikunitz/xz v0.5.5/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8=
178182
github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=

ucloud/client.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import (
55
"github.com/ucloud/ucloud-sdk-go/services/cube"
66
"github.com/ucloud/ucloud-sdk-go/services/ipsecvpn"
77
"github.com/ucloud/ucloud-sdk-go/services/uaccount"
8+
"github.com/ucloud/ucloud-sdk-go/services/uads"
9+
810
"github.com/ucloud/ucloud-sdk-go/services/udb"
911
"github.com/ucloud/ucloud-sdk-go/services/udisk"
1012
"github.com/ucloud/ucloud-sdk-go/services/udpn"
@@ -42,7 +44,7 @@ type UCloudClient struct {
4244
us3conn *ufile.UFileClient
4345
cubeconn *cube.CubeClient
4446
uk8sconn *uk8s.UK8SClient
45-
47+
uadsconn *uads.UADSClient
4648
// private services
4749
pumemconn *pumem.UMemClient
4850
}

ucloud/config.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package ucloud
33
import (
44
"encoding/json"
55
"fmt"
6+
"github.com/ucloud/ucloud-sdk-go/services/uads"
67
"io/ioutil"
78
"os"
89
"path/filepath"
@@ -133,6 +134,7 @@ func (c *Config) Client() (*UCloudClient, error) {
133134
client.ufsconn = ufs.NewClient(&cfg, &cred)
134135
client.us3conn = ufile.NewClient(&cfg, &cred)
135136
client.cubeconn = cube.NewClient(&cfg, &cred)
137+
client.uadsconn = uads.NewClient(&cfg, &cred)
136138

137139
// initialize client connections for private usage
138140
client.pumemconn = pumem.NewClient(&cfg, &cred)
@@ -160,6 +162,7 @@ func (c *Config) Client() (*UCloudClient, error) {
160162
client.us3conn.AddHttpRequestHandler(cloudShellCredHandler)
161163
client.cubeconn.AddHttpRequestHandler(cloudShellCredHandler)
162164
client.uk8sconn.AddHttpRequestHandler(cloudShellCredHandler)
165+
client.uadsconn.AddHttpRequestHandler(cloudShellCredHandler)
163166
}
164167

165168
client.config = &cfg

ucloud/consts.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,26 @@ var vpnIkeVersionCvt = newStringConverter(map[string]string{
205205
"IKE V2": "ikev2",
206206
})
207207

208+
const uadsAllowedDomainStatusAdding = 1
209+
const uadsAllowedDomainStatusSuccess = 2
210+
const uadsAllowedDomainStatusDeleting = 3
211+
const uadsAllowedDomainStatusFailure = 4
212+
const uadsAllowedDomainStatusDeleted = 5
213+
214+
var uadsAllowedDomainStatusCvt = newIntConverter(map[int]string{
215+
uadsAllowedDomainStatusAdding: "Adding",
216+
uadsAllowedDomainStatusSuccess: "Success",
217+
uadsAllowedDomainStatusDeleting: "Deleting",
218+
uadsAllowedDomainStatusFailure: "Failure",
219+
uadsAllowedDomainStatusDeleted: "Deleted",
220+
})
221+
222+
const uadsBGPServiceIPStatusSuccess = "Success"
223+
const uadsBGPServiceIPStatusPending = "Pending"
224+
225+
const uadsBGPServiceFwdRuleStatusSuccess = "Success"
226+
const uadsBGPServiceFwdRuleStatusPending = "Pending"
227+
208228
// upperCvt is used to transform uppercase with underscore to lowercase with underscore. eg. LOCAL_SSD -> local_ssd
209229
var upperCvt = newUpperConverter(nil)
210230

ucloud/provider.go

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -102,37 +102,41 @@ func Provider() terraform.ResourceProvider {
102102
},
103103

104104
ResourcesMap: map[string]*schema.Resource{
105-
"ucloud_instance": resourceUCloudInstance(),
106-
"ucloud_eip": resourceUCloudEIP(),
107-
"ucloud_eip_association": resourceUCloudEIPAssociation(),
108-
"ucloud_vpc": resourceUCloudVPC(),
109-
"ucloud_subnet": resourceUCloudSubnet(),
110-
"ucloud_vpc_peering_connection": resourceUCloudVPCPeeringConnection(),
111-
"ucloud_udpn_connection": resourceUCloudUDPNConnection(),
112-
"ucloud_lb": resourceUCloudLB(),
113-
"ucloud_lb_listener": resourceUCloudLBListener(),
114-
"ucloud_lb_attachment": resourceUCloudLBAttachment(),
115-
"ucloud_lb_rule": resourceUCloudLBRule(),
116-
"ucloud_disk": resourceUCloudDisk(),
117-
"ucloud_disk_attachment": resourceUCloudDiskAttachment(),
118-
"ucloud_security_group": resourceUCloudSecurityGroup(),
119-
"ucloud_lb_ssl": resourceUCloudLBSSL(),
120-
"ucloud_lb_ssl_attachment": resourceUCloudLBSSLAttachment(),
121-
"ucloud_db_instance": resourceUCloudDBInstance(),
122-
"ucloud_redis_instance": resourceUCloudRedisInstance(),
123-
"ucloud_memcache_instance": resourceUCloudMemcacheInstance(),
124-
"ucloud_isolation_group": resourceUCloudIsolationGroup(),
125-
"ucloud_vip": resourceUCloudVIP(),
126-
"ucloud_nat_gateway": resourceUCloudNatGateway(),
127-
"ucloud_nat_gateway_rule": resourceUCloudNatGatewayRule(),
128-
"ucloud_vpn_gateway": resourceUCloudVPNGateway(),
129-
"ucloud_vpn_customer_gateway": resourceUCloudVPNCustomerGateway(),
130-
"ucloud_vpn_connection": resourceUCloudVPNConnection(),
131-
"ucloud_ufs_volume": resourceUCloudUFSVolume(),
132-
"ucloud_ufs_volume_mount_point": resourceUCloudUFSVolumeMountPoint(),
133-
"ucloud_us3_bucket": resourceUCloudUS3Bucket(),
134-
"ucloud_uk8s_cluster": resourceUCloudUK8SCluster(),
135-
"ucloud_uk8s_node": resourceUCloudUK8SNode(),
105+
"ucloud_instance": resourceUCloudInstance(),
106+
"ucloud_eip": resourceUCloudEIP(),
107+
"ucloud_eip_association": resourceUCloudEIPAssociation(),
108+
"ucloud_vpc": resourceUCloudVPC(),
109+
"ucloud_subnet": resourceUCloudSubnet(),
110+
"ucloud_vpc_peering_connection": resourceUCloudVPCPeeringConnection(),
111+
"ucloud_udpn_connection": resourceUCloudUDPNConnection(),
112+
"ucloud_lb": resourceUCloudLB(),
113+
"ucloud_lb_listener": resourceUCloudLBListener(),
114+
"ucloud_lb_attachment": resourceUCloudLBAttachment(),
115+
"ucloud_lb_rule": resourceUCloudLBRule(),
116+
"ucloud_disk": resourceUCloudDisk(),
117+
"ucloud_disk_attachment": resourceUCloudDiskAttachment(),
118+
"ucloud_security_group": resourceUCloudSecurityGroup(),
119+
"ucloud_lb_ssl": resourceUCloudLBSSL(),
120+
"ucloud_lb_ssl_attachment": resourceUCloudLBSSLAttachment(),
121+
"ucloud_db_instance": resourceUCloudDBInstance(),
122+
"ucloud_redis_instance": resourceUCloudRedisInstance(),
123+
"ucloud_memcache_instance": resourceUCloudMemcacheInstance(),
124+
"ucloud_isolation_group": resourceUCloudIsolationGroup(),
125+
"ucloud_vip": resourceUCloudVIP(),
126+
"ucloud_nat_gateway": resourceUCloudNatGateway(),
127+
"ucloud_nat_gateway_rule": resourceUCloudNatGatewayRule(),
128+
"ucloud_vpn_gateway": resourceUCloudVPNGateway(),
129+
"ucloud_vpn_customer_gateway": resourceUCloudVPNCustomerGateway(),
130+
"ucloud_vpn_connection": resourceUCloudVPNConnection(),
131+
"ucloud_ufs_volume": resourceUCloudUFSVolume(),
132+
"ucloud_ufs_volume_mount_point": resourceUCloudUFSVolumeMountPoint(),
133+
"ucloud_us3_bucket": resourceUCloudUS3Bucket(),
134+
"ucloud_uk8s_cluster": resourceUCloudUK8SCluster(),
135+
"ucloud_uk8s_node": resourceUCloudUK8SNode(),
136+
"ucloud_anti_ddos_instance": resourceUCloudAntiDDoSInstance(),
137+
"ucloud_anti_ddos_allowed_domain": resourceUCloudAntiDDoSAllowedDomain(),
138+
"ucloud_anti_ddos_ip": resourceUCloudAntiDDoSIP(),
139+
"ucloud_anti_ddos_rule": resourceUCloudAntiDDoSRule(),
136140
},
137141
ConfigureFunc: providerConfigure,
138142
}
Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
package ucloud
2+
3+
import (
4+
"fmt"
5+
"strings"
6+
"time"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/helper/customdiff"
9+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
10+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
11+
"github.com/ucloud/ucloud-sdk-go/ucloud"
12+
)
13+
14+
func resourceUCloudAntiDDoSAllowedDomain() *schema.Resource {
15+
return &schema.Resource{
16+
Create: resourceUCloudAntiDDoSAllowedDomainCreate,
17+
Read: resourceUCloudAntiDDoSAllowedDomainRead,
18+
Update: resourceUCloudAntiDDoSAllowedDomainUpdate,
19+
Delete: resourceUCloudAntiDDoSAllowedDomainDelete,
20+
Importer: &schema.ResourceImporter{
21+
State: schema.ImportStatePassthrough,
22+
},
23+
24+
CustomizeDiff: customdiff.All(),
25+
26+
Schema: map[string]*schema.Schema{
27+
"domain": {
28+
Type: schema.TypeString,
29+
Required: true,
30+
ForceNew: true,
31+
},
32+
33+
"comment": {
34+
Type: schema.TypeString,
35+
Optional: true,
36+
Computed: true,
37+
},
38+
39+
"instance_id": {
40+
Type: schema.TypeString,
41+
Required: true,
42+
ForceNew: true,
43+
},
44+
45+
"status": {
46+
Type: schema.TypeString,
47+
Computed: true,
48+
},
49+
},
50+
}
51+
}
52+
53+
func resourceUCloudAntiDDoSAllowedDomainCreate(d *schema.ResourceData, meta interface{}) error {
54+
client := meta.(*UCloudClient)
55+
conn := client.uadsconn
56+
domain := d.Get("domain").(string)
57+
req := conn.NewAddNapAllowListDomainRequest()
58+
req.ResourceId = ucloud.String(d.Get("instance_id").(string))
59+
req.Domain = []string{domain}
60+
61+
resp, err := conn.AddNapAllowListDomain(req)
62+
if err != nil {
63+
return fmt.Errorf("error on creating ucloud_anti_ddos_domain, %s", err)
64+
}
65+
66+
for _, data := range resp.Data {
67+
if data.Domain == domain && data.Code != 0 {
68+
return fmt.Errorf("fail to create domain %v to %v with RetCode %v", data.Domain, d.Id(), data.Code)
69+
}
70+
}
71+
instanceId := d.Get("instance_id").(string)
72+
d.SetId(fmt.Sprintf("%s/%s", instanceId, d.Get("domain").(string)))
73+
74+
// after create lb, we need to wait it initialized
75+
stateConf := antiDDoSAllowedDomainWaitForState(client, instanceId, domain)
76+
77+
_, err = stateConf.WaitForState()
78+
if err != nil {
79+
return fmt.Errorf("error on waiting for ucloud_anti_ddos_instance %q creating, %s", d.Id(), err)
80+
}
81+
82+
if comment, ok := d.GetOkExists("comment"); ok {
83+
remarkReq := conn.NewSetNapDomainEntryRemarkRequest()
84+
remarkReq.ResourceId = req.ResourceId
85+
remarkReq.Domain = ucloud.String(domain)
86+
remarkReq.Remark = ucloud.String(comment.(string))
87+
_, err := conn.SetNapDomainEntryRemark(remarkReq)
88+
if err != nil {
89+
return fmt.Errorf("fail to set comment %v for domain %v of %v", comment, domain, *req.ResourceId)
90+
}
91+
}
92+
93+
return resourceUCloudAntiDDoSAllowedDomainRead(d, meta)
94+
}
95+
96+
func resourceUCloudAntiDDoSAllowedDomainUpdate(d *schema.ResourceData, meta interface{}) error {
97+
client := meta.(*UCloudClient)
98+
conn := client.uadsconn
99+
d.Partial(true)
100+
instanceId := d.Get("instance_id").(string)
101+
domain := d.Get("domain").(string)
102+
103+
if d.HasChange("comment") && !d.IsNewResource() {
104+
comment := d.Get("comment").(string)
105+
remarkReq := conn.NewSetNapDomainEntryRemarkRequest()
106+
remarkReq.ResourceId = ucloud.String(instanceId)
107+
remarkReq.Domain = ucloud.String(domain)
108+
remarkReq.Remark = ucloud.String(comment)
109+
_, err := conn.SetNapDomainEntryRemark(remarkReq)
110+
if err != nil {
111+
return fmt.Errorf("fail to set comment %v for domain %v of %v", comment, domain, instanceId)
112+
}
113+
d.SetPartial("comment")
114+
}
115+
116+
d.Partial(false)
117+
118+
return resourceUCloudAntiDDoSAllowedDomainRead(d, meta)
119+
}
120+
121+
func resourceUCloudAntiDDoSAllowedDomainRead(d *schema.ResourceData, meta interface{}) error {
122+
client := meta.(*UCloudClient)
123+
id := d.Id()
124+
items := strings.SplitN(id, "/", 2)
125+
if len(items) != 2 {
126+
return fmt.Errorf("%v is an invalid ucloud_anti_ddos_allowed_domain id", id)
127+
}
128+
instanceId := items[0]
129+
domain := items[1]
130+
131+
domainInfo, err := client.describeUADSAllowedDomain(instanceId, domain)
132+
133+
if err != nil {
134+
if isNotFoundError(err) {
135+
d.SetId("")
136+
return nil
137+
}
138+
return fmt.Errorf("error on reading uads allowed domain %s of %s, %s", domain, instanceId, err)
139+
}
140+
d.Set("domain", domain)
141+
d.Set("instance_id", instanceId)
142+
d.Set("comment", domainInfo.Remark)
143+
d.Set("status", uadsAllowedDomainStatusCvt.convert(domainInfo.Status))
144+
return nil
145+
}
146+
147+
func resourceUCloudAntiDDoSAllowedDomainDelete(d *schema.ResourceData, meta interface{}) error {
148+
client := meta.(*UCloudClient)
149+
conn := client.uadsconn
150+
instanceId := d.Get("instance_id").(string)
151+
domain := d.Get("domain").(string)
152+
153+
req := conn.NewDeleteNapAllowListDomainRequest()
154+
req.ResourceId = ucloud.String(instanceId)
155+
req.Domain = []string{domain}
156+
157+
return resource.Retry(5*time.Minute, func() *resource.RetryError {
158+
if _, err := conn.DeleteNapAllowListDomain(req); err != nil {
159+
return resource.NonRetryableError(fmt.Errorf("error on deleting ucloud_anti_ddos_allowed_domain %s, %s", d.Id(), err))
160+
}
161+
162+
_, err := client.describeUADSAllowedDomain(instanceId, domain)
163+
if err != nil {
164+
if isNotFoundError(err) {
165+
return nil
166+
}
167+
return resource.NonRetryableError(fmt.Errorf("error on reading ucloud_anti_ddos_allowed_domain when deleting %s, %s", d.Id(), err))
168+
}
169+
170+
return resource.RetryableError(fmt.Errorf("the specified ucloud_anti_ddos_allowed_domain %s has not been deleted due to unknown error", d.Id()))
171+
})
172+
}
173+
174+
func antiDDoSAllowedDomainWaitForState(client *UCloudClient, id string, domain string) *resource.StateChangeConf {
175+
return &resource.StateChangeConf{
176+
Pending: []string{statusPending},
177+
Target: []string{statusInitialized},
178+
Timeout: 3 * time.Minute,
179+
Delay: 2 * time.Second,
180+
MinTimeout: 1 * time.Second,
181+
Refresh: func() (interface{}, string, error) {
182+
domainInfo, err := client.describeUADSAllowedDomain(id, domain)
183+
if err != nil {
184+
if isNotFoundError(err) {
185+
return nil, statusPending, nil
186+
}
187+
return nil, "", err
188+
}
189+
190+
if domainInfo.Status == uadsAllowedDomainStatusSuccess {
191+
return domainInfo, statusInitialized, nil
192+
} else if domainInfo.Status == uadsAllowedDomainStatusAdding {
193+
return domainInfo, statusPending, nil
194+
} else if domainInfo.Status == uadsAllowedDomainStatusFailure {
195+
return nil, "", fmt.Errorf("fail to add domain %v for %v", domain, id)
196+
} else {
197+
return nil, "", fmt.Errorf("status %v should not be got", domainInfo.Status)
198+
}
199+
},
200+
}
201+
}

0 commit comments

Comments
 (0)