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.
Files changed (189) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/README.md +8 -6
  5. data/lib/geoengineer.rb +2 -0
  6. data/lib/geoengineer/cli/geo_cli.rb +1 -4
  7. data/lib/geoengineer/cli/terraform_commands.rb +4 -2
  8. data/lib/geoengineer/environment.rb +14 -1
  9. data/lib/geoengineer/provider.rb +38 -0
  10. data/lib/geoengineer/resource.rb +29 -15
  11. data/lib/geoengineer/resources/api_gateway/helpers.rb +107 -0
  12. data/lib/geoengineer/resources/aws_alb.rb +39 -0
  13. data/lib/geoengineer/resources/aws_alb_listener.rb +39 -0
  14. data/lib/geoengineer/resources/aws_alb_listener_rule.rb +42 -0
  15. data/lib/geoengineer/resources/aws_alb_target_group.rb +30 -0
  16. data/lib/geoengineer/resources/aws_api_gateway_account.rb +18 -0
  17. data/lib/geoengineer/resources/aws_api_gateway_api_key.rb +20 -0
  18. data/lib/geoengineer/resources/aws_api_gateway_authorizer.rb +20 -0
  19. data/lib/geoengineer/resources/aws_api_gateway_base_path_mapping.rb +20 -0
  20. data/lib/geoengineer/resources/aws_api_gateway_client_certificate.rb +24 -0
  21. data/lib/geoengineer/resources/aws_api_gateway_deployment.rb +65 -0
  22. data/lib/geoengineer/resources/aws_api_gateway_domain_name.rb +27 -0
  23. data/lib/geoengineer/resources/aws_api_gateway_integration.rb +58 -0
  24. data/lib/geoengineer/resources/aws_api_gateway_integration_response.rb +68 -0
  25. data/lib/geoengineer/resources/aws_api_gateway_method.rb +59 -0
  26. data/lib/geoengineer/resources/aws_api_gateway_method_response.rb +69 -0
  27. data/lib/geoengineer/resources/aws_api_gateway_model.rb +19 -0
  28. data/lib/geoengineer/resources/aws_api_gateway_resource.rb +47 -0
  29. data/lib/geoengineer/resources/aws_api_gateway_rest_api.rb +79 -0
  30. data/lib/geoengineer/resources/aws_api_gateway_usage_plan.rb +27 -0
  31. data/lib/geoengineer/resources/aws_cloudfront_distribution.rb +25 -0
  32. data/lib/geoengineer/resources/aws_cloudtrail.rb +2 -2
  33. data/lib/geoengineer/resources/aws_cloudwatch_event_rule.rb +12 -3
  34. data/lib/geoengineer/resources/aws_cloudwatch_event_target.rb +2 -2
  35. data/lib/geoengineer/resources/aws_cloudwatch_metric_alarm.rb +10 -8
  36. data/lib/geoengineer/resources/aws_customer_gateway.rb +4 -2
  37. data/lib/geoengineer/resources/aws_db_instance.rb +2 -2
  38. data/lib/geoengineer/resources/aws_db_parameter_group.rb +4 -2
  39. data/lib/geoengineer/resources/aws_dynamodb_table.rb +2 -2
  40. data/lib/geoengineer/resources/aws_eip.rb +2 -2
  41. data/lib/geoengineer/resources/aws_elasticache_cluster.rb +2 -2
  42. data/lib/geoengineer/resources/aws_elasticache_parameter_group.rb +2 -2
  43. data/lib/geoengineer/resources/aws_elasticache_replication_group.rb +2 -2
  44. data/lib/geoengineer/resources/aws_elasticache_subnet_group.rb +2 -2
  45. data/lib/geoengineer/resources/aws_elasticsearch_domain.rb +2 -2
  46. data/lib/geoengineer/resources/aws_elb.rb +4 -2
  47. data/lib/geoengineer/resources/aws_iam_account_password_policy.rb +2 -1
  48. data/lib/geoengineer/resources/aws_iam_group.rb +2 -2
  49. data/lib/geoengineer/resources/aws_iam_group_membership.rb +1 -1
  50. data/lib/geoengineer/resources/aws_iam_instance_profile.rb +3 -3
  51. data/lib/geoengineer/resources/aws_iam_policy.rb +6 -4
  52. data/lib/geoengineer/resources/aws_iam_policy_attachment.rb +1 -1
  53. data/lib/geoengineer/resources/aws_iam_role.rb +2 -2
  54. data/lib/geoengineer/resources/aws_iam_role_policy.rb +10 -9
  55. data/lib/geoengineer/resources/aws_iam_user.rb +4 -4
  56. data/lib/geoengineer/resources/aws_instance.rb +3 -3
  57. data/lib/geoengineer/resources/aws_internet_gateway.rb +3 -2
  58. data/lib/geoengineer/resources/aws_kinesis_stream.rb +4 -4
  59. data/lib/geoengineer/resources/aws_kms_key.rb +5 -3
  60. data/lib/geoengineer/resources/aws_lambda_alias.rb +7 -7
  61. data/lib/geoengineer/resources/aws_lambda_event_source_mapping.rb +2 -2
  62. data/lib/geoengineer/resources/aws_lambda_function.rb +2 -2
  63. data/lib/geoengineer/resources/aws_lambda_permission.rb +9 -8
  64. data/lib/geoengineer/resources/aws_lb_cookie_stickiness_policy.rb +47 -0
  65. data/lib/geoengineer/resources/aws_load_balancer_backend_server_policy.rb +2 -2
  66. data/lib/geoengineer/resources/aws_load_balancer_policy.rb +5 -5
  67. data/lib/geoengineer/resources/aws_main_route_table_association.rb +2 -2
  68. data/lib/geoengineer/resources/aws_nat_gateway.rb +2 -2
  69. data/lib/geoengineer/resources/aws_network_acl.rb +2 -2
  70. data/lib/geoengineer/resources/aws_network_acl_rule.rb +2 -2
  71. data/lib/geoengineer/resources/aws_proxy_protocol_policy.rb +1 -1
  72. data/lib/geoengineer/resources/aws_redshift_cluster.rb +2 -2
  73. data/lib/geoengineer/resources/aws_route.rb +2 -2
  74. data/lib/geoengineer/resources/aws_route53_record.rb +6 -6
  75. data/lib/geoengineer/resources/aws_route53_zone.rb +2 -2
  76. data/lib/geoengineer/resources/aws_route_table.rb +2 -2
  77. data/lib/geoengineer/resources/aws_route_table_association.rb +2 -2
  78. data/lib/geoengineer/resources/aws_s3_bucket.rb +2 -2
  79. data/lib/geoengineer/resources/aws_s3_bucket_notification.rb +38 -0
  80. data/lib/geoengineer/resources/aws_security_group.rb +2 -2
  81. data/lib/geoengineer/resources/aws_ses_receipt_rule.rb +2 -2
  82. data/lib/geoengineer/resources/aws_ses_receipt_rule_set.rb +2 -2
  83. data/lib/geoengineer/resources/aws_sns_topic.rb +2 -2
  84. data/lib/geoengineer/resources/aws_sns_topic_subscription.rb +5 -5
  85. data/lib/geoengineer/resources/aws_sqs_queue.rb +2 -2
  86. data/lib/geoengineer/resources/aws_subnet.rb +2 -2
  87. data/lib/geoengineer/resources/aws_vpc.rb +2 -2
  88. data/lib/geoengineer/resources/aws_vpc_dhcp_options.rb +2 -2
  89. data/lib/geoengineer/resources/aws_vpc_dhcp_options_association.rb +2 -2
  90. data/lib/geoengineer/resources/aws_vpc_endpoint.rb +2 -2
  91. data/lib/geoengineer/resources/aws_vpc_peering_connection.rb +2 -2
  92. data/lib/geoengineer/resources/aws_vpn_connection.rb +3 -2
  93. data/lib/geoengineer/resources/aws_vpn_connection_route.rb +2 -2
  94. data/lib/geoengineer/resources/aws_vpn_gateway.rb +2 -2
  95. data/lib/geoengineer/resources/aws_vpn_gateway_attachment.rb +2 -2
  96. data/lib/geoengineer/template.rb +3 -1
  97. data/lib/geoengineer/templates/json_rest_api.rb +197 -0
  98. data/lib/geoengineer/utils/aws_clients.rb +129 -38
  99. data/lib/geoengineer/utils/has_templates.rb +1 -1
  100. data/lib/geoengineer/version.rb +1 -1
  101. data/spec/environment_spec.rb +1 -1
  102. data/spec/resource_spec.rb +24 -10
  103. data/spec/resources/aws_alb_listener_rule_spec.rb +45 -0
  104. data/spec/resources/aws_alb_listener_spec.rb +33 -0
  105. data/spec/resources/aws_alb_spec.rb +33 -0
  106. data/spec/resources/aws_alb_target_group_spec.rb +35 -0
  107. data/spec/resources/aws_api_gateway_account_spec.rb +6 -0
  108. data/spec/resources/aws_api_gateway_api_key_spec.rb +6 -0
  109. data/spec/resources/aws_api_gateway_authorizer_spec.rb +6 -0
  110. data/spec/resources/aws_api_gateway_base_path_mapping_spec.rb +6 -0
  111. data/spec/resources/aws_api_gateway_client_certificate_spec.rb +6 -0
  112. data/spec/resources/aws_api_gateway_deployment_spec.rb +6 -0
  113. data/spec/resources/aws_api_gateway_domain_name_spec.rb +6 -0
  114. data/spec/resources/aws_api_gateway_integration_response_spec.rb +6 -0
  115. data/spec/resources/aws_api_gateway_integration_spec.rb +6 -0
  116. data/spec/resources/aws_api_gateway_method_response_spec.rb +6 -0
  117. data/spec/resources/aws_api_gateway_method_spec.rb +6 -0
  118. data/spec/resources/aws_api_gateway_model_spec.rb +6 -0
  119. data/spec/resources/aws_api_gateway_resource_spec.rb +6 -0
  120. data/spec/resources/aws_api_gateway_rest_api_spec.rb +6 -0
  121. data/spec/resources/aws_cloudfront_distribution_spec.rb +50 -0
  122. data/spec/resources/aws_cloudtrail_spec.rb +3 -3
  123. data/spec/resources/aws_cloudwatch_event_rule_spec.rb +3 -3
  124. data/spec/resources/aws_cloudwatch_event_target_spec.rb +4 -6
  125. data/spec/resources/aws_cloudwatch_metric_alarm_spec.rb +3 -6
  126. data/spec/resources/aws_customer_gateway_spec.rb +4 -3
  127. data/spec/resources/aws_db_instance_spec.rb +3 -3
  128. data/spec/resources/aws_db_parameter_group_spec.rb +3 -3
  129. data/spec/resources/aws_dynamodb_table_spec.rb +3 -3
  130. data/spec/resources/aws_eip_spec.rb +3 -3
  131. data/spec/resources/aws_elasticache_replication_group_spec.rb +3 -6
  132. data/spec/resources/aws_elasticache_subnet_group_spec.rb +4 -6
  133. data/spec/resources/aws_elasticcache_cluster_spec.rb +3 -3
  134. data/spec/resources/aws_elasticcache_parameter_group_spec.rb +3 -6
  135. data/spec/resources/aws_elasticsearch_domain_spec.rb +3 -3
  136. data/spec/resources/aws_elb_spec.rb +3 -3
  137. data/spec/resources/aws_iam_account_password_policy_spec.rb +2 -6
  138. data/spec/resources/aws_iam_group_membership_spec.rb +2 -6
  139. data/spec/resources/aws_iam_group_spec.rb +3 -3
  140. data/spec/resources/aws_iam_instance_profile_spec.rb +3 -6
  141. data/spec/resources/aws_iam_policy_attachment_spec.rb +2 -6
  142. data/spec/resources/aws_iam_policy_spec.rb +3 -5
  143. data/spec/resources/aws_iam_role_spec.rb +3 -4
  144. data/spec/resources/aws_iam_rule_policy_spec.rb +2 -5
  145. data/spec/resources/aws_iam_user_spec.rb +3 -4
  146. data/spec/resources/aws_instance_spec.rb +3 -3
  147. data/spec/resources/aws_internet_gateway_spec.rb +3 -3
  148. data/spec/resources/aws_kinesis_stream_spec.rb +3 -4
  149. data/spec/resources/aws_kms_key_spec.rb +3 -3
  150. data/spec/resources/aws_lambda_alias_spec.rb +2 -3
  151. data/spec/resources/aws_lambda_event_source_mapping_spec.rb +2 -5
  152. data/spec/resources/aws_lambda_function_spec.rb +3 -4
  153. data/spec/resources/aws_lambda_permission_spec.rb +1 -1
  154. data/spec/resources/aws_lb_cookie_stickiness_policy_spec.rb +38 -0
  155. data/spec/resources/aws_load_balancer_backend_server_policy_spec.rb +2 -3
  156. data/spec/resources/aws_load_balancer_policy_spec.rb +3 -4
  157. data/spec/resources/aws_main_route_table_association_spec.rb +2 -5
  158. data/spec/resources/aws_nat_gateway_spec.rb +3 -4
  159. data/spec/resources/aws_network_acl_rule_spec.rb +2 -3
  160. data/spec/resources/aws_network_acl_spec.rb +3 -3
  161. data/spec/resources/aws_proxy_protocol_policy_spec.rb +2 -2
  162. data/spec/resources/aws_redshift_cluster_spec.rb +3 -3
  163. data/spec/resources/aws_route53_record_spec.rb +3 -4
  164. data/spec/resources/aws_route53_zone_spec.rb +3 -4
  165. data/spec/resources/aws_route_spec.rb +3 -6
  166. data/spec/resources/aws_route_table_association_spec.rb +4 -6
  167. data/spec/resources/aws_route_table_spec.rb +3 -3
  168. data/spec/resources/aws_s3_bucket_notification_spec.rb +4 -0
  169. data/spec/resources/aws_s3_bucket_spec.rb +3 -3
  170. data/spec/resources/aws_security_group_spec.rb +5 -5
  171. data/spec/resources/aws_ses_receipt_rule_set_spec.rb +3 -4
  172. data/spec/resources/aws_ses_receipt_rule_spec.rb +3 -4
  173. data/spec/resources/aws_sns_topic_spec.rb +10 -6
  174. data/spec/resources/aws_sns_topic_subscription_spec.rb +8 -7
  175. data/spec/resources/aws_sqs_queue_spec.rb +3 -3
  176. data/spec/resources/aws_subnet_spec.rb +3 -3
  177. data/spec/resources/aws_vpc_dhcp_options_association_spec.rb +3 -6
  178. data/spec/resources/aws_vpc_dhcp_options_spec.rb +3 -3
  179. data/spec/resources/aws_vpc_endpoint_spec.rb +3 -6
  180. data/spec/resources/aws_vpc_peering_connection_spec.rb +4 -6
  181. data/spec/resources/aws_vpc_spec.rb +3 -3
  182. data/spec/resources/aws_vpn_connection_route_spec.rb +3 -6
  183. data/spec/resources/aws_vpn_connection_spec.rb +3 -3
  184. data/spec/resources/aws_vpn_gateway_attachment_spec.rb +4 -6
  185. data/spec/resources/aws_vpn_gateway_spec.rb +3 -3
  186. data/spec/spec_helper.rb +3 -1
  187. data/spec/support/normalize_indent.rb +12 -0
  188. metadata +92 -22
  189. 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.describe_vpn_connections['vpn_connections'].map(&:to_h).map do |connection|
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? }
@@ -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