jets 0.8.0 → 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/Gemfile.lock +3 -1
  4. data/jets.gemspec +2 -0
  5. data/lib/jets/application.rb +1 -1
  6. data/lib/jets/cfn.rb +1 -2
  7. data/lib/jets/cfn/builders.rb +19 -0
  8. data/lib/jets/cfn/builders/api_deployment_builder.rb +32 -0
  9. data/lib/jets/cfn/{template_builders → builders}/api_gateway_builder.rb +10 -21
  10. data/lib/jets/cfn/builders/base_child_builder.rb +49 -0
  11. data/lib/jets/cfn/{template_builders → builders}/controller_builder.rb +7 -7
  12. data/lib/jets/cfn/{template_builders → builders}/function_builder.rb +1 -2
  13. data/lib/jets/cfn/builders/interface.rb +128 -0
  14. data/lib/jets/cfn/{template_builders → builders}/job_builder.rb +2 -2
  15. data/lib/jets/cfn/builders/parent_builder.rb +84 -0
  16. data/lib/jets/cfn/{template_builders → builders}/rule_builder.rb +4 -5
  17. data/lib/jets/commands/base.rb +1 -1
  18. data/lib/jets/commands/build.rb +11 -15
  19. data/lib/jets/commands/delete.rb +12 -0
  20. data/lib/jets/commands/templates/skeleton/Gemfile.tt +1 -0
  21. data/lib/jets/commands/templates/skeleton/config/application.rb.tt +1 -1
  22. data/lib/jets/commands/url.rb +10 -12
  23. data/lib/jets/controller/base.rb +2 -2
  24. data/lib/jets/core.rb +1 -1
  25. data/lib/jets/core_ext/kernel.rb +11 -1
  26. data/lib/jets/internal/app/controllers/jets/public_controller.rb +11 -8
  27. data/lib/jets/lambda/dsl.rb +1 -1
  28. data/lib/jets/lambda/task.rb +9 -1
  29. data/lib/jets/naming.rb +2 -2
  30. data/lib/jets/pascalize.rb +9 -1
  31. data/lib/jets/poly_fun/base_executor.rb +2 -2
  32. data/lib/jets/preheat.rb +2 -2
  33. data/lib/jets/rails_overrides/common_methods.rb +1 -1
  34. data/lib/jets/resource.rb +55 -5
  35. data/lib/jets/resource/api_gateway.rb +7 -0
  36. data/lib/jets/resource/{route → api_gateway}/cors.rb +11 -10
  37. data/lib/jets/resource/api_gateway/deployment.rb +75 -0
  38. data/lib/jets/resource/{route.rb → api_gateway/method.rb} +26 -22
  39. data/lib/jets/{cfn/template_mappers/gateway_resource_mapper.rb → resource/api_gateway/resource.rb} +41 -27
  40. data/lib/jets/resource/api_gateway/rest_api.rb +23 -0
  41. data/lib/jets/resource/base.rb +17 -0
  42. data/lib/jets/resource/child_stack.rb +5 -0
  43. data/lib/jets/resource/child_stack/api_deployment.rb +58 -0
  44. data/lib/jets/resource/child_stack/api_gateway.rb +29 -0
  45. data/lib/jets/resource/child_stack/app_class.rb +81 -0
  46. data/lib/jets/resource/function.rb +184 -0
  47. data/lib/jets/resource/iam.rb +8 -0
  48. data/lib/jets/resource/iam/application_role.rb +27 -0
  49. data/lib/jets/resource/iam/base_role_definition.rb +44 -0
  50. data/lib/jets/resource/iam/class_role.rb +25 -0
  51. data/lib/jets/resource/iam/function_role.rb +25 -0
  52. data/lib/jets/{cfn/template_builders/managed_iam_policy/base_policy.rb → resource/iam/managed_policy.rb} +6 -6
  53. data/lib/jets/resource/iam/policy_document.rb +43 -0
  54. data/lib/jets/resource/permission.rb +38 -21
  55. data/lib/jets/resource/replacer.rb +50 -17
  56. data/lib/jets/resource/s3.rb +17 -0
  57. data/lib/jets/route.rb +3 -1
  58. data/lib/jets/rule/dsl.rb +7 -1
  59. data/lib/jets/server/route_matcher.rb +2 -1
  60. data/lib/jets/version.rb +1 -1
  61. metadata +46 -52
  62. data/lib/jets/cfn/template_builders.rb +0 -25
  63. data/lib/jets/cfn/template_builders/api_gateway_deployment_builder.rb +0 -38
  64. data/lib/jets/cfn/template_builders/base_child_builder.rb +0 -72
  65. data/lib/jets/cfn/template_builders/function_properties.rb +0 -6
  66. data/lib/jets/cfn/template_builders/function_properties/base_builder.rb +0 -128
  67. data/lib/jets/cfn/template_builders/function_properties/node_builder.rb +0 -12
  68. data/lib/jets/cfn/template_builders/function_properties/python_builder.rb +0 -12
  69. data/lib/jets/cfn/template_builders/function_properties/ruby_builder.rb +0 -13
  70. data/lib/jets/cfn/template_builders/iam_policy.rb +0 -6
  71. data/lib/jets/cfn/template_builders/iam_policy/application_policy.rb +0 -19
  72. data/lib/jets/cfn/template_builders/iam_policy/base_policy.rb +0 -57
  73. data/lib/jets/cfn/template_builders/iam_policy/class_policy.rb +0 -20
  74. data/lib/jets/cfn/template_builders/iam_policy/function_policy.rb +0 -21
  75. data/lib/jets/cfn/template_builders/interface.rb +0 -97
  76. data/lib/jets/cfn/template_builders/managed_iam_policy.rb +0 -6
  77. data/lib/jets/cfn/template_builders/managed_iam_policy/application_policy.rb +0 -11
  78. data/lib/jets/cfn/template_builders/managed_iam_policy/class_policy.rb +0 -10
  79. data/lib/jets/cfn/template_builders/managed_iam_policy/function_policy.rb +0 -10
  80. data/lib/jets/cfn/template_builders/parent_builder.rb +0 -95
  81. data/lib/jets/cfn/template_builders/templates/minimal-stack.yml +0 -9
  82. data/lib/jets/cfn/template_mappers.rb +0 -22
  83. data/lib/jets/cfn/template_mappers/api_gateway_deployment_mapper.rb +0 -48
  84. data/lib/jets/cfn/template_mappers/api_gateway_mapper.rb +0 -4
  85. data/lib/jets/cfn/template_mappers/child_mapper.rb +0 -41
  86. data/lib/jets/cfn/template_mappers/controller_mapper.rb +0 -36
  87. data/lib/jets/cfn/template_mappers/function_mapper.rb +0 -4
  88. data/lib/jets/cfn/template_mappers/iam_policy.rb +0 -6
  89. data/lib/jets/cfn/template_mappers/iam_policy/application_policy_mapper.rb +0 -37
  90. data/lib/jets/cfn/template_mappers/iam_policy/base_policy_mapper.rb +0 -49
  91. data/lib/jets/cfn/template_mappers/iam_policy/class_policy_mapper.rb +0 -42
  92. data/lib/jets/cfn/template_mappers/iam_policy/function_policy_mapper.rb +0 -42
  93. data/lib/jets/cfn/template_mappers/job_mapper.rb +0 -4
  94. data/lib/jets/cfn/template_mappers/lambda_function_mapper.rb +0 -52
  95. data/lib/jets/cfn/template_mappers/rule_mapper.rb +0 -5
  96. data/lib/jets/resource/attributes.rb +0 -46
  97. data/lib/jets/resource/creator.rb +0 -17
  98. data/lib/jets/resource/replacer/base.rb +0 -98
  99. data/lib/jets/resource/replacer/config_rule.rb +0 -18
  100. data/lib/jets/resource/route/attributes.rb +0 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1428541d12995e263e9e59799ac44ddad7aaa4c1edbec777efe3a9ea346f605c
