provider.go
48 lines1
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)]
}