-
Notifications
You must be signed in to change notification settings - Fork 3
/
ami.go
115 lines (101 loc) · 2.93 KB
/
ami.go
1
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package ami
import (
"fmt"
"os"
"github.com/adrianriobo/qenvs/pkg/manager"
"github.com/adrianriobo/qenvs/pkg/provider/aws"
"github.com/adrianriobo/qenvs/pkg/provider/aws/data"
"github.com/adrianriobo/qenvs/pkg/util/logging"
"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/ec2"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
type ReplicatedRequest struct {
ProjectName string
AMITargetName string
AMISourceID string
AMISourceRegion string
}
func CreateReplica(projectName, backedURL,
amiID, amiName, amiSourceRegion string) (err error) {
return manageReplica(projectName, backedURL, amiID, amiName, amiSourceRegion, "create")
}
func DestroyReplica(projectName, backedURL string) (err error) {
return manageReplica(projectName, backedURL, "", "", "", "destroy")
}
func manageReplica(projectName, backedURL,
amiID, amiName, amiSourceRegion, operation string) (err error) {
request := ReplicatedRequest{
ProjectName: projectName,
AMITargetName: amiName,
AMISourceID: amiID,
AMISourceRegion: amiSourceRegion}
regions, err := data.GetRegions()
if err != nil {
logging.Errorf("failed to get regions")
os.Exit(1)
}
errChan := make(chan error)
for _, region := range regions {
// Do not replicate on source region
if region != amiSourceRegion {
go request.runStackAsync(backedURL, region, operation, errChan)
}
}
hasErrors := false
for _, region := range regions {
if region != amiSourceRegion {
if err := <-errChan; err != nil {
logging.Errorf("%v", err)
hasErrors = true
}
}
}
if hasErrors {
return fmt.Errorf("there are errors on some replications. Check the logs to get information")
}
return nil
}
func (r ReplicatedRequest) runStackAsync(backedURL, region, operation string, errChan chan error) {
errChan <- r.runStack(backedURL, region, operation)
}
func (r ReplicatedRequest) runStack(backedURL, region, operation string) error {
stack := manager.Stack{
StackName: fmt.Sprintf("%s-%s", "amiReplicate", region),
ProjectName: r.ProjectName,
BackedURL: backedURL,
ProviderCredentials: aws.GetClouProviderCredentials(
map[string]string{aws.CONFIG_AWS_REGION: region}),
DeployFunc: r.deployer,
}
var err error
if operation == "create" {
_, err = manager.UpStack(stack)
} else {
err = manager.DestroyStack(stack)
}
if err != nil {
return err
}
return nil
}
func (r ReplicatedRequest) deployer(ctx *pulumi.Context) error {
_, err := ec2.NewAmiCopy(ctx,
r.AMITargetName,
&ec2.AmiCopyArgs{
Description: pulumi.String(
fmt.Sprintf("Replica of %s from %s", r.AMISourceID, r.AMISourceRegion)),
SourceAmiId: pulumi.String(r.AMISourceID),
SourceAmiRegion: pulumi.String(r.AMISourceRegion),
Tags: pulumi.StringMap{
"Name": pulumi.String(r.AMITargetName),
"Project": pulumi.String(r.ProjectName),
},
})
if err != nil {
return err
}
return nil
}
func (r ReplicatedRequest) Replicate(ctx *pulumi.Context) error {
return r.deployer(ctx)
}