4
- data.tar.gz: 1a31efb43f051e6edb9e02fc644b784cabccc73d9a9b52e2d95c83f6dfe7cd9c
3
+ metadata.gz: eebd400edfb6c76668917aa7cd01d921e4fe986b19e233aa10a688bd0ea9fe5f
4
+ data.tar.gz: 17d59f6694b0215e090c34ca250414570888bfef424403c51cfbe580a6487eb3
5
5
  SHA512:
6
- metadata.gz: aa853515fa883f4c731cb34b52cbe4a24f2885330d4efe0c8db19cd6688c52cf19b26bb35f2eb8e7aac528aaa2fe9e5f380f99d85371113bdabe526c5dbbb521
7
- data.tar.gz: 66c0ea47767db050eaf5481614cf53d2c63ab5ac44edb2eb9171d759a2d4b91a3e5052a4aa8f619e04eed0f36e5e9c56e681ad34a677e9ba979c4e2fd0d8c6be
6
+ metadata.gz: caa1419678318a8cfdb27e973ff0a9ee5555ccd4524b38022b29d33cc77cef0a99920ad511c71b9dd6ac72084563bea93205ea4892333ec67d1210da0a96941c
7
+ data.tar.gz: f7c4a9f5ad1e2cb694a83a82a95a468377dbcb97736f015e6320c4198db31ccecc966a6381412c020710da87b34759a0f8a1c5052d479c87f2fab4063d593cc9
data/CHANGELOG.md CHANGED
@@ -3,6 +3,12 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  This project *loosely tries* to adhere to [Semantic Versioning](http://semver.org/), even before v1.0.
5
5
 
6
+ ## [0.8.1]
7
+ - Upgrade all cfn resources to use the core jets resource model: request #21 from tongueroo/core-resource2
8
+ - Rid of mimimal-stack.yml and use jets core resource model
9
+ - Rescue encoding exception for the Jets IO flush to prevent process from crashing
10
+ - wip: binary support, set proper isBase64Encoded for binary content, but commented out binary media types due to form post breaking
11
+
6
12
  ## [0.8.0]
7
13
  - Introduce core resource, pull request #20
8
14
  - Future template generation will lead to core resource. Start the move away from the older cfn template generator logic.
data/Gemfile.lock CHANGED
@@ -11,7 +11,7 @@ GIT
11
11
  PATH
12
12
  remote: .
13
13
  specs:
14
- jets (0.8.0)
14
+ jets (0.8.1)
15
15
  actionpack (>= 5.2.1)
16
16
  actionview (>= 5.2.1)
17
17
  activerecord (>= 5.2.1)
@@ -28,6 +28,7 @@ PATH
28
28
  json
29
29
  kramdown
30
30
  memoist
31
+ mimemagic
31
32
  pg (= 0.21)
32
33
  rack
33
34
  railties (>= 5.2.1)
@@ -111,6 +112,7 @@ GEM
111
112
  nokogiri (>= 1.5.9)
112
113
  memoist (0.16.0)
113
114
  method_source (0.9.0)
115
+ mimemagic (0.3.2)
114
116
  mini_portile2 (2.3.0)
115
117
  minitest (5.11.3)
116
118
  nokogiri (1.8.4)
data/jets.gemspec CHANGED
@@ -44,6 +44,8 @@ Gem::Specification.new do |spec|
44
44
  spec.add_dependency "text-table"
45
45
  spec.add_dependency "rack"
46
46
  spec.add_dependency "json"
47
+ spec.add_dependency "mimemagic"
48
+
47
49
  # TODO: only load the database adapters that app's Gemfile instead of jets.gemspec
48
50
  spec.add_dependency "pg", "=0.21"
49
51
 
@@ -94,7 +94,7 @@ class Jets::Application
94
94
  sid: "Statement1",
95
95
  action: ["logs:*"],
96
96
  effect: "Allow",
97
- resource: "arn:aws:logs:#{Jets.aws.region}:#{Jets.aws.account}:log-group:#{project_namespace}-*",
97
+ resource: "arn:aws:logs:#{Jets.aws.region}:#{Jets.aws.account}:log-group:/aws/lambda/#{project_namespace}-*",
98
98
  }]
