Files
osmedeus/internal/cloud/registry.go
T
j3ssie 0269cf4e26 feat: update Next.js build assets and add cloud setup E2E tests
- Update Next.js generated chunk hashes and build IDs reflecting latest dashboard build
- Update CSS stylesheet references in workflow upload page metadata
- Add comprehensive cloud setup E2E test suite (cloud_setup_test.go) with SSH password/key auth, post-command variable expansion, and Ansible integration
- Fix API priority levels to include 'medium' priority in test coverage
- Add agent-sdk test workflows (minimal, config, codex, multi-agent, session variants)
- Update E2E test utilities with runCLIInBase helper for multi-step cloud config tests
- Fix stderr/stdout capture in dependencies_target_types_test assertions
2026-04-04 13:57:34 +08:00

104 lines
2.7 KiB
Go

package cloud
import (
"fmt"
"github.com/j3ssie/osmedeus/v5/internal/config"
)
// ProviderRegistry manages provider instances
type ProviderRegistry struct {
providers map[ProviderType]Provider
}
// NewProviderRegistry creates a new provider registry
func NewProviderRegistry() *ProviderRegistry {
return &ProviderRegistry{
providers: make(map[ProviderType]Provider),
}
}
// Register registers a provider
func (r *ProviderRegistry) Register(provider Provider) {
r.providers[provider.Type()] = provider
}
// Get retrieves a provider by type
func (r *ProviderRegistry) Get(providerType ProviderType) (Provider, error) {
provider, ok := r.providers[providerType]
if !ok {
return nil, fmt.Errorf("provider %s not registered", providerType)
}
return provider, nil
}
// List returns all registered provider types
func (r *ProviderRegistry) List() []ProviderType {
types := make([]ProviderType, 0, len(r.providers))
for t := range r.providers {
types = append(types, t)
}
return types
}
// CreateProvider creates a provider instance based on cloud configuration
func CreateProvider(cfg *config.CloudConfigs, providerType ProviderType) (Provider, error) {
switch providerType {
case ProviderDigitalOcean:
return NewDigitalOceanProvider(
cfg.Providers.DigitalOcean.Token,
cfg.Providers.DigitalOcean.Region,
cfg.Providers.DigitalOcean.Size,
cfg.Providers.DigitalOcean.SnapshotID,
cfg.Providers.DigitalOcean.SSHKeyFingerprint,
)
case ProviderAWS:
return NewAWSProvider(
cfg.Providers.AWS.AccessKeyID,
cfg.Providers.AWS.SecretAccessKey,
cfg.Providers.AWS.Region,
cfg.Providers.AWS.InstanceType,
cfg.Providers.AWS.AMI,
cfg.Providers.AWS.AMIFilter,
cfg.Providers.AWS.UseSpot,
)
case ProviderGCP:
return NewGCPProvider(
cfg.Providers.GCP.ProjectID,
cfg.Providers.GCP.CredentialsFile,
cfg.Providers.GCP.Region,
cfg.Providers.GCP.Zone,
cfg.Providers.GCP.MachineType,
cfg.Providers.GCP.ImageFamily,
cfg.Providers.GCP.UsePreemptible,
)
case ProviderLinode:
return NewLinodeProvider(
cfg.Providers.Linode.Token,
cfg.Providers.Linode.Region,
cfg.Providers.Linode.Type,
cfg.Providers.Linode.Image,
)
case ProviderAzure:
return NewAzureProvider(
cfg.Providers.Azure.SubscriptionID,
cfg.Providers.Azure.TenantID,
cfg.Providers.Azure.ClientID,
cfg.Providers.Azure.ClientSecret,
cfg.Providers.Azure.Location,
cfg.Providers.Azure.VMSize,
cfg.Providers.Azure.ImageReference,
)
case ProviderHetzner:
return NewHetznerProvider(
cfg.Providers.Hetzner.Token,
cfg.Providers.Hetzner.Location,
cfg.Providers.Hetzner.ServerType,
cfg.Providers.Hetzner.Image,
cfg.Providers.Hetzner.SSHKeyName,
)
default:
return nil, fmt.Errorf("unknown provider type: %s", providerType)
}
}