feat: config dns using env variables

This commit is contained in:
Johan Siebens
2022-10-09 08:13:37 +02:00
parent a364188761
commit daf577a0ee
+104 -11
View File
@@ -3,6 +3,7 @@ package dns
import (
"context"
"fmt"
"github.com/imdario/mergo"
"github.com/jsiebens/ionscale/internal/config"
"github.com/jsiebens/ionscale/internal/mapping"
"github.com/libdns/azure"
@@ -26,28 +27,120 @@ func NewProvider(config config.DNSProvider) (Provider, error) {
switch config.Name {
case "azure":
return configureProvider(config.Zone, config.Configuration, &azure.Provider{})
return configureAzureProvider(config.Zone, config.Configuration)
case "cloudflare":
return configureProvider(config.Zone, config.Configuration, &cloudflare.Provider{})
return configureCloudflareProvider(config.Zone, config.Configuration)
case "digitalocean":
return configureProvider(config.Zone, config.Configuration, &digitalocean.Provider{})
return configureDigitalOceanProvider(config.Zone, config.Configuration)
case "googleclouddns":
return configureProvider(config.Zone, config.Configuration, &googleclouddns.Provider{})
return configureGoogleCloudDNSProvider(config.Zone, config.Configuration)
case "route53":
return configureProvider(config.Zone, config.Configuration, &route53.Provider{})
return configureRoute53Provider(config.Zone, config.Configuration)
default:
return nil, fmt.Errorf("unknown dns provider: %s", config.Name)
}
}
func configureProvider(zone string, v map[string]string, setter libdns.RecordSetter) (Provider, error) {
if err := mapping.CopyViaJson(v, setter); err != nil {
func configureAzureProvider(zone string, values map[string]string) (Provider, error) {
p := &azure.Provider{}
if err := mapping.CopyViaJson(values, p); err != nil {
return nil, err
}
return &externalProvider{
zone: zone,
setter: setter,
}, nil
e := &azure.Provider{
TenantId: config.GetString("IONSCALE_DNS_AZURE_TENANT_ID", ""),
ClientId: config.GetString("IONSCALE_DNS_AZURE_CLIENT_ID", ""),
ClientSecret: config.GetString("IONSCALE_DNS_AZURE_CLIENT_SECRET", ""),
SubscriptionId: config.GetString("IONSCALE_DNS_AZURE_SUBSCRIPTION_ID", ""),
ResourceGroupName: config.GetString("IONSCALE_DNS_AZURE_RESOURCE_GROUP_NAME", ""),
}
// merge env configuration on top of the default/file configuration
if err := mergo.Merge(p, e, mergo.WithOverride); err != nil {
return nil, err
}
return &externalProvider{zone: zone, setter: p}, nil
}
func configureCloudflareProvider(zone string, values map[string]string) (Provider, error) {
p := &cloudflare.Provider{}
if err := mapping.CopyViaJson(values, p); err != nil {
return nil, err
}
e := &cloudflare.Provider{
APIToken: config.GetString("IONSCALE_DNS_CLOUDFLARE_API_TOKEN", ""),
}
// merge env configuration on top of the default/file configuration
if err := mergo.Merge(p, e, mergo.WithOverride); err != nil {
return nil, err
}
return &externalProvider{zone: zone, setter: p}, nil
}
func configureDigitalOceanProvider(zone string, values map[string]string) (Provider, error) {
p := &digitalocean.Provider{}
if err := mapping.CopyViaJson(values, p); err != nil {
return nil, err
}
e := &digitalocean.Provider{
APIToken: config.GetString("IONSCALE_DNS_DIGITALOCEAN_API_TOKEN", ""),
}
// merge env configuration on top of the default/file configuration
if err := mergo.Merge(p, e, mergo.WithOverride); err != nil {
return nil, err
}
return &externalProvider{zone: zone, setter: p}, nil
}
func configureGoogleCloudDNSProvider(zone string, values map[string]string) (Provider, error) {
p := &googleclouddns.Provider{}
if err := mapping.CopyViaJson(values, p); err != nil {
return nil, err
}
e := &googleclouddns.Provider{
Project: config.GetString("IONSCALE_DNS_GOOGLECLOUDDNS_PROJECT", ""),
ServiceAccountJSON: config.GetString("IONSCALE_DNS_GOOGLECLOUDDNS_SERVICE_ACCOUNT_JSON", ""),
}
// merge env configuration on top of the default/file configuration
if err := mergo.Merge(p, e, mergo.WithOverride); err != nil {
return nil, err
}
return &externalProvider{zone: zone, setter: p}, nil
}
func configureRoute53Provider(zone string, values map[string]string) (Provider, error) {
p := &route53.Provider{}
if err := mapping.CopyViaJson(values, p); err != nil {
return nil, err
}
e := &route53.Provider{
MaxRetries: 0,
MaxWaitDur: 0,
WaitForPropagation: false,
Region: config.GetString("IONSCALE_DNS_ROUTE53_REGION", ""),
AWSProfile: config.GetString("IONSCALE_DNS_ROUTE53_AWS_PROFILE", ""),
AccessKeyId: config.GetString("IONSCALE_DNS_ROUTE53_ACCESS_KEY_ID", ""),
SecretAccessKey: config.GetString("IONSCALE_DNS_ROUTE53_SECRET_ACCESS_KEY", ""),
Token: config.GetString("IONSCALE_DNS_ROUTE53_TOKEN", ""),
}
// merge env configuration on top of the default/file configuration
if err := mergo.Merge(p, e, mergo.WithOverride); err != nil {
return nil, err
}
return &externalProvider{zone: zone, setter: p}, nil
}
type externalProvider struct {