/
environments_fetch.go
138 lines (126 loc) · 4.5 KB
/
environments_fetch.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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package elasticbeanstalk
import (
"context"
"fmt"
"github.com/OpsHelmInc/cloudquery/client"
"github.com/OpsHelmInc/cloudquery/resources/services/elasticbeanstalk/models"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/aws/arn"
"github.com/aws/aws-sdk-go-v2/service/elasticbeanstalk"
"github.com/aws/aws-sdk-go-v2/service/elasticbeanstalk/types"
"github.com/cloudquery/plugin-sdk/schema"
)
func fetchElasticbeanstalkEnvironments(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- any) error {
var config elasticbeanstalk.DescribeEnvironmentsInput
c := meta.(*client.Client)
svc := c.Services().Elasticbeanstalk
for {
response, err := svc.DescribeEnvironments(ctx, &config)
if err != nil {
return err
}
res <- response.Environments
if aws.ToString(response.NextToken) == "" {
break
}
config.NextToken = response.NextToken
}
return nil
}
func resolveElasticbeanstalkEnvironmentTags(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource, c schema.Column) error {
p := resource.Item.(types.EnvironmentDescription)
if p.Resources == nil || p.Resources.LoadBalancer == nil {
return nil
}
listeners := make(map[int32]*string, len(p.Resources.LoadBalancer.Listeners))
for _, l := range p.Resources.LoadBalancer.Listeners {
listeners[l.Port] = l.Protocol
}
return resource.Set(c.Name, listeners)
}
func resolveElasticbeanstalkEnvironmentListeners(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource, c schema.Column) error {
p := resource.Item.(types.EnvironmentDescription)
cl := meta.(*client.Client)
svc := cl.Services().Elasticbeanstalk
tagsOutput, err := svc.ListTagsForResource(ctx, &elasticbeanstalk.ListTagsForResourceInput{
ResourceArn: p.EnvironmentArn,
}, func(o *elasticbeanstalk.Options) {})
if err != nil {
// It takes a few minutes for an environment to be terminated
// This ensures we don't error while trying to fetch related resources for a terminated environment
if cl.IsNotFoundError(err) {
return nil
}
return err
}
if len(tagsOutput.ResourceTags) == 0 {
return nil
}
tags := make(map[string]*string)
for _, s := range tagsOutput.ResourceTags {
tags[*s.Key] = s.Value
}
return resource.Set(c.Name, tags)
}
func fetchElasticbeanstalkConfigurationOptions(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- any) error {
p := parent.Item.(types.EnvironmentDescription)
cl := meta.(*client.Client)
svc := cl.Services().Elasticbeanstalk
configOptionsIn := elasticbeanstalk.DescribeConfigurationOptionsInput{
ApplicationName: p.ApplicationName,
EnvironmentName: p.EnvironmentName,
}
output, err := svc.DescribeConfigurationOptions(ctx, &configOptionsIn)
if err != nil {
// It takes a few minutes for an environment to be terminated
// This ensures we don't error while trying to fetch related resources for a terminated environment
if client.IsInvalidParameterValueError(err) {
return nil
}
return err
}
arnStr := arn.ARN{
Partition: cl.Partition,
Service: "elasticbeanstalk",
Region: cl.Region,
AccountID: cl.AccountID,
Resource: fmt.Sprintf("application/%s", aws.ToString(p.ApplicationName)),
}.String()
for _, option := range output.Options {
res <- models.ConfigurationOptionDescriptionWrapper{
ConfigurationOptionDescription: option, ApplicationArn: arnStr,
}
}
return nil
}
func fetchElasticbeanstalkConfigurationSettings(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- any) error {
p := parent.Item.(types.EnvironmentDescription)
cl := meta.(*client.Client)
svc := cl.Services().Elasticbeanstalk
configOptionsIn := elasticbeanstalk.DescribeConfigurationSettingsInput{
ApplicationName: p.ApplicationName,
EnvironmentName: p.EnvironmentName,
}
output, err := svc.DescribeConfigurationSettings(ctx, &configOptionsIn)
if err != nil {
// It takes a few minutes for an environment to be terminated
// This ensures we don't error while trying to fetch related resources for a terminated environment
if client.IsInvalidParameterValueError(err) {
return nil
}
return err
}
arnStr := arn.ARN{
Partition: cl.Partition,
Service: "elasticbeanstalk",
Region: cl.Region,
AccountID: cl.AccountID,
Resource: fmt.Sprintf("application/%s", aws.ToString(p.ApplicationName)),
}.String()
for _, option := range output.ConfigurationSettings {
res <- models.ConfigurationSettingsDescriptionWrapper{
ConfigurationSettingsDescription: option, ApplicationArn: arnStr,
}
}
return nil
}