88 "strings"
99
1010 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+
1114 "github.com/grafana/terraform-provider-grafana/internal/common"
1215 "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
1316 "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -58,36 +61,51 @@ func ResourceFolder() *schema.Resource {
5861}
5962
6063func 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+ }
6270
63- var resp gapi.Folder
64- var err error
65- title := d .Get ("title" ).(string )
6671 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 )
7073 }
74+
75+ params := goapi .NewCreateFolderParams ().WithBody (& body )
76+ resp , err := client .Folders .CreateFolder (params , nil )
7177 if err != nil {
7278 return diag .Errorf ("failed to create folder: %s" , err )
7379 }
7480
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 )
7885
7986 return ReadFolder (ctx , d , meta )
8087}
8188
8289func 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 ())
8491
85- folder , err := GetFolderByIDorUID (client , idStr )
92+ folder , err := GetFolderByIDorUID (client . Folders , idStr )
8693 if err != nil {
8794 return diag .Errorf ("failed to get folder %s: %s" , idStr , err )
8895 }
8996
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 {
91109 return diag .FromErr (err )
92110 }
93111
@@ -96,9 +114,9 @@ func UpdateFolder(ctx context.Context, d *schema.ResourceData, meta interface{})
96114
97115func ReadFolder (ctx context.Context , d * schema.ResourceData , meta interface {}) diag.Diagnostics {
98116 gapiURL := meta .(* common.Client ).GrafanaAPIURL
99- client , orgID , idStr := ClientFromExistingOrgResource (meta , d .Id ())
117+ client , orgID , idStr := OAPIClientFromExistingOrgResource (meta , d .Id ())
100118
101- folder , err := GetFolderByIDorUID (client , idStr )
119+ folder , err := GetFolderByIDorUID (client . Folders , idStr )
102120 if err , shouldReturn := common .CheckReadError ("folder" , d , err ); shouldReturn {
103121 return err
104122 }
@@ -113,12 +131,11 @@ func ReadFolder(ctx context.Context, d *schema.ResourceData, meta interface{}) d
113131}
114132
115133func DeleteFolder (ctx context.Context , d * schema.ResourceData , meta interface {}) diag.Diagnostics {
116- client , _ , idStr := ClientFromExistingOrgResource (meta , d .Id ())
117-
118134 deleteParams := []url.Values {}
119135 if d .Get ("prevent_destroy_if_not_empty" ).(bool ) {
120136 // 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 {
122139 "type" : []string {"dash-db" },
123140 "folderIds" : []string {idStr },
124141 })
@@ -137,7 +154,14 @@ func DeleteFolder(ctx context.Context, d *schema.ResourceData, meta interface{})
137154 deleteParams = append (deleteParams , gapi .ForceDeleteFolderRules ())
138155 }
139156
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 {
141165 return diag .Errorf ("failed to delete folder: %s" , err )
142166 }
143167
@@ -178,16 +202,17 @@ func NormalizeFolderConfigJSON(configI interface{}) string {
178202 return string (ret )
179203}
180204
181- func GetFolderByIDorUID (client * gapi. Client , id string ) (* gapi .Folder , error ) {
205+ func GetFolderByIDorUID (client goapi. ClientService , id string ) (* models .Folder , error ) {
182206 // If the ID is a number, find the folder UID
183207 // Getting the folder by ID is broken in some versions, but getting by UID works in all versions
184208 // We need to use two API calls in the numerical ID case, because the "list" call doesn't have all the info
185209 uid := id
186210 if numericalID , err := strconv .ParseInt (id , 10 , 64 ); err == nil {
187- folders , err := client .Folders ( )
211+ resp , err := client .GetFolders ( goapi . NewGetFoldersParams (), nil )
188212 if err != nil {
189213 return nil , err
190214 }
215+ folders := resp .GetPayload ()
191216 for _ , folder := range folders {
192217 if folder .ID == numericalID {
193218 uid = folder .UID
@@ -196,5 +221,10 @@ func GetFolderByIDorUID(client *gapi.Client, id string) (*gapi.Folder, error) {
196221 }
197222 }
198223
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
200230}
0 commit comments