Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions cmd/server/remove.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (

// NewRemoveCommand creates the remove command
func NewRemoveCommand() *cobra.Command {
return &cobra.Command{
cmd := &cobra.Command{
Use: "remove <uuid>",
Args: cli.ExactArgs(1, "<uuid>"),
Short: "Remove a server",
Expand All @@ -28,12 +28,20 @@ func NewRemoveCommand() *cobra.Command {
serverSvc := service.NewServerService(client)
uuid := args[0]

if err := serverSvc.Delete(ctx, uuid); err != nil {
force, _ := cmd.Flags().GetBool("force")
deleteFromProvider, _ := cmd.Flags().GetBool("delete-from-provider")

if err := serverSvc.Delete(ctx, uuid, force, deleteFromProvider); err != nil {
return fmt.Errorf("failed to delete server: %w", err)
}

fmt.Printf("Server %s deleted successfully\n", uuid)
return nil
},
}

cmd.Flags().Bool("force", false, "Also delete all resources on the server")
cmd.Flags().Bool("delete-from-provider", false, "Also delete the server from its cloud provider (Hetzner, Vultr or DigitalOcean). This cannot be undone")

return cmd
}
8 changes: 5 additions & 3 deletions internal/service/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package service

import (
"context"
"fmt"

"github.com/coollabsio/coolify-cli/internal/api"
"github.com/coollabsio/coolify-cli/internal/models"
Expand Down Expand Up @@ -59,9 +60,10 @@ func (s *ServerService) Update(ctx context.Context, uuid string, req models.Serv
return &response, err
}

// Delete deletes a server by UUID
func (s *ServerService) Delete(ctx context.Context, uuid string) error {
return s.client.Delete(ctx, "servers/"+uuid)
// Delete deletes a server by UUID. force also deletes all resources on the server,
// deleteFromProvider also deletes the server from its cloud provider.
func (s *ServerService) Delete(ctx context.Context, uuid string, force, deleteFromProvider bool) error {
return s.client.Delete(ctx, fmt.Sprintf("servers/%s?force=%t&delete_from_provider=%t", uuid, force, deleteFromProvider))
}

// Validate validates a server by UUID
Expand Down
39 changes: 28 additions & 11 deletions internal/service/server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -154,21 +154,38 @@ func TestServerService_Update(t *testing.T) {
}

func TestServerService_Delete(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
assert.Equal(t, "/api/v1/servers/test-uuid", r.URL.Path)
assert.Equal(t, "DELETE", r.Method)
tests := []struct {
name string
force bool
deleteFromProvider bool
wantQuery string
}{
{"defaults", false, false, "force=false&delete_from_provider=false"},
{"force", true, false, "force=true&delete_from_provider=false"},
{"delete from provider", false, true, "force=false&delete_from_provider=true"},
{"both", true, true, "force=true&delete_from_provider=true"},
}

w.WriteHeader(http.StatusOK)
_ = json.NewEncoder(w).Encode(models.Response{Message: "Server deleted"})
}))
defer server.Close()
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
assert.Equal(t, "/api/v1/servers/test-uuid", r.URL.Path)
assert.Equal(t, "DELETE", r.Method)
assert.Equal(t, tt.wantQuery, r.URL.RawQuery)

client := api.NewClient(server.URL, "test-token")
svc := NewServerService(client)
w.WriteHeader(http.StatusOK)
_ = json.NewEncoder(w).Encode(models.Response{Message: "Server deleted"})
}))
defer server.Close()

err := svc.Delete(context.Background(), "test-uuid")
client := api.NewClient(server.URL, "test-token")
svc := NewServerService(client)

require.NoError(t, err)
err := svc.Delete(context.Background(), "test-uuid", tt.force, tt.deleteFromProvider)

require.NoError(t, err)
})
}
}

func TestServerService_Validate(t *testing.T) {
Expand Down
12 changes: 11 additions & 1 deletion llms-full.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3854,7 +3854,17 @@ Parameters:

Command: coolify server remove <uuid>
Description: Remove a server
Parameters: (None)
Parameters:
- name: --delete-from-provider
type: boolean
description: Also delete the server from its cloud provider (Hetzner, Vultr or DigitalOcean). This cannot be undone
required: false
default: false
- name: --force
type: boolean
description: Also delete all resources on the server
required: false
default: false

Command: coolify server sentinel get <server_uuid>
Description: Get Sentinel settings
Expand Down
Loading