99
99
  end
100
100
 
data/lib/jets/cfn.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  class Jets::Cfn
2
- autoload :TemplateMappers, "jets/cfn/template_mappers"
3
- autoload :TemplateBuilders, "jets/cfn/template_builders"
2
+ autoload :Builders, "jets/cfn/builders"
4
3
  autoload :Ship, "jets/cfn/ship"
5
4
  autoload :Status, "jets/cfn/status"
6
5
  end
@@ -0,0 +1,19 @@
1
+ require 'active_support/core_ext/hash'
2
+ require 'yaml'
3
+
4
+ class Jets::Cfn
5
+ class Builders
6
+ autoload :Interface, "jets/cfn/builders/interface"
7
+ autoload :ParentBuilder, "jets/cfn/builders/parent_builder"
8
+
9
+ # These build the app/controllers, app/jobs, and app/functions
10
+ autoload :BaseChildBuilder, "jets/cfn/builders/base_child_builder"
11
+ autoload :ControllerBuilder, "jets/cfn/builders/controller_builder"
12
+ autoload :JobBuilder, "jets/cfn/builders/job_builder"
13
+ autoload :FunctionBuilder, "jets/cfn/builders/function_builder"
14
+ autoload :RuleBuilder, "jets/cfn/builders/rule_builder"
15
+
16
+ autoload :ApiGatewayBuilder, "jets/cfn/builders/api_gateway_builder"
17
+ autoload :ApiDeploymentBuilder, "jets/cfn/builders/api_deployment_builder"
18
+ end
19
+ end
@@ -0,0 +1,32 @@
1
+ class Jets::Cfn::Builders
2
+ class ApiDeploymentBuilder
3
+ include Interface
4
+ include Jets::AwsServices
5
+
6
+ def initialize(options={})
7
+ @options = options
8
+ @template = ActiveSupport::HashWithIndifferentAccess.new(Resources: {})
9
+ end
10
+
11
+ # compose is an interface method
12
+ def compose
13
+ return if @options[:stack_type] == :minimal
14
+
15
+ puts "Building API Gateway Deployment template."
16
+ deployment = Jets::Resource::ApiGateway::Deployment.new
17
+ add_resource(deployment)
18
+ add_parameters(deployment.parameters)
19
+ add_outputs(deployment.outputs)
20
+ end
21
+
22
+ # template_path is an interface method
23
+ def template_path
24
+ Jets::Naming.api_deployment_template_path
25
+ end
26
+
27
+ # do not bother writing a template if routes are empty
28
+ def write
29
+ super unless Jets::Router.routes.empty?
30
+ end
31
+ end
32
+ end
@@ -1,4 +1,4 @@
1
- class Jets::Cfn::TemplateBuilders
1
+ class Jets::Cfn::Builders
2
2
  class ApiGatewayBuilder
