This repository has been archived by the owner on Dec 9, 2020. It is now read-only.
/
resource_jdcloud_oss_bucket_upload.go
executable file
·123 lines (103 loc) · 3.28 KB
/
resource_jdcloud_oss_bucket_upload.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package jdcloud
import (
"fmt"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/aws/aws-sdk-go/service/s3/s3manager"
"github.com/hashicorp/terraform/helper/schema"
"os"
"path/filepath"
"strings"
)
func resourceJDCloudOssBucketUpload() *schema.Resource {
return &schema.Resource{
Create: resourceJDCloudOssBucketUploadCreate,
Read: resourceJDCloudOssBucketUploadRead,
Delete: resourceJDCloudOssBucketUploadDelete,
Schema: map[string]*schema.Schema{
"bucket_name": &schema.Schema{
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"file_name": &schema.Schema{
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"remote_location": &schema.Schema{
Type: schema.TypeString,
Computed: true,
},
},
}
}
func getUploader(meta interface{}) *s3manager.Uploader {
config := meta.(*JDCloudConfig)
endpoint := fmt.Sprintf(jdcloudOssEndpoint, config.Region)
sess := session.Must(session.NewSessionWithOptions(session.Options{
Config: aws.Config{
Credentials: credentials.NewStaticCredentials(config.AccessKey, config.SecretKey, ""),
Region: aws.String(config.Region),
Endpoint: aws.String(endpoint),
},
}))
return s3manager.NewUploader(sess)
}
func resourceJDCloudOssBucketUploadCreate(d *schema.ResourceData, meta interface{}) error {
bucketName := d.Get("bucket_name").(string)
fileName := d.Get("file_name").(string)
file, err := os.Open(fileName)
if err != nil {
return fmt.Errorf("[ERROR] Failed to open file namely %s, Error message-%s", fileName, err)
}
uploader := getUploader(meta)
respUpload, errUpload := uploader.Upload(&s3manager.UploadInput{
Bucket: aws.String(bucketName),
Key: aws.String(filepath.Base(fileName)),
Body: file,
})
if err := file.Close(); err != nil {
return err
}
if errUpload != nil || respUpload.Location == "" {
return fmt.Errorf("[ERROR] Failed to upload file: %s", errUpload.Error())
}
d.Set("remote_location", respUpload.Location)
d.SetId(respUpload.Location)
return resourceJDCloudOssBucketUploadRead(d, meta)
}
func resourceJDCloudOssBucketUploadRead(d *schema.ResourceData, meta interface{}) error {
svc := getOssClient(meta)
bucketName := d.Get("bucket_name").(string)
resp, err := svc.ListObjects(&s3.ListObjectsInput{Bucket: aws.String(bucketName)})
if err != nil {
return fmt.Errorf("[ERROR] Failed in resourceJDCloudOssBucketUploadRead,reasons:%s", err.Error())
}
fileNameFull := d.Get("file_name").(string)
fileNameParsed := strings.Split(fileNameFull, "/")
fileName := fileNameParsed[len(fileNameParsed)-1]
for _, item := range resp.Contents {
if fileName == *item.Key {
return nil
}
}
d.SetId("")
return nil
}
func resourceJDCloudOssBucketUploadDelete(d *schema.ResourceData, meta interface{}) error {
bucketName := d.Get("bucket_name").(string)
remoteLocation := d.Get("remote_location").(string)
client := getOssClient(meta)
_, err := client.DeleteObject(&s3.DeleteObjectInput{
Bucket: aws.String(bucketName),
Key: aws.String(filepath.Base(remoteLocation)),
})
if err != nil {
return fmt.Errorf("[ERROR] Failed in deleting OSS-Object,Error message:%s", err)
}
d.SetId("")
return nil
}