diff --git a/frontend/endpoints/actions/latencysampler.go b/frontend/endpoints/actions/latencysampler.go new file mode 100644 index 000000000..f6ab5ecfd --- /dev/null +++ b/frontend/endpoints/actions/latencysampler.go @@ -0,0 +1,100 @@ +package actions + +import ( + "github.com/gin-gonic/gin" + "github.com/odigos-io/odigos/api/actions/v1alpha1" + "github.com/odigos-io/odigos/frontend/kube" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func GetLatencySampler(c *gin.Context, odigosns string, id string) { + action, err := kube.DefaultClient.ActionsClient.LatencySamplers(odigosns).Get(c, id, metav1.GetOptions{}) + if err != nil { + if apierrors.IsNotFound(err) { + c.JSON(404, gin.H{ + "error": "not found", + }) + return + } else { + c.JSON(500, gin.H{ + "error": err.Error(), + }) + return + } + } + c.JSON(200, action.Spec) +} + +func CreateLatencySampler(c *gin.Context, odigosns string) { + var action v1alpha1.LatencySampler + if err := c.ShouldBindJSON(&action.Spec); err != nil { + c.JSON(400, gin.H{ + "error": err.Error(), + }) + return + } + action.GenerateName = "ls-" + generatedAction, err := kube.DefaultClient.ActionsClient.LatencySamplers(odigosns).Create(c, &action, metav1.CreateOptions{}) + if err != nil { + c.JSON(500, gin.H{ + "error": err.Error(), + }) + return + } + c.JSON(201, gin.H{ + "id": generatedAction.Name, + }) +} + +func UpdateLatencySampler(c *gin.Context, odigosns string, id string) { + action, err := kube.DefaultClient.ActionsClient.LatencySamplers(odigosns).Get(c, id, metav1.GetOptions{}) + if err != nil { + if apierrors.IsNotFound(err) { + c.JSON(404, gin.H{ + "error": "not found", + }) + return + } else { + c.JSON(500, gin.H{ + "error": err.Error(), + }) + } + return + } + action.Spec = v1alpha1.LatencySamplerSpec{} + if err := c.ShouldBindJSON(&action.Spec); err != nil { + c.JSON(400, gin.H{ + "error": err.Error(), + }) + return + } + action.Name = id + + _, err = kube.DefaultClient.ActionsClient.LatencySamplers(odigosns).Update(c, action, metav1.UpdateOptions{}) + if err != nil { + c.JSON(500, gin.H{ + "error": err.Error(), + }) + return + } + c.JSON(204, nil) +} + +func DeleteLatencySampler(c *gin.Context, odigosns string, id string) { + err := kube.DefaultClient.ActionsClient.LatencySamplers(odigosns).Delete(c, id, metav1.DeleteOptions{}) + if err != nil { + if apierrors.IsNotFound(err) { + c.JSON(404, gin.H{ + "error": "not found", + }) + return + } else { + c.JSON(500, gin.H{ + "error": err.Error(), + }) + return + } + } + c.JSON(204, nil) +} diff --git a/frontend/endpoints/actions/root.go b/frontend/endpoints/actions/root.go index 9f20db2a1..e32c2f28e 100644 --- a/frontend/endpoints/actions/root.go +++ b/frontend/endpoints/actions/root.go @@ -64,5 +64,21 @@ func GetActions(c *gin.Context, odigosns string) { }) } + lsActions, err := kube.DefaultClient.ActionsClient.LatencySamplers(odigosns).List(c, metav1.ListOptions{}) + if err != nil { + c.JSON(500, gin.H{ + "error": err.Error(), + }) + return + } + + for _, action := range lsActions.Items { + response = append(response, IcaInstanceResponse{ + Id: action.Name, + Type: action.Kind, + Spec: action.Spec, + }) + } + c.JSON(200, response) } diff --git a/frontend/main.go b/frontend/main.go index 9bf0646cb..63f01efb7 100644 --- a/frontend/main.go +++ b/frontend/main.go @@ -137,6 +137,12 @@ func startHTTPServer(flags *Flags) (*gin.Engine, error) { apis.POST("/actions/types/RenameAttribute", func(c *gin.Context) { actions.CreateRenameAttribute(c, flags.Namespace) }) apis.PUT("/actions/types/RenameAttribute/:id", func(c *gin.Context) { actions.UpdateRenameAttribute(c, flags.Namespace, c.Param("id")) }) apis.DELETE("/actions/types/RenameAttribute/:id", func(c *gin.Context) { actions.DeleteRenameAttribute(c, flags.Namespace, c.Param("id")) }) + + // LatencySampler + apis.GET("/actions/types/LatencySampler/:id", func(c *gin.Context) { actions.GetLatencySampler(c, flags.Namespace, c.Param("id")) }) + apis.POST("/actions/types/LatencySampler", func(c *gin.Context) { actions.CreateLatencySampler(c, flags.Namespace) }) + apis.PUT("/actions/types/LatencySampler/:id", func(c *gin.Context) { actions.UpdateLatencySampler(c, flags.Namespace, c.Param("id")) }) + apis.DELETE("/actions/types/LatencySampler/:id", func(c *gin.Context) { actions.DeleteLatencySampler(c, flags.Namespace, c.Param("id")) }) } return r, nil