geoengineer 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/README.md +8 -6
- data/lib/geoengineer.rb +2 -0
- data/lib/geoengineer/cli/geo_cli.rb +1 -4
- data/lib/geoengineer/cli/terraform_commands.rb +4 -2
- data/lib/geoengineer/environment.rb +14 -1
- data/lib/geoengineer/provider.rb +38 -0
- data/lib/geoengineer/resource.rb +29 -15
- data/lib/geoengineer/resources/api_gateway/helpers.rb +107 -0
- data/lib/geoengineer/resources/aws_alb.rb +39 -0
- data/lib/geoengineer/resources/aws_alb_listener.rb +39 -0
- data/lib/geoengineer/resources/aws_alb_listener_rule.rb +42 -0
- data/lib/geoengineer/resources/aws_alb_target_group.rb +30 -0
- data/lib/geoengineer/resources/aws_api_gateway_account.rb +18 -0
- data/lib/geoengineer/resources/aws_api_gateway_api_key.rb +20 -0
- data/lib/geoengineer/resources/aws_api_gateway_authorizer.rb +20 -0
- data/lib/geoengineer/resources/aws_api_gateway_base_path_mapping.rb +20 -0
- data/lib/geoengineer/resources/aws_api_gateway_client_certificate.rb +24 -0
- data/lib/geoengineer/resources/aws_api_gateway_deployment.rb +65 -0
- data/lib/geoengineer/resources/aws_api_gateway_domain_name.rb +27 -0
- data/lib/geoengineer/resources/aws_api_gateway_integration.rb +58 -0
- data/lib/geoengineer/resources/aws_api_gateway_integration_response.rb +68 -0
- data/lib/geoengineer/resources/aws_api_gateway_method.rb +59 -0
- data/lib/geoengineer/resources/aws_api_gateway_method_response.rb +69 -0
- data/lib/geoengineer/resources/aws_api_gateway_model.rb +19 -0
- data/lib/geoengineer/resources/aws_api_gateway_resource.rb +47 -0
- data/lib/geoengineer/resources/aws_api_gateway_rest_api.rb +79 -0
- data/lib/geoengineer/resources/aws_api_gateway_usage_plan.rb +27 -0
- data/lib/geoengineer/resources/aws_cloudfront_distribution.rb +25 -0
- data/lib/geoengineer/resources/aws_cloudtrail.rb +2 -2
- data/lib/geoengineer/resources/aws_cloudwatch_event_rule.rb +12 -3
- data/lib/geoengineer/resources/aws_cloudwatch_event_target.rb +2 -2
- data/lib/geoengineer/resources/aws_cloudwatch_metric_alarm.rb +10 -8
- data/lib/geoengineer/resources/aws_customer_gateway.rb +4 -2
- data/lib/geoengineer/resources/aws_db_instance.rb +2 -2
- data/lib/geoengineer/resources/aws_db_parameter_group.rb +4 -2
- data/lib/geoengineer/resources/aws_dynamodb_table.rb +2 -2
- data/lib/geoengineer/resources/aws_eip.rb +2 -2
- data/lib/geoengineer/resources/aws_elasticache_cluster.rb +2 -2
- data/lib/geoengineer/resources/aws_elasticache_parameter_group.rb +2 -2
- data/lib/geoengineer/resources/aws_elasticache_replication_group.rb +2 -2
- data/lib/geoengineer/resources/aws_elasticache_subnet_group.rb +2 -2
- data/lib/geoengineer/resources/aws_elasticsearch_domain.rb +2 -2
- data/lib/geoengineer/resources/aws_elb.rb +4 -2
- data/lib/geoengineer/resources/aws_iam_account_password_policy.rb +2 -1
- data/lib/geoengineer/resources/aws_iam_group.rb +2 -2
- data/lib/geoengineer/resources/aws_iam_group_membership.rb +1 -1
- data/lib/geoengineer/resources/aws_iam_instance_profile.rb +3 -3
- data/lib/geoengineer/resources/aws_iam_policy.rb +6 -4
- data/lib/geoengineer/resources/aws_iam_policy_attachment.rb +1 -1
- data/lib/geoengineer/resources/aws_iam_role.rb +2 -2
- data/lib/geoengineer/resources/aws_iam_role_policy.rb +10 -9
- data/lib/geoengineer/resources/aws_iam_user.rb +4 -4
- data/lib/geoengineer/resources/aws_instance.rb +3 -3
- data/lib/geoengineer/resources/aws_internet_gateway.rb +3 -2
- data/lib/geoengineer/resources/aws_kinesis_stream.rb +4 -4
- data/lib/geoengineer/resources/aws_kms_key.rb +5 -3
- data/lib/geoengineer/resources/aws_lambda_alias.rb +7 -7
- data/lib/geoengineer/resources/aws_lambda_event_source_mapping.rb +2 -2
- data/lib/geoengineer/resources/aws_lambda_function.rb +2 -2
- data/lib/geoengineer/resources/aws_lambda_permission.rb +9 -8
- data/lib/geoengineer/resources/aws_lb_cookie_stickiness_policy.rb +47 -0
- data/lib/geoengineer/resources/aws_load_balancer_backend_server_policy.rb +2 -2
- data/lib/geoengineer/resources/aws_load_balancer_policy.rb +5 -5
- data/lib/geoengineer/resources/aws_main_route_table_association.rb +2 -2
- data/lib/geoengineer/resources/aws_nat_gateway.rb +2 -2
- data/lib/geoengineer/resources/aws_network_acl.rb +2 -2
- data/lib/geoengineer/resources/aws_network_acl_rule.rb +2 -2
- data/lib/geoengineer/resources/aws_proxy_protocol_policy.rb +1 -1
- data/lib/geoengineer/resources/aws_redshift_cluster.rb +2 -2
- data/lib/geoengineer/resources/aws_route.rb +2 -2
- data/lib/geoengineer/resources/aws_route53_record.rb +6 -6
- data/lib/geoengineer/resources/aws_route53_zone.rb +2 -2
- data/lib/geoengineer/resources/aws_route_table.rb +2 -2
- data/lib/geoengineer/resources/aws_route_table_association.rb +2 -2
- data/lib/geoengineer/resources/aws_s3_bucket.rb +2 -2
- data/lib/geoengineer/resources/aws_s3_bucket_notification.rb +38 -0
- data/lib/geoengineer/resources/aws_security_group.rb +2 -2
- data/lib/geoengineer/resources/aws_ses_receipt_rule.rb +2 -2
- data/lib/geoengineer/resources/aws_ses_receipt_rule_set.rb +2 -2
- data/lib/geoengineer/resources/aws_sns_topic.rb +2 -2
- data/lib/geoengineer/resources/aws_sns_topic_subscription.rb +5 -5
- data/lib/geoengineer/resources/aws_sqs_queue.rb +2 -2
- data/lib/geoengineer/resources/aws_subnet.rb +2 -2
- data/lib/geoengineer/resources/aws_vpc.rb +2 -2
- data/lib/geoengineer/resources/aws_vpc_dhcp_options.rb +2 -2
- data/lib/geoengineer/resources/aws_vpc_dhcp_options_association.rb +2 -2
- data/lib/geoengineer/resources/aws_vpc_endpoint.rb +2 -2
- data/lib/geoengineer/resources/aws_vpc_peering_connection.rb +2 -2
- data/lib/geoengineer/resources/aws_vpn_connection.rb +3 -2
- data/lib/geoengineer/resources/aws_vpn_connection_route.rb +2 -2
- data/lib/geoengineer/resources/aws_vpn_gateway.rb +2 -2
- data/lib/geoengineer/resources/aws_vpn_gateway_attachment.rb +2 -2
- data/lib/geoengineer/template.rb +3 -1
- data/lib/geoengineer/templates/json_rest_api.rb +197 -0
- data/lib/geoengineer/utils/aws_clients.rb +129 -38
- data/lib/geoengineer/utils/has_templates.rb +1 -1
- data/lib/geoengineer/version.rb +1 -1
- data/spec/environment_spec.rb +1 -1
- data/spec/resource_spec.rb +24 -10
- data/spec/resources/aws_alb_listener_rule_spec.rb +45 -0
- data/spec/resources/aws_alb_listener_spec.rb +33 -0
- data/spec/resources/aws_alb_spec.rb +33 -0
- data/spec/resources/aws_alb_target_group_spec.rb +35 -0
- data/spec/resources/aws_api_gateway_account_spec.rb +6 -0
- data/spec/resources/aws_api_gateway_api_key_spec.rb +6 -0
- data/spec/resources/aws_api_gateway_authorizer_spec.rb +6 -0
- data/spec/resources/aws_api_gateway_base_path_mapping_spec.rb +6 -0
- data/spec/resources/aws_api_gateway_client_certificate_spec.rb +6 -0
- data/spec/resources/aws_api_gateway_deployment_spec.rb +6 -0
- data/spec/resources/aws_api_gateway_domain_name_spec.rb +6 -0
- data/spec/resources/aws_api_gateway_integration_response_spec.rb +6 -0
- data/spec/resources/aws_api_gateway_integration_spec.rb +6 -0
- data/spec/resources/aws_api_gateway_method_response_spec.rb +6 -0
- data/spec/resources/aws_api_gateway_method_spec.rb +6 -0
- data/spec/resources/aws_api_gateway_model_spec.rb +6 -0
- data/spec/resources/aws_api_gateway_resource_spec.rb +6 -0
- data/spec/resources/aws_api_gateway_rest_api_spec.rb +6 -0
- data/spec/resources/aws_cloudfront_distribution_spec.rb +50 -0
- data/spec/resources/aws_cloudtrail_spec.rb +3 -3
- data/spec/resources/aws_cloudwatch_event_rule_spec.rb +3 -3
- data/spec/resources/aws_cloudwatch_event_target_spec.rb +4 -6
- data/spec/resources/aws_cloudwatch_metric_alarm_spec.rb +3 -6
- data/spec/resources/aws_customer_gateway_spec.rb +4 -3
- data/spec/resources/aws_db_instance_spec.rb +3 -3
- data/spec/resources/aws_db_parameter_group_spec.rb +3 -3
- data/spec/resources/aws_dynamodb_table_spec.rb +3 -3
- data/spec/resources/aws_eip_spec.rb +3 -3
- data/spec/resources/aws_elasticache_replication_group_spec.rb +3 -6
- data/spec/resources/aws_elasticache_subnet_group_spec.rb +4 -6
- data/spec/resources/aws_elasticcache_cluster_spec.rb +3 -3
- data/spec/resources/aws_elasticcache_parameter_group_spec.rb +3 -6
- data/spec/resources/aws_elasticsearch_domain_spec.rb +3 -3
- data/spec/resources/aws_elb_spec.rb +3 -3
- data/spec/resources/aws_iam_account_password_policy_spec.rb +2 -6
- data/spec/resources/aws_iam_group_membership_spec.rb +2 -6
- data/spec/resources/aws_iam_group_spec.rb +3 -3
- data/spec/resources/aws_iam_instance_profile_spec.rb +3 -6
- data/spec/resources/aws_iam_policy_attachment_spec.rb +2 -6
- data/spec/resources/aws_iam_policy_spec.rb +3 -5
- data/spec/resources/aws_iam_role_spec.rb +3 -4
- data/spec/resources/aws_iam_rule_policy_spec.rb +2 -5
- data/spec/resources/aws_iam_user_spec.rb +3 -4
- data/spec/resources/aws_instance_spec.rb +3 -3
- data/spec/resources/aws_internet_gateway_spec.rb +3 -3
- data/spec/resources/aws_kinesis_stream_spec.rb +3 -4
- data/spec/resources/aws_kms_key_spec.rb +3 -3
- data/spec/resources/aws_lambda_alias_spec.rb +2 -3
- data/spec/resources/aws_lambda_event_source_mapping_spec.rb +2 -5
- data/spec/resources/aws_lambda_function_spec.rb +3 -4
- data/spec/resources/aws_lambda_permission_spec.rb +1 -1
- data/spec/resources/aws_lb_cookie_stickiness_policy_spec.rb +38 -0
- data/spec/resources/aws_load_balancer_backend_server_policy_spec.rb +2 -3
- data/spec/resources/aws_load_balancer_policy_spec.rb +3 -4
- data/spec/resources/aws_main_route_table_association_spec.rb +2 -5
- data/spec/resources/aws_nat_gateway_spec.rb +3 -4
- data/spec/resources/aws_network_acl_rule_spec.rb +2 -3
- data/spec/resources/aws_network_acl_spec.rb +3 -3
- data/spec/resources/aws_proxy_protocol_policy_spec.rb +2 -2
- data/spec/resources/aws_redshift_cluster_spec.rb +3 -3
- data/spec/resources/aws_route53_record_spec.rb +3 -4
- data/spec/resources/aws_route53_zone_spec.rb +3 -4
- data/spec/resources/aws_route_spec.rb +3 -6
- data/spec/resources/aws_route_table_association_spec.rb +4 -6
- data/spec/resources/aws_route_table_spec.rb +3 -3
- data/spec/resources/aws_s3_bucket_notification_spec.rb +4 -0
- data/spec/resources/aws_s3_bucket_spec.rb +3 -3
- data/spec/resources/aws_security_group_spec.rb +5 -5
- data/spec/resources/aws_ses_receipt_rule_set_spec.rb +3 -4
- data/spec/resources/aws_ses_receipt_rule_spec.rb +3 -4
- data/spec/resources/aws_sns_topic_spec.rb +10 -6
- data/spec/resources/aws_sns_topic_subscription_spec.rb +8 -7
- data/spec/resources/aws_sqs_queue_spec.rb +3 -3
- data/spec/resources/aws_subnet_spec.rb +3 -3
- data/spec/resources/aws_vpc_dhcp_options_association_spec.rb +3 -6
- data/spec/resources/aws_vpc_dhcp_options_spec.rb +3 -3
- data/spec/resources/aws_vpc_endpoint_spec.rb +3 -6
- data/spec/resources/aws_vpc_peering_connection_spec.rb +4 -6
- data/spec/resources/aws_vpc_spec.rb +3 -3
- data/spec/resources/aws_vpn_connection_route_spec.rb +3 -6
- data/spec/resources/aws_vpn_connection_spec.rb +3 -3
- data/spec/resources/aws_vpn_gateway_attachment_spec.rb +4 -6
- data/spec/resources/aws_vpn_gateway_spec.rb +3 -3
- data/spec/spec_helper.rb +3 -1
- data/spec/support/normalize_indent.rb +12 -0
- metadata +92 -22
- metadata.gz.sig +0 -0
@@ -18,9 +18,9 @@ class GeoEngineer::Resources::AwsRedshiftCluster < GeoEngineer::Resource
|
|
18
18
|
|
19
19
|
after :initialize, -> { _terraform_id -> { cluster_identifier } }
|
20
20
|
|
21
|
-
def self._fetch_remote_resources
|
21
|
+
def self._fetch_remote_resources(provider)
|
22
22
|
AwsClients
|
23
|
-
.redshift
|
23
|
+
.redshift(provider)
|
24
24
|
.describe_clusters
|
25
25
|
.clusters
|
26
26
|
.map(&:to_h)
|
@@ -22,9 +22,9 @@ class GeoEngineer::Resources::AwsRoute < GeoEngineer::Resource
|
|
22
22
|
false
|
23
23
|
end
|
24
24
|
|
25
|
-
def self._fetch_remote_resources
|
25
|
+
def self._fetch_remote_resources(provider)
|
26
26
|
AwsClients
|
27
|
-
.ec2
|
27
|
+
.ec2(provider)
|
28
28
|
.describe_route_tables['route_tables']
|
29
29
|
.map(&:to_h)
|
30
30
|
.map { |route_table| _extract_routes(route_table) }
|
@@ -19,16 +19,16 @@ class GeoEngineer::Resources::AwsRoute53Record < GeoEngineer::Resource
|
|
19
19
|
false
|
20
20
|
end
|
21
21
|
|
22
|
-
def self._fetch_remote_resources
|
23
|
-
_fetch_zones.map { |zone| _fetch_records_for_zone(zone) }.flatten.compact
|
22
|
+
def self._fetch_remote_resources(provider)
|
23
|
+
_fetch_zones(provider).map { |zone| _fetch_records_for_zone(provider, zone) }.flatten.compact
|
24
24
|
end
|
25
25
|
|
26
|
-
def self._fetch_zones
|
27
|
-
AwsClients.route53.list_hosted_zones.hosted_zones.map(&:to_h)
|
26
|
+
def self._fetch_zones(provider)
|
27
|
+
AwsClients.route53(provider).list_hosted_zones.hosted_zones.map(&:to_h)
|
28
28
|
end
|
29
29
|
|
30
|
-
def self._fetch_records_for_zone(zone)
|
31
|
-
records = AwsClients.route53.list_resource_record_sets({ hosted_zone_id: zone[:id] })
|
30
|
+
def self._fetch_records_for_zone(provider, zone)
|
31
|
+
records = AwsClients.route53(provider).list_resource_record_sets({ hosted_zone_id: zone[:id] })
|
32
32
|
records.resource_record_sets.map(&:to_h).map do |record|
|
33
33
|
record.merge({ _terraform_id: "#{record[:zone_id]}_#{record[:name]}_#{record[:type]}" })
|
34
34
|
end
|
@@ -9,8 +9,8 @@ class GeoEngineer::Resources::AwsRoute53Zone < GeoEngineer::Resource
|
|
9
9
|
after :initialize, -> { _terraform_id -> { NullObject.maybe(remote_resource)._terraform_id } }
|
10
10
|
after :initialize, -> { _geo_id -> { self.name } }
|
11
11
|
|
12
|
-
def self._fetch_remote_resources
|
13
|
-
hosted_zones = AwsClients.route53.list_hosted_zones.hosted_zones.map(&:to_h)
|
12
|
+
def self._fetch_remote_resources(provider)
|
13
|
+
hosted_zones = AwsClients.route53(provider).list_hosted_zones.hosted_zones.map(&:to_h)
|
14
14
|
|
15
15
|
hosted_zones.map do |zone|
|
16
16
|
zone[:_terraform_id] = zone[:id]
|
@@ -13,8 +13,8 @@ class GeoEngineer::Resources::AwsRouteTable < GeoEngineer::Resource
|
|
13
13
|
after :initialize, -> { _terraform_id -> { NullObject.maybe(remote_resource)._terraform_id } }
|
14
14
|
after :initialize, -> { _geo_id -> { NullObject.maybe(tags)[:Name] } }
|
15
15
|
|
16
|
-
def self._fetch_remote_resources
|
17
|
-
AwsClients.ec2.describe_route_tables['route_tables'].map(&:to_h).map do |route_table|
|
16
|
+
def self._fetch_remote_resources(provider)
|
17
|
+
AwsClients.ec2(provider).describe_route_tables['route_tables'].map(&:to_h).map do |route_table|
|
18
18
|
route_table.merge(
|
19
19
|
{
|
20
20
|
_terraform_id: route_table[:route_table_id],
|
@@ -22,9 +22,9 @@ class GeoEngineer::Resources::AwsRouteTableAssociation < GeoEngineer::Resource
|
|
22
22
|
false
|
23
23
|
end
|
24
24
|
|
25
|
-
def self._fetch_remote_resources
|
25
|
+
def self._fetch_remote_resources(provider)
|
26
26
|
AwsClients
|
27
|
-
.ec2
|
27
|
+
.ec2(provider)
|
28
28
|
.describe_route_tables['route_tables']
|
29
29
|
.map(&:to_h)
|
30
30
|
.map { |route_table| route_table[:associations] }
|
@@ -43,8 +43,8 @@ class GeoEngineer::Resources::AwsS3Bucket < GeoEngineer::Resource
|
|
43
43
|
"s3"
|
44
44
|
end
|
45
45
|
|
46
|
-
def self._fetch_remote_resources
|
47
|
-
AwsClients.s3.list_buckets[:buckets].map(&:to_h).map do |s3b|
|
46
|
+
def self._fetch_remote_resources(provider)
|
47
|
+
AwsClients.s3(provider).list_buckets[:buckets].map(&:to_h).map do |s3b|
|
48
48
|
s3b[:_terraform_id] = s3b[:name]
|
49
49
|
s3b[:_geo_id] = s3b[:name]
|
50
50
|
s3b[:bucket] = s3b[:name]
|
@@ -0,0 +1,38 @@
|
|
1
|
+
########################################################################
|
2
|
+
# AwsS3BucketNotification is the +aws_s3_bucket_notification+ terrform resource,
|
3
|
+
#
|
4
|
+
# {https://www.terraform.io/docs/providers/aws/r/s3_bucket_notification.html Terraform Docs}
|
5
|
+
########################################################################
|
6
|
+
class GeoEngineer::Resources::AwsS3BucketNotification < GeoEngineer::Resource
|
7
|
+
validate -> { validate_required_attributes([:bucket]) }
|
8
|
+
|
9
|
+
after :initialize, -> { _terraform_id -> { _bucket.bucket } }
|
10
|
+
|
11
|
+
# Setting _bucket
|
12
|
+
after :initialize, -> { self.bucket = _bucket.bucket }
|
13
|
+
after :initialize, -> { depends_on [_bucket.terraform_name] }
|
14
|
+
|
15
|
+
validate -> {
|
16
|
+
validate_subresource_required_attributes(:lambda_function, [:lambda_function_arn, :events])
|
17
|
+
}
|
18
|
+
|
19
|
+
validate -> {
|
20
|
+
validate_subresource_required_attributes(:queue, [:queue_arn, :events])
|
21
|
+
}
|
22
|
+
|
23
|
+
validate -> {
|
24
|
+
validate_subresource_required_attributes(:topic, [:topic_arn, :events])
|
25
|
+
}
|
26
|
+
|
27
|
+
def support_tags?
|
28
|
+
false
|
29
|
+
end
|
30
|
+
|
31
|
+
def to_terraform_state
|
32
|
+
tfstate = super
|
33
|
+
tfstate[:primary][:attributes] = {
|
34
|
+
'bucket' => bucket
|
35
|
+
}
|
36
|
+
tfstate
|
37
|
+
end
|
38
|
+
end
|
@@ -42,8 +42,8 @@ class GeoEngineer::Resources::AwsSecurityGroup < GeoEngineer::Resource
|
|
42
42
|
"sg"
|
43
43
|
end
|
44
44
|
|
45
|
-
def self._fetch_remote_resources
|
46
|
-
AwsClients.ec2.describe_security_groups['security_groups'].map(&:to_h).map do |sg|
|
45
|
+
def self._fetch_remote_resources(provider)
|
46
|
+
AwsClients.ec2(provider).describe_security_groups['security_groups'].map(&:to_h).map do |sg|
|
47
47
|
sg.merge(
|
48
48
|
{
|
49
49
|
name: sg[:group_name],
|
@@ -27,8 +27,8 @@ class GeoEngineer::Resources::AwsSesReceiptRule < GeoEngineer::Resource
|
|
27
27
|
false
|
28
28
|
end
|
29
29
|
|
30
|
-
def self._fetch_remote_resources
|
31
|
-
AwsClients.ses.describe_active_receipt_rule_set.rules.map(&:to_h).map do |rule|
|
30
|
+
def self._fetch_remote_resources(provider)
|
31
|
+
AwsClients.ses(provider).describe_active_receipt_rule_set.rules.map(&:to_h).map do |rule|
|
32
32
|
{
|
33
33
|
_terraform_id: rule[:name],
|
34
34
|
_geo_id: rule[:name]
|
@@ -17,8 +17,8 @@ class GeoEngineer::Resources::AwsSesReceiptRuleSet < GeoEngineer::Resource
|
|
17
17
|
false
|
18
18
|
end
|
19
19
|
|
20
|
-
def self._fetch_remote_resources
|
21
|
-
AwsClients.ses.list_receipt_rule_sets.rule_sets.map(&:to_h).map do |rule_set|
|
20
|
+
def self._fetch_remote_resources(provider)
|
21
|
+
AwsClients.ses(provider).list_receipt_rule_sets.rule_sets.map(&:to_h).map do |rule_set|
|
22
22
|
{
|
23
23
|
_terraform_id: rule_set[:name],
|
24
24
|
_geo_id: rule_set[:name]
|
@@ -16,8 +16,8 @@ class GeoEngineer::Resources::AwsSnsTopic < GeoEngineer::Resource
|
|
16
16
|
false
|
17
17
|
end
|
18
18
|
|
19
|
-
def self._fetch_remote_resources
|
20
|
-
AwsClients.sns.list_topics.topics.map(&:to_h).map do |topic|
|
19
|
+
def self._fetch_remote_resources(provider)
|
20
|
+
AwsClients.sns(provider).list_topics.topics.map(&:to_h).map do |topic|
|
21
21
|
{
|
22
22
|
_terraform_id: topic[:topic_arn],
|
23
23
|
_geo_id: topic[:topic_arn],
|
@@ -30,8 +30,8 @@ class GeoEngineer::Resources::AwsSnsTopicSubscription < GeoEngineer::Resource
|
|
30
30
|
false
|
31
31
|
end
|
32
32
|
|
33
|
-
def self._fetch_remote_resources
|
34
|
-
_get_all_subscriptions.map do |subscription|
|
33
|
+
def self._fetch_remote_resources(provider)
|
34
|
+
_get_all_subscriptions(provider).map do |subscription|
|
35
35
|
{
|
36
36
|
_terraform_id: subscription[:subscription_arn],
|
37
37
|
_geo_id: "#{subscription[:topic_arn]}::" \
|
@@ -41,11 +41,11 @@ class GeoEngineer::Resources::AwsSnsTopicSubscription < GeoEngineer::Resource
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
-
def self._get_all_subscriptions
|
45
|
-
subs_page = AwsClients.sns.list_subscriptions
|
44
|
+
def self._get_all_subscriptions(provider)
|
45
|
+
subs_page = AwsClients.sns(provider).list_subscriptions
|
46
46
|
subs = subs_page.subscriptions.map(&:to_h)
|
47
47
|
while subs_page.next_token
|
48
|
-
subs_page = AwsClients.sns.list_subscriptions({ next_token: subs_page.next_token })
|
48
|
+
subs_page = AwsClients.sns(provider).list_subscriptions({ next_token: subs_page.next_token })
|
49
49
|
subs.concat subs_page.subscriptions.map(&:to_h)
|
50
50
|
end
|
51
51
|
subs
|
@@ -25,8 +25,8 @@ class GeoEngineer::Resources::AwsSqsQueue < GeoEngineer::Resource
|
|
25
25
|
false
|
26
26
|
end
|
27
27
|
|
28
|
-
def self._fetch_remote_resources
|
29
|
-
AwsClients.sqs.list_queues['queue_urls'].map do |queue|
|
28
|
+
def self._fetch_remote_resources(provider)
|
29
|
+
AwsClients.sqs(provider).list_queues['queue_urls'].map do |queue|
|
30
30
|
{
|
31
31
|
_terraform_id: queue,
|
32
32
|
_geo_id: queue,
|
@@ -11,8 +11,8 @@ class GeoEngineer::Resources::AwsSubnet < GeoEngineer::Resource
|
|
11
11
|
after :initialize, -> { _terraform_id -> { NullObject.maybe(remote_resource)._terraform_id } }
|
12
12
|
after :initialize, -> { _geo_id -> { NullObject.maybe(tags)[:Name] } }
|
13
13
|
|
14
|
-
def self._fetch_remote_resources
|
15
|
-
AwsClients.ec2.describe_subnets['subnets'].map(&:to_h).map do |subnet|
|
14
|
+
def self._fetch_remote_resources(provider)
|
15
|
+
AwsClients.ec2(provider).describe_subnets['subnets'].map(&:to_h).map do |subnet|
|
16
16
|
subnet.merge(
|
17
17
|
{
|
18
18
|
_terraform_id: subnet[:subnet_id],
|
@@ -11,8 +11,8 @@ class GeoEngineer::Resources::AwsVpc < GeoEngineer::Resource
|
|
11
11
|
after :initialize, -> { _terraform_id -> { NullObject.maybe(remote_resource)._terraform_id } }
|
12
12
|
after :initialize, -> { _geo_id -> { NullObject.maybe(tags)[:Name] } }
|
13
13
|
|
14
|
-
def self._fetch_remote_resources
|
15
|
-
AwsClients.ec2.describe_vpcs['vpcs'].map(&:to_h).map do |vpc|
|
14
|
+
def self._fetch_remote_resources(provider)
|
15
|
+
AwsClients.ec2(provider).describe_vpcs['vpcs'].map(&:to_h).map do |vpc|
|
16
16
|
vpc.merge(
|
17
17
|
{
|
18
18
|
_terraform_id: vpc[:vpc_id],
|
@@ -16,8 +16,8 @@ class GeoEngineer::Resources::AwsVpcDhcpOptions < GeoEngineer::Resource
|
|
16
16
|
after :initialize, -> { _terraform_id -> { NullObject.maybe(remote_resource)._terraform_id } }
|
17
17
|
after :initialize, -> { _geo_id -> { NullObject.maybe(tags)[:Name] } }
|
18
18
|
|
19
|
-
def self._fetch_remote_resources
|
20
|
-
AwsClients.ec2.describe_dhcp_options['dhcp_options'].map(&:to_h).map do |options|
|
19
|
+
def self._fetch_remote_resources(provider)
|
20
|
+
AwsClients.ec2(provider).describe_dhcp_options['dhcp_options'].map(&:to_h).map do |options|
|
21
21
|
options.merge(
|
22
22
|
{
|
23
23
|
_terraform_id: options[:dhcp_options_id],
|
@@ -23,9 +23,9 @@ class GeoEngineer::Resources::AwsVpcDhcpOptionsAssociation < GeoEngineer::Resour
|
|
23
23
|
false
|
24
24
|
end
|
25
25
|
|
26
|
-
def self._fetch_remote_resources
|
26
|
+
def self._fetch_remote_resources(provider)
|
27
27
|
AwsClients
|
28
|
-
.ec2
|
28
|
+
.ec2(provider)
|
29
29
|
.describe_vpcs['vpcs']
|
30
30
|
.map(&:to_h)
|
31
31
|
.select { |vpc| vpc[:dhcp_options_id] }
|
@@ -13,8 +13,8 @@ class GeoEngineer::Resources::AwsVpcEndpoint < GeoEngineer::Resource
|
|
13
13
|
false
|
14
14
|
end
|
15
15
|
|
16
|
-
def self._fetch_remote_resources
|
17
|
-
AwsClients.ec2.describe_vpc_endpoints['vpc_endpoints'].map(&:to_h).map do |endpoint|
|
16
|
+
def self._fetch_remote_resources(provider)
|
17
|
+
AwsClients.ec2(provider).describe_vpc_endpoints['vpc_endpoints'].map(&:to_h).map do |endpoint|
|
18
18
|
endpoint.merge(
|
19
19
|
{
|
20
20
|
_terraform_id: endpoint[:vpc_endpoint_id],
|
@@ -10,9 +10,9 @@ class GeoEngineer::Resources::AwsVpcPeeringConnection < GeoEngineer::Resource
|
|
10
10
|
after :initialize, -> { _terraform_id -> { NullObject.maybe(remote_resource)._terraform_id } }
|
11
11
|
after :initialize, -> { _geo_id -> { NullObject.maybe(tags)[:Name] } }
|
12
12
|
|
13
|
-
def self._fetch_remote_resources
|
13
|
+
def self._fetch_remote_resources(provider)
|
14
14
|
AwsClients
|
15
|
-
.ec2
|
15
|
+
.ec2(provider)
|
16
16
|
.describe_vpc_peering_connections['vpc_peering_connections']
|
17
17
|
.map(&:to_h)
|
18
18
|
.map { |connection| _merge_ids(connection) }
|
@@ -10,8 +10,9 @@ class GeoEngineer::Resources::AwsVpnConnection < GeoEngineer::Resource
|
|
10
10
|
after :initialize, -> { _terraform_id -> { NullObject.maybe(remote_resource)._terraform_id } }
|
11
11
|
after :initialize, -> { _geo_id -> { NullObject.maybe(tags)[:Name] } }
|
12
12
|
|
13
|
-
def self._fetch_remote_resources
|
14
|
-
AwsClients.ec2
|
13
|
+
def self._fetch_remote_resources(provider)
|
14
|
+
AwsClients.ec2(provider)
|
15
|
+
.describe_vpn_connections['vpn_connections'].map(&:to_h).map do |connection|
|
15
16
|
connection.merge(
|
16
17
|
{
|
17
18
|
_terraform_id: connection[:vpn_connection_id],
|
@@ -12,9 +12,9 @@ class GeoEngineer::Resources::AwsVpnConnectionRoute < GeoEngineer::Resource
|
|
12
12
|
false
|
13
13
|
end
|
14
14
|
|
15
|
-
def self._fetch_remote_resources
|
15
|
+
def self._fetch_remote_resources(provider)
|
16
16
|
AwsClients
|
17
|
-
.ec2
|
17
|
+
.ec2(provider)
|
18
18
|
.describe_vpn_connections['vpn_connections']
|
19
19
|
.map(&:to_h)
|
20
20
|
.select { |connection| !connection[:routes].empty? }
|
@@ -9,8 +9,8 @@ class GeoEngineer::Resources::AwsVpnGateway < GeoEngineer::Resource
|
|
9
9
|
after :initialize, -> { _terraform_id -> { NullObject.maybe(remote_resource)._terraform_id } }
|
10
10
|
after :initialize, -> { _geo_id -> { NullObject.maybe(tags)[:Name] } }
|
11
11
|
|
12
|
-
def self._fetch_remote_resources
|
13
|
-
AwsClients.ec2.describe_vpn_gateways['vpn_gateways'].map(&:to_h).map do |gateway|
|
12
|
+
def self._fetch_remote_resources(provider)
|
13
|
+
AwsClients.ec2(provider).describe_vpn_gateways['vpn_gateways'].map(&:to_h).map do |gateway|
|
14
14
|
gateway.merge(
|
15
15
|
{
|
16
16
|
_terraform_id: gateway[:vpn_gateway_id],
|
@@ -23,9 +23,9 @@ class GeoEngineer::Resources::AwsVpnGatewayAttachment < GeoEngineer::Resource
|
|
23
23
|
false
|
24
24
|
end
|
25
25
|
|
26
|
-
def self._fetch_remote_resources
|
26
|
+
def self._fetch_remote_resources(provider)
|
27
27
|
AwsClients
|
28
|
-
.ec2
|
28
|
+
.ec2(provider)
|
29
29
|
.describe_vpn_gateways['vpn_gateways']
|
30
30
|
.map(&:to_h)
|
31
31
|
.select { |gateway| !gateway[:vpc_attachments].empty? }
|
data/lib/geoengineer/template.rb
CHANGED
@@ -5,11 +5,13 @@ class GeoEngineer::Template
|
|
5
5
|
include HasAttributes
|
6
6
|
include HasResources
|
7
7
|
|
8
|
-
attr_accessor :name, :parameters
|
8
|
+
attr_accessor :name, :parameters, :parent
|
9
9
|
|
10
10
|
def initialize(name, parent, parameters = {})
|
11
11
|
@name = name
|
12
12
|
@parameters = parameters
|
13
|
+
@parent = parent
|
14
|
+
|
13
15
|
case parent
|
14
16
|
when GeoEngineer::Project then add_project_attributes(parent)
|
15
17
|
when GeoEngineer::Environment then add_env_attributes(parent)
|
@@ -0,0 +1,197 @@
|
|
1
|
+
# This template will create basic JSON REST API gateway resources
|
2
|
+
# It is recommended due to difficulties managing API_Gateway resources
|
3
|
+
# to use such a template
|
4
|
+
# This resource will also delete any resource on the API that is not defined
|
5
|
+
# within this template as a means of managing the resources
|
6
|
+
# Beta Template
|
7
|
+
class GeoEngineer::Templates::JsonRestApi < GeoEngineer::Template
|
8
|
+
attr_reader :rest_api
|
9
|
+
|
10
|
+
def create_rest_resources(params)
|
11
|
+
rest_api = @rest_api
|
12
|
+
api_resources = {}
|
13
|
+
params[:methods].each do |method_name, method_params|
|
14
|
+
path = method_params[:path]
|
15
|
+
next if api_resources[path]
|
16
|
+
|
17
|
+
api_resource = parent.resource("aws_api_gateway_resource", "#{@name}_resource_#{path}") {
|
18
|
+
_rest_api rest_api
|
19
|
+
path_part path
|
20
|
+
}
|
21
|
+
|
22
|
+
api_resources[path] = api_resource
|
23
|
+
end
|
24
|
+
api_resources
|
25
|
+
end
|
26
|
+
|
27
|
+
def create_rest_methods(api_resources, params)
|
28
|
+
rest_api = @rest_api
|
29
|
+
api_methods = {}
|
30
|
+
params[:methods].each do |method_name, method_params|
|
31
|
+
path = method_params[:path]
|
32
|
+
api_resource = api_resources[path]
|
33
|
+
http_method = method_params[:method]
|
34
|
+
|
35
|
+
method_name = "#{@name}_resource_#{path}_method_#{http_method}"
|
36
|
+
|
37
|
+
# METHOD
|
38
|
+
api_methods[method_name] = parent.resource("aws_api_gateway_method", method_name) {
|
39
|
+
_rest_api rest_api
|
40
|
+
_resource api_resource
|
41
|
+
http_method http_method
|
42
|
+
authorization method_params[:auth]
|
43
|
+
api_key_required !!method_params[:api_key]
|
44
|
+
}
|
45
|
+
end
|
46
|
+
|
47
|
+
api_methods
|
48
|
+
end
|
49
|
+
|
50
|
+
def create_rest_integrations(api_resources, params)
|
51
|
+
rest_api = @rest_api
|
52
|
+
api_integrations = {}
|
53
|
+
params[:methods].each do |method_name, method_params|
|
54
|
+
path = method_params[:path]
|
55
|
+
api_resource = api_resources[path]
|
56
|
+
lambda_function = params[:lambda][method_params[:handler]]
|
57
|
+
http_method = method_params[:method]
|
58
|
+
|
59
|
+
method_name = "#{@name}_resource_#{path}_method_#{http_method}"
|
60
|
+
|
61
|
+
api_gateway_arn = "arn:aws:apigateway:#{env.region}"
|
62
|
+
invocation_arn = "functions/#{lambda_function.to_ref('arn')}/invocations"
|
63
|
+
# INTEGRATION
|
64
|
+
api_integrations[method_name] = parent.resource(
|
65
|
+
"aws_api_gateway_integration",
|
66
|
+
"#{method_name}_integration"
|
67
|
+
) {
|
68
|
+
_rest_api rest_api
|
69
|
+
_resource api_resource
|
70
|
+
http_method http_method
|
71
|
+
self["type"] = "AWS"
|
72
|
+
integration_http_method "POST" # ALWAYS POST TO LAMBDAS
|
73
|
+
uri "#{api_gateway_arn}:lambda:path/2015-03-31/#{invocation_arn}"
|
74
|
+
}
|
75
|
+
end
|
76
|
+
api_integrations
|
77
|
+
end
|
78
|
+
|
79
|
+
def http_method_response_mappings(api_resources, params)
|
80
|
+
https_methods = params[:methods].values.map { |m| m[:method] }.uniq
|
81
|
+
|
82
|
+
response_mappings = {}
|
83
|
+
https_methods.each do |m|
|
84
|
+
response_mappings["#{m}_success"] = {
|
85
|
+
status: "200",
|
86
|
+
method: m
|
87
|
+
}
|
88
|
+
|
89
|
+
response_mappings["#{m}_notfound"] = {
|
90
|
+
status: "404",
|
91
|
+
method: m,
|
92
|
+
selection_pattern: ".*NotFound.*"
|
93
|
+
}
|
94
|
+
end
|
95
|
+
|
96
|
+
api_resources.values.each do |api_resource|
|
97
|
+
response_mappings.each do |name, mapping|
|
98
|
+
yield api_resource, name, mapping
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def create_api_methods_responses(api_resources, api_methods, params)
|
104
|
+
rest_api = @rest_api
|
105
|
+
api_method_responses = []
|
106
|
+
|
107
|
+
http_method_response_mappings(api_resources, params) do |api_resource, name, mapping|
|
108
|
+
http_method = mapping[:method]
|
109
|
+
status = mapping[:status]
|
110
|
+
|
111
|
+
api_method_response = parent.resource(
|
112
|
+
"aws_api_gateway_method_response",
|
113
|
+
"mr_#{api_resource.id}_#{name}"
|
114
|
+
) {
|
115
|
+
_rest_api rest_api
|
116
|
+
_resource api_resource
|
117
|
+
http_method http_method
|
118
|
+
status_code status
|
119
|
+
depends_on [api_methods.values].flatten.map(&:terraform_name)
|
120
|
+
depends_on api_method_responses.map(&:terraform_name) # force order
|
121
|
+
}
|
122
|
+
|
123
|
+
api_method_responses << api_method_response
|
124
|
+
end
|
125
|
+
|
126
|
+
api_method_responses
|
127
|
+
end
|
128
|
+
|
129
|
+
def create_api_integrations_responses(api_resources, api_integrations, params)
|
130
|
+
rest_api = @rest_api
|
131
|
+
api_integration_responses = []
|
132
|
+
|
133
|
+
http_method_response_mappings(api_resources, params) do |api_resource, name, mapping|
|
134
|
+
http_method = mapping[:method]
|
135
|
+
status = mapping[:status]
|
136
|
+
selection_pattern = mapping[:selection_pattern]
|
137
|
+
|
138
|
+
api_integration_response = parent.resource(
|
139
|
+
"aws_api_gateway_integration_response",
|
140
|
+
"ir_#{api_resource.id}_#{name}"
|
141
|
+
) {
|
142
|
+
_rest_api rest_api
|
143
|
+
_resource api_resource
|
144
|
+
http_method http_method
|
145
|
+
status_code status
|
146
|
+
selection_pattern selection_pattern if selection_pattern
|
147
|
+
depends_on [api_integrations.values].flatten.map(&:terraform_name)
|
148
|
+
depends_on api_integration_responses.map(&:terraform_name) # force order
|
149
|
+
}
|
150
|
+
|
151
|
+
api_integration_responses << api_integration_response
|
152
|
+
end
|
153
|
+
|
154
|
+
api_integration_responses
|
155
|
+
end
|
156
|
+
|
157
|
+
attr_reader :rest_api
|
158
|
+
|
159
|
+
def initialize(name, parent, params)
|
160
|
+
super(name, parent, params)
|
161
|
+
|
162
|
+
# parameters
|
163
|
+
# lambda:
|
164
|
+
# <ref>: lambda_resource
|
165
|
+
# methods:
|
166
|
+
# <name>:
|
167
|
+
# path:
|
168
|
+
# method: <POST,PUT,GET...>
|
169
|
+
# auth: <NONE,CUSTOM,AWS_IAM>
|
170
|
+
# api_key: <false>
|
171
|
+
# handler: <lambda ref>
|
172
|
+
#
|
173
|
+
|
174
|
+
### Rest API
|
175
|
+
@rest_api = parent.resource("aws_api_gateway_rest_api", "#{@name}_rest_api") {
|
176
|
+
name name
|
177
|
+
# Depends on the lambda functions existing
|
178
|
+
depends_on params[:lambda].values.map(&:terraform_name)
|
179
|
+
}
|
180
|
+
|
181
|
+
# Resources and Responses
|
182
|
+
api_resources = create_rest_resources(params)
|
183
|
+
|
184
|
+
api_methods = create_rest_methods(api_resources, params)
|
185
|
+
api_integrations = create_rest_integrations(api_resources, params)
|
186
|
+
|
187
|
+
# RESPONSES
|
188
|
+
create_api_methods_responses(api_resources, api_methods, params)
|
189
|
+
create_api_integrations_responses(api_resources, api_integrations, params)
|
190
|
+
|
191
|
+
# TODO: delete uncodified resources
|
192
|
+
end
|
193
|
+
|
194
|
+
def template_resources
|
195
|
+
@rest_api
|
196
|
+
end
|
197
|
+
end
|