feat: add the instance to the Pulumi stack
This commit is contained in:
parent
f62bcf101f
commit
75cf00104f
4 changed files with 54 additions and 110 deletions
2
config
2
config
|
@ -1 +1 @@
|
||||||
Subproject commit 1804b71954a073f75daa95b20e5b35e50b4dd60a
|
Subproject commit 099c48acfad1cc0f4a6f09cbf0e691604f9d2f74
|
|
@ -50,9 +50,11 @@ type firewallRule struct {
|
||||||
|
|
||||||
type instanceConfig struct {
|
type instanceConfig struct {
|
||||||
Label string `json:"label"`
|
Label string `json:"label"`
|
||||||
InstanceType string `json:"instanceType"`
|
Type string `json:"type"`
|
||||||
SwapSize int `json:"swapSize"`
|
SwapSize int `json:"swapSize"`
|
||||||
BackupsEnabled bool `json:"backupsEnabled"`
|
BackupsEnabled bool `json:"backupsEnabled"`
|
||||||
|
PrivateIp bool `json:"privateIp"`
|
||||||
|
WatchdogEnabled bool `json:"watchdogEnabled"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type volumeConfig struct {
|
type volumeConfig struct {
|
||||||
|
|
74
infra.go.bck
74
infra.go.bck
|
@ -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
|
|
||||||
//}
|
|
78
main.go
78
main.go
|
@ -24,24 +24,24 @@ func infra(ctx *pulumi.Context) error {
|
||||||
return fmt.Errorf("unable to load the platform configuration; %w", err)
|
return fmt.Errorf("unable to load the platform configuration; %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
instance, err := getInstance(ctx, p)
|
instanceDetails, err := instance(ctx, p);
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return fmt.Errorf("unable to manage the instance; %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := domain(ctx, p); err != nil {
|
if err := domain(ctx, p); err != nil {
|
||||||
return fmt.Errorf("unable to manage the domain; %w", err)
|
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)
|
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)
|
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)
|
return fmt.Errorf("unable to manage the volumes; %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,24 +52,6 @@ func infra(ctx *pulumi.Context) error {
|
||||||
return nil
|
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 {
|
func domain(ctx *pulumi.Context, cfg *platform) error {
|
||||||
domainArgs := linode.DomainArgs{
|
domainArgs := linode.DomainArgs{
|
||||||
Description: pulumi.String(cfg.Domain.Description),
|
Description: pulumi.String(cfg.Domain.Description),
|
||||||
|
@ -88,7 +70,7 @@ func domain(ctx *pulumi.Context, cfg *platform) error {
|
||||||
return nil
|
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
|
domainName := cfg.Domain.Name
|
||||||
|
|
||||||
domainArgs := linode.LookupDomainArgs{
|
domainArgs := linode.LookupDomainArgs{
|
||||||
|
@ -110,7 +92,7 @@ func records(ctx *pulumi.Context, cfg *platform, instanceIPv4 string) error {
|
||||||
DomainId: pulumi.Int(domainID),
|
DomainId: pulumi.Int(domainID),
|
||||||
Name: pulumi.String(r.Name),
|
Name: pulumi.String(r.Name),
|
||||||
RecordType: pulumi.String(r.Type),
|
RecordType: pulumi.String(r.Type),
|
||||||
Target: pulumi.String(instanceIPv4),
|
Target: instanceIPv4,
|
||||||
TtlSec: pulumi.Int(r.TtlSec),
|
TtlSec: pulumi.Int(r.TtlSec),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,7 +105,7 @@ func records(ctx *pulumi.Context, cfg *platform, instanceIPv4 string) error {
|
||||||
return nil
|
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{}
|
inbounds := linode.FirewallInboundArray{}
|
||||||
|
|
||||||
for _, a := range cfg.Firewall.Inbound.Allow {
|
for _, a := range cfg.Firewall.Inbound.Allow {
|
||||||
|
@ -146,7 +128,7 @@ func firewall(ctx *pulumi.Context, cfg *platform, instanceID int) error {
|
||||||
Inbounds: inbounds,
|
Inbounds: inbounds,
|
||||||
OutboundPolicy: pulumi.String("ACCEPT"),
|
OutboundPolicy: pulumi.String("ACCEPT"),
|
||||||
Linodes: pulumi.IntArray{
|
Linodes: pulumi.IntArray{
|
||||||
pulumi.Int(instanceID),
|
instanceID,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -158,11 +140,11 @@ func firewall(ctx *pulumi.Context, cfg *platform, instanceID int) error {
|
||||||
return nil
|
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 {
|
for _, v := range cfg.Volumes {
|
||||||
args := linode.VolumeArgs{
|
args := linode.VolumeArgs{
|
||||||
Label: pulumi.String(v.Label),
|
Label: pulumi.String(v.Label),
|
||||||
LinodeId: pulumi.Int(instanceID),
|
LinodeId: instanceID,
|
||||||
Region: pulumi.String(cfg.Region),
|
Region: pulumi.String(cfg.Region),
|
||||||
Size: pulumi.Int(v.Size),
|
Size: pulumi.Int(v.Size),
|
||||||
Tags: pulumi.ToStringArray(cfg.Tags),
|
Tags: pulumi.ToStringArray(cfg.Tags),
|
||||||
|
@ -177,13 +159,47 @@ func volumes(ctx *pulumi.Context, cfg *platform, instanceID int) error {
|
||||||
return nil
|
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 {
|
func readme(ctx *pulumi.Context) error {
|
||||||
readmeData, err := os.ReadFile("./README.md")
|
data, err := os.ReadFile("./README.md")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("unable to read README.md; %w", err)
|
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
|
return nil
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue