package main import ( "fmt" "strconv" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" "github.com/pulumi/pulumi/sdk/v3/go/pulumi/config" "github.com/pulumi/pulumi-linode/sdk/v3/go/linode" ) func main() { pulumi.Run(infra) } func infra(ctx *pulumi.Context) error { cfg := config.New(ctx, "") platformConfigFile := cfg.Require("file") p, err := newConfig(platformConfigFile) if err != nil { return fmt.Errorf("unable to load the platform configuration; %w", err) } if err := domain(ctx, p); err != nil { return fmt.Errorf("unable to manage the domain; %w", err) } if err := records(ctx, p); err != nil { return fmt.Errorf("unable to manage the domain records; %w", err) } return nil } func domain(ctx *pulumi.Context, cfg *platform) error { domainArgs := linode.DomainArgs{ Description: pulumi.String(cfg.Domain.Description), Domain: pulumi.String(cfg.Domain.Name), SoaEmail: pulumi.String(cfg.Domain.Email), Status: pulumi.String("active"), Tags: pulumi.StringArray{ pulumi.String("flow"), }, Type: pulumi.String(cfg.Domain.Type), } _, err := linode.NewDomain(ctx, cfg.Domain.Name, &domainArgs, pulumi.Protect(true)) if err != nil { return err } return nil } func records(ctx *pulumi.Context, cfg *platform) error { domainName := cfg.Domain.Name domainArgs := linode.LookupDomainArgs{ Domain: &domainName, } domain, err := linode.LookupDomain(ctx, &domainArgs, nil) if err != nil { return fmt.Errorf("unable to lookup domain %s; %w", domainName, err) } domainID, err := strconv.Atoi(*domain.Id) if err != nil { return fmt.Errorf("unable to get the Domain ID; %w", err) } for _, r := range cfg.Domain.Records { args := linode.DomainRecordArgs{ DomainId: pulumi.Int(domainID), Name: pulumi.String(r.Name), RecordType: pulumi.String(r.Type), Target: pulumi.String(cfg.TempIP), TtlSec: pulumi.Int(r.TtlSec), } _, err := linode.NewDomainRecord(ctx, r.Label, &args, nil) if err != nil { return fmt.Errorf("unable to update the domain record '%s'; %w", r.Name, err) } } return nil }