3
3
  include Interface
4
4
  include Jets::AwsServices
@@ -29,22 +29,19 @@ class Jets::Cfn::TemplateBuilders
29
29
 
30
30
  # If the are routes in config/routes.rb add Gateway API in parent stack
31
31
  def add_gateway_rest_api
32
- add_resource("RestApi", "AWS::ApiGateway::RestApi",
33
- Name: Jets::Naming.gateway_api_name
34
- )
32
+ rest_api = Jets::Resource::ApiGateway::RestApi.new
33
+ add_resource(rest_api)
34
+ add_outputs(rest_api.outputs)
35
35
 
36
- stage_name = Jets::Cfn::TemplateMappers::ApiGatewayDeploymentMapper.stage_name
37
- add_output("RestApi", Value: "!Ref RestApi")
38
- add_output("RestApiUrl", Value: "!Sub 'https://${RestApi}.execute-api.${AWS::Region}.amazonaws.com/#{stage_name}/'")
39
- add_output("Region", Value: "!Ref AWS::Region")
40
- add_output("RootResourceId", Value: "!GetAtt RestApi.RootResourceId")
36
+ deployment = Jets::Resource::ApiGateway::Deployment.new
37
+ add_output("RestApiUrl", Value: deployment.outputs["RestApiUrl"])
41
38
  end
42
39
 
43
40
  # Adds route related Resources and Outputs
44
41
  def add_gateway_routes
45
42
  # The routes required a Gateway Resource to contain them.
46
43
  # TODO: Support more routes. Right now outputing all routes in 1 template will hit the 60 routes limit.
