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
@@ -1,48 +0,0 @@
1
- class Jets::Cfn::TemplateMappers
2
- class ApiGatewayDeploymentMapper < ChildMapper
3
- def logical_id
4
- self.class.logical_id
5
- end
6
-
7
- def timestamp
8
- self.class.timestamp
9
- end
10
-
11
- # stage_name: stag, stag-1, stag-2, etc
12
- def stage_name
13
- self.class.stage_name
14
- end
15
-
16
- def parameters
17
- {
18
- RestApi: "!GetAtt ApiGateway.Outputs.RestApi"
19
- }
20
- end
21
-
22
- def depends_on
23
- expression = "#{Jets::Naming.template_path_prefix}-*_controller*"
24
- controller_logical_ids = []
25
- Dir.glob(expression).each do |path|
26
- next unless File.file?(path)
27
- # @s3_bucket is available from the inherited ChildMapper class
28
- map = ChildMapper.new(path, @s3_bucket)
29
- controller_logical_ids << map.logical_id
30
- end
31
- controller_logical_ids
32
- end
33
-
34
- # Returns: "ApiGatewayDeployment[timestamp]"
35
- def self.logical_id
36
- "ApiGatewayDeployment#{timestamp}"
37
- end
38
-
39
- @@timestamp = nil
40
- def self.timestamp
41
- @@timestamp ||= Time.now.strftime("%Y%m%d%H%M%S")
42
- end
43
-
44
- def self.stage_name
45
- [Jets.config.short_env, Jets.config.env_extra].compact.join('_').gsub('-','_') # Stage name only allows a-zA-Z0-9_
46
- end
47
- end
48
- end
@@ -1,4 +0,0 @@
1
- class Jets::Cfn::TemplateMappers
2
- class ApiGatewayMapper < ChildMapper
3
- end
4
- end
@@ -1,41 +0,0 @@
1
- class Jets::Cfn::TemplateMappers
2
- class ChildMapper
3
- attr_reader :path
4
- def initialize(path, s3_bucket)
5
- # "#{Jets.build_root}/templates/demo-dev-posts_controller.yml"
6
- @path = path
7
- @s3_bucket = s3_bucket
8
- end
9
-
10
- # common parameters to all child stacks
11
- def parameters
12
- {
13
- # YAML.dump converts it to a string
14
- # !GetAtt Base.Outputs.IamRole => "!GetAtt Base.Outputs.IamRole"
15
- # But post processing of the template fixes this
16
- IamRole: "!GetAtt IamRole.Arn",
17
- S3Bucket: "!Ref S3Bucket",
18
- }
19
- end
20
-
21
- # Example: PostsController
22
- def logical_id
23
- regexp = Regexp.new(".*#{Jets.config.project_namespace}-")
24
- contoller_name = @path.sub(regexp, '').sub('.yml', '')
25
- # map the path to a camelized logical_id. Example:
26
- # /tmp/jets/demo/templates/demo-dev-2-posts_controller.yml to
27
- # PostsController
28
- contoller_name.underscore.camelize
29
- end
30
-
31
- def template_url
32
- # here's where it gets interesting with the bucket. The bucket will
33
- # need to exist for the child templates. But wont be created until the stack
34
- # has been first launched. We can create the bucket in a separate stack
35
- # And then grab it and then store it in a cache file.
36
- basename = File.basename(@path)
37
- # IE: https://s3.amazonaws.com/[bucket]/jets/cfn-templates/demo-dev-posts_controller.yml"
38
- "https://s3.amazonaws.com/#{@s3_bucket}/jets/cfn-templates/#{basename}"
39
- end
40
- end
41
- end
@@ -1,36 +0,0 @@
1
- class Jets::Cfn::TemplateMappers
2
- class ControllerMapper < ChildMapper
3
- # Parameters that are common to all controller stacks
4
- def parameters
5
- parameters = super
6
- return parameters if Jets::Router.routes.empty?
7
-
8
- # Add the API Gateway parameters
9
- parameters[:RestApi] = "!GetAtt ApiGateway.Outputs.RestApi"
10
- scoped_routes.each do |route|
11
- map = GatewayResourceMapper.new(route.path)
12
- parameters[map.logical_id] = "!GetAtt ApiGateway.Outputs.#{map.logical_id}"
13
- end
14
-
15
- parameters
16
- end
17
-
18
- def scoped_routes
19
- @routes ||= Jets::Router.routes.select do |route|
20
- route.controller_name == current_class
21
- end
22
- end
23
-
24
- # Example:
25
- # 1. demo-stag-admin-related_pages_controller.yml
26
- # 2. admin/posts_controller
27
- # 3. Admin::PostsController
28
- def current_class
29
- templates_prefix = "#{Jets::Naming.template_path_prefix}-"
30
- @path.sub(templates_prefix, '')
31
- .sub(/\.yml$/,'')
32
- .gsub('-','/')
33
- .classify
34
- end
35
- end
36
- end
@@ -1,4 +0,0 @@
1
- class Jets::Cfn::TemplateMappers
2
- class FunctionMapper < ChildMapper
3
- end
4
- end
@@ -1,6 +0,0 @@
1
- module Jets::Cfn::TemplateMappers::IamPolicy
2
- autoload :ApplicationPolicyMapper, "jets/cfn/template_mappers/iam_policy/application_policy_mapper"
3
- autoload :BasePolicyMapper, "jets/cfn/template_mappers/iam_policy/base_policy_mapper"
4
- autoload :ClassPolicyMapper, "jets/cfn/template_mappers/iam_policy/class_policy_mapper"
5
- autoload :FunctionPolicyMapper, "jets/cfn/template_mappers/iam_policy/function_policy_mapper"
6
- end
@@ -1,37 +0,0 @@
1
- # Implements:
2
- #
3
- # initialize
4
- # iam_policy
5
- # managed_iam_policy
6
- # logical_id
7
- # role_name
8
- #
9
- module Jets::Cfn::TemplateMappers::IamPolicy
10
- class ApplicationPolicyMapper < BasePolicyMapper
11
- def initialize; end # does nothing
12
-
13
- # Assume we always have at least some baseline iam policy permissions.
14
- def iam_policy
15
- Jets::Cfn::TemplateBuilders::IamPolicy::ApplicationPolicy.new
16
- end
17
- memoize :iam_policy
18
-
19
- def managed_iam_policy
20
- return unless Jets.config.managed_iam_policy
21
-
22
- Jets::Cfn::TemplateBuilders::ManagedIamPolicy::ApplicationPolicy.new
23
- end
24
- memoize :managed_iam_policy
25
-
26
- # Example: PostsControllerLambdaFunction
27
- # Note there are is no "Show" action in the name
28
- def logical_id
29
- "IamRole" # very simple logical ideal for the application-wide logical id
30
- end
31
-
32
- # There should be namespace in the role_name.
33
- def role_name
34
- "#{namespace}_application_iam_role".underscore.dasherize
35
- end
36
- end
37
- end
@@ -1,49 +0,0 @@
1
- # Class that inherits this base class should implement:
2
- #
3
- # initialize
4
- # iam_policy
5
- # managed_iam_policy
6
- # logical_id
7
- # role_name
8
- #
9
- module Jets::Cfn::TemplateMappers::IamPolicy
10
- class BasePolicyMapper
11
- extend Memoist
12
-
13
- def properties
14
- properties = {
15
- AssumeRolePolicyDocument: {
16
- Version: "2012-10-17",
17
- Statement: [{
18
- Effect: "Allow",
19
- Principal: {Service: ["lambda.amazonaws.com"]},
20
- Action: ["sts:AssumeRole"]}
21
- ]},
22
- Path: "/"
23
- }
24
-
25
- properties[:Policies] = [
26
- PolicyName: iam_policy.policy_name,
27
- PolicyDocument: iam_policy.policy_document,
28
- ] if iam_policy
29
-
30
- properties[:ManagedPolicyArns] = managed_iam_policy.arns if managed_iam_policy
31
-
32
- properties[:RoleName] = role_name
33
- properties.deep_stringify_keys!
34
- properties
35
- end
36
-
37
- def namespace
38
- Jets.config.project_namespace.underscore
39
- end
40
-
41
- # Need to underscore and then classify again for this case:
42
- # Jets::PreheatJob_policy => JetsPreheatJobPolicy
43
- # Or else you we get this:
44
- # Jets::PreheatJob_policy => JetsPreheatjobPolicy
45
- def classify_name(text)
46
- text.gsub('::','_').underscore.classify
47
- end
48
- end
49
- end
@@ -1,42 +0,0 @@
1
- # Implements:
2
- #
3
- # initialize
4
- # iam_policy
5
- # managed_iam_policy
6
- # logical_id
7
- # role_name
8
- #
9
- module Jets::Cfn::TemplateMappers::IamPolicy
10
- class ClassPolicyMapper < BasePolicyMapper
11
- def initialize(app_class)
12
- @app_class = app_class
13
- # IE: @app_class: PostsController, HardJob, Hello, HelloFunction
14
- end
15
-
16
- def iam_policy
17
- return unless @app_class.class_iam_policy
18
-
19
- Jets::Cfn::TemplateBuilders::IamPolicy::ClassPolicy.new(@app_class)
20
- end
21
- memoize :iam_policy
22
-
23
- def managed_iam_policy
24
- return unless @app_class.class_managed_iam_policy
25
-
26
- Jets::Cfn::TemplateBuilders::ManagedIamPolicy::ClassPolicy.new(@app_class)
27
- end
28
- memoize :managed_iam_policy
29
-
30
- # Example: PostsControllerLambdaFunction
31
- # Note there are is no "Show" action in the name
32
- # There should be no namespace in the logical_id.
33
- def logical_id
34
- classify_name("#{@app_class}_iam_role")
35
- end
36
-
37
- # There should be namespace in the role_name.
38
- def role_name
39
- classify_name("#{namespace}_#{@app_class}_iam_role").underscore.dasherize
40
- end
41
- end
42
- end
@@ -1,42 +0,0 @@
1
- # Implements:
2
- #
3
- # initialize
4
- # iam_policy
5
- # managed_iam_policy
6
- # logical_id
7
- # role_name
8
- #
9
- module Jets::Cfn::TemplateMappers::IamPolicy
10
- class FunctionPolicyMapper < BasePolicyMapper
11
- def initialize(task)
12
- @task = task
13
- @app_class = task.class_name.to_s
14
- # IE: @app_class: PostsController, HardJob, Hello, HelloFunction
15
- end
16
-
17
- def iam_policy
18
- return unless @task.iam_policy
19
-
20
- Jets::Cfn::TemplateBuilders::IamPolicy::FunctionPolicy.new(@task)
21
- end
22
- memoize :iam_policy
23
-
24
- def managed_iam_policy
25
- return unless @task.managed_iam_policy
26
-
27
- Jets::Cfn::TemplateBuilders::ManagedIamPolicy::FunctionPolicy.new(@task)
28
- end
29
- memoize :managed_iam_policy
30
-
31
- # Example: PostsControllerShowLambdaFunction
32
- # There should be no namespace in the logical_id.
33
- def logical_id
34
- classify_name("#{@app_class}_#{@task.meth}_iam_role")
35
- end
36
-
37
- # There should be namespace in the role_name.
38
- def role_name
39
- classify_name("#{namespace}_#{@app_class}_#{@task.meth}_iam_role").underscore.dasherize
40
- end
41
- end
42
- end
@@ -1,4 +0,0 @@
1
- class Jets::Cfn::TemplateMappers
2
- class JobMapper < ChildMapper
3
- end
4
- end
@@ -1,52 +0,0 @@
1
- class Jets::Cfn::TemplateMappers
2
- class LambdaFunctionMapper
3
- def initialize(task)
4
- @task = task
5
- @app_class = task.class_name.to_s
6
- # @app_class examples: PostsController, HardJob, Hello, HelloFunction
7
- end
8
-
9
- # Example: SleepJobPerformLambdaFunction
10
- def logical_id
11
- "#{class_action}LambdaFunction".gsub('::','')
12
- end
13
-
14
- def environment
15
- env = Jets.config.environment ? Jets.config.environment.to_h : {}
16
- jets_env_options = {JETS_ENV: Jets.env.to_s}
17
- jets_env_options[:JETS_ENV_EXTRA] = Jets.config.env_extra if Jets.config.env_extra
18
- env.deep_merge(jets_env_options)
19
- end
20
-
21
- # Example: PostsControllerIndex or SleepJobPerform
22
- def class_action
23
- "#{@app_class}_#{@task.meth}".camelize
24
- end
25
-
26
- # Examples:
27
- # "#{Jets.config.project_namespace}-sleep_job-perform"
28
- # "demo-dev-sleep_job-perform"
29
- def function_name
30
- # Example values:
31
- # @app_class: admin/pages_controller
32
- # @task.meth: index
33
- method = @app_class.underscore
34
- # method: admin/pages_controller
35
- method = method.sub('/','-') + "-#{@task.meth}"
36
- # method: admin-pages_controller-index
37
- "#{Jets.config.project_namespace}-#{method}"
38
- end
39
-
40
- def handler
41
- handler_value(@task.meth)
42
- end
43
-
44
- def handler_value(meth)
45
- "handlers/#{@task.type.pluralize}/#{@app_class.underscore}.#{meth}"
46
- end
47
-
48
- def code_s3_key
49
- Jets::Naming.code_s3_key
50
- end
51
- end
52
- end
@@ -1,5 +0,0 @@
1
- # Used in the parent_builder.rb to build Lambda functions
2
- class Jets::Cfn::TemplateMappers
3
- class RuleMapper < ChildMapper
4
- end
5
- end
@@ -1,46 +0,0 @@
1
- module Jets::Resource
2
- class Attributes
3
- extend Memoist
4
-
5
- def initialize(data, task, replacements={})
6
- @data = data
7
- @task = task
8
- @replacements = replacements
9
- end
10
-
11
- def logical_id
12
- id = @data.keys.first
13
- # replace possible {namespace} in the logical id
14
- id = replacer.replace_value(id)
15
- Jets::Pascalize.pascalize_string(id)
16
- end
17
-
18
- def type
19
- attributes['Type']
20
- end
21
-
22
- def properties
23
- attributes['Properties']
24
- end
25
-
26
- def attributes
27
- attributes = @data.values.first
28
- attributes = replacer.replace_placeholders(attributes, @replacements)
29
- Jets::Pascalize.pascalize(attributes)
30
- end
31
-
32
- def replacer
33
- # Use raw @data to avoid infinite loop from using attributes
34
- attributes = Jets::Pascalize.pascalize(@data.values.first)
35
- type = attributes['Type']
36
- replacer_class = Replacer.lookup(type)
37
- replacer_class.new(@task)
38
- end
39
- memoize :replacer
40
-
41
- def permission
42
- Permission.new(@task, self)
43
- end
44
- memoize :permission
45
- end
46
- end
@@ -1,17 +0,0 @@
1
- module Jets::Resource
2
- class Creator
3
- extend Memoist
4
-
5
- def initialize(definition, task)
6
- @definition = definition
7
- @task = task # task that the definition belongs to
8
- end
9
-
10
- # Template snippet that gets injected into the CloudFormation template.
11
- def attributes
12
- Attributes.new(@definition, @task)
13
- end
14
- alias_method :resource, :attributes
15
- memoize :attributes
16
- end
17
- end