-
Notifications
You must be signed in to change notification settings - Fork 361
/
resource_file.go
124 lines (114 loc) · 3.18 KB
/
resource_file.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
124
package storage
import (
"bytes"
"context"
"encoding/base64"
"io"
"os"
"github.com/databricks/databricks-sdk-go/service/files"
"github.com/databricks/terraform-provider-databricks/common"
"github.com/databricks/terraform-provider-databricks/workspace"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
func getContentReader(data *schema.ResourceData) (io.ReadCloser, error) {
source := data.Get("source").(string)
var reader io.ReadCloser
var err error
if source != "" {
reader, err = os.Open(source)
if err != nil {
return nil, err
}
}
contentBase64 := data.Get("content_base64").(string)
if contentBase64 != "" {
decodedString, err := base64.StdEncoding.DecodeString(contentBase64)
if err != nil {
return nil, err
}
reader = io.NopCloser(bytes.NewReader(decodedString))
if err != nil {
return nil, err
}
}
return reader, err
}
func upload(ctx context.Context, data *schema.ResourceData, c *common.DatabricksClient, path string) error {
w, err := c.WorkspaceClient()
if err != nil {
return err
}
reader, err := getContentReader(data)
if err != nil {
return err
}
err = w.Files.Upload(ctx, files.UploadRequest{Contents: reader, FilePath: path})
if err != nil {
return err
}
metadata, err := w.Files.GetMetadata(ctx, files.GetMetadataRequest{FilePath: path})
if err != nil {
return err
}
data.Set("modification_time", metadata.LastModified)
data.Set("file_size", metadata.ContentLength)
data.Set("remote_file_modified", false)
data.SetId(path)
return nil
}
func ResourceFile() common.Resource {
s := workspace.FileContentSchema(map[string]*schema.Schema{
"modification_time": {
Type: schema.TypeString,
Computed: true,
},
"file_size": {
Type: schema.TypeInt,
Computed: true,
},
"remote_file_modified": {
Type: schema.TypeBool,
Optional: true,
},
})
return common.Resource{
Schema: s,
Create: func(ctx context.Context, data *schema.ResourceData, c *common.DatabricksClient) error {
path := data.Get("path").(string)
err := upload(ctx, data, c, path)
if err != nil {
return err
}
data.SetId(path)
return nil
},
Read: func(ctx context.Context, data *schema.ResourceData, c *common.DatabricksClient) error {
w, err := c.WorkspaceClient()
if err != nil {
return err
}
path := data.Id()
metadata, err := w.Files.GetMetadata(ctx, files.GetMetadataRequest{FilePath: path})
if err != nil {
return err
}
storedModificationTime := data.Get("modification_time").(string)
data.Set("remote_file_modified", storedModificationTime != metadata.LastModified)
// Do not store here the modification time. If the update fails, we will keep the wrong one in the state.
return common.StructToData(metadata, s, data)
},
Update: func(ctx context.Context, data *schema.ResourceData, c *common.DatabricksClient) error {
path := data.Id()
return upload(ctx, data, c, path)
},
Delete: func(ctx context.Context, data *schema.ResourceData, c *common.DatabricksClient) error {
w, err := c.WorkspaceClient()
if err != nil {
return err
}
path := data.Id()
err = w.Files.Delete(ctx, files.DeleteFileRequest{FilePath: path})
return err
},
}
}