Skip to content
Open
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
21 changes: 17 additions & 4 deletions internal/cli/common/wait.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@ package common

import (
"fmt"
"strings"
"time"

"github.com/agentregistry-dev/agentregistry/internal/client"
)

const (
var (
defaultWaitTimeout = 5 * time.Minute
defaultPollInterval = 2 * time.Second
)
Expand All @@ -31,15 +32,27 @@ func WaitForDeploymentReady(c *client.Client, deploymentID string) error {
case "deployed":
return nil
case "failed":
return fmt.Errorf("deployment failed")
return fmt.Errorf("deployment failed%s", formatDeploymentWaitError(dep.Error))
case "cancelled":
return fmt.Errorf("deployment was cancelled")
return fmt.Errorf("deployment was cancelled%s", formatDeploymentWaitError(dep.Error))
}

if time.Now().After(deadline) {
return fmt.Errorf("timed out waiting for deployment to become ready (current status: %s)", dep.Status)
return fmt.Errorf(
"timed out waiting for deployment to become ready (current status: %s%s)",
dep.Status,
formatDeploymentWaitError(dep.Error),
)
}

time.Sleep(defaultPollInterval)
}
}

func formatDeploymentWaitError(errorText string) string {
trimmed := strings.TrimSpace(errorText)
if trimmed == "" {
return ""
}
return ": " + trimmed
}
74 changes: 74 additions & 0 deletions internal/cli/common/wait_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package common

import (
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
"time"

"github.com/agentregistry-dev/agentregistry/internal/client"
"github.com/agentregistry-dev/agentregistry/pkg/models"
)

func TestWaitForDeploymentReady_ReturnsFailureDetails(t *testing.T) {
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/v0/deployments/dep-1" {
http.NotFound(w, r)
return
}
_ = json.NewEncoder(w).Encode(models.Deployment{
ID: "dep-1",
Status: "failed",
Error: "agent demo-agent: DeploymentNotReady",
})
}))
defer srv.Close()

err := WaitForDeploymentReady(client.NewClient(srv.URL, ""), "dep-1")
if err == nil {
t.Fatal("expected error")
}
if got, want := err.Error(), "deployment failed: agent demo-agent: DeploymentNotReady"; got != want {
t.Fatalf("WaitForDeploymentReady() error = %q, want %q", got, want)
}
}

func TestWaitForDeploymentReady_PollsUntilDeployed(t *testing.T) {
originalTimeout := defaultWaitTimeout
originalInterval := defaultPollInterval
defaultWaitTimeout = 200 * time.Millisecond
defaultPollInterval = 10 * time.Millisecond
t.Cleanup(func() {
defaultWaitTimeout = originalTimeout
defaultPollInterval = originalInterval
})

requests := 0
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/v0/deployments/dep-2" {
http.NotFound(w, r)
return
}
requests++
status := "deploying"
errorText := "agent demo-agent: DeploymentNotReady"
if requests >= 2 {
status = "deployed"
errorText = ""
}
_ = json.NewEncoder(w).Encode(models.Deployment{
ID: "dep-2",
Status: status,
Error: errorText,
})
}))
defer srv.Close()

if err := WaitForDeploymentReady(client.NewClient(srv.URL, ""), "dep-2"); err != nil {
t.Fatalf("WaitForDeploymentReady() error = %v", err)
}
if requests < 2 {
t.Fatalf("expected at least 2 poll requests, got %d", requests)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ func (a *kubernetesDeploymentAdapter) Deploy(ctx context.Context, req *models.De
if err := kubernetesApplyPlatformConfig(ctx, provider, cfg, false); err != nil {
return nil, fmt.Errorf("apply kubernetes platform config: %w", err)
}
return &models.DeploymentActionResult{Status: "deployed"}, nil
return &models.DeploymentActionResult{Status: "deploying"}, nil
}

func (a *kubernetesDeploymentAdapter) Undeploy(ctx context.Context, deployment *models.Deployment) error {
Expand Down Expand Up @@ -73,6 +73,20 @@ func (a *kubernetesDeploymentAdapter) CleanupStale(ctx context.Context, deployme
return nil
}

func (a *kubernetesDeploymentAdapter) RefreshDeploymentState(
ctx context.Context,
deployment *models.Deployment,
) (*models.DeploymentStatePatch, error) {
if err := utils.ValidateDeploymentRequest(deployment, true); err != nil {
return nil, err
}
provider, err := a.registry.GetProviderByID(ctx, deployment.ProviderID)
if err != nil {
return nil, err
}
return kubernetesRefreshManagedDeploymentState(ctx, provider, deployment)
}

func (a *kubernetesDeploymentAdapter) GetLogs(_ context.Context, _ *models.Deployment) ([]string, error) {
return nil, utils.ErrDeploymentNotSupported
}
Expand Down
Loading
Loading