K8s/Folders: Enhance k8s folder update (#95033)

* Put folder update behind feature toggle
* Set more fields when doing k8s update
* Check update in folder tests
* Uncomment remaining k8s handler methods
This commit is contained in:
Arati R.
2024-10-21 19:08:03 +02:00
committed by GitHub
parent ce917e97f7
commit f3a93a0303
4 changed files with 138 additions and 85 deletions
+99 -81
View File
@@ -67,6 +67,16 @@ func (hs *HTTPServer) registerFolderAPI(apiRoute routing.RouteRegister, authoriz
} else {
folderRoute.Post("/", authorize(accesscontrol.EvalPermission(dashboards.ActionFoldersCreate)), routing.Wrap(hs.CreateFolder))
}
// Only adding support for some routes with the k8s handler for now. Include the rest here.
if false {
handler := newFolderK8sHandler(hs)
folderRoute.Get("/", handler.searchFolders)
folderRoute.Group("/:uid", func(folderUidRoute routing.RouteRegister) {
folderUidRoute.Get("/", handler.getFolder)
folderUidRoute.Delete("/", handler.deleteFolder)
folderUidRoute.Put("/:uid", handler.updateFolder)
})
}
})
}
@@ -651,32 +661,31 @@ func newFolderK8sHandler(hs *HTTPServer) *folderK8sHandler {
}
}
// #TODO uncomment when we reinstate their corresponding routes
// func (fk8s *folderK8sHandler) searchFolders(c *contextmodel.ReqContext) {
// client, ok := fk8s.getClient(c)
// if !ok {
// return // error is already sent
// }
// out, err := client.List(c.Req.Context(), v1.ListOptions{})
// if err != nil {
// fk8s.writeError(c, err)
// return
// }
func (fk8s *folderK8sHandler) searchFolders(c *contextmodel.ReqContext) {
client, ok := fk8s.getClient(c)
if !ok {
return // error is already sent
}
out, err := client.List(c.Req.Context(), v1.ListOptions{})
if err != nil {
fk8s.writeError(c, err)
return
}
// query := strings.ToUpper(c.Query("query"))
// folders := []folder.Folder{}
// for _, item := range out.Items {
// p := internalfolders.UnstructuredToLegacyFolder(item)
// if p == nil {
// continue
// }
// if query != "" && !strings.Contains(strings.ToUpper(p.Title), query) {
// continue // query filter
// }
// folders = append(folders, *p)
// }
// c.JSON(http.StatusOK, folders)
// }
query := strings.ToUpper(c.Query("query"))
folders := []folder.Folder{}
for _, item := range out.Items {
p := internalfolders.UnstructuredToLegacyFolder(item, c.SignedInUser.GetOrgID())
if p == nil {
continue
}
if query != "" && !strings.Contains(strings.ToUpper(p.Title), query) {
continue // query filter
}
folders = append(folders, *p)
}
c.JSON(http.StatusOK, folders)
}
func (fk8s *folderK8sHandler) createFolder(c *contextmodel.ReqContext) {
client, ok := fk8s.getClient(c)
@@ -709,68 +718,77 @@ func (fk8s *folderK8sHandler) createFolder(c *contextmodel.ReqContext) {
c.JSON(http.StatusOK, folderDTO)
}
// func (fk8s *folderK8sHandler) getFolder(c *contextmodel.ReqContext) {
// client, ok := fk8s.getClient(c)
// if !ok {
// return // error is already sent
// }
// uid := web.Params(c.Req)[":uid"]
// out, err := client.Get(c.Req.Context(), uid, v1.GetOptions{})
// if err != nil {
// fk8s.writeError(c, err)
// return
// }
func (fk8s *folderK8sHandler) getFolder(c *contextmodel.ReqContext) {
client, ok := fk8s.getClient(c)
if !ok {
return // error is already sent
}
uid := web.Params(c.Req)[":uid"]
out, err := client.Get(c.Req.Context(), uid, v1.GetOptions{})
if err != nil {
fk8s.writeError(c, err)
return
}
// folderDTO, err := fk8s.newToFolderDto(c, *out)
// if err != nil {
// fk8s.writeError(c, err)
// return
// }
folderDTO, err := fk8s.newToFolderDto(c, *out, c.SignedInUser.GetOrgID())
if err != nil {
fk8s.writeError(c, err)
return
}
// c.JSON(http.StatusOK, folderDTO)
// }
c.JSON(http.StatusOK, folderDTO)
}
// func (fk8s *folderK8sHandler) deleteFolder(c *contextmodel.ReqContext) {
// client, ok := fk8s.getClient(c)
// if !ok {
// return // error is already sent
// }
// uid := web.Params(c.Req)[":uid"]
// err := client.Delete(c.Req.Context(), uid, v1.DeleteOptions{})
// if err != nil {
// fk8s.writeError(c, err)
// return
// }
// c.JSON(http.StatusOK, "")
// }
func (fk8s *folderK8sHandler) deleteFolder(c *contextmodel.ReqContext) {
client, ok := fk8s.getClient(c)
if !ok {
return // error is already sent
}
uid := web.Params(c.Req)[":uid"]
err := client.Delete(c.Req.Context(), uid, v1.DeleteOptions{})
if err != nil {
fk8s.writeError(c, err)
return
}
c.JSON(http.StatusOK, "")
}
// func (fk8s *folderK8sHandler) updateFolder(c *contextmodel.ReqContext) {
// client, ok := fk8s.getClient(c)
// if !ok {
// return // error is already sent
// }
// uid := web.Params(c.Req)[":uid"]
// cmd := folder.UpdateFolderCommand{}
// if err := web.Bind(c.Req, &cmd); err != nil {
// c.JsonApiErr(http.StatusBadRequest, "bad request data", err)
// return
// }
// obj := internalfolders.LegacyUpdateCommandToUnstructured(cmd)
// obj.SetName(uid)
// out, err := client.Update(c.Req.Context(), &obj, v1.UpdateOptions{})
// if err != nil {
// fk8s.writeError(c, err)
// return
// }
func (fk8s *folderK8sHandler) updateFolder(c *contextmodel.ReqContext) {
client, ok := fk8s.getClient(c)
if !ok {
return // error is already sent
}
// folderDTO, err := fk8s.newToFolderDto(c, *out)
// if err != nil {
// fk8s.writeError(c, err)
// return
// }
cmd := folder.UpdateFolderCommand{}
if err := web.Bind(c.Req, &cmd); err != nil {
c.JsonApiErr(http.StatusBadRequest, "bad request data", err)
return
}
cmd.OrgID = c.SignedInUser.GetOrgID()
cmd.UID = web.Params(c.Req)[":uid"]
cmd.SignedInUser = c.SignedInUser
// #TODO add version?
// c.JSON(http.StatusOK, folderDTO)
// }
obj, err := internalfolders.LegacyUpdateCommandToUnstructured(cmd)
if err != nil {
fk8s.writeError(c, err)
return
}
out, err := client.Update(c.Req.Context(), &obj, v1.UpdateOptions{})
if err != nil {
fk8s.writeError(c, err)
return
}
folderDTO, err := fk8s.newToFolderDto(c, *out, c.SignedInUser.GetOrgID())
if err != nil {
fk8s.writeError(c, err)
return
}
c.JSON(http.StatusOK, folderDTO)
}
//-----------------------------------------------------------------------------------------
// Utility functions