47
- # Will have to either output them as a joined string or break this up to multiple tempaltes.
44
+ # Will have to either output them as a joined string or break this up to multiple templates.
48
45
  # http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html
49
46
  # Outputs: Maximum number of outputs that you can declare in your AWS CloudFormation template. 60 outputs
50
47
  # Output name: Maximum size of an output name. 255 characters.
@@ -55,17 +52,9 @@ class Jets::Cfn::TemplateBuilders
55
52
  homepage = path == ''
56
53
  next if homepage # handled by RootResourceId output already
57
54
 
58
- map = Jets::Cfn::TemplateMappers::GatewayResourceMapper.new(path)
59
-
60
- unless homepage # no AWS::ApiGateway::Resource for the top level route
61
- add_resource(map.logical_id, "AWS::ApiGateway::Resource",
62
- ParentId: map.parent_id,
63
- PathPart: map.path_part,
64
- RestApiId: "!Ref RestApi"
65
- )
66
- end
67
-
68
- add_output(map.logical_id, Value: "!Ref #{map.logical_id}")
55
+ resource = Jets::Resource::ApiGateway::Resource.new(path)
56
+ add_resource(resource)
57
+ add_outputs(resource.outputs)
69
58
  end
70
59
  end
71
60
  end
@@ -0,0 +1,49 @@
1
+ class Jets::Cfn::Builders
2
+ class BaseChildBuilder
3
+ include Interface
4
+
5
+ # The app_klass is can be a controller, job or anonymous function class.
6
+ # IE: PostsController, HardJob
7
+ def initialize(app_klass)
8
+ @app_klass = app_klass
9
+ @template = ActiveSupport::HashWithIndifferentAccess.new(Resources: {})
10
+ end
11
+
12
+ # template_path is an interface method for Interface module
13
+ def template_path
14
+ Jets::Naming.template_path(@app_klass)
15
+ end
16
+
17
+ def add_common_parameters
18
+ add_parameter("IamRole", Description: "Iam Role that Lambda function uses.")
19
+ add_parameter("S3Bucket", Description: "S3 Bucket for source code.")
20
+ end
21
+
22
+ def add_functions
23
+ add_class_iam_policy
24
+ @app_klass.tasks.each do |task|
25
+ add_function(task)
26
+ add_function_iam_policy(task)
27
+ end
28
+ end
29
+
30
+ def add_function(task)
31
+ resource = Jets::Resource::Function.new(task)
32
+ add_resource(resource)
33
+ end
34
+
35
+ def add_class_iam_policy
36
+ return unless @app_klass.build_class_iam?
37
+
38
+ resource = Jets::Resource::Iam::ClassRole.new(@app_klass)
39
+ add_resource(resource)
40
+ end
41
+
42
+ def add_function_iam_policy(task)
43
+ return unless task.build_function_iam?
44
+
45
+ resource = Jets::Resource::Iam::FunctionRole.new(task)
46
+ add_resource(resource)
47
+ end
48
+ end
49
+ end
@@ -1,4 +1,4 @@
1
- class Jets::Cfn::TemplateBuilders
1
+ class Jets::Cfn::Builders
2
2
  class ControllerBuilder < BaseChildBuilder
3
3
  # compose is an interface method for Interface module
4
4
  def compose
@@ -13,17 +13,17 @@ class Jets::Cfn::TemplateBuilders
13
13
 
14
14
  add_parameter("RestApi", Description: "RestApi")
15
15
  scoped_routes.each do |route|
16
- map = Jets::Cfn::TemplateMappers::GatewayResourceMapper.new(route.path)
17
- add_parameter(map.logical_id, Description: map.desc)
16
+ resource = Jets::Resource::ApiGateway::Resource.new(route.path)
17
+ add_parameter(resource.logical_id, Description: resource.desc)
18
18
  end
19
19
  end
20
20
 
21
21
  def add_routes
22
22
  scoped_routes.each_with_index do |route, i|
23
- resource_route = Jets::Resource::Route.new(route)
24
- add_associated_resource(resource_route.resource)
25
- add_associated_resource(resource_route.resource.permission.attributes)
26
- add_associated_resource(resource_route.resource.cors(route).attributes) if Jets.config.cors
23
+ method = Jets::Resource::ApiGateway::Method.new(route)
24
+ add_resource(method)
25
+ add_resource(method.permission)
26
+ add_resource(method.cors) if Jets.config.cors
27
27
  end
