providers/aws/opsworks.go (179 lines of code) (raw):
// Copyright 2021 The Terraformer Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package aws
import (
"context"
"github.com/aws/aws-sdk-go-v2/service/opsworks"
"github.com/aws/aws-sdk-go-v2/service/opsworks/types"
"log"
"github.com/GoogleCloudPlatform/terraformer/terraformutils"
)
type OpsworksGenerator struct {
AWSService
}
func (g *OpsworksGenerator) InitResources() error {
config, e := g.generateConfig()
if e != nil {
return e
}
svc := opsworks.NewFromConfig(config)
e = g.fetchStacks(svc)
if e != nil {
return e
}
e = g.fetchUserProfile(svc)
if e != nil {
return e
}
return nil
}
func (g *OpsworksGenerator) fetchApps(stackID *string, svc *opsworks.Client) error {
apps, err := svc.DescribeApps(context.TODO(), &opsworks.DescribeAppsInput{
StackId: stackID,
})
if err != nil {
return err
}
for _, app := range apps.Apps {
g.Resources = append(g.Resources, terraformutils.NewSimpleResource(
StringValue(app.AppId),
StringValue(app.AppId),
"aws_opsworks_application",
"aws",
[]string{"tags."},
))
}
return nil
}
func (g *OpsworksGenerator) fetchLayers(stackID *string, svc *opsworks.Client) error {
apps, err := svc.DescribeLayers(context.TODO(), &opsworks.DescribeLayersInput{
StackId: stackID,
})
if err != nil {
return err
}
for _, layer := range apps.Layers {
switch layer.Type {
case types.LayerTypeCustom:
g.Resources = append(g.Resources, terraformutils.NewSimpleResource(
StringValue(layer.LayerId),
StringValue(layer.LayerId),
"aws_opsworks_custom_layer",
"aws",
[]string{"tags."},
))
case types.LayerTypePhpApp:
g.Resources = append(g.Resources, terraformutils.NewSimpleResource(
StringValue(layer.LayerId),
StringValue(layer.LayerId),
"aws_opsworks_php_app_layer",
"aws",
[]string{"tags."},
))
case types.LayerTypeJavaApp:
g.Resources = append(g.Resources, terraformutils.NewSimpleResource(
StringValue(layer.LayerId),
StringValue(layer.LayerId),
"aws_opsworks_java_app_layer",
"aws",
[]string{"tags."},
))
case types.LayerTypeWeb:
g.Resources = append(g.Resources, terraformutils.NewSimpleResource(
StringValue(layer.LayerId),
StringValue(layer.LayerId),
"aws_opsworks_static_web_layer",
"aws",
[]string{"tags."},
))
}
}
return nil
}
func (g *OpsworksGenerator) fetchInstances(stackID *string, svc *opsworks.Client) error {
apps, err := svc.DescribeInstances(context.TODO(), &opsworks.DescribeInstancesInput{
StackId: stackID,
})
if err != nil {
return err
}
for _, instances := range apps.Instances {
g.Resources = append(g.Resources, terraformutils.NewSimpleResource(
StringValue(instances.InstanceId),
StringValue(instances.InstanceId),
"aws_opsworks_instance",
"aws",
[]string{"tags."},
))
}
return nil
}
func (g *OpsworksGenerator) fetchRdsInstances(stackID *string, svc *opsworks.Client) error {
apps, err := svc.DescribeRdsDbInstances(context.TODO(), &opsworks.DescribeRdsDbInstancesInput{
StackId: stackID,
})
if err != nil {
return err
}
for _, rdsDbInstance := range apps.RdsDbInstances {
g.Resources = append(g.Resources, terraformutils.NewResource(
StringValue(rdsDbInstance.RdsDbInstanceArn),
StringValue(rdsDbInstance.RdsDbInstanceArn),
"aws_opsworks_instance",
"aws",
map[string]string{
"rds_db_instance_arn": StringValue(rdsDbInstance.RdsDbInstanceArn),
"stack_id": StringValue(stackID),
},
[]string{"tags."},
map[string]interface{}{},
))
}
return nil
}
func (g *OpsworksGenerator) fetchStacks(svc *opsworks.Client) error {
apps, err := svc.DescribeStacks(context.TODO(), &opsworks.DescribeStacksInput{})
if err != nil {
return err
}
for _, stack := range apps.Stacks {
g.Resources = append(g.Resources, terraformutils.NewSimpleResource(
StringValue(stack.StackId),
StringValue(stack.StackId),
"aws_opsworks_stack",
"aws",
[]string{"tags."},
))
e := g.fetchApps(stack.StackId, svc)
if e != nil {
log.Println(err)
}
e = g.fetchInstances(stack.StackId, svc)
if e != nil {
log.Println(err)
}
e = g.fetchRdsInstances(stack.StackId, svc)
if e != nil {
log.Println(err)
}
e = g.fetchLayers(stack.StackId, svc)
if e != nil {
log.Println(err)
}
}
return nil
}
func (g *OpsworksGenerator) fetchUserProfile(svc *opsworks.Client) error {
apps, err := svc.DescribeUserProfiles(context.TODO(), &opsworks.DescribeUserProfilesInput{})
if err != nil {
return err
}
for _, userProfile := range apps.UserProfiles {
g.Resources = append(g.Resources, terraformutils.NewSimpleResource(
StringValue(userProfile.IamUserArn),
StringValue(userProfile.IamUserArn),
"aws_opsworks_user_profile",
"aws",
[]string{"tags."},
))
}
return nil
}