jets 0.8.0 → 0.8.1

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 (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