From 75cf00104fc9ad26ed7ce077b1e2f26ddfbd2e69 Mon Sep 17 00:00:00 2001 From: Dan Anglin Date: Sat, 25 Feb 2023 18:26:11 +0000 Subject: [PATCH] feat: add the instance to the Pulumi stack --- config | 2 +- config.go | 10 ++++--- infra.go.bck | 74 ------------------------------------------------- main.go | 78 +++++++++++++++++++++++++++++++--------------------- 4 files changed, 54 insertions(+), 110 deletions(-) delete mode 100644 infra.go.bck diff --git a/config b/config index 1804b71..099c48a 160000 --- a/config +++ b/config @@ -1 +1 @@ -Subproject commit 1804b71954a073f75daa95b20e5b35e50b4dd60a +Subproject commit 099c48acfad1cc0f4a6f09cbf0e691604f9d2f74 diff --git a/config.go b/config.go index 3250ec1..e78ac9c 100644 --- a/config.go +++ b/config.go @@ -49,10 +49,12 @@ type firewallRule struct { } type instanceConfig struct { - Label string `json:"label"` - InstanceType string `json:"instanceType"` - SwapSize int `json:"swapSize"` - BackupsEnabled bool `json:"backupsEnabled"` + Label string `json:"label"` + Type string `json:"type"` + SwapSize int `json:"swapSize"` + BackupsEnabled bool `json:"backupsEnabled"` + PrivateIp bool `json:"privateIp"` + WatchdogEnabled bool `json:"watchdogEnabled"` } type volumeConfig struct { diff --git a/infra.go.bck b/infra.go.bck deleted file mode 100644 index 993c616..0000000 --- a/infra.go.bck +++ /dev/null @@ -1,74 +0,0 @@ -package main - -import ( -) - - -//type instanceOutput struct { -// ipv4 pulumi.StringOutput -// id pulumi.IntOutput -//} - -//func instance(ctx *pulumi.Context) (instanceOutput, error) { -// var output instanceOutput -// -// cfg := config.New(ctx, "") -// -// region := cfg.Require("region") -// tags := []string{"flow"} -// instanceLabelID := "flow-platform" -// instanceType := "g6-standard-1" -// -// // TODO: finish instance arguments to completion -// instanceArgs := linode.InstanceArgs{ -// BackupsEnabled: pulumi.Bool(false), -// Label: pulumi.String(instanceLabelID), -// PrivateIp: pulumi.Bool(false), -// Region: pulumi.String(region), -// Tags: pulumi.ToStringArray(tags), -// SwapSize: pulumi.Int(512), -// Type: pulumi.String(instanceType), -// WatchdogEnabled: pulumi.Bool(true), -// } -// -// instance, err := linode.NewInstance(ctx, instanceLabelID, &instanceArgs, pulumi.Protect(true)) -// if err != nil { -// return output, fmt.Errorf("unable to update instance; %w", err) -// } -// -// instanceID := instance.ID().ToStringOutput().ApplyT(func(id string) (int, error) { -// return strconv.Atoi(id) -// }).(pulumi.IntOutput) -// -// output = instanceOutput{ -// id: instanceID, -// ipv4: instance.IpAddress, -// } -// -// return output, nil -//} - -//func volume(ctx *pulumi.Context, instanceID pulumi.IntInput) error { -// volumeLabelID := "flow-platform-volume" -// -// cfg := config.New(ctx, "") -// -// region := cfg.Require("region") -// -// tags := []string{"flow"} -// -// volumeArgs := linode.VolumeArgs{ -// Label: pulumi.String(volumeLabelID), -// LinodeId: instanceID, -// Region: pulumi.String(region), -// Size: pulumi.Int(10), -// Tags: pulumi.ToStringArray(tags), -// } -// -// _, err := linode.NewVolume(ctx, volumeLabelID, &volumeArgs, pulumi.Protect(true)) -// if err != nil { -// return fmt.Errorf("unable to update volume; %w", err) -// } -// -// return nil -//} diff --git a/main.go b/main.go index a30e977..0bb9dd6 100644 --- a/main.go +++ b/main.go @@ -24,24 +24,24 @@ func infra(ctx *pulumi.Context) error { return fmt.Errorf("unable to load the platform configuration; %w", err) } - instance, err := getInstance(ctx, p) + instanceDetails, err := instance(ctx, p); if err != nil { - return err + return fmt.Errorf("unable to manage the instance; %w", err) } if err := domain(ctx, p); err != nil { return fmt.Errorf("unable to manage the domain; %w", err) } - if err := records(ctx, p, instance.Instances[0].Ipv4s[0]); err != nil { + if err := records(ctx, p, instanceDetails.ipv4); err != nil { return fmt.Errorf("unable to manage the domain records; %w", err) } - if err := firewall(ctx, p, instance.Instances[0].Id); err != nil { + if err := firewall(ctx, p, instanceDetails.id); err != nil { return fmt.Errorf("unable to manage the firewall; %w", err) } - if err := volumes(ctx, p, instance.Instances[0].Id); err != nil { + if err := volumes(ctx, p, instanceDetails.id); err != nil { return fmt.Errorf("unable to manage the volumes; %w", err) } @@ -52,24 +52,6 @@ func infra(ctx *pulumi.Context) error { return nil } -func getInstance(ctx *pulumi.Context, cfg *platform) (*linode.GetInstancesResult, error) { - args := linode.GetInstancesArgs{ - Filters: []linode.GetInstancesFilter{ - { - Name: "label", - Values: []string{cfg.Instance.Label}, - }, - }, - } - - instance, err := linode.GetInstances(ctx, &args) - if err != nil { - return nil, fmt.Errorf("unable to get instance details; %w", err) - } - - return instance, nil -} - func domain(ctx *pulumi.Context, cfg *platform) error { domainArgs := linode.DomainArgs{ Description: pulumi.String(cfg.Domain.Description), @@ -88,7 +70,7 @@ func domain(ctx *pulumi.Context, cfg *platform) error { return nil } -func records(ctx *pulumi.Context, cfg *platform, instanceIPv4 string) error { +func records(ctx *pulumi.Context, cfg *platform, instanceIPv4 pulumi.StringInput) error { domainName := cfg.Domain.Name domainArgs := linode.LookupDomainArgs{ @@ -110,7 +92,7 @@ func records(ctx *pulumi.Context, cfg *platform, instanceIPv4 string) error { DomainId: pulumi.Int(domainID), Name: pulumi.String(r.Name), RecordType: pulumi.String(r.Type), - Target: pulumi.String(instanceIPv4), + Target: instanceIPv4, TtlSec: pulumi.Int(r.TtlSec), } @@ -123,7 +105,7 @@ func records(ctx *pulumi.Context, cfg *platform, instanceIPv4 string) error { return nil } -func firewall(ctx *pulumi.Context, cfg *platform, instanceID int) error { +func firewall(ctx *pulumi.Context, cfg *platform, instanceID pulumi.IntInput) error { inbounds := linode.FirewallInboundArray{} for _, a := range cfg.Firewall.Inbound.Allow { @@ -146,7 +128,7 @@ func firewall(ctx *pulumi.Context, cfg *platform, instanceID int) error { Inbounds: inbounds, OutboundPolicy: pulumi.String("ACCEPT"), Linodes: pulumi.IntArray{ - pulumi.Int(instanceID), + instanceID, }, } @@ -158,11 +140,11 @@ func firewall(ctx *pulumi.Context, cfg *platform, instanceID int) error { return nil } -func volumes(ctx *pulumi.Context, cfg *platform, instanceID int) error { +func volumes(ctx *pulumi.Context, cfg *platform, instanceID pulumi.IntInput) error { for _, v := range cfg.Volumes { args := linode.VolumeArgs{ Label: pulumi.String(v.Label), - LinodeId: pulumi.Int(instanceID), + LinodeId: instanceID, Region: pulumi.String(cfg.Region), Size: pulumi.Int(v.Size), Tags: pulumi.ToStringArray(cfg.Tags), @@ -177,13 +159,47 @@ func volumes(ctx *pulumi.Context, cfg *platform, instanceID int) error { return nil } +type instanceOutput struct { + ipv4 pulumi.StringOutput + id pulumi.IntOutput +} + +func instance(ctx *pulumi.Context, cfg *platform) (instanceOutput, error) { + instanceArgs := linode.InstanceArgs{ + BackupsEnabled: pulumi.Bool(cfg.Instance.BackupsEnabled), + Label: pulumi.String(cfg.Instance.Label), + PrivateIp: pulumi.Bool(cfg.Instance.PrivateIp), + Region: pulumi.String(cfg.Region), + Tags: pulumi.ToStringArray(cfg.Tags), + SwapSize: pulumi.Int(cfg.Instance.SwapSize), + Type: pulumi.String(cfg.Instance.Type), + WatchdogEnabled: pulumi.Bool(cfg.Instance.WatchdogEnabled), + } + + instance, err := linode.NewInstance(ctx, cfg.Instance.Label, &instanceArgs, pulumi.Protect(true)) + if err != nil { + return instanceOutput{}, fmt.Errorf("unable to update instance; %w", err) + } + + instanceID := instance.ID().ToStringOutput().ApplyT(func(id string) (int, error) { + return strconv.Atoi(id) + }).(pulumi.IntOutput) + + output := instanceOutput{ + id: instanceID, + ipv4: instance.IpAddress, + } + + return output, nil +} + func readme(ctx *pulumi.Context) error { - readmeData, err := os.ReadFile("./README.md") + data, err := os.ReadFile("./README.md") if err != nil { return fmt.Errorf("unable to read README.md; %w", err) } - ctx.Export("readme", pulumi.String(string(readmeData))) + ctx.Export("readme", pulumi.String(string(data))) return nil }