provider.go

48 lines
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
package scaffold

import (
	"fmt"

	"congo.gg/pkg/platform"
	"congo.gg/pkg/platform/providers/digitalocean"
	"congo.gg/pkg/platform/providers/metal"
)

// InitProviders creates a platform client for each named platform in the config.
func InitProviders(cfg *InfraConfig) (map[string]*platform.Platform, error) {
	providers := make(map[string]*platform.Platform, len(cfg.Platforms))
	for name, pc := range cfg.Platforms {
		switch pc.Provider {
		case "digitalocean":
			if pc.Token == "" {
				return nil, fmt.Errorf("platforms.%s.token required\n\nSet it with an environment variable reference:\n  \"token\": \"$DIGITALOCEAN_TOKEN\"", name)
			}
			p, err := digitalocean.New(pc.Token)
			if err != nil {
				return nil, fmt.Errorf("platforms.%s: %w", name, err)
			}
			providers[name] = p
		case "metal":
			var servers []platform.Server
			for serverType, instances := range cfg.Instances {
				if cfg.PlatformNameFor(serverType) == name {
					for _, inst := range instances {
						servers = append(servers, platform.Server{
							ID: inst.ID, Name: inst.Name,
							IP: inst.IP, Region: inst.Region,
						})
					}
				}
			}
			providers[name] = metal.New(servers)
		default:
			return nil, fmt.Errorf("platforms.%s: unsupported provider %q (supported: digitalocean, metal)", name, pc.Provider)
		}
	}
	return providers, nil
}

// ProviderFor returns the platform for a specific server type.
func ProviderFor(providers map[string]*platform.Platform, cfg *InfraConfig, serverType string) *platform.Platform {
	return providers[cfg.PlatformNameFor(serverType)]
}