28
28
  end
29
29
 
@@ -1,4 +1,4 @@
1
- class Jets::Cfn::TemplateBuilders
1
+ class Jets::Cfn::Builders
2
2
  class FunctionBuilder < BaseChildBuilder
3
3
  # compose is an interface method for Interface module
4
4
  def compose
@@ -15,6 +15,5 @@ class Jets::Cfn::TemplateBuilders
15
15
  end
16
16
  path
17
17
  end
18
-
19
18
  end
20
19
  end
@@ -0,0 +1,128 @@
1
+ # The class including this module should implement these methods:
2
+ #
3
+ # * compose
4
+ # * template_path
5
+ class Jets::Cfn::Builders
6
+ module Interface
7
+ extend Memoist
8
+
9
+ def build
10
+ # Do not bother building
11
+ # or writing the template unless there are functions defined
12
+ return if @app_klass && !@app_klass.build?
13
+
14
+ compose # must be implemented by subclass
15
+ write
16
+ end
17
+
18
+ def write
19
+ FileUtils.mkdir_p(File.dirname(template_path))
20
+ IO.write(template_path, text)
21
+ end
22
+
23
+ def template
24
+ # need the to_hash or the YAML dump has
25
+ # !ruby/hash:ActiveSupport::HashWithIndifferentAccess
26
+ @template.to_hash
27
+ end
28
+
29
+ def text
30
+ text = YAML.dump(template)
31
+ post_process_template(text)
32
+ end
33
+
34
+ # post process the text so that
35
+ # "!Ref IamRole" => !Ref IamRole
36
+ # We strip the surrounding quotes
37
+ def post_process_template(text)
38
+ results = text.split("\n").map do |line|
39
+ if line.include?(': "!') # IE: IamRole: "!Ref IamRole",
40
+ # IamRole: "!Ref IamRole" => IamRole: !Ref IamRole
41
+ line.sub(/: "(.*)"/, ': \1')
42
+ elsif line.include?('- "!') # IE: - "!GetAtt Foo.Arn"
43
+ # IamRole: - "!GetAtt Foo.Arn" => - !GetAtt Foo.Arn
44
+ line.sub(/- "(.*)"/, '- \1')
45
+ else
46
+ line
47
+ end
48
+ end
49
+ results.join("\n") + "\n"
50
+ end
51
+
52
+ def add_parameters(attributes)
53
+ attributes.each do |name,value|
54
+ add_parameter(name.to_s.camelize, Description: value)
55
+ end
56
+ end
57
+
58
+ def add_parameter(name, options={})
59
+ defaults = { Type: "String" }
60
+ options = defaults.merge(options)
61
+ @template[:Parameters] ||= {}
62
+ @template[:Parameters][name.camelize] = options
63
+ end
64
+
65
+ def add_outputs(attributes)
66
+ attributes.each do |name,value|
67
+ add_output(name.to_s.camelize, Value: value)
68
+ end
69
+ end
70
+
71
+ def add_output(name, options={})
72
+ @template[:Outputs] ||= {}
73
+ @template[:Outputs][name.camelize] = options
74
+ end
75
+
76
+ def add_resources
77
+ @app_klass.tasks.each do |task|
78
+ task.resources.each do |definition|
79
+ resource = Jets::Resource.new(definition, task.replacements)
80
+ add_resource(resource)
81
+ add_resource(resource.permission)
82
+ end
83
+ end
84
+ end
85
+
86
+ def add_resource(resource)
87
+ add_template_resource(resource.logical_id, resource.type, resource.attributes)
88
+ end
89
+
90
+ # The add_resource method can take an options Hash with both with either
91
+ # top level attributes or properties.
92
+ #
93
+ # Example:
94
+ #
95
+ # Top level options:
96
+ #
97
+ # add_template_resource("MyId", "AWS::ApiGateway::RestApi",
98
+ # type: "AWS::ApiGateway::RestApi",
99
+ # properties: {
100
+ # name: "my-api"
101
+ # },
102
+ # depends_on: ["AnotherResource"]
103
+ # )
104
+ #
105
+ # Simple options with properties only:
106
+ #
107
+ # add_template_resource("MyId", "AWS::CloudFormationStack",
108
+ # template_url: "template_url",
109
+ # parameters: {},
110
+ # )
111
+ #
112
+ def add_template_resource(logical_id, type, options)
113
+ options = Jets::Pascalize.pascalize(options)
114
+
115
+ attributes = if options.include?('Type')
116
+ base = { 'Type' => type }
117
+ base.merge(options) # options are top-level attributes
118
+ else
119
+ {
120
+ 'Type' => type,
121
+ 'Properties' => options # options are properties
122
+ }
123
+ end
124
+
125
+ @template['Resources'][logical_id] = attributes
126
+ end
127
+ end
128
+ end
@@ -1,9 +1,9 @@
1
- class Jets::Cfn::TemplateBuilders
1
+ class Jets::Cfn::Builders
2
2
  class JobBuilder < BaseChildBuilder
