8
8
"strings"
9
9
10
10
gapi "github.com/grafana/grafana-api-golang-client"
11
+ goapi "github.com/grafana/grafana-openapi-client-go/client/folders"
12
+ "github.com/grafana/grafana-openapi-client-go/models"
13
+
11
14
"github.com/grafana/terraform-provider-grafana/internal/common"
12
15
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
13
16
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -58,36 +61,51 @@ func ResourceFolder() *schema.Resource {
58
61
}
59
62
60
63
func CreateFolder (ctx context.Context , d * schema.ResourceData , meta interface {}) diag.Diagnostics {
61
- client , orgID := ClientFromNewOrgResource (meta , d )
64
+ client , orgID := OAPIClientFromNewOrgResource (meta , d )
65
+
66
+ var body models.CreateFolderCommand
67
+ if title := d .Get ("title" ).(string ); title != "" {
68
+ body .Title = title
69
+ }
62
70
63
- var resp gapi.Folder
64
- var err error
65
- title := d .Get ("title" ).(string )
66
71
if uid , ok := d .GetOk ("uid" ); ok {
67
- resp , err = client .NewFolder (title , uid .(string ))
68
- } else {
69
- resp , err = client .NewFolder (title )
72
+ body .UID = uid .(string )
70
73
}
74
+
75
+ params := goapi .NewCreateFolderParams ().WithBody (& body )
76
+ resp , err := client .Folders .CreateFolder (params , nil )
71
77
if err != nil {
72
78
return diag .Errorf ("failed to create folder: %s" , err )
73
79
}
74
80
75
- d .SetId (MakeOrgResourceID (orgID , resp .ID ))
76
- d .Set ("uid" , resp .UID )
77
- d .Set ("title" , resp .Title )
81
+ folder := resp .GetPayload ()
82
+ d .SetId (MakeOrgResourceID (orgID , folder .ID ))
83
+ d .Set ("uid" , folder .UID )
84
+ d .Set ("title" , folder .Title )
78
85
79
86
return ReadFolder (ctx , d , meta )
80
87
}
81
88
82
89
func UpdateFolder (ctx context.Context , d * schema.ResourceData , meta interface {}) diag.Diagnostics {
83
- client , _ , idStr := ClientFromExistingOrgResource (meta , d .Id ())
90
+ client , _ , idStr := OAPIClientFromExistingOrgResource (meta , d .Id ())
84
91
85
- folder , err := GetFolderByIDorUID (client , idStr )
92
+ folder , err := GetFolderByIDorUID (client . Folders , idStr )
86
93
if err != nil {
87
94
return diag .Errorf ("failed to get folder %s: %s" , idStr , err )
88
95
}
89
96
90
- if err := client .UpdateFolder (folder .UID , d .Get ("title" ).(string ), d .Get ("uid" ).(string )); err != nil {
97
+ params := goapi .NewUpdateFolderParams ().
98
+ WithBody (& models.UpdateFolderCommand {
99
+ Overwrite : true ,
100
+ Title : d .Get ("title" ).(string ),
101
+ }).
102
+ WithFolderUID (folder .UID )
103
+
104
+ if newUID := d .Get ("uid" ).(string ); newUID != "" {
105
+ params .Body .UID = newUID
106
+ }
107
+
108
+ if _ , err := client .Folders .UpdateFolder (params , nil ); err != nil {
91
109
return diag .FromErr (err )
92
110
}
93
111
@@ -96,9 +114,9 @@ func UpdateFolder(ctx context.Context, d *schema.ResourceData, meta interface{})
96
114
97
115
func ReadFolder (ctx context.Context , d * schema.ResourceData , meta interface {}) diag.Diagnostics {
98
116
gapiURL := meta .(* common.Client ).GrafanaAPIURL
99
- client , orgID , idStr := ClientFromExistingOrgResource (meta , d .Id ())
117
+ client , orgID , idStr := OAPIClientFromExistingOrgResource (meta , d .Id ())
100
118
101
- folder , err := GetFolderByIDorUID (client , idStr )
119
+ folder , err := GetFolderByIDorUID (client . Folders , idStr )
102
120
if err , shouldReturn := common .CheckReadError ("folder" , d , err ); shouldReturn {
103
121
return err
104
122
}
@@ -113,12 +131,11 @@ func ReadFolder(ctx context.Context, d *schema.ResourceData, meta interface{}) d
113
131
}
114
132
115
133
func DeleteFolder (ctx context.Context , d * schema.ResourceData , meta interface {}) diag.Diagnostics {
116
- client , _ , idStr := ClientFromExistingOrgResource (meta , d .Id ())
117
-
118
134
deleteParams := []url.Values {}
119
135
if d .Get ("prevent_destroy_if_not_empty" ).(bool ) {
120
136
// Search for dashboards and fail if any are found
121
- dashboards , err := client .FolderDashboardSearch (url.Values {
137
+ GAPIClient , _ , idStr := ClientFromExistingOrgResource (meta , d .Id ())
138
+ dashboards , err := GAPIClient .FolderDashboardSearch (url.Values {
122
139
"type" : []string {"dash-db" },
123
140
"folderIds" : []string {idStr },
124
141
})
@@ -137,7 +154,14 @@ func DeleteFolder(ctx context.Context, d *schema.ResourceData, meta interface{})
137
154
deleteParams = append (deleteParams , gapi .ForceDeleteFolderRules ())
138
155
}
139
156
140
- if err := client .DeleteFolder (d .Get ("uid" ).(string ), deleteParams ... ); err != nil {
157
+ var force bool
158
+ if len (deleteParams ) > 0 {
159
+ force , _ = strconv .ParseBool (deleteParams [0 ].Get ("forceDeleteRules" ))
160
+ }
161
+
162
+ client , _ , _ := OAPIClientFromExistingOrgResource (meta , d .Id ())
163
+ params := goapi .NewDeleteFolderParams ().WithForceDeleteRules (& force ).WithFolderUID (d .Get ("uid" ).(string ))
164
+ if _ , err := client .Folders .DeleteFolder (params , nil ); err != nil {
141
165
return diag .Errorf ("failed to delete folder: %s" , err )
142
166
}
143
167
@@ -178,16 +202,17 @@ func NormalizeFolderConfigJSON(configI interface{}) string {
178
202
return string (ret )
179
203
}
180
204
181
- func GetFolderByIDorUID (client * gapi. Client , id string ) (* gapi .Folder , error ) {
205
+ func GetFolderByIDorUID (client goapi. ClientService , id string ) (* models .Folder , error ) {
182
206
// If the ID is a number, find the folder UID
183
207
// Getting the folder by ID is broken in some versions, but getting by UID works in all versions
184
208
// We need to use two API calls in the numerical ID case, because the "list" call doesn't have all the info
185
209
uid := id
186
210
if numericalID , err := strconv .ParseInt (id , 10 , 64 ); err == nil {
187
- folders , err := client .Folders ( )
211
+ resp , err := client .GetFolders ( goapi . NewGetFoldersParams (), nil )
188
212
if err != nil {
189
213
return nil , err
190
214
}
215
+ folders := resp .GetPayload ()
191
216
for _ , folder := range folders {
192
217
if folder .ID == numericalID {
193
218
uid = folder .UID
@@ -196,5 +221,10 @@ func GetFolderByIDorUID(client *gapi.Client, id string) (*gapi.Folder, error) {
196
221
}
197
222
}
198
223
199
- return client .FolderByUID (uid )
224
+ params := goapi .NewGetFolderByUIDParams ().WithFolderUID (uid )
225
+ resp , err := client .GetFolderByUID (params , nil )
226
+ if err != nil {
227
+ return nil , err
228
+ }
229
+ return resp .GetPayload (), nil
200
230
}
0 commit comments