From 45023e85d8bb40dce89ce329f87cf89138be2ce8 Mon Sep 17 00:00:00 2001 From: Kunal Singh Date: Sun, 26 Nov 2023 15:28:59 +0530 Subject: [PATCH] feat(api,cli): remove application --- .github/workflows/release.yaml | 4 +--- cmd/meltcd/app.go | 19 ++++++++++++++++ cmd/meltcd/cmd.go | 9 ++++++++ internal/core/registry.go | 40 ++++++++++++++++++++++++++++++++++ server/api.go | 20 ++++++++++++----- server/routes.go | 11 +++++----- 6 files changed, 90 insertions(+), 13 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index da02aca..88e9ee2 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -1,9 +1,7 @@ name: Release on: - push: - tags: - - "*" + workflow_dispatch: permissions: contents: write diff --git a/cmd/meltcd/app.go b/cmd/meltcd/app.go index 5c65446..523fc7d 100644 --- a/cmd/meltcd/app.go +++ b/cmd/meltcd/app.go @@ -193,3 +193,22 @@ func refreshApplication(_ *cobra.Command, args []string) error { } return nil } + +func removeApplication(_ *cobra.Command, args []string) error { + appName := args[0] + + res, err := http.Post(fmt.Sprintf("%s/api/application/remove/%s", getServer(), appName), "", nil) + if err != nil { + return err + } + defer res.Body.Close() + + if res.StatusCode != fiber.StatusOK { + data, err := io.ReadAll(res.Body) + if err != nil { + return err + } + return errors.New(string(data)) + } + return nil +} diff --git a/cmd/meltcd/cmd.go b/cmd/meltcd/cmd.go index 3c51e02..6a1f0cd 100644 --- a/cmd/meltcd/cmd.go +++ b/cmd/meltcd/cmd.go @@ -111,11 +111,20 @@ func NewCLI() *cobra.Command { RunE: refreshApplication, } + appRemoveCmd := &cobra.Command{ + Use: "remove", + Aliases: []string{"rm"}, + Short: "Remove Application", + Args: cobra.ExactArgs(1), + RunE: removeApplication, + } + appCmd.AddCommand(appCreateCmd) appCmd.AddCommand(appUpdateCmd) appCmd.AddCommand(appGetCmd) appCmd.AddCommand(appListCmd) appCmd.AddCommand(appRefreshCmd) + appCmd.AddCommand(appRemoveCmd) rootCmd.AddCommand(serveCmd) rootCmd.AddCommand(appCmd) diff --git a/internal/core/registry.go b/internal/core/registry.go index 966b0bb..aab6590 100644 --- a/internal/core/registry.go +++ b/internal/core/registry.go @@ -17,9 +17,13 @@ limitations under the License. package core import ( + "context" "encoding/json" "fmt" + "strings" + "github.com/docker/docker/api/types" + "github.com/docker/docker/client" "github.com/meltred/meltcd/internal/core/application" "github.com/charmbracelet/log" @@ -132,3 +136,39 @@ func loadRegistryData(d *[]byte) error { return nil } + +func RemoveApplication(appName string) error { + cli, err := client.NewClientWithOpts(client.FromEnv) + if err != nil { + return err + } + + runningService, err := cli.ServiceList(context.Background(), types.ServiceListOptions{}) + if err != nil { + return err + } + + for _, svc := range runningService { + if strings.HasPrefix(svc.Spec.Name, appName) { + if err := cli.ServiceRemove(context.Background(), svc.ID); err != nil { + return err + } + } + } + + removeSvcFromApps(appName) + + return nil +} + +func removeSvcFromApps(appName string) { + tmp := make([]*application.Application, 0) + + for _, app := range Applications { + if app.Name != appName { + tmp = append(tmp, app) + } + } + + Applications = tmp +} diff --git a/server/api.go b/server/api.go index 7e0800a..3dfb7f0 100644 --- a/server/api.go +++ b/server/api.go @@ -26,7 +26,7 @@ import ( "github.com/gofiber/fiber/v2" ) -func Register(c *fiber.Ctx) error { +func register(c *fiber.Ctx) error { var app application.Application if err := c.BodyParser(&app); err != nil { @@ -40,7 +40,7 @@ func Register(c *fiber.Ctx) error { return c.SendStatus(http.StatusAccepted) } -func Update(c *fiber.Ctx) error { +func update(c *fiber.Ctx) error { var app application.Application if err := c.BodyParser(&app); err != nil { @@ -54,7 +54,7 @@ func Update(c *fiber.Ctx) error { return c.SendStatus(http.StatusAccepted) } -func Details(c *fiber.Ctx) error { +func details(c *fiber.Ctx) error { appName := c.Params("app_name") if appName == "" { return errors.New("application name (app_name) missing in querystring") @@ -77,7 +77,7 @@ type AppStatus struct { Health string `json:"health"` } -func AllApplications(c *fiber.Ctx) error { +func allApplications(c *fiber.Ctx) error { status := core.List() var res AppList @@ -92,7 +92,7 @@ func AllApplications(c *fiber.Ctx) error { return c.Status(200).JSON(res) } -func Refresh(c *fiber.Ctx) error { +func refresh(c *fiber.Ctx) error { appName := c.Params("app_name") if err := core.Refresh(appName); err != nil { @@ -101,3 +101,13 @@ func Refresh(c *fiber.Ctx) error { return c.SendStatus(200) } + +func remove(c *fiber.Ctx) error { + appName := c.Params("app_name") + + if err := core.RemoveApplication(appName); err != nil { + return err + } + + return c.SendStatus(200) +} diff --git a/server/routes.go b/server/routes.go index ef75575..3adf9c6 100644 --- a/server/routes.go +++ b/server/routes.go @@ -80,11 +80,12 @@ func Serve(ln net.Listener, origins string, verboseOutput bool) error { }) application := api.Group("application") - application.Post("/create", Register) - application.Post("/update", Update) - application.Post("/refresh/:app_name", Refresh) - application.Get("/get", AllApplications) - application.Get("/get/:app_name", Details) + application.Post("/create", register) + application.Post("/update", update) + application.Post("/refresh/:app_name", refresh) + application.Post("/remove/:app_name", remove) + application.Get("/get", allApplications) + application.Get("/get/:app_name", details) err := core.Setup() if err != nil {