Skip to content

Commit 833871b

Browse files
author
hellertang
authored
support resource scf layer (#713)
1 parent c34a09f commit 833871b

File tree

11 files changed

+475
-6
lines changed

11 files changed

+475
-6
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ require (
3939
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/monitor v1.0.256
4040
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/postgres v1.0.199
4141
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/redis v1.0.199
42-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf v1.0.267
42+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf v1.0.275
4343
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sqlserver v1.0.199
4444
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl v1.0.199
4545
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssm v1.0.199

go.sum

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -486,18 +486,16 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/kms v1.0.199 h1:rSDQeqv
486486
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/kms v1.0.199/go.mod h1:yrBKWhChnDqNz1xuXdSbWXG56XawEq0G5j1lg4VwBD4=
487487
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mongodb v1.0.199 h1:2jsGprrewRIP3smcTsY5GpEuOuJ+qyV/BN3Py0Ivf1o=
488488
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mongodb v1.0.199/go.mod h1:f5GhbJyuYQBzRaDHGe3I4U9utb0Pmx2NlI+XcqSQRp0=
489-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/monitor v1.0.199 h1:/nt4GJuPxGyM2RSudKOsuq1dG52U67VWuH+meXH2D+k=
490-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/monitor v1.0.199/go.mod h1:aMwrB/fRSIS8IFabcF0hfRC89y76DptUknUjAf1jlHE=
491489
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/monitor v1.0.256 h1:ZuLw+tA9BunYh68AZ1c4tuRJOwsSRKgyf5HYRWyp2gA=
492490
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/monitor v1.0.256/go.mod h1:aMwrB/fRSIS8IFabcF0hfRC89y76DptUknUjAf1jlHE=
493491
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/postgres v1.0.199 h1:Opze570l6JbOc+/nYftYmheyCU9omz+emNJpDUBYYFQ=
494492
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/postgres v1.0.199/go.mod h1:Rh/4NXBd0aqmaRGDYcW4gL2Zi8JShGZiB23zrfVaS90=
495493
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/redis v1.0.199 h1:lXCng7HQqvubF7uwa7x5COsDZlJEjEJ/RBpaeYGc0+I=
496494
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/redis v1.0.199/go.mod h1:5bwboqeXqVnRvUlKn2G9Y9DbOnWMSVQ0zWhhPZKUVZE=
497-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf v1.0.199 h1:vvxCCj6RiRM4FkSdxncroAx9JGD6xBBhAnXugQrE3j8=
498-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf v1.0.199/go.mod h1:Pew6DV5oBGrzHYWZ8ssiHeJS/Z39ggVv1y5ADGWdO4s=
499495
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf v1.0.267 h1:ipvvQOzGyUUGohsVLElJnDDZn4Xoq1axk8my+GLyRYs=
500496
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf v1.0.267/go.mod h1:Pew6DV5oBGrzHYWZ8ssiHeJS/Z39ggVv1y5ADGWdO4s=
497+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf v1.0.275 h1:hn5RrN/qkcObnyKfJ+raey/riVeRqHJFvY34l2YgELs=
498+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf v1.0.275/go.mod h1:Pew6DV5oBGrzHYWZ8ssiHeJS/Z39ggVv1y5ADGWdO4s=
501499
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sqlserver v1.0.199 h1:Ms62XLYCuqrdG4mD5S72oj/ZxdNTxJ+Mc4w0Kxqucwo=
502500
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sqlserver v1.0.199/go.mod h1:ySz4zbciCFruAviNMeBcu7wW2+BY9Maw8qGWawTywkM=
503501
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl v1.0.199 h1:UkF3qBxMbpOf2VjxgzMgqvBCS+Hqr8XXSrtRd+rABMk=

tencentcloud/internal/helper/transform.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package helper
22

3+
import "strconv"
4+
35
func Bool(i bool) *bool { return &i }
46

57
func String(i string) *string { return &i }
@@ -109,3 +111,13 @@ func BoolToInt64Ptr(s bool) (i *int64) {
109111
i = &result
110112
return
111113
}
114+
115+
func Int64ToStr(s int64) (i string) {
116+
i = strconv.FormatInt(s, 10)
117+
return
118+
}
119+
120+
func StrToInt64(s string) (i int64) {
121+
i, _ = strconv.ParseInt(s, 10, 64)
122+
return
123+
}

tencentcloud/provider.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,7 @@ Serverless Cloud Function(SCF)
401401
Resource
402402
tencentcloud_scf_function
403403
tencentcloud_scf_namespace
404+
tencentcloud_scf_layer
404405
405406
SQLServer
406407
Data Source
@@ -922,6 +923,7 @@ func Provider() terraform.ResourceProvider {
922923
"tencentcloud_cam_saml_provider": resourceTencentCloudCamSAMLProvider(),
923924
"tencentcloud_scf_function": resourceTencentCloudScfFunction(),
924925
"tencentcloud_scf_namespace": resourceTencentCloudScfNamespace(),
926+
"tencentcloud_scf_layer": resourceTencentCloudScfLayer(),
925927
"tencentcloud_tcaplus_cluster": resourceTencentCloudTcaplusCluster(),
926928
"tencentcloud_tcaplus_tablegroup": resourceTencentCloudTcaplusTableGroup(),
927929
"tencentcloud_tcaplus_idl": resourceTencentCloudTcaplusIdl(),

tencentcloud/resource_tc_scf_layer.go

Lines changed: 321 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,321 @@
1+
/*
2+
Provide a resource to create a SCF layer.
3+
4+
Example Usage
5+
6+
```hcl
7+
resource "tencentcloud_scf_layer" "foo" {
8+
layer_name = "foo"
9+
compatible_runtimes = ["Python3.6"]
10+
content {
11+
cos_bucket_name = "test-bucket"
12+
cos_object_name = "/foo.zip"
13+
cos_bucket_region = "ap-guangzhou"
14+
}
15+
description = "foo"
16+
license_info = "foo"
17+
}
18+
```
19+
Import
20+
21+
Scf layer can be imported, e.g.
22+
23+
```
24+
$ terraform import tencentcloud_scf_layer.layer layerId#layerVersion
25+
```
26+
27+
*/
28+
package tencentcloud
29+
30+
import (
31+
"fmt"
32+
"log"
33+
"strings"
34+
35+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
36+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
37+
scf "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf/v20180416"
38+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
39+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/ratelimit"
40+
)
41+
42+
func LayerContent() map[string]*schema.Schema {
43+
return map[string]*schema.Schema{
44+
// cos code
45+
"cos_bucket_name": {
46+
Type: schema.TypeString,
47+
Optional: true,
48+
Description: "Cos bucket name of the SCF layer, such as `cos-1234567890`, conflict with `zip_file`.",
49+
},
50+
"cos_object_name": {
51+
Type: schema.TypeString,
52+
Optional: true,
53+
ValidateFunc: validateStringSuffix(".zip", ".jar"),
54+
Description: "Cos object name of the SCF layer, should have suffix `.zip` or `.jar`, conflict with `zip_file`.",
55+
},
56+
"cos_bucket_region": {
57+
Type: schema.TypeString,
58+
Optional: true,
59+
Description: "Cos bucket region of the SCF layer, conflict with `zip_file`.",
60+
},
61+
// zip upload
62+
"zip_file": {
63+
Type: schema.TypeString,
64+
Optional: true,
65+
Description: "Zip file of the SCF layer, conflict with `cos_bucket_name`, `cos_object_name`, `cos_bucket_region`.",
66+
},
67+
}
68+
}
69+
70+
func resourceTencentCloudScfLayer() *schema.Resource {
71+
return &schema.Resource{
72+
Create: resourceTencentCloudScfLayerCreate,
73+
Read: resourceTencentCloudScfLayerRead,
74+
Update: resourceTencentCloudScfLayerUpdate,
75+
Delete: resourceTencentCloudScfLayerDelete,
76+
Importer: &schema.ResourceImporter{
77+
State: schema.ImportStatePassthrough,
78+
},
79+
80+
Schema: map[string]*schema.Schema{
81+
"layer_name": {
82+
Type: schema.TypeString,
83+
Required: true,
84+
Description: "The name of layer.",
85+
},
86+
"compatible_runtimes": {
87+
Type: schema.TypeList,
88+
Required: true,
89+
Elem: &schema.Schema{
90+
Type: schema.TypeString,
91+
Description: "The name of runtime",
92+
},
93+
Description: "The compatible runtimes of layer.",
94+
},
95+
"content": {
96+
Type: schema.TypeList,
97+
Required: true,
98+
MaxItems: 1,
99+
Description: "The source code of layer.",
100+
Elem: &schema.Resource{
101+
Schema: LayerContent(),
102+
},
103+
},
104+
"description": {
105+
Type: schema.TypeString,
106+
Optional: true,
107+
Description: "The description of layer.",
108+
},
109+
"license_info": {
110+
Type: schema.TypeString,
111+
Optional: true,
112+
Description: "The license info of layer.",
113+
},
114+
115+
//compute
116+
"layer_version": {
117+
Type: schema.TypeString,
118+
Computed: true,
119+
Description: "The version of layer.",
120+
},
121+
"create_time": {
122+
Type: schema.TypeString,
123+
Computed: true,
124+
Description: "The create time of layer.",
125+
},
126+
"code_sha_256": {
127+
Type: schema.TypeString,
128+
Computed: true,
129+
Description: "The code type of layer.",
130+
},
131+
"location": {
132+
Type: schema.TypeString,
133+
Computed: true,
134+
Description: "The download location url of layer.",
135+
},
136+
"status": {
137+
Type: schema.TypeString,
138+
Computed: true,
139+
Description: "The current status of layer.",
140+
},
141+
},
142+
}
143+
}
144+
145+
func resourceTencentCloudScfLayerCreate(d *schema.ResourceData, meta interface{}) error {
146+
defer logElapsed("resource.tencentcloud_scf_layer.create")()
147+
logId := getLogId(contextNil)
148+
var (
149+
scfService = ScfService{client: meta.(*TencentCloudClient).apiV3Conn}
150+
request = scf.NewPublishLayerVersionRequest()
151+
layerName *string
152+
layerVersion *int64
153+
)
154+
155+
if v, ok := d.GetOk("layer_name"); ok {
156+
layerName = helper.String(v.(string))
157+
request.LayerName = layerName
158+
}
159+
160+
if v, ok := d.GetOk("compatible_runtimes"); ok {
161+
items := make([]*string, 0, 10)
162+
for _, item := range v.([]interface{}) {
163+
items = append(items, helper.String(item.(string)))
164+
}
165+
request.CompatibleRuntimes = items
166+
}
167+
168+
if v, ok := d.GetOk("content"); ok {
169+
items := v.([]interface{})
170+
if len(items) != 1 {
171+
return fmt.Errorf("need only one content.")
172+
}
173+
item := items[0].(map[string]interface{})
174+
var content = scf.Code{}
175+
if item["cos_bucket_name"] != nil {
176+
content.CosBucketName = helper.String(item["cos_bucket_name"].(string))
177+
}
178+
if item["cos_object_name"] != nil {
179+
content.CosObjectName = helper.String(item["cos_object_name"].(string))
180+
}
181+
if item["cos_bucket_region"] != nil {
182+
content.CosBucketRegion = helper.String(item["cos_bucket_region"].(string))
183+
}
184+
if item["zip_file"] != nil {
185+
content.ZipFile = helper.String(item["zip_file"].(string))
186+
}
187+
request.Content = &content
188+
}
189+
190+
if v, ok := d.GetOk("description"); ok {
191+
request.Description = helper.String(v.(string))
192+
}
193+
194+
if v, ok := d.GetOk("license_info"); ok {
195+
request.LicenseInfo = helper.String(v.(string))
196+
}
197+
198+
if err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
199+
ratelimit.Check(request.GetAction())
200+
response, err := scfService.client.UseScfClient().PublishLayerVersion(request)
201+
if err != nil {
202+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
203+
logId, request.GetAction(), request.ToJsonString(), err.Error())
204+
return retryError(err, InternalError)
205+
}
206+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
207+
logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
208+
209+
layerVersion = response.Response.LayerVersion
210+
return nil
211+
}); err != nil {
212+
return err
213+
}
214+
215+
d.SetId(*layerName + FILED_SP + helper.Int64ToStr(*layerVersion))
216+
return resourceTencentCloudScfLayerRead(d, meta)
217+
}
218+
219+
func resourceTencentCloudScfLayerUpdate(d *schema.ResourceData, meta interface{}) error {
220+
return nil
221+
}
222+
223+
func resourceTencentCloudScfLayerRead(d *schema.ResourceData, meta interface{}) error {
224+
defer logElapsed("resource.tencentcloud_scf_layer.read")()
225+
defer inconsistentCheck(d, meta)()
226+
227+
logId := getLogId(contextNil)
228+
//ctx := context.WithValue(context.TODO(), logIdKey, logId)
229+
230+
var (
231+
scfService = ScfService{client: meta.(*TencentCloudClient).apiV3Conn}
232+
layerRequest = scf.NewGetLayerVersionRequest()
233+
layerResponse = scf.GetLayerVersionResponse{}
234+
)
235+
236+
idSplit := strings.Split(d.Id(), FILED_SP)
237+
if len(idSplit) != 2 {
238+
return fmt.Errorf("scf layer id is borken, id is %s", d.Id())
239+
}
240+
layerName := idSplit[0]
241+
layerVersion := idSplit[1]
242+
243+
layerRequest.LayerName = &layerName
244+
layerRequest.LayerVersion = helper.Int64(helper.StrToInt64(layerVersion))
245+
246+
if err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
247+
ratelimit.Check(layerRequest.GetAction())
248+
response, err := scfService.client.UseScfClient().GetLayerVersion(layerRequest)
249+
if err != nil {
250+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
251+
logId, layerRequest.GetAction(), layerRequest.ToJsonString(), err.Error())
252+
return retryError(err, InternalError)
253+
}
254+
255+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
256+
logId, layerRequest.GetAction(), layerRequest.ToJsonString(), response.ToJsonString())
257+
layerResponse = *response
258+
return nil
259+
}); err != nil {
260+
return err
261+
}
262+
263+
var errs []error
264+
errs = append(errs,
265+
d.Set("layer_name", layerResponse.Response.LayerName),
266+
d.Set("layer_version", layerResponse.Response.LayerVersion),
267+
d.Set("location", layerResponse.Response.Location),
268+
d.Set("create_time", layerResponse.Response.AddTime),
269+
d.Set("description", layerResponse.Response.Description),
270+
d.Set("license_info", layerResponse.Response.LicenseInfo),
271+
d.Set("status", layerResponse.Response.Status),
272+
d.Set("code_sha_256", layerResponse.Response.CodeSha256),
273+
)
274+
275+
var runtimes = make([]interface{}, 0, 100)
276+
for _, runtime := range layerResponse.Response.CompatibleRuntimes {
277+
runtimes = append(runtimes, runtime)
278+
}
279+
280+
errs = append(errs, d.Set("compatible_runtimes", runtimes))
281+
282+
if len(errs) > 0 {
283+
return errs[0]
284+
} else {
285+
return nil
286+
}
287+
}
288+
289+
func resourceTencentCloudScfLayerDelete(d *schema.ResourceData, meta interface{}) error {
290+
defer logElapsed("resource.tencentcloud_scf_layer.delete")()
291+
292+
logId := getLogId(contextNil)
293+
294+
var (
295+
scfService = ScfService{client: meta.(*TencentCloudClient).apiV3Conn}
296+
request = scf.NewDeleteLayerVersionRequest()
297+
)
298+
299+
idSplit := strings.Split(d.Id(), FILED_SP)
300+
if len(idSplit) != 2 {
301+
return fmt.Errorf("scf layer id is borken, id is %s", d.Id())
302+
}
303+
layerName := idSplit[0]
304+
layerVersion := idSplit[1]
305+
306+
request.LayerName = &layerName
307+
request.LayerVersion = helper.Int64(helper.StrToInt64(layerVersion))
308+
309+
if err := resource.Retry(readRetryTimeout, func() *resource.RetryError {
310+
ratelimit.Check(request.GetAction())
311+
if _, err := scfService.client.UseScfClient().DeleteLayerVersion(request); err != nil {
312+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
313+
logId, request.GetAction(), request.ToJsonString(), err.Error())
314+
return retryError(err, InternalError)
315+
}
316+
return nil
317+
}); err != nil {
318+
return err
319+
}
320+
return nil
321+
}

0 commit comments

Comments
 (0)