fix fresh-host acceptance and document real-host debugging learnings

This commit is contained in:
phamnazage-jpg
2026-05-21 21:19:19 +08:00
parent 7c6e18f94d
commit 3ba3244ea6
85 changed files with 1721 additions and 162 deletions

View File

@@ -4,6 +4,8 @@ import (
"context"
"encoding/json"
"fmt"
"net/url"
"strconv"
"strings"
)
@@ -20,7 +22,7 @@ func (c *Client) ListManagedResources(ctx context.Context, req ListManagedResour
if err != nil {
return ManagedResourceSnapshot{}, fmt.Errorf("list plans: %w", err)
}
accounts, err := c.listNamedResources(ctx, "/api/v1/admin/accounts", "")
accounts, err := c.listNamedResourcesPaged(ctx, "/api/v1/admin/accounts", 100)
if err != nil {
return ManagedResourceSnapshot{}, fmt.Errorf("list accounts: %w", err)
}
@@ -34,36 +36,71 @@ func (c *Client) ListManagedResources(ctx context.Context, req ListManagedResour
}
func (c *Client) listNamedResources(ctx context.Context, path, expectedName string) ([]NamedResource, error) {
statusCode, _, body, err := c.perform(ctx, "GET", path, nil)
resources, _, err := c.listNamedResourcesPage(ctx, path)
if err != nil {
return nil, err
}
if statusCode < 200 || statusCode >= 300 {
return nil, newHTTPError("GET", path, statusCode, body)
}
resources, err := decodeNamedResources(body)
if err != nil {
return nil, fmt.Errorf("decode %s response: %w", path, err)
}
return filterNamedResourcesByName(resources, expectedName), nil
}
func decodeNamedResources(body []byte) ([]NamedResource, error) {
func (c *Client) listNamedResourcesPaged(ctx context.Context, path string, pageSize int) ([]NamedResource, error) {
if pageSize <= 0 {
pageSize = 100
}
page := 1
all := make([]NamedResource, 0)
for {
query := url.Values{}
query.Set("page", strconv.Itoa(page))
query.Set("page_size", strconv.Itoa(pageSize))
resources, pages, err := c.listNamedResourcesPage(ctx, path+"?"+query.Encode())
if err != nil {
return nil, err
}
all = append(all, resources...)
if pages <= page || pages == 0 {
return all, nil
}
page++
}
}
func (c *Client) listNamedResourcesPage(ctx context.Context, path string) ([]NamedResource, int, error) {
statusCode, _, body, err := c.perform(ctx, "GET", path, nil)
if err != nil {
return nil, 0, err
}
if statusCode < 200 || statusCode >= 300 {
return nil, 0, newHTTPError("GET", path, statusCode, body)
}
resources, pages, err := decodeNamedResources(body)
if err != nil {
return nil, 0, fmt.Errorf("decode %s response: %w", path, err)
}
return resources, pages, nil
}
func decodeNamedResources(body []byte) ([]NamedResource, int, error) {
var resources []NamedResource
if err := decodeEnvelopeObject(body, &resources); err == nil {
return resources, nil
return resources, 1, nil
}
var wrapper struct {
Data struct {
Items []NamedResource `json:"items"`
Pages int `json:"pages"`
} `json:"data"`
}
if err := json.Unmarshal(body, &wrapper); err != nil {
return nil, err
return nil, 0, err
}
return wrapper.Data.Items, nil
pages := wrapper.Data.Pages
if pages <= 0 {
pages = 1
}
return wrapper.Data.Items, pages, nil
}
func filterNamedResourcesByName(resources []NamedResource, expectedName string) []NamedResource {