Overhaul VirtFusion provider: 20 resources, 30 data sources, multipage pagination
Complete rewrite of the VirtFusion Terraform provider with full API coverage: - 20 managed resources (server, build, SSH key, user, firewall, IP blocks, etc.) - 30 data sources (hypervisors, packages, servers, IP blocks, self-service, etc.) - New HTTP client with proper error handling, query parameter support, and automatic multipage pagination via GetAllPages (fetches all pages from Laravel-style paginated endpoints and merges into a single response) - Fixed type mismatches against live API: ServerData.Suspended (int→bool), IPBlockData.Type (string→int), PackageData json tags (primaryStorage, etc.), ServerData nested CPU/Settings/Resources structure, HypervisorGroupResources array response - Configurable results-per-page (default 300) on all list data sources - Migrated CI from GitHub Actions to Gitea Actions - Updated goreleaser config, go.mod dependencies, and examples Verified against live VirtFusion instance at cp.vps.ezscale.tech: all data sources return correct data with full pagination support. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
34
internal/client/errors.go
Normal file
34
internal/client/errors.go
Normal file
@@ -0,0 +1,34 @@
|
||||
// Copyright (c) EZSCALE.
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
|
||||
package client
|
||||
|
||||
import "fmt"
|
||||
|
||||
// APIError represents an error returned by the VirtFusion API.
|
||||
type APIError struct {
|
||||
StatusCode int
|
||||
Status string
|
||||
Body string
|
||||
Errors map[string][]string
|
||||
}
|
||||
|
||||
func (e *APIError) Error() string {
|
||||
if len(e.Errors) > 0 {
|
||||
return fmt.Sprintf("VirtFusion API error %d (%s): %v", e.StatusCode, e.Status, e.Errors)
|
||||
}
|
||||
if e.Body != "" {
|
||||
return fmt.Sprintf("VirtFusion API error %d (%s): %s", e.StatusCode, e.Status, e.Body)
|
||||
}
|
||||
return fmt.Sprintf("VirtFusion API error %d (%s)", e.StatusCode, e.Status)
|
||||
}
|
||||
|
||||
// IsNotFound returns true if the error is a 404 Not Found response.
|
||||
func (e *APIError) IsNotFound() bool {
|
||||
return e.StatusCode == 404
|
||||
}
|
||||
|
||||
// IsValidationError returns true if the error is a 422 Unprocessable Entity response.
|
||||
func (e *APIError) IsValidationError() bool {
|
||||
return e.StatusCode == 422
|
||||
}
|
||||
Reference in New Issue
Block a user