3
3
  def compose
4
4
  add_common_parameters
5
5
  add_functions
6
- add_associated_resources
6
+ add_resources
7
7
  end
8
8
  end
9
9
  end
@@ -0,0 +1,84 @@
1
+ require 'erb'
2
+
3
+ class Jets::Cfn::Builders
4
+ class ParentBuilder
5
+ include Interface
6
+ include Jets::AwsServices
7
+
8
+ def initialize(options={})
9
+ @options = options
10
+ @template = ActiveSupport::HashWithIndifferentAccess.new(Resources: {})
11
+ end
12
+
13
+ # compose is an interface method
14
+ def compose
15
+ puts "Building parent template."
16
+
17
+ build_minimal_resources
18
+ build_child_resources unless @options[:stack_type] == :minimal
19
+ end
20
+
21
+ # template_path is an interface method
22
+ def template_path
23
+ Jets::Naming.parent_template_path
24
+ end
25
+
26
+ def build_minimal_resources
27
+ # Initial s3 bucket, used to store code zipfile and templates Jets generates
28
+ resource = Jets::Resource::S3.new
29
+ add_resource(resource)
30
+ add_outputs(resource.outputs)
31
+
32
+ # Add application-wide IAM policy from Jets.config.iam_role
33
+ resource = Jets::Resource::Iam::ApplicationRole.new
34
+ add_resource(resource)
35
+ add_outputs(resource.outputs)
36
+ end
37
+
38
+ def build_child_resources
39
+ expression = "#{Jets::Naming.template_path_prefix}-*"
40
+ # IE: path: #{Jets.build_root}/templates/demo-dev-2-comments_controller.yml
41
+ Dir.glob(expression).each do |path|
42
+ next unless File.file?(path)
43
+ next if api_gateway_paths.include?(path) # specially treated
44
+
45
+ add_app_class_stack(path)
46
+ end
47
+
48
+ if @options[:stack_type] == :full and !Jets::Router.routes.empty?
49
+ add_api_gateway
50
+ add_api_deployment
51
+ end
52
+ end
53
+
54
+ def add_app_class_stack(path)
55
+ resource = Jets::Resource::ChildStack::AppClass.new(path, @options[:s3_bucket])
56
+ add_child_resources(resource)
57
+ end
58
+
59
+ def add_api_gateway
60
+ resource = Jets::Resource::ChildStack::ApiGateway.new(@options[:s3_bucket])
61
+ add_child_resources(resource)
62
+ end
63
+
64
+ def add_api_deployment
65
+ resource = Jets::Resource::ChildStack::ApiDeployment.new(@options[:s3_bucket])
66
+ add_child_resources(resource)
67
+ end
68
+
69
+ def add_child_resources(resource)
70
+ add_resource(resource)
71
+ add_outputs(resource.outputs)
72
+ end
73
+
74
+ def api_gateway_paths
75
+ files = %w[
76
+ api-deployment.yml
77
+ api-gateway.yml
78
+ ]
79
+ files.map do |name|
80
+ "#{Jets::Naming.template_path_prefix}-#{name}"
81
+ end
82
+ end
83
+ end